{"version":3,"file":"js/app-8dcb2febdc701b3ed8f9.js","mappings":"gvCAQA,MAAMA,EAA6B,CACjCC,wBAAwB,EACxBC,YAAY,GAoBd,MAjB4CC,CAACC,EAAQJ,EAAcK,KACjE,OAAQA,EAAOC,MACb,KAAKC,EAAAA,GACH,OAAAC,EAAAA,EAAA,GACKJ,GAAK,IACRH,uBAAwBI,EAAOI,UAEnC,KAAKC,EAAAA,GACH,OAAAF,EAAAA,EAAA,GACKJ,GAAK,IACRF,WAAYG,EAAOI,UAEvB,QACE,OAAOL,EACX,E,sgCCQF,MAAMJ,EAA6B,CACjCW,uBAAuB,EACvBC,aAAc,KACdC,kBAAkB,EAClBC,UAAW,GACXC,yBAA0B,CAAC,EAC3BC,YAAY,EACZC,mBAAmB,EACnBC,qBAAsB,GACtBC,qBAAsB,GACtBC,uBAAuB,EACvBC,eAAgB,GAChBC,iBAAiB,EACjBC,SAAU,GACVC,yBAAyB,GA6F3B,MA1F8CC,CAACrB,EAAQJ,EAAcK,KACnE,OAAQA,EAAOC,MACb,KAAKoB,EAAAA,GACH,OAAAlB,EAAAA,EAAA,GACKJ,GAAK,IACRO,uBAAuB,IAE3B,KAAKgB,EAAAA,GACH,OAAAnB,EAAAA,EAAA,GACKJ,GAAK,IACRQ,aAAcP,EAAOI,QACrBE,uBAAuB,IAE3B,KAAKiB,EAAAA,GACH,OAAApB,EAAAA,EAAA,GACKJ,GAAK,IACRa,mBAAmB,IAEvB,KAAKY,EAAAA,GACH,OAAArB,EAAAA,EAAA,GACKJ,GAAK,IACRY,WAAYX,EAAOI,QACnBQ,mBAAmB,IAEvB,KAAKa,EAAAA,GACH,OAAAtB,EAAAA,EAAA,GACKJ,GAAK,IACRS,kBAAkB,IAEtB,KAAKkB,EAAAA,GACH,OAAAvB,EAAAA,EAAA,GACKJ,GAAK,IACRW,yBAA0BV,EAAOI,UAErC,KAAKuB,EAAAA,GACH,OAAAxB,EAAAA,EAAA,GACKJ,GAAK,IACRgB,uBAAuB,IAE3B,KAAKa,EAAAA,GACH,OAAAzB,EAAAA,EAAA,GACKJ,GAAK,IACRiB,eAAgBhB,EAAOI,QACvBW,uBAAuB,IAE3B,KAAKc,EAAAA,GACH,OAAA1B,EAAAA,EAAA,GACKJ,GAAK,IACRkB,iBAAiB,IAErB,KAAKa,EAAAA,GACH,OAAA3B,EAAAA,EAAA,GACKJ,GAAK,IACRkB,iBAAiB,EACjBC,SAAUlB,EAAOI,UAErB,KAAK2B,EAAAA,GACH,OAAA5B,EAAAA,EAAA,GACKJ,GAAK,IACRoB,wBAAyBnB,EAAOI,UAEpC,KAAK4B,EAAAA,GACH,OAAA7B,EAAAA,EAAA,GACKJ,GAAK,IACRU,UAAWV,EAAMU,UAAUwB,KAAKC,IAC9B,GAAIA,EAAEC,IAAMnC,EAAOI,QAAQgC,WAAY,CACrCF,EAAEG,MAAO,EAET,MAAMC,EAAUJ,GAAGI,SAAW,GAExBC,EACJvC,EAAOI,QAAQoC,aAAaC,WAAa,IAAMzC,EAAOI,QAAQoC,aAAaE,UAS7E,OAPqE,IAAjEJ,EAAQK,QAAQC,GAASA,EAAKC,KAAK,OAASN,IAAUO,QACxDZ,GAAGI,QAAQS,KAAK,CACd/C,EAAOI,QAAQoC,aAAaC,WAC5BzC,EAAOI,QAAQoC,aAAaE,YAIzBR,CACT,CACA,OAAOA,CAAC,MAGd,QACE,OAAOnC,EACX,E,ugCC/GF,MAAMJ,EAAe,CACnBqD,mBAAmB,EACnBC,QAAS,CAAC,EACVC,WAAY,GACZC,oBAAqB,CAAC,EACtBC,4BAA6B,CAAC,EAC9BC,2BAA2B,EAC3BC,qBAAsB,GACtBC,kBAAmB,CAAC,EACpBC,WAAY,GACZC,UAAW,GACXC,YAAa,GACbC,yBAA0B,GAC1BC,eAAgB,CAAC,EACjBC,WAAY,CAAC,EACbC,uBAAuB,EACvBC,mBAAmB,EACnBC,qBAAqB,EACrBC,aAAc,GACdC,sBAAuB,CAAC,EACxBC,wBAAyB,IAwK3B,MArKuBC,CAACrE,EAAQJ,EAAcK,KAC5C,OAAQA,EAAOC,MACb,KAAKoE,EAAAA,GACH,OAAAlE,EAAAA,EAAA,GACKJ,GAAK,IACRiD,kBAAmBhD,EAAOI,UAE9B,KAAKkE,EAAAA,GACH,MAAMC,EAAaxE,EAAMkD,QAAQjD,EAAOI,QAAQoE,aAAe,GAE/D,OADAD,EAAWxB,KAAK/C,EAAOI,QAAQqE,aAC/BtE,EAAAA,EAAA,GACKJ,GAAK,IACRkD,QAAO9C,EAAAA,EAAA,GACFJ,EAAMkD,SAAO,IAChB,CAACjD,EAAOI,QAAQoE,YAAaE,MAAMC,KAAK,IAAIC,IAAIL,QAGtD,KAAKM,EAAAA,GACH,OAAA1E,EAAAA,EAAA,GACKJ,GAAK,IACRkD,QAAO9C,EAAAA,EAAA,GACFJ,EAAMkD,SAAO,IAChB,CAACjD,EAAOI,QAAQoE,YAAazE,EAAMkD,QAAQjD,EAAOI,QAAQoE,YAAY7B,QACnEmC,GAAMA,IAAM9E,EAAOI,QAAQqE,kBAIpC,KAAKM,EAAAA,GACH,OAAA5E,EAAAA,EAAA,GACKJ,GAAK,IACR+D,sBAAuB9D,EAAOI,UAElC,KAAK4E,EAAAA,GACH,OAAA7E,EAAAA,EAAA,GACKJ,GAAK,IACRmD,WAAYlD,EAAOI,UAEvB,KAAK6E,EAAAA,GACH,OAAA9E,EAAAA,EAAA,GACKJ,GAAK,IACRuD,qBAAsBtD,EAAOI,UAEjC,KAAK8E,EAAAA,GACH,OAAA/E,EAAAA,EAAA,GACKJ,GAAK,IACRyD,WAAYxD,EAAOI,UAEvB,KAAK+E,EAAAA,GACH,OAAAhF,EAAAA,EAAA,GACKJ,GAAK,IACR8D,WAAY7D,EAAOI,QACnB2D,mBAAmB,IAEvB,KAAKqB,EAAAA,GACH,OAAAjF,EAAAA,EAAA,GACKJ,GAAK,IACRgE,mBAAmB,IAEvB,KAAKsB,EAAAA,GACH,OAAAlF,EAAAA,EAAA,GACKJ,GAAK,IACR6D,eAAgB5D,EAAOI,UAE3B,KAAKkF,EAAAA,GACH,OAAAnF,EAAAA,EAAA,GACKJ,GAAK,IACR0D,UAAWzD,EAAOI,UAEtB,KAAKmF,EAAAA,GACH,OAAApF,EAAAA,EAAA,GACKJ,GAAK,IACR2D,YAAa1D,EAAOI,UAExB,KAAKoF,EAAAA,GACH,OAAArF,EAAAA,EAAA,GACKJ,GAAK,IACR4D,yBAA0B3D,EAAOI,UAErC,KAAKqF,EAAAA,GACH,OAAAtF,EAAAA,EAAA,GACKJ,GAAK,IACR2F,sBAAuB1F,EAAOI,UAElC,KAAKuF,EAAAA,GACH,OAAAxF,EAAAA,EAAA,GACKJ,GAAK,IACR6F,uBAAwB5F,EAAOI,UAEnC,KAAKyF,EAAAA,GACH,OAAA1F,EAAAA,EAAA,GACKJ,GAAK,IACR6D,eAAczD,EAAAA,EAAA,GACTJ,EAAM6D,gBAAc,IACvBkC,2BAA4B9F,EAAOI,UAErCwF,wBAAwB,IAE5B,KAAKG,EAAAA,GACH,OAAA5F,EAAAA,EAAA,GACKJ,GAAK,IACRiG,mBAAoBhG,EAAOI,UAE/B,KAAK6F,EAAAA,GACH,OAAA9F,EAAAA,EAAA,GACKJ,GAAK,IACR6D,eAAczD,EAAAA,EAAA,GACTJ,EAAM6D,gBAAc,IACvBsC,SAAUlG,EAAOI,QAAQ8F,SACzBC,eAAgBnG,EAAOI,QAAQ+F,eAC/BC,gBAAiBpG,EAAOI,QAAQgG,gBAChCC,aAAcrG,EAAOI,QAAQiG,aAC7BC,YAAatG,EAAOI,QAAQkG,cAE9BN,oBAAoB,IAExB,KAAKO,EAAAA,GACH,OAAApG,EAAAA,EAAA,GACKJ,GAAK,IACRyG,oCAAqCxG,EAAOI,UAEhD,KAAKqG,EAAAA,GACH,OAAAtG,EAAAA,EAAA,GACKJ,GAAK,IACRkE,aAAcjE,EAAOI,QAAQsG,cAC7B1C,qBAAqB,IAEzB,KAAK2C,EAAAA,GACH,OAAAxG,EAAAA,EAAA,GACKJ,GAAK,IACRiE,oBAAqBhE,EAAOI,UAEhC,KAAKwG,EAAAA,GACH,OAAAzG,EAAAA,EAAA,GACKJ,GAAK,IACRmE,sBAAuBlE,EAAOI,UAElC,KAAKyG,EAAAA,GACH,OAAA1G,EAAAA,EAAA,GACKJ,GAAK,IACR6D,eAAczD,EAAAA,EAAA,GACTJ,EAAM6D,gBAAc,IACvBkD,KAAM,CACJC,IAAK/G,EAAOI,aAIpB,KAAK4G,EAAAA,GACH,OAAA7G,EAAAA,EAAA,GACKJ,GAAK,IACR6D,eAAczD,EAAAA,EAAA,GACTJ,EAAM6D,gBAAc,IACvBqD,MAAO,CACLF,IAAK/G,EAAOI,aAIpB,KAAK8G,EAAAA,GACH,OAAA/G,EAAAA,EAAA,GACKJ,GAAK,IACRoE,wBAAyBnE,EAAOI,UAEpC,QACE,OAAOL,EACX,E,miCCjMF,MAAMJ,EAAe,CACnB6C,YAAa,CACX2E,aAAc,CAAC,GAEjBC,oBAAoB,EACpBC,gBAAgB,EAChBC,qBAAqB,EACrBC,iBAAiB,EACjBC,gBAAgB,EAChBC,kBAAmB,SACnBC,eAAgB,GAChBC,gBAAiB,KACjBC,qBAAsB,KACtBC,iBAAkB,KAClBC,QAAS,GACTC,aAAc,GACdC,SAAU,GACVC,gCAAgC,EAChCC,YAAa,EACbC,aAAc,CAAC,GAiIjB,MA9HuBC,CAACrI,EAAQJ,EAAcK,KAC5C,IAAIqI,EACJ,OAAQrI,EAAOC,MACb,KAAKqI,EAAAA,GACH,OAAAnI,EAAAA,EAAA,GACKJ,GAAK,IACRyC,YAAaxC,EAAOI,QACpBgH,oBAAoB,IAExB,KAAKmB,EAAAA,GACH,OAAApI,EAAAA,EAAA,GACKJ,GAAK,IACRqH,oBAAoB,IAExB,KAAKoB,EAAAA,GACH,OAAArI,EAAAA,EAAA,GACKJ,GAAK,IACRgI,aAAc/H,EAAOI,QACrBkH,qBAAqB,IAEzB,KAAKmB,EAAAA,GACH,OAAAtI,EAAAA,EAAA,GACKJ,GAAK,IACRuH,qBAAqB,IAEzB,KAAKoB,EAAAA,GACH,OAAAvI,EAAAA,EAAA,GACKJ,GAAK,IACR+H,QAAS9H,EAAOI,QAChBiH,gBAAgB,IAEpB,KAAKsB,EAAAA,GACH,OAAAxI,EAAAA,EAAA,GACKJ,GAAK,IACRsH,gBAAgB,IAEpB,KAAKuB,EAAAA,GACH,OAAAzI,EAAAA,EAAA,GACKJ,GAAK,IACRiI,SAAUhI,EAAOI,QACjBmH,iBAAiB,IAErB,KAAKsB,EAAAA,GACH,OAAA1I,EAAAA,EAAA,GACKJ,GAAK,IACRwH,iBAAiB,IAErB,KAAKuB,EAAAA,GACH,OAAA3I,EAAAA,EAAA,GACKJ,GAAK,IACRyH,eAAgBxH,EAAOI,QAAQ2I,KAC/BrB,eAAgB1H,EAAOI,QAAQsH,eAC/BsB,wBAAyBhJ,EAAOI,QAAQ4I,wBACxCvB,kBAAmBzH,EAAOI,QAAQ6I,SAAW,WAEjD,KAAKC,EAAAA,GACH,OAAA/I,EAAAA,EAAA,GACKJ,GAAK,IACRoJ,kBAAkB,IAEtB,KAAKC,EAAAA,GAQH,OAPAf,EAASgB,IAAAA,MAAQ,CAAC,EAAGtJ,GACjBC,EAAOI,SAAWJ,EAAOI,QAAQgC,aACnCiG,EAAO7F,YAAY/B,UAAY4I,IAAAA,OAC7BhB,EAAO7F,YAAY/B,WAClByB,GAAMA,EAAEC,KAAOnC,EAAOI,QAAQgC,cAGnCjC,EAAAA,EAAA,GACKkI,GAAM,IACTc,kBAAkB,IAEtB,KAAKG,EAAAA,GACH,OAAAnJ,EAAAA,EAAA,GACKJ,GAAK,IACRyC,YAAWrC,EAAAA,EAAA,GACNJ,EAAMyC,aAAW,IACpB2E,aAAYhH,EAAAA,EAAA,GACPJ,EAAMyC,YAAY2E,cAAY,IACjCoC,wBAAyBvJ,EAAOI,QAAQoJ,YACpC,IAAIzJ,EAAMyC,YAAY2E,aAAaoC,wBAAyBvJ,EAAOI,QAAQqJ,SAC3E1J,EAAMyC,YAAY2E,aAAaoC,wBAAwB5G,QACpD8G,GAAYA,EAAQtH,KAAOnC,EAAOI,QAAQqJ,QAAQtH,WAKjE,KAAKuH,EAAAA,GACH,OAAAvJ,EAAAA,EAAA,GACKJ,GAAK,IACRkI,+BAAgCjI,EAAOI,UAE3C,KAAKuJ,EAAAA,GACH,OAAAxJ,EAAAA,EAAA,GACKJ,GAAK,IACRyC,YAAWrC,EAAAA,EAAA,GACNJ,EAAMyC,aAAW,IACpB2E,aAAYhH,EAAAA,EAAA,GACPJ,EAAMyC,YAAY2E,cAAY,IACjCyC,4BAA6B5J,EAAOI,YAGxC6H,gCAAgC,IAEpC,KAAK4B,EAAAA,GACH,OAAA1J,EAAAA,EAAA,GACKJ,GAAK,IACRmI,YAAalI,EAAOI,UAExB,KAAK0J,EAAAA,GACH,OAAA3J,EAAAA,EAAA,GACKJ,GAAK,IACRoI,aAAcnI,EAAOI,UAEzB,KAAK2J,EAAAA,GACH,OAAA5J,EAAAA,EAAA,GACKJ,GAAK,IACRyC,YAAWrC,EAAAA,EAAA,GACNJ,EAAMyC,aAAW,IACpBwH,MAAOhK,EAAOI,YAGpB,QACE,OAAOL,EACX,E,sgCCrKF,MAAMJ,EAAe,CACnBsK,MAAOC,OAAOC,WACdC,OAAQF,OAAOG,YACfC,cAAe,GAejB,MAZsCC,CAACxK,EAAQJ,EAAcK,IACnDA,EAAOC,OACRuK,EAAAA,EACHrK,EAAAA,EAAA,GACKJ,GACAC,EAAOI,SAGLL,ECTb,GACEqE,eAAc,EACdgE,eAAc,EACdqC,iBAAgB,IAChBrJ,eAAc,EACdsJ,wBAAuB,EACvB5K,aACF,GCRA,MACEsE,EAMEuG,EANFvG,eACAgE,EAKEuC,EALFvC,eACAhH,EAIEuJ,EAJFvJ,eACAsJ,EAGEC,EAHFD,wBACAD,EAEEE,EAFFF,iBACA3K,GACE6K,EADF7K,aAGI8K,GAAgB,CACpBC,IAAK,iBACLC,QAASA,EAAAA,EACTC,UAAW,CAAC,UAAW,aAAc,oBAGjCC,GAAiB,CACrBH,IAAK,iBACLC,QAASA,EAAAA,EACTG,UAAW,CAAC,gBAGRC,GAAsC,CAC1CL,IAAK,mBACLC,QAASA,EAAAA,GAGLK,IAAcC,EAAAA,EAAAA,IAAgB,CAClChH,gBAAgBiH,EAAAA,EAAAA,IAAeT,GAAexG,GAC9CkH,UAAUD,EAAAA,EAAAA,IAAeL,GAAgB5C,GACzCmD,WAAWF,EAAAA,EAAAA,IAAeH,GAAiBT,GAC3ChB,QAASrI,EACT8I,OAAQQ,EACRc,MAAO1L,KAIH2L,GAAgB,CACpBZ,IAAK,OACLC,QAAO,IACPC,UAAW,CAAC,iBAAkB,WAAY,SAAU,YAKtD,QAFyBM,EAAAA,EAAAA,IAAeI,GAAeN,ICzCvD,MACMO,IADoBxB,OAAeyB,sCAAwCC,EAAAA,KAC/CC,EAAAA,EAAAA,IAAgBC,EAAAA,IAErCC,IAAQC,EAAAA,EAAAA,IAAYb,GAAaO,IAE7CxB,OAAe6B,MAAQA,GAEjB,MAAME,IAAYC,EAAAA,EAAAA,IAAaH,I,gBCAtC,MAAMI,GAAkBA,KACtBC,EAAAA,GAAAA,KAACC,EAAAA,EAAS,CAACC,UAAU,SAAQC,UAC3BH,EAAAA,GAAAA,KAACI,EAAAA,EAAM,MAILC,GAAOA,KACXL,EAAAA,GAAAA,KAACM,EAAAA,GAAQ,CAACX,MAAOA,GAAMQ,UACrBH,EAAAA,GAAAA,KAACO,EAAAA,EAAW,CAACC,SAASR,EAAAA,GAAAA,KAACD,GAAe,IAAKF,UAAWA,GAAUM,UAC9DH,EAAAA,GAAAA,KAACS,EAAAA,GAAM,CAACC,SAAUA,IAAM5C,OAAO6C,SAAS,EAAG,GAAGR,UAC5CH,EAAAA,GAAAA,KAACY,EAAAA,GAAK,CAACC,KAAK,YAAYC,WAAWC,EAAAA,EAAAA,GAAWC,EAAAA,YAMtDC,SAASC,iBAAiB,oBAAoB,KAC5CC,EAAAA,QAAgBnB,EAAAA,GAAAA,KAACK,GAAI,IAAKY,SAASG,eAAe,kBAAkB,G,0sCCvBvD,SAASC,IACtB,MAAyDC,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAlDC,EAAaH,EAAA,GAAEI,EAAgBJ,EAAA,GACuBK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAtDI,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GAEpCG,GAAWC,EAAAA,EAAAA,MACX3L,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D5C,GAAyBwO,EAAAA,EAAAA,KAC5BrO,GAAqBA,EAAMyL,MAAM5L,yBAE9BC,GAAauO,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMyL,MAAM3L,aAEjE,OACEwO,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CACTC,OAAQX,EACRY,QAASA,IAAMX,GAAiB,GAChC7D,MAAM,QACNyE,WAAW,qBACXC,cAAc,mCAAkCpC,UAEhD8B,EAAAA,EAAAA,MAACO,EAAY,CAAArC,SAAA,EACXH,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACPC,MAAM,uBACNC,KAAK,KACLC,UAAWnP,EACXoP,SAAWC,IACThB,GAASiB,EAAAA,EAAAA,GAAcD,EAAEE,OAAOC,SAAS,KAG7CjD,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACPC,MAAM,qBACNC,KAAK,KACLC,UAAWpP,EACXqP,SAAWC,IACThB,GAASoB,EAAAA,EAAAA,IAA0BJ,EAAEE,OAAOC,UAC5CpB,GAAmB,EAAK,IAG3BD,IACC5B,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTR,KAAK,KACLS,KAAK,2CACLC,SAAS,UACTC,MAAOC,EAAAA,GAAOC,UACdC,QAASA,IAAM3F,OAAOhE,SAAS4J,iBAKvCzB,EAAAA,EAAAA,MAAChC,EAAS,CACR0D,SAAUlQ,EAAa,WAAa,GACpCmQ,WAAgC,eAApBC,IAAIC,QAAQC,IAAuBR,EAAAA,GAAOS,IAAMT,EAAAA,GAAOC,UAAUrD,SAAA,CAC9E,mBACkB/J,EAAYC,WAAW,IAAED,EAAYE,UAAU,SAAOF,EAAYL,GAAG,KACtFiK,EAAAA,EAAAA,KAAA,OAAAG,SAAK,OACLH,EAAAA,EAAAA,KAAA,KAAGiE,KAAMJ,IAAIK,qBAAqB/D,UAChCH,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTR,KAAK,KACLS,KAAK,2BACLE,MAAOC,EAAAA,GAAOY,MACdd,SAAS,yBAGbrD,EAAAA,EAAAA,KAAA,OAAAG,SAAK,OACLH,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTR,KAAK,KACLS,KAAK,eACLE,MAAOC,EAAAA,GAAOY,MACdd,SAAU,KACVI,QAASA,IAAM/B,GAAiB,UAK1C,CAEA,MAAMzB,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;;;;;gBAUZ,EAAGT,gBAAiBA;;;cAGtB,EAAGD,cAAeA;;;IAG5BW,EAAAA,GAAMC;EAGJ/B,EAAe4B,EAAAA,GAAOC,GAAG;;;;;iDC8D/B,MApIwBG,EACtBC,YACAC,gBACAC,uBACAC,kBACAC,sBACAC,mBACAC,iCAEA,MAAMC,GAAUC,EAAAA,EAAAA,MACVnD,GAAWC,EAAAA,EAAAA,MAEXmD,EAA0BA,KAE1BP,GAAsB7C,GAASqD,EAAAA,EAAAA,KAAoB,IAEnDN,GAAqB/C,GAASsD,EAAAA,EAAAA,KAAuB,IACzDtD,GAASuD,EAAAA,EAAAA,KAAyBV,GAAsB,EAWpDW,EAAuD,CAC3D,CAEEC,MAAO,mBACP7C,MAAOmC,EAAsB,SAAW,SACxCW,SAAUA,IAAM1D,GAASsD,EAAAA,EAAAA,KAAwBP,IACjDxB,SAAUwB,EAAsB,SAAW,UAE7C,CACEU,MAAO,eACP7C,MAAO,SAAS+B,EAAUjO,iBAC1BgP,SAAUA,IAAMR,EAAQrO,KAAK,YAAY8N,EAAUgB,cACnDpC,SAAU,YAGRqC,EAA+C,IAChDJ,EACH,CACEC,MAAO,gBACP7C,MAAO,gBACP8C,SAAUA,IAAMR,EAAQrO,KAAK,oBAAoBiO,GAAiB7O,MAClEsN,SAAU,qBAEZ,CACEkC,MAAO,gCACP7C,MAAO,gCACP8C,SAAUA,IAAMT,GAA2B,GAC3C1B,SAAU,cAId,IAAIsC,EAIFA,EAHGf,EAEM,aAAcA,EACR,CACbA,EAAgBgB,kBACX,oBAAqBhB,GAAmBA,EAAgBiB,iBAAoB,IAGpEjB,EAAgBkB,WAPhB,CAACrB,GAUlB,MAAMsB,EAAwBJ,EAAajP,QAAU,EAE/CsP,EAAcD,GAClB/F,EAAAA,EAAAA,KAACiG,EAAAA,GAAW,CAACtD,KAAK,KAAKuD,KAAMzB,KAE7BzE,EAAAA,EAAAA,KAACmG,EAAAA,GAAgB,CAACC,MAAOT,IAG3B,OACE1D,EAAAA,EAAAA,MAACoE,EAAe,CACd1B,qBAAsBA,EACtBlB,QAASkB,EAAuBO,OAA0BoB,EAAUnG,SAAA,CAEnEwE,GACC1C,EAAAA,EAAAA,MAACsE,EAAa,CAAApG,SAAA,EACZH,EAAAA,EAAAA,KAACwG,EAAAA,GAAS,CAAC7D,KAAK,KAAKyD,MAAOT,EAAcc,OAAQV,IACjDA,IACC/F,EAAAA,EAAAA,KAAC0G,EAAI,CAAC5B,iBAAkBA,EAAiB3E,SAAEsE,EAAUjO,OAEtDsO,IAAoB9E,EAAAA,EAAAA,KAAC2G,EAAS,QAGjC1E,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CACG6F,EACAtB,IACCzC,EAAAA,EAAAA,MAAC2E,EAAsB,CAACC,SAAUd,EAAsB5F,SAAA,EACtDH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAWmM,KAAK,KAAKoE,OAAO,YAAYzD,MAAOC,EAAAA,GAAOyD,eACjEhH,EAAAA,EAAAA,KAACiH,EAAa,CAAA9G,SAAEuE,WAKxBzC,EAAAA,EAAAA,MAACiF,EAAa,CAAA/G,SAAA,EACVwE,IACA1C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmH,EAAAA,GAAmB,CAClBC,QAASxC,EAAkBc,EAAqBJ,EAChD+B,uBAAuB,QAAOlH,UAE9BH,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CAAC3E,KAAK,KAAK4E,QAAQ,SAASlE,SAAS,eAAemE,aAAa,aAE9ExH,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,WACTV,KAAK,KACL4E,QAAQ,SACR9D,QAASyB,QAIflF,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,QACTV,KAAK,KACL4E,QAAQ,SACR9D,QAxGsBX,IAC5BA,EAAE2E,mBACFC,EAAAA,EAAAA,KAAM,KACJ5F,GAAS6F,EAAAA,EAAAA,KAAmB,IAC5B7F,GAAS8F,EAAAA,EAAAA,MAAsB,GAC/B,EAoGI,cAAY,sBAGA,EAMtB,MAAMvB,EAAkBjC,EAAAA,GAAOC,GAAG;;;;;aAKrB,EAAGM,0BAA4BA,EAAuB,MAAQ;sBACrDpB,EAAAA,GAAOsE;;;IAGzB,EAAGlD,0BACHA,GACAmD,EAAAA,EAAG;;sBAEevE,EAAAA,GAAOwE;;;;EAMvBb,EAAgB9C,EAAAA,GAAOC,GAAG;;;EAK1BkC,EAAgBnC,EAAAA,GAAOC,GAAG;;;EAK1BqC,EAAOtC,EAAAA,GAAOC,GAAG;;eAER,EAAGS,sBAAwBA,EAAmB,OAAS;;WAE3DvB,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM2D;;;;EAMJtB,EAAYvC,EAAAA,GAAOC,GAAG;;;;sBAINd,EAAAA,GAAOS;;EAGvB4C,EAAyBxC,EAAAA,GAAOC,GAAG;;iBAExB,EAAGwC,aAAeA,EAAU,KAAO;;EAG9CI,EAAgB7C,EAAAA,GAAOC,GAAG;WACrBd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM4D;IACNC,EAAAA,GAAOC;iBCzMX,MAjB8BC,EAAGzD,kBAAiBxC,SAAQkG,iBAEtDtI,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CACTC,OAAQA,EACRC,QAASiG,EACThG,WAAW,gCACXzE,MAAM,QACNG,OAAO,QACPuK,yBAAyB,EAAMpI,UAE/BH,EAAAA,EAAAA,KAACC,EAAS,CAAAE,UACRH,EAAAA,EAAAA,KAACwI,EAAAA,EAAY,CAACC,cAAe7D,EAAiB8D,SAAS,QAQ/D,MAAMzI,EAAYmE,EAAAA,GAAOC,GAAG;;;;;kgCC0E5B,MAjFkBsE,KAChB,MAA6ErH,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAtEoH,EAAuBtH,EAAA,GAAEyD,EAA0BzD,EAAA,GAEpDQ,GAAWC,EAAAA,EAAAA,MAEX3L,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DyS,GAAgB7G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMwL,UAAU0J,gBAClEC,GAAkB9G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMwL,UAAU2J,kBACpEC,GAA2B/G,EAAAA,EAAAA,KAC9BrO,GAAqBA,EAAMwL,UAAU4J,2BAElCpE,GAAuB3C,EAAAA,EAAAA,KAC1BrO,GAAqBA,EAAMwL,UAAUwF,uBAElCE,GAAsB7C,EAAAA,EAAAA,KACzBrO,GAAqBA,EAAMwL,UAAU0F,sBAElCC,GAAmB9C,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMwL,UAAU2F,mBACrEF,GAAkB5C,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMwL,UAAUyF,kBACpEoE,GAAuBhH,EAAAA,EAAAA,KAC1BrO,GAAqBA,EAAMwL,UAAU6J,uBAkBxC,OAfAC,EAAAA,EAAAA,YAAU,KACR,WACE,IAAKJ,EAAcpE,UAAW,OAE9B,MAAMyE,EAAiBL,EAAcpE,UAAU1O,GACvCoT,EAA+BN,EAA/BM,YAAaC,EAAkBP,EAAlBO,cAEjBD,GAAeC,QACXtH,GAASuH,EAAAA,EAAAA,IAA6BH,EAAQE,EAAeD,UAE7DrH,GAASwH,EAAAA,EAAAA,IAAiClT,EAAYL,GAAImT,GAEnE,EAXD,EAWI,GACH,CAACL,IAECC,EAEDC,GAA4BD,GAE5B9I,EAAAA,EAAAA,KAACuJ,EAAkB,CACjB5E,qBAAsBA,EACtBqE,qBAAsBA,EAAqB7I,UAE3CH,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,QAAM,EAACC,OAAO,WAAWC,MAAO,CAAE3C,OAAQ,aAMtD9E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACqI,EAAqB,CACpBzD,gBAAiBA,EACjBxC,OAAQwG,EACRN,WAAYA,IAAMvD,GAA2B,MAE/C9C,EAAAA,EAAAA,MAACsH,EAAkB,CACjB5E,qBAAsBA,EACtBE,oBAAqBA,EACrBmE,qBAAsBA,EACtB,cAAY,YAAW7I,SAAA,EAEvBH,EAAAA,EAAAA,KAACwE,EAAe,CACdC,UAAWoE,GAAepE,UAC1BC,cAAemE,GAAenE,cAC9BC,qBAAsBA,EACtBC,gBAAiBA,EACjBC,oBAAqBA,EACrBC,iBAAkBA,EAClBC,2BAA4BA,KAE9B/E,EAAAA,EAAAA,KAAC2J,EAAqB,CAAAxJ,UACpBH,EAAAA,EAAAA,KAAC4J,EAAAA,EAAY,CAACnB,cAAe7D,YApCR,IAuCxB,EAMP,MAAM2E,EAAqBnF,EAAAA,GAAOC,GAAG;;oBAEjB,EAAGM,0BAA4BA,EAAuB,MAAQ;gBAClEpB,EAAAA,GAAOY;sBACDZ,EAAAA,GAAOsE;gBACbM,EAAAA,GAAO0B;;WAEZ,EAAGlF,uBAAsBE,yBAC5BF,EACK,QAELE,EACK,QAEF;YAEC,EAAGF,uBAAsBE,yBAC7BF,EACK,OAELE,EACK,QAEF;;;qBAIU,EAAGmE,0BAA2BA;;;;;;;;EAS7CW,EAAwBvF,EAAAA,GAAOC,GAAG;;;;;;4BC/FxC,MA3ByByF,EAAGC,aAAY5J,eAEpC8B,EAAAA,EAAAA,MAAC+H,EAAU,CAACD,WAAYA,EAAW5J,SAAA,EACjCH,EAAAA,EAAAA,KAACiK,EAAQ,CAAA9J,SAAEA,KACX8B,EAAAA,EAAAA,MAACiI,EAAW,CAAA/J,SAAA,EACVH,EAAAA,EAAAA,KAACmK,EAAK,CAACC,IAAKC,EAASC,IAAI,iBACzBrI,EAAAA,EAAAA,MAACsI,EAAI,CAAApK,SAAA,CAAC,kCAEJH,EAAAA,EAAAA,KAAA,SAAM,mCAGRA,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,IAAGtK,UACVH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,YACR5E,KAAK,KACLU,SAAS,cACTsH,aAAa,QAAOxK,SACrB,oBAWX,MAAM8J,EAAW7F,EAAAA,GAAOC,GAAG,GAErB6F,EAAc9F,EAAAA,GAAOC,GAAG,GAExB2F,EAAa5F,EAAAA,GAAOC,GAAG;IACzB4F;;;IAGAC;;;kCAG8B,EAAGH,gBAAiBA;MAChDE;;;MAGAC;;;;;;;;EAUAC,EAAQ/F,EAAAA,GAAOwG,GAAG;;EAIlBL,EAAOnG,EAAAA,GAAOC,GAAG;IACnBC,EAAAA,GAAMuG;WACCtH,EAAAA,GAAOyD;;ECvElB,Q,w4BCcA,MAXqB8D,IAAmB,IAAbC,EAAKC,EAAA,I,oEAAAC,CAAAH,GAAAA,IAC9B,MAAM1U,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAOrE,OALKA,EAAYL,MACfmV,EAAAA,EAAAA,IAAiBpN,OAAOhE,SAASmK,MACjCnG,OAAOhE,SAASmK,KAAO,UAGlB7N,EAAYL,IAAKiK,EAAAA,EAAAA,KAACY,EAAAA,G,+VAAK7M,CAAA,GAAKgX,IAAY,IAAI,E,m3BCUrD,MAhB4BD,IAAmB,IAAbC,EAAKC,EAAA,I,oEAAAC,CAAAH,GAAAA,IACrC,MAAM1U,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAOrE,OALKA,EAAYL,MACfmV,EAAAA,EAAAA,IAAiBpN,OAAOhE,SAASmK,MACjCnG,OAAOhE,SAASmK,KAAO,UAGrB7N,EAAY+U,OAASC,EAAAA,EAAWC,SAClCC,QAAQC,KAAK,kDAAmDnV,IACzD4J,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,GAAG,WAGfzK,EAAAA,EAAAA,KAACyL,E,+VAAY1X,CAAA,GAAKgX,GAAS,E,uECJpC,MAAMW,GAAgB,CAAC,qBACjBC,GAAwB,CAAC,iBAAkB,aAyDjD,OAvD+BC,EAC7BxJ,SACAC,UACAwJ,kCACAC,oBAEA,MAAM1V,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DjC,GAAe6N,EAAAA,EAAAA,KAAarO,GAAqBA,EAAM0J,QAAQlJ,eAE7D4X,GAAaC,EAAAA,EAAAA,MAAbD,SACF/G,GAAUC,EAAAA,EAAAA,MAEVgH,EACJP,GAAcQ,SAASH,KACrB5X,GAAcgY,eACdR,GAAsBS,MAAMvL,GAASkL,EAASM,WAAWxL,KAM7D,OAJAoI,EAAAA,EAAAA,YAAU,KACR4C,EAAgCI,EAAc,GAC7C,CAACA,KAGFjM,EAAAA,EAAAA,KAACmC,GAAAA,EAAU,CACTC,OAAQA,EACRC,QAASA,EACTiK,gBAAiBL,EACjBM,oBAAqBN,EACrBO,eAAe,OAAMrM,UAErB8B,EAAAA,EAAAA,MAAChC,GAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAACyM,GAAK,CAAAtM,SAAE2L,KACPY,EAAAA,GAAAA,GAAE,CACD,wCACAtW,EAAY+U,OAASwB,GAAAA,EAASC,QAAU,UAAY,YAEtD3K,EAAAA,EAAAA,MAAC4K,GAAO,CAAA1M,SAAA,CACL/J,EAAY2E,aAAa+R,WACxB9M,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAI,WAAYzH,OAAO,SAAQ7C,UACnCH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAQsM,UAAEuM,EAAAA,GAAAA,GAAE,2CAG5BT,IACCjM,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACLnD,QAASnR,EAAY2E,aAAa+R,SAAW,YAAc,UAC3DrJ,QAASA,IAAMuB,EAAQrO,KAAK,uBAAuBwJ,SACpD,2BAMI,EAMjB,MAAMF,GAAYmE,EAAAA,GAAOC,GAAG;;;WAGjBd,EAAAA,GAAOyE;;IAEd1D,EAAAA,GAAMuG;EAEJ4B,GAAQrI,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAMyI;;EAGJF,GAAUzI,EAAAA,GAAOC,GAAG;;;;sgCC3E1B,MAAQ2I,GAAuBC,EAAAA,GAAvBD,mBA4DFE,GAAwB9I,EAAAA,GAAOC,GAAG;;;;;;eAMzB4I,EAAAA,GAAkBE;sBACX5J,EAAAA,GAAOS;WAClBT,EAAAA,GAAOY;IACdG,EAAAA,GAAM8I;;;;;;IAMNJ;;;;;;EAQJ,OA/E4BK,KAC1B,MAAuF/L,EAAAC,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhF8L,EAA4BhM,EAAA,GAAEuK,EAA+BvK,EAAA,GAE9DlL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DjC,GAAe6N,EAAAA,EAAAA,KAAarO,GAAqBA,EAAM0J,QAAQlJ,eAE/DoZ,GAA4BC,EAAAA,GAAAA,IAAcrZ,GAAcsZ,QAM9D,IAJAxE,EAAAA,EAAAA,YAAU,KACR4C,EAAgC0B,EAA4B,EAAE,GAC7D,CAACA,KAGDpZ,GAAcsZ,QACfF,EAhBqC,IAiBrCpZ,GAAcuZ,0BAEd,OAAO,KAET,MAAMC,EAAUvX,EAAY2E,aAAa+R,SACnChB,GAAgBY,EAAAA,GAAAA,GACpB,CACE,kCACAa,EAA4B,EAAI,QAAU,cAC1CI,EAAU,QAAU,aAEtB,CACEC,oBAAqBC,KAAM1Z,GAAcsZ,QAAQK,OAAO,kBAI5D,OACE7L,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CACGoN,EAA4B,IAC3BvN,EAAAA,EAAAA,KAAC4L,GAAsB,CACrBxJ,OAAQkL,EACRjL,QAASA,IAAMwJ,GAAgC,GAC/CA,gCAAiCA,EACjCC,cAAeA,KAGnB7J,EAAAA,EAAAA,MAACiL,GAAqB,CAAA/M,SAAA,EACpBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,YAAYmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOY,MAAO4C,OAAO,cAC5D+E,EACA6B,IACC3N,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAI,WAAYzH,OAAO,SAAS0G,MAAO,CAAEqE,gBAAiBxK,EAAAA,GAAOY,OAAQhE,UAC7EH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS0T,QAAQ,oBAAoB5E,KAAK,KAAIxC,UACxDuM,EAAAA,GAAAA,GAAE,gDAKV,E,sjECsEP,OA3H4BsB,EAAG5L,SAAQC,cACrC,IAAKD,EAAQ,OAAO,KAEpB,MAAMhM,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D0L,GAAWC,EAAAA,EAAAA,MAEgET,EAAAC,IAA3CC,EAAAA,EAAAA,UAAmBpL,EAAY6X,aAAY,GAA1EA,EAAW3M,EAAA,GAAE4M,EAAc5M,EAAA,GAGjCK,EAAAJ,IAF+CC,EAAAA,EAAAA,UAC9CpL,EAAY+X,oBACb,GAFMC,EAAgBzM,EAAA,GAAE0M,EAAmB1M,EAAA,GAGW2M,EAAA/M,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GA6C9BG,EACiB,IAArBrY,EAAY+U,KACR,GAAG/U,EAAYC,8CACf,GAAGD,EAAYC,sCACfqY,EACiB,IAArBtY,EAAY+U,KACR,uCACA,kFACA/H,EACiB,IAArBhN,EAAY+U,KACR,iHACA,gGACE/U,EAAY2E,cAAc4T,cAAgB,+BAGlD,OACE3O,EAAAA,EAAAA,KAACmC,GAAAA,EAAU,CACTtE,MAAM,QACNuE,OAAQA,EACRC,QAASA,EACTiK,iBAAiB,EACjBC,oBAAoB,EACpBhE,yBAAyB,EACzBjG,WAAYmM,EAAOtO,UAEnB8B,EAAAA,EAAAA,MAAA,QAAM2M,SAlDWC,UACnB/L,EAAEgM,iBACFN,GAAgB,GAChB,WACyBO,EAAAA,GAAAA,IAAmB3Y,EAAYL,GAAI,CACxDkY,cACAG,sBAEWY,KAAKC,UAChBnN,GACEoN,EAAAA,GAAAA,IAAcnb,GAAAA,GAAC,CAAC,EACXqC,GAAW,IACd6X,cACAE,mBAAoBC,EACpBe,sBAAsB,MAG1B9M,IAEJ,CAAE,MAAO+M,GACP9D,QAAQ+D,MAAMD,EAChB,CACAZ,GAAgB,EAAM,EA4BSrO,SAAA,EAC3B8B,EAAAA,EAAAA,MAACqN,GAAO,CAAAnP,SAAA,EACNH,EAAAA,EAAAA,KAACyM,GAAK,CAAAtM,SAAEuO,KACR1O,EAAAA,EAAAA,KAACuK,GAAI,CAAApK,SAAEiD,IACNhN,EAAY+U,OAASwB,GAAAA,EAAS4C,YAC7BtN,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACwP,GAAK,CAAArP,SAAC,uDACPH,EAAAA,EAAAA,KAACyP,GAAAA,EAAgB,CACfC,YAAY,aACZC,WAAW,YACXpK,MAAO0I,EACPpL,SAAUqL,EACV0B,UAAQ,QAId5P,EAAAA,EAAAA,KAACwP,GAAK,CAAArP,SAAC,6BACPH,EAAAA,EAAAA,KAACyP,GAAAA,EAAgB,CACfC,YAAY,oBACZC,WAAYvZ,EAAY+U,OAASwB,GAAAA,EAAS4C,UAAY,YAAc,UACpEhK,MAAO6I,EACPvL,SAAUwL,EACVuB,UAAQ,QAGZ3N,EAAAA,EAAAA,MAAC4N,GAAM,CAAA1P,SAAA,EACLH,EAAAA,EAAAA,KAAA,OAAAG,SAA2B,IAArB/J,EAAY+U,OAAcnL,EAAAA,EAAAA,KAAC8P,GAAQ,CAACrM,QA9FnCsM,KACb,KACEC,EAAAA,GAAAA,IAAuB5Z,EAAYL,GACrC,CAAE,MAAOqZ,GACP9D,QAAQ+D,MAAMD,EAChB,CACA/M,IACA4N,GAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAAA,KAAA9B,SAAA,CAAG,0CACuC,KACxCH,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,WAAWf,MAAO,CAAEwG,eAAgB,YAAa5M,MAAO,SAAUnD,SAAC,qBAErE,OAGV,EA+E+DA,SAAC,oBAC3DH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACLwN,SACE5B,GACsB,IAArBnY,EAAY+U,QAAgB8C,EAAYvX,SAAW0X,EAAiB1X,SAC/C,IAArBN,EAAY+U,OAAeiD,EAAiB1X,OAC9CyJ,SACF,kBAKM,EAMjB,MAAMmP,GAAUlL,EAAAA,GAAOC,GAAG;;EAIpBwL,GAASzL,EAAAA,GAAOC,GAAG;;;;;;0BAMCd,EAAAA,GAAO6M;EAG3B3D,GAAQrI,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAM+L;EAGJ9F,GAAOnG,EAAAA,GAAOC,GAAG;IACnBC,EAAAA,GAAMuG;EAGJ2E,GAAQpL,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAMgM;;EAGJR,GAAW1L,EAAAA,GAAOmM,CAAC;IACrBjM,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOyD;;;;;aAKLzD,EAAAA,GAAOyE;;;EC3KpB,U,0lECuBA,MAAMwI,GAAiCC,OAAOC,OAAOC,GAAAA,GAAa9a,IAChE+a,GAAAA,IAmLI3Q,GAAYmE,EAAAA,GAAOyM,IAAI;IACzBvM,EAAAA,GAAM8I;;MAEJ9I,EAAAA,GAAMwM;;EAINC,GAAM3M,EAAAA,GAAOC,GAAG;;;;;;;;;6BASOd,EAAAA,GAAOsE;EAG9BmJ,GAAS5M,EAAAA,GAAOC,GAAG;;;;;;;;;IASrBC,EAAAA,GAAM8I;;6BAEmB7J,EAAAA,GAAOsE;EAG9BoJ,GAAO7M,EAAAA,GAAOwG,GAAG;;EAIjBsG,GAAc9M,EAAAA,GAAOwG,GAAG;;;;;;;;;;;;;sBAaRrH,EAAAA,GAAO4N;;;;EAMvBC,GAAShN,EAAAA,GAAOC,GAAG;IACrBC,EAAAA,GAAM+M;;;EAKJ5E,GAAQrI,EAAAA,GAAO1B,KAAK;;;;;;;IAOtB4B,EAAAA,GAAMgN;EAGJC,GAAQnN,EAAAA,GAAOoN,KAAK;;;;;sBAKJjO,EAAAA,GAAO6M;IACzB,EAAGf,WAAYA,GAAS,qBAAqB9L,EAAAA,GAAOS;;;IAGpDM,EAAAA,GAAM8I;EAGJqE,GAAkBrN,EAAAA,GAAOC,GAAG;;;;;;;;;EAW5BmL,GAAQpL,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAMgM;EAGV,OAnRkCoB,EAAGtP,SAAQC,cAC3C,MAAMP,GAAWC,EAAAA,EAAAA,MACX3L,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/Dub,EAAcvb,EAAY2E,aAAa6W,UAEHtQ,EAAAC,IAAlBC,EAAAA,EAAAA,UAAgB,GAAE,GAAnCqQ,EAAIvQ,EAAA,GAAEwQ,EAAOxQ,EAAA,GACkDK,EAAAJ,IAAxCC,EAAAA,EAAAA,UAAsB,CAAC,GAAiB,GAA/DnE,EAAOsE,EAAA,GAAEoQ,EAAUpQ,EAAA,GAC6B2M,EAAA/M,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GAE8B0D,EAAAzQ,IAAxCC,EAAAA,EAAAA,UAASpL,EAAY2E,aAAa2T,OAAM,GAA3DA,EAAKsD,EAAA,GAAEC,EAAQD,EAAA,GACyCE,EAAA3Q,IAAvCC,EAAAA,EAAAA,UAASpL,EAAY2E,aAAaoQ,MAAK,GAAxDA,EAAI+G,EAAA,GAAEC,EAAOD,EAAA,GAGnBE,EAAA7Q,IAF+CC,EAAAA,EAAAA,UAC9CpL,EAAY+X,oBACb,GAFMC,EAAgBgE,EAAA,GAAE/D,EAAmB+D,EAAA,GA0CtCC,EAAcvP,IAClBA,EAAEgM,iBACFzM,GAAS,EAmBX,OAhBA4G,EAAAA,EAAAA,YAAU,KACR,WACE,IACE,IAAK7S,GAAa2E,cAAcuX,mBAC9B,OAGF,MAAMC,QAAiBC,EAAAA,GAAAA,IAAWpc,EAAY2E,aAAauX,oBAE3DP,EAAWQ,EAASlV,QACtB,CAAE,MAAO+R,GACPqD,GAAAA,EAAUC,UAAUtD,EACtB,CACD,EAZD,EAYI,GACH,CAAChZ,IAECiH,GAAStH,IAGZiK,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CACTC,OAAQA,EACRC,QAASA,EACTkK,oBAAoB,EACpBD,iBAAe,EACfzO,MAAM,QAAOsC,UAEb8B,EAAAA,EAAAA,MAAChC,GAAS,CAAC2O,SArEMC,UACnB/L,EAAEgM,iBACFhM,EAAE2E,kBAEF+G,GAAgB,GAEhB,IACE,GAAa,IAATqD,QACIc,EAAAA,GAAAA,IAAkBvc,EAAYL,GAAIqV,EAAAA,EAAWC,QAAOtX,GAAAA,GAAA,GACrDqC,EAAY2E,cAAY,IAC3B2T,QACAvD,WAGFyH,EAAAA,GAAAA,IAAiBxc,GAEjB0L,GAAS+Q,EAAAA,GAAAA,OAETf,EAAQ,OACH,QACkB/C,EAAAA,GAAAA,IAAmB3Y,EAAYL,GAAI,CACxDkY,YAAa,GACbG,sBAGWY,KAAKC,SAChBnN,GAAS+Q,EAAAA,GAAAA,OAGXxQ,GACF,CACF,CAAE,MAAO+M,GACPqD,GAAAA,EAAUC,UAAUtD,EACtB,CAAC,QACCZ,GAAgB,EAClB,GAkCoCrO,SAAA,EAChC8B,EAAAA,EAAAA,MAAC8O,GAAG,CAAA5Q,SAAA,EACFH,EAAAA,EAAAA,KAACiR,GAAI,CAAC7G,IAAK0I,GAAUxI,IAAI,eACzBtK,EAAAA,EAAAA,KAACkR,GAAW,CAAC9G,IAAK/M,EAAQ3C,MAAMC,SAEjC,MACC,OAAQkX,GACN,KAAK,EACH,OACE5P,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAAC+O,GAAM,CAAA7Q,SAAA,EACLH,EAAAA,EAAAA,KAACoR,GAAM,CAAAjR,UACJuM,EAAAA,GAAAA,GACC,CACE,iDACAiF,EAAc,mBAAqB,iBAErC,CAAEhD,aAActR,EAAQsR,kBAG5B3O,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnBrQ,MAAM,oBACN6C,MAAO4F,EAAO,CAAE5F,MAAO4F,EAAMzI,MAAOyI,GAAS,KAC7C/D,QAASoJ,GACT3N,SAAWmQ,IACLA,GACFb,EAAQa,EAAUzN,MACpB,EAEF0N,YAAY,mBACZrD,UAAU,KAEZ3N,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACyM,GAAK,CAAAtM,SAAC,iCACPH,EAAAA,EAAAA,KAACuR,GAAK,CAEJ1d,KAAK,OACL2C,KAAK,QACL+O,MAAOmJ,EACP7L,SAAWC,IACTmP,EAASnP,EAAEE,OAAOuC,MAAM,EAE1B2N,aAAa,MACb,cAAY,4BACZD,YAAY,wBATR,yBAaVjT,EAAAA,EAAAA,KAACyR,GAAe,CAAAtR,UACdH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAASsc,UAAWhF,IAASuD,GAASH,EAAapO,SAAC,gBAMzE,KAAK,EACH,OACE8B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAAC+O,GAAM,CAAA7Q,SAAA,EACL8B,EAAAA,EAAAA,MAAA,OAAKyH,MAAO,CAAE3C,OAAQ,WAAY5G,SAAA,CAAC,mCAEjCH,EAAAA,EAAAA,KAAA,SAAM,2CACmC3C,EAAQsR,aAAa,qBAEhE1M,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACwP,GAAK,CAAArP,SAAC,wBACPH,EAAAA,EAAAA,KAACyP,GAAAA,EAAgB,CACfC,YAAY,oBACZC,WAAW,UACXpK,MAAO6I,EACPvL,SAAUwL,EACVuB,UAAQ,WAId3N,EAAAA,EAAAA,MAACwP,GAAe,CAAAtR,SAAA,EACdH,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CAACC,KAAK,OAAOK,QAAS4O,EAAYhP,SAAU,QACvDrD,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACyF,SAAU5B,IAAiBH,EAAiB1X,OAAOyJ,SAAC,yBAMpE,QACE,OAAO,KAEZ,EAjFA,QAfkB,IAkGV,E,mCChMF,SAASgT,KACtB,MAAwBC,GAAgBC,EAAAA,EAAAA,KAAhCC,eACFtO,GAAUC,EAAAA,EAAAA,MAoBhB,OAlBAgE,EAAAA,EAAAA,YAAU,KACR,WACE,IACE,MAAMsJ,QAAiBgB,GAAAA,EAAIC,IAAI,aAAaJ,KAC5CpO,EAAQrO,MAAK8c,EAAAA,GAAAA,IAAuBlB,EAASvD,KAAK0E,SACpD,CAAE,MAAOtE,GACP9D,QAAQ+D,MAAMD,GACda,GAAAA,GAAMZ,MACJ,qHAEFrK,EAAQrO,KAAK,QACb8b,GAAAA,EAAUC,UAAUtD,GAAMuE,IACxBA,EAAKC,UAAU,mCAAmC,GAEtD,CACD,EAdD,EAcI,GACH,CAACR,IAEG,IACT,C,sFC5Be,SAASS,IAAY,SAAE1T,IACpC,MAAQ4L,GAAaC,EAAAA,EAAAA,MAAbD,SAMR,OAJA9C,EAAAA,EAAAA,YAAU,KACRnL,OAAO6C,SAAS,EAAG,EAAE,GACpB,CAACoL,IAEG5L,CACT,C,ioECuPA,OAhP2B2T,KACzB,MAAmDxS,EAAAC,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA5CuS,EAAUzS,EAAA,GAAE0S,EAAa1S,EAAA,GAE1BlL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DQ,GAAoBoL,EAAAA,EAAAA,KACvBrO,GAAqBA,EAAMqE,eAAepB,oBAGvCoO,GAAUC,EAAAA,EAAAA,MACVnD,GAAWC,EAAAA,EAAAA,MAEXkS,EAAYxJ,IACX7T,GAGHkL,GAASoS,EAAAA,GAAAA,KAAqB,IAC9BpW,OAAOhE,SAASmK,KAAOwG,GAHvBzF,EAAQrO,KAAK8T,EAIf,EAUI0J,EAAoBA,KACxBF,EAAS,YAAY7d,EAAYC,cAAcD,EAAYE,aAAaF,EAAYL,MACpFie,GAAc,EAAM,EAmChBI,EAAehe,GAAawH,OAAOyW,QAAQ1Z,IAEjD,OACEqF,EAAAA,EAAAA,KAACsU,GAAAA,EAAK,CACJC,SACEtS,EAAAA,EAAAA,MAAA,UACEpO,KAAK,SACL,cAAY,sBACZ2gB,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOC,iBAAiBvU,SAAA,CAErCiU,GASApU,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOE,uBACtB,cAAY,0BACZjL,MAAO,CACLkL,gBAAiB,OAAOxe,EAAYwH,MAAMiX,MAAMla,WAZpDsH,EAAAA,EAAAA,MAAA,OACEuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOE,uBACtB,cAAY,0BAAyBxU,SAAA,CAEpC/J,EAAYC,aAAa,IAAIye,cAC7B1e,EAAYE,YAAY,IAAIwe,kBAWjC9U,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOM,aAAa5U,UACtCH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,oBAEbwJ,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOO,mBAAmB7U,UAC5CH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,gBAIjBye,GAAG,QACHC,OAAK,EACLV,UAAW,IAAG1M,EAAAA,GAAAA,IAAI2M,GAAOU,yCACzBC,cAAY,EACZC,WAAS,EACT1R,SAAS,eACThH,KAAMoX,EACNuB,OAAQA,IAAMtB,GAAc,GAC5B3R,QAASA,IAAM2R,GAAc,GAC7BuB,SACEtT,EAAAA,EAAAA,MAAA,OACEuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOe,8BACtBC,aAAcA,IAAMzB,GAAc,GAClC0B,aAAcA,IAAM1B,GAAc,GAAO7T,SAAA,EAEzC8B,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOkB,uBAAuBxV,SAAA,EAChDH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmB,4BAA4BzV,SACnDiU,GAMApU,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOoB,wBACtBnM,MAAO,CACLkL,gBAAiB,OAAOxe,EAAYwH,MAAMyW,OAAO1Z,WARrDsH,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOqB,0BAA0B3V,SAAA,CAClD/J,GAAaC,aAAa,IAAIye,cAC9B1e,GAAaE,YAAY,IAAIwe,oBAWpC7S,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOsB,wBAAwB5V,SAAA,EACjD8B,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOuB,kBAAkB7V,SAAA,CAC1C/J,EAAYC,WAAW,IAAED,EAAYE,UACrCF,EAAY+U,OAASwB,GAAAA,EAASC,SAC7BxW,EAAY2E,cAAckb,iBACxBjW,EAAAA,EAAAA,KAACkW,GAAsB,CAAA/V,UACrBH,EAAAA,EAAAA,KAACmW,GAAAA,GAAa,UAItBnW,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO2B,sBAAsBjW,SAC9C/J,EAAY+U,OAASwB,GAAAA,EAASC,QAC3BxW,EAAY2E,aAAa4T,aACzBvY,EAAY2E,aAAa2T,QAE9BtY,EAAY+U,OAASwB,GAAAA,EAAS4C,YAC7BvP,EAAAA,EAAAA,KAAA,OACEyD,QAAS0Q,EACTK,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO4B,sBACtB,cAAY,+BAA8BlW,SAC3C,iBAIF/J,EAAY+U,OAASwB,GAAAA,EAASC,UAC7B3K,EAAAA,EAAAA,MAACqU,GAAW,CAAAnW,SAAA,CACToW,QAAQngB,EAAY2E,cAAcyb,WACjCxW,EAAAA,EAAAA,KAACyW,GAAAA,GAAU,CAAC5iB,KAAMuC,EAAY2E,cAAcyb,UAE7CpgB,EAAY2E,cAAc+R,WAAY9M,EAAAA,EAAAA,KAAC0W,GAAAA,GAAQ,cAKxD1W,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CAACjH,QApIUkT,KACxB1C,EAAS,YACTD,GAAc,EAAM,EAkIsBQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,eAAezW,SAAC,qBAGzE/J,EAAY+U,OAASwB,GAAAA,EAASC,SAAYxW,EAAY2E,aAAa6W,UAIhE,MAHF5R,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CAACjH,QAnIUoT,KAC1B5C,EAAS,uBACTD,GAAc,EAAM,EAiI0BQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,eAAezW,SAAC,mBAI7E/J,EAAY+U,OAASwB,GAAAA,EAAS4C,WAAanZ,EAAY2E,aAAa+b,YACnE9W,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CACLjH,QAAS0Q,EACTK,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,cAAenC,GAAOsC,0BAA0B5W,UAErEuM,EAAAA,GAAAA,GAAE,8CAGNtW,EAAYL,IACXK,EAAY+U,OAASwB,GAAAA,EAASqK,oBAC5B5gB,EAAY+U,OAASwB,GAAAA,EAASC,UAAYxW,EAAY2E,aAAakc,YACnEjX,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CACLjH,QAlIUyT,KACtBjD,EAAS,UACTD,GAAc,EAAM,EAiIRQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,cAAenC,GAAO0C,cAAchX,SAC3D,UAIJ/J,EAAY+U,OAASwB,GAAAA,EAAS4C,YAC7BvP,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CACLjH,QAAS0Q,EACTK,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,cAAenC,GAAOsC,0BAA0B5W,SACvE,iBAIF/J,EAAY+U,OAASwB,GAAAA,EAASC,UAC7B3K,EAAAA,EAAAA,MAACyI,GAAAA,EAAM,CAACjH,QAtJe2T,KAC/BnD,EAAS,YAAY7d,EAAY2E,aAAauX,sBAC9C0B,GAAc,EAAM,EAoJ+BQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,eAAezW,SAAA,CAC7E/J,EAAY2E,aAAa+R,SAAW,OAAS,OAAO,mBAGxD1W,EAAY+U,OAASwB,GAAAA,EAASqK,mBAC7BhX,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CACLjH,QAlJgC4T,KAC1CpD,EAAS,mCACTD,GAAc,EAAM,EAiJVQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,eAAezW,SACtC,oBAIHH,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CACLjH,QAASA,MACP6T,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5BC,aAAc,uBAEhB3Z,OAAOhE,SAASmK,KAAO,iCAAiC,EAE1DuQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,eAAezW,SACtC,gBAGA/J,EAAY+U,OAASwB,GAAAA,EAAS4C,YAC7BvP,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CACL,cAAY,6BACZjH,QAvLoBoL,UAC9BoF,EACE,YAAY7d,EAAYC,cAAcD,EAAYE,aAAaF,EAAYL,kBAE7Eie,GAAc,EAAM,EAoLVQ,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmC,eAAezW,SACtC,yBAIHH,EAAAA,EAAAA,KAAC0K,GAAAA,EAAM,CAACjH,QAnNSoL,gBACjB6I,EAAAA,GAAAA,MAGN5Z,OAAOhE,SAASmK,MAAO0T,EAAAA,GAAAA,IAAiB,EA+MCnD,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmD,sBAAsBzX,SAAC,iBAKpF,EAMN,MAAMmW,GAAclS,EAAAA,GAAOC,GAAG;;;;;EAMxB6R,GAAyB9R,EAAAA,GAAOuP,IAAI;;;;;;;EAQlC3G,GAAuBC,EAAAA,GAAvBD,mBACFyH,GAASoD,GAAAA,GAAWC,OAAO,CAC/BpD,gBAAiB,CACfqD,QAAS,OACTC,WAAY,SACZC,WAAY,GACZC,OAAQ,OACRtU,WAAY,OACZuU,QAAS,OACT,CAACnL,IAAqB,CACpBiL,WAAY,SAGhBtD,sBAAqB5gB,GAAAA,GAAA,CACnBiK,OAAQ,OACRH,MAAO,OACPyF,MAAOC,EAAAA,GAAOyE,MACd+F,gBAAiBxK,EAAAA,GAAO6U,YACxBC,YAAa,MACbN,QAAS,OACTO,eAAgB,SAChBN,WAAY,UACTO,EAAAA,GAASC,UAAQ,IACpBC,OAAQ,UACRC,aAAc,MACdC,iBAAkB,YAClBC,mBAAoB,gBACpBC,eAAgB,QAChB,CAAC7L,IAAqB,CACpB+K,QAAS,UAGbhD,YAAa,CACX0D,OAAQ,UACR,CAACzL,IAAqB,CACpB+K,QAAS,SAGb/C,kBAAmB,CACjB+C,QAAS,OACT,CAAC/K,IAAqB,CACpB+K,QAAS,QACTe,SAAU,UAGd3D,oBAAqB,CACnB4D,UAAW,OACXC,aAAc,MACdC,cAAe,MACfC,YAAa,MACbC,aAAc,MACdjB,OAAQ,OACRkB,SAAU,QACV,CAACpM,IAAqB,CACpBqM,UAAW,qCACXxb,MAAO,OACPyb,SAAU,OACVC,KAAM,IAGV/D,6BAA8B,CAC5B3X,MAAO,QACP2b,QAAS,aACTC,OAAQ,IACR,CAACzM,IAAqB,CACpBnP,MAAO,OACP6b,WAAY,EACZP,aAAc,OACdF,cAAe,OACfC,YAAa,SAGjBvD,sBAAuB,CACrBoC,QAAS,OACTiB,aAAc,MACd,CAAChM,IAAqB,CACpB+K,QAAS,SAGbnC,2BAA4B,CAC1B/X,MAAO,OAETiY,yBAAwB/hB,GAAAA,GAAA,CACtBiK,OAAQ,OACRH,MAAO,OACPyF,MAAOC,EAAAA,GAAOyE,MACd+F,gBAAiBxK,EAAAA,GAAO6U,YACxBH,WAAY,OACZF,QAAS,OACTO,eAAgB,SAChBN,WAAY,UACTO,EAAAA,GAASoB,oBAAkB,IAC9BjB,aAAc,MACdC,iBAAkB,YAClBC,mBAAoB,gBACpBC,eAAgB,UAElBhD,uBAAwB,CACtB7X,OAAQ,OACRH,MAAO,OACPkQ,gBAAiBxK,EAAAA,GAAO6U,YACxBH,WAAY,OACZS,aAAc,MACdC,iBAAkB,YAClBC,mBAAoB,gBACpBC,eAAgB,SAElB9C,uBAAwB,CACtBkC,WAAY,OACZpa,MAAO,MACPkb,UAAW,MACXV,YAAa,QAEfrC,iBAAgBjiB,GAAAA,GAAA,CACd6lB,IAAK,MACLtW,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASjI,UAAQ,IACpBuJ,cAAe,eAEjBzD,qBAAoBriB,GAAAA,GAAA,GACfwkB,EAAAA,GAASrQ,UAAQ,IACpB5E,MAAOC,EAAAA,GAAOyE,QAEhBqO,qBAAoBtiB,GAAAA,GAAA,CAClB0kB,OAAQ,WACLF,EAAAA,GAASjI,UAAQ,IACpBhN,MAAOC,EAAAA,GAAOC,YAEhB2T,aAAc,CACZY,QAAS,OACT,CAAC/K,IAAqB,CACpB+K,QAAS,UAGbhB,yBAA0B,CACxBgB,QAAS,OACT,CAAC/K,IAAqB,CACpB+K,QAAS,UAGbnB,cAAa7iB,GAAAA,GAAA,CACXylB,QAAS,YACTzL,gBAAiBxK,EAAAA,GAAOY,MACxB2V,aAAc,aAAavW,EAAAA,GAAOsE,eAC/B0Q,EAAAA,GAASjI,UAAQ,IACpBhN,MAAOC,EAAAA,GAAOyD,YACdnJ,MAAO,QACP6a,aAAc,MACdL,YAAa,IACbnY,UAAW,OACX,CAAC8M,IAAkBjZ,GAAA,CACjB8J,MAAO,OACPqb,YAAa,EACbC,aAAc,EACd7V,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASnL,WAEd,SAAU,CACRW,gBAAiBxK,EAAAA,GAAOwE,cAG5B6P,qBAAoB7jB,GAAAA,GAAA,CAClBylB,QAAS,aACNjB,EAAAA,GAASjI,UAAQ,IACpBvC,gBAAiBxK,EAAAA,GAAOY,MACxBb,MAAOC,EAAAA,GAAOyD,YACdgS,aAAc,MACdnb,MAAO,QACP6a,aAAc,MACdL,YAAa,IACbnY,UAAW,OACX,CAAC8M,IAAkBjZ,GAAA,CACjB8J,MAAO,OACPqb,YAAa,EACbC,aAAc,EACd7V,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASnL,WAEd,SAAU,CACRW,gBAAiBxK,EAAAA,GAAOwE,gB,0iCClc9B,MAAQgS,GAAuB9M,EAAAA,GAAvB8M,mBAgKR,OA9JelC,GAAAA,GAAWC,OAAO,CAC/BkC,iBAAkB,CAChBtB,aAAc,MACdc,QAAS,kBAEXS,0BAA2B,CACzBlM,gBAAiB,SAEnBmM,yBAA0B,CACxBnB,UAAW,MACX7Y,UAAW,UAEbia,qBAAsB,CACpBxW,SAAU,WACVyW,IAAK,OACLC,MAAO,QAETC,gBAAiB,CACfvB,UAAW,QAEbwB,oBAAmBxmB,GAAAA,GAAA,CACjBuP,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASxL,oBAAkB,IAC9BiM,aAAc,MACd9Y,UAAW,WAEbsa,uBAAsBzmB,GAAAA,GAAA,CACpBuP,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASnL,WAAS,IACrBlN,UAAW,WAEbua,2BAA4B,CAC1BnX,MAAOC,EAAAA,GAAOyE,MACd9H,UAAW,SACX,gBAAenM,GAAAA,GAAA,GACVwkB,EAAAA,GAAS1N,WAAS,IACrBmO,aAAc,SAEhB,cAAajlB,GAAAA,GAAA,CACXuP,MAAOC,EAAAA,GAAOyD,aACXuR,EAAAA,GAASnL,WAAS,IACrB4L,aAAc,SAGlB0B,yBAAwB3mB,GAAAA,GAAA,CACtB8J,MAAO,MACPka,QAAS,eACT4C,cAAe,MACfnB,QAAS,cACNjB,EAAAA,GAASjI,UAAQ,IACpB,CAACyJ,IAAqB,CACpBlc,MAAO,OACPkJ,OAAQ,OACRyS,QAAS,cAGboB,qBAAoB7mB,GAAAA,GAAA,CAClBuP,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASnL,WAAS,IACrBvP,MAAO,MACPmb,aAAc,OACdjB,QAAS,OACT,CAACgC,IAAqB,CACpBf,aAAc,OACd,cAAe,CACbA,aAAc,UAIpB6B,oBAAqB,CACnB5C,WAAY,OAEd6C,0BAA2B,CACzBjd,MAAO,MACPka,QAAS,eACTyB,QAAS,UACT,CAACO,IAAqB,CACpBlc,MAAO,OACPkJ,OAAQ,SAGZgU,8BAA+B,CAC7BvB,QAAS,UACTzS,OAAQ,UAEViU,qBAAsB,CACpBjC,UAAW,OACXC,aAAc,OACd,eAAgB,CACdjS,OAAQ,MAGZkU,sBAAqBlnB,GAAA,CACnB8J,MAAO,OACPqa,OAAQ,aAAa3U,EAAAA,GAAOsE,cAC5B2R,QAAS,WACTd,aAAc,MACd1a,OAAQ,QACLua,EAAAA,GAAS2C,WAEdC,qBAAsB,CACpBpU,OAAQ,IACRlJ,MAAO,MACPka,QAAS,eACT,eAAgB,CACdhR,OAAQ,aAGZqU,2BAA0BrnB,GAAAA,GAAA,CACxBilB,aAAc,QACXT,EAAAA,GAAS2C,WAAS,IACrBG,WAAY,SACZnb,UAAW,WAEbob,wBAAuBvnB,GAAAA,GAAA,CACrBilB,aAAc,OACd1V,MAAO,UACJiV,EAAAA,GAAS2C,WAAS,IACrBhb,UAAW,WAEbqb,sBAAuB,CACrBrD,OAAQ,oBAEVsD,8BAA6BznB,GAAAA,GAAA,CAC3BmM,UAAW,SACX6X,QAAS,gBACNQ,EAAAA,GAASjI,UAAQ,IACpBzS,MAAO,OACPyF,MAAOC,EAAAA,GAAOyE,QAEhByT,sBAAqB1nB,GAAAA,GAAA,CACnBkkB,WAAY,OACTM,EAAAA,GAASnL,WAAS,IACrB2K,QAAS,eACTzU,MAAOC,EAAAA,GAAOyE,MACdyQ,OAAQ,UACRvI,eAAgB,cAElBwL,mCAAoC,CAClCxb,UAAW,SACX6Y,UAAW,QAEb4C,sBAAqB5nB,GAAA,CACnBuP,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAAS2C,WAEdU,0BAAyB7nB,GAAAA,GAAA,CACvBmc,eAAgB,YAChB5M,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAAS2C,WAAS,IACrBlC,aAAc,QAEhB6C,0BAA2B,CACzB9C,UAAW,OACXC,aAAc,U,4kEC0NlB,OAjWoB8C,EAAGzZ,UAAS/G,iBAAgBygB,eAActkB,iBAC5D,MAAwC6J,EAAAC,IAAZC,EAAAA,EAAAA,UAAS,CAAC,GAAE,GAAjCwa,EAAM1a,EAAA,GAAE2a,EAAS3a,EAAA,GAC4BK,EAAAJ,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA7C0a,EAAYva,EAAA,GAAEwa,EAAexa,EAAA,GACmB2M,EAAA/M,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GACmB0D,EAAAzQ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD4a,EAAYpK,EAAA,GAAEqK,EAAerK,EAAA,GAEUE,EAAA3Q,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAvC8a,EAASpK,EAAA,GAAEqK,EAAYrK,EAAA,GACcE,EAAA7Q,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAArCgb,EAAQpK,EAAA,GAAEqK,EAAWrK,EAAA,GACgBsK,EAAAnb,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAArCmb,EAAQD,EAAA,GAAEE,EAAWF,EAAA,GAC5BG,GAA8DC,EAAAA,GAAAA,GAAqB,IAA3EC,EAAKF,EAALE,MAAOC,EAAQH,EAARG,SAAUC,EAAiBJ,EAAjBI,kBAAmBC,EAAaL,EAAbK,cACyBC,EAAA5b,IAA3BC,EAAAA,EAAAA,UAASyb,GAAkB,GAA9DG,EAAaD,EAAA,GAAEE,EAAgBF,EAAA,GAEhCG,EAA+B,eAAnBhiB,EACZiiB,EAAYzf,OAAOhE,SAASiS,SAASG,SAAS,eAAiBzU,EAC/D+lB,EAAiB1f,OAAOhE,SAASiS,SAASM,WAAW,cAG3D,IAAIoR,EAAiB,uBACjBC,EAAiB,wEACjBC,EAAkB,GAClBC,EAAY,CACd,yCACA,sDACA,kEARoB9f,OAAOhE,SAASiS,SAASM,WAAW,kBAWxDoR,EAAiB,6BACjBC,EAAiB,sEACjBC,EAAkB,oBAClBC,EAAY,CACV,6DACA,sDACA,wCACA,qDAIJ,MAAMC,GAAeL,EACfM,EAAYN,EAElB,IAAIO,EAAW,GAEbA,EADEF,EACS,MACFC,EACE,MAEA,OAGb7U,EAAAA,EAAAA,YAAU,KACR,MAAM+U,EAAQ,GAAGD,yBACXlqB,EAAO,SAASyH,KAEtBgc,EAAAA,GAAAA,IAAM0G,EAAO,CAAEnqB,QAAO,GACrB,CAACkqB,EAAUziB,KAEd2N,EAAAA,EAAAA,YAAU,KACRoT,GAAgB,EAAM,GACrB,CAACC,EAAWE,EAAUO,EAAOJ,KAEhC1T,EAAAA,EAAAA,YAAU,KACJgU,GAAmBI,GAAiB,EAAK,GAC5C,CAACJ,IAEJ,MAiFMgB,EAAgBA,IAChBC,KAAAA,QAAkB5B,IAAc4B,KAAAA,QAAkB1B,IAAa0B,KAAAA,QAAkBnB,IACnFZ,EAAgB,iDACT,GACG+B,KAAAA,QAAkBnB,IAGnBoB,EAAAA,GAAAA,IAAkBpB,IAC3BZ,EAAgB,sBAAuB2B,EAA+B,GAAnB,2BAC5C,GACGI,KAAAA,SAAmBvB,EAAU,CAAEyB,IAAK,EAAGC,IAAK,UAAjD,GACLlC,EAAgB,oDACT,IAPPA,EAAgB,wCACT,GAULmC,EACJlC,IAAiBF,EAAaxlB,OAAS,GAAK+Z,OAAO8N,KAAKvC,GAAU,CAAC,GAAGtlB,OAAS,GAEjF,OACEuL,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO0F,sBAAsBha,UAC/CH,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CAACC,QAAQ,SAASlE,SAAS,QAAQI,QAASpB,EAASmc,gBAAgB,cAElFxe,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOyF,0BAA0B/Z,UACnDH,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,IAAG9D,UACTH,EAAAA,EAAAA,KAAA,OAAKoK,IAAK0I,UAGd9S,EAAAA,EAAAA,KAACye,GAAAA,EAAI,CAACC,UAAQ,EAACC,QAAS,EAAExe,UACxBH,EAAAA,EAAAA,KAACye,GAAAA,EAAKG,IAAG,CAACF,UAAQ,EAACC,QAAS,EAAExe,UAC5B8B,EAAAA,EAAAA,MAACwc,GAAAA,EAAKI,OAAM,CAAChhB,MAAO,GAAGsC,SAAA,EACrB8B,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO6F,iBAAiBna,SAAA,EAC1CH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO8F,qBAAqBpa,SAAEsd,KAClDzd,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO+F,wBAAwBra,SAAEud,IACpDG,GAAeN,IACdvd,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO+F,wBAAwBra,SAAC,wFAKvDyd,EAAUlnB,OAAS,IAClBuL,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOiG,0BAA0Bva,SAAA,EACnDH,EAAAA,EAAAA,KAAA,KAAAG,SAAIwd,IACHC,EAAU/nB,KAAKipB,IAEZ7c,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmG,sBAAsBza,SAAA,EAC/C8B,EAAAA,EAAAA,MAAA,QAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAW8M,MAAOC,EAAAA,GAAOC,YAAc,QAEpDxD,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOoG,qBAAqB1a,SAAE2e,MAJGA,SAU/D7c,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOqG,2BAA2B3a,SAAA,EACpDH,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,GAAAA,IACToU,EAAezH,GAAO6G,wBAA0B7G,GAAO2G,4BACvDjb,SAED+b,GAA8B,sBAEjCja,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACE8B,EAAAA,EAAAA,MAAC8c,GAAAA,EAAI,CAAC1P,MAAOiP,EAAW1P,SAlJfC,UAKrB,GAJAL,GAAgB,GAChB6N,GAAgB,GAChBJ,EAAU,CAAC,GAEPmB,EACF,OAAKH,OAMLC,KALEf,EAAgB,sDAChB3N,GAAgB,IAQpB,GAAIyP,IAEF,YADAzP,GAAgB,GAIlB,IAAIwQ,EACAC,cAAcC,QAAQ,0BACxBF,EAAqBC,aAAaC,QAAQ,wBAC1CD,aAAaE,WAAW,yBAG1B,IACE,MAAMC,QAAqB7L,GAAAA,EAAI8L,KAAK,SAAU,CAC5CnZ,KAAInS,GAAA,CACFgpB,QACAJ,WACAtmB,WAAYimB,EACZhmB,UAAWkmB,GACPsB,GAAa,CAAEzgB,SAAS,MAI5BkgB,IACED,GAAa7lB,EAAW6nB,MAC1BpU,EAAAA,EAAAA,IAAiB,gCAAgCzT,EAAW6nB,OAAQ,IAEpEpU,EAAAA,EAAAA,OAIJ,MAAMhF,EAAOkZ,EAAapQ,MAC1BuQ,EAAAA,GAAAA,IAASrZ,SACHoR,EAAAA,GAAAA,IAAM,GAAGyG,4BAAoC,CACjDlqB,KAAM,SAASyH,MAIfwC,OAAOhE,SAASmK,KADd+a,EACqB,+BAA+BA,IAE/B,iBAE3B,CAAE,MAAO3P,GACPb,GAAgB,GAChBlD,QAAQkU,IAAInQ,GACRA,EAAMkD,SAASvD,KAAKgN,OAAOe,MAAM,GAAG0C,QAAQ,uBAAyB,EACvEtD,EAAgB,sCAEhB9M,EAAMkD,SAASvD,KAAKgN,OAAOe,MAAM,GAAG0C,QAAQ,0CAA4C,EAExFtD,EAAgB,2CAEhBA,EAAgB,2CAGlBF,EAAU5M,EAAMkD,SAASvD,KAAKgN,OAChC,GA2E6D7b,SAAA,GAC5Cid,GAAiBd,GAAaE,KAC/Bva,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC+e,GAAAA,EAAKW,MAAK,CACTlL,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOuG,qBAAsBvG,GAAO0G,sBAAsBhb,UAEzEH,EAAAA,EAAAA,KAAA,SACEwU,WAAW1M,EAAAA,GAAAA,IACT2M,GAAOwG,sBACPmB,IAAiBE,GAAa7H,GAAO8G,uBAEvC,cAAY,+BACZ/kB,KAAK,YACLqM,SAAWC,GAAMyZ,EAAazZ,EAAEE,OAAOuC,OACvC0N,YAAY,aACZ1N,MAAO+W,OAGXtc,EAAAA,EAAAA,KAAC+e,GAAAA,EAAKW,MAAK,CACTlL,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOuG,qBAAsBvG,GAAO0G,sBAAsBhb,UAEzEH,EAAAA,EAAAA,KAAA,SACEwU,WAAW1M,EAAAA,GAAAA,IACT2M,GAAOwG,sBACPmB,IAAiBI,GAAY/H,GAAO8G,uBAEtC,cAAY,8BACZ/kB,KAAK,WACLqM,SAAWC,GAAM2Z,EAAY3Z,EAAEE,OAAOuC,OACtC0N,YAAY,YACZ1N,MAAOiX,UAKfxc,EAAAA,EAAAA,KAAC+e,GAAAA,EAAKW,MAAK,CAAClL,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOuG,sBAAsB7a,UACtDH,EAAAA,EAAAA,KAAA,SACEwU,WAAW1M,EAAAA,GAAAA,IACT2M,GAAOwG,wBACNkD,EAAAA,GAAAA,IAAkBpB,IAAWX,IAAiB8B,KAAAA,QAAkBnB,KAC/DtI,GAAO8G,uBAEX,cAAY,0BACZ/kB,KAAK,QACLqM,SAAWC,GAAMka,EAASla,EAAEE,OAAOuC,OACnC0N,YAAa6K,EAAY,gBAAkB,8BAC3CvY,MAAOwX,MAGVK,GACCnb,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC2f,GAAgB,CAAAxf,UACfH,EAAAA,EAAAA,KAAC4f,GAAAA,EAAc,OAEjB5f,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL,cAAY,4BACZyF,SAAU5B,IAAiBwO,EAC3BlpB,KAAK,SACLgK,MAAM,OAAMsC,SACb,cAGDH,EAAAA,EAAAA,KAAC6f,GAAkB,CACjBpc,QAASA,KACHwZ,GAAmBD,EAAS,IAChCK,GAAiB,EAAM,EACvBld,UAEFH,EAAAA,EAAAA,KAAC8f,GAAS,CAAA3f,SAAC,qCAIf8B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC+e,GAAAA,EAAKW,MAAK,CAAClL,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOuG,sBAAsB7a,UACtDH,EAAAA,EAAAA,KAAA,SACEwU,WAAW1M,EAAAA,GAAAA,IACT2M,GAAOwG,sBACPmB,IACGO,EAASjmB,OAAS,GAAKimB,EAASjmB,OAAS,KAC1C+d,GAAO8G,uBAEX,cAAY,6BACZ/kB,KAAK,WACLqM,SAAWC,GAAM8Z,EAAY9Z,EAAEE,OAAOuC,OACtC0N,YAAY,WACZpf,KAAK,WACL0R,MAAOoX,OAGX3c,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL,cAAY,4BACZyF,SAAU5B,EACV1a,KAAK,SACLgK,MAAM,OAAMsC,SACb,oBAGDH,EAAAA,EAAAA,KAAC6f,GAAkB,CAAA1f,UACjBH,EAAAA,EAAAA,KAAC8f,GAAS,CAACrc,QAASA,IAAM4Z,GAAiB,GAAMld,SAAC,8BAO1D8B,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOiH,oCAAoCvb,SAAA,EAC7D8B,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOkH,uBAAuBxb,SAAA,CAAC,iCAClB,QAEjCH,EAAAA,EAAAA,KAAA,KACEwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmH,2BACtB3X,KAAK,SACLjB,OAAO,SAAQ7C,SAChB,sBAGDH,EAAAA,EAAAA,KAAA,QAAMwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOkH,uBAAuBxb,SAAE,SACrDH,EAAAA,EAAAA,KAAA,KACEwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOmH,2BACtB3X,KAAK,WACLjB,OAAO,SAAQ7C,SAChB,6BAMPH,EAAAA,EAAAA,KAAA,MAAIwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOoH,8BAC1B5Z,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAO+G,+BAA+Brb,SAAA,CAAC,4BAEzDH,EAAAA,EAAAA,KAAA,QAAM0J,MAAO,CAAEuO,WAAY,OAAQ9X,UACjCH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOgH,uBAAwBhY,QA3M7Csc,KACdxC,GAAaD,GAAa7lB,EAAW6nB,OACvCpU,EAAAA,EAAAA,IAAiB,gCAAgCzT,EAAW6nB,QAE9DvD,EAAa,QAAQ,EAuM+D5b,SAAC,0BAQ/E,EAMV,MAAMwf,GAAmBvb,EAAAA,GAAOC,GAAG;;;;EAM7Bwb,GAAqBzb,EAAAA,GAAOC,GAAG;;;;EAM/Byb,GAAY1b,EAAAA,GAAOC,GAAG;;;;;;WAMjBd,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM8I;;;;aAIG7J,EAAAA,GAAOyc;;sgCCrTpB,OA5EA,WACE,MAA+D1e,EAAAC,IAA7BC,EAAAA,EAAAA,UAAoB,UAAS,GAAxDye,EAAS3e,EAAA,GAAEya,EAAYza,EAAA,GACgCK,EAAAJ,IAA1BC,EAAAA,EAAAA,YAA0B,GAAvD/J,EAAUkK,EAAA,GAAEue,EAAave,EAAA,GAE1BvG,GAAiB4G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9D,iBAClEE,GAAiB0G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS5D,iBAClED,GAAoB2G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS7D,oBAErEyG,GAAWC,EAAAA,EAAAA,OAEjBkH,EAAAA,EAAAA,YAAU,KACR,WAKE,GAHEnL,OAAOhE,SAASiS,SAASG,SAAS,eAClCpO,OAAOhE,SAASiS,SAASoU,MAAM,KAAKzpB,OAAS,EAEhC,CACb,MAAM0pB,EAAatiB,OAAOhE,SAASiS,SAASoU,MAAM,KAAKE,IAAI,GAC3D,IACE,MAAQ3M,SAAkB4M,EAAAA,GAAAA,IAAiBF,IAAnC1M,QACRwM,EAAcxM,EAChB,CAAE,MAAO5Q,GACP,GAA0B,MAAtBA,EAAEyP,SAASgO,OAEb,YADAjV,QAAQ+D,MAAM,2BAGhB,MAAMvM,CACR,CACF,CACD,EAlBD,EAkBI,GACH,KAEHmG,EAAAA,EAAAA,YAAU,KACR8S,EAAa1gB,EAA+B,GAC3C,CAACA,IAEJ,MAOMmlB,EAAkBA,KACtB1e,GAAS2e,EAAAA,GAAAA,IAAiB,CAAE9jB,MAAM,IAAS,EAS7C,OANIvB,IACFkc,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBmJ,KAAM,CAC3BjJ,aAAc,iBAKhBzX,EAAAA,EAAAA,KAAC2gB,GAAAA,EAAK,CACJhkB,KAAMvB,EACNiH,QAASme,EACT7d,KAAK,QACL6R,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOuF,kBACtBtQ,MAAO,CAAE7L,MAtBO,WAAdoiB,EACK,QAEF,QAmByB3G,SAAU,OAAQnZ,UAEhD8B,EAAAA,EAAAA,MAAA,OAAK,cAAY,cAAa9B,SAAA,CACb,WAAd8f,IACCjgB,EAAAA,EAAAA,KAAC8b,GAAW,CACVzZ,QAASme,EACT/oB,WAAYA,EACZ6D,eAAgBA,EAChBygB,aAAcA,IAGH,UAAdkE,IAAyBjgB,EAAAA,EAAAA,KAAC4gB,GAAAA,EAAU,CAAC7E,aAAcA,EAAc8E,QAAM,QAIhF,ECzFA,MCkEA,OAlDA,UAAoB,GAClBpW,EAAE,SACFtK,EAAQ,SACR2gB,GAAW,EAAK,WAChBC,GAAa,EACb,cAAeC,EAAU,sBACzBC,EAAwB,UAExB,MAAMrqB,GAAoBoL,EAAAA,EAAAA,KACvBrO,GAAqBA,EAAMqE,eAAepB,oBAGvCkL,GAAWC,EAAAA,EAAAA,MACTgK,GAAaC,EAAAA,EAAAA,MAAbD,SASR,IAAImV,GAAW,EAOf,MAN8B,eAA1BD,EACFC,EAAWC,OAAOpV,GAAUM,WAAW5B,KAAQ7T,EACZ,UAA1BqqB,IACTC,EAAWC,OAAOpV,KAActB,IAAO7T,IAIvCoJ,EAAAA,EAAAA,KAACC,GAAS,CAACihB,SAAUA,EAAS/gB,UAC5B8B,EAAAA,EAAAA,MAACuI,GAAI,CACHC,GAAIA,EACJ2W,GAAIN,EAAW,IAAMO,EAAAA,GACrBpd,KAAM6c,GAAYrW,EAClBhH,QApBc6d,KACd1qB,IACFkL,GAASoS,EAAAA,GAAAA,KAAqB,IAC9BpW,OAAOhE,SAASmK,KAAOwG,EACzB,EAiBI8W,UAAWL,EACX,cAAaF,EAAW7gB,SAAA,CAEvBA,EACA4gB,IACC/gB,EAAAA,EAAAA,KAACwhB,EAAAA,GAAO,CAACC,QAAM,EAACxJ,WAAW,MAAK9X,SAAC,YAO3C,EAIA,MAAMF,GAAYmE,EAAAA,GAAOC,GAAG;;;;;;6BAMC,EAAG6c,cAAgBA,EAAW3d,EAAAA,GAAOC,UAAY;EAExEgH,IAAOpG,EAAAA,EAAAA,IAAOid,EAAAA,GAAQ;;;IAGxB/c,EAAAA,GAAMgM;WACC/M,EAAAA,GAAOyE;;;aAGLzE,EAAAA,GAAOC;;;IAGhB,EAAG+d,eACHA,GACA,kBACWhe,EAAAA,GAAOC;ECzDtB,OAzB6Bke,KAC3B,MAAMtrB,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D0F,GAAckG,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAASpD,cAErE,OACEmG,EAAAA,EAAAA,MAAC0f,GAAS,CAAAxhB,SAAA,EACRH,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,IAAIkN,EAAAA,GAAAA,KAAkBxX,UAAEuM,EAAAA,GAAAA,GAAE,0CACtC1M,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,gBAAetK,UAC3BuM,EAAAA,GAAAA,GAAE,0CAEJtW,EAAY2E,aAAa+b,YACxB9W,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,iBAAgBtK,UAAEuM,EAAAA,GAAAA,GAAE,+CAErCzK,EAAAA,EAAAA,MAAC2f,GAAU,CAACnX,GAAG,SAAQtK,SAAA,EACpBuM,EAAAA,GAAAA,GAAE,iCACF5Q,EAAc,IACbkE,EAAAA,EAAAA,KAACwhB,EAAAA,GAAO,CAACvJ,WAAW,MAAMlK,gBAAiBxK,EAAAA,GAAOse,QAAQ1hB,SACvDrE,SAIG,EAQT,MAAM6lB,GAAYvd,EAAAA,GAAOC,GAAG;;;;;EChBnC,OAhB6Byd,KAEzB7f,EAAAA,EAAAA,MAAChC,GAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,IAAIsX,EAAAA,GAAAA,OAAoBd,sBAAsB,aAAaH,UAAQ,EAAA3gB,UAC5EuM,EAAAA,GAAAA,GAAE,0CAEL1M,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,6BAA6BqW,UAAQ,EAAA3gB,UACjDuM,EAAAA,GAAAA,GAAE,mCAEL1M,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,cAAcqW,UAAQ,EAAA3gB,UAClCuM,EAAAA,GAAAA,GAAE,2CAQX,MAAMzM,IAAYmE,EAAAA,EAAAA,IAAOud,GAAU;;kBCyCnC,OAxDmBK,EAAG5f,SAAQC,cAC5B,IAAKD,EAAQ,OAAO,KAEpB,MAAMhM,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/D6rB,EACJ,CACE,CACEzrB,KAAM,cACNiU,IAAIkN,EAAAA,GAAAA,KACJuK,cAAepkB,OAAOhE,SAASiS,SAASM,WAAW,iBAErD,CACE7V,KAAM,OACN4qB,GAAI,IACJnd,KAAM,QACNie,cAAepkB,OAAOhE,SAASiS,SAASM,WAAW,UAErD,CACE7V,KAAM,iBACNiU,GAAI,cACJyX,cAAepkB,OAAOhE,SAASiS,SAASM,WAAW,iBAIzD,OACErM,EAAAA,EAAAA,KAACmiB,GAAAA,EAAc,CAAC/f,OAAQA,EAAQC,QAASA,EAAS+f,UAAU,SAAS9V,iBAAe,EAAAnM,UAClF8B,EAAAA,EAAAA,MAAChC,GAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAACogB,GAAQ,CAAAliB,SAAA,EACPH,EAAAA,EAAAA,KAACsiB,GAAW,CAACzuB,KAAK,SAAS4P,QAASpB,EAAQlC,UAC1CH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,QAAQmM,KAAK,SAEzBsf,EAAMpsB,KAAK0sB,IACVviB,EAAAA,EAAAA,KAACqhB,GAAO,CAEND,GAAImB,EAAKnB,GACT3W,GAAI8X,EAAK9X,GACTxG,KAAMse,EAAKte,KACXie,cAAeK,EAAKL,cAAc/hB,SAEjCoiB,EAAK/rB,MAND+rB,EAAK/rB,YAUdJ,EAAYL,KACZiK,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,SAAQ9D,UACdH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS0T,QAAQ,YAAYR,OAAO,WAAWlJ,MAAM,OAAMsC,SAAC,kBAMhE,EAMrB,MAAMF,GAAYmE,EAAAA,GAAOC,GAAG;;;EAItBie,GAAcle,EAAAA,GAAOoe,MAAM;;;;;;EAO3BH,GAAWje,EAAAA,GAAOC,GAAG;;;;EAKrBgd,IAAUjd,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;WAIjB,EAAG0X,mBAAqBA,EAAgB3e,EAAAA,GAAOC,UAAYD,EAAAA,GAAOyE;;aAEhEzE,EAAAA,GAAOC;;;ECxBpB,OAvD2Bif,KACzB,MAAMrsB,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D0F,GAAckG,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAASpD,cAC/D3H,GAAe6N,EAAAA,EAAAA,KAAarO,GAAqBA,EAAM0J,QAAQlJ,eAC/D4D,GAA0BiK,EAAAA,EAAAA,KAC7BrO,GAAqBA,EAAMqE,eAAeD,0BAG7C,IAAK3B,EAAY2E,aAAakc,WAAa7gB,EAAY2E,aAAa+R,SAClE,OAAO9M,EAAAA,EAAAA,KAACC,GAAS,IAEnB,MAAMyiB,EACJtsB,EAAY2E,aAAakc,UACzB7gB,EAAY2E,aAAa6W,YACxB9X,SAASiS,SAASM,WAAW,kBAEhC,OACEpK,EAAAA,EAAAA,MAAChC,GAAS,CAACyiB,kCAAmCA,EAAkCviB,SAAA,CAC7EuiB,IACC1iB,EAAAA,EAAAA,KAAC2iB,GAAU,CAAClY,GAAI,0BAA0B1S,IAA0BoI,UAClEH,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CAACC,KAAK,0BAA0BC,SAAS,aAAasH,aAAa,YAGhFvU,EAAY2E,aAAa6W,YACzB5R,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,sBAAqBtK,UACjCuM,EAAAA,GAAAA,GAAE,gDAGNvY,GAAcyuB,SAASC,mBACtB7iB,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,oBAAmBtK,UAC/BuM,EAAAA,GAAAA,GAAE,8CAGNvY,GAAcyuB,SAASE,4BACtB9iB,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,WAAUtK,UAAE4iB,EAAAA,GAAAA,IAAqB5uB,KAEjDiC,EAAY2E,aAAakc,WACxBjX,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,4BAA2BtK,UACvCuM,EAAAA,GAAAA,GAAE,qCAGNtW,EAAY2E,aAAakc,WAAa7gB,EAAY2E,aAAa6W,YAC9D3P,EAAAA,EAAAA,MAAC2f,GAAU,CAACnX,GAAG,SAAS,cAAY,oBAAmBtK,SAAA,EACpDuM,EAAAA,GAAAA,GAAE,iCACF5Q,EAAc,IACbkE,EAAAA,EAAAA,KAACwhB,EAAAA,GAAO,CAACvJ,WAAW,MAAMlK,gBAAiBxK,EAAAA,GAAOse,QAAQ1hB,SACvDrE,SAKC,EAMhB,MAAMmE,IAAYmE,EAAAA,EAAAA,IAAOud,GAAU;IAC/B,EAAGe,uCAAwCA,GAAqC;EAE9EC,IAAave,EAAAA,EAAAA,IAAOid,EAAAA,GAAQ;;;;;;;;ECnDlC,OAdmC2B,KAE/B/gB,EAAAA,EAAAA,MAAC0f,GAAS,CAAAxhB,SAAA,EACRH,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,IAAIkN,EAAAA,GAAAA,KAAkBxX,UAAEuM,EAAAA,GAAAA,GAAE,0CACtC1M,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,kCAAkCsW,YAAU,EAAA5gB,UACxDuM,EAAAA,GAAAA,GAAE,mDAEL1M,EAAAA,EAAAA,KAAC4hB,GAAU,CAACnX,GAAG,6BAA4BtK,UACxCuM,EAAAA,GAAAA,GAAE,gDCbJ,MAAMuW,GAAsB,CACjC,WACA,gBACA,eACA,SACA,cACA,iBACA,kBAGWC,GAAsB,CACjC,SACA,WACA,sBACA,4BACA,gCACA,oBACA,WACA,mBACA,wB,ogCCyGF,OArGeC,EAAGC,8BAChB,MAA+C9hB,EAAAC,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxC6hB,EAAQ/hB,EAAA,GAAEgiB,EAAWhiB,EAAA,GACmCK,EAAAJ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxD+hB,EAAgB5hB,EAAA,GAAE6hB,EAAmB7hB,EAAA,GAEtCvL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DqtB,GAAWzhB,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMmK,OAAO2lB,WAExD1X,GAAaC,EAAAA,EAAAA,MAAbD,SAEF2X,GAAmBttB,EAAYL,GAG/B4tB,EAA6B,MAAb5X,GAAoBA,EAASM,WAAW,eACxDuX,EACJ7X,EAASM,WAAW,iBACpBN,EAASM,WAAW,cACpBN,EAASM,WAAW,YAEhBwX,EAAeA,KACfH,GAAmB5lB,OAAOgmB,SAAW,MAAQH,GAAiBC,GAChEN,GAAY,GACgB,IAAnBxlB,OAAOgmB,SAChBR,GAAY,EACd,GAGFra,EAAAA,EAAAA,YAAU,KACRnL,OAAOoD,iBAAiB,SAAU2iB,GAC3B,KACL/lB,OAAOimB,oBAAoB,SAAUF,EAAa,IAEnD,CAAC9X,IAKJ,GAFEkX,GAAoB7W,MAAMvL,GAAsB,MAAbkL,GAAoBA,EAASM,WAAWxL,OAC1EuiB,EACmB,OAAO,KAE7B,MAAMY,EAAYd,GAAoB9W,MACnCvL,GAAsB,MAAbkL,GAAoBA,EAASM,WAAWxL,KAK9CojB,EACS,MAAblY,GACAA,EAASM,WAAW,WACpBN,EAASM,WAAW,gBACpBN,EAASM,WAAW,kBAClBjW,EAAYL,IAAM6tB,EAEtB,OACE3hB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACkkB,GAAgB,KACjBlkB,EAAAA,EAAAA,KAACgiB,GAAU,CAAC5f,OAAQmhB,EAAkBlhB,QAASA,IAAMmhB,GAAoB,MACzExjB,EAAAA,EAAAA,KAACC,GAAS,CAACojB,SAAUA,EAAUW,UAAWA,EAAW,cAAY,cAAa7jB,UAC5E8B,EAAAA,EAAAA,MAACkiB,GAAK,CAAAhkB,SAAA,CACHsjB,GAAYQ,IACXjkB,EAAAA,EAAAA,KAACokB,GAAoB,CAACvwB,KAAK,SAAS4P,QAASA,IAAM+f,GAAoB,GAAMrjB,UAC3EH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,SAASmM,KAAK,SAG5B+gB,GACC1jB,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,IAAG9D,UACTH,EAAAA,EAAAA,KAACiR,GAAI,CAAC7G,IAAK0I,GAAUxI,IAAI,iBAG3BtK,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,IAAIkN,EAAAA,GAAAA,KAAkBxX,UAC1BH,EAAAA,EAAAA,KAACiR,GAAI,CAAC7G,IAAK0I,GAAUxI,IAAI,gBAIvBmZ,EAAiB,KACjBC,GAAwB1jB,EAAAA,EAAAA,KAAC8hB,GAAoB,IAC7C1rB,EAAY+U,OAASwB,GAAAA,EAAS4C,WAAkBvP,EAAAA,EAAAA,KAAC0hB,GAAoB,IACrEtrB,EAAY+U,OAASwB,GAAAA,EAASC,SAAgB5M,EAAAA,EAAAA,KAACyiB,GAAkB,IACjErsB,EAAY+U,OAASwB,GAAAA,EAASqK,kBACzBhX,EAAAA,EAAAA,KAACgjB,GAA0B,SADpC,EAGDU,GACCzhB,EAAAA,EAAAA,MAACoiB,GAAa,CAAAlkB,SAAA,EACVsjB,IACAzjB,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,SAAQ9D,UACdH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACnD,QAAQ,QAAQR,OAAO,YAAW5G,SAAC,eAK/CH,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,eAAc9D,UACpBH,EAAAA,EAAAA,KAACskB,EAAAA,GAAc,CAAC3hB,KAAK,KAAIxC,SAAC,mBAI9BH,EAAAA,EAAAA,KAAC8T,GAAkB,WAIxB,EAMP,MAAM7T,GAAYmE,EAAAA,GAAOC,GAAG;;;cAGd,EAAGgf,cAAgBA,EAAW,SAAW;SAC9C,EAAGA,cAAgBA,EAAW,EAAI;;;eAG5BpW,EAAAA,GAAkBE;sBACX5J,EAAAA,GAAOY;6BACA,EAAG6f,eAAiBA,EAAYzgB,EAAAA,GAAOsE,YAAc;;;IAG9EoF,EAAAA,GAAkBD;;;IAGlBC,EAAAA,GAAkB8M;;;EAIhBoK,GAAQ/f,EAAAA,GAAOC,GAAG;;;;;;EAOlB4M,GAAO7M,EAAAA,GAAOwG,GAAG;;;;EAKjByZ,GAAgBjgB,EAAAA,GAAOC,GAAG;;;;;;EAO1B+f,GAAuBhgB,EAAAA,GAAOoe,MAAM;;;;;;iBC5J1C,MAAM+B,IAAkBC,EAAAA,GAAAA,KACtB,IAAM,kCAEFC,IAAqBD,EAAAA,GAAAA,KACzB,IAAM,kCAkBR,OAfe,EACbxkB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EAEL7jB,MAAM8jB,EAAAA,GAAAA,IAAoBC,EAAAA,GAAAA,QAC1B9jB,UAAWyjB,IAFP,mCAINvkB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EAEL7jB,MAAM8jB,EAAAA,GAAAA,IAAoBE,EAAAA,GAAAA,QAC1B/jB,UAAW2jB,IAFP,mCCnBR,MAAMK,IAAiBN,EAAAA,GAAAA,KAAc,IAAM,kCAErCO,GAAcha,IAClB,MACMia,EADe,IAAIC,gBAAgBla,EAAMjR,SAASorB,QACtB1R,IAAI,QACtC,GAAQwR,IACDG,GAAYC,qBACf,OAAOplB,EAAAA,EAAAA,KAAC8kB,GAAc,IAEtBxZ,QAAQ+D,MAAM,+BAAgC2V,EAClD,EAYF,OATe,EACbhlB,EAAAA,EAAAA,KAACqlB,EAAmB,CAAuBX,OAAK,EAAC7jB,MAAMykB,EAAAA,GAAAA,OAAuBnlB,SAC3E4kB,IADsB,oBAGzB/kB,EAAAA,EAAAA,KAACqlB,EAAmB,CAAwBX,OAAK,EAAC7jB,MAAM0kB,EAAAA,GAAAA,KAAsB,SAASplB,SACpF4kB,IADsB,qBChB3B,MAAMS,IAAUhB,EAAAA,GAAAA,KAAc,IAAM,2DAC9BiB,IAAejB,EAAAA,GAAAA,KAAc,IAAM,2DAczC,OAZe,EACbxkB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EAEL7jB,MAAM8jB,EAAAA,GAAAA,GAAoBe,GAAAA,KAC1B5kB,UAAW0kB,IAFP,iBAINxlB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAoB7jB,KAAM,sCAAsCV,UAC1EH,EAAAA,EAAAA,KAACylB,GAAY,CAACE,gBAAiBC,GAAAA,GAAgBC,sBADhC,iBCXnB,MAAMC,IAAUtB,EAAAA,GAAAA,KAAc,IAAM,kCAgBpC,OAde,EACbxkB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAEJC,MAAM8jB,EAAAA,GAAAA,GAAoBoB,GAAAA,KAC1BC,OAAQA,EAAGC,QAAOnsB,eAChBkG,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,GAAI,0BAA0Bwb,EAAMC,OAAO9F,aAAatmB,EAASorB,YAHzE,iBAMNllB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAoB8jB,OAAK,EAAC7jB,KAAK,qCAAqCC,UAAWglB,IAA1E,iBACX9lB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAoB8jB,OAAK,EAAC7jB,KAAK,4BAA2BV,UAC9DH,EAAAA,EAAAA,KAAC8lB,GAAO,CAACK,WAAS,KADT,iB,oCCHb,OAVwBC,KAEpBpmB,EAAAA,EAAAA,KAACqmB,GAAAA,EAAU,CACTC,OAAO5Z,EAAAA,GAAAA,GAAE,+BACT6Z,QAAQ7Z,EAAAA,GAAAA,GAAE,gCACVwP,cAAcsK,EAAAA,GAAAA,IAAO,8CCK3B,OAVqBC,KAEjBzmB,EAAAA,EAAAA,KAACqmB,GAAAA,EAAU,CACTC,OAAO5Z,EAAAA,GAAAA,GAAE,+BACT6Z,QAAQ7Z,EAAAA,GAAAA,GAAE,gCACVwP,cAAcsK,EAAAA,GAAAA,IAAO,8CCiD3B,OA7C8BE,EAAGrX,YAC/B,MAAMvN,GAAWC,EAAAA,EAAAA,OAEjBkH,EAAAA,EAAAA,YAAU,KACRnH,GAASoS,EAAAA,GAAAA,KAAqB,GAAM,GACnC,IAGgB,mBAAf7E,EAAM7Y,OACHsH,OAAOhE,SAAS6sB,KAAKC,SAAS,aACjC9oB,OAAOhE,SAAS+sB,QAAQ/oB,OAAOhE,SAAW,YAC1CgE,OAAOhE,SAAS4J,WAIpB,IAAIojB,EAAmC,KACvC,GAAIzX,EAAM0X,aAAc,CACtB,MAAMxG,EAASlR,EAAMkD,SAASgO,OACf,MAAXA,EACFuG,GAAiB9mB,EAAAA,EAAAA,KAAComB,GAAe,IACb,MAAX7F,EACTuG,GAAiB9mB,EAAAA,EAAAA,KAACgnB,GAAAA,EAAW,IACT,MAAXzG,IACTuG,GAAiB9mB,EAAAA,EAAAA,KAACymB,GAAY,IAElC,MACEK,GACE9mB,EAAAA,EAAAA,KAACqmB,GAAAA,EAAU,CACTC,OAAOE,EAAAA,GAAAA,IAAO,yCACdD,QAAQ7Z,EAAAA,GAAAA,GAAE,qCACVwP,cAAcsK,EAAAA,GAAAA,IAAO,iDACrBS,iBAAe,IAKrB,OACEhlB,EAAAA,EAAAA,MAAChC,GAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAACknB,GAAM,CAAC9D,yBAAuB,IAC9B0D,GACD9mB,EAAAA,EAAAA,KAAC6P,GAAAA,EAAM,MACG,EAMhB,MAAM5P,GAAYmE,EAAAA,GAAOC,GAAG;;ECrC5B,OAfsB8iB,EAAGhnB,eACvB,MAAM/J,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAErE,OACE4J,EAAAA,EAAAA,KAAConB,GAAAA,EAAsB,CACrBC,SAAU5U,GAAAA,EAEV6U,SAAWjY,IAAUrP,EAAAA,EAAAA,KAAC0mB,GAAqB,CAACrX,MAAOA,IACnDkY,KAAM,CAAEre,OAAQ9S,GAAaL,GAAIyxB,UAAWpxB,GAAa2mB,OAAQ5c,SAEhEA,GACsB,E,wBCdtB,MAAMsnB,GAA0B5Y,UACrC,MAAM0D,QAAiBmB,GAAAA,EAAQF,KAAIkU,EAAAA,GAAAA,QACnC,OAAOnV,EAASvD,MAAM2Y,SAAW,EAAE,EAGxBC,GAAyB/Y,gBAKb6E,GAAAA,EAAQ2L,MAC7BqI,EAAAA,GAAAA,OACA,CAAEG,UAAWC,GACb,CAAEC,QAAS,OAEG/Y,K,wCCLlB,MAAMgZ,GAAa,sCAEZ,SAASC,IAAWC,iBAAiB,MAAEC,EAAK,MAAEC,EAAK,OAAEC,KAC1D,OACEpmB,EAAAA,EAAAA,MAACqmB,GAAI,CAAAnoB,SAAA,EACH8B,EAAAA,EAAAA,MAACsmB,GAAG,CAAApoB,SAAA,EACFH,EAAAA,EAAAA,KAACwoB,EAAAA,GAAY,CACXC,WAAY,EACZ/lB,OAAOgK,EAAAA,GAAAA,GAAE,CAACsb,GAAY,UACtBU,WAAYP,EACZQ,WAAYR,EACZS,aAAa,EACbC,YAAY,cAEd7oB,EAAAA,EAAAA,KAAC8oB,GAAY,CAACJ,WAAYP,EAAOQ,WAAYR,QAE/ClmB,EAAAA,EAAAA,MAACsmB,GAAG,CAAApoB,SAAA,EACFH,EAAAA,EAAAA,KAACwoB,EAAAA,GAAY,CACXC,WAAY,EACZ/lB,OAAOgK,EAAAA,GAAAA,GAAE,CAACsb,GAAY,UACtBU,UAAWP,IAAUC,EACrBO,WAAYP,EACZQ,aAAa,EACbC,YAAY,cAEd7oB,EAAAA,EAAAA,KAAC8oB,GAAY,CAACJ,UAAWP,IAAUC,EAAOO,WAAYP,QAExDnmB,EAAAA,EAAAA,MAACsmB,GAAG,CAAApoB,SAAA,EACFH,EAAAA,EAAAA,KAACwoB,EAAAA,GAAY,CACXC,WAAY,EACZ/lB,OAAOgK,EAAAA,GAAAA,GAAE,CAACsb,GAAY,UACtBU,UAAWP,GAASC,IAAUC,EAC9BM,WAAYN,EACZO,aAAa,EACbC,YAAY,cAEd7oB,EAAAA,EAAAA,KAAC8oB,GAAY,CAACJ,UAAWP,GAASC,IAAUC,EAAQM,WAAYN,SAIxE,CACA,MAAMC,GAAOlkB,EAAAA,GAAOC,GAAG;;;;;;;IAOnB4I,EAAAA,GAAkB8b;;;EAKhBR,GAAMnkB,EAAAA,GAAOC,GAAG;;;;;;;EAShBykB,GAAe1kB,EAAAA,GAAOC,GAAG;;;gBAGf,EAAGqkB,eACXA,EAAkBnlB,EAAAA,GAAOylB,eACtBzlB,EAAAA,GAAOsE;;;;;;aAOL,EAAG6gB,eAAiBA,EAAY,MAAQ;kBACnC,EAAGA,YAAWC,gBACtBD,EAAkBnlB,EAAAA,GAAOC,UACzBmlB,EAAmBplB,EAAAA,GAAO0lB,MACvB1lB,EAAAA,GAAOsE;;8BCqCpB,OA9GA,UAAe,OAAE6I,EAAM,QAAEwY,EAAO,QAAE/W,EAAO,gBAAEgX,EAAe,WAAEC,IAC1D,MAAQC,EAA6B3Y,EAA7B2Y,KAAMle,EAAuBuF,EAAvBvF,KAAMme,EAAiB5Y,EAAjB4Y,aAmCpB,OAjCArgB,EAAAA,EAAAA,YAAU,KACR,OAAQqgB,GACN,KAAKC,GAAiBC,gBACtB,KAAKD,GAAiBE,wBACtB,KAAKF,GAAiBG,mBACpBvX,EAAQ,mBACR,MACF,KAAKoX,GAAiBI,qBACpBxX,EAAQ,sBACR,MACF,KAAKoX,GAAiBK,kBACtB,KAAKL,GAAiBM,SACtB,KAAKN,GAAiBO,WACpB3X,EAAQ,qBACR,MACF,KAAKoX,GAAiBQ,yBACpB5X,EAAQ,0BACR,MACF,UAAK7L,EACH,MACF,SACE0jB,EAAAA,GAAAA,GAAaV,GAGbA,IACFhS,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,qBACjBxS,aAAc,0BACdyS,cAAeZ,GAEnB,GACC,CAACA,KAGFrnB,EAAAA,EAAAA,MAACkoB,GAAAA,GAAe,CAACtsB,MAAM,QAAOsC,SAAA,EAC5BH,EAAAA,EAAAA,KAACmqB,GAAAA,GAAY,CACXC,WAAW,kBACXC,QAAQ,+CAEVrqB,EAAAA,EAAAA,KAACsqB,GAAc,CAAAnqB,SAAC,2BAChB8B,EAAAA,EAAAA,MAACsoB,GAAgB,CAAApqB,SAAA,EACf8B,EAAAA,EAAAA,MAACuoB,GAAM,CACLC,SAAUnB,IAAiBC,GAAiBI,qBAC5ClmB,QAASA,IAAM0lB,EAAgBI,GAAiBI,sBAAsBxpB,SAAA,CACvE,eACaH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,eAAc,0CAE/B8B,EAAAA,EAAAA,MAACuoB,GAAM,CACLC,SAAUnB,IAAiBC,GAAiBQ,yBAC5CtmB,QAASA,IAAM0lB,EAAgBI,GAAiBQ,0BAA0B5pB,SAAA,CAC3E,gBACcH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,kBAAiB,0BAGrCH,EAAAA,EAAAA,KAACsqB,GAAc,CAAAnqB,SAAC,oBAChB8B,EAAAA,EAAAA,MAACsoB,GAAgB,CAAApqB,SAAA,EACf8B,EAAAA,EAAAA,MAACuoB,GAAM,CACLC,SAAUnB,IAAiBC,GAAiBC,gBAC5C/lB,QAASA,IAAM0lB,EAAgBI,GAAiBC,iBAAiBrpB,SAAA,CAClE,gBACcH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,kBAAkB,4CAEpC8B,EAAAA,EAAAA,MAACuoB,GAAM,CACLC,SAAUnB,IAAiBC,GAAiBK,kBAC5CnmB,QAASA,IAAM0lB,EAAgBI,GAAiBK,mBAChD,cAAY,iCAAgCzpB,SAAA,CAC7C,kBACgBH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,YAAY,yDAEhC8B,EAAAA,EAAAA,MAACuoB,GAAM,CACLC,SAAUnB,IAAiBC,GAAiBM,SAC5CpmB,QAASA,IAAM0lB,EAAgBI,GAAiBM,UAAU1pB,SAAA,CAC3D,kBACgBH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,4BAA4B,oCAEhD8B,EAAAA,EAAAA,MAACuoB,GAAM,CACLC,SAAUnB,IAAiBC,GAAiBO,WAC5CrmB,QAASA,IAAM0lB,EAAgBI,GAAiBO,YAAY3pB,SAAA,CAC7D,kBACgBH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,gBAAgB,uCAGtC8B,EAAAA,EAAAA,MAACwP,GAAe,CAAC4X,KAAMA,EAAKlpB,SAAA,CACzBuqB,EAAAA,GAAcC,yBACb3qB,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL4P,QAASoL,gBACD6I,EAAAA,GAAAA,KAAS,EACfvX,SACH,cAIHH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL,cAAY,sBACZsc,UAAWhF,EACX1H,QAAS2lB,EACTvrB,MAAM,QAAOsC,SACd,kBAMT,EAIA,MAAMsR,GAAkBrN,EAAAA,GAAOC,GAAsB;gBACrC,EAAGglB,UAAYA,EAAO,OAAS;EAGzCiB,GAAiBlmB,EAAAA,GAAOwmB,EAAE;;IAE5BtmB,EAAAA,GAAM+L;EAGJka,GAAmBnmB,EAAAA,GAAOC,GAAG;;;;;EAO7BmmB,GAASpmB,EAAAA,GAAOC,GAA2B;;;;sBAI3Bd,EAAAA,GAAO4N;;;IAGzB7M,EAAAA,GAAMuG;;IAEN,EAAG4f,cACHA,GACA,2BACoBlnB,EAAAA,GAAOC,+BACbD,EAAAA,GAAOsnB,+BACZtnB,EAAAA,GAAOunB;yCCtJpB,MAAMC,GAA4B,EAE3B,SAASC,IAAW,OAAEzE,EAAM,WAAE0E,EAAU,SAAEzlB,IAC/C,OACEvD,EAAAA,EAAAA,MAACipB,GAAI,CAACD,WAAYA,EAAYxnB,QAASA,IAAM+B,EAAS+gB,EAAOxwB,IAAIoK,SAAA,EAC/DH,EAAAA,EAAAA,KAACmrB,EAAAA,GAAc,CAACxoB,KAAK,KAAKuD,KAAMqgB,KAChCtkB,EAAAA,EAAAA,MAACmpB,GAAI,CAAAjrB,SAAA,EACHH,EAAAA,EAAAA,KAAA,MAAI0O,MAAO6X,EAAO/vB,KAAK2J,SAAEomB,EAAO/vB,QAChCwJ,EAAAA,EAAAA,KAAA,MAAI0O,MAAO6X,EAAO7X,MAAMvO,SAAEomB,EAAO7X,SACjC1O,EAAAA,EAAAA,KAAA,MAAI0O,MAAO6X,EAAOzsB,SAASqG,SAAEomB,EAAOzsB,eAEtCkG,EAAAA,EAAAA,KAACqrB,GAAY,CAAAlrB,SACVomB,EAAO5qB,aAAa2vB,MAAM,EAAGP,IAA2Bl1B,KAAK01B,IAC5DtpB,EAAAA,EAAAA,MAACupB,GAAW,CAAArrB,SAAA,EACVH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,cAAcmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOyD,eACjDhH,EAAAA,EAAAA,KAAA,QAAM0O,MAAO6c,EAAY7c,MAAOvO,SAAEorB,EAAY7c,UAF9B,eAAe6c,EAAYx1B,YAQvD,CAEA,MAAMq1B,GAAOhnB,EAAAA,GAAOC,GAAG;;;;MAIjB8D,EAAAA,GAAOsjB;;;MAGPnnB,EAAAA,GAAM+L;;;MAGN/L,EAAAA,GAAMgM;;;MAGNhM,EAAAA,GAAM8I;aACC7J,EAAAA,GAAOyD;;EAIdqkB,GAAejnB,EAAAA,GAAOC,GAAG;;;;;EAOzB6mB,GAAO9mB,EAAAA,GAAOC,GAAG;;;;;;;;;;;IAWnB,EAAG4mB,gBACHA,EACI,qBACU1nB,EAAAA,GAAOmoB,yCACDnoB,EAAAA,GAAOC,0BAClBD,EAAAA,GAAOC,iBAEZ,qBACUD,EAAAA,GAAOY,iCACDZ,EAAAA,GAAO4N,4BAClB5N,EAAAA,GAAOyE;;IAGhBiF,EAAAA,GAAkBD;;;;;UAKZme,EAAAA;;;UAGAC;;;UAGAC;;;;EAMJG,GAAcpnB,EAAAA,GAAOC,GAAG;;;;;;WAMnBd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAMgM;;;MAGJnI,EAAAA,GAAOsjB;;sgCC9EN,MAAME,GAAoB,EAE3BC,GAAsBjxB,IAC1B,IACE,MAAMkxB,EAAS,IAAIC,IAAInxB,GACvB,GAAIkxB,EAAOE,KAAK7f,SAAS,kBAAmB,CAC1C,MAAM4b,EAAW+D,EAAOG,aAAaxY,IAAI,QACzC,GAAIsU,EACF,OAAOA,CAEX,CACF,CAAE,MAAOhlB,GACP,CAGF,OAAO,IAAI,EAGN,SAASmpB,IAAoB,SAClCC,EAAQ,WACR9C,EAAU,OACV+C,EAAM,QACNxE,EAAO,iBACPyE,EAAgB,oBAChBC,EAAmB,aACnBC,EAAY,gBACZC,EAAe,kBACfC,EAAiB,qBACjBC,EAAoB,WACpBC,IAEA,MAAgDprB,EAAAC,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAzCmrB,EAAUrrB,EAAA,GAAEsrB,EAAatrB,EAAA,GACiBK,EAAAJ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA1CqrB,EAASlrB,EAAA,GAAEmrB,EAAYnrB,EAAA,GAExBorB,GAAcC,EAAAA,GAAAA,OAEpB/jB,EAAAA,EAAAA,YAAU,KACRsjB,EAAgBZ,IAChBc,EAAqB9E,EAAQ9xB,KAAK0wB,GAAWA,EAAOxwB,KAAI,GACvD,KAEHkT,EAAAA,EAAAA,YAAU,KACyB,IAA7BujB,EAAkB91B,QACpB+1B,EAAqB9E,EAAQ9xB,KAAK0wB,GAAWA,EAAOxwB,KACtD,GACC,CAAC4xB,KAEJ1e,EAAAA,EAAAA,YAAU,KACH0jB,GAA2C,IAA7BH,EAAkB91B,SACnC+1B,EAAqB9E,EAAQ9xB,KAAK0wB,GAAWA,EAAOxwB,MACpDw2B,EAAgBZ,IAClB,GACC,CAACgB,IAEJ,MAAgBM,GAAcC,EAAAA,GAAAA,GAAY,CACxCC,WAAYvF,GACZwF,UAAWA,EAAGC,cACZC,YAAW,KACTP,EAAYQ,kBAAkB,CAAEC,SAAU,CAAC,6BAC3CnB,EAAoBgB,GACpBZ,EAAqB,CAACY,IACtBP,GAAa,EAAM,GAClB,IAAK,EAEVW,QAAUre,IACRa,GAAAA,GAAMZ,MACJ,sFAEFoD,GAAAA,EAAUC,UAAUtD,GAAauE,IAC/BA,EAAKC,UAAU,gCAAgC,IAEjDkZ,GAAa,EAAM,IAjBfY,OAqBFC,GAAOC,EAAAA,EAAAA,UACX,IAAM,IAAIC,GAAAA,EAAKlG,EAAS,CAAEpJ,KAAM,CAAC,OAAQ,WAAY,yBACrD,CAACoJ,IA8BGmG,EACc,uBAAlB5B,EAAS/gB,MAAmD,sBAAlB+gB,EAAS/gB,KAC/C4iB,EAAapG,EAAQjxB,OAAS,EAGpC,OAAKo3B,IAAkBpB,GAAeqB,GAMjCA,GAKH9rB,EAAAA,EAAAA,MAAChC,GAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAACguB,GAAAA,GAAU,CACT5D,WAAW,6BACXC,SACEpoB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,kCAC8BH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,mBAAkB,oFAKzD8B,EAAAA,EAAAA,MAACgsB,GAAe,CAAA9tB,SAAA,EACdH,EAAAA,EAAAA,KAACkuB,GAAAA,EAAc,CACb3oB,MAAOonB,EACP9pB,SAAU+pB,EACVhe,SAzDQ4C,IAGd,GAFA+a,EAAgBZ,KAEXna,EAEH,YADAib,EAAqB9E,EAAQ9xB,KAAK0wB,GAAWA,EAAOxwB,MAKtD,MAAM+xB,EAAW8D,GAAmBpa,GAQpC,IANA8F,EAAAA,GAAAA,IAAMC,GAAAA,EAAiB4W,OAAQ,CAC7BlE,gBAAiB,sBACjBmE,aAAc5c,EACd6c,cAAe9X,QAAQuR,KAGrBA,EAGF,OAFAgF,GAAa,QACbG,EAAUnF,GAIZ,MAAMwG,EAASX,EAAKzI,OAAO1T,GAC3Bib,EAAqB6B,EAAOz4B,KAAK04B,GAAMA,EAAEC,KAAKz4B,KAAI,EAkC5Ckd,YAAY,kEAEdhR,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACwhB,EAAAA,GAAO,CAACzT,gBAAiBxK,EAAAA,GAAOkrB,YAAYtuB,SAAEqsB,EAAkB91B,SAAiB,uCAItFsJ,EAAAA,EAAAA,KAAC0uB,GAAgB,CAAAvuB,SACd0sB,GACC5qB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,gDAEAH,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,QAAM,EAACC,OAAO,iBAGxBxH,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CACGqsB,EAAkBlB,MAAM,EAAGgB,GAAcz2B,KAAKiyB,IAC7C,MAAMvB,EAASoB,EAAQgH,MAAK,EAAG54B,QAASA,IAAO+xB,IAC/C,OAAKvB,GAEHvmB,EAAAA,EAAAA,KAACgrB,GAAU,CAETzE,OAAQA,EACR0E,WAAYmB,IAAqB7F,EAAOxwB,GACxCyP,SAAWzP,IACTs2B,EAAoBt2B,IACpBuhB,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,aACdoQ,UAAW9xB,GACX,GATC,UAAUwwB,EAAOxwB,MAHN,IAchB,IAGLu2B,EAAeE,EAAkB91B,SAChCsJ,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,QACR5E,KAAK,KACLc,QAASA,KACP8oB,EAAgBD,EAAeX,KAC/BrU,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,mBACdmX,cAAetC,EAAeX,GAC9BkD,MAAOrC,EAAkB91B,QACzB,EACFyJ,SACH,oBAOT8B,EAAAA,EAAAA,MAAC6sB,GAAgB,CAACC,YAAazC,EAAe3E,EAAQjxB,OAAOyJ,SAAA,EAC3DH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,QACR5E,KAAK,KACLc,QAASA,KACP0oB,EAAO,UACP7U,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,cACdoX,MAAOrC,EAAkB91B,OACzBmxB,UAAWuE,GACX,EACFjsB,SACH,UAGDH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,UACR5E,KAAK,KACLoE,OAAO,SACPtD,QAASA,KACP2lB,EAAW,WACX9R,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,+BACdoX,MAAOrC,EAAkB91B,OACzBmxB,UAAWuE,GACX,EAEJjc,UAAWic,EAAiBjsB,SAC7B,cAGDH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,YACR5E,KAAK,KACLc,QAASA,KACP4oB,EAAoB,MACpBjD,EAAW,WACX9R,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,cACdoX,MAAOrC,EAAkB91B,QACzB,EACFyJ,SACH,gBA1HEH,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,QAAM,EAACC,OAAO,cAN7B2f,EAAW,UACJ,KAqIX,CAEO,MAAMnpB,GAAYmE,EAAAA,GAAOC,GAAG;;;;;;IAM/B4I,EAAAA,GAAkBD;;;;EAiBhBihB,IAXmB7pB,EAAAA,GAAO4qB,EAAE;;WAEvBzrB,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM+L;EAGcjM,EAAAA,GAAOwmB,EAAE;;IAE7BtmB,EAAAA,GAAM2qB;EAGc7qB,EAAAA,GAAOC,GAAG;;;;;;;WAOvBd,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM8I;;;;;;;;;;;GAaJshB,GAAmBtqB,EAAAA,GAAOC,GAAG;;;;;IAK/BC,EAAAA,GAAMgN;EAGJwd,GAAmB1qB,EAAAA,GAAOC,GAAG;;gBAEnB,EAAG0qB,iBAAmBA,EAAc,OAAS;;0BAEnCxrB,EAAAA,GAAOsE;;kBCnUlB,SAASqnB,IAAc,SAAE7rB,EAAQ,MAAEqL,EAAK,YAAExU,EAAW,GAAEuQ,EAAE,MAAE5M,IACxE,OACEoE,EAAAA,EAAAA,MAAChC,GAAS,CAACwK,GAAIA,EAAI5M,MAAOA,EAAMsC,SAAA,EAC9BH,EAAAA,EAAAA,KAAC8G,GAAAA,EAAI,CAACtQ,KAAM6M,EAAUV,KAAK,KAAKW,MAAOC,EAAAA,GAAOyE,SAC9ChI,EAAAA,EAAAA,KAACyM,GAAK,CAAAtM,SAAEuO,KACR1O,EAAAA,EAAAA,KAACmvB,GAAW,CAAAhvB,SAAEjG,MAGpB,CAEA,MAAM+F,IAAYmE,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;;WAKnB,EAAG3M,WAAYA;;;;;;sBAMJ0F,EAAAA,GAAO4N;;;;;EAOvB1E,GAAQrI,EAAAA,GAAOgrB,EAAE;;WAEZ7rB,EAAAA,GAAOC;IACdc,EAAAA,GAAMuG;EAGJskB,GAAc/qB,EAAAA,GAAOtO,CAAC;;WAEjByN,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM4D;;EC+EV,OAvHcmnB,EAAGtR,eACf,MAAM3nB,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DjC,GAAe6N,EAAAA,EAAAA,KAAarO,GAAqBA,EAAM0J,QAAQlJ,eAM/Dm7B,EAAoB/Y,SAAQgZ,EAAAA,EAAAA,IAAiB,IAAI,EAAOn5B,EAAY+U,MAAQ,GAAG,IAErF,OACElJ,EAAAA,EAAAA,MAACkoB,GAAAA,GAAe,CACdtsB,MAAO,CAAC,qBAAsB,qBAAqBqO,SAAS6R,GAAY,QAAU,QAAQ5d,SAAA,EAE1FH,EAAAA,EAAAA,KAACmqB,GAAAA,GAAY,CACXC,WAAW,eACXC,SACEpoB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,YACU/J,EAAYC,WAAW,KACjC2J,EAAAA,EAAAA,KAAA,SAAM,6CAKZA,EAAAA,EAAAA,KAACwvB,GAAkB,CAAArvB,SAChB,MACC,OAAQ4d,GACN,IAAK,qBACL,IAAK,oBACH,OACE9b,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,UACTqL,MAAM,yCACNxU,YAAY,+DACZuQ,GAAI,YAAYrU,EAAYC,cAAcD,EAAYE,aAAaF,EAAYL,KAC/E8H,MAAM,WAERmC,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,SACTqL,MAAM,wCACNxU,YAAY,uEACZuQ,IAAIkN,EAAAA,GAAAA,GAAgB,YACpB9Z,MAAM,WAERmC,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,eACTqL,MAAM,wBACNxU,YAAY,+EACZuQ,IAAIkN,EAAAA,GAAAA,GAAgB,YACpB9Z,MAAM,aAId,IAAK,kBACH,OACEoE,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,MACTqL,MAAM,sCACNxU,YAAY,+DACZuQ,IAAIglB,EAAAA,GAAAA,KAAwB,CAAE3X,QAAQ,IACtCja,MAAM,UAEP1J,GAAcyuB,SAASE,4BACrB3uB,EAAayuB,SAAS8M,uBACrB1vB,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,SACTqL,MAAM,wCACNxU,YAAY,6DACZuQ,IAAIklB,EAAAA,GAAAA,MACJ9xB,MAAM,WAGRmC,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,UACTqL,MAAM,yCACNxU,YAAY,0EACZuQ,IAAIklB,EAAAA,GAAAA,MACJ9xB,MAAM,cAKlB,IAAK,yBACH,OACEoE,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,UACTqL,MAAM,sCACNxU,YAAY,0EACZuQ,GAAG,IACH5M,MAAM,WAERmC,EAAAA,EAAAA,KAACkvB,GAAa,CACZ7rB,SAAS,SACTqL,MAAM,wCACNxU,YAAY,oDACZuQ,IAAIkN,EAAAA,GAAAA,GAAgB,YACpB9Z,MAAM,aAKjB,EA/EA,MAiFDyxB,GAAkC,oBAAbvR,KACrB/d,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTM,QAxGemsB,MACrBL,EAAAA,EAAAA,KAAiB5X,EAAAA,GAAAA,GAAgB,WAAY,CAAEkY,OAAQ,UAAW,EAAOz5B,EAAY+U,KAAK,EAwGpF/H,KAAK,oCACLT,KAAK,KACLU,SAAS,cACT0D,OAAO,eAGK,EAMtB,MAAMyoB,GAAqBprB,EAAAA,GAAOC,GAAG;;;;IAIjC4I,EAAAA,GAAkBD;;;wgECxGf,IAAKuc,GAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,4CAAhBA,EAAgB,sCAAhBA,EAAgB,oBAAhBA,EAAgB,wBAAhBA,EAAgB,kCAAhBA,EAAgB,kDAAhBA,EAAgB,wCAAhBA,EAAgB,oDAAhBA,CAAgB,MA8S5B,OA1RA,WACE,MAAuDjoB,EAAAC,IAAjBC,EAAAA,EAAAA,UAAc,CAAC,GAAE,GAAhDsuB,EAAWxuB,EAAA,GAAEyuB,EAAczuB,EAAA,GAMhCK,EAAAJ,IAL4CC,EAAAA,EAAAA,UAAS,CACrD2mB,OAAO,EACPC,OAAO,EACP4H,QAAQ,EACR3H,QAAQ,IACR,GALKH,EAAevmB,EAAA,GAAEsuB,EAAkBtuB,EAAA,GAUxC2M,EAAA/M,IAJ8BC,EAAAA,EAAAA,UAAmB,CACjD6nB,KAAM,GACNle,KAAM,GACNme,kBAAchjB,IACd,GAJK4lB,EAAQ5d,EAAA,GAAE4hB,EAAW5hB,EAAA,GAKoC0D,EAAAzQ,IAAlCC,EAAAA,EAAAA,UAA6B,MAAK,GAAhDuQ,GAAFC,EAAA,GAAYA,EAAA,IAIzBE,EAAA3Q,IAFyEC,EAAAA,EAAAA,UACxE,MACD,GAFM2uB,EAA6Bje,EAAA,GAAEke,EAAgCle,EAAA,GAIzCE,EAAA7Q,IAA3BC,EAAAA,EAAAA,UAASmqB,IAAkB,GADtB0E,EAAgCje,EAAA,GAAEke,EAAmCle,EAAA,GAI3EsK,EAAAnb,IAF2EC,EAAAA,EAAAA,UAC1E,IACD,GAFM+uB,EAA8B7T,EAAA,GAAE8T,EAAiC9T,EAAA,GAIlEtmB,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE7Dkc,GAAuBe,EAAAA,EAAAA,KAAvBf,mBACFxQ,GAAWC,EAAAA,EAAAA,MACXiD,GAAUC,EAAAA,EAAAA,MAGVwrB,EADkClvB,IAAjBmvB,EAAAA,GAAAA,KAAiB,GAArB,GACyBld,IAAI,6BAEhDvK,EAAAA,EAAAA,YAAU,KACJ7S,EAAY2E,cAAchF,IAC5BiP,EAAQrO,KAAK,KAEXP,EAAY6gB,UACdmS,EAAW,QACb,GACC,KAEHngB,EAAAA,EAAAA,YAAU,KACJif,EAAgBC,OAASsI,IAC3BP,EAAWn8B,GAAAA,GAAC,CAAC,EACRm4B,GAAQ,IACX/gB,KAAM,kBACNme,aAAcC,GAAiBC,mBAEjCyG,EAAkBl8B,GAAAA,GAAC,CAAC,EAAIm0B,GAAe,IAAEC,OAAO,EAAMC,OAAO,KAC/D,GACC,CAACF,EAAgBC,SAEpBlf,EAAAA,EAAAA,YAAU,KACR,WACE,GAAIqJ,EACF,IACE,MAAMC,QAAiBC,EAAAA,GAAAA,IAAWF,GAClCP,EAAWQ,EAASlV,QACtB,CAAE,MAAOgS,GACP/D,QAAQ+D,MAAMA,EAChB,CAEH,EATD,EASI,GACH,CAACiD,IAEJ,MAAMqe,GAAcC,EAAAA,EAAAA,QAA8B,OAClD3nB,EAAAA,EAAAA,YAAU,KACR0nB,EAAYE,SAASC,eAAe,CAAEC,SAAU,YAChDzZ,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBmJ,KAAM,CAC3BuJ,gBAAiB,sBACjB/B,mBACA,GACD,CAACA,IAEJ,MAAA8I,GAIIC,EAAAA,GAAAA,GAAS,CACXzD,SAAU,CAAC,2BACX0D,QAASzJ,GACT0J,gBAAiBA,KACXjJ,EAAgBE,OAGb,MAVHgJ,EAAoBJ,EAA1BhiB,KACSqiB,EAA2BL,EAApCM,QACYC,EAA8BP,EAA1CtE,WAYI8E,GAAkBtE,EAAAA,GAAAA,GAAY,CAClCC,WAAapP,IACX0T,EAAAA,GAAAA,IAAQ,CACN1T,WACA+R,cACA4B,0BAA2BvB,EAC3B7G,aAAc4C,EAAS5C,aACvBmH,2BAEJhD,QAASA,CAACpe,EAAOsiB,EAAWC,KAC1B,GAAIviB,aAAiBwiB,GAAAA,GAQnB,OAPA5B,EAAmB,CACjB9H,OAAO,EACPC,OAAO,EACP4H,QAAQ,EACR3H,QAAQ,SAEVpY,GAAAA,GAAMZ,OAAM3C,EAAAA,GAAAA,GAAE,0DAGhBolB,EAAAA,GAAAA,IAAkBziB,EAAOsiB,EAAWC,EAAQ,EAE9CxE,UAAWve,UACT/M,GAASoN,EAAAA,GAAAA,IAAe6iB,UAElBC,EAAAA,GAAAA,IAAiBj+B,GAAAA,GAAC,CAAC,EACpBg+B,GAC0B,UAAzBA,EAAYhU,UAAwB,CAAE5S,KAAM,MAElDoU,EAAAA,GAAAA,IAASwS,GAELA,EAAY5mB,OAASwB,GAAAA,EAASC,UAChC9K,GAASmwB,EAAAA,GAAAA,IAAkBF,EAAYh3B,aAAauX,qBAEhDme,GACFzrB,EAAQrO,MAAKu7B,EAAAA,GAAAA,KAA4B,CAAExe,QAAS+c,MAIxDrH,EAAW,SAAS,IAIlB+I,GAAuBjF,EAAAA,GAAAA,GAAY,CACvCC,WAAYA,KAAMiF,EAAAA,GAAAA,IAAalK,EAAgBmK,YAC/CjF,UAAWA,KAETtvB,OAAOhE,SAASmK,KAAO,GAAG,EAE5BwpB,QAASqE,GAAAA,KAGLQ,EAAiBvU,IACjByT,EAAgB3E,WAGpB2E,EAAgB9D,OAAO3P,EAAS,EAG5BwU,EAAWA,KACfzwB,GACEoN,EAAAA,GAAAA,IAAcnb,GAAAA,GAAC,CAAC,EACXqC,GAAW,IACd6gB,UAAU,MAGdmS,EAAW,QAAQ,EAGfoJ,EAAcA,CAACjtB,EAAOktB,KACtBA,IAAavG,EAAS3mB,IACxBwqB,EAAch8B,GAAC,CAAC,EACV+7B,GAAa4C,WAAa,CAAEA,WAAY5C,EAAY4C,YAAe,OAI7D,SAAVntB,GAAoBktB,IAAavG,EAAS7C,KAC5C6G,EAAY,CACV7G,KAAMoJ,EACNtnB,KAAM,KAGR+kB,GAAayC,IACX,MAAMC,EAAe7+B,GAAA,GAAQ4+B,GAE7B,OADAC,EAAgBrtB,GAASktB,EAClBG,CAAe,GAE1B,EAIIzG,EAAU0G,IACd5C,EAAkBl8B,GAAAA,GAAC,CAAC,EAAIm0B,GAAe,IAAE,CAAC2K,IAAe,IAAQ,EAI7DzJ,EAAc0J,IAClB7C,EAAkBl8B,GAAAA,GAAC,CAAC,EAAIm0B,GAAe,IAAE,CAAC4K,IAAc,IAAO,EAgE3DC,EAAmBtiB,OAAOC,OAAOwX,GAAiB8K,OAAOnhB,GAASA,IAExE,OACE5P,EAAAA,EAAAA,MAACgxB,GAAc,CAAA9yB,SAAA,EACb8B,EAAAA,EAAAA,MAACixB,GAAM,CAAA/yB,SAAA,EACLH,EAAAA,EAAAA,KAAA,OAAKoK,IAAK0I,MACRigB,IACA/yB,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTC,MAAMsJ,EAAAA,GAAAA,GAAE,6CACRpJ,MAAOC,EAAAA,GAAOC,UACdH,SAAU,KACVI,QAASA,MACP6T,EAAAA,GAAAA,IAAMC,GAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,0BAEhB0a,EAAqBzE,OAAO,CAAC,EAAE,EAEjCvd,SAAUgiB,EAAqBtF,gBAIrC7sB,EAAAA,EAAAA,KAACioB,GAAQ,CAACC,gBAAiBA,KAC3BjmB,EAAAA,EAAAA,MAACkxB,GAAa,CAAAhzB,SAAA,EACZH,EAAAA,EAAAA,KAAA,OAAKozB,IAAKzC,IArFImC,MAClB,MAAQ3K,EAAiCD,EAAjCC,MAAOC,EAA0BF,EAA1BE,MAAO4H,EAAmB9H,EAAnB8H,OAAQ3H,EAAWH,EAAXG,OAC9B,OAAKF,EAEOC,EAaA4H,EAgBA3H,GAyBLroB,EAAAA,EAAAA,KAACqvB,GAAK,CAACtR,SAAUmO,EAAS/gB,QAvB7BnL,EAAAA,EAAAA,KAACqzB,GAAAA,GAAK,CACJtV,SAAUmO,EAAS/gB,KACnBmnB,cAAeA,EACf/jB,aAAcijB,EAAgB3E,UAC9BV,OAAQA,KACN8D,EAAkBl8B,GAAAA,GAAC,CAAC,EACfm0B,GAAe,IAElBE,MACEkL,OAAOlC,GAAsB16B,QAAU,IACpB,uBAAlBw1B,EAAS/gB,MAAmD,sBAAlB+gB,EAAS/gB,MACtD6kB,QAAQ,IACR,EAEJF,YAAaA,EACbC,eAAgBA,EAChB7pB,KAAM9P,EACNm9B,4BAA6BnC,GAAsBzC,MACjD,EAAG54B,QAASA,IAAOo6B,OAlCvBnwB,EAAAA,EAAAA,KAACisB,GAAmB,CAClBC,SAAUA,EACV9C,WAAYA,EACZ+C,OAAQA,EACRxE,QAASyJ,GAAwB,GACjChF,iBAAkB+D,EAClB9D,oBAAqB+D,EACrB9D,aAAc+D,EACd9D,gBAAiB+D,EACjB9D,kBAAmB+D,EACnB9D,qBAAsB+D,EACtB9D,WAAY6E,KAxBdvxB,EAAAA,EAAAA,KAACwzB,GAAK,CACJ9iB,OAAQwb,EACRhD,QAAUxwB,GAAM85B,EAAY,OAAQ95B,GACpCyZ,QAAUzZ,GAAM85B,EAAY,OAAQ95B,GACpCywB,gBAAkBzwB,GAAM85B,EAAY,eAAgB95B,GACpD0wB,WAAYA,KACViI,IACAjI,EAAW,QAAQ,KAVlBppB,EAAAA,EAAAA,KAACyzB,GAAAA,EAAoB,CAACrK,WAAYmJ,GAuDF,EA4BpCO,QAIT,EAIA,MAAMG,GAAiB7uB,EAAAA,GAAOC,GAAG;;;;;;;EAS3B6uB,GAAS9uB,EAAAA,GAAOC,GAAG;;;;;;sBAMHd,EAAAA,GAAOY;;;;;6BAKAZ,EAAAA,GAAOsE;EAE9BsrB,GAAgB/uB,EAAAA,GAAOC,GAAG;;ogCCpThC,MAAMqvB,IAAwBlP,EAAAA,GAAAA,KAAc,IAAM,2DAC5CmP,IAAUnP,EAAAA,GAAAA,KAAc,IAAM,kCAC9BoP,IAAcpP,EAAAA,GAAAA,KAAc,IAAM,iCAClCqP,IAAcrP,EAAAA,GAAAA,KAAc,IAAM,mEAClCsP,IAAoBtP,EAAAA,GAAAA,KAAc,IAAM,iCACxCuP,IAAuBvP,EAAAA,GAAAA,KAAc,IAAM,4GAC3CwP,IAAUxP,EAAAA,GAAAA,KAAc,IAAM,2DAC9ByP,IAA0BzP,EAAAA,GAAAA,KAAc,IAAM,sHAC9C0P,IAAgC1P,EAAAA,GAAAA,KACpC,IAAM,kGAEF2P,IAA+B3P,EAAAA,GAAAA,KACnC,IAAM,qHAEF4P,IAA4B5P,EAAAA,GAAAA,KAAc,IAAM,kCAChD6P,IAAc7P,EAAAA,GAAAA,KAAc,IAAM,2DAClC8P,IAAY9P,EAAAA,GAAAA,KAAc,IAAM,kCAChC+P,IAAc/P,EAAAA,GAAAA,KAAc,IAAM,iCAClCgQ,IAAchQ,EAAAA,GAAAA,KAAc,IAAM,kCAClCiQ,IAAcjQ,EAAAA,GAAAA,KAAc,IAAM,kCAClCkQ,IAAiBlQ,EAAAA,GAAAA,KAAc,IAAM,kCACrCmQ,IAAiBnQ,EAAAA,GAAAA,KAAc,IAAM,kCACrCiB,IAAejB,EAAAA,GAAAA,KAAc,IAAM,2DACnCoQ,IAA2BpQ,EAAAA,GAAAA,KAAc,IAAM,+EAC/CqQ,IAAUrQ,EAAAA,GAAAA,KAAc,IAAM,kCAC9BsQ,IAAQtQ,EAAAA,GAAAA,KAAc,IAAM,kCAC5BuQ,IAAkBvQ,EAAAA,GAAAA,KAAc,IAAM,yFACtCwQ,IAAmBxQ,EAAAA,GAAAA,KAAc,IAAM,qEACvCyQ,IAAUzQ,EAAAA,GAAAA,KAAc,IAAM,kCAC9B0Q,IAAY1Q,EAAAA,GAAAA,KAAc,IAAM,kCAChC2Q,IAAS3Q,EAAAA,GAAAA,KAAc,IAAM,kCAC7B4Q,IAAyB5Q,EAAAA,GAAAA,KAAc,IAAM,kCAC7C6Q,IAAuB7Q,EAAAA,GAAAA,KAAc,IAAM,iCAC3C8Q,IAA4B9Q,EAAAA,GAAAA,KAAc,IAAM,+EAChD+Q,IAAiB/Q,EAAAA,GAAAA,KAAc,IAAM,kCACrCgR,IAA2BhR,EAAAA,GAAAA,KAAc,IAAM,iCAE7CxX,GAAuBC,EAAAA,GAAvBD,mBAED,IAAKmY,GAAW,SAAXA,GAAW,OAAXA,EAAW,4CAAXA,EAAW,sBAAXA,EAAW,0CAAXA,EAAW,yCAAXA,CAAW,MAOhB,MAAMsQ,GAA8B,CACzC,CAAC7P,GAAAA,GAAgB8P,KAAMvQ,GAAYC,qBACnC,CAACQ,GAAAA,GAAgB+P,WAAYxQ,GAAYwQ,UACzC,CAAC/P,GAAAA,GAAgBgQ,qBAAsBzQ,GAAYyQ,oBACnD,CAAChQ,GAAAA,GAAgBC,oBAAqBV,GAAYU,oBAW9CkH,GAAc,IAAI8I,GAAAA,EAAY,CAClCC,cAAe,IAAIC,GAAAA,EAAc,CAC/BtI,QAASA,CAACpe,EAAO2mB,EAAYC,EAAUC,KAErC,GAAIA,EAAS9uB,QAAQqmB,QAAS,OAE9B,MAAM0I,EAAOD,EAASC,KACtB,IAAKA,GAAMC,wBAA0BC,KAAAA,aAAmBhnB,GACtD,OAGF,MAAM6M,EAAe7M,EAAMkD,UAAUvD,MAAMK,OAASA,EAAMkD,UAAUvD,KAAKgN,OACzE,GAAI1jB,MAAMg+B,QAAQpa,GAChBjM,GAAAA,GAAMZ,OACJpN,EAAAA,EAAAA,MAAA,OAAKuS,UAAU,YAAWrU,SAAA,CAAC,+CAEzBH,EAAAA,EAAAA,KAAA,MAAAG,SACG+b,EAAarmB,KAAKuZ,IACjBpP,EAAAA,EAAAA,KAAA,MAAAG,SAAeiP,GAANA,gBAKZ,GAAI8M,EACTjM,GAAAA,GAAMZ,MAAM6M,QACP,GAA+B,MAA3B7M,EAAMkD,UAAUgO,OACzBtQ,GAAAA,GAAMZ,OACJpN,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CAAK,yCACkCH,EAAAA,EAAAA,KAAA,KAAGiE,MAAMsyB,EAAAA,GAAAA,OAAap2B,SAAC,kCAG3D,GAA+B,MAA3BkP,EAAMkD,UAAUgO,OACzBtQ,GAAAA,GAAMZ,MAAM,6CACP,CACL,MAAMkR,EAASlR,GAAOkD,UAAUgO,OAChCtQ,GAAAA,GAAMZ,OACJ3C,EAAAA,GAAAA,GAAE,CAAC,QAAS6T,EAAS,oBAAsB,WAAY,CAAEA,OAAQA,GAAU,MAE/E,KAGJiW,eAAgB,CACdC,QAAS,CACPC,sBAAsB,MAM5B,IAAIC,GAA8B,KAMlC,MAAM31B,WAAY41B,EAAAA,cAGhBC,WAAAA,CAAY9rB,GACV+rB,MAAM/rB,GAAO,KAHfgsB,cAAQ,EAKNC,KAAKD,SAAW,KAChBC,KAAKrjC,MAAQ,CACXsjC,2BAA2B,EAC3BC,iCAAiC,EACjCC,sBAAsB,GAGxBd,KAAAA,SAAee,QAAQC,OAAOC,OAAS,mBACvCjB,KAAAA,SAAee,QAAQC,OAAO,gBAAkB,kBAClD,CAEA,uBAAME,GACJ,MAAAC,EAOIR,KAAKjsB,MANP0sB,EAAqBD,EAArBC,sBACA5kB,EAAgB2kB,EAAhB3kB,iBACA6kB,EAAWF,EAAXE,YACA9vB,EAAmB4vB,EAAnB5vB,oBACAqqB,EAAiBuF,EAAjBvF,kBACAjtB,EAAOwyB,EAAPxyB,QAGFgyB,KAAKD,SAAW/xB,EAAQ2yB,QAAO,CAAC79B,EAAUlG,KACzB,QAAXA,GAA0CkG,EAASiS,SA/BhDM,WAAW,gBAgChBvO,OAAOhE,SAAS4J,QAClB,IAGFg0B,KACAE,EAAAA,GAAAA,MAGA95B,OAAOoD,iBAAiB,SAAUu2B,GAE9B35B,OAAO+5B,WAAa,GAAK/5B,OAAOg6B,YAAc,GAGhDL,IAGF,MAAMvxB,QAAa2M,GAAiB,GAEpC,GAAK3M,EAAKnQ,GAEH,CAEDmQ,EAAKiF,OAASC,EAAAA,EAAWC,SAC3B4mB,EAAkB/rB,EAAKnL,aAAauX,oBAGtC,MAAMylB,EAAgClqB,OAAQmqB,KAAKnqB,KAAM3H,EAAK+xB,YAAa,QAAU,EAC/EC,EACJhyB,GAAMiF,OAASwB,GAAAA,EAASC,SACxB1G,EAAKnL,eACJmL,EAAKnL,aAAa2T,QAClBxI,EAAKnL,aAAaoQ,KAErB6rB,KAAKmB,SAAS,CACZlB,2BACGn9B,SAASiS,SAASM,WAAW,iBAC7BvS,SAASiS,SAASM,WAAW,aAC9BnG,GAAMiF,OAASwB,GAAAA,EAASqK,mBACO,IAA/B9Q,GAAMiJ,qBACR+nB,iCACGp9B,SAASiS,SAASM,WAAW,iBAC7BvS,SAASiS,SAASM,WAAW,cAC7BvS,SAASiS,SAASM,WAAW,aAC9B0rB,GACAG,GAEN,MA3BEtwB,IA6BFovB,KAAKmB,SAAS,CACZhB,sBAAsB,IAIxB,MAAMiB,EAAiBn3B,SAASG,eAAe,mBAC/C,GAAIg3B,EAAgB,CAClB,MAAMC,EAAmBp3B,SAASG,eAAe,sBAGd,MAAjC41B,KAAKjsB,MAAMjR,SAASiS,UACpBirB,KAAKjsB,MAAMjR,SAASiS,SAASM,WAAW,kBAExCgsB,GAAkBC,YAAYF,GAG9BA,EAAe1uB,MAAMqO,QAAU,QAEnC,CACF,CAEAwgB,kBAAAA,CAAmBC,GACbA,EAAUC,cAAgBzB,KAAKjsB,MAAM0tB,aACvCzB,KAAKjsB,MAAM2sB,cAGTV,KAAKjsB,OAAO3U,eACdmpB,EAAAA,GAAAA,IAASyX,KAAKjsB,MAAM3U,aAIhB4gC,KAAKjsB,MAAM3U,aAAaL,IAAM20B,EAAAA,GAAcgO,kBAEzB,OAAjB/B,IACFgC,aAAahC,IAEfA,GAAerJ,YAAWze,gBAClB6I,EAAAA,GAAAA,MACNzH,GAAAA,GAAMZ,MAAM,+CACZspB,aAAahC,IACbA,GAAe,IAAI,GA5HP,OAiIdK,KAAKjsB,MAAMjR,WAAa0+B,EAAU1+B,WACpC89B,EAAAA,GAAAA,KAEJ,CAEAgB,oBAAAA,GACE,MAAQnB,EAA0BT,KAAKjsB,MAA/B0sB,sBACR35B,OAAOimB,oBAAoB,SAAU0T,GACrCT,KAAKD,YACP,CAEA/Q,MAAAA,GACE,MAAA6S,EAAkC7B,KAAKjsB,MAA/BjR,EAAQ++B,EAAR/+B,SAAU1D,EAAWyiC,EAAXziC,aAElB0iC,EAAAA,GAAAA,IAAah/B,EAASiS,UAEtB,MAAMgtB,EAAkC,MAAtBj/B,EAASiS,UAAoBjS,EAASiS,SAASM,WAAW,eAEtE2sB,EACJl/B,EAASiS,SAASG,SAAS,qBAC3BpS,EAASiS,SAASM,WAAW,mBAC7BvS,EAASiS,SAASM,WAAW,0BAC7BvS,EAASiS,SAASM,WAAW,aAC7BvS,EAASiS,SAASM,WAAW,WAC7BvS,EAASiS,SAASM,WAAW,WAC7BvS,EAASiS,SAASM,WAAW,iBAC7BvS,EAASiS,SAASM,WAAW,kBAC7BvS,EAASiS,SAASM,WAAW,gBAC7BvS,EAASiS,SAASG,SAAS,YAC3BpS,EAASiS,SAASM,WAAW,kBAEzB4sB,GACH7iC,EAAYL,IACb+D,EAASiS,SAASG,SAAS,qBAC3BpS,EAASiS,SAASM,WAAW,aAC7BvS,EAASiS,SAASM,WAAW,kBAC7BvS,EAASiS,SAASM,WAAW,gBAC7BvS,EAASiS,SAASG,SAAS,WAG7B,GAAI+S,eAAiBA,aAAaC,QAAQ,wBAAyB,CACjE,MACMga,EADY,IAAIjU,gBAAgBnnB,OAAOhE,SAASorB,QACxB1R,IAAI,eAE9B0lB,GACFja,aAAaka,QAAQ,uBAAwBD,EAEjD,CAIA,IACIp/B,EAASiS,SAASM,WAAW,cAC5BvS,EAASiS,SAASM,WAAW,kBAC7BxI,IAAIu1B,iBACLhjC,EAAYL,IACdihC,KAAKrjC,MAAMwjC,qBAEX,OAAOn3B,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACsJ,MAAO,CAAEqP,UAAW,QAAUvP,QAAM,EAACC,OAAO,aAG7D,IAAI4vB,GAAW1hB,EAAAA,GAAAA,KAOf,OANIvhB,EAAY+U,OAASC,EAAAA,EAAWC,UACMguB,EAApCjjC,EAAY2E,aAAa6W,UAAsB,gCACnC,uBAEdxb,EAAY+U,OAASC,EAAAA,EAAWkuB,mBAAkBD,EAAW,+BAG/Dp3B,EAAAA,EAAAA,MAACs3B,GAAAA,GAAmB,CAACC,OAAQzM,GAAY5sB,SAAA,CACtC0D,IAAI41B,kBAAmBz5B,EAAAA,EAAAA,KAACqB,EAAa,KACtCY,EAAAA,EAAAA,MAACklB,GAAa,CAAAhnB,SAAA,EACZH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,GAAAA,IAAI2M,GAAOilB,iBAAiBv5B,UAC1C8B,EAAAA,EAAAA,MAAA,OACE,uBAAsB7L,EAAYqP,WAClC,cAAY,6BACZ+O,WAAW1M,EAAAA,GAAAA,IACTixB,EAAY,KAAOtkB,GAAOklB,0BAC1BX,EAAWvkB,GAAOmlB,qBAAuB,MACzCz5B,SAAA,EAEA84B,IAAUj5B,EAAAA,EAAAA,KAAC2I,EAAS,KACtB3I,EAAAA,EAAAA,KAACmjB,GAAM,IACN/sB,EAAY+U,OAASwB,GAAAA,EAASC,UAAW5M,EAAAA,EAAAA,KAACqN,GAAmB,KAC9DrN,EAAAA,EAAAA,KAAC6T,GAAW,CAAA1T,UACV8B,EAAAA,EAAAA,MAAC43B,EAAAA,SAAQ,CACPvS,UACEtnB,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CACLsJ,MAAO,CACLqP,UAAW,QACX/a,OAAQ,QACRga,WAAY,SACZM,eAAgB,SAChBP,QAAS,QAEXvO,QAAM,EACNC,OAAO,aAEVtJ,SAAA,CAEA62B,KAAKrjC,MAAMsjC,4BACVj3B,EAAAA,EAAAA,KAACgO,GAAmB,CAClB5L,OAAQ40B,KAAKrjC,MAAMsjC,0BACnB50B,QAASA,IAAM20B,KAAKmB,SAAS,CAAElB,2BAA2B,MAG7DD,KAAKrjC,MAAMujC,kCACVl3B,EAAAA,EAAAA,KAAC0R,GAAyB,CACxBtP,OAAQ40B,KAAKrjC,MAAMujC,gCACnB70B,QAASA,IAAM20B,KAAKmB,SAAS,CAAEjB,iCAAiC,OAGpEj1B,EAAAA,EAAAA,MAAC63B,EAAAA,GAAM,CAAA35B,SAAA,CACJ/J,EAAYL,KACXiK,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,IAAGV,UACnBH,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,GAAI4uB,OAGlBr5B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,SAASC,UAAWm0B,MACtCj1B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,QAAQC,UAAWuzB,MACrCr0B,EAAAA,EAAAA,KAACyL,EAAY,CAACiZ,OAAK,EAAC7jB,KAAK,gBAAgBC,UAAW8zB,MACpD50B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,SAASC,UAAWo0B,MACtCl1B,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACjT,KAAK,YAAYkS,GAAG,kBAC9BzK,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,uBAAuBC,UAAWs0B,KACnDh/B,EAAYL,IACXiK,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,wBAAuBV,UACvCH,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,IAAIsvB,EAAAA,GAAAA,KAAkB3jC,EAAYqP,WAAY,CAAEu0B,SAAU,SAGtEh6B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EACL7jB,KAAK,wBACLmlB,OAAQA,MACN9a,EAAAA,EAAAA,IAAiB,0BACVlL,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,GAAG,eAI1BzK,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EACL7jB,KAAK,6BACLC,UAAWu0B,MAEbr1B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,eAAeC,UAAWq0B,MAE5Cn1B,EAAAA,EAAAA,KAACyL,EAAY,CAACiZ,OAAK,EAAC7jB,KAAK,cAAcC,UAAWm5B,MAClDj6B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,8BAA6BV,SAC5CA,EAAG8lB,YACF,MAAQjB,EAAiBiB,EAAMC,OAAvBlB,aACR,OAAQA,GACN,KAAKG,GAAYC,qBACjB,KAAKD,GAAYwQ,UACf,OAAO31B,EAAAA,EAAAA,KAACi0B,GAAuB,IACjC,KAAK9O,GAAYyQ,oBACf,OAAO51B,EAAAA,EAAAA,KAACk0B,GAA6B,IACvC,KAAK/O,GAAYU,mBACf,OAAO7lB,EAAAA,EAAAA,KAACm0B,GAA4B,IACtC,QACE7oB,QAAQ+D,MAAM,+BAAgC2V,GAClD,KAGJhlB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,mCAAkCV,UAClDH,EAAAA,EAAAA,KAACmT,GAAsB,OAEzBnT,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,uBAAuBC,UAAW8yB,MACpD5zB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,eAAeC,UAAW+yB,MAC5C7zB,EAAAA,EAAAA,KAACqlB,EAAmB,CAClBX,OAAK,EACL7jB,KAAK,sBACLC,UAAWgzB,MAEb9zB,EAAAA,EAAAA,KAACyL,EAAY,CACXiZ,OAAK,EACL7jB,KAAK,gCACLmlB,OAAQA,EAAGlsB,SAAUogC,MACnBl6B,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,GAAE1W,GAAAA,GAAA,GAAOmmC,GAAS,IAAEnuB,SAAU,wBAG5C/L,EAAAA,EAAAA,KAACyL,EAAY,CAAC5K,KAAK,iBAAiB6jB,OAAK,EAAC5jB,UAAWizB,MACrD/zB,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAAC3K,KAAK,oBAAoB4J,GAAG,oBACtCzK,EAAAA,EAAAA,KAACyL,EAAY,CACXiZ,OAAK,EACL7jB,KAAK,4BACLmlB,OAAQA,KACNhmB,EAAAA,EAAAA,KAAC8J,EAAgB,CAACC,WAAW,QAAO5J,UAClCH,EAAAA,EAAAA,KAACy0B,GAAW,SAIlBz0B,EAAAA,EAAAA,KAACyL,EAAY,CACXiZ,OAAK,EACL7jB,KAAK,kCACLC,UAAWw0B,MAEbt1B,EAAAA,EAAAA,KAACyL,EAAY,CACXiZ,OAAK,EACL7jB,KAAK,6BACLC,UAAWy0B,MAEbv1B,EAAAA,EAAAA,KAACyL,EAAY,CAACiZ,OAAK,EAAC7jB,KAAK,WAAWC,UAAWkzB,MAC/Ch0B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,yBAAyBC,UAAW4yB,MACtD1zB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EACL7jB,KAAK,+CACLC,UAAW6yB,MAGb3zB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,kBAAkBC,UAAW2kB,MAC/CzlB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,kCAAiCV,UACjDH,EAAAA,EAAAA,KAACylB,GAAY,CAACE,gBAAiBC,GAAAA,GAAgBgQ,yBAEjD51B,EAAAA,EAAAA,KAACyL,EAAY,CAACiZ,OAAK,EAAC7jB,KAAK,oBAAoBC,UAAWi0B,KACvDoF,GACAC,GACAC,GACAC,IACDt6B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,WAAWC,UAAWk0B,MACxCh1B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CACJ8jB,OAAK,EACL7jB,KAAK,uCACLC,UAAWszB,MAEbp0B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,SAASC,UAAWwzB,MACtCt0B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,WAAWC,UAAWyzB,MACxCv0B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,WAAWC,UAAW0zB,MACxCx0B,EAAAA,EAAAA,KAACyL,EAAY,CAACiZ,OAAK,EAAC7jB,KAAK,SAASC,UAAWg0B,MAC7C90B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,mBAAmBC,UAAW4zB,MAChD10B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,mBAAmBC,UAAW6zB,MAChD30B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,WAAWC,UAAW+zB,MACxC70B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,YAAWV,UAC3BH,EAAAA,EAAAA,KAACwL,EAAAA,GAAQ,CAACf,GAAG,6BAEfzK,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAACC,KAAM,eAAgBC,UAAWuzB,MACxCr0B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,oBAAoBC,UAAW00B,MAMjDx1B,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,OAClBb,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,iBAClBb,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,OAAOC,UAAWslB,MACpCpmB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,OAAOC,UAAW2lB,MACpCzmB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAAC8jB,OAAK,EAAC7jB,KAAK,OAAOC,UAAWkmB,GAAAA,KACpChnB,EAAAA,EAAAA,KAACY,EAAAA,GAAK,CAACC,KAAK,IAAIC,UAAWkmB,GAAAA,iBAMpC+R,IAAa/4B,EAAAA,EAAAA,KAAA,OAAKjK,GAAG,uBACtBiK,EAAAA,EAAAA,KAACu6B,GAAAA,GAAO,KACNvB,IAAYh5B,EAAAA,EAAAA,KAAC6P,GAAAA,EAAM,QAErB2qB,kBAAYC,UAAWz6B,EAAAA,EAAAA,KAAC06B,GAAAA,EAAkB,CAACC,eAAe,MAGlE,EAGF,MAKMC,GAAqB,CACzBnD,sBAAuBoD,GAAAA,EACvBhoB,iBAAkBioB,GAAAA,GAClB5rB,eAAgB6rB,GAAAA,GAChBrD,YAAasD,GAAAA,GACbpzB,oBAAqBqzB,EAAAA,GACrBhJ,kBAAmBiJ,GAAAA,IAGrB,QAAeC,EAAAA,EAAAA,KAdUxnC,IAAK,CAC5ByC,YAAazC,EAAMuL,SAAS9I,YAC5BqiC,YAAa9kC,EAAMmK,OAAOD,SAYY+8B,GAAxC,CAA4D55B,IAE5D,MAAMyT,GAASoD,GAAAA,GAAWC,OAAO,CAC/B4hB,gBAAiB,CACf/1B,SAAU,WACVoU,QAAS,OACT/Z,OAAQ,cACRo9B,oBAAqB,QAEvBzB,0BAA2B,CACzB5hB,QAAS,eACTpU,SAAU,WACV03B,UAAW,QACXriB,aAAc,QAEhBsiB,4BAA6B,CAC3B,CAACtuB,IAAqB,CACpB,iCAAkC,CAChCiL,WAAY,QACZI,YAAa,QACba,YAAa,QACbC,aAAc,WAIpBygB,qBAAsB,CACpB5gB,aAAc,OAEhBuiB,WAAUxnC,GAAA,CACRuP,MAAOC,EAAAA,GAAOY,MACdkU,YAAa,QACVE,EAAAA,GAASrQ,UAEdszB,eAAgB,CACd53B,WAAYL,EAAAA,GAAOC,WAErBi4B,YAAa,CACXjiB,QAAS,OACTP,cAAe,OACfP,aAAc,OAEhBgjB,gBAAiB,CACfjiB,OAAQ,KAEVkiB,YAAa,CACXh4B,SAAU,Y,8rCC9ed,MAhG6Bi4B,EAAG/nC,OAAO,WACrC,MAAAgoC,GAA0E75B,EAAAA,EAAAA,KACvErO,GAAqBA,EAAMuL,SAAS9I,cAD/BL,EAAE8lC,EAAF9lC,GAAIS,EAAIqlC,EAAJrlC,KAAMumB,EAAK8e,EAAL9e,MAAOnf,EAAKi+B,EAALj+B,MAAOuN,EAAI0wB,EAAJ1wB,KAAMpQ,EAAY8gC,EAAZ9gC,aAAck9B,EAAU4D,EAAV5D,WAAY6D,EAAKD,EAALC,MAG1DC,EAAY5wB,IAASwB,EAAAA,EAASC,QAC9BovB,EAAoB7wB,IAASwB,EAAAA,EAASqK,iBAEtClV,GAAWC,EAAAA,EAAAA,OAEjBkH,EAAAA,EAAAA,YAAU,KACR,IAAKlT,EAAI,OAET,IAAIgoB,EAAyD,YACzDge,EAAWhe,EAAW,UACjBie,IAAmBje,EAAW,oBAEvCjgB,OAAOm+B,QAAQ,WAAY,CACzBC,MAnBe,2BAoBfh2B,KAAInS,EAAAA,EAAA,CACFgC,KACAS,OACAumB,QACAof,UAAWv+B,EAAMjD,IACjByhC,QAAS,IAAIC,KAAKpE,GAAYqE,eAC1BP,GAAa,CACf1kC,UAAW,CACT,CACEtB,GAAIgF,EAAawhC,WACjB/lC,KAAMuE,EAAa4T,iBAGtB,CAAF,GAED6tB,aAAYzoC,EAAAA,EAAAA,EAAA,CACV0oC,UAAW1e,GACP5S,IAASwB,EAAAA,EAAS4C,WAAa,CACjCmtB,qBAAsB3hC,EAAa2hC,qBACnCC,sBAAuB5hC,EAAajB,SACpC8iC,+BAAgC7hC,EAAa1G,WAAa,IAAIkC,QAC3DsmC,GAAaA,EAASC,YAAcD,EAASE,aAC9CrmC,SAEAqlC,GAAa,CACfiB,iBAAkBjiC,EAAa+R,SAC/BmwB,uBAAwBliC,EAAakb,eACrCinB,qBAAsBniC,EAAayb,QACnC2mB,+BAAgCrB,EAAMvlC,QACnC6mC,GAAkC,YAAxBA,EAAMC,gBACjB3mC,SAEAslC,GAAqB,CACvBsB,6BAA8BviC,EAAa23B,WAC3C6K,mCAAoCxiC,EAAayiC,oBACjDC,4CAA6C1iC,EAAa2iC,0BAIhE,GACD,CAAC3nC,IAEJ,MAAMurB,EAAcA,KAKlB,IAJAhK,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,2BAAoC,WAAT5jB,EAAoB,cAAgB,eAG1EkC,EAQH,OAPAmV,EAAAA,EAAAA,IAAiBpN,OAAOhE,SAASiS,eACjCjK,GACE2e,EAAAA,EAAAA,IAAiB,CACf9jB,MAAM,EACNrB,eAAgB,4BAMtB,MAAMqiC,EAAoB7/B,OAAOm+B,QAC/B,wBACAF,EACI,iDACA,sEAENj+B,OAAOnB,KAAKghC,EAAmB,SAAS,EAG1C,MAAgB,WAAT9pC,GACLmM,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACjH,QAAS6d,EAAYnhB,SAAC,4BAE9BH,EAAAA,EAAAA,KAAC49B,EAAa,CAAAz9B,UACZH,EAAAA,EAAAA,KAAC69B,EAAAA,EAAU,CAACzc,GAAG,SAAS3d,QAAS6d,EAAYnhB,SAAC,sBAIjD,EAKH,MAAMy9B,EAAgBx5B,EAAAA,GAAOC,GAAG;;;;;;;;;;iKCkBhC,IA9HewL,MAGbiuB,EAAAA,EAAAA,GAAe,KAGb77B,EAAAA,EAAAA,MAAC87B,EAAc,CAAA59B,SAAA,EACb8B,EAAAA,EAAAA,MAAC+7B,EAAc,CAAA79B,SAAA,EACb8B,EAAAA,EAAAA,MAACg8B,EAAY,CAAA99B,SAAA,EACXH,EAAAA,EAAAA,KAACiR,EAAI,CAAC7G,IAAK0I,EAAUxI,IAAI,eACzBrI,EAAAA,EAAAA,MAACi8B,EAAuB,CAAA/9B,SAAA,EACtB8B,EAAAA,EAAAA,MAACmP,EAAM,CAAAjR,SAAA,CAAC,uBAENH,EAAAA,EAAAA,KAAA,SAAM,2BAGRiC,EAAAA,EAAAA,MAACk8B,EAAS,CAAAh+B,SAAA,CAAC,oCAETH,EAAAA,EAAAA,KAAA,SAAM,+BAGRA,EAAAA,EAAAA,KAAA,OAAAG,UACEH,EAAAA,EAAAA,KAACskB,EAAAA,GAAc,CACb3hB,KAAK,KACL9E,MAAM,QACNugC,UAAU,OAGV5pB,UAAU,2DAA0DrU,SACrE,oBAKL8B,EAAAA,EAAAA,MAACo8B,EAAiB,CAAAl+B,SAAA,EAChBH,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,qCAAqCjB,OAAO,SAASs7B,IAAI,aAAYn+B,UAC3EH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAUmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOg7B,iBAE/Cv+B,EAAAA,EAAAA,KAAA,KACEiE,KAAK,kDACLjB,OAAO,SACPs7B,IAAI,aAAYn+B,UAEhBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAWmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOg7B,oBAGlDv+B,EAAAA,EAAAA,KAACw+B,EAAI,CAACC,YAAU,KAChBx8B,EAAAA,EAAAA,MAACy8B,EAAc,CAAAv+B,SAAA,EACb8B,EAAAA,EAAAA,MAAC08B,EAAU,CAAAx+B,SAAA,EACTH,EAAAA,EAAAA,KAAC4+B,EAAU,CAAAz+B,SAAC,aACZH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,SAAQ9D,SAAC,WAGjCH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,4BAA2B9D,SAAC,UAGpDH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,WAAU9D,SAAC,aAGnCH,EAAAA,EAAAA,KAAC69B,EAAU,CACTzc,GAAG,IACHnd,KAAK,gEAA+D9D,SACrE,oBAIH8B,EAAAA,EAAAA,MAAC08B,EAAU,CAAAx+B,SAAA,EACTH,EAAAA,EAAAA,KAAC4+B,EAAU,CAAAz+B,SAAC,aACZH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,qCAAoC9D,SAAC,UAG7DH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,kCAAiC9D,SAAC,iBAG1DH,EAAAA,EAAAA,KAAC47B,EAAAA,EAAoB,KACrB57B,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,WAAU9D,SAAC,mBAIrC8B,EAAAA,EAAAA,MAAC08B,EAAU,CAAAx+B,SAAA,EACTH,EAAAA,EAAAA,KAAC4+B,EAAU,CAAAz+B,SAAC,cACZH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,+CAA8C9D,SAAC,oBAGvEH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,6CAA4C9D,SAAC,+BAQ3E8B,EAAAA,EAAAA,MAAC48B,EAAW,CAAA1+B,SAAA,EACVH,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,qCAAqCjB,OAAO,SAASs7B,IAAI,aAAYn+B,UAC3EH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAUmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOg7B,iBAE/Cv+B,EAAAA,EAAAA,KAAA,KACEiE,KAAK,kDACLjB,OAAO,SACPs7B,IAAI,aAAYn+B,UAEhBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAWmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOg7B,uBAIpDv+B,EAAAA,EAAAA,KAACw+B,EAAI,KACLx+B,EAAAA,EAAAA,KAACg+B,EAAc,CAAA79B,UACb8B,EAAAA,EAAAA,MAAC68B,EAAe,CAAA3+B,SAAA,EACd8B,EAAAA,EAAAA,MAAC88B,EAAW,CAAA5+B,SAAA,EACVH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,WAAWX,MAAOC,EAAAA,GAAO4N,YAAYhR,SAAC,oBAG9DH,EAAAA,EAAAA,KAAC69B,EAAU,CAACzc,GAAG,IAAInd,KAAK,SAASX,MAAOC,EAAAA,GAAO4N,YAAYhR,SAAC,yBAO9DH,EAAAA,EAAAA,KAACg/B,EAAS,CAAA7+B,SAAC,wCASrB,MAAM8+B,EAAqB,6BAErBlB,EAAiB35B,EAAAA,GAAOC,GAAG;;;;;;;kBAOf4I,EAAAA,GAAkBE;;IAEhC7I,EAAAA,GAAMuG;WACCtH,EAAAA,GAAOY;sBACIZ,EAAAA,GAAOg7B;;IAEzBU;;;EAKEjB,EAAiB55B,EAAAA,GAAOC,GAAG;eAClB4I,EAAAA,GAAkBiyB;;EAI3BjB,EAAe75B,EAAAA,GAAOC,GAAG;;;;;;IAM3B46B;;;;EAMEhuB,EAAO7M,EAAAA,GAAOwG,GAAG;;;;IAInBq0B;;;EAKE7tB,EAAShN,EAAAA,GAAOC,GAAG;IACrBC,EAAAA,GAAM2qB;;;IAGNgQ;;;EAKEd,EAAY/5B,EAAAA,GAAOC,GAAG;;EAItB65B,EAA0B95B,EAAAA,GAAOC,GAAG;;;;;;;;;EAY7Bw5B,GAAaz5B,EAAAA,EAAAA,IAAOoG,EAAAA,GAAyB;;;IAGtDlG,EAAAA,GAAMuG;;WAEC,EAAGvH,WAAYA,GAASC,EAAAA,GAAOY;;;aAG7BZ,EAAAA,GAAO47B;;;6BAGS57B,EAAAA,GAAO67B;qCACC77B,EAAAA,GAAO67B;;;;;aAK/B77B,EAAAA,GAAOY;;;EAKdu6B,EAAiBt6B,EAAAA,GAAOC,GAAG;;;;IAI7B46B;;;;;;EAQEN,EAAav6B,EAAAA,GAAOC,GAAG;;;;;MAKvBw5B;;;EAKAe,EAAax6B,EAAAA,GAAOC,GAAG;IACzBC,EAAAA,GAAM+L;;;;IAIN4uB;;;EAKEJ,EAAcz6B,EAAAA,GAAOC,GAAG;;;;IAI1B46B;;;EAKEZ,EAAoBj6B,EAAAA,GAAOC,GAAG;;;;IAIhC46B;;;;EAMET,EAAOp6B,EAAAA,GAAOC,GAA6B;;;;;IAK7C,EAAGo6B,gBACHA,GACA,mCAGIQ;EASFH,EAAkB16B,EAAAA,GAAOC,GAAG;;;;;;IAM9B46B;;;;EAMEF,EAAc36B,EAAAA,GAAOC,GAAG;;;;;;IAM1B46B;;;;;;EAQED,EAAY56B,EAAAA,GAAOC,GAAG;IACxBC,EAAAA,GAAMuG;;WAECtH,EAAAA,GAAO4N;;IAEd8tB;;;;yuCCtUJ,MAAQllB,EAAuB9M,EAAAA,GAAvB8M,mBAEKtF,EAASoD,EAAAA,GAAWC,OAAO,CACtCunB,kBAAmB,CACjB/lB,SAAU,QACVzb,MAAO,kBACP2b,QAAS,uBACT8lB,SAAU,UACV,CAACvlB,GAAqB,CACpBlc,MAAO,QACP2b,QAAS,cAGb+lB,oBAAqB,CACnB/lB,QAAS,MACT4kB,UAAW,QAEboB,0BAAyBzrC,EAAAA,EAAA,CACvB8J,MAAO,OACPyb,SAAU,QACVtb,OAAQ,QACR+I,OAAQ,OACRyS,QAAS,QACNjB,EAAAA,GAASnL,WAAS,IACrB9J,MAAOC,EAAAA,GAAOyE,MACdy3B,OAAQ,OACR/mB,aAAc,MACdR,OAAQ,aAAa3U,EAAAA,GAAOkrB,cAC5B,SAAU,CACRtW,QAAS,OACTunB,YAAan8B,EAAAA,GAAOC,UACpB6V,UAAW,mBAEb,gBAAetlB,EAAA,CACbuP,MAAOC,EAAAA,GAAOyD,aACXuR,EAAAA,GAASnL,aAGhBuyB,uBAAsB5rC,EAAAA,EAAA,CACpBgT,OAAQ,uBACLwR,EAAAA,GAASnL,WAAS,IACrB8K,OAAQ,OACRC,QAAS,OACTvU,WAAY,cACZ,SAAU,CACRuU,QAAS,OACTD,OAAQ,QAEV,gBAAiB,CACf5U,MAAOC,EAAAA,GAAOyD,eAGlB44B,2BAA4B,CAC1B3nB,WAAY,QAEd4nB,8BAA+B,CAC7BhiC,MAAO,OACPyb,SAAU,QACVvB,QAAS,OACT7X,UAAW,QACX6Y,UAAW,QAEb+mB,mBAAkB/rC,EAAAA,EAAA,CAChBgkB,QAAS,OACTO,eAAgB,iBACbC,EAAAA,GAASxL,oBAAkB,IAC9BzJ,MAAOC,EAAAA,GAAOyE,MACd9H,UAAW,OACX6G,OAAQ,gBAEVg5B,6BAA8B,CAC5BliC,MAAO,OACPG,OAAQ,OACRya,OAAQ,UACRR,WAAY,OAEd+nB,sBAAqBjsC,EAAAA,EAAA,CACnBuP,MAAOC,EAAAA,GAAOyE,OACXuQ,EAAAA,GAASnL,WAAS,IACrBrG,OAAQ,gBACR7G,UAAW,SAEb+/B,kCAAmC,CACjCl5B,OAAQ,iBAEVm5B,+BAAgC,CAC9Bn5B,OAAQ,aAEVo5B,uBAAsBpsC,EAAAA,EAAA,CACpB8J,MAAO,OACPG,OAAQ,OACRka,OAAQ,QACLK,EAAAA,GAASC,UAAQ,IACpBzR,OAAQ,MACRyS,QAAS,EACTzB,QAAS,OACTC,WAAY,SACZM,eAAgB,SAChBG,OAAQ,YAEV2nB,yBAAwBrsC,EAAAA,EAAA,CACtBglB,UAAW,MACXzV,MAAOC,EAAAA,GAAOS,KACXuU,EAAAA,GAASnL,WAAS,IACrBlN,UAAW,OACX8Y,aAAc,QAEhBqnB,uBAAwB,CACtBnoB,OAAQ,aAAa3U,EAAAA,GAAOS,OAE9Bs8B,sBAAqBvsC,EAAAA,EAAA,CACnBga,gBAAiBxK,EAAAA,GAAOsE,aACrB0Q,EAAAA,GAASnL,WAAS,IACrBsL,aAAc,MACd1a,OAAQ,OACRsF,MAAOC,EAAAA,GAAOyE,MACdwR,QAAS,eACTzB,QAAS,cACTC,WAAY,SACZjR,OAAQ,SACRpD,SAAU,aAEZ48B,6BAA8B,CAC5BxyB,gBAAiB,WAEnByyB,kCAAmC,CACjChnB,QAAS,WAEXinB,0BAAyB1sC,EAAAA,EAAA,CACvB8J,MAAO,QACPka,QAAS,OACT2oB,SAAU,OACVrF,UAAW,OACXt0B,OAAQ,gBACLwR,EAAAA,GAASnL,WAAS,IACrB8K,OAAQ,aAAa3U,EAAAA,GAAOkrB,cAC5B/V,aAAc,QAEhBioB,4BAA6B,CAC3B9iC,MAAO,SAET+iC,+BAAgC,CAC9BzoB,QAAS,OACTunB,YAAan8B,EAAAA,GAAOC,WAEtBq9B,uBAAsB9sC,EAAAA,EAAA,GACjBwkB,EAAAA,GAASnL,WAAS,IACrB9J,MAAOC,EAAAA,GAAOyE,MACdgR,aAAc,QAEhB8nB,+BAAgC,CAC9B7oB,WAAY,QAEd8oB,0BAAyBhtC,EAAAA,EAAA,CACvBgkB,QAAS,OACTpU,SAAU,WACVqU,WAAY,SACZgB,aAAc,OACdE,YAAa,OACbmiB,UAAW,OACXx9B,MAAO,OACPyF,MAAOC,EAAAA,GAAOC,UACduK,gBAAiBxK,EAAAA,GAAOY,OACrBoU,EAAAA,GAASnL,WAAS,IACrB8K,OAAQ,eAAe3U,EAAAA,GAAOsE,cAC9Bm5B,UAAW,aACXtoB,aAAc,MACd,SAAU,CACRuoB,QAAS,EACTxoB,OAAQ,aAGZyoB,gCAAiC,CAC/B1nB,QAAS,+BAIA2nB,EAAsB/8B,EAAAA,GAAOC,GAAG;;;;IAIzCC,EAAAA,GAAM8I;;;YAGGrC,GACTA,EAAMq2B,eACF,aAAa79B,EAAAA,GAAOC,YACpB,aAAaD,EAAAA,GAAOkrB;;MAEtBnqB,EAAAA,GAAM4W;aACEnQ,GAAWA,EAAMq2B,eAAiB79B,EAAAA,GAAOC,UAAYD,EAAAA,GAAOkrB;;;;oBAIrD1jB,GAAWA,EAAM3L,MAAQ,MAAQ;;EAGzCiiC,EAAej9B,EAAAA,GAAOC,GAAG;;;;;0BAKZd,EAAAA,GAAOsE;;;;;EAMpBy5B,EAAel9B,EAAAA,GAAOC,GAAG;sBAChBd,EAAAA,GAAOsnB;;;;;MAKvBvmB,EAAAA,GAAMgM;aACEvF,GAAWA,EAAMw2B,IAAMh+B,EAAAA,GAAOS,IAAMT,EAAAA,GAAOyE;+BAC1BzE,EAAAA,GAAOsE;;;EAIzB25B,EAAoBp9B,EAAAA,GAAOC,GAAG;IACvCC,EAAAA,GAAM4W;WACC3X,EAAAA,GAAOyD;;EAGlB,I,ugCCjNA,MAAMy6B,EAAQ,CACZ,EAAG,UACH,EAAG,iBAGL,MAAMC,UAAoB9K,EAAAA,cACxBC,WAAAA,CAAY9rB,GACV+rB,MAAM/rB,GAAO,KAgBfxX,aAAe,KACb,MAAAikC,EAAgCR,KAAKjsB,MAErC,MAAO,CACL42B,qBAAqB,EACrBC,QAJmBpK,EAAbqK,cAKNC,SAAU,GACV/kB,MAAO,GACPglB,YAAY,EACZ1yB,MAAO,GACPwC,KAAM,EACNmwB,UAAW,GACXC,SAAS,EACT92B,KAZyBqsB,EAAJrsB,KAatB,EACD,KAQF+2B,oBAAsBrzB,UACpB,MAAAgqB,EASI7B,KAAKjsB,MARPzC,EAAUuwB,EAAVvwB,WACAlS,EAAWyiC,EAAXziC,YACA+rC,EAAYtJ,EAAZsJ,aACAC,EAASvJ,EAATuJ,UACAC,EAAYxJ,EAAZwJ,aACAC,EAAoBzJ,EAApByJ,qBACAC,EAAS1J,EAAT0J,UACAC,EAAsB3J,EAAtB2J,uBAGMr3B,EAAS6rB,KAAKrjC,MAAdwX,KAERrI,EAAEgM,iBAEF,MAAA2zB,EAA2CzL,KAAKrjC,MAAxCiuC,EAAOa,EAAPb,QAASG,EAAUU,EAAVV,WAAYC,EAASS,EAATT,UAE7BhL,KAAKmB,SAAS,CACZwJ,qBAAqB,IAGvB,MAAMe,EAASV,EACZnsC,KAAKknB,GACGA,EAAMxX,QAEd9O,KAAK,KAEFuY,EAAIjb,EAAAA,EAAA,GACJguC,GAAcH,GAAWA,EAAQlrC,OAAS,GAAK,CAAEkrC,YAAW,CAAF,GAC9De,UAAWD,EACXL,eACAl3B,OACAy3B,WAAYxsC,EAAYL,KAGtBwsC,IAAWvzB,EAAK6zB,WAAaN,UAENhvB,EAAAA,EAAI8L,KAAK+iB,EAAWpzB,IAE7BA,KAAKC,SAKA,aAAjBkzB,KACF7qB,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBurB,MAAO,CAC5BD,WAAYN,EACZQ,OAAQC,EAAAA,EAAmBC,UAI7B36B,KAGF0uB,KAAKmB,SAAS,CACZyJ,QAAS,GACTD,qBAAqB,EACrBG,SAAU,GACVjwB,KAAM,IAEJzb,EAAY+U,OAASwB,EAAAA,EAASqK,kBAChCwrB,EAAuBpsC,EAAY2E,aAAamoC,eAClDZ,OAtBAtL,KAAKmB,SAAS,CACZwJ,qBAAqB,GAsBzB,EACA,KAEFwB,aAAe,CAACrgC,EAAGsgC,KAEJ,UAATA,GAC4B,IAA1BtgC,EAAEE,OAAOuC,MAAM7O,QAAmC,MAAnBoM,EAAEE,OAAOuC,MAK9CyxB,KAAKmB,SAAS,CAAE,CAACiL,GAAOtgC,EAAEE,OAAOuC,MAAO8J,MAAO,KAJ3CvM,EAAEgM,gBAI8C,EACpD,KAEFu0B,uBAA0BvgC,IACxB,GACEk0B,KAAKrjC,MAAMopB,QACV,CAAC,QAAS,MAAO,IAAK,KAAK7Q,SAASpJ,EAAErE,MAAmB,SAAXqE,EAAEjP,MAA8B,UAAXiP,EAAEjP,MACtE,CACAiP,EAAEgM,iBACF,MAAMiO,EAAQ,CACZxX,MAAOyxB,KAAKrjC,MAAMopB,MAAMumB,OAAOC,cAC/BC,SAAS,GAGPzmB,EAAMxX,OAASyxB,KAAKwM,QAAQzmB,EAAMxX,SACpCwX,EAAMymB,SAAU,GAGlB,MAAMxB,EAAY,IAAIhL,KAAKrjC,MAAMquC,UAAWjlB,GAC5Cia,KAAKmB,SAAS,CACZ6J,YACAjlB,MAAO,IAEX,CAEA,GAAc,cAAVja,EAAErE,MACCu4B,KAAKrjC,MAAMopB,OAASia,KAAKrjC,MAAMquC,UAAUtrC,OAAQ,CACpD,MAAMsrC,EAAY,IAAIhL,KAAKrjC,MAAMquC,WACjCA,EAAUyB,MAEVzM,KAAKmB,SAAS,CACZ6J,YACA3yB,MAAO,IAEX,CACF,EACA,KAEFm0B,QAAWzmB,IACT,IAAI1N,EAAQ,KAUZ,GARK6O,IAAAA,QAAkBnB,KACrB1N,EAAQ,GAAG0N,oCAGToB,EAAAA,EAAAA,IAAkBpB,KACpB1N,EAAQ,+CAGN2nB,KAAKrjC,MAAMquC,UAAU51B,MAAMtJ,GAAMA,EAAEyC,QAAUwX,IAAQ,CACvD,MAAM2mB,EAAO3mB,EAEbia,KAAKmB,SAAS,CAAEpb,MAAO,KACvB1N,EAAQ,GAAGq0B,2BACb,CACA,OAAIr0B,IACF2nB,KAAKmB,SAAS,CAAE9oB,WACT,EAEE,EACX,KAEFs0B,YAAe7gC,IACbA,EAAEgM,iBAGF,IAAI4zB,EADU5/B,EAAE8gC,cAAcC,QAAQ,QACnB5d,MAAM,sCAIzB,GAFAyc,EAAS,IAAI,IAAIlqC,IAAIkqC,IAEjBA,EAAQ,CACV,MAAMV,EAAYhL,KAAKrjC,MAAMquC,UAAUnsC,KAAKiN,GAAMA,EAAEyC,QAG9Cu+B,EAF0BpB,EAAOnsC,QAAQwmB,IAAWilB,EAAU91B,SAAS6Q,KAEnClnB,KAAKknB,IAAK,CAClDxX,MAAOwX,EACPymB,UAAUrlB,EAAAA,EAAAA,IAAkBpB,OAG9Bia,KAAKmB,SAAS,CACZ6J,UAAW,IAAIhL,KAAKrjC,MAAMquC,aAAc8B,IAE5C,GAGF,KACAC,eAAiB,KACf,MAAQ/B,EAAchL,KAAKrjC,MAAnBquC,UAER,QAAIA,EAAUtrC,OAAS,KAEfsrC,EAAU51B,MAAM2Q,IAAWA,EAAMymB,SAAQ,EACjD,KAEFQ,eAAkBlhC,IAChB,MAAAmhC,EAA6BjN,KAAKrjC,MAA1BquC,EAASiC,EAATjC,UAEFjlB,GAFkBknB,EAAL50B,MAEL2nB,KAAKrjC,MAAMopB,MAAMumB,OAAOC,eAEtC,GAAIxmB,GAASia,KAAKwM,QAAQzmB,GAAQ,CAChC,MAAMilB,EAAY,IAAIhL,KAAKrjC,MAAMquC,UAAWjlB,GACtC+kB,EAAWE,EAAUvrC,KAAK,MAEhCugC,KAAKmB,SAAS,CACZ6J,YACAjlB,MAAO,GACP+kB,WACAzyB,MAAO,IAEX,MAAW2yB,EAAUtrC,OAAS,GAAsB,IAAjBqmB,EAAMrmB,OACnCsgC,KAAK+M,iBACP/M,KAAKkL,oBAAoBp/B,GAEzBk0B,KAAKmB,SAAS,CAAE9oB,MAAO,6DAEf0N,GAA8B,IAArBilB,EAAUtrC,QAC7BsgC,KAAKmB,SAAS,CAAE9oB,MAAO,iCACzB,EACA,KAEF60B,oBAAuBC,IACrB,MAAMnC,EAAY,IAAIhL,KAAKrjC,MAAMquC,WACjCA,EAAUoC,OAAOD,EAAY,GAE7BnN,KAAKmB,SAAS,CACZ6J,YACA3yB,MAAO,IACP,EACF,KAEFg1B,WAAcvhC,IACZ,MAAM3C,EAAW2C,EAAEE,OAAO7C,SAC1B62B,KAAKmB,SAAS,CAAE8J,SAAS,IACrB9hC,EAASzJ,QAAQyJ,EAASA,EAASzJ,OAAS,GAAG4tC,OAAO,EAC1D,KAEFC,WAAczhC,IACZk0B,KAAKqM,uBAAuBvgC,GAC5Bk0B,KAAKmB,SAAS,CAAE8J,SAAS,GAAQ,EACjC,KAEFuC,6BAA+B,MAG7Bl8B,EAFuB0uB,KAAKjsB,MAApBzC,cAGR0uB,KAAKmB,SAAS,CAAE6J,UAAW,IAAK,EAlQhChL,KAAKrjC,MAAQ,CACXguC,qBAAqB,EACrBC,QAAS72B,EAAM82B,cACfC,SAAU,GACV/kB,MAAO,GACPglB,YAAY,EACZlwB,KAAM,EACNmwB,UAAW,GACX3yB,MAAO,GACP4yB,SAAS,EACTb,gBAAgB,EAChBj2B,KAAMJ,EAAMI,KAEhB,CAmBAotB,kBAAAA,CAAmBC,GACbA,EAAU77B,OAASq6B,KAAKjsB,MAAMpO,MAChCq6B,KAAKmB,SAASnB,KAAKzjC,eAEvB,CAiOAyyB,MAAAA,GACE,MAAAye,EASIzN,KAAKjsB,MARPpO,EAAI8nC,EAAJ9nC,KACA2L,EAAUm8B,EAAVn8B,WAGA65B,GAFWsC,EAAXruC,YACcquC,EAAdC,eACYD,EAAZtC,cACAwC,EAAWF,EAAXE,YACAC,EAAcH,EAAdG,eAIFC,GAHeJ,EAAbK,cAeE9N,KAAKrjC,OAXPiuC,EAAOiD,EAAPjD,QAEA7kB,GADQ8nB,EAAR/C,SACK+C,EAAL9nB,OAEA4kB,GADUkD,EAAV9C,WACmB8C,EAAnBlD,qBACAK,EAAS6C,EAAT7C,UACAnwB,EAAIgzB,EAAJhzB,KACAxC,EAAKw1B,EAALx1B,MACA4yB,EAAO4C,EAAP5C,QACA92B,EAAI05B,EAAJ15B,KACAi2B,EAAcyD,EAAdzD,eAGIsB,EAASV,EAAUnsC,KAAI,CAACknB,EAAOgoB,IACtB,IAATlzB,GAEA5P,EAAAA,EAAAA,MAAA,OAEEuS,WAAW1M,EAAAA,EAAAA,IACT2M,EAAO6rB,uBACNvjB,EAAMymB,SAAW/uB,EAAO8rB,8BAE3B,cAAY,qBAAoBpgC,SAAA,CAE/B4c,EAAMxX,OACPvF,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAO0rB,wBACtB18B,QAASA,IAAMuzB,KAAKkN,oBAAoBa,GAAG5kC,UAE3CH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,IAAImM,KAAK,KAAKW,MAAOyZ,EAAMymB,QAAUjgC,EAAAA,GAAOyE,MAAQzE,EAAAA,GAAOS,UAZnE,cAAc+gC,MAkBvB/kC,EAAAA,EAAAA,KAAA,OAEEwU,WAAW1M,EAAAA,EAAAA,IACT2M,EAAO6rB,sBACP7rB,EAAO+rB,kCACc,IAArBwB,EAAUtrC,QAAgB+d,EAAOuwB,0BAEnC,cAAY,qBAAoB7kC,SAE/B4c,EAAMxX,OARFw/B,KAaL9xB,EACJyvB,EAAOhsC,OAAS,EACZ,YACiB,aAAjByrC,EACA,sBACA,kCAEN,OACEniC,EAAAA,EAAAA,KAAC2gB,EAAAA,EAAK,CACJhkB,KAAMA,EACN0F,QAASiG,EACT3F,KAAK,OACLxC,UAAQ,EACRqU,UAAW,IAAG1M,EAAAA,EAAAA,IAAI2M,EAAO4qB,qBACzB,cAAY,eAAcl/B,SAEhB,IAAT0R,GACC5P,EAAAA,EAAAA,MAAC0e,EAAAA,EAAMrR,QAAO,CAACkF,UAAW,IAAG1M,EAAAA,EAAAA,IAAI2M,EAAO8qB,uBAAuBp/B,SAAA,EAC7D8B,EAAAA,EAAAA,MAAA,OAAKuS,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOqrB,oBAAoB3/B,SAAA,CAC5CwkC,GACD3kC,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CAACjE,SAAS,QAAQV,KAAK,KAAKc,QAAS6E,EAAYf,QAAQ,eAEtEvH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOurB,uBAAuB7/B,SAAEykC,KACpD3iC,EAAAA,EAAAA,MAAA,OAAKyH,MAAO,CAAEqO,QAAS,QAAS5X,SAAA,EAC9B8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOosB,wBAAwB1gC,SAAC,mBACpD8B,EAAAA,EAAAA,MAAA,OACEuS,WAAW1M,EAAAA,EAAAA,IACT2M,EAAOgsB,0BACPwB,GAAWxtB,EAAOmsB,+BAClB8B,EAAOhsC,OAAS,GAAK+d,EAAOysB,gCAC5B7xB,GAASoF,EAAO4rB,uBACC,eAAjB8B,GAAiC1tB,EAAOksB,6BACxCxgC,SAAA,CAEDuiC,GACD1iC,EAAAA,EAAAA,KAAA,SACEnM,KAAK,OACL2gB,WAAW1M,EAAAA,EAAAA,IACT2M,EAAOkrB,uBACW,IAAlB+C,EAAOhsC,QAAgB+d,EAAOmrB,4BAEhCl2B,MAAO,CACL7L,MAAOkf,EAAMrmB,OAAS,KACtB0iB,SAAUspB,EAAOhsC,OAAS,EAAI,OAAS,OAEzCuc,YAAaA,EACb1N,MAAOwX,EACPkoB,WAAS,EACTC,QAASlO,KAAKqN,WACdxhC,SAAWC,GAAMk0B,KAAKmM,aAAargC,EAAG,SACtCqiC,UAAWnO,KAAKqM,uBAChB+B,QAASpO,KAAK2M,YACd0B,OAAQrO,KAAKuN,WACb,cAAY,qCAIA,eAAjBpC,IACClgC,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,EAAAA,IACT2M,EAAOosB,uBACPpsB,EAAOqsB,gCACP3gC,SACH,UAGDH,EAAAA,EAAAA,KAACmhC,EAAmB,CAClB/f,GAAIkkB,EAAAA,EACJC,OAAK,EACLnmC,MAAgB,IAAT+L,EACP/H,KAAMq+B,EAAMt2B,GACZq6B,WAAS,EACTpE,eAAgBA,EAChB39B,QAASA,IAAMuzB,KAAKmB,SAAS,CAAEiJ,gBAAiBA,IAChDiE,OAAQA,IAAMrO,KAAKmB,SAAS,CAAEiJ,gBAAgB,IAC9CqE,KAAK,eAActlC,UAEnB8B,EAAAA,EAAAA,MAACo/B,EAAY,CAACjgB,GAAIkkB,EAAAA,EAASI,KAAKvlC,SAAA,EAC9B8B,EAAAA,EAAAA,MAACq/B,EAAY,CAAClgB,GAAIkkB,EAAAA,EAASK,KAAMliC,QAASA,IAAMuzB,KAAKmB,SAAS,CAAEhtB,KAAM,IAAKhL,SAAA,CAAC,iBAE1EH,EAAAA,EAAAA,KAACwhC,EAAiB,CAAArhC,SAAC,0FAKrB8B,EAAAA,EAAAA,MAACq/B,EAAY,CAAClgB,GAAIkkB,EAAAA,EAASK,KAAMliC,QAASA,IAAMuzB,KAAKmB,SAAS,CAAEhtB,KAAM,IAAKhL,SAAA,CAAC,WAE1EH,EAAAA,EAAAA,KAACwhC,EAAiB,CAAArhC,SAAC,qFAS9B4c,EAAMrmB,OAAS,IACdsJ,EAAAA,EAAAA,KAAA,OAAK0J,MAAO,CAAE/F,SAAU,YAAaxD,UACnC8B,EAAAA,EAAAA,MAAA,OACEuS,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOssB,2BACtBt9B,QAASuzB,KAAKqM,uBAAuBljC,SAAA,CACtC,WACU4c,EAAMumB,OAAOC,cAAc,mBAI1CvjC,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAO2rB,0BAA0BjgC,SAAEkP,KACvDpN,EAAAA,EAAAA,MAAA,OAAKyH,MAAO,CAAE3C,OAAQ,OAAQ2S,WAAY,QAASvZ,SAAA,EACjDH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOosB,wBAAwB1gC,SAAC,wBACpDH,EAAAA,EAAAA,KAAA,YACEwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAO+qB,2BACtBvsB,YACmB,aAAjBkvB,EAA8B,gBAAkB,+BAElD58B,MAAOq8B,EACPgE,KAAM,EACNV,QAAUpiC,GACRA,EAAE+iC,cAAcC,kBACdhjC,EAAE+iC,cAActgC,MAAM7O,OACtBoM,EAAE+iC,cAActgC,MAAM7O,QAG1BmM,SAAWC,GAAMk0B,KAAKmM,aAAargC,EAAG,WACtC,cAAY,sCAGhB9C,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOorB,+BAA+B1/B,UACxDH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACLsc,SAAUwxB,GAA4C,IAArBK,EAAUtrC,OAC3C+M,QAASuzB,KAAKgN,eACd,cAAY,gCAA+B7jC,SAEzB,aAAjBgiC,EAA8B,QAAU,sBAK/ClgC,EAAAA,EAAAA,MAAC0e,EAAAA,EAAMrR,QAAO,CAACkF,UAAW,IAAG1M,EAAAA,EAAAA,IAAI2M,EAAO8qB,iCAAiCp/B,SAAA,EACvEH,EAAAA,EAAAA,KAAA,OAAKwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOqrB,oBAAoB3/B,SAAC,sBAChDH,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,EAAAA,IACT2M,EAAOurB,sBACPvrB,EAAOwrB,mCACP9/B,SACH,4DAGDH,EAAAA,EAAAA,KAAA,OAAAG,SAAMuiC,KACN1iC,EAAAA,EAAAA,KAAA,OACEwU,WAAW1M,EAAAA,EAAAA,IAAI2M,EAAOurB,sBAAuBvrB,EAAOyrB,gCAAgC//B,SACrF,2EAGDH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS4P,QAASuzB,KAAKwN,6BAA6BrkC,SAAC,eAO5E,EAGF,MAMMy6B,EAAqB,CACzB4H,uBAAwBuD,EAAAA,IAG1B,IC7gBA,GD6gBe5K,EAAAA,EAAAA,KAVUxnC,IAChB,CACLyC,YAAazC,EAAMuL,SAAS9I,eAQQwkC,EAAxC,CAA4D8G,E,ksCE3T5D,IAjLmB9gB,EAAGnS,SAAQC,QAAOs3B,SAAQjqB,eAAc8E,UAAS,MAClE,MAA4Cvf,EAAAC,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAArCmb,EAAQrb,EAAA,GAAEsb,EAAWtb,EAAA,GACuBK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA5CykC,EAAUtkC,EAAA,GAAEukC,EAAavkC,EAAA,GACuB2M,EAAA/M,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD4a,EAAY9N,EAAA,GAAE+N,EAAe/N,EAAA,GACE0D,EAAAzQ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA/B6N,EAAK2C,EAAA,GAAEm0B,EAAQn0B,EAAA,GAEtB6K,GAA8DC,EAAAA,EAAAA,GAAqB,IAA3EC,EAAKF,EAALE,MAAOC,EAAQH,EAARG,SAAUC,EAAiBJ,EAAjBI,kBAAmBC,EAAaL,EAAbK,cACyBhL,EAAA3Q,GAA3BC,EAAAA,EAAAA,UAASyb,GAAkB,GAA9DG,EAAalL,EAAA,GAAEmL,EAAgBnL,EAAA,GAEhC5W,GAAiB0G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS5D,iBAEjE0wB,EAAiCzqB,GAAjBmvB,EAAAA,EAAAA,KAAiB,GAArB,IAEnBznB,EAAAA,EAAAA,YAAU,KACJgU,GAAmBI,GAAiB,EAAK,GAC5C,CAACJ,IAEJ,MAqDMmpB,EAAY,IAAInhB,gBAChBwL,EAAyBzE,EAAaxY,IAAI,4BAGhD,OAFIid,GAAwB2V,EAAUC,OAAO,2BAA4B5V,IAGvExuB,EAAAA,EAAAA,MAAC0e,EAAK,CAACE,OAAQA,EAAO1gB,SAAA,EACpB8B,EAAAA,EAAAA,MAAC8O,EAAG,CAAC8P,OAAQA,EAAO1gB,SAAA,CACjBsO,IACCzO,EAAAA,EAAAA,KAACiR,EAAI,CAACxG,GAAG,IAAGtK,UACVH,EAAAA,EAAAA,KAAA,OAAKoK,IAAK0I,MAGbpE,IACCzM,EAAAA,EAAAA,MAACwK,EAAK,CAAAtM,SAAA,EACJH,EAAAA,EAAAA,KAACoR,EAAM,CAAAjR,SAAC,mBACRH,EAAAA,EAAAA,KAACsmC,EAAS,CAAAnmC,SAAC,0EAGf8B,EAAAA,EAAAA,MAAC8c,EAAI,CAACnQ,SAvEQC,UAOlB,GANA/L,EAAEgM,iBAEFo3B,GAAc,GACd7pB,GAAgB,GAChB8pB,EAAS,IAEL/oB,EACF,OAAKH,OAMLC,KALEipB,EAAS,wFACTD,GAAc,IAQlB,IAAKnpB,IAAUJ,EAGb,OAFAwpB,EAAS,qDACTD,GAAc,GAIhB,IACE,MAAM3zB,QAAiBg0B,EAAAA,EAAAA,IAAO,CAAExpB,QAAOJ,aAEvC,IAAI6pB,EAAc,GAClB,GAAuB,2BAAnBlrC,EACFkrC,EAAc,wBACT,CACL,MAAM/V,EAAyBzE,EAAaxY,IAAI,4BAChDgzB,EAAc,mBACZ/V,EAAyB,6BAA6BA,IAA2B,GAErF,EAEAlB,EAAAA,EAAAA,IAAiBiX,GAAa,EAAMj0B,EAASvD,KAAK7D,KACpD,CAAE,MAAOiE,GACP,OAAQA,EAAImD,SAASgO,QACnB,KAAK,IACH4lB,GAASz5B,EAAAA,EAAAA,GAAE,wBACX,MACF,KAAK,IACHy5B,EAAS,uEACT,MACF,QACEA,EAAS/2B,EAAImD,SAASvD,KAAKK,OAE/B62B,GAAc,EAChB,GAqBgC/lC,SAAA,EAC1BH,EAAAA,EAAAA,KAACymC,EAAK,CAAC,cAAY,qBAAoBtmC,SAAEkP,KACzCrP,EAAAA,EAAAA,KAACuR,EAAK,CACJlC,MAAQ+M,IAAiBW,GAAU1N,EACnC,cAAY,yBACZ7Y,KAAK,QACL+O,MAAOwX,EACPlpB,KAAK,QACLof,YAAY,QACZpQ,SAAWC,IACTuZ,GAAgB,GAChBW,EAASla,EAAEE,OAAOuC,MAAM,IAG3B6X,GACCnb,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC4f,EAAAA,EAAc,KACf5f,EAAAA,EAAAA,KAACskB,EAAAA,GAAc,CACb,cAAY,cACZzmB,MAAM,OACN8E,KAAK,KACLwN,SAAU81B,EACVpyC,KAAK,SAAQsM,SACd,uBAGD8B,EAAAA,EAAAA,MAACykC,EAAS,CACRtlB,GAAG,MACH3d,QAASA,KACHwZ,GAAmBD,EAAS,IAChCK,GAAiB,EAAM,EACvBld,SAAA,CACH,WACU8c,GAAqB,oCAIlChb,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACuR,EAAK,CACJlC,MAAQ+M,IAAiBO,GAAatN,EACtC,cAAY,4BACZ7Y,KAAK,WACL+O,MAAOoX,EACP9oB,KAAK,WACLof,YAAY,WACZpQ,SAAWC,IACTuZ,GAAgB,GAChBO,EAAY9Z,EAAEE,OAAOuC,MAAM,KAG/BvF,EAAAA,EAAAA,KAACskB,EAAAA,GAAc,CACb,cAAY,cACZzmB,MAAM,OACN8E,KAAK,KACLwN,SAAU81B,EACVpyC,KAAK,SAAQsM,SACd,aAGD8B,EAAAA,EAAAA,MAAC27B,EAAa,CAAAz9B,SAAA,EACZ8B,EAAAA,EAAAA,MAACykC,EAAS,CAACtlB,GAAG,MAAM3d,QAASA,IAAM4Z,GAAiB,GAAMld,SAAA,EACxDH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAOmM,KAAK,OAAO,wBAEhC3C,EAAAA,EAAAA,KAAC0mC,EAAS,CAACj8B,GAAG,mBAAkBtK,SAAC,kCAM3CH,EAAAA,EAAAA,KAACgR,EAAM,CAAC6P,OAAQA,EAAO1gB,SACpB6lC,IACC/jC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,kCAEC4b,GACC/b,EAAAA,EAAAA,KAACm1B,EAAM,CAAC1qB,GAAG,IAAIhH,QAASA,IAAMsY,EAAa,UAAU5b,SAAC,aAItDH,EAAAA,EAAAA,KAACm1B,EAAM,CAAC1qB,GAAI,gBAAe27B,EAAUzjC,KAAO,EAAI,IAAIyjC,EAAU/T,aAAe,IAAKlyB,SAAC,mBAOrF,EAMZ,MAAQ6M,EAA2CC,EAAAA,GAA3CD,mBAAoB+M,EAAuB9M,EAAAA,GAAvB8M,mBAEtB4G,EAAQvc,EAAAA,GAAOC,GAAG;;sBAEFd,EAAAA,GAAOY;;IAEzB,EAAG0c,aAAcA,GAAU,eAAe1Y,EAAAA,GAAOw+B;;IAEjD35B;;;;;IAKA+M;;;;;EAOE9I,GAAO7M,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;EAInBiC,EAAQrI,EAAAA,GAAOC,GAAG;;;;;EAOlB+M,EAAShN,EAAAA,GAAOC,GAAG;IACrBC,EAAAA,GAAMsiC;IACN7sB;MACEzV,EAAAA,GAAMyI;;EAINu5B,EAAYliC,EAAAA,GAAOC,GAAG;IACxBC,EAAAA,GAAMuG;;;IAGNkP;;;EAKEgF,EAAO3a,EAAAA,GAAOyM,IAAI;;;;;;EAQlB41B,EAAQriC,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAM4W;;;WAGC3X,EAAAA,GAAOS;;;EAKZuN,EAAQnN,EAAAA,GAAOoN,KAAK;IACtBlN,EAAAA,GAAM8I;;;;;;sBAMY7J,EAAAA,GAAOsE;;;IAGzB,EAAGwH,WAAYA,GAAS,qBAAqB9L,EAAAA,GAAOS;;IAEpD+V;oBACgBxW,EAAAA,GAAOsE;;EAIrBkJ,EAAM3M,EAAAA,GAAOC,GAAG;;;;;IAKlB,EAAGwc,YAAcA,EAAS,2BAA6B;IACvD7T;;;EAKEgE,EAAS5M,EAAAA,GAAOC,GAAG;;;;;;;0BAOCd,EAAAA,GAAO6M;;;;;;;IAO7B,EAAGyQ,YACHA,EACI,SACFvc,EAAAA,GAAMgM,qCAEJ,SACFhM,EAAAA,GAAMgN;;IAGRyI;;;aAGSxW,EAAAA,GAAOyD;MACd1C,EAAAA,GAAM+L;;;EAKNutB,EAAgBx5B,EAAAA,GAAOC,GAAG;;;;;EAO1BqiC,GAAYtiC,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;;;WAMnBjH,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM8I;;IAEN2M;aACSxW,EAAAA,GAAOyD;MACd1C,EAAAA,GAAM+L;;;;;;;aAOC9M,EAAAA,GAAOyc;;EAIdmV,GAAS/wB,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;WAEhBjH,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM8I;;IAEN2M;;;;;;;;;;;;aAYSxW,EAAAA,GAAOC;MACdc,EAAAA,GAAM+L;;;;uHC3PZ,IAjHqB7H,EAAGC,gBAAeC,cACrC,GAAI,aAAcD,EAAe,CAC/B,MAAMrS,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE7DiH,EAA4BoL,EAA5BpL,QAASuI,EAAmB6C,EAAnB7C,eAEXihC,EAAkB,kBAAmBxpC,EAErCqI,EAA+C,CACnD,CACEH,MAAO,eACP7C,MAAO,eACP8C,SAAUA,IAAM1H,OAAOnB,KAAK,YAAYiJ,EAAeH,aAAc,UACrEpC,SAAU,YAId,OACEpB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAAA,OAAK,cAAY,wBAAuB9B,SAAA,EACtCH,EAAAA,EAAAA,KAAC8mC,EAAY,CAAA3mC,SAAC,eACd8B,EAAAA,EAAAA,MAAC8kC,EAAoB,CAAA5mC,SAAA,EACnBH,EAAAA,EAAAA,KAACiG,EAAAA,GAAW,CAACtD,KAAK,KAAKuD,KAAMN,IAC5B8C,IACC1I,EAAAA,EAAAA,KAACmH,EAAAA,GAAmB,CAACC,QAAS1B,EAAoB2B,uBAAuB,QAAOlH,UAC9EH,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACT3E,KAAK,KACL4E,QAAQ,SACRlE,SAAS,eACTmE,aAAa,mBAMvBxH,EAAAA,EAAAA,KAACgnC,EAAmB,CAAC,cAAY,sBAAqB7mC,UACpDH,EAAAA,EAAAA,KAACinC,EAAY,CACX7lB,GAAIylB,EAAkB,MAAQr8B,EAAAA,GAC9BC,GAAKo8B,OAAqDvgC,EAAnC,YAAYjJ,EAAQ+iB,aAC3Cpd,OAAO,SAAQ7C,SAEd0mC,EAAkBxpC,EAAQ6pC,eAAiB,kBAAoB7pC,EAAQsR,kBAG5E3O,EAAAA,EAAAA,KAACmnC,EAAc,CAACz+B,QAASA,EAAS,cAAY,kBAAiBvI,UAC3D,oBAAqBsI,IAAkBo+B,EACrCp+B,EAAc5C,gBACd,CAAC,CAAC,IACJhQ,KAAKuxC,IACL,MAAMC,EAAkBjxC,EAAYL,KAAO0S,EAAc7C,eAAe7P,GAIxE,OAFEsxC,GAAmBD,EAAOj8B,OAASwB,EAAAA,EAAS4C,aAAe,OAAQ63B,KAE9BP,GACrC5kC,EAAAA,EAAAA,MAACqlC,EAAY,CAAAnnC,SAAA,EACXH,EAAAA,EAAAA,KAACunC,EAAAA,GAAa,CACZC,UAAWX,EACXY,SAAUpqC,EAAQqqC,OAAO/sC,IACzBgI,KAAK,QAEPV,EAAAA,EAAAA,MAAC0lC,EAAgB,CAAAxnC,SAAA,CAAE9C,EAAQsR,aAAa,eAG1C3O,EAAAA,EAAAA,KAAC+mC,EAAoB,CAAA5mC,UACnBH,EAAAA,EAAAA,KAACiG,EAAAA,GAAW,CACVtD,KAAK,KACLuD,KAAMkhC,EACNQ,SAAUP,EAAkB16B,EAAAA,EAASC,QAAUw6B,EAAOj8B,KACtD08B,aAAchB,EACdiB,eAAgBV,EAAOj8B,OAASwB,EAAAA,EAAS4C,aANjB63B,EAA4BrxC,GASzD,MAGJK,EAAY+U,OAASwB,EAAAA,EAASC,UAC7B3K,EAAAA,EAAAA,MAAC8lC,EAAO,CAACr/B,QAASA,EAAQvI,SAAA,EACxBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,mBAAmB8M,MAAOC,EAAAA,GAAOykC,OAAQrlC,KAAK,KAAKoE,OAAO,eAAe,0GAO9F,CAGA,MAAMkhC,EAAiB,IAAIC,IAU3B,MATA,IAAKz/B,EAAc3C,YAAc,IAAKqiC,SAASC,IACxCA,IACAH,EAAeI,IAAID,EAAYtuC,UAIpCmuC,EAAez0B,IAAI40B,EAAYtuC,UAAUnD,KAAKyxC,GAH5CH,EAAeK,IAAIF,EAAYtuC,SAAU,CAACsuC,IAGc,KAI1DpoC,EAAAA,EAAAA,KAACuoC,EAAc,CAAApoC,SACZ7H,MAAMC,KAAK0vC,EAAe1pB,QAAQ1oB,KAAKiE,IACtCmI,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACwoC,EAAc,CAAAroC,SAAErG,IAChBmuC,EAAez0B,IAAI1Z,GAAUjE,KAAKuyC,IACjCpoC,EAAAA,EAAAA,KAAC+mC,EAAoB,CAAA5mC,UACnBH,EAAAA,EAAAA,KAACiG,EAAAA,GAAW,CAACtD,KAAK,KAAKuD,KAAMkiC,EAAaR,SAAUQ,EAAYj9B,QADvC,gBAAgBi9B,EAAYryC,UAHjD+D,MASG,EAMrB,MAAMmtC,GAAe7iC,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;;;;;;EAW3Bs8B,EAAe1iC,EAAAA,GAAOC,GAAG;IAC3BC,EAAAA,GAAMgN;WACC/N,EAAAA,GAAOyD;;EAIZggC,GAAsB5iC,EAAAA,EAAAA,IAAO0iC,EAAa;;EAI1CyB,EAAiBnkC,EAAAA,GAAOC,GAAG;;EAI3BmkC,GAAiBpkC,EAAAA,EAAAA,IAAO0iC,EAAa;;EAIrCK,EAAiB/iC,EAAAA,GAAOC,GAAG;IAC7B,EAAGqE,aAAcA,GAAW;IAC5B,EAAGA,cAAeA,GAAW;;;;;;;;;;;wBAWTnF,EAAAA,GAAO6M;;EAIzBk3B,EAAeljC,EAAAA,GAAOC,GAAG;;;;;;;;;EAUzBsjC,EAAmBvjC,EAAAA,GAAOC,GAAG;;;IAG/B8D,EAAAA,GAAOsgC;IACPnkC,EAAAA,GAAM2D;EAGJ8/B,EAAU3jC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAM4D;sBACY3E,EAAAA,GAAOmlC;WAClBnlC,EAAAA,GAAOykC;;;;IAId,EAAGt/B,aACHA,GACA,kFAIIpE,EAAAA,GAAMgM;EAKRy2B,EAAuB3iC,EAAAA,GAAOC,GAAG;;;;;;;;+OC/MvC,MALa,I,MAAIskC,GAAAA,UAAc,CAC7BlqC,IAAKmqC,EAAAA,GAAYC,sBACjBC,aAAa,I,sDCmCf,MA/B6BC,EAC3BC,kBACA5mC,SACAC,aAEKD,GAGHpC,EAAAA,EAAAA,KAACmC,EAAAA,EAAU,CAACC,OAAQA,EAAQC,QAASA,EAASxE,MAAM,QAAQ0K,yBAAuB,EAAApI,UACjF8B,EAAAA,EAAAA,MAACqN,EAAO,CAAC,cAAY,yBAAwBnP,SAAA,EAC3CH,EAAAA,EAAAA,KAACipC,EAAO,CAAA9oC,SAAC,6BACT8B,EAAAA,EAAAA,MAACinC,EAAI,CAAA/oC,SAAA,EACHH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,sCACJH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,qDAENH,EAAAA,EAAAA,KAACmpC,EAAAA,GAAU,CACTt1C,KAAK,mBACLuP,MAAMsJ,EAAAA,EAAAA,GAAE,4BACR08B,eAAa,EACbvrC,MAAM,UAERmC,EAAAA,EAAAA,KAACyR,EAAe,CAAAtR,UACdH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7M,MAAM,QAAQ4F,QAASulC,EAAiB,cAAY,gBAAe7oC,SAAC,kBAjBhE,KA4BtB,MAAMmP,EAAUlL,EAAAA,GAAOC,GAAG;;EAIpB4kC,EAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMsiC;EAGJsC,EAAO9kC,EAAAA,GAAOilC,EAAE;IAClB/kC,EAAAA,GAAMuG;;;;EAMJ4G,EAAkBrN,EAAAA,GAAOC,GAAG;;;;;kgCCgdlC,MA/cuBilC,EACrB7gC,gBACA8gC,cACAC,WAAU,EACV/kC,YACAglC,kBAEA,MAAoDnoC,EAAAC,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA7CkoC,EAAYpoC,EAAA,GAAEqoC,EAAeroC,EAAA,GACwBK,EAAAJ,GAAdC,EAAAA,EAAAA,WAAS,GAAK,GAArDooC,EAAejoC,EAAA,GAAEkoC,EAAkBloC,EAAA,GACa2M,EAAA/M,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GAG/B0D,EAAAzQ,GAFiCC,EAAAA,EAAAA,UAEpC,IAAG,GAFEsoC,EAAW93B,EAAA,GAAE+3B,EAAc/3B,EAAA,GAGiDE,EAAA3Q,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA5EwoC,EAA0B93B,EAAA,GAAE+3B,EAA6B/3B,EAAA,GACSE,EAAA7Q,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAlE0oC,EAAqB93B,EAAA,GAAE+3B,EAAwB/3B,EAAA,GACYsK,EAAAnb,GAAlBC,EAAAA,EAAAA,YAAkB,GAA3D4oC,EAAgB1tB,EAAA,GAAE2tB,EAAmB3tB,EAAA,GAC6CS,EAAA5b,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAlF8oC,EAA6BntB,EAAA,GAAEotB,GAAgCptB,EAAA,GACHqtB,GAAAjpC,GAArBC,EAAAA,EAAAA,YAAqB,GAA5DipC,GAAeD,GAAA,GAAEE,GAAkBF,GAAA,GACiCG,GAAAppC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAApEopC,GAAsBD,GAAA,GAAEE,GAAyBF,GAAA,GAElD7oC,IAAWC,EAAAA,EAAAA,MAEX3L,IAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cACrE,IAAI+S,IAAcnH,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMwL,UAAU0J,cAAcM,cAC9EC,IAAgBpH,EAAAA,EAAAA,KACjBrO,GAAqBA,EAAMwL,UAAU0J,cAAcO,gBAGlDX,GAAeqiC,cAAgBriC,EAAcsiC,iBAC/C3hC,GAAgBX,EAAcsiC,eAC9B5hC,GAAcV,EAAcqiC,cAI9B,MAAME,IAAapa,EAAAA,EAAAA,QAAO8Y,GACpBuB,IAAwBra,EAAAA,EAAAA,QAAOznB,IAE/B+hC,IAAeta,EAAAA,EAAAA,QAAyB,MAExCua,IAAqCva,EAAAA,EAAAA,UAErCwa,IAAiBxa,EAAAA,EAAAA,QAA8B,MAE/Cya,IAAkBza,EAAAA,EAAAA,QAAmC,MAErD0a,IAAoB1a,EAAAA,EAAAA,QAA8B,MAClD2a,IAAiB3a,EAAAA,EAAAA,QAA8B,OAErD3nB,EAAAA,EAAAA,YAAU,KAER0gC,EAAgB,IAChBI,EAAe,IACfc,IAA0B,GAE1BM,GAAmCta,SAAS2a,QAE5CjB,IAAiC,GAEjCkB,EAAKtQ,UACL,MAAMuQ,EAAUD,EAAKE,SAASn4B,IAAI,kBAAkB/K,GAAe1S,MAMnE,OALA21C,EAAQE,UAAUC,EAAAA,GAAcC,aAAa,SAAUlK,GACrD,MAAMmK,EAAcC,KAAKC,MAAMrK,EAAQ5yB,MACvCu6B,GAAaz0C,GAAa,IAAIA,EAAUi3C,IAC1C,IAEO,KACLL,EAAQQ,aAAa,CACtB,GACA,CAACzjC,IAIJ,MAAM0jC,IAA2BC,EAAAA,EAAAA,IAASC,EAAAA,GAAiB,MAC3DpjC,EAAAA,EAAAA,YAAU,KACJE,IAAeC,IACjB,WAEE6hC,GAAsBpa,QAAU1nB,GAChC0gC,GAAmB,GAEnB,MAAMyC,QAAqBC,EAAAA,EAAAA,IAAgB,CAAEpjC,eAAaC,mBAGtDkjC,GAAgBrB,GAAsBpa,UAAY1nB,KAGpDwgC,EAAgB2C,EAAa/2B,QAAUy1B,GAAWna,SAClDkZ,EAAeuC,EAAaE,sBAG9B3C,GAAmB,EACpB,EAhBD,EAiBF,GACC,CAAC1gC,MAIJF,EAAAA,EAAAA,YAAU,KAEoB,IAAxBygC,EAAahzC,QAAgB20C,GAAgBxa,UAC/Cwa,GAAgBxa,QAAQnnB,MAAM1L,OAAS,SAGrCmL,KAEF6hC,GAAWna,QAAU6Y,EAKfE,GAAmBM,GACvBiC,GAAyB,CACvBhjC,eACAC,iBACAmM,QAASm0B,EACT+C,cAAe3C,EACZj0C,KAAK62C,GAAeA,EAAW32C,KAC/BQ,QAAQR,GAAOwgB,QAAQxgB,OAGhC,GACC,CAAC2zC,IAEJ,MAAMV,GAAkBA,KACtBkC,GAAara,SAAS8b,OAAO,EAmJzBC,GAA8B9pC,IAClC,MAAM+pC,EAAU/pC,EAAEE,OACb6pC,IACLA,EAAQnjC,MAAM1L,OAAS,UACvB6uC,EAAQnjC,MAAM1L,OAAS,GAAG6uC,EAAQC,iBAElCnD,EAAgBkD,EAAQtnC,OAAM,EAkD1BwnC,GAAmBtkC,GAAiB,YAAaA,EACjDq/B,GACJ1xC,GAAY+U,OAASwB,EAAAA,EAAS4C,WAAanZ,GAAYL,KAAO0S,GAAe7C,gBAAgB7P,GACzFi3C,GACJ52C,GAAYL,KAAO0S,GAAe7C,gBAAgB7P,IAAM0O,GAAW0G,OAASwB,EAAAA,EAAS4C,UAEvF,IAAI09B,GAA4BxoC,GAA4CjO,KAY5E,OAVEu2C,IACA,kBAAmBtkC,EAAcpL,SACjCoL,EAAciL,QAAQw5B,cACtB92C,GAAYL,KAAO0S,EAAc7C,eAAe7P,GAEhDk3C,GAA2BxkC,EAAcpL,QAAQ6pC,eAAiB,cACzD6F,IAAoBC,IAAoB,iBAAkBvkC,EAAcpL,UACjF4vC,GAA2B,OAAOxkC,EAAcpL,QAAQsR,sBAIxD1M,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmtC,EAAS,CACRt5C,KAAK,OACLu5C,OAAO,yCACPha,IAAK8X,GACLroC,SAtNyBgM,UAC7BmP,EAAMlP,iBACNq7B,GAAyB,GACzBF,GAA8B,GAE9B,MAAMoD,EAAQrvB,EAAMhb,OAAOqqC,MAE3B,IAAKA,GAA0B,IAAjBA,EAAM32C,OAGlB,OAFAyzC,GAAyB,QACzBO,GAAmB,4DAIrB,MAAM4C,EAAOD,EAAM,GAEnB,GAAIC,EAAK3qC,KA3JkB,IAoKzB,OARAwnC,GAAyB,QACzBO,IACEzoC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,2BAEAH,EAAAA,EAAAA,KAAA,SAAM,qDAOZ,GACE8pC,EAAY19B,MACTsgC,GACCA,EAAWa,WAAaD,EAAK92C,MAC7Bk2C,EAAWc,gBAAkBF,EAAK3qC,MAClC+pC,EAAWe,oBAAsBH,EAAKz5C,OAK1C,OAFAs2C,GAAyB,QACzBO,GAAmB,wCAKrB,MAAMgD,EAAiB,IAAI5D,IAI3B6D,EAAAA,EAAAA,YAAU,KACR5D,EAAe,IACV2D,EACH,CACEH,SAAUD,EAAK92C,KACfg3C,cAAeF,EAAK3qC,KACpB8qC,kBAAmBH,EAAKz5C,OAE1B,IAGJ,MAAM+5C,EAAiBtC,GAAkBza,QACzC,GAAI+c,GAAkBvC,GAAgBxa,QAAS,CAE3C+c,EAAed,aAAec,EAAeC,cAC7CxC,GAAgBxa,QAAQgd,aAvMC,MA2MzBzC,GAAeva,SAASid,kBAAkBhd,eAAe,CACvDC,SAAU,SACVgd,MAAO,WAITlD,IAA0B,GAE9B,CAGA,IAAI6B,EACJvB,GAAmCta,QAAU,IAAImd,gBACjD,IACEtB,QAAmBuB,EAAAA,EAAAA,IACjBX,EACAnC,GAAmCta,QAAQqd,OAC3C7D,EAEJ,CAAE,MAAOptC,GACPytC,GAAmB,4DACnBX,EAAe2D,EACjB,CAGA,GAAIhB,EAAY,CAEd,MAAMyB,EAAiB,IAAIT,EAAgBhB,GAC3C3C,EAAeoE,GAGfhC,GAAyB,CACvBhjC,eACAC,iBACAmM,QAASm0B,EACT+C,cAAe0B,EACZt4C,KAAKu4C,GAAgBA,EAAYr4C,KACjCQ,QAAQR,GAAOwgB,QAAQxgB,MAE9B,CAGAioB,EAAMhb,OAAOuC,MAAQ,GACrB4kC,GAAyB,EAAM,KA6G7BnqC,EAAAA,EAAAA,KAAC+oC,EAAoB,CACnB3mC,OAAQ4nC,EACR3nC,QAASA,IAAM4nC,GAA8B,GAC7CjB,gBAAiBA,MAEnBhpC,EAAAA,EAAAA,KAACquC,EAAAA,GAAU,CACTjsC,OAAQmU,QAAQk0B,IAChBpoC,QAASA,IAAMqoC,QAAmBpkC,GAClCs7B,QAAS6I,MAEXxoC,EAAAA,EAAAA,MAAChC,EAAS,CAACupC,QAASA,EAAQrpC,SAAA,CACzB4sC,IACCtkC,EAAciL,QAAQw5B,eACrB92C,GAAY+U,OAASC,EAAAA,EAAWC,SAAWy8B,MAC1C9nC,EAAAA,EAAAA,KAACmpC,EAAAA,GAAU,CACTt1C,KAAK,mBACLuP,KAAM,gDACJ0kC,GAAiB,MAAQ,wEAEzBA,GAAiB,MAAQ,kBAE3B/gC,OAAO,eACPunC,KAAMhqC,EAAAA,GAAM4W,aAGlBlb,EAAAA,EAAAA,KAACuuC,EAAc,CAAC/E,QAASA,EAASpW,IAAKkY,GAAkBnrC,UACvD8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CACG2pC,EAAYpzC,OAAS,IACpBsJ,EAAAA,EAAAA,KAACwuC,EAAoB,CAACpb,IAAKgY,GAAejrC,SACvC2pC,EAAYj0C,KAAK62C,IAChB1sC,EAAAA,EAAAA,KAACyuC,EAAAA,GAAiB,CAEhB/B,WAAYA,EACZlD,QAASA,EACTY,iBAAmBsC,EAAW32C,GAAwB,IAAnBq0C,EACnCsE,SAAUA,IA7IIC,KAC9B,GAAIA,EAAc,CAChB,MAAMR,EAAiBrE,EAAYvzC,QAAQm2C,GAAeA,EAAW32C,KAAO44C,IAC5E5E,EAAeoE,GAGfhC,GAAyB,CACvBhjC,eACAC,iBACAmM,QAASm0B,EACT+C,cAAe0B,EACZt4C,KAAKu4C,GAAgBA,EAAYr4C,KACjCQ,QAAQR,GAAOwgB,QAAQxgB,MAE9B,MAEEo1C,GAAmCta,SAAS2a,QAE5CzB,EAAe,IAAID,EAAYxe,MAAM,EAAGwe,EAAYpzC,OAAS,IAC/D,EA0HgCk4C,CAAuBlC,EAAW32C,IAClD0N,QAASA,IACPipC,EAAW32C,IACX0zC,EAAYK,EAA2C4C,EAAW32C,KAP/D,cAAc22C,EAAW32C,IAAM,kBAa5CiK,EAAAA,EAAAA,KAAC6uC,EAAS,CACR,cAAY,gBACZzb,IAAKiY,GACLp4B,YACE22B,GAAmBzgC,GACf,GACA,sBAAsB8jC,KAE5B1nC,MAAOmkC,EACPF,QAASA,EACTrE,UAAWyH,GACX/pC,SAAU+pC,GACV1H,QAASA,IAAM2F,IAA0B,MAE3C7qC,EAAAA,EAAAA,KAAA,OAAKozB,IAAKmY,WAGdvrC,EAAAA,EAAAA,KAAC8uC,EAAqB,CAAA3uC,UACpBH,EAAAA,EAAAA,KAAC+uC,EAAY,CAACC,UAAWpE,GAAwBnnC,QAtIpCwrC,KACnB1D,GAAe1a,SAASC,eAAe,CACrCC,SAAU,SACVgd,MAAO,QAETlD,IAA0B,GAG1B,MAAMqE,EAAW7D,GAAgBxa,QAC5Bqe,IACLA,EAAS5K,QACT4K,EAASpJ,kBAAkB4D,EAAahzC,OAAQgzC,EAAahzC,QAAO,EA2HSyJ,UACrEH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,eAAemM,KAAK,KAAKW,MAAOC,EAAAA,GAAOY,aAGtDlC,EAAAA,EAAAA,MAAC68B,EAAe,CAAC0K,QAASA,EAAQrpC,SAAA,EAChC8B,EAAAA,EAAAA,MAACktC,EAAuB,CAAC3F,QAASA,EAAQrpC,SAAA,EACxCH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,YAAY8M,MAAOC,EAAAA,GAAOyE,SACrChI,EAAAA,EAAAA,KAACovC,EAAc,CAAC5F,QAASA,EAAQrpC,UAAEuM,EAAAA,EAAAA,GAAE,kCAEvCzK,EAAAA,EAAAA,MAACotC,EAAqB,CAAAlvC,SAAA,EACpBH,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,aACTmE,aAAa,QACb8nC,YAAY,kBACZ7rC,QA9SuB8rC,KAE5BjF,EAIHtB,MAHAuB,IAAiC,GACjCN,GAA8B,GAGhC,EAwSU95B,SAAU5B,GAAgB27B,EAC1B3iC,QAAQ,QACR,cAAY,2BAEdvH,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CACNtuB,UAAWwoB,EACXliC,aAAcgiC,EAAU,QAAU,QAClC7lC,SAAS,MACT4R,QACEi0B,EACI,mDACA,2BACLrpC,UAEDH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL,cAAY,sBACZwP,SAAS,eACTsH,aAAa,QACblH,QA1JOoL,UACnBL,GAAgB,GAEhB,MAAMi+B,EAAgB3C,EACnBj0C,KAAK62C,GAAeA,EAAW32C,KAC/BQ,OAAOggB,SAEV,GAAI9N,GAAe1S,SACX05C,EAAAA,EAAAA,IAAmB,CACvBC,gBAAiBjnC,EAAc1S,GAC/Bwf,QAASm0B,EACT+C,sBAEG,CACL,MAAQkD,SAAyBC,EAAAA,EAAAA,IAAoB,CACnDxmC,iBACAD,eACAD,OAASzE,EAA+B1O,GACxCwf,QAASm0B,EACT+C,mBALMkD,eAOR7tC,IAAS+tC,EAAAA,EAAAA,IAAmBF,GAC9B,CAIA5F,EAAe,IACfJ,EAAgB,IAChBkB,IAA0B,GAC1Br8B,GAAgB,EAAM,EA8HV2B,UAAWu5B,GAAgBn7B,GAAgB27B,EAC3CvnC,KAAM6mC,EAAU,KAAO,KAAKrpC,SAC7B,sBAOR,EAMP,MAAMgtC,EAAY/oC,EAAAA,GAAOoN,KAAK;;;;EAMxBvR,EAAYmE,EAAAA,GAAOC,GAAG;sBACN,EAAGmlC,aAAeA,EAAUjmC,EAAAA,GAAO6U,YAAc7U,EAAAA,GAAOY;aACjE,EAAGqlC,aAAeA,EAAU,OAAS;;;EAK5C1K,EAAkB16B,EAAAA,GAAOC,GAAG;;;;gBAIlB,EAAGmlC,aAAeA,EAAU,OAAS;EAG/C+E,EAAiBnqC,EAAAA,GAAOC,GAAG;gBACjB,EAAGmlC,aAAeA,EAAUjmC,EAAAA,GAAOY,MAAQZ,EAAAA,GAAO6U;;;;;;EAQ5D02B,EAAwB1qC,EAAAA,GAAOC,GAAG;;;;EAMlC0qC,EAAe3qC,EAAAA,GAAOC,GAAG;;;;;;aAMlB,EAAG2qC,eAAiBA,EAAY,OAAS;;;;;;;;sBAQhCzrC,EAAAA,GAAOyE;gBACbG,EAAAA,GAAO2nC;;;;aAIV,EAAGd,eAAiBA,EAAY,MAAQ;;;;;EAO/CR,EAAuBpqC,EAAAA,GAAOC,GAAG;;;;;EAOjCwqC,EAAYzqC,EAAAA,GAAO8qC,QAAQ;gBAvhBA;;aA0hBpB,EAAG1F,aAAeA,EAAU,YAAc;;;;IAInDllC,EAAAA,GAAM8I;;gBAEM,EAAGo8B,cAAeA,GAAWjmC,EAAAA,GAAO6U;;;;MAI9C9T,EAAAA,GAAM8I;aACC7J,EAAAA,GAAOyD;;EAIdmoC,EAA0B/qC,EAAAA,GAAOC,GAAG;;;EAIpC+qC,EAAiBhrC,EAAAA,GAAOC,GAAG;IAC7B,EAAGmlC,aAAeA,EAAUllC,EAAAA,GAAMgM,SAAWhM,EAAAA,GAAMyrC;EAEjDV,EAAwBjrC,EAAAA,GAAOC,GAAG;;;;+CClexC,MA7GA,UAAqB,SACnBvP,EAAQ,aACRk7C,EAAY,QACZxG,GAAU,EAAK,UACf/kC,EAAS,UACTooB,EAAS,cACTpkB,EAAa,YACbghC,IAEA,MAAMwG,GAAmBrf,EAAAA,EAAAA,QAA8B,MAYvD,OAVA3nB,EAAAA,EAAAA,YAAU,KACRqkB,YAAW,KACT2iB,EAAiBpf,SAASC,eAAe,CACvCC,SAAU,SACVgd,MAAO,QACPtkC,OAAQ,WACR,GACD,GAAG,GACL,CAAC3U,IAEA+3B,GAAiC,IAApB/3B,EAAS4B,QAEtBsJ,EAAAA,EAAAA,KAACC,EAAS,CAAAE,UACRH,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,QAAM,EAACC,OAAO,WAAWC,MAAO,CAAE3C,OAAQ,aAMtD/G,EAAAA,EAAAA,KAACC,EAAS,CAAC,cAAY,gBAAeE,UACpCH,EAAAA,EAAAA,KAACkwC,GAAQ,CAAA/vC,SACNrL,EAAS4B,QAAU+R,EAClB3T,EAASe,KAAI,CAAC+rC,EAASuO,KACrB,MAAMC,EACJxO,EAAQ17B,KAAKiF,OAASwB,EAAAA,EAAS4C,aAAe,OAAQqyB,EAAQ17B,MAC1D2hC,EAAetxB,QACnB9N,GACE,YAAaA,GACb,kBAAmBA,EAAcpL,SAGrC,OACE4E,EAAAA,EAAAA,MAACouC,EAAO,CAENjd,IAAK+c,IAAUr7C,EAAS4B,OAAS,EAAIu5C,EAAmB,KACxDzG,QAASA,EACT,cAAY,UAASrpC,SAAA,EAErBH,EAAAA,EAAAA,KAACswC,EAAW,CAAAnwC,SAAE0N,IAAM+zB,EAAQ3J,YAAc,IAAIsY,aAC9CtuC,EAAAA,EAAAA,MAACuuC,EAAgB,CAAArwC,SAAA,EACfH,EAAAA,EAAAA,KAACywC,EAAuB,CAAAtwC,SACrBiwC,IAAuBvI,GACtB7nC,EAAAA,EAAAA,KAACunC,EAAAA,GAAa,CACZC,UAAWK,EACXJ,SACE,YAAah/B,GAAiB,WAAYA,EAAcpL,QACpDoL,EAAcpL,QAAQqqC,OAAO/sC,SAC7B2L,EAEN3D,KAAK,QAGP3C,EAAAA,EAAAA,KAACmrB,EAAAA,GAAc,CACbxoB,KAAK,KACLuD,KAAM07B,EAAQ17B,KACd2hC,aAAcA,OAIpB5lC,EAAAA,EAAAA,MAACyuC,EAAc,CAAC,cAAY,kBAAiBvwC,SAAA,CAC1CyhC,EAAQ4K,oBAAoB91C,OAAS,IACpCsJ,EAAAA,EAAAA,KAAC2wC,GAA0B,CAAAxwC,SACxByhC,EAAQ4K,oBAAoB32C,KAAK62C,IAChC1sC,EAAAA,EAAAA,KAACyuC,EAAAA,GAAiB,CAEhB/B,WAAYA,EACZlD,QAASA,EACT/lC,QAASA,IAAMgmC,EAAY7H,EAAQ4K,oBAAqBE,EAAW32C,KAH9D,mBAAmB22C,EAAW32C,WAQ1C66C,EAAAA,EAAAA,IAAehP,EAAQrsB,iBAvCvB,iBAAiBqsB,EAAQ7rC,KA0CtB,KAIdiK,EAAAA,EAAAA,KAAC0wC,EAAc,CAAAvwC,SACZ6vC,GACChwC,EAAAA,EAAAA,KAAC6wC,GAAiB,CAAA1wC,SAAC,wEAInBH,EAAAA,EAAAA,KAAC6wC,GAAiB,CAAA1wC,SACf,mDACEsE,GAA4CjO,cAS/D,EAIA,MAAMyJ,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;;;;;;;;;wBAcJd,EAAAA,GAAO6M;;EAIzBkgC,EAAclsC,EAAAA,GAAOC,GAAG;IAC1BC,EAAAA,GAAM4D;WACC3E,EAAAA,GAAOkrB;;EAIZ4hB,EAAUjsC,EAAAA,GAAOC,GAAG;;aAEZ0G,GAAWA,EAAMy+B,QAAU,aAAe;;;qBAGlCz+B,GAAWA,EAAMy+B,QAAU,OAAS;;IAEtD,EAAGA,cACFA,GACD;EAOEgH,EAAmBpsC,EAAAA,GAAOC,GAAG;;;;;EAO7BosC,EAA0BrsC,EAAAA,GAAOC,GAAG;;;;EAMpCqsC,EAAiBtsC,EAAAA,GAAOC,GAAG;IAC7BC,EAAAA,GAAM8I;EAGJujC,GAA6BvsC,EAAAA,GAAOC,GAAG;;;;EAMvC6rC,GAAW9rC,EAAAA,GAAOC,GAAG;;EAGrBwsC,GAAoBzsC,EAAAA,GAAOC,GAAG;IAChCC,EAAAA,GAAMgM;WACC/M,EAAAA,GAAOyD;;;sgCCzClB,OAvIqB4C,EAAGnB,gBAAe+gC,UAASxrC,aAC9C,MAA8DsD,EAAAC,IAA9BC,EAAAA,EAAAA,UAA2B,IAAG,GAAvD1M,EAAQwM,EAAA,GAAEioC,EAAWjoC,EAAA,GACkCK,EAAAJ,IAAtBC,EAAAA,EAAAA,YAAsB,GAAvDwuC,EAAYruC,EAAA,GAAEmvC,EAAenvC,EAAA,GAC4B2M,EAAA/M,IAAdC,EAAAA,EAAAA,WAAS,GAAK,GAAzDuvC,EAAiBziC,EAAA,GAAE0iC,EAAoB1iC,EAAA,GAG8C0D,EAAAzQ,IAAxCC,EAAAA,EAAAA,UAAqC,IAAG,GAArFyvC,EAAkBj/B,EAAA,GAAEk/B,EAAqBl/B,EAAA,GAC4CE,EAAA3Q,IAAlBC,EAAAA,EAAAA,YAAkB,GAArF2vC,EAA6Bj/B,EAAA,GAAEk/B,EAAgCl/B,EAAA,GAEhE9b,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/DyS,GAAgB7G,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMwL,UAAU0J,gBAClElE,GAAuB3C,EAAAA,EAAAA,KAC1BrO,GAAqBA,EAAMwL,UAAUwF,uBAGlC7C,GAAWC,EAAAA,EAAAA,OAEjBkH,EAAAA,EAAAA,YAAU,KACR,WACE,IAAIR,GAAe1S,IAAQ4O,IAAwB6kC,EAYjDD,EAAY,IACZyH,GAAqB,QAZrB,IACE,MAAQrB,SAAyB0B,EAAAA,EAAAA,IAAY5oC,EAAc1S,KAAnD45C,eAERpG,EAAYoG,EAAe76C,UAC3Bk8C,GAAqB,GACrBlvC,GAAS41B,EAAAA,EAAAA,MACX,CAAE,MAAO50B,GACPguC,EAAgBhuC,GAChBkuC,GAAqB,EACvB,CAKH,EAhBD,EAgBI,GACH,CAACvoC,EAAe9D,IAGnB,MAAM8kC,EAAcA,CAACK,EAAyC6E,KAC5DuC,EAAsBpH,GACtB,MAAMqG,EAAQrG,EAAYwH,WAAW5E,GAAeA,EAAW32C,KAAO44C,IACtEyC,EAAiCjB,EAAM,EAQzC,IAAK1nC,GAAe1S,IAAMyzC,EACxB,OACExpC,EAAAA,EAAAA,KAACuxC,GAAS,CAAApxC,UACRH,EAAAA,EAAAA,KAACwxC,GAAc,CAACpnC,IAAKqnC,EAAYnnC,IAAI,oBAK3C,MAAMonC,EACJjpC,GAAiBrS,EAAYL,KAAO0S,EAAc7C,gBAAgB7P,GAE9D47C,EAAalpC,GAAiB,eAAgBA,EAEpD,IAAIhE,EACA+kC,GAAW/gC,EACRipC,EALiCjpC,GAAiB,oBAAqBA,EAQ1EhE,EAAYgE,EAAc5C,gBAAgB,GACjC8rC,IACTltC,EAAYgE,EAAc3C,WAAW6oB,MAClCijB,GAAeA,EAAW77C,KAAO0S,EAAc7C,eAAe7P,MALjE0O,EAAYgE,EAAc7C,eAW5BnB,EAAYoE,EAAcpE,UAG5B,MAAMotC,EAAoBrI,GAAW/gC,GAAiB,aAAcA,EAEpE,OACExG,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8xC,EAAAA,EAA6B,CAC5BhI,YAAamH,EACbc,uBAAwBZ,EACxBa,0BAA2BZ,EAC3Ba,aA3CeA,KACnBf,EAAsB,IACtBE,OAAiC9qC,EAAU,KA2CzCtG,EAAAA,EAAAA,KAACC,GAAS,CAACjC,OAAQA,EAAOmC,UACxB8B,EAAAA,EAAAA,MAAC0G,GAAS,CAAC6gC,QAASA,EAAQrpC,SAAA,EAC1B8B,EAAAA,EAAAA,MAACiwC,GAAoB,CAACC,UAAWN,EAAkB1xC,SAAA,CAChD0xC,IACC5vC,EAAAA,EAAAA,MAACmwC,GAAc,CAAC,cAAY,kBAAiBjyC,SAAA,EAC3C8B,EAAAA,EAAAA,MAACowC,GAAa,CAAAlyC,SAAA,EACZH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAWmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOyD,YAAaD,OAAO,cAAe,IAAI,eAGvF9E,EAAAA,EAAAA,MAACgF,GAAa,CAAA9G,SAAA,EACZH,EAAAA,EAAAA,KAAA,OAAAG,SAAMsI,EAAco0B,SAASnuB,QAAShC,EAAAA,EAAAA,GAAE,oCACxC1M,EAAAA,EAAAA,KAACsyC,GAAY,CACX7nC,IAAI8nC,EAAAA,EAAAA,IAAkB,CACpBxH,eAAgBtiC,EAAcsiC,eAC9BzrB,KAAM7W,EAAco0B,SAASvd,OAE/Btc,OAAO,SAAQ7C,UAEfH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,+BAKnBwJ,EAAAA,EAAAA,KAACwyC,EAAW,CACV19C,SAAUA,EACVk7C,aAAcA,EACdvnC,cAAeA,EACf+gC,QAASjzB,QAAQizB,GACjB/kC,UAAWA,EACXooB,UAAWkkB,EACXtH,YAAaA,QAGjBzpC,EAAAA,EAAAA,KAACspC,EAAc,CACb7gC,cAAeA,EACf8gC,YAAaA,EACbC,QAASA,EACT/kC,UAAWA,EACXglC,YAAaA,WAIlB,EAMP,MAAMxpC,GAAYmE,EAAAA,GAAOC,GAAG;;;;YAIf0G,GAAUA,EAAM/M;EAGvB2K,GAAYvE,EAAAA,GAAOC,GAAG;;;;aAId0G,GAAWA,EAAMy+B,QAAU,YAAc;EAGjD0I,GAAuB9tC,EAAAA,GAAOC,GAAG;;wBAEf,EAAG8tC,eAAiBA,EAAY,WAAa;;;EAK/DC,GAAiBhuC,EAAAA,GAAOC,GAAG;;;EAK3BguC,GAAgBjuC,EAAAA,GAAOC,GAAG;;;IAG5BC,EAAAA,GAAM4D;WACC3E,EAAAA,GAAOyD;EAGZC,GAAgB7C,EAAAA,GAAOC,GAAG;;;IAG5BC,EAAAA,GAAMkU;;;;MAIJrQ,EAAAA,GAAOsgC;;;EAKP6J,IAAeluC,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;WACtBjH,EAAAA,GAAOC;;IAEdc,EAAAA,GAAM4W;EAGJq2B,GAAYntC,EAAAA,GAAOC,GAAG;;;;;;EAQtBmtC,GAAiBptC,EAAAA,GAAOwG,GAAG;;wpCCvKjC,MArDkC6nC,EAAGpwC,UAASD,SAAQswC,2BACpD,MAA+CpxC,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxCmxC,EAAQrxC,EAAA,GAAEsxC,EAAWtxC,EAAA,GAgB5B,OAdA2H,EAAAA,EAAAA,YAAU,KACJ0pC,GACFrlB,YAAW,KACTslB,GAAY,EAAM,GACjB,IACL,GACC,CAACD,KAEJ1pC,EAAAA,EAAAA,YAAU,KACJ7G,GACFwwC,GAAY,EACd,GACC,CAACxwC,KAGFpC,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CAACE,QAASA,EAASD,OAAQA,EAAQvE,MAAM,QAAQG,OAAO,QAAOmC,UACxE8B,EAAAA,EAAAA,MAACO,EAAY,CAAArC,SAAA,EACXH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAU8M,MAAOC,EAAAA,GAAO0lB,MAAOtmB,KAAK,SAC/CV,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACE8B,EAAAA,EAAAA,MAAC8O,EAAG,CAAA5Q,SAAA,EACFH,EAAAA,EAAAA,KAACoR,EAAM,CAAAjR,SAAC,kCACRH,EAAAA,EAAAA,KAACm+B,EAAS,CAAAh+B,SAAC,uHAKbH,EAAAA,EAAAA,KAACm+B,EAAS,CAAAh+B,SAAC,+CACXH,EAAAA,EAAAA,KAAC0K,EAAAA,EAAM,CAACrH,SAAS,QAAQ0D,OAAO,aAAatD,QAASivC,EAAqBvyC,SAAC,4BAG5E8B,EAAAA,EAAAA,MAAC4wC,EAAE,CAAA1yC,SAAA,CAAC,KACC,KACHH,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTM,QAASA,KACPqvC,UAAUC,UAAUC,UAAUl1C,OAAOhE,SAASmK,MAC9C2uC,GAAY,EAAK,EAEnBxvC,KAAMuvC,EAAW,UAAY,yBAC7BrvC,MAAOqvC,EAAWpvC,EAAAA,GAAO0lB,MAAQ1lB,EAAAA,GAAOC,UACxCH,SAAS,OACTsH,aAAa,OACbhI,KAAK,iBAKF,EAMjB,MAAMH,EAAe4B,EAAAA,GAAOC,GAAG;;;;;;EAOzB+M,EAAShN,EAAAA,GAAOC,GAAG;WACdd,EAAAA,GAAOyE;IACd1D,EAAAA,GAAMyI;;EAGJoxB,EAAY/5B,EAAAA,GAAOC,GAAG;IACxBC,EAAAA,GAAM8I;;EAGJ2D,EAAM3M,EAAAA,GAAOC,GAAG;;;;EAKhBwuC,EAAKzuC,EAAAA,GAAOC,GAAG;;;;IAIjBC,EAAAA,GAAM4W;uCC9EH,MAAM+3B,EAAqBpkC,MAAO0zB,EAAmB2Q,WACnC3/B,EAAAA,EAAIC,IAAI,oBAAqB,CAClD0S,OAAQ,CACN2c,WAAYN,EACZ4Q,QAASD,MAGGlkC,KAGLokC,EAAuBA,EAClC7Q,YACAn/B,OACAiwC,YACA12C,UAOA4W,EAAAA,EAAI8L,MAAKi0B,EAAAA,EAAAA,OAAyB,CAChCzQ,WAAYN,EACZgR,YAAaF,EACbjwC,OACAzG,SAGS62C,EAAqBA,CAACz9C,EAAYqN,EAAezG,IAC5D4W,EAAAA,EAAIkgC,KAAIC,EAAAA,EAAAA,KAAqB,CAAE39C,GAAIA,IAAO,CAAEqN,OAAMzG,SAEvCg3C,EAAwB59C,GAAewd,EAAAA,EAAI8L,MAAKu0B,EAAAA,EAAAA,KAA4B,CAAE79C,QAE9E89C,EAA0B99C,GACrCwd,EAAAA,EAAI8L,MAAKy0B,EAAAA,EAAAA,KAA8B,CAAE/9C,QAE9Bg+C,EAAwBh+C,GAAewd,EAAAA,EAAIygC,QAAON,EAAAA,EAAAA,KAAqB,CAAE39C,Q,8PC1CtF,MAAMmzC,EAAO9kC,EAAAA,GAAOilC,EAAE;;;EAgCtB,MA3BwB,CACtB4K,kBAAkBj0C,EAAAA,EAAAA,KAAAkC,EAAAA,SAAA,CAAA/B,SAAE,YACpB+zC,wBACEjyC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,cACH8B,EAAAA,EAAAA,MAACinC,EAAI,CAAA/oC,SAAA,EACHH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,yGAIJH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,yDACJH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,gGAIVg0C,oBACElyC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,cACH8B,EAAAA,EAAAA,MAACinC,EAAI,CAAA/oC,SAAA,EACHH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,iDACJH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,8EACJH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,uD,ggCCgIZ,MA1HoCi0C,EAClCC,cACA3gC,UACA4gC,UACAC,mBAAmB,EACnBnnB,YACAonB,sBAEA,MAAoClzC,EAAAC,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA7B4B,EAAI9B,EAAA,GAAEmzC,EAAOnzC,EAAA,GACsBK,EAAAJ,GAAdC,EAAAA,EAAAA,WAAS,GAAK,GAAnCY,EAAMT,EAAA,GAAE+yC,EAAS/yC,EAAA,GAClBgzC,GAAoB/jB,EAAAA,EAAAA,SAAO,GAE3Bx6B,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/Dw+C,GAAwB1nB,EAAAA,EAAAA,GAAY,CACxCC,WAAYimB,EACZhmB,UAAY7a,IACV,MAAQxc,EAAOwc,EAASvD,KAAhBjZ,GACR0+C,EAAQ,IACRrnB,EAAUr3B,EAAG,EAEf03B,QAASqE,EAAAA,MAYX7oB,EAAAA,EAAAA,YAAU,KACJ7F,EAAK1M,OAAS,IAAGi+C,EAAkB9jB,SAAU,EAAI,GACpD,CAACztB,KAEJ6F,EAAAA,EAAAA,YAAU,IACD,KACD0rC,EAAkB9jB,SAAWztB,EAAK1M,OAAS,IAC7C4gB,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBs9B,QAAS,CAC9Bp9B,aAAc,oBACdwS,gBAAiB,8BACjB6qB,aAAcphC,EAAQ4L,MACtB,GAEL,IAEH,MAAMy1B,EAAYT,GAASv+C,GAE3B,OACEkM,EAAAA,EAAAA,MAAChC,EAAS,CAAC80C,UAAWA,EAAU50C,SAAA,CAC7B40C,IAAa/0C,EAAAA,EAAAA,KAACw+B,GAAI,CAACp0B,IAAK4qC,KACzB/yC,EAAAA,EAAAA,MAACgzC,EAAO,CAAA90C,SAAA,EACNH,EAAAA,EAAAA,KAACmrB,EAAAA,GAAc,CAACjlB,KAAM9P,EAAoBuM,KAAK,OAAQ,IACtDoyC,GAAY9yC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,cAAYm0C,GAASpuC,MAAM1P,MAAQ69C,MAAkBpyC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,OAAKk0C,SAE7Er0C,EAAAA,EAAAA,KAACk1C,EAAAA,GAAY,CACX3/B,QACEw/B,EAAYI,EAAgBhB,mBAAqBgB,EAAgBjB,uBAEnEr2C,MAAM,QACNu3C,eAAgBL,EAAY,OAAS,QACrCM,iBAAkBN,EAAY,QAAU,SAAS50C,UAEjDH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACRtpC,MAAOnC,EACPkyC,UAAWhxC,EAAAA,GAAMixC,mBACjB1yC,SAAWC,GAAM2xC,EAAQ3xC,EAAEE,OAAOuC,OAClC2pC,UAAQ,EACRsG,eAAgBT,EAAY,QAAU,OACtCtV,OAAO,OACPgW,eAAgBV,OAAYzuC,EAAY,QAG3CoN,EAAQw5B,cAAgB6H,GAAa3+C,EAAY+U,OAASC,EAAAA,EAAWC,UACpErL,EAAAA,EAAAA,KAACmpC,EAAAA,GAAU,CACTt1C,KAAK,mBACLuP,KAAK,oIACL2D,OAAO,WACPunC,KAAMhqC,EAAAA,GAAM4W,aAGhBlb,EAAAA,EAAAA,KAAC01C,EAAiB,CAAAv1C,SACf40C,GAAa3+C,EAAY+U,OAASC,EAAAA,EAAWC,UAC5CrL,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACPC,OACET,EAAAA,EAAAA,MAAA,QAAA9B,SAAA,CAAM,SACGm0C,GAASpuC,MAAM1P,KAAK,oDAC1B+9C,EAAmB,GAAKD,GAASpuC,MAAMiF,OAASC,EAAAA,EAAWuqC,WAC1D1zC,EAAAA,EAAAA,MAAA,QAAA9B,SAAA,CACG,IAAI,eACQ,KACbH,EAAAA,EAAAA,KAAC41C,EAAAA,GAAQ,CAACnrC,GAAI,YAAY6pC,GAASpuC,MAAMT,aAAcnC,MAAOC,EAAAA,GAAOC,UAAUrD,SAAC,0BAErE,OAGX,QAGRyC,UAAWR,EACXS,SAAWC,GAAM4xC,EAAU5xC,EAAEE,OAAOC,SACpCN,KAAK,UAIXV,EAAAA,EAAAA,MAAC4zC,EAAM,CAAA11C,SAAA,EACLH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACL9E,MAAM,QACN4F,QAvFoBqyC,KAC1BlB,EAAsBlnB,OAAO,CAC3BtqB,OACAm/B,UAAW7uB,EAAQ3d,GACnBs9C,UAAWiB,GAASv+C,SAAMuQ,EAC1B3J,KAAMyF,GACN,EAkFI+N,SAA0B,IAAhB/M,EAAK1M,QAAgBk+C,EAAsB/nB,UAAU1sB,SAChE,YAGDH,EAAAA,EAAAA,KAAC+1C,EAAM,CAACtyC,QAASA,IAAM+wC,GAAgB,GAAOr0C,SAAC,gBAEvC,EAMT,MAAM01C,EAASzxC,EAAAA,GAAOC,GAAG;;;;IAI5BC,EAAAA,GAAM8I;IACN,EAAG4oC,eAAgBA,GAAa;EAE9Bf,EAAU7wC,EAAAA,GAAOC,GAAG;;;;IAItBC,EAAAA,GAAMgM;WACC/M,EAAAA,GAAOyD;;EAGZ/G,EAAYmE,EAAAA,GAAOC,GAAG;;YAEhB,EAAG0wC,eAAiBA,EAAY,gBAAkB;EAEjDW,EAAoBtxC,EAAAA,GAAOC,GAAG;;EAI9B0xC,EAAS3xC,EAAAA,GAAOC,GAAG;;;;IAI5BC,EAAAA,GAAMgN;WACC/N,EAAAA,GAAOC;EAGZg7B,GAAOp6B,EAAAA,GAAOwG,GAAG;;;;;sgCC/GvB,OA5DkCqrC,EAAGC,UAAS9oB,YAAW+oB,mBACvD,MAAoD70C,EAAAC,IAA5BC,EAAAA,EAAAA,UAAS00C,EAAQ9yC,MAAQ,IAAG,GAA7CA,EAAI9B,EAAA,GAAEmzC,EAAOnzC,EAAA,GACsCK,EAAAJ,IAA9BC,EAAAA,EAAAA,UAAS00C,EAAQv5C,OAAQ,GAAK,GAAnDyF,EAAMT,EAAA,GAAE+yC,EAAS/yC,EAAA,GAElBvL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/D8/B,GAAWhJ,EAAAA,EAAAA,GAAY,CAC3BC,WAAYA,IAAMqmB,EAAmB0C,EAAQngD,GAAIqN,EAAMhB,GACvDgrB,UAAWve,UACT4lC,EAAQ,IACRxkC,EAAAA,GAAMhB,QAAQ,0BACRme,GAAW,EAEnB+I,KAAM,CACJC,uBAAuB,KAQrB2e,EAAiC,IAArB3+C,EAAY+U,KAE9B,OACElJ,EAAAA,EAAAA,MAACm0C,GAAa,CAAAj2C,SAAA,EACZH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACRtpC,MAAOnC,EACPkyC,UAAWhxC,EAAAA,GAAMixC,mBACjBtiC,YAAY,oBACZpQ,SAAWC,GAAM2xC,EAAQ3xC,EAAEE,OAAOuC,OAClC2pC,UAAQ,EACRsG,eAAe,QACf/V,OAAO,UAETz/B,EAAAA,EAAAA,KAAC01C,EAAiB,CAAAv1C,SACf40C,IACC/0C,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACPC,MAAM,+CACNE,UAAWR,EACXS,SAAWC,GAAM4xC,EAAU5xC,EAAEE,OAAOC,SACpCN,KAAK,UAIXV,EAAAA,EAAAA,MAAC4zC,EAAM,CAACG,WAAS,EAAA71C,SAAA,EACfH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACLoE,OAAO,aACPtD,QA/BoBqyC,KAC1B5f,EAASxI,QAAQ,EA+BXvd,SAAU+lB,EAASrJ,WAA8B,IAAjBzpB,GAAM1M,OAAayJ,SACpD,YAGDH,EAAAA,EAAAA,KAAC+1C,EAAM,CAACtyC,QAASA,IAAM0yC,GAAa,GAAOh2C,SAAC,gBAEhC,EAMpB,MAAMi2C,GAAgBhyC,EAAAA,GAAOC,GAAG;;sgCCrChC,MAAMgyC,GAAiBA,EACrBH,UACAxiC,UACA6gC,mBAAmB,EACnB+B,kBACAC,YACA1P,kBACA2P,aAAY,MAEZ,MACEzgD,EAWEmgD,EAXFngD,GACAmQ,EAUEgwC,EAVFhwC,KACA+xB,EASEie,EATFje,WACA70B,EAQE8yC,EARF9yC,KACAzG,EAOEu5C,EAPFv5C,KACA85C,EAMEP,EANFO,SACAC,EAKER,EALFQ,QACAC,EAIET,EAJFS,gBACAC,EAGEV,EAHFU,kBACAC,EAEEX,EAFFW,wBACAC,EACEZ,EADFY,0BAGqDx1C,EAAAC,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhDu1C,EAAYz1C,EAAA,GAAEkzC,EAAelzC,EAAA,GACaK,EAAAJ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA1Cw0C,EAASr0C,EAAA,GAAEw0C,EAAYx0C,EAAA,GAExBvL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D0L,GAAWC,EAAAA,EAAAA,MAEX8b,EAAcznB,EAAY+U,OAASwB,EAAAA,EAAS4C,UAC5CwsB,EAAY3lC,EAAY+U,OAASwB,EAAAA,EAASC,QAC1CovB,EAAoB5lC,EAAY+U,OAASwB,EAAAA,EAASqK,iBAElDggC,EAA8B5gD,EAAYL,IAAMK,EAAYL,KAAOmQ,GAAMnQ,GAEzEkhD,EAAkC,IAArB1C,EACb2C,EACJF,IAAgChB,KAAeiB,GAAc3jB,OAAOojB,GAAShgD,QAAU,GACnFygD,GAAapb,IAAcib,EAC3BI,GAAoBL,GAAgBE,IAAeP,GAAShgD,QAAU6/C,EACtEc,EAAkB,MACtB,GAAIN,GAAgBE,GAAcP,GAAShgD,OAAQ,OAAO,EAE1D,IAAKiG,EAAM,OAAO,EAElB,GAAIkhB,GAAeme,EAAmB,CAGpC,OAFwBya,GAAUvwC,MAAMnQ,KAAOK,EAAYL,EAG7D,CAEA,GAAIgmC,EAAW,CACb,MAAMub,EAAoBb,GAAUvwC,MAAMnL,cAAwCwhC,WAC5Egb,EAAuBnhD,EAAY2E,cAAcwhC,WAEvD,OAAO+a,IAAqBC,CAC9B,CAEA,OAAO,CACR,EAnBuB,GAqBlBC,GACJ3Q,GAAmB3gC,GAAMiF,OAASwB,EAAAA,EAASC,QAAU,cAAgB1G,GAAM1P,KAE7E,IAAIihD,GAAgC,GAChCC,GAAmC,GAEnCxxC,GAAMiF,OAASwB,EAAAA,EAAS4C,WAC1BmoC,GAAqBxxC,EAAKnL,cAA0CjB,SACpE29C,GAAkBvxC,EAAKnL,cAA0C2T,OAAS,aACjExI,GAAMiF,OAASwB,EAAAA,EAASqK,kBACjC0gC,GAAqBxxC,EAAKnL,cAA2C23B,WACrE+kB,GAAkBvxC,EAAKnL,cAA2CoQ,MACzD07B,GACT6Q,GAAoB,kBACpBD,GAAiB,YACPvxC,GAAMnL,cAAwC4T,eACxD+oC,IAAqBxxC,GAAMnL,cAAuC4T,aAClE8oC,GAAkBvxC,GAAMnL,cAAwC2T,OAAS,YAG3E,MAuCMipC,GAAW9oC,UACf,GAAKzY,EAAYL,IAKjB,GAAKohD,EAEL,UACQxD,EAAqB59C,IAC3BuhB,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,iBACdwS,gBAAiB,iBACjB6qB,aAAcphC,EAAQ4L,KACtBs4B,QAASf,IAEXP,GACF,CAAE,MAAOxzC,GACPmN,EAAAA,GAAMZ,MAAM,qEAEZoD,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,2BACfD,EAAKkkC,QAAQ,CACXC,UAAW32B,OAAOprB,GAClBmT,OAAQ9S,EAAYL,GACpByxB,UAAWpxB,EAAY2mB,OACvB,GAEN,OA1BEjb,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,IA0BpC,EAkFIo7C,IACHX,GAAoBC,IAAoBjhD,EAAY+U,OAASwB,EAAAA,EAASC,QAEzE,OACE3K,EAAAA,EAAAA,MAAChC,GAAS,CAAC+3C,UAAWD,GAAsBd,WAAYA,EAAW92C,SAAA,CAChE43C,IAAwBd,IACvBj3C,EAAAA,EAAAA,KAACi4C,GAAe,CAAA93C,SAAC,4BAEnB8B,EAAAA,EAAAA,MAACi2C,GAAO,CAAA/3C,SAAA,EACN8B,EAAAA,EAAAA,MAACk2C,GAAW,CAAAh4C,SAAA,CACT61C,GACCh2C,EAAAA,EAAAA,KAACi2C,GAAyB,CACxBC,QAASA,EACT9oB,UAjIUve,UACpBsnC,GAAa,GACb3B,GAAgB,SACV8B,GAAiB,EA+HbH,aAAcA,KAGhBl0C,EAAAA,EAAAA,MAACm2C,GAAa,CAACnB,WAAYA,EAAW92C,SAAA,EACpCH,EAAAA,EAAAA,KAACq4C,GAAc,CAACL,UAAWZ,EAAkBZ,UAAWA,EAAUr2C,SAC/D82C,EAAa,KAAO,QAEvBh1C,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CACG43C,KAAyBd,IACxBj3C,EAAAA,EAAAA,KAACi4C,GAAe,CAAA93C,SAAC,4BAEnBH,EAAAA,EAAAA,KAACs4C,GAAW,CAAAn4C,SAAEiD,UAInB8zC,IACCj1C,EAAAA,EAAAA,MAACs2C,GAAc,CAAAp4C,SAAA,CACZ47B,IACC/7B,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACnD,QAAQ,YAAY5E,KAAK,KAAKc,QAASA,IAAM0yC,GAAa,GAAMh2C,SAAC,UAI3EH,EAAAA,EAAAA,KAACw4C,GAAM,CAAC/0C,QApFHoL,UACf,UACQklC,EAAqBh+C,GAC3Bka,EAAAA,GAAMhB,QAAQ,oBACdqnC,GACF,CAAE,MAAOxzC,GACPmN,EAAAA,GAAMZ,MAAM,qEAEZoD,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,2BACfD,EAAKkkC,QAAQ,CACXC,UAAW32B,OAAOprB,GAClBmT,OAAQ9S,EAAYL,GACpByxB,UAAWpxB,EAAY2mB,OACvB,GAEN,GAoEoC5c,SAAC,eAG/B8B,EAAAA,EAAAA,MAACw2C,GAAI,CAACxB,WAAYA,EAAYjB,UAAWA,EAAU71C,SAAA,EACjDH,EAAAA,EAAAA,KAAC04C,GAAgB,CACfjuC,GAAIvE,GAAMiF,OAASwB,EAAAA,EAAS4C,UAAY,YAAYrJ,GAAMT,kBAAea,EAAUnG,UAEnFH,EAAAA,EAAAA,KAACmrB,EAAAA,GAAc,CACbjlB,KAAMA,EACNvD,KAAK,KACLklC,aAAc3hC,GAAMiF,OAASwB,EAAAA,EAASC,SAAWi6B,OAGrD5kC,EAAAA,EAAAA,MAAC02C,GAAQ,CAAAx4C,SAAA,EACPH,EAAAA,EAAAA,KAAC0G,GAAI,CAAAvG,SACF+F,GAAMiF,OAASwB,EAAAA,EAAS4C,WACvBtN,EAAAA,EAAAA,MAAC2zC,EAAAA,GAAQ,CACPnrC,GAAI,YAAYvE,GAAMT,aACtB6oC,KAAMhqC,EAAAA,GAAM4W,UACZzX,QAASA,KACP6T,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,yBACdwS,gBAAiB,iBACjB6qB,aAAcphC,EAAQ4L,OAEzBnf,SAAA,CAEAq3C,GAAc,KAAGC,GAAe,KAAGC,OAGtCz1C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CACGq3C,GAAc,KAAGC,GAAe,KAAGC,IACpC13C,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAW8M,MAAOC,EAAAA,GAAOC,UAAWb,KAAK,KAAKoE,OAAO,oBAItE/G,EAAAA,EAAAA,KAAC44C,GAAU,CAAAz4C,SAAE0N,IAAMoqB,GAAYnqB,OAAO,2BAI3C5H,GAAMiF,OAASwB,EAAAA,EAASC,UACvB5M,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CACNj6B,QAAS4/B,EAAgBlB,iBACzBtwC,SAAS,QACT6D,aAAa,cACb4tC,eAAe,OAAMj1C,UAErB8B,EAAAA,EAAAA,MAAC42C,GAAqB,CACpBC,QAAS3B,EACT4B,QAASlC,EACTpzC,QAASk0C,GAASx3C,SAAA,EAElBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,aAAamM,KAAK,KAAKW,MAAOC,EAAAA,GAAOC,aAChDxD,EAAAA,EAAAA,KAACg5C,GAAiB,CAAA74C,SAAEw2C,YAK3BzwC,GAAMiF,OAASwB,EAAAA,EAASC,UACvB3K,EAAAA,EAAAA,MAACg3C,GAAO,CAAA94C,SAAA,CACL/J,EAAY+U,OAASwB,EAAAA,EAASC,QAC3B,oBACA,6BACJ3K,EAAAA,EAAAA,MAACi3C,GAAY,CAACJ,QAAS3B,EAAW1zC,QAASk0C,GAASx3C,SAAA,EAClDH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CACHtQ,KAAM,YAAWqgD,EAA0B,UAAY,IACvDl0C,KAAK,KACLW,MAAO6zC,EAAY5zC,EAAAA,GAAOC,UAAYD,EAAAA,GAAOkrB,cAC5C,IACFkoB,MAEH10C,EAAAA,EAAAA,MAACi3C,GAAY,CAACJ,QAAS3B,EAAW1zC,QA1LvBoL,UACjB,GAAKzY,EAAYL,IAKjB,GAAK8nB,GAAgBme,EAErB,UACQ6X,EAAuB99C,IAC7BuhB,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,mBACdwS,gBAAiB,iBACjB6qB,aAAcphC,EAAQ4L,KACtBs4B,QAASf,IAEXP,GACF,CAAE,MAAOxzC,GACPmN,EAAAA,GAAMZ,MAAM,uEAEZoD,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,6BACfD,EAAKkkC,QAAQ,CACXC,UAAW32B,OAAOprB,GAClBmT,OAAQ9S,EAAYL,GACpByxB,UAAWpxB,EAAY2mB,OACvB,GAEN,OA1BEjb,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,IA0BpC,EA8J4DwD,SAAA,EACpDH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CACHtQ,KAAM,cAAasgD,EAA4B,UAAY,IAC3Dn0C,KAAK,KACLW,MAAO6zC,EAAY5zC,EAAAA,GAAOC,UAAYD,EAAAA,GAAOkrB,cAC5C,IACFmoB,SAILQ,GAAoBC,KACpBp1C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACLnD,QAAQ,YACR5E,KAAK,KACLc,QAASA,IAAM+wC,GAAgB,GAC/BztC,OAAQqwC,EAAmB,gBAAkB,kBAC7Cv5C,MAAM,cAAasC,SAElB82C,EAAa,SAAW,UAE1Bt6C,GAAQ85C,GAAYrgD,EAAY+U,OAASwB,EAAAA,EAASC,UACjD5M,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACL4E,QAAQ,QACR9D,QAjKUoL,UACpB,UACQ2kC,EAAmBz9C,OAAIuQ,GAAW,IACxCgR,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,eACdwS,gBAAiB,iBACjB6qB,aAAcphC,EAAQ4L,OAExBrP,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAACk3C,GAAY,CAAAh5C,SAAA,CACV,kBACDH,EAAAA,EAAAA,KAACo5C,GAAU,CAAC31C,QAASA,IAAM+vC,EAAmBz9C,OAAIuQ,GAAW,GAAMnG,SAAC,aAGxEm2C,GACF,CAAE,MAAOxzC,GACPmN,EAAAA,GAAMZ,MAAM,mEAEZoD,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,gCACfD,EAAKkkC,QAAQ,CACXC,UAAW32B,OAAOprB,GAClBmT,OAAQ9S,EAAYL,GACpByxB,UAAWpxB,EAAY2mB,OACvB,GAEN,GAwIUhW,OAAO,aACPlJ,MAAM,cAAasC,SACpB,oBAMN42C,IACC/2C,EAAAA,EAAAA,KAACo0C,EAA2B,CAC1BC,YACExN,EAAkB,mBAAqB3gC,GAAMnL,cAAqB4T,aAEpE+E,QAASA,EACT4gC,QAAS4B,EACT3B,iBAAkBA,EAClBnnB,UArReve,UACrBsnC,GAAa,GACb3B,GAAgB,SACV8B,IACNrmC,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAACk3C,GAAY,CAAAh5C,SAAA,CACV,oBACDH,EAAAA,EAAAA,KAACo5C,GAAU,CAAC31C,QAASA,IA5BZoL,WACb,UACQklC,EAAqBsF,SAErB/C,IAENrmC,EAAAA,GAAMhB,QAAQ,mBAChB,CAAE,MAAOnM,GACPmN,EAAAA,GAAMZ,MAAM,qEAEZoD,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,sCACfD,EAAKkkC,QAAQ,CACXC,UAAW32B,OAAOk4B,GAClBnwC,OAAQ9S,EAAYL,GACpByxB,UAAWpxB,EAAY2mB,OACvB,GAEN,GAU+Bu8B,CAAOD,GAAkBl5C,SAAC,YAExD,EA6QKq0C,gBAAiBA,KAGnByC,GAAc3jB,OAAOojB,GAAShgD,QAAU,IAAKsJ,EAAAA,EAAAA,KAACu5C,GAAc,KAC9Dv5C,EAAAA,EAAAA,KAACw5C,GAAO,CAACC,cAAexC,GAAc3jB,OAAOojB,GAAShgD,QAAQyJ,SAC3DmzB,OAAOojB,GAAShgD,QAAU,IACzBuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CACG82C,IAAcj3C,EAAAA,EAAAA,KAACw+B,GAAI,CAACp0B,IAAK4qC,IACzB0B,GAAS7gD,KAAI,CAAC6jD,EAAOvJ,KACpBnwC,EAAAA,EAAAA,KAACq2C,GAAc,CAEb9B,iBAAkBA,EAAmB,EACrCiC,UAAWS,GAAwB,IAAV9G,EACzBz8B,QAASA,EACTwiC,QAASwD,EACTpD,gBAAiBA,EACjBC,UAAWA,EACX1P,gBAAiBA,GAPZ6S,EAAM3jD,aAaX,EAIhB,UAEA,MAAMkK,GAAYmE,EAAAA,GAAOC,GAAG;IACxB,EAAG2zC,YAAWf,gBACde,GACA,yBACkBf,EAAa,OAAS,4DAExB1zC,EAAAA,GAAOo2C;EAKrBJ,GAAiBn1C,EAAAA,GAAOC,GAAG;;;gBAGjBd,EAAAA,GAAOsE;;EAIjBqwC,GAAU9zC,EAAAA,GAAOC,GAAG;;;EAIpB8zC,GAAc/zC,EAAAA,GAAOC,GAAG;;EAGxB+zC,GAAgBh0C,EAAAA,GAAOC,GAAG;IAC5B,EAAG4yC,gBAAkBA,EAAa3yC,EAAAA,GAAM+L,WAAa/L,EAAAA,GAAMuG;;;EAIzDwtC,GAAiBj0C,EAAAA,GAAOw1C,MAAM;gBACpB,EAAG5B,eAAiBA,EAAYz0C,EAAAA,GAAOo2C,UAAYp2C,EAAAA,GAAOY;;IAEtE,EAAGqyC,gBAAiBA,GAAa;EAE/B8B,GAAcl0C,EAAAA,GAAOC,GAAG;;EAGxBo0C,GAAOr0C,EAAAA,GAAOC,GAAG;;;IAGnBC,EAAAA,GAAM4W;;iBAEO,EAAG86B,eAAiBA,EAAY,IAAM;EAEjD0C,IAAmBt0C,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;oBAEjB,EAAGC,QAAUA,EAAK,OAAS;;EAGzCkuC,GAAWv0C,EAAAA,GAAOC,GAAG;;;EAIrBqC,GAAOtC,EAAAA,GAAOC,GAAG;;;IAGnBC,EAAAA,GAAM4W;;EAGJ09B,GAAax0C,EAAAA,GAAOC,GAAG;IACzBC,EAAAA,GAAM4W;WACC3X,EAAAA,GAAOyD;EAEZwxC,GAASp0C,EAAAA,GAAOC,GAAG;;;;IAIrBC,EAAAA,GAAMgN;WACC/N,EAAAA,GAAOS;EAEZ60C,GAAwBz0C,EAAAA,GAAOC,GAAG;;;;;sBAKlBd,EAAAA,GAAO6U;;;;;WAKlB7U,EAAAA,GAAOs2C;;;WAGPt2C,EAAAA,GAAOyD;IACd,EAAG+xC,aAAcA,GAAW,UAAUx1C,EAAAA,GAAOC;IAC7C,EAAGs1C,aACHA,GACA,kEAGkBv1C,EAAAA,GAAOsnB,8CACDtnB,EAAAA,GAAOsnB;EAI7BmuB,GAAoB50C,EAAAA,GAAOC,GAAG;;EAG9Bm1C,GAAUp1C,EAAAA,GAAOC,GAAG;;;IAGtB,EAAGo1C,mBACHA,GACA;;;;;EASEjb,GAAOp6B,EAAAA,GAAOwG,GAAG;;;;;EAMjB2tC,GAAiBn0C,EAAAA,GAAOC,GAAG;;;;;EAM3B40C,GAAU70C,EAAAA,GAAOC,GAAG;;;;;IAKtBC,EAAAA,GAAM4W;EAEJg+B,GAAe90C,EAAAA,GAAOC,GAAG;IAC3B,EAAGy0C,aAAcA,GAAW;;;;WAIrB,EAAGA,aAAeA,EAAUv1C,EAAAA,GAAOC,UAAYD,EAAAA,GAAOkrB;EAE3DwpB,GAAkB7zC,EAAAA,GAAOC,GAAG;IAC9BC,EAAAA,GAAMyrC;WACCxsC,EAAAA,GAAOu2C;;EAGZX,GAAe/0C,EAAAA,GAAOC,GAAG;;;;EAKzB+0C,GAAah1C,EAAAA,GAAOoe,MAAM;;;;;;sgCCvjBhC,MAAMu3B,GAAoC,CACxC,CACEx0C,MAAO,QACP7C,MAAO,gBAET,CACE6C,MAAO,SACP7C,MAAO,eAET,CACE6C,MAAO,oBACP7C,MAAO,sBAILs3C,GAAoBA,EACtBtmC,UAASqjC,eAAcvC,kBAAiByF,uBAC1C7mB,KAEA,MAA+D9xB,EAAAC,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxD04C,EAAgB54C,EAAA,GAAE64C,EAAmB74C,EAAA,GACiBK,EAAAJ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAtD44C,EAAez4C,EAAA,GAAE04C,EAAkB14C,EAAA,GAEpCvL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D0L,GAAWC,EAAAA,EAAAA,MAEXu4C,EAAW5mC,EAAQ6mC,mBAAqB30B,EAAAA,GAAgBgQ,oBACxDiR,GAAkB2T,EAAAA,EAAAA,IAAsB9mC,EAAStd,GACjDi+C,EAAcxN,EAAkB,cAAiBnzB,EAAQrW,SAAiBsR,aAC1E8rC,EACJ,iBAAkB/mC,EAAQrW,SAAWqW,EAAQrW,QAAQsR,cAAczC,SAAS,QAExEwuC,EACJtkD,EAAY+U,OAASwB,EAAAA,EAASC,UAC9B+tC,EAAAA,EAAAA,IAAuBvkD,EAAmCsd,GACtDknC,GACJC,EAAAA,EAAAA,IAA2BnnC,KAAkConC,EAAAA,GAAwBC,OAItFzsC,EAAA/M,IAF2BC,EAAAA,EAAAA,UAC1Bk5C,EAA0BX,GAAgB,GAAKA,GAAgB,IAChE,GAFM7G,EAAM5kC,EAAA,GAAE0sC,EAAS1sC,EAAA,GAG6C0D,EAAAzQ,IAArCC,EAAAA,EAAAA,UAAkC,IAAG,GAA9Dy5C,EAAQjpC,EAAA,GAAEkpC,EAAWlpC,EAAA,GAEtBmpC,EAAiB,CAACxuC,EAAAA,EAAS4C,UAAW5C,EAAAA,EAASqK,kBAAkB9K,SAAS9V,EAAY+U,MAEtFmrC,EAAkBznC,UACtB,MAAQusC,SAA2BnI,EAAmBv/B,EAAQ3d,GAAIm9C,EAAO3tC,QAAjE61C,iBACRF,EAAYE,EAAiB,GAG/BnyC,EAAAA,EAAAA,YAAU,KACRqtC,GAAiB,GAChB,CAACpD,KAEJjqC,EAAAA,EAAAA,YAAU,KACJyxC,GAAyBM,EAAUjB,GAAgB,GAAG,GACzD,CAAC3jD,EAAY+U,OAEhB,MAAMkwC,EAAmBA,KACvB/E,IACA9B,GAAgB,GAEZ2G,GACFhB,GAAoB,EACtB,EAGF,OACEl4C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACyyC,EAAyB,CACxBpwC,QAASA,IAAM83C,GAAoB,GACnC/3C,OAAQ83C,EACRxH,qBAAsBA,IAAMuH,GAAoB,MAElDj6C,EAAAA,EAAAA,KAACs7C,EAAAA,EAAS,CAACl5C,OAAQg4C,EAAiB/3C,QAASA,IAAMg4C,GAAmB,MACtEp4C,EAAAA,EAAAA,MAACgnC,GAAO,CAAC7V,IAAKA,EAAKr9B,GAAG,MAAKoK,SAAA,CAAC,YAChBk0C,KAEXuG,GACC34C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAAA,KAAA9B,SAAA,CAAG,mBACgBk0C,EAAY,qCAAmC,IAC/DiG,EAAW,kBAAoB,MAAM,YAGfh0C,IAAnBlQ,EAAYL,IAEZkM,EAAAA,EAAAA,MAACs5C,GAAW,CAAAp7C,SAAA,EACVH,EAAAA,EAAAA,KAAA,OAAAG,SAAK,uBACLH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACLjH,QAASA,KACP3B,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,IAAQ,EAC1CwD,SACH,eAMH42C,GAEA/2C,EAAAA,EAAAA,KAACo0C,EAA2B,CAC1BC,YAAaA,GAAe,cAC5B3gC,QAASA,EACT0Z,UAAWiuB,EACX7G,gBAAiBA,IAInB2G,GAEAn7C,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL3D,OAAO,gBACPtD,QAASoL,UACH4rC,QACsBe,EAAAA,EAAAA,IAAqB9nC,EAAQ3d,IACtCy+C,GAAgB,GAC1B6F,GAAmB,GAExB7F,GAAgB,EAClB,EACAr0C,SACH,2BAbL,MAqBJH,EAAAA,EAAAA,KAACy7C,GAAM,CAAAt7C,UACLH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,6BAGN86C,EAASvkD,OAAS,IACjBuL,EAAAA,EAAAA,MAACy5C,GAAM,CAAAv7C,SAAA,CAAC,YAENH,EAAAA,EAAAA,KAAC27C,EAAAA,GAAkB,CACjBv0C,QACEhR,EAAY+U,OAASC,EAAAA,EAAWC,QAC5B0uC,GACAA,GAAgBxjD,QAAQqlD,GAA4B,YAAjBA,EAAOr2C,QAEhDA,MAAO2tC,EACPrwC,SAAWC,GAAMk4C,EAAUl4C,SAIjC9C,EAAAA,EAAAA,KAAC67C,GAAS,CAAA17C,SACP86C,EAASplD,KAAKqgD,IACbl2C,EAAAA,EAAAA,KAACq2C,GAAc,CAEb3iC,QAASA,EACTwiC,QAASA,EACT3B,iBAAkB,EAClBgC,UAAWmE,EACX7T,gBAAiBA,EACjByP,gBAAiBA,GANZJ,EAAQngD,UAUlB,EAIP,QAAe+lD,EAAAA,EAAAA,YAAW9B,IAE1B,MAAMuB,GAAcn3C,EAAAA,GAAOC,GAAG;;;;;;gBAMdd,EAAAA,GAAOw4C;;;EAIjBL,GAASt3C,EAAAA,GAAOC,GAAG;;;;;IAKrBC,EAAAA,GAAM8I;EAEJ67B,GAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMqV;;;;;EAMJkiC,GAAYz3C,EAAAA,GAAOC,GAAG;;EAGtBo3C,GAASr3C,EAAAA,GAAOC,GAAG;;2GCnOlB,MAAM23C,EAAO,CAClB,CACE/3C,KAAM,8DACNb,KAAM,oCAER,CACEa,KAAM,8DACNb,KAAM,iCAER,CACEa,KAAM,0DACNb,KAAM,yCAER,CACEa,KAAM,mFACNb,KAAM,kDAER,CACEa,KAAM,yEACNb,KAAM,4CAER,CACEa,KAAM,uGACNb,KAAM,wDAER,CACEa,KAAM,6EACNb,KAAM,mCAIG64C,EAAkB,CAC7B,CACEh4C,KAAM,gFACNb,KAAM,mDAER,CACEa,KAAM,wEACNb,KAAM,0DAER,CACEa,KAAM,iEACNb,KAAM,oDAER,CACEa,KAAM,uEACNb,KAAM,2BAER,CACEa,KAAM,6FACNb,KAAM,kCAER,CACEa,KAAM,sGACNb,KAAM,4CAIG84C,EAAgB,CAC3B,CACEj4C,KAAM,wEACNb,KAAM,+FAER,CACEa,KAAM,iGACNb,KAAM,oEAER,CACEa,KAAM,8EACNb,KAAM,iDAER,CACEa,KAAM,2EACNb,KAAM,8CAER,CACEa,KAAM,6EACNb,KAAM,iDAIG+4C,EAAiC,CAC5C,CACE/4C,KAAM,mEACNa,KAAM,6EAER,CACEb,KAAM,sDACNa,KAAM,qFAER,CACEb,KAAM,8DACNa,KAAM,uGAER,CACEb,KAAM,iGACNa,KAAM,gIAIGm4C,EAAY,CACvB,CACEn4C,KAAM,kDACNb,KAAM,4DAER,CACEa,KAAM,2DACNb,KAAM,sHAER,CACEa,KAAM,yDACNb,KAAM,uEAER,CACEa,KAAM,4IACNb,KAAM,gH,eCnGV,MAAQi5C,EAAYC,EAAAA,GAAZD,QA4CR,MA1CoBE,EAAG7oC,cACrB,MAAM8oC,EAAc,IAAIR,GAEpBtoC,EAAQ+oC,YAAYC,iBACtBF,EAAY7lD,KAAK,CACfsN,KAAM,uCAAuCyP,EAAQ+oC,YAAYC,kBACjEt5C,KAAM,gDAIV,MAAMu5C,EAAejpC,EAAQhF,MAAMxC,SAAS,cACtC0wC,EAAYlpC,EAAQ4L,KAAKpT,SAC7B,8EAEI2wC,EAA4C,qBAAjBnpC,EAAQ4L,KACnCw9B,EAAgBppC,EAAQrW,QAAQtH,KAAOsmD,EAE7C,IAAIU,EAAOP,EAWX,OAVIG,EACFI,EAAOd,EACEW,EACTG,EAAOb,EACEW,EACTE,EAAOZ,EACEW,IACTC,EAAOX,IAIPn6C,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAACipC,EAAO,CAAA9oC,SAAC,+BACR48C,EAAKlnD,KAAKmnD,IACTh9C,EAAAA,EAAAA,KAAA,OAAAG,UACEH,EAAAA,EAAAA,KAAC41C,EAAAA,GAAQ,CAACnrC,GAAI,CAAEsB,SAAUixC,EAAI/4C,MAAQqqC,KAAMhqC,EAAAA,GAAM8I,UAAW6vC,QAAM,EAAA98C,SAChE68C,EAAI55C,QAFC45C,EAAI/4C,UAMN,EAMhB,MAAMhE,EAAYmE,EAAAA,GAAOC,GAAG;sBACNd,EAAAA,GAAO4N;;;;;;;EAQvB83B,EAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAM+L;;6KCrDK,SAAS6sC,GAAa,QACnCxpC,EAAO,aACPypC,GAAe,EAAI,cACnBC,GAAgB,EAAI,WACpBC,EAAU,WACVC,IAEA,MAAMjgD,EAAUqW,EAAQrW,QAExB,GAAIqW,EAAQw5B,cAAgB,kBAAmB7vC,EAAS,OAAO,KAE/D,IAAIkgD,EAAwC,GACxC,wBAAyB7pC,IAC3B6pC,EAAoB7pC,EAAQ8pC,qBAG9B,IAAIC,EAAkDF,EAAkBhnD,QAAQmnD,IAC9E/C,EAAAA,EAAAA,IAAuB+C,EAAUhqC,KAEnC+pC,GAA8BE,EAAAA,EAAAA,GAAwBF,GACtDA,EAA8BA,EAA4BG,MACxD,CAACrtC,EAAGstC,IACFvqB,QAAOwqB,EAAAA,EAAAA,IAA0BD,EAAGnqC,KAAaqqC,EAAAA,EAASC,cAC1D1qB,QAAOwqB,EAAAA,EAAAA,IAA0BvtC,EAAGmD,KAAaqqC,EAAAA,EAASC,gBAG9D,MAAM56C,EAAOi6C,GAAchgD,EAAQnD,YAEnC,OACE+H,EAAAA,EAAAA,MAAChC,EAAS,CAAC,cAAY,oBAAoBq9C,WAAYA,EAAWn9C,SAAA,CAC/DmzB,OAAOlwB,GAAM1M,QAAU,IACtBuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACipC,EAAO,CAAClzC,GAAG,aAAaqnD,cAAeA,EAAcj9C,SAAC,gBAGvDH,EAAAA,EAAAA,KAAA,OAAAG,SACGk9C,GACCY,EAAAA,EAAAA,IAAmB76C,IAEnBnB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACG89C,EAAAA,EAAAA,IAAmB76C,GAAM,QAE1BpD,EAAAA,EAAAA,KAAC41C,EAAAA,GAAQ,CACPnrC,GAAI,YAAYpN,EAAQ+iB,aACxB9c,MAAOC,EAAAA,GAAOC,UACd8qC,KAAMhqC,EAAAA,GAAMkU,SACZ0lC,WAAS,EACTjB,QAAM,EAAA98C,SACP,uBAQVs9C,EAA4B/mD,OAAS,IACpCuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACipC,EAAO,CAACmU,eAAa,EAAAj9C,SAAC,eACvBH,EAAAA,EAAAA,KAACm+C,EAAS,CAAChB,aAAcA,EAAah9C,SACnCs9C,EAA4B5nD,KAAKuxC,IAChCpnC,EAAAA,EAAAA,KAACiG,EAAAA,GAAW,CAEVC,KAAMkhC,EACNzkC,KAAK,KACLilC,SAAUj7B,EAAAA,EAASC,SAHd,YAAcw6B,EAAOrxC,aAW1C,CAEA,MAAMkK,EAAYmE,EAAAA,GAAOC,GAAG;IACxBC,EAAAA,GAAMuG;iBACO,EAAGyyC,gBAAiBA,GAAc;;;;EAK7CrU,EAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMyI;IACN,EAAGqwC,mBAAoBA,GAAiB;;EAGtCe,EAAY/5C,EAAAA,GAAOC,GAAG;;;;IAIxB,EAAG84C,kBACHA,GACA,WACIlwC,EAAAA,GAAkBmxC;6zDC/F1B,MAAMp2B,EAAa,oCA+FnB,MA7FsEq2B,EACpEj8C,SACAC,UACAi8C,aACA5qC,UACA6qC,gBAAgB,CAAC,EACjB3vC,eAEA,MAAmFtN,EAAAC,GAAvCC,EAAAA,EAAAA,eAA6B8E,GAAU,GAA5Ek4C,EAAcl9C,EAAA,GAAEm9C,EAAiBn9C,EAAA,GACcK,EAAAJ,GAApBC,EAAAA,EAAAA,UAAiB,IAAG,GAA/Ck9C,EAAS/8C,EAAA,GAAEg9C,EAAYh9C,EAAA,GAGxBi9C,EAAmBA,KACvBH,OAAkBn4C,GAClBq4C,EAAa,IACbt8C,GAAS,EAmBL+E,EAAUk3C,GACZ5xC,EAAAA,EAAAA,GAAE,CAACsb,EAAY,4BACftb,EAAAA,EAAAA,GAAE,CAACsb,EAAY,+BAEb9tB,EAAcokD,GAChB5xC,EAAAA,EAAAA,GAAE,CAACsb,EAAY,gCACftb,EAAAA,EAAAA,GAAE,CAACsb,EAAY,mCAEb62B,EAAqC,UAAnBL,EAClBM,GAAoBN,GAAmBK,IAAoBH,EAAUpb,OAE3E,OACEtjC,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CAACC,OAAQA,EAAQC,QAASu8C,EAAkB/gD,MAAM,QAAOsC,UAClE8B,EAAAA,EAAAA,MAACO,EAAY,CAAArC,SAAA,EACTm+C,IACAt+C,EAAAA,EAAAA,KAAC++C,EAAS,CAAA5+C,UACRH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,YAAY8M,MAAOC,EAAAA,GAAOy7C,YAAar8C,KAAK,UAI3D3C,EAAAA,EAAAA,KAACoR,EAAM,CAAAjR,UAAEuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,oBAExBhoB,EAAAA,EAAAA,KAACm+B,EAAS,CAAAh+B,SAAEjG,KACZ+H,EAAAA,EAAAA,MAACsoB,EAAgB,CAAApqB,SAAA,EACb7H,MAAMg+B,QAAQlvB,GAAWA,EAAU,IAAIvR,KAAK+lD,IAC5C57C,EAAAA,EAAAA,KAACi/C,EAAY,CAEXh0B,WAAYuzB,IAAmB5C,EAC/Bn4C,QAASA,IAAMg7C,EAAkB7C,GAAQz7C,SAExCy7C,GAJIA,KAQRiD,IACC7+C,EAAAA,EAAAA,KAACk/C,EAAkB,CAAA/+C,UACjBH,EAAAA,EAAAA,KAAC6uC,EAAS,CACR57B,aAAavG,EAAAA,EAAAA,GAAE,CAACsb,EAAY,wBAC5BziB,MAAOm5C,EACP77C,SAAWC,GAAM67C,EAAa77C,EAAEE,OAAOuC,OACvC0/B,WAAS,UAMjBhjC,EAAAA,EAAAA,MAACk9C,EAAY,CAAAh/C,SAAA,EACXH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACnD,QAAQ,YAAY9D,QAASm7C,EAAkBj8C,KAAK,KAAIxC,UAC7DuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,kBAElBhoB,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACnD,QAAQ,UAAU9D,QAlEb27C,KACnB,MAAMC,EAAkC,UAAnBb,EAA6B,UAAUE,IAAcF,GAE1ElnC,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBs+B,O,+VAAM9hD,CAAA,CAC3Bk2B,gBAAiB,yBACjBxS,aAAc6mC,EAAa,iBAAmB,qBAC9CxJ,aAAcphC,EAAQ4L,KACtBggC,gBAAiBD,GACdd,IAGL3vC,IAAWywC,GAEXT,GAAkB,EAqDqCzuC,SAAU2uC,EAAkBn8C,KAAK,KAAIxC,UACnFuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,0BAIX,EAMjB,MAAMxlB,EAAe4B,EAAAA,GAAOC,GAAG;;;;;;;EASzB06C,EAAY36C,EAAAA,GAAOC,GAAG;;EAItB+M,EAAShN,EAAAA,GAAOgrB,EAAE;IACpB9qB,EAAAA,GAAMi7C;;WAECh8C,EAAAA,GAAOi8C;EAGZrhB,EAAY/5B,EAAAA,GAAOtO,CAAC;IACtBwO,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOyD;;;EAKZujB,EAAmBnmB,EAAAA,GAAOC,GAAG;;;;;;EAQ7B46C,EAAe76C,EAAAA,GAAOoe,MAA+B;;;sBAGpCzX,GAAWA,EAAMkgB,WAAa1nB,EAAAA,GAAOk8C,SAAWl8C,EAAAA,GAAO4N;sBACvDpG,GAAWA,EAAMkgB,WAAa1nB,EAAAA,GAAOmoB,cAAgB;;IAExEpnB,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOy7C;;;;;oBAKEz7C,EAAAA,GAAOm8C;wBACF30C,GAAWA,EAAMkgB,WAAa1nB,EAAAA,GAAOmoB,cAAgBnoB,EAAAA,GAAOwE;;EAI/Em3C,EAAqB96C,EAAAA,GAAOC,GAAG;;;EAK/BwqC,EAAYzqC,EAAAA,GAAOoN,KAAK;;;;sBAIRjO,EAAAA,GAAO4N;IACzB7M,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOy7C;;;;oBAIEz7C,EAAAA,GAAOm8C;;EAIrBP,EAAe/6C,EAAAA,GAAOC,GAAG;;;;;oHCvLxB,MAAM8wC,EAAkB,CAC7BwK,SAAU,CACRC,eACE39C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,sBACHH,EAAAA,EAAAA,KAAA,OAAAG,SAAK,sDAGT0/C,WACE59C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,sBACH8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CAAK,0GAEW,KACdH,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,gBAAgBf,MAAO,CAAEwG,eAAgB,YAAa5M,MAAO,SAAUnD,SAAC,0BAOzF2/C,cACE79C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,0BACHH,EAAAA,EAAAA,KAAA,OAAAG,SAAK,oG,4/DCqDX,MAAM6nB,EAAa,oCAwInB,MAtIoE+3B,EAClErsC,UACA6qC,gBAAgB,CAAC,EACjB51B,iBAEA,MAA4ErnB,EAAAC,GAAxCC,EAAAA,EAAAA,eAA8B8E,GAAU,GAArEg4C,EAAUh9C,EAAA,GAAE0+C,EAAa1+C,EAAA,GACiBK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA1Cy+C,EAASt+C,EAAA,GAAEu+C,EAAYv+C,EAAA,GAExBG,GAAWC,EAAAA,EAAAA,MACX3L,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D+pD,EAAa5pC,QAAQngB,EAAYL,IAEvCqqD,EAjEF,SAA+B7d,EAAmB4d,GAChD,MAGCE,EAAA9+C,GAH6C++C,EAAAA,EAAAA,GAC5C,sBAAsB/d,IACtB,MACD,GAHMge,EAAeF,EAAA,GAAEG,EAAkBH,EAAA,GAKpCtzB,GAAcC,EAAAA,EAAAA,MACdQ,EAAW,CAAC,wBAAyB+U,EAAW4d,EAAYI,GAsClE,MAAO,CACLE,cArCkCxvB,EAAAA,EAAAA,GAAS,CAC3CzD,SAAUA,EACV0D,QAASriB,UACP,GAAIsxC,EAAY,CACd,MAAMO,QAAmBC,EAAAA,EAAAA,IAAyBpe,GAClD,OAAOme,GAAYE,eAAiB,IACtC,CACA,OAAOL,CAAe,IAPlBvxC,KAsCN6xC,gBA3BiC3zB,EAAAA,EAAAA,GAAY,CAC7CC,WAAYte,OAAS4xC,eAAcK,aACjC,GAAIX,EACF,OAAOY,EAAAA,EAAAA,IAA4B,CACjCxe,YACAke,eACAO,OAAQC,EAAAA,EAA4BC,YACpCJ,WAGJN,EAAmBC,EAAa,EAElCrzB,UAAWA,KACTL,EAAYQ,kBAAkBC,EAAS,EAEzCC,QAAUpe,IACRoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,0CACfD,EAAKkkC,QAAQ,CACXtV,UAAWphB,OAAOohB,IAClB,GACF,IArBE7U,OA6BV,CAgB2CyzB,CAAsBztC,EAAQ3d,GAAIoqD,GAAnEM,EAAYL,EAAZK,aAAcI,EAAcT,EAAdS,eA+DtB,OACE5+C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAACm/C,EAAc,CAAAjhD,SAAA,EACbH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,QAAQ8M,MAAOC,EAAAA,GAAOy7C,YAAar8C,KAAK,QACnD3C,EAAAA,EAAAA,KAACqhD,EAAW,CAAAlhD,UAAEuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,iBAE/BhoB,EAAAA,EAAAA,KAACshD,EAAY,CAAAnhD,UAAEuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,gBAC9B/lB,EAAAA,EAAAA,MAACwP,EAAe,CAAAtR,SAAA,EACdH,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CACN7rC,SAAS,OACT6D,aAAa,QACb+5C,aAAa,OACbnM,eAAgB,OAChB7/B,QAAS4/B,EAAgBwK,SAASC,cAGlCz/C,UAEA8B,EAAAA,EAAAA,MAACu/C,EAAc,CACb/9C,QAjFgBg+C,KACtBhB,KAEJnpC,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAKzjB,EAAA,CAC1Bk2B,gBAAiB,wBACjBxS,aAAc,kBACdq9B,aAAcphC,EAAQ4L,KACtBoiC,aAAcvB,GACX5B,IAGA51B,EAIHk4B,EAAe,CAAEJ,cAAc,KAH/BT,GAAc,GACdE,GAAa,IAGf,EAkEUyB,UAAWlB,EACX,cAAY/zC,EAAAA,EAAAA,GAAE,CAACsb,EAAY,gCAAgC7nB,SAAA,EAE3DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,YAAY8M,MAAOC,EAAAA,GAAOk8C,SAAU98C,KAAK,QACnD+J,EAAAA,EAAAA,GAAE,CAACsb,EAAY,gCAGpBhoB,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CACN7rC,SAAS,OACT6D,aAAa,QACb4tC,eAAe,OACfmM,aAAa,OACbhsC,QAAS4/B,EAAgB2K,aAAa3/C,UAEtC8B,EAAAA,EAAAA,MAAC2/C,EAAiB,CAChBn+C,QA9EmBo+C,MACR,IAAjBpB,KAEJnpC,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAKzjB,EAAA,CAC1Bk2B,gBAAiB,wBACjBxS,aAAc,sBACdq9B,aAAcphC,EAAQ4L,KACtBoiC,aAAcvB,GACX5B,IAGLyB,GAAc,GACdE,GAAa,GAAK,EAmERyB,WAA4B,IAAjBlB,EACX,cAAY/zC,EAAAA,EAAAA,GAAE,CAACsb,EAAY,oCAAoC7nB,SAAA,EAE/DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,QAAQ8M,MAAOC,EAAAA,GAAOyD,YAAarE,KAAK,QAClD+J,EAAAA,EAAAA,GAAE,CAACsb,EAAY,0CAMxBhoB,EAAAA,EAAAA,KAACq+C,EAAsB,CACrB3qC,QAASA,EACTtR,OAAQ69C,EACR3B,WAAYA,EACZC,cAAeA,EACfl8C,QA3DmBy/C,KACvB5B,GAAa,GACRC,GACHr+C,GAASigD,EAAAA,EAAAA,MACX,EAwDInzC,SAhFwBkyC,SACTx6C,IAAfg4C,KAEJhnC,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBs+B,OAAM9hD,EAAA,CAC3Bk2B,gBAAiB,wBACjBxS,aAAc6mC,EAAa,oBAAsB,wBACjDxJ,aAAcphC,EAAQ4L,KACtBggC,gBAAiBwB,EACjBY,aAAcvB,GACX5B,IAGLsC,EAAe,CAAEJ,aAAcnC,EAAYwC,WAC3CZ,GAAa,GAERC,GACHr+C,GAASigD,EAAAA,EAAAA,OACX,MAiEG,EAMP,MAAM9hD,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;EAQtB+8C,EAAiBh9C,EAAAA,GAAOC,GAAG;;;;;EAO3Bg9C,EAAcj9C,EAAAA,GAAOC,GAAG;IAC1BC,EAAAA,GAAM+L;WACC9M,EAAAA,GAAOi8C;EAGZ8B,EAAel9C,EAAAA,GAAOC,GAAG;IAC3BC,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOyD;;EAIZyK,EAAkBrN,EAAAA,GAAOC,GAAG;;;;EAM5B29C,EAAa59C,EAAAA,GAAOoe,MAAM;;;;;;;;;;;sBAWVjf,EAAAA,GAAO4N;sBACP5N,EAAAA,GAAOY;;gBAEbgE,EAAAA,GAAO85C;;WAEZ1+C,EAAAA,GAAOk8C;;IAEdn7C,EAAAA,GAAM49C;EAGJV,GAAiBp9C,EAAAA,EAAAA,IAAO49C,EAAoC;WACvDz+C,EAAAA,GAAOk8C;gBACFl8C,EAAAA,GAAOY;;;;;;sBAMDZ,EAAAA,GAAO4N;;;IAGxBpG,GACDA,EAAM42C,WACN,qBACcp+C,EAAAA,GAAOsnB,0CACDtnB,EAAAA,GAAOk8C;EAKzBmC,GAAoBx9C,EAAAA,EAAAA,IAAO49C,EAAoC;WAC1Dz+C,EAAAA,GAAOyD;gBACFzD,EAAAA,GAAOY;;;;;;sBAMDZ,EAAAA,GAAO4N;;;;IAIxBpG,GACDA,EAAM42C,WACN,qBACcp+C,EAAAA,GAAO6U,uCACD7U,EAAAA,GAAOyD;0rCCpS/B,MAAMm7C,EAAkB,KAMT,SAASjvB,GAAO,QAAExf,EAAO,UAAEyS,GAAY,IACpD,MAAM1C,GAAWzhB,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMmK,OAAO2lB,WAE1D2+B,EAAmB,kBAAmB1uC,EAAQrW,SAAWqW,EAAQw5B,aACjEmV,EAAQ3uC,EAAQ6mC,mBAAqB30B,EAAAA,GAAgBgQ,oBACrD0sB,EAAW5uC,EAAQ+oC,YACnB8F,EAAuB7uC,EAAQrW,QAAQtH,KAAOosD,EAE9CK,EACHH,GAASC,EAASG,aAAa9nD,KAAQ+Y,EAAQgvC,wBAAwBD,aAAa9nD,IACjFgoD,EC5BO,SAA4Blb,GACzC,MAAmDnmC,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA5CohD,EAAUthD,EAAA,GAAEuhD,EAAavhD,EAAA,GAWhC,OATA2H,EAAAA,EAAAA,YAAU,KACR,GAAIw+B,EAAU,CACZ,MAAM78B,EAAM,IAAIT,MAChBS,EAAIk4C,OAAS,IAAMD,GAAc,GACjCj4C,EAAIm4C,QAAU,IAAMF,GAAc,GAClCj4C,EAAIR,IAAMq9B,CACZ,IACC,CAACA,IAEGmb,CACT,CDe0BI,CAAmBR,GAE3C,OACEvgD,EAAAA,EAAAA,MAAChC,EAAS,CAACuiD,mBAAoBG,GAAmBH,EAAoBr8B,UAAWA,EAAUhmB,SAAA,EACzF8B,EAAAA,EAAAA,MAACghD,EAAM,CAAC98B,UAAWA,EAAUhmB,SAAA,EAC3B8B,EAAAA,EAAAA,MAACihD,EAAgB,CACf9hC,IACGghC,GAAoBG,GAAyBF,IAAUC,EAASa,iBACjE,MAEF14C,IACG23C,IACAG,IACCF,GAASC,EAASa,iBAAoBd,IACxC,YAAa3uC,EAAQrW,QAA2B+iB,aAElD+F,UAAWA,EACX,cAAY,eAAchmB,SAAA,EAE1BH,EAAAA,EAAAA,KAACunC,EAAAA,GAAa,CACZE,SAAU,WAAY/zB,EAAQrW,QAAUqW,EAAQrW,QAAQqqC,OAAO/sC,IAAM,KACrE6sC,UAAW4a,EACXz/C,KAAM8gB,EAAW,KAAO,OAEzB2+B,EACI1uC,EAAQrW,QAAgC6pC,eAAiB,kBACzDxzB,EAAQrW,QAA2BsR,aACvC+E,EAAQrW,QAAQ+lD,sBAAwBC,EAAAA,GAA0BC,WACjEtjD,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAWmM,KAAK,KAAKoE,OAAO,cAAczD,MAAOC,EAAAA,GAAOggD,iBAEpEnB,IACCpiD,EAAAA,EAAAA,KAACwvC,EAAAA,EAAO,CACNj6B,SACEtT,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,8HAGAH,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,KACEiE,KAAK,wEACLjB,OAAO,SACPs7B,IAAI,sBAAqBn+B,SAC1B,mBAKLwD,SAAS,QACT6D,aAAa,QACbg8C,YAAY,EACZC,UAAU,EACVrO,eAAe,OAAMj1C,UAErBH,EAAAA,EAAAA,KAAC0jD,EAAW,CAAAvjD,UACVH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,gBAAgBmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOm8C,kBAK1D2C,IAASriD,EAAAA,EAAAA,KAAC2jD,EAAa,CAACx9B,UAAWA,EAAUhmB,SAAEmiD,EAASsB,qBAE3D5jD,EAAAA,EAAAA,KAACyM,EAAK,CAACiC,MAAOgF,EAAQhF,MAAOyX,UAAWA,EAAW,cAAY,YAAWhmB,SACvEuT,EAAQhF,QAEVgF,EAAQgvC,wBACP1iD,EAAAA,EAAAA,KAAC6jD,EAAqB,CAACp5C,GAAI,gBAAgBiJ,EAAQgvC,uBAAuBpjC,OAAOnf,SAC9EuT,EAAQgvC,uBAAuBlsD,QAGlCwJ,EAAAA,EAAAA,KAAA,YAIR,CAEA,MAAMC,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;;gBAOZ,EAAGm+C,wBACfA,EAAqB,OAAOA,KAAwB;;;EAIlDS,EAAS7+C,EAAAA,GAAOC,GAAG;;;;IAIrB,EAAG8hB,gBACFA,GACD,SACElZ,EAAAA,GAAkB8M;EAOlBmpC,GAAmB9+C,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;WAI1BjH,EAAAA,GAAOY;IACdG,EAAAA,GAAMw/C;;aAEGvgD,EAAAA,GAAOY;;;EAIdw/C,EAAgBv/C,EAAAA,GAAOC,GAAG;WACrBd,EAAAA,GAAOY;IACdG,EAAAA,GAAMi7C;IACN,EAAGp5B,gBACFA,GACD,SACElZ,EAAAA,GAAkBD,+BAChB1I,EAAAA,GAAM8I;EAIRX,EAAQrI,EAAAA,GAAOC,GAAG;;IAEpB,EAAGqK,WACCA,EAAMhY,OAAS,GAAW4N,EAAAA,GAAMy/C,cAC7Bz/C,EAAAA,GAAM0/C;;WAGNzgD,EAAAA,GAAOY;;;;IAId,EAAGgiB,YAAWzX,YACbyX,GACD,sBAEQzX,EAAMhY,OAAS,GAAW,GACvB;EAUTmtD,GAAwBz/C,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;;;sBAMpBjH,EAAAA,GAAO0gD;;WAElB1gD,EAAAA,GAAOY;IACdG,EAAAA,GAAMC;;aAEGhB,EAAAA,GAAOY;wBACIZ,EAAAA,GAAO67B;;;EAKzBskB,EAAct/C,EAAAA,GAAOC,GAAG;;;;;;;k0EE9F9B,MAAM2jB,EAAa,oCAqFnB,MAnFoE+3B,EAClErsC,UACA6qC,gBAAgB,CAAC,EACjB2F,aACAC,mBAEA,MAAM/tD,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D+pD,EAAa5pC,QAAQngB,EAAYL,IAEvCqqD,EApFF,SAA+B1sC,EAAyBysC,GACtD,MAGCE,EAAA9+C,GAH6C++C,EAAAA,EAAAA,GAC5C,sBAAsB5sC,EAAQ3d,KAC9B,MACD,GAHMwqD,EAAeF,EAAA,GAAEG,EAAkBH,EAAA,GAKpCtzB,GAAcC,EAAAA,EAAAA,MACdQ,EAAW,CAAC,wBAAyB9Z,EAAQ3d,GAAIoqD,EAAYI,GA2DnE,MAAO,CACLE,cA1DkCxvB,EAAAA,EAAAA,GAAS,CAC3CzD,WACA0D,QAASriB,UACP,GAAIsxC,EAAY,CACd,MAAMO,QAAmBC,EAAAA,EAAAA,IAAyBjtC,EAAQ3d,IAC1D,OAAO2qD,GAAYE,eAAiB,IACtC,CACA,OAAOL,CAAe,EAExB6D,YAAa1wC,EAAQ2wC,yBAAyBzD,cAI9C0D,UAAWC,MAbLv1C,KA2DN6xC,gBA3CiC3zB,EAAAA,EAAAA,GAAY,CAC7CC,WAAYte,UACV,GAAIsxC,EACF,OAAOY,EAAAA,EAAAA,IAA4B,CACjCxe,UAAW7uB,EAAQ3d,GACnB0qD,eACAO,OAAQC,EAAAA,EAA4BuD,kBAExChE,EAAmBC,EAAa,EAElCrzB,UAAWA,KACTL,EAAYQ,kBAAkBC,EAAS,EAEzCC,QAAUpe,IACRoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,wCACfD,EAAKkkC,QAAQ,CACXtV,UAAWphB,OAAOzN,EAAQ3d,KAC1B,GACF,IAnBE23B,OA4CN+2B,gBArBiCv3B,EAAAA,EAAAA,GAAY,CAC7CC,WAAYte,UACV,GAAIsxC,EAAY,OAAOuE,EAAAA,EAAAA,IAA4BhxC,EAAQ3d,IAC3DyqD,EAAmB,KAAK,EAE1BpzB,UAAWA,KACTL,EAAYQ,kBAAkBC,EAAS,EAEzCC,QAAUpe,IACRoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,wCACfD,EAAKkkC,QAAQ,CACXtV,UAAWphB,OAAOzN,EAAQ3d,KAC1B,GACF,IAdE23B,OAuBV,CAa2DyzB,CACvDztC,EACAysC,GAFMM,EAAYL,EAAZK,aAAcI,EAAcT,EAAdS,eAAgB4D,EAAcrE,EAAdqE,eAsDtC,OALAx7C,EAAAA,EAAAA,YAAU,MACa,IAAjBw3C,EAAwByD,IACvBC,GAAc,GAClB,CAAC1D,KAGFx+C,EAAAA,EAAAA,MAACwP,EAAe,CAAAtR,SAAA,EACdH,EAAAA,EAAAA,KAACwhD,EAAc,CACb/9C,QApDuBX,IAC3BA,EAAEgM,iBACFhM,EAAE2E,mBAEF6P,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAKzjB,EAAA,CAC1Bk2B,gBAAiB,wBACjBxS,aAAc,kBACdq9B,aAAcphC,EAAQ4L,KACtBoiC,aAAcvB,GACX5B,IAGLsC,GAAe,GAEf5wC,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACGuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,oBAAqB,KACrChoB,EAAAA,EAAAA,KAACo5C,EAAU,CAAC31C,QAASghD,EAAetkD,UAAEuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,sBAExD,EAkCG25B,UAAWlB,EACX,cAAY/zC,EAAAA,EAAAA,GAAE,CAACsb,EAAY,gCAAgC7nB,UAE3DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,YAAY8M,MAAOC,EAAAA,GAAOk8C,SAAU98C,KAAK,UAEtD3C,EAAAA,EAAAA,KAAC4hD,EAAiB,CAChBn+C,QArC0BX,IAC9BA,EAAEgM,iBACFhM,EAAE2E,mBAEF6P,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAKzjB,EAAA,CAC1Bk2B,gBAAiB,wBACjBxS,aAAc,sBACdq9B,aAAcphC,EAAQ4L,KACtBoiC,aAAcvB,GACX5B,IAGLsC,GAAe,GAEf5wC,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACGuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,wBAAyB,KACzChoB,EAAAA,EAAAA,KAACo5C,EAAU,CAAC31C,QAASghD,EAAetkD,UAAEuM,EAAAA,EAAAA,GAAE,CAACsb,EAAY,sBAExD,EAmBG25B,WAA4B,IAAjBlB,EACX,cAAY/zC,EAAAA,EAAAA,GAAE,CAACsb,EAAY,oCAAoC7nB,UAE/DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,QAAQ8M,MAAOC,EAAAA,GAAOyD,YAAarE,KAAK,WAErC,EAMtB,MAAM8O,EAAkBrN,EAAAA,GAAOC,GAAG;;;EAK5B29C,EAAa59C,EAAAA,GAAOoe,MAAM;;;;;;;sBAOVjf,EAAAA,GAAO4N;sBACP5N,EAAAA,GAAOY;;gBAEbgE,EAAAA,GAAO85C;EAGjBT,GAAiBp9C,EAAAA,EAAAA,IAAO49C,EAAoC;;;sBAG5Cz+C,EAAAA,GAAO4N;;;IAGxBpG,GACDA,EAAM42C,WACN,qBACcp+C,EAAAA,GAAOsnB,0CACDtnB,EAAAA,GAAOk8C;EAIzBmC,GAAoBx9C,EAAAA,EAAAA,IAAO49C,EAAoC;;;sBAG/Cz+C,EAAAA,GAAO4N;;;;IAIxBpG,GACDA,EAAM42C,WACN,qBACcp+C,EAAAA,GAAO6U,uCACD7U,EAAAA,GAAOyD;EAIzBoyC,EAAah1C,EAAAA,GAAOoe,MAAM;;;;;;qCC7HhC,MAxFsBmiC,EACpBjxC,UACAkxC,kBACAC,gBACAC,+BAA8B,MAE9B,MAAM1uD,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/D2uD,EAAuB,CAC3BC,YAAYhlD,EAAAA,EAAAA,KAACilD,EAAM,CAAC3hD,MAAOC,EAAAA,GAAOykC,OAAO7nC,SAAC,iBAC1CqJ,QACEvH,EAAAA,EAAAA,MAACgjD,EAAM,CAAC3hD,MAAOC,EAAAA,GAAO2hD,UAAU/kD,SAAA,CAAC,YACrB0N,IAAM6F,EAAQ+oC,YAAY0I,UAAY,GAAGr3C,OAAO,YAG9Ds3C,aAAaplD,EAAAA,EAAAA,KAACilD,EAAM,CAAC3hD,MAAOC,EAAAA,GAAO8hD,YAAYllD,SAAC,aAChDmlD,cAActlD,EAAAA,EAAAA,KAACilD,EAAM,CAAC3hD,MAAOC,EAAAA,GAAO8hD,YAAYllD,SAAC,cAGnD,GAAIuT,EAAQ6mC,mBAAqB30B,EAAAA,GAAgB8P,KAAOhiB,EAAQ+oC,YAAY8I,SAAU,CACpF,MAAMC,GACJvjD,EAAAA,EAAAA,MAACgjD,EAAM,CAAC3hD,MAAOC,EAAAA,GAAO2hD,UAAU/kD,SAAA,EAC9BH,EAAAA,EAAAA,KAACylD,EAAAA,GAAiB,CAACllC,OAAO,UAAU,iCAKxCwkC,EAAqBv7C,OAASg8C,EAC9BT,EAAqBK,YAAcI,CACrC,CAEA,IAAIE,EAAmB,YACnBC,EAA8B,MAClC,GAAQjyC,EAAQ6mC,mBACT30B,EAAAA,GAAgBC,mBACnB6/B,EAAmB,UACnBC,EAAoB,sBAIxB,MAAMC,GACJC,EAAAA,EAAAA,IAAanyC,KAAaoyC,EAAAA,GAAUC,aAAe3vD,EAAY+U,OAASwB,EAAAA,EAASC,QAEnF,OACE3K,EAAAA,EAAAA,MAAChC,EAAS,CAAC,cAAY,SAAQE,SAAA,EAC3B2kD,IAAgCc,IAChC5lD,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CACFrjD,KAAK,KACLoL,gBAAiBxK,EAAAA,GAAOsnB,eACxBvnB,MAAOC,EAAAA,GAAO67B,SACdkP,KAAMhqC,EAAAA,GAAMC,WACZgR,QAASmwC,EACTriD,SAAUsiD,KAGbM,EAAAA,EAAAA,IAAiBvyC,EAASqxC,GAC1BD,GACC9kD,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACLnD,QAAQ,wBACR5E,KAAK,KACLc,QAASA,MACP6T,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,gBACjBxS,aAAc,yBACdq9B,aAAcphC,EAAQ4L,MACtB,EACFnf,SACH,uBAIDylD,IACChB,GACC3iD,EAAAA,EAAAA,MAACikD,EAAO,CAAA/lD,SAAA,EACNH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAU8M,MAAOC,EAAAA,GAAO0lB,MAAOtmB,KAAK,OAAO,yBAIxDV,EAAAA,EAAAA,MAACkkD,EAAQ,CAAAhmD,SAAA,EACPH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAO8M,MAAOC,EAAAA,GAAOC,aAChCxD,EAAAA,EAAAA,KAAComD,EAAY,CAACvB,cAAeA,EAAc1kD,SAAC,oBAIxC,EAMhB,MAAMF,EAAYmE,EAAAA,GAAOC,GAAG;;;;;0BAKFd,EAAAA,GAAOsE;IAC7BvD,EAAAA,GAAMC;EAEJ0gD,EAAS7gD,EAAAA,GAAOC,GAAG;;;;WAId,EAAGf,WAAYA;EAEpB4iD,EAAU9hD,EAAAA,GAAOC,GAAG;;;;WAIfd,EAAAA,GAAO0lB;EAEZk9B,EAAW/hD,EAAAA,GAAOC,GAAG;;;;WAIhBd,EAAAA,GAAOC;;;;;;EAOZ4iD,EAAehiD,EAAAA,GAAOuP,IAAI;;;;;;;IAO5B,EAAGkxC,mBACHA,GACA;IAIA53C,EAAAA,GAAkB8M;;;;kgCC7BtB,MAtGgBssC,EAAG3yC,UAASjQ,UAASqhD,+BAA8B,EAAOwB,eACxE,MAAyDhlD,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAlDqjD,EAAavjD,EAAA,GAAEilD,EAAgBjlD,EAAA,GACaK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA5CglD,EAAU7kD,EAAA,GAAE8kD,EAAa9kD,EAAA,GAE1BvL,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE7DsY,EAAoDgF,EAApDhF,MAAOrR,EAA6CqW,EAA7CrW,QAAS4Q,EAAoCyF,EAApCzF,YAAaE,EAAuBuF,EAAvBvF,mBAErCu4C,GAAiDC,EAAAA,EAAAA,GAAiBjzC,EAAQ3d,IAAlE6wD,EAAmBF,EAAnBE,oBAAqBhC,EAAe8B,EAAf9B,gBAc7B,IAAI5qB,EAIFA,EAHG5jC,GAAaL,GAEPK,EAAY+U,OAASwB,EAAAA,EAASqK,iBAC5B/I,EAEAE,EAJA,IAAKF,GAAe,MAASE,GAAsB,IAOhE6rB,EAAW1hC,MAAMC,KAAK,IAAIC,IAAIwhC,IAE9B,MAAM6sB,GAAehM,EAAAA,EAAAA,IAA2BnnC,KAAaonC,EAAAA,GAAwBiL,YAC/Eve,GAAYgT,EAAAA,EAAAA,IAAsB9mC,EAAStd,GAE3C0wD,EAAWD,GAAgB/B,EAA8BiC,EAAmBC,EAElF,OACEhnD,EAAAA,EAAAA,KAACinD,EAAW,CAACT,WAAYA,EAAWrmD,UAClCH,EAAAA,EAAAA,KAAC8mD,EAAQ,CACPr8C,GAAI,CACFsB,UAAUm7C,EAAAA,EAAAA,IAAmBxzC,GAC7B4yC,YACAnmD,UAEF8B,EAAAA,EAAAA,MAACipB,EAAAA,GAAI,CACH1R,QAAQ,MACR2tC,iBAAe,EACf1jD,QAASA,GAvCI2jD,OACfvM,EAAAA,EAAAA,IAA2BnnC,KAAaonC,EAAAA,GAAwBiL,cAEpEa,KAEAtvC,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,2BACdwS,gBAAiB,aACjBo9B,WAAW,IACX,GA+BI5xC,aAAcA,IAAM8wC,GAAiB,GACrC7wC,aAAcA,IAAM6wC,GAAiB,GACrC,cAAY,WAAUpmD,SAAA,EAEtB8B,EAAAA,EAAAA,MAACk2C,EAAW,CAAAh4C,SAAA,EACV8B,EAAAA,EAAAA,MAACqlD,GAAO,CAAC,cAAY,eAAcnnD,SAAA,EACjCH,EAAAA,EAAAA,KAACunC,EAAAA,GAAa,CACZC,UAAWA,EACXC,SAAU,WAAYpqC,EAAUA,EAAQqqC,OAAO/sC,IAAM,KACrDgI,KAAK,OAEN6kC,EACEnqC,EAAgC6pC,eAAiB,WAElDlnC,EAAAA,EAAAA,KAACunD,EAAAA,GAAa,CACZnkD,KAAM,iBAAkB/F,EAAUA,EAAQsR,aAAe,GACzD2/B,KAAMhqC,EAAAA,GAAM+L,WACZm3C,UAAU,oBACVhgD,aAAa,cAInBxH,EAAAA,EAAAA,KAACyM,GAAK,CAAC,cAAY,QAAOtM,UACxBH,EAAAA,EAAAA,KAACunD,EAAAA,GAAa,CAACnkD,KAAMsL,EAAO+4C,MAAO,EAAGnZ,KAAMhqC,EAAAA,GAAMkU,cAEpDxY,EAAAA,EAAAA,KAAC0nD,GAAgB,CAAC,cAAY,WAAUvnD,UACtCH,EAAAA,EAAAA,KAAC2nD,EAAAA,GAAY,CAACC,SAAU,EAAEznD,SACvB65B,EAASnkC,KAAKgyD,IACb7nD,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CAAezwC,QAASsyC,EAASllD,KAAK,MAAhCklD,SAIfn9B,EAAAA,GAAco9B,gCACb9nD,EAAAA,EAAAA,KAAC+/C,EAAqB,CACpBrsC,QAASA,EACTywC,aAAcA,IAAMsC,GAAc,GAClCvC,WAAYA,IAAMuC,GAAc,SAItCzmD,EAAAA,EAAAA,KAAC2kD,EAAa,CACZjxC,QAASA,EACTkxC,gBAAiBA,IAAmB,EACpCC,cAAeA,EACfC,4BAA6BA,UAIvB,EAMlB,MAAMmC,EAAc7iD,EAAAA,GAAOC,GAA4B;aAC1C,EAAGmiD,gBAAkBA,EAAa,GAAM;;EAI/CQ,GAAiB5iD,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;;;;aAItBjH,EAAAA,GAAOyE;;;EAId++C,EAAmB3iD,EAAAA,GAAOC,GAAG;;WAExBd,EAAAA,GAAOyE;;EAGZmwC,EAAc/zC,EAAAA,GAAOC,GAAG;;;;sBAIR,EAAG0J,qBAAsBA;;mBAE5B,EAAG2K,kBAAmBA;EAEnC4uC,GAAUljD,EAAAA,GAAOC,GAAG;;;;;IAKtBC,EAAAA,GAAM+L;EAEJ5D,GAAQrI,EAAAA,GAAOC,GAAG;;;IAGpBC,EAAAA,GAAMkU;EAEJkvC,GAAmBtjD,EAAAA,GAAOC,GAAG;;sHCnKnC,MAAMub,EAAiBA,EAAGxc,OAAO,6BAC/BnB,EAAAA,EAAAA,MAAC8lD,EAAI,CAAA5nD,SAAA,EACHH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAO8M,MAAOC,EAAAA,GAAOyD,YAAarE,KAAK,OACjDS,KAMC2kD,EAAO3jD,EAAAA,GAAOC,GAAG;;;;;WAKZd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM8I;0sCCGV,SAAS46C,EAAWC,GAClB,OAAOp6C,IAAMo6C,GAAMn6C,OAAO,WAC5B,CAuJA,MArJ8Bo6C,EAAGC,eAAcC,gBAAe,EAAMzlD,OAAO,SACzE,MAAmDrB,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA5CugC,EAAUzgC,EAAA,GAAE+mD,EAAa/mD,EAAA,GAEhC,IAAI3G,EACA,QAASwtD,IAAcxtD,EAAMwtD,EAAaxtD,KAC1C,qBAAsBwtD,IACxBxtD,GAAM43C,EAAAA,EAAAA,IAAkB4V,IAG1B,IACIG,EADA55C,EAAQy5C,EAAaz5C,MAErBu5C,EAAsB,KACtB1yC,EAAyB,KAE7B,GAAI,qBAAsB4yC,EACxBG,GACErmD,EAAAA,EAAAA,MAACsmD,EAAe,CAACxmB,WAAYA,EAAYymB,OAAQjyC,QAAQ5b,GAAKwF,SAAA,EAC5DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,cAAc8M,MAAOC,EAAAA,GAAOkrB,eACvCzuB,EAAAA,EAAAA,KAAA,QAAAG,SAAOgoD,EAAaM,sBAGpBN,EAAaF,OAAMA,EAAOD,EAAWG,EAAaF,OACtD1yC,EAAU4yC,EAAaO,cAGlB,GAAI,WAAYP,EAAc,CACnC,MAAQ98C,EAAY88C,EAAZ98C,SACJA,GAAW88C,EAAaQ,iBAC1Bj6C,EAAQ,GACLrD,GAAwBu9C,iBACxBv9C,GAAoCw9C,UACpCx9C,GAAqBsD,cACrBtD,GAAwB7U,MACzB2xD,EAAaQ,mBACTj6C,KAEJy5C,EAAaW,SACfR,GACErmD,EAAAA,EAAAA,MAAC8mD,EAAM,CAAA5oD,SAAA,EACLH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAU8M,MAAOC,EAAAA,GAAOkrB,cAAe,IACjDu6B,KAAKC,eAAen7C,OAAOo7C,KAAKC,MAAMhB,EAAaW,aAItDX,EAAaF,OAAMA,EAAOD,EAAWG,EAAaF,OAClDE,EAAaiB,WAAUnB,GAAQ,MAAMD,EAAWG,EAAaiB,aACjE7zC,EAAU4yC,EAAajuD,WAGzB,MAAO,GAAI,gBAAiBiuD,EACtBA,EAAa5nC,SACf+nC,GACErmD,EAAAA,EAAAA,MAAC8mD,EAAM,CAAA5oD,SAAA,EACLH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,SAAS8M,MAAOC,EAAAA,GAAOkrB,cAAe,YACxC/hB,EAAAA,EAAAA,GAAE,CAAC,uBAAwBy7C,EAAa5nC,aAInD4nC,EAAakB,cACfpB,EAAO,gBAAgBD,EAAWG,EAAakB,gBAEjD9zC,EAAU4yC,EAAaO,cAGlB,GAAI,qBAAsBP,EAAc,CAC7C,MAAQ5N,EAA6D4N,EAA7D5N,iBAAkB7mC,EAA2Cy0C,EAA3Cz0C,QAASopB,EAAkCqrB,EAAlCrrB,UAAWwsB,EAAuBnB,EAAvBmB,mBAEzC56C,IAAOA,EAAQ,QAAQgF,EAAQhF,SAEpC,IAAI66C,EAAe,MACnB,OAAQhP,GACN,KAAK30B,EAAAA,GAAgBC,mBACnB0jC,EAAe,sBACf,MACF,KAAK3jC,EAAAA,GAAgB+P,UACnB4zB,EAAe,YACf,MACF,KAAK3jC,EAAAA,GAAgBgQ,oBACnB2zB,EAAe,kBAGnBjB,GACErmD,EAAAA,EAAAA,MAAC8mD,EAAM,CAAA5oD,SAAA,EACLH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CACHtQ,KAAMgzD,EAAAA,GAAyBjP,GAC/Bj3C,MAAOC,EAAAA,GAAOkrB,YACd9rB,KAAK,OAEN4mD,EAAa,KAAG71C,EAAQhF,SAIzBouB,GAAawsB,EACfrB,EAAOD,EAAWsB,GACRxsB,IACVmrB,EAAO,yBAGT1yC,EAAU4yC,EAAasB,OACzB,CAEA,OACEzpD,EAAAA,EAAAA,KAACC,EAAS,CAAC0C,KAAMA,EAAKxC,UACpB8B,EAAAA,EAAAA,MAACynD,EAAO,CACN71D,KAAK,SACL4P,QAASA,IAAM2kD,GAAgBC,GAAetmB,GAC9Cp/B,KAAMA,EACNylD,aAAcA,EAAajoD,SAAA,EAE3B8B,EAAAA,EAAAA,MAACghD,EAAM,CAACtgD,KAAMA,EAAKxC,SAAA,EACjBH,EAAAA,EAAAA,KAACyM,EAAK,CACJ2U,GACMzmB,GAAO,qBAAsBwtD,EAAqB39C,EAAAA,GAC7C7P,EAAY,IACd,MAETsJ,KAEEtJ,GAAK0R,WAAW,QACZ1R,EACAA,GAAK0R,WAAW,OAChB,mBAAmB1R,IACnB,WAAWA,IAEjB8P,GAAI9P,EACJqI,OAAO,SACPL,KAAMA,EACNo/B,WAAYA,EACZt+B,QAAUX,GAAMnI,GAAOmI,EAAE2E,kBAAkBtH,SAE1CuO,IAEF05C,GAAgB7yC,IAAWvV,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAMurC,EAAa,aAAe,oBAErEA,IAAc/hC,EAAAA,EAAAA,KAACsP,EAAO,CAAAnP,SAAEoV,KACzBtT,EAAAA,EAAAA,MAAC0nD,EAAO,CAAC5nB,WAAYA,EAAW5hC,SAAA,CAC7BmoD,EACAL,IACChmD,EAAAA,EAAAA,MAAC8mD,EAAM,CAAA5oD,SAAA,EACLH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAW8M,MAAOC,EAAAA,GAAOkrB,cACnCw5B,YAKC,EAMhB,MAAMhoD,EAAYmE,EAAAA,GAAOC,GAAG;;;aAGf,EAAG1B,UAAqB,OAATA,EAAgB,UAAY;gBACxC,EAAGA,UAAqB,OAATA,EAAgBY,EAAAA,GAAOsE,YAActE,EAAAA,GAAOwE;;EAGrE2hD,EAAUtlD,EAAAA,GAAOoe,MAAM;;;;;;;IAOzBle,EAAAA,GAAM4D;;;;;;cAMI,EAAGkgD,kBAAoBA,EAAe,UAAY;;;;;;EAO1DnF,EAAS7+C,EAAAA,GAAOC,GAAG;;;;IAIrB,EAAG1B,UAAoB,OAATA,GAAiB;;;EAI7B8J,EAAQrI,EAAAA,GAAOC,GAAG;IACpB,EAAG1B,UAAqB,OAATA,EAAgB2B,EAAAA,GAAM4D,SAAW5D,EAAAA,GAAMgM;IACtD,EAAGyxB,aAAYp/B,UACF,OAATA,GAAkBo/B,EACT,OAATp/B,EAAsBwF,EAAAA,GAAOsgC,UACpB,OAAT9lC,EAAsBwF,EAAAA,GAAOyhD,iBAAjC,EAFyCzhD,EAAAA,GAAOsjB;WAIzCloB,EAAAA,GAAOyE;IACd,EAAGoZ,GAAIyoC,KACC,QAARA,GACA,yCAGStmD,EAAAA,GAAOyE;EAMd2hD,EAAUvlD,EAAAA,GAAOC,GAAG;;iBAET,EAAG09B,gBAAkBA,EAAa,aAAe;;WAEvDx+B,EAAAA,GAAOkrB;;EAGZs6B,EAAS3kD,EAAAA,GAAOC,GAAG;;;;EAKnBkkD,GAAkBnkD,EAAAA,EAAAA,IAAO2kD,EAAO;IAClC,EAAGhnB,gBAAiBA,GAAc;;;MAGhC,EAAGA,gBAAiBA,GAAc;MAClC,EAAGA,aAAYymB,aAAcA,IAAWzmB,IAAe55B,EAAAA,GAAOsjB;;EAG9Dnc,EAAUlL,EAAAA,GAAOC,GAAG;;IAEtBC,EAAAA,GAAM4W;+pCCjPH,MAAM4uC,EAAmB,CAC9B,EAAG,8CACH,EAAG,8EACH,EAAG,sFACH,EAAG,wFACH,EAAG,iGACH,EAAG,4HACH,EAAG,iCACH,EAAG,wCACH,EAAG,wCAGQC,EAAoB,CAAC,EAAG,GAE/BC,EAAgBC,IAEpBjqD,EAAAA,EAAAA,KAAA,MAAAjM,EAAAA,EAAA,GAASk2D,EAAOl/C,OAAK,IAAEyJ,UAAU,mBAAmB,cAAY,aAAYrU,SACzE+pD,KAoFL,KAhFaC,EAAGC,WAAUC,WAAU,EAAOxnD,eAavCZ,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAACqoD,EAAe,CAACD,QAASA,EAAQlqD,SAAA,EAChCH,EAAAA,EAAAA,KAACuqD,EAAqB,IACrBF,GACCrqD,EAAAA,EAAAA,KAACwqD,EAAAA,EAAM,CACLC,OAAK,EACLC,UAAQ,EACRC,SAAO,EACPplD,MAAO6kD,EACPhsC,IAAK,EACLC,IAAK5N,OAAO8N,KAAKqsC,EAAAA,IAA6Bl0D,OAC9Cm0D,MAAI,EACJC,YAAY,EACZC,aAAcf,EACdnnD,SACEA,GAAQ,CAAMmoD,GAAgCnoD,EAASmoD,OAI3D/oD,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACirD,EAAY,CAAA9qD,SACVsQ,OAAO8N,KAAKqsC,EAAAA,IAA6B/0D,KAAKq1D,IAC7ClrD,EAAAA,EAAAA,KAACmrD,EAAG,CAEFjqC,SAAUoS,OAAO43B,IAAUd,EAAS,IAAM92B,OAAO43B,IAAUd,EAAS,IAD/Dc,QAKXlrD,EAAAA,EAAAA,KAACorD,EAAW,CAAChB,SAAUA,WAI7BpqD,EAAAA,EAAAA,KAACqrD,EAAM,CAAAlrD,SACJsQ,OAAOC,OAAOk6C,EAAAA,IAA6B/0D,KAAI,CAAC0P,EAAOw/B,KACtD,MAAM9Z,EAAam/B,EAAS,IAAMrlB,EAAI,GAAKqlB,EAAS,IAAMrlB,EAAI,EAC9D,OACE9iC,EAAAA,EAAAA,MAACqpD,EAAK,CAEJrgC,WAAYA,EACZ,cAAa,OAAO8Z,EAAI,IACxB,gBAAe9Z,EAAW9qB,SAAA,EAE1B8B,EAAAA,EAAAA,MAACuN,EAAK,CAAC3b,KAAK,SAAS4P,QAASA,IAtDhBynD,KACxB,IAAKroD,EAAU,OAEf,MAAM0oD,GAAgBnB,EAAS,GAAKA,EAAS,IAAM,EAEjDvnD,EADEqoD,EAAQK,EACD,CAACL,EAAOd,EAAS,IAEjB,CAACA,EAAS,GAAIc,GACzB,EA8C8CM,CAAiBzmB,EAAI,GAAIslB,QAASA,EAAQlqD,SAAA,CAC3E4kC,EAAI,EAAE,KAAGx/B,MAEZvF,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CACNj6B,SACEtT,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,eACHH,EAAAA,EAAAA,KAAA,SACC8pD,EAAiB/kB,EAAI,MAG1BphC,SAAS,QACT6D,aAAa,QACb4tC,eAAe,kBAAiBj1C,UAEhCH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAOmM,KAAK,KAAKoE,OAAO,YAAYzD,MAAOC,EAAAA,GAAOkrB,kBApB1DlpB,EAsBC,SAUpB,MAAMtF,EAAYmE,EAAAA,GAAOC,GAAG;;;;EAKtBimD,EAAkBlmD,EAAAA,GAAOC,GAAG;;iBAEjB,EAAGgmD,aAAeA,EAAU,SAAW;;;;;;;;;;;;;0BAa9B9mD,EAAAA,GAAOsE;;;0BAGPtE,EAAAA,GAAOC;;;;;;;;;;;;4BAYLD,EAAAA,GAAOkrB;;;4BAGPlrB,EAAAA,GAAOsE;;;;;;;;;;;oBAWfM,EAAAA,GAAOsjD;0BACDloD,EAAAA,GAAOY;;;;EAK3BomD,EAAwBnmD,EAAAA,GAAOC,GAAG;;;;;sBAKlBd,EAAAA,GAAOsE;;EAGvBojD,EAAe7mD,EAAAA,GAAOC,GAAG;;;;;;;;;EAUzB8mD,EAAM/mD,EAAAA,GAAOC,GAAG;;;sBAGA,EAAG6c,cAAgBA,EAAW3d,EAAAA,GAAOsE,YAActE,EAAAA,GAAOkrB;;EAG1E28B,EAAchnD,EAAAA,GAAOC,GAAG;;SAErB,EAAG+lD,cAAe,IAAMA,EAAS,GAAK;YACnC,EAAGA,cAAe,IAAMA,EAAS,GAAKA,EAAS,IAAM;;sBAE3C7mD,EAAAA,GAAOC;;EAGvB6nD,EAASjnD,EAAAA,GAAOC,GAAG;;;;EAKnBinD,EAAQlnD,EAAAA,GAAOC,GAAG;;;IAGpBC,EAAAA,GAAMgM;WACC,EAAG2a,gBAAkBA,EAAa1nB,EAAAA,GAAOyE,MAAQzE,EAAAA,GAAOkrB;EAE7Djf,EAAQpL,EAAAA,GAAOoe,MAAM;;;;IAIvB,EAAG6nC,cAAeA,GAAW;;;;EAK3BH,GACJjoD,EAAAA,EAAAA,MAAA,OAAKpE,MAAM,KAAKG,OAAO,IAAI0tD,QAAQ,WAAWC,KAAK,OAAOC,MAAM,6BAA4BzrD,SAAA,EAC1FH,EAAAA,EAAAA,KAAA,QAAM6rD,EAAE,uBAAuBC,OAAQvoD,EAAAA,GAAOC,UAAWuoD,YAAY,SACrE/rD,EAAAA,EAAAA,KAAA,QAAM6rD,EAAE,uBAAuBC,OAAQvoD,EAAAA,GAAOC,UAAWuoD,YAAY,SACrE/rD,EAAAA,EAAAA,KAAA,QAAM6rD,EAAE,uBAAuBC,OAAQvoD,EAAAA,GAAOC,UAAWuoD,YAAY,U,8UC7NzE,MA2BMC,GAAoB5nD,EAAAA,EAAAA,IAAOuc,EAAAA,EAAM;;WAE5Bpd,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM8I;EAEJ5K,GAAe4B,EAAAA,EAAAA,IAAOuc,EAAAA,EAAMrR,QAAQ;;MAEpChL,EAAAA,GAAMyI;aACCxJ,EAAAA,GAAOyE;;;;;MAKd1D,EAAAA,GAAM8I;aACC7J,EAAAA,GAAOyE;;;;EAMpB,MA/CgCikD,EAAGC,wBAAuBC,+BAEtDnsD,EAAAA,EAAAA,KAACgsD,EAAiB,CAChBrvD,KAAMuvD,EACN7pD,QAASA,IAAM8pD,GAAyB,GACxCxpD,KAAK,OACL4J,oBAAoB,EACpBiI,UAAU,YAAWrU,UAErB8B,EAAAA,EAAAA,MAACO,EAAY,CAAArC,SAAA,EACXH,EAAAA,EAAAA,KAAA,MAAAG,SAAI,8CACJH,EAAAA,EAAAA,KAAA,KAAAG,SAAG,kEACH8B,EAAAA,EAAAA,MAAA,KAAA9B,SAAA,CAAG,2CACwC,KACzCH,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,WAAWjB,OAAO,SAAQ7C,SAAC,eAE9B,IAAI,sBAGXH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS4P,QAASA,IAAM0oD,GAAyB,GAAOhsD,SAAC,e,ggCC0J9E,MA/JA,UAA8B,WAAEipB,IAC9B,MAAMgjC,GAAmBpqD,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,YAAY2mB,QAChF0G,GAAWzhB,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMmK,OAAO2lB,WAEKniB,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA9D6qD,EAAmB/qD,EAAA,GAAEgrD,EAAsBhrD,EAAA,GACQK,EAAAJ,GAAhCC,EAAAA,EAAAA,UAAS4qD,GAAoB,IAAG,GAAnDrvC,EAAKpb,EAAA,GAAEqb,EAAQrb,EAAA,GAEmD2M,EAAA/M,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAlE0qD,EAAqB59C,EAAA,GAAE69C,EAAwB79C,EAAA,GAClB0D,EAAAzQ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA7B+qD,EAAIv6C,EAAA,GAAEw6C,EAAOx6C,EAAA,GACqBE,EAAA3Q,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAlC6N,EAAK6C,EAAA,GAAEi0B,EAAQj0B,EAAA,GAC6DE,EAAA7Q,GAArCC,EAAAA,EAAAA,UAAgC,MAAK,GAA5EirD,EAAer6C,EAAA,GAAEs6C,EAAkBt6C,EAAA,GAEpCu6C,GAAuBz/B,EAAAA,EAAAA,GAAY,CACvCC,WAAYy/B,EAAAA,GACZx/B,UAAYkB,IACNA,EACFlF,IAEA+c,GAAS,EACX,EAEF1Y,QAASqE,EAAAA,KAGL+6B,GAA6B3/B,EAAAA,EAAAA,GAAY,CAC7CC,WAAY2/B,EAAAA,GACZ1/B,UAAWA,KACTnd,EAAAA,GAAMhB,QAAQ,wDACdq9C,GAAuB,EAAM,EAE/B7+B,QAAUre,IACR,OAAQA,EAAImD,UAAUgO,QACpB,KAAK,IAeH,OAdAtQ,EAAAA,GAAMZ,OACJ09C,EAAAA,EAAAA,IACE,uEACA/sD,EAAAA,EAAAA,KAAA,QACE0J,MAAO,CAAEwG,eAAgB,aACzBzM,QAASoL,gBACDujB,EAAAA,EAAAA,IAAa,8BACnBt0B,OAAOhE,SAASmK,KAAO,QAAQ,EAC/B9D,SACH,sBAKE,EACT,KAAK,IAIH,OAHA8P,EAAAA,GAAMZ,OACJ3C,EAAAA,EAAAA,GAAE,+EAEG,EAEX,MAAM2C,CAAK,IAgBf,OAZApG,EAAAA,EAAAA,YAAU,KAEY,IAAhBsjD,EAAK71D,QAAiB2Y,GACxBs9C,EAAqBj/B,OAAO6+B,EAC9B,GACC,CAACA,KAQFtqD,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACisD,EAAuB,CACtBC,sBAAuBA,EACvBC,yBAA0BA,KAE5BlqD,EAAAA,EAAAA,MAACkxB,EAAAA,GAAa,CAACthB,KAAM,EAAG,cAAY,mBAAmBhU,MAAM,QAAOsC,SAAA,EAClEH,EAAAA,EAAAA,KAACguB,EAAAA,GAAU,CAAC5D,WAAW,kBAAkBC,QAAQ,uCACjDrqB,EAAAA,EAAAA,KAACgtD,EAAe,CACd39C,MAAOA,EACP49C,UAAQ,EACRp5D,KAAK,SACLq5D,OAAQ,EACRC,YAAa1pC,EAAW,IAAM,IAC9B2pC,WAAY3pC,EAAW,GAAK,IAC5BxQ,YAAa,CAAC,IAAK,IAAK,IAAK,KAC7BpQ,SArBgBwqD,IAClBA,EAAiB32D,QAAU2Y,GAAO82B,GAAS,GAC/CqmB,EAAQa,EAAiB,EAoBnBl9C,SAAUw8C,EAAqB9/B,aAEjC5qB,EAAAA,EAAAA,MAACqrD,EAAW,CAAAntD,SAAA,CACTkP,IACCrP,EAAAA,EAAAA,KAACutD,EAAa,CAAC7jD,MAAO,CAAEpG,MAAOC,EAAAA,GAAOS,KAAM7D,UACzCuM,EAAAA,EAAAA,GAAE,wEAGPzK,EAAAA,EAAAA,MAACsrD,EAAa,CAAAptD,SAAA,EACXuM,EAAAA,EAAAA,GAAE,kEAAmE,KACtE1M,EAAAA,EAAAA,KAACwtD,EAAe,CAAC/pD,QAASA,IAAM6oD,GAAuB,GAAMnsD,UAC1DuM,EAAAA,EAAAA,GAAE,uEAGN2/C,IACCpqD,EAAAA,EAAAA,MAACwrD,EAAY,CACX7+C,SAAW9L,IACTA,EAAEgM,kBACFwI,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBs+B,OAAQ,CAC7B5rB,gBAAiB,uBACjBr2B,OAAQ,4BACRw4D,mBACAsB,YAAa3wC,IAGM,KAAjBA,EAAMumB,QAOVopB,EAAmB,MACnBG,EAA2Bn/B,OAAO3Q,IAPhC2vC,EAAmB,CACjBiB,UAAU,EACVzxC,aAAc,uCAKsB,EACxC/b,SAAA,EAEFH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACRh7C,KAAK,QACL0R,MAAOwX,EACPla,SAAWC,GAAMka,EAASla,EAAEE,OAAOuC,OACnCyW,OAAQywC,EAAkB,CAACA,QAAmBnmD,KAEhDtG,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,UACR5E,KAAK,KACLoE,OAAO,WACPoJ,SAAU08C,EAA2BhgC,UAAU1sB,UAE9CuM,EAAAA,EAAAA,GAAE,uEAIT1M,EAAAA,EAAAA,KAAC4tD,EAAO,CAAC5vD,OAAQ,KAChB0sB,EAAAA,GAAcC,yBACb3qB,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL0T,QAAQ,wBACR9D,QAASoL,gBACD6I,EAAAA,EAAAA,KAAS,EAEjB3Q,OAAO,aAAY5G,SACpB,qBAQb,EAIA,MAAMmtD,EAAclpD,EAAAA,GAAOC,GAAG;;;;;;;;;EAWxBkpD,EAAgBnpD,EAAAA,GAAOC,GAAG;IAC5BC,EAAAA,GAAMgM;;;WAGC/M,EAAAA,GAAOyE;EAIZglD,GAAkB5oD,EAAAA,EAAAA,IAAOypD,EAAAA,EAAe;;;;;oBAK1BtqD,EAAAA,GAAO6U;4BACC7U,EAAAA,GAAOC;;eAEpBD,EAAAA,GAAOyE;;qBAEDzE,EAAAA,GAAOyE;;;0BAGFzE,EAAAA,GAAOC;;;;;;iCAMAD,EAAAA,GAAOC;;;iCAGPD,EAAAA,GAAOC;;;;sBAIlBD,EAAAA,GAAOC;;;sBAGNuH,GAAUA,EAAMsE,OAAS9L,EAAAA,GAAOS;;;EAKjDwpD,EAAkBppD,EAAAA,GAAOuP,IAAI;IAC/BrP,EAAAA,GAAM8I;;;WAGC7J,EAAAA,GAAOC;;;;;EAOZoqD,EAAUxpD,EAAAA,GAAOC,GAAG;YACb0G,GAAWA,EAAM/M,OAAS,GAAG+M,EAAM/M,WAAa;;EAIvDyvD,EAAerpD,EAAAA,GAAOyM,IAAI;;sHC5OzB,MAAMqd,EAAiBA,EAC5B3oB,QACA1C,WACA+L,WACAqE,cACA66C,aAAa,QACbC,uBAAsB,MAGpB9rD,EAAAA,EAAAA,MAAChC,EAAS,CACR2O,SAAW9L,IACTA,EAAEgM,iBACFF,EAASrJ,EAAM,EACfpF,SAAA,EAEFH,EAAAA,EAAAA,KAAC8G,EAAAA,EAAI,CAACtQ,KAAK,SAAS8M,MAAOC,EAAAA,GAAOyD,YAAaD,OAAO,eACtD/G,EAAAA,EAAAA,KAACuR,EAAK,CAAChM,MAAOA,EAAO1C,SAAWC,GAAMD,EAASC,EAAEE,OAAOuC,OAAQ0N,YAAaA,KAC7EjT,EAAAA,EAAAA,KAACguD,EAAc,CACbvqD,QAASA,KACPZ,EAAS,IACLkrD,GACFn/C,EAAS,GACX,EACAzO,UAEFH,EAAAA,EAAAA,KAAC8G,EAAAA,EAAI,CAACtQ,KAAK,IAAI8M,MAAOC,EAAAA,GAAO0qD,YAAatrD,KAAK,KAAKoE,OAAO,gBAE5DwP,QAAQu3C,KAAe9tD,EAAAA,EAAAA,KAAC0K,EAAM,CAAC7W,KAAK,SAAQsM,SAAE2tD,OAK/C7tD,EAAYmE,EAAAA,GAAOyM,IAAI;;;;;sBAKPtN,EAAAA,GAAOsE;;;;wBAILtE,EAAAA,GAAOC;;;;;;0BAMLD,EAAAA,GAAOkrB;;;0BAGPlrB,EAAAA,GAAOC;;;;IAI7ByJ,EAAAA,GAAkB8M;;;EAKhBxI,EAAQnN,EAAAA,GAAOoN,KAAK;;;;;WAKfjO,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM4pD;;;;aAIG3qD,EAAAA,GAAOyD;MACd1C,EAAAA,GAAM8I;;EAIN4gD,EAAiB5pD,EAAAA,GAAOC,GAAG;;;;;;;;;EAW3BqG,EAAStG,EAAAA,GAAOoe,MAAM;;sBAENjf,EAAAA,GAAOsnB;WAClBtnB,EAAAA,GAAOC;;;IAGdc,EAAAA,GAAM49C;;;wBAGc3+C,EAAAA,GAAO4qD;;;;wBAIP5qD,EAAAA,GAAOylB;;kqCCZ/B,IAjFgColC,EAC9BhsD,SACAC,UACAC,aACA+rD,YACAC,kBAEA,IAAKlsD,EAAQ,OAAO,KAEpB,MAAMN,GAAWC,EAAAA,EAAAA,MACXnN,GAAiBoN,EAAAA,EAAAA,KAAarO,GAAqBA,EAAM0J,QAAQzI,iBACjEwB,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/Dm4D,GAAgCC,EAAAA,EAAAA,IAA6B55D,EAAgB,CACjFwB,EAAY2mB,QAGoCzb,EAAAC,GAAtBC,EAAAA,EAAAA,UAAmB,IAAG,GAA3CkhC,EAAMphC,EAAA,GAAEmtD,EAASntD,EAAA,GACwBK,EAAAJ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAzCktD,EAAU/sD,EAAA,GAAEgtD,EAAahtD,EAAA,GACkB2M,EAAA/M,GAApBC,EAAAA,EAAAA,UAAiB,IAAG,GAA3CogC,EAAOtzB,EAAA,GAAEsgD,EAAUtgD,EAAA,GACsC0D,EAAAzQ,GAAxBC,EAAAA,EAAAA,WAAkB,GAAM,GAAzD+M,EAAYyD,EAAA,GAAExD,EAAewD,EAAA,IAEpC/I,EAAAA,EAAAA,YAAU,KACRnH,GAAS+sD,EAAAA,EAAAA,IAAuBz4D,EAAY2E,cAAcwhC,YAAY,GACrE,IAeH,OACEv8B,EAAAA,EAAAA,KAACmC,EAAAA,EAAU,CACTC,OAAQA,EACRC,QAASA,EACTkK,mBAAsC,IAAlBm2B,EAAOhsC,QAAmC,IAAnBkrC,EAAQlrC,OACnD4L,WAAYA,EACZzE,MAAM,QAAOsC,UAEbH,EAAAA,EAAAA,KAACsP,EAAO,CAAC,cAAY,6BAA4BnP,UAC/C8B,EAAAA,EAAAA,MAAA,QAAM2M,SAtBU9L,IACpBA,EAAEgM,iBACEP,IACJC,GAAgB,GAChBsgD,QAAQC,IAAIrsB,EAAO7sC,KAAKknB,GAAUuxC,EAAYvxC,EAAO6kB,MAClDotB,MAAK,KACJ3sD,IACA4N,EAAAA,GAAMhB,QAAQo/C,EAAU,IAEzBY,OAAO7/C,GAAQ9D,QAAQ+D,MAAMD,KAC7B8/C,SAAQ,IAAM1gD,GAAgB,KAAO,EAYPrO,SAAA,EAC3BH,EAAAA,EAAAA,KAACwP,EAAK,CAAArP,SAAC,uBACPH,EAAAA,EAAAA,KAACmvD,EAAAA,EAAa,CACZ5pD,MAAOm9B,EAAO7sC,IAAI+a,EAAAA,IAClBxJ,QAASmnD,EACT1rD,SAAU4rD,EACVtoB,SAAUwoB,KAEZ3uD,EAAAA,EAAAA,KAACymC,EAAK,CAAAtmC,SAAEuuD,KACR1uD,EAAAA,EAAAA,KAACwP,EAAK,CAAC4/C,gBAAc,EAAAjvD,SAAC,wBACtBH,EAAAA,EAAAA,KAACqvD,EAAQ,CACPp8C,YAAY,gBACZ2yB,KAAK,IACLrgC,MAAOq8B,EACP/+B,SAAWC,GAAM8rD,EAAW9rD,EAAEE,OAAOuC,OACrC,cAAY,mBAEdvF,EAAAA,EAAAA,KAACsvD,EAAqB,CAAAnvD,UACpBH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL8O,KAAM,KACNU,SAAS,QACT8M,SAA4B,IAAlBuyB,EAAOhsC,QAAgB6f,QAAQm4C,IAAengD,EACxD,cAAY,gBAAepO,SAC5B,kBAMI,EAMjB,MAAMmP,EAAUlL,EAAAA,GAAOC,GAAG;;EAIpBmL,EAAQpL,EAAAA,GAAO1B,KAAK;IACtB4B,EAAAA,GAAMgN;;IAELxb,GAAMA,EAAEs5D,gBAAkB;EAGzB3oB,EAAQriC,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOS;;EAIZqrD,EAAWjrD,EAAAA,GAAO8qC,QAAQ;IAC5B5qC,EAAAA,GAAM8I;;;;sBAIY7J,EAAAA,GAAO6M;;;;;MAKvB9L,EAAAA,GAAM8I;aACC7J,EAAAA,GAAOyD;;EAIdsoD,EAAwBlrD,EAAAA,GAAOC,GAAG;;wqCC7HxC,MAUakrD,EAAoBnrD,EAAAA,GAAOC,GAAG;WAChC,EAAGxG,WAAYA,GAAS;IAC/B,EAAG2xD,qBAAsB,GAAGA;;;;IAI5BlrD,EAAAA,GAAM8I;EAGGqiD,GAAiBrrD,EAAAA,EAAAA,KAnBV2G,GACXA,EAAM2kD,WACX1vD,EAAAA,EAAAA,KAAC2vD,EAAAA,EAAe57D,EAAA,CAACgC,GAAG,oBAAuBgV,IACzCA,EAAM8D,OACR7O,EAAAA,EAAAA,KAAC4vD,EAAAA,EAAW77D,EAAA,CAACgC,GAAG,gBAAmBgV,KAEnC/K,EAAAA,EAAAA,KAAC6vD,EAAAA,GAAM97D,EAAA,CAACgC,GAAG,kBAAqBgV,KAaY;IAC5C+kD,EAAAA;;;;;;;;EAUSC,EAAe3rD,EAAAA,GAAOC,GAAG;;sBAEhBd,EAAAA,GAAOsE;;;;IAIzBvD,EAAAA,GAAM4W;;;;;EAOG80C,GAAsB5rD,EAAAA,EAAAA,IAAO2rD,EAAa;;;EAK1CE,EAAc7rD,EAAAA,GAAOC,GAAG;IACjCC,EAAAA,GAAM4W;;EASGg1C,GALkB9rD,EAAAA,GAAOC,GAAG;;;EAKb,CAC1Bu3C,OAAQA,CAACnnC,GAAU07C,YAAWllC,gBAAYl3B,EAAAA,EAAAA,EAAA,GACrC0gB,GAAM,IACT1G,gBAAiBoiD,GAAallC,EAAa1nB,EAAAA,GAAO6U,YAAc,cAChEF,OAAQ+S,EAAa,aAAa1nB,EAAAA,GAAOC,YAAc,QACvDkV,aAAcuS,EAAa,MAAQ,QACnC,SAAU,CACRld,gBAAiBxK,EAAAA,GAAO6U,cAEvBG,EAAAA,GAASnL,WAAS,IACrB9J,MAAOC,EAAAA,GAAOyE,MACdyQ,OAAQ,YAEV23C,QAAUC,GAAIt8D,EAAAA,EAAAA,EAAA,GACTs8D,GACA93C,EAAAA,GAASnL,WAAS,IACrBsL,aAAc,QAEhB43C,KAAOD,GAAIt8D,EAAAA,EAAAA,EAAA,GACNs8D,GACA93C,EAAAA,GAASnL,WAAS,IACrBqM,OAAQ,KACRV,UAAW,MACXL,aAAc,QAEhB63C,WAAaF,GAAIt8D,EAAAA,EAAA,GACZs8D,GAAI,IACPtiD,gBAAiBxK,EAAAA,GAAO6U,aACrBG,EAAAA,GAASnL,WAEdojD,YAAcH,GAAIt8D,EAAAA,EAAA,GACbs8D,GACA93C,EAAAA,GAASnL,WAEd6F,YAAaA,CAACo9C,GAAQF,eAAWp8D,EAAAA,EAAA,GAC5Bs8D,GAAI,IACPt4C,QAASo4C,EAAY,OAAS,QAC9B7sD,MAAOC,EAAAA,GAAOyD,aACXuR,EAAAA,GAASnL,a,i4ECjGhB,MAAMqjD,EAAY3lD,IAA6B,IAA1B3K,EAAQ2K,EAAR3K,SAAa4K,EAAK2lD,EAAA5lD,EAAA6lD,GAErC,OAAIxwD,EAASywD,eAAe1kD,SAAS,cAEjClM,EAAAA,EAAAA,KAAC6wD,EAAAA,EAAWrmC,OAAMz2B,EAAAA,EAAA,GAAKgX,GAAK,IAAA5K,UAC1B8B,EAAAA,EAAAA,MAACkoB,EAAa,CAAAhqB,SAAA,CACX,WACDH,EAAAA,EAAAA,KAACmqB,EAAqB,CAAAhqB,SAAEA,EAASywD,eAAeE,UAAU,YAMhE9wD,EAAAA,EAAAA,KAAC6wD,EAAAA,EAAWrmC,OAAMz2B,EAAAA,EAAA,GAAKgX,GAAK,IAAA5K,UAC1BH,EAAAA,EAAAA,KAACmqB,EAAc,CAAAhqB,SAAEA,EAASywD,eAAiBzwD,MACzB,EAqBlB4wD,EAAWC,IAA6B,IAA1B7wD,EAAQ6wD,EAAR7wD,SAAa4K,EAAK2lD,EAAAM,EAAAC,GACpC,MAAAC,EAAAn9D,EAAA,GAAoCgX,GAA5B2kD,EAASwB,EAATxB,UAAkBwB,EAAPrqD,QAGjBkE,EAAMomD,eAGR,OAAOnxD,EAAAA,EAAAA,KAAC6wD,EAAAA,EAAWE,SAAQh9D,EAAAA,EAAA,GAAKgX,GAAK,IAAA5K,SAAGA,IAA+B,EAGnEixD,EAA2B3rB,GAAU16B,IAClC/K,EAAAA,EAAAA,KAAC6wD,EAAAA,EAAWQ,kBAAiBt9D,EAAAA,EAAA,GAAKgX,GAAK,IAAA5K,SAAGslC,KAG7C6rB,EAA0BC,GAA2BxmD,IAEvD/K,EAAAA,EAAAA,KAAC6wD,EAAAA,EAAWW,iBAAgBz9D,EAAAA,EAAA,GAAKgX,GAAK,IAAA5K,SAAGoxD,KAIvCjsB,EAAYv6B,IAChB,MACEomD,EAiBEpmD,EAjBFomD,eACAN,EAgBE9lD,EAhBF8lD,WACAnB,EAeE3kD,EAfF2kD,UACA7oD,EAcEkE,EAdFlE,QAEAO,GAYE2D,EAbF0mD,MAaE1mD,EAZF3D,SACAsqD,EAWE3mD,EAXF2mD,WACA7uD,EAUEkI,EAVFlI,SACA0C,EASEwF,EATFxF,MACAkgC,EAQE16B,EARF06B,KACA5Y,EAOE9hB,EAPF8hB,UACApY,EAME1J,EANF0J,OACAk9C,EAKE5mD,EALF4mD,aACAJ,EAIExmD,EAJFwmD,sBACAt+C,EAGElI,EAHFkI,YACA2+C,EAEE7mD,EAFF6mD,WACAC,EACE9mD,EADF8mD,kBAG6DvwD,EAAAC,GAArBC,EAAAA,EAAAA,UAAS+D,GAAS,IAAG,GAAxDusD,EAAaxwD,EAAA,GAAEywD,EAAgBzwD,EAAA,GACkBK,EAAAJ,GAApBC,EAAAA,EAAAA,UAASowD,GAAW,GAAjD79C,EAAUpS,EAAA,GAAEqS,EAAarS,EAAA,GAE1BqwD,GAAmBphC,EAAAA,EAAAA,QAAOkhC,GAE1BG,EAAkBH,GAAep7D,QAAUg7D,GAEjDzoD,EAAAA,EAAAA,YAAU,KACR,MAAMipD,EAAM3sD,GAAOA,OAASA,EAC5BwsD,EAAiBz5D,MAAMg+B,QAAQ47B,GAAOA,EAAM,CAACA,GAAK,GACjD,CAAC3sD,KAEJ0D,EAAAA,EAAAA,YAAU,KACJpC,GAAWmrD,EAAiBnhC,SAASn6B,SAAWg7D,EAClD19C,GAAc,GAEdA,EAAc49C,GAGhBI,EAAiBnhC,QAAUihC,CAAa,GACvC,CAACA,IAEJ,MAQMK,EAAkBl/C,IAEpBy8C,EACA,uCACA,0BAEJ,OACE1vD,EAAAA,EAAAA,KAACmqB,EAAmBp2B,EAAAA,EAAA,GAAKgX,GAAK,IAAA5K,UAC5BH,EAAAA,EAAAA,KAACmqB,EAAgBp2B,EAAAA,EAAA,CAEfygB,UAAW,SACX49C,gBAAiB,SAEjBn/C,YAAak/C,EACbE,kBACExrD,EACKyrD,GAAe,YAAYA,IAC3BA,GAAe,WAAWA,IAEjCT,mBAAoBhrD,GAAiBgrD,EACrChB,WAAU98D,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAA,CACRw+D,mBAAoBA,IAAM,MACtB1rD,GAAW,CAAE2jB,OAAQimC,IACrBhrB,GAAQ,CAAE4rB,kBAAmBD,EAAwB3rB,KACrD5Y,GAAa,CAAEwkC,kBAAmBA,IAAM,OACxCE,GAAyB,CAC3BC,iBAAkBF,EAAuBC,KAEvCU,GAAmB,CACrBT,iBAAkBA,IAAM,OACvB,CAAF,GACDT,SAAWyB,IACTxyD,EAAAA,EAAAA,KAAC+wD,EAAQh9D,EAAA,CACP27D,UAAWA,EACXyB,eACEc,EAAkB,8BAAgCd,QAAkB7qD,GAElEksD,KAGL3B,GAELe,WAAY/qD,EAAUkN,EAAa69C,GAC/B7mD,GAAK,IACT0J,OAAM1gB,EAAAA,EAAAA,EAAA,GACDo2B,GACA1V,GACAk9C,GAGLvqD,QAAS6qD,EAAkB,GAAK7qD,GAASvR,KAAK48D,GAAI1+D,EAAA,CAAQ2O,MAAO+vD,EAAKrvD,MAASqvD,KAC/E5vD,SA3DgBA,IAAa,CAACC,EAAG4vD,KACrC,MAAMR,EAAMpvD,EAAKxK,MAAMg+B,QAAQxzB,GAAKA,EAAEjN,KAAK88D,GAAMA,EAAEptD,OAASotD,IAAK7vD,EAAI,CAACA,GAAK,GAAM,GACjFivD,EAAiBG,GACO,oBAAbrvD,GACTA,EAASC,EAAG4vD,EACd,EAsDcvvB,CAAatgC,GACvB0C,MACEA,EACIsB,EACEO,GACIvR,KAAK48D,GAAI1+D,EAAA,CAAQ2O,MAAO+vD,EAAKrvD,MAASqvD,KACvCl8D,QAAQqlD,GAAWkW,EAAc5lD,SAAS0vC,GAAQr2C,SACrD6B,GACIvR,KAAK48D,GAAI1+D,EAAA,CAAQ2O,MAAO+vD,EAAKrvD,MAASqvD,KACvCl8D,QAAQqlD,GAAWz6B,OAAO2wC,KAAmBlW,GAAQr2C,UAAS,QACnEe,OAGY,EAkE1Bg/B,EAASstB,aAAe,CACtB/rD,SAAS,EACT6oD,WAAW,EACX7gD,OAAO,EACP4iD,OAAO,EACPoB,cAAe,OACfC,kBAAkB,EAClBC,YAAY,GAGd,O,gGCvNA,IAhCkBzX,EAAGl5C,SAAQC,cAEzBJ,EAAAA,EAAAA,MAACE,EAAAA,GAAU,CAACE,QAASA,EAASD,OAAQA,EAAQvE,MAAM,QAAOsC,SAAA,EACzD8B,EAAAA,EAAAA,MAAC8O,EAAG,CAAC,cAAY,aAAY5Q,SAAA,EAC3BH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAOmM,KAAK,QACvBV,EAAAA,EAAAA,MAACmP,EAAM,CAAAjR,SAAA,CAAC,0BACgBH,EAAAA,EAAAA,KAAA,SAAM,+BAG9BA,EAAAA,EAAAA,KAACgzD,EAAQ,CAAA7yD,SAAC,iLAIVH,EAAAA,EAAAA,KAAC0K,EAAAA,EAAM,CACL/H,KAAK,KACLU,SAAS,oBACTsH,aAAa,QACb5D,OAAO,UACP0D,GAAG,4BACHwoD,cAAY,EACZC,gBAAc,EAAA/yD,SACf,8BAIH8B,EAAAA,EAAAA,MAAC+O,EAAM,CAAA7Q,SAAA,CAAC,0BACgBH,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,+BAA8B9D,SAAC,mCAQrE,MAAQ4Z,EAAuB9M,EAAAA,GAAvB8M,mBAEF3I,EAAShN,EAAAA,GAAOgrB,EAAE;WACb7rB,EAAAA,GAAOyE;IACd1D,EAAAA,GAAMi7C;;EAIJyT,EAAW5uD,EAAAA,GAAOtO,CAAC;WACdyN,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM8I;;;EAKJ2D,EAAM3M,EAAAA,GAAOC,GAAG;;;;;;;;;EAWhB2M,EAAS5M,EAAAA,GAAOC,GAAG;;;;;;;0BAOCd,EAAAA,GAAO6M;;;;;;IAM7B9L,EAAAA,GAAMgM;;IAENyJ;;;aAGSxW,EAAAA,GAAOyD;MACd1C,EAAAA,GAAM+L;;;uxEC3DZ,MAiMQrD,EAA2CC,EAAAA,GAA3CD,mBAAoB+M,EAAuB9M,EAAAA,GAAvB8M,mBAEtB4G,EAAQvc,EAAAA,GAAOC,GAAG;;;sBAGFd,EAAAA,GAAOY;gBACbgE,EAAAA,GAAO2nC;;IAEnB9iC;;;;;IAKA+M;;;;;EAOE9I,EAAO7M,EAAAA,GAAOC,GAAG;;;;;;;;;EAWjB+M,EAAShN,EAAAA,GAAOC,GAAG;;;IAGrBC,EAAAA,GAAMi7C;;;;;;IAMNxlC;MACEzV,EAAAA,GAAMyI;;EAINomD,EAAc/uD,EAAAA,GAAOC,GAAG;IAC1BC,EAAAA,GAAMi7C;;;;;;IAMNxlC;;;EAKEgF,EAAO3a,EAAAA,GAAOyM,IAAI;;;;;EAOlBE,EAAM3M,EAAAA,GAAOC,GAAG;;;;;;;IAOlB2I;;;EAKEgE,EAAS5M,EAAAA,GAAOC,GAAG;;;;;;;;0BAQCd,EAAAA,GAAO6M;;IAE7B9L,EAAAA,GAAMgN;;;IAGNyI;;;;aAISxW,EAAAA,GAAOyD;;MAEd1C,EAAAA,GAAM+L;;;EAKN8kB,GAAS/wB,EAAAA,EAAAA,IAAOoG,EAAAA,GAAK;WAChBjH,EAAAA,GAAOyE;;;IAGd1D,EAAAA,GAAM8I;;;;IAIN2M;;;;;;;;;;;;aAYSxW,EAAAA,GAAOC;MACdc,EAAAA,GAAM+L;;;;EAMN+iD,EAAuBhvD,EAAAA,GAAOC,GAAG;;;;;EAOjCoI,EAAQrI,EAAAA,GAAO1B,KAAK;;;;;;IAMtB4B,EAAAA,GAAMgN;;;EAKJG,EAAkBrN,EAAAA,GAAOC,GAAG;;;;;;EAQlC,IA1V4B0G,IAC1B,MAAM3U,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAC/D0L,GAAWC,EAAAA,EAAAA,MACXiD,GAAUC,EAAAA,EAAAA,MAE2D3D,EAAAC,GAAvCC,EAAAA,EAAAA,UAA+B,SAAQ,GAApE6xD,EAAU/xD,EAAA,GAAEgyD,EAAahyD,EAAA,GAEuBK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAY5M,EAAA,GAAE6M,EAAe7M,EAAA,GAE6C2M,EAAA/M,GAA3CC,EAAAA,EAAAA,UAAmBpL,EAAY6X,aAAY,GAA1EA,EAAWK,EAAA,GAAEJ,EAAcI,EAAA,GAGjC0D,EAAAzQ,GAF+CC,EAAAA,EAAAA,UAC9CpL,EAAY+X,oBACb,GAFMC,EAAgB4D,EAAA,GAAE3D,EAAmB2D,EAAA,GAItCotC,EAAevwC,UAUnB,IAAI0D,EATJzP,EAAEgM,kBAEFwI,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,iBACdwS,gBAAiB,kBAGnBzb,GAAgB,GAGhB,IACE+D,QAAiBxD,EAAAA,EAAAA,IAAmB3Y,EAAYL,GAAI,CAClDkY,cACAG,qBAEFI,GAAgB,EAClB,CAAE,MAAOY,GACPqD,EAAAA,EAAUC,UAAUtD,GAAMuE,IACxBA,EAAKC,UAAU,8BACfD,EAAKkkC,QAAQ,CACX0b,cAAen9D,EAAYL,IAC3B,GAEN,CAEIwc,GAAUvD,MAAMC,UAClBnN,GACEoN,EAAAA,EAAAA,IAAcnb,EAAAA,EAAC,CAAC,EACXqC,GAAW,IACd6X,cACAE,mBAAoBC,EACpBe,sBAAsB,MAItB/Y,EAAY+U,OAASC,EAAAA,EAAWuqC,UAClC3wC,EAAQrO,MAAKojC,EAAAA,EAAAA,KAAkB3jC,EAAYqP,aAE3CT,EAAQrO,KAAK,KAGfoU,EAAM6D,aACR,EAGImB,EAASA,MACbuH,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,OACdwS,gBAAiB,kBAGnB,KACEja,EAAAA,EAAAA,IAAuB5Z,EAAYL,GACrC,CAAE,MAAOqZ,GACP9D,QAAQ+D,MAAMD,EAChB,CAEApK,EAAQrO,MAAKghB,EAAAA,EAAAA,MAEb1H,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAAA,KAAA9B,SAAA,EACGuM,EAAAA,EAAAA,GAAE,qCACH1M,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CACHC,GAAI,YAAYrU,EAAYC,cAAcD,EAAYE,aAAaF,EAAYL,KAC/E2T,MAAO,CAAEwG,eAAgB,YAAa5M,MAAO,SAAUnD,UAEtDuM,EAAAA,EAAAA,GAAE,yCAGR,EAgBH,OAbAzD,EAAAA,EAAAA,YAAU,KACR,GAAI7S,EAAYL,GAAI,CAClB,GAAIK,EAAY+U,OAASC,EAAAA,EAAWC,QAElC,YADArG,EAAQrO,KAAK,uBAIf28D,EAAc,WAChB,KAA0B,UAAfD,IACTnoD,EAAAA,EAAAA,KACF,GACC,CAAC9U,EAAYL,KAEG,aAAfs9D,GAEApxD,EAAAA,EAAAA,MAAC0e,EAAK,CAAAxgB,SAAA,EACJ8B,EAAAA,EAAAA,MAAC8O,EAAG,CAAA5Q,SAAA,EACFH,EAAAA,EAAAA,KAACiR,EAAI,CAAA9Q,UACHH,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,IAAGtK,UACVH,EAAAA,EAAAA,KAAA,OAAKoK,IAAK0I,SAGd9S,EAAAA,EAAAA,KAACoR,EAAM,CAAAjR,SACJ/J,EAAY+U,OAASwB,EAAAA,EAAS4C,WAC3B7C,EAAAA,EAAAA,GAAE,2CACFA,EAAAA,EAAAA,GAAE,yCAERzK,EAAAA,EAAAA,MAAC8c,EAAI,CAACnQ,SAAUwwC,EAAaj/C,SAAA,EAC3B8B,EAAAA,EAAAA,MAACmxD,EAAoB,CAAAjzD,SAAA,EACnBH,EAAAA,EAAAA,KAACyM,EAAK,CAAAtM,UACHuM,EAAAA,EAAAA,GAAE,CACD,0CACAtW,EAAY+U,OAASwB,EAAAA,EAAS4C,UAAY,YAAc,wBAG5DvP,EAAAA,EAAAA,KAACyP,EAAAA,GAAgB,CACfC,YAAY,aACZC,WACEvZ,EAAY+U,OAASwB,EAAAA,EAAS4C,UAAY,YAAc,mBAE1DhK,MAAO0I,EACPpL,SAAUqL,EACV0B,UAAQ,OAGXxZ,EAAY+U,OAASC,EAAAA,EAAWuqC,YAC/B1zC,EAAAA,EAAAA,MAACmxD,EAAoB,CAAAjzD,SAAA,EACnBH,EAAAA,EAAAA,KAACyM,EAAK,CAAAtM,UAAEuM,EAAAA,EAAAA,GAAE,4CACV1M,EAAAA,EAAAA,KAACyP,EAAAA,GAAgB,CACfC,YAAY,oBACZC,WAAW,YACXpK,MAAO6I,EACPvL,SAAUwL,EACVuB,UAAQ,cAMlB5P,EAAAA,EAAAA,KAACgR,EAAM,CAAA7Q,UACL8B,EAAAA,EAAAA,MAACwP,EAAe,CAAAtR,SAAA,EACdH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACL9O,KAAK,SACL0T,QAAQ,QACR4I,SAAU5B,EACV9K,QAASsM,EACT,cAAY,6BAA4B5P,UAEvCuM,EAAAA,EAAAA,GAAE,iCAEL1M,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACL9O,KAAK,SACLsc,SAAU5B,EACV9K,QAAS27C,EACT,cAAY,uCAAsCj/C,UAEjDuM,EAAAA,EAAAA,GAAE,mDASb1M,EAAAA,EAAAA,KAAC4gB,EAAAA,EAAU,CACTnS,QACEzO,EAAAA,EAAAA,KAACiR,EAAI,CAAClK,OAAO,cAAa5G,UACxBH,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,IAAGtK,UACVH,EAAAA,EAAAA,KAAA,OAAKoK,IAAK0I,QAIhBpE,OAAO1O,EAAAA,EAAAA,KAACmzD,EAAW,CAAAhzD,UAAEuM,EAAAA,EAAAA,GAAE,yCACvBs5B,QACE/jC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,CAAE,mCAEAH,EAAAA,EAAAA,KAACm1B,EAAM,CAAC1qB,GAAG,eAActK,SAAC,gBAG9B,C,irEChMN,MAAMqzD,EAAqB,CACzB3mC,WAAW,EACX8gC,UAAU,EACV8F,YAAa,GA+If,MArIwCC,EAAG5pB,cAAa6pB,0BAEtD,MAAMC,GAAyBhmC,EAAAA,EAAAA,UAAgC,KAC7D,MAAMimC,EAAe/pB,EAAYwH,WAC9B5E,GAAeA,EAAW32C,KAAO49D,IAEpC,MAAO,IAAI7pB,EAAYxe,MAAMuoC,MAAkB/pB,EAAYxe,MAAM,EAAGuoC,GAAc,GACjF,CAAC/pB,IAQFxoC,EAAAC,GANkCC,EAAAA,EAAAA,WAAoB,KACtD,MAAMsyD,EAAgB,CAAC,EAIvB,OAHAhqB,EAAY3B,SAASuE,IACnBonB,EAAcpnB,EAAW32C,IAAOy9D,CAAkB,IAE7CM,CAAa,IACpB,GANKC,EAAUzyD,EAAA,GAAE0yD,EAAa1yD,EAAA,GA+B1B2yD,EAAetlB,IACnBqlB,GAAeE,GAAangE,EAAAA,EAAA,GACvBmgE,GAAa,IAChB,CAACvlB,GAAe,CACd9hB,WAAW,EACX8gC,UAAU,EACV8F,YAAa,MAEd,EAML,OAHAnoD,QAAQkU,IAAIo0C,IAIV5zD,EAAAA,EAAAA,KAAAkC,EAAAA,SAAA,CAAA/B,SACGyzD,EAAuB/9D,KAAK62C,IAC3B,MAAQ32C,EAAwC22C,EAAxC32C,GAAI03C,EAAoCf,EAApCe,kBAAmB0mB,EAAiBznB,EAAjBynB,aACzBx5D,EAAM,QAAS+xC,EAAaA,EAAW/xC,IAAM+xC,EAAW0nB,SACxDC,EAAU5mB,GAAmBphC,WAAW,UAC9CioD,EAA6CP,EAAWh+D,GAAhD82B,EAASynC,EAATznC,UAAW8gC,EAAQ2G,EAAR3G,SAAU8F,EAAWa,EAAXb,YAE7B,OACEzzD,EAAAA,EAAAA,KAACC,EAAS,CAAkCuJ,OAAQzT,IAAO49D,EAAoBxzD,SAEvEwtD,GAEA1rD,EAAAA,EAAAA,MAACwkC,EAAK,CAAAtmC,SAAA,CAAC,kDAELH,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,KAAGiE,KAAMkwD,EAAcI,UAAQ,EAAAp0D,UAC7BH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACrH,SAAS,WAAW0D,OAAO,SAAQ5G,SAAC,uBAOhDk0D,GAEApyD,EAAAA,EAAAA,MAACkI,EAAMlK,UAAS,CAAAE,SAAA,EACdH,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,OAAQqjB,EAAWlqB,KAAK,MAAM6xD,UAAQ,KAC9Cx0D,EAAAA,EAAAA,KAACmK,EAAMmF,QAAO,CACZlF,IAAKzP,EACL6O,QAASqjB,EACTY,QAASA,IAAMwmC,EAAYl+D,GAC3B0+D,OAAQA,KAAMC,OApET/lB,EAoEyB54C,OAnEhDi+D,GAAeE,GAAangE,EAAAA,EAAA,GACvBmgE,GAAa,IAChB,CAACvlB,GAAe,CACd9hB,WAAW,EACX8gC,UAAU,OALShf,KAoE8B,EACnClrC,QAASgE,EAAAA,SAOfzH,EAAAA,EAAAA,KAAC20D,EAAI10D,UAAS,CAAAE,UACZH,EAAAA,EAAAA,KAAA,OAAKyD,QAASgE,EAAAA,GAAgBtH,UAC5BH,EAAAA,EAAAA,KAAC40D,EAAAA,GAAQ,CACPtnB,KAAM3yC,EACN6F,SACER,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CACLsJ,MAAO,CAAEqP,UAAW,QACpBvP,QAAM,EACN7G,KAAK,MACL6xD,UAAQ,EACR/qD,OAAO,aAGXorD,YAAaA,IAAMZ,EAAYl+D,GAC/B++D,cAAgBC,GA/EdC,GAAGC,YAAkCtmB,KACzDqlB,GAAeE,GAAangE,EAAAA,EAAA,GACvBmgE,GAAa,IAChB,CAACvlB,GAAe,CACd9hB,WAAW,EACX8gC,UAAU,EACV8F,YAAawB,MAEd,EAuEuCD,CAAcD,EAAKh/D,GAAKoK,UAE9C0sB,GACAv0B,MAAMC,KAAK,IAAID,MAAMm7D,IAAc,CAACx2D,EAAG8nC,KACrC/kC,EAAAA,EAAAA,KAACk1D,EAAAA,GAAI,CACH10D,QAAQ,GACR20D,WAAYpwB,EAAI,EAEhBqwB,uBAAuB,EACvBC,iBAAiB,EACjBR,YAAaA,IAAMZ,EAAYl+D,IAH1B,kBAAkBA,UAAWgvC,EAAI,cApDxC,sBAAsBhvC,IA+D1B,KAGf,EAMP,MAAMkK,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;;;;;IAUxB,EAAGmF,aAAcA,GAAU;EAGzBi9B,EAAQriC,EAAAA,GAAOC,GAAG;;;IAGpBC,EAAAA,GAAMuG;WACCtH,EAAAA,GAAOY;;EAIZgG,EAAQ,CACZlK,UAAWmE,EAAAA,GAAOC,GAAG;;;;;;;IAQrBiL,QAASlL,EAAAA,GAAOwG,GAAG;;;;;;MAMf,EAAGpB,aAAcA,GAAU;KAI3BmrD,EAAM,CACV10D,UAAWmE,EAAAA,GAAOC,GAAG;;;;;;;KCxDvB,MAzIsCytC,EACpChI,cACAiI,yBACAC,4BACAC,mBAEA,MAAM7vC,EAAS0nC,EAAYpzC,OAAS,GAAuC,qBAA3Bq7C,EAE1C5M,EAAannB,IACjB,OAAQA,EAAMuuC,MACZ,IAAK,SACHta,IACA,MACF,IAAK,YACHD,GAA2BsjB,GAAapM,KAAK7qC,IAAI,EAAGi3C,EAAY,KAChE,MACF,IAAK,aACHtjB,GAA2BsjB,GAAapM,KAAK9qC,IAAI0rB,EAAYpzC,OAAS,EAAG4+D,EAAY,KAEzF,EAiBF,IAdArsD,EAAAA,EAAAA,YAAU,KACJ7G,IAEFnB,SAASC,iBAAiB,UAAWikC,GAAW,GAEhDlkC,SAASs0D,cAAc,QAAS7rD,MAAM41B,SAAW,UAG5C,KACLr+B,SAAS8iB,oBAAoB,UAAWohB,GAAW,GACnDlkC,SAASs0D,cAAc,QAAS7rD,MAAM41B,SAAW,OAAO,IAEzD,CAACl9B,KAECA,EAAQ,OAAO,KAEpB,MAAMozD,EAAoB1rB,EAAYiI,GAEhC0jB,EAAmBA,CAACz3C,EAAmB03C,KAC3C13C,EAAMvW,kBACNuqC,EAA0BD,EAAyB2jB,EAAU,EAQvDjoB,EAAmD+nB,EAAnD/nB,kBAAmBD,EAAgCgoB,EAAhChoB,cAAe2mB,EAAiBqB,EAAjBrB,aACpC39D,EAAO,UAAWg/D,EAAoBA,EAAkB9mD,MAAQ8mD,EAAkBjoB,SAClF8mB,EAAU5mB,GAAmBphC,WAAW,UAExCspD,GACJ1zD,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC41D,EAAU,CACT,gBACA,kBAAgB,6BAChBC,UAAW,EACX1qD,KAAK,YAEPnL,EAAAA,EAAAA,KAAC81D,EAAO,CAAA31D,UACN8B,EAAAA,EAAAA,MAACqN,EAAO,CAAC7L,QAASwuC,EAAc,cAAY,6BAA4B9xC,SAAA,EACtEH,EAAAA,EAAAA,KAACoR,EAAOwkD,WAAU,CAACnyD,QAASgE,EAAAA,GAAgBtH,UAC1C8B,EAAAA,EAAAA,MAACmP,EAAOnR,UAAS,CAAAE,SAAA,EACf8B,EAAAA,EAAAA,MAACmP,EAAO2kD,SAAS91D,UAAS,CAAAE,SAAA,EACxBH,EAAAA,EAAAA,KAACoR,EAAO2kD,SAASrvD,KAAI,CAAAvG,SAAE3J,KACvByL,EAAAA,EAAAA,MAACmP,EAAO2kD,SAAS3qC,KAAI,CAAAjrB,SAAA,EAClB61D,EAAAA,EAAAA,IAAsBvoB,GAAmB,YAASwoB,EAAAA,EAAAA,IAAYzoB,UAGnEvrC,EAAAA,EAAAA,MAACmP,EAAOvE,QAAO,CAAA1M,SAAA,EACbH,EAAAA,EAAAA,KAAA,KAAGiE,KAAMkwD,EAAcI,UAAQ,EAAAp0D,UAC7BH,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,WACTkE,QAAQ,cACR5E,KAAK,KACL6b,gBAAgB,cAGpBxe,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,QACTkE,QAAQ,cACR5E,KAAK,KACL6b,gBAAgB,SAChB/a,QAASwuC,EACT,cAAY,0BAKpBjyC,EAAAA,EAAAA,KAACk2D,EAAK,CACJvyD,SAAS,OACTwM,SAAqC,IAA3B4hC,EACVtuC,QAAUua,GAAsBy3C,EAAiBz3C,GAAQ,GAAG7d,UAE5DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,eAAemM,KAAK,UAEjC3C,EAAAA,EAAAA,KAACk2D,EAAK,CACJvyD,SAAS,QACTwM,SAAU4hC,IAA2BjI,EAAYpzC,OAAS,EAC1D+M,QAAUua,GAAsBy3C,EAAiBz3C,EAAO,GAAG7d,UAE3DH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,gBAAgBmM,KAAK,UAElC3C,EAAAA,EAAAA,KAAC0zD,EAA+B,CAC9B5pB,YAAaA,EACb6pB,oBAAqB6B,EAAkBz/D,KAExC+zC,EAAYpzC,OAAS,IACpBsJ,EAAAA,EAAAA,KAACwG,EAAU2vD,OAAM,CAAC9B,QAASA,EAAS5wD,QAASgE,EAAAA,GAAgBtH,SAC1D2pC,EAAYj0C,KAAI,CAAC62C,EAAYyD,KAC5BnwC,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CAENj6B,QAAS,UAAWm3B,EAAaA,EAAWh+B,MAAQg+B,EAAWa,SAC/D5pC,SAAS,MACTyyD,eAAe,EACfC,YAAY,EAAMl2D,UAElBH,EAAAA,EAAAA,KAACwG,EAAU8vD,IAAG,CACZlsD,IAAKsiC,EAAW6pB,cAChBt0B,QAASkO,IAAU4B,EACnBtuC,QAAUua,GA9ECw4C,EAACx4C,EAAmBy4C,KAC/Cz4C,EAAMvW,kBACNuqC,EAA0BykB,EAAgB,EA4EMD,CAAqBx4C,EAAOmyB,MATzD,sBAAsBzD,EAAW32C,4BAoBtD,OAAOqM,EAASjB,EAAAA,aAAsBw0D,EAAO10D,SAASy1D,MAAQ,IAAI,EAKpE,MAAMd,EAAaxxD,EAAAA,GAAOC,GAAG;;;;;;;;;wCASWd,EAAAA,GAAOg7B,mBAAmBh7B,EAAAA,GAAOyE;;EAInE8tD,EAAU1xD,EAAAA,GAAOC,GAAG;;;;;;;;;;;EAapBiL,EAAUlL,EAAAA,GAAOC,GAAG;;;;;;;;EAUpB+M,EAAS,CACbwkD,WAAYxxD,EAAAA,GAAOC,GAAG;;;;;;;;;;;0CAWkBd,EAAAA,GAAOg7B;IAE/Ct+B,UAAWmE,EAAAA,GAAOC,GAAG;;;;;IAMrB0xD,SAAU,CACR91D,UAAWmE,EAAAA,GAAOC,GAAG;;;;;;eAMVd,EAAAA,GAAOY;MAElBuC,KAAMtC,EAAAA,GAAOC,GAAG;QACZC,EAAAA,GAAM8I;QACNjF,EAAAA,GAAOC;MAEXgjB,KAAMhnB,EAAAA,GAAOC,GAAG;;QAEZC,EAAAA,GAAM4W;OAGZrO,QAASzI,EAAAA,GAAOC,GAAG;;;KAMf6xD,EAAQ9xD,EAAAA,GAAOoe,MAAM;;;IAGvB,EAAG7e,cAAe,GAAGA,gBAAuBA;;;;;;;;gBAQhCJ,EAAAA,GAAOY;;;gBAGPgE,EAAAA,GAAO2nC;;;;;;oCAMavsC,EAAAA,GAAOyE;;;IAGvC,EAAGmI,cAAeA,GAAY;EAG5B3J,EAAY,CAChB2vD,OAAQ/xD,EAAAA,GAAOC,GAAG;;;;;;;;;;;;;MAad,EAAGgwD,cACFA,GACD,qBACY9wD,EAAAA,GAAOyE;IASvBsuD,IAAKlyD,EAAAA,GAAOwG,GAAG;;;;kBAICrH,EAAAA,GAAOY;;;;;MAKnB,EAAG89B,aACHA,GACA,wDAE0B1+B,EAAAA,GAAOC;;;;;;itCC1ShC,SAASmzD,IACd,MAAgDr1D,EAAAC,GAAZC,EAAAA,EAAAA,UAAS,CAAC,GAAE,GAAzCo1D,EAAUt1D,EAAA,GAAEu1D,EAAav1D,EAAA,GAEhC,MAAO,CAAEs1D,aAAYE,QADLA,IAAMD,EAAc,CAAC,GAEvC,C,gjCCUO,SAASE,EAAkBhhE,GAChC,MAAO,CAAC,eAAgBA,EAC1B,CAEO,SAASihE,EAAajhE,GAM3B,MAA8DuL,EAAAC,GAA5BC,EAAAA,EAAAA,YAA4B,GAAvDm0C,EAASr0C,EAAA,GAAE21D,EAAY31D,EAAA,GACQK,EAAAJ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA/B01D,EAAKv1D,EAAA,GAAEw1D,EAAQx1D,EAAA,GACwC2M,EAAA/M,GAA5BC,EAAAA,EAAAA,UAAyB,IAAG,GAAvD41D,EAAS9oD,EAAA,GAAE+oD,EAAY/oD,EAAA,GAmF9B,MAAO,CAAEqnC,YAAWuhB,QAAOE,YAAWE,oBAjFhBrmC,EAAAA,EAAAA,GAAS,CAC7BzD,SAAUupC,EAAkBhhE,GAC5Bm7B,QAASriB,UACP,IAAK9Y,EACH,OAAO,KAGT,aADuBwhE,EAAAA,EAAAA,IAAQxhE,EAChB,EAEjB03B,QAASA,KACP0pC,EAAS,IACTE,EAAa,GAAG,EAElBjqC,UAAY7a,IACV,IAAKA,EAGH,OAFA4kD,EAAS,SACTE,EAAa,IAGf,MAAMnxD,EAAOqM,EAASrM,KAChBsxD,EAAoBtxD,EAA2BnL,aACrDk8D,EAAa,CACXlhE,GAAImQ,EAAKnQ,GACTS,KAAM0P,EAAK1P,KACXoH,MAAOsI,EAAKtI,MACZ6H,WAAYS,EAAKT,WACjBu0B,SAAU9zB,EAAK8zB,SACfy9B,cAAeD,EAAiBC,cAChC18D,aAAc,CACZhF,GAAIyhE,EAAiBzhE,GACrB2Y,MAAO8oD,EAAiB9oD,OAAS,GACjC5U,SAAU09D,EAAiB19D,UAAY,MAI3Cq9D,EAASK,EAAiBN,OAAS,IACnC,MAAMQ,EAAsB,GAExBF,EAAiBt0B,eACnBw0B,EAAI/gE,KAAK,CACPZ,IAAK,EACL+D,SAAU09D,EAAiB9kC,YAAc,GACzChkB,MAAO8oD,EAAiB9oD,OAAS,GACjCipD,SACEH,EAAiBI,uBAAyBJ,EAAiBK,oBACvD,GAAGL,EAAiBI,uBAAyB,SAC3CJ,EAAiBK,qBAAuB,WAE1CvxD,IAINkxD,EAAiBM,SAAS/hE,IAC5B2hE,EAAI/gE,KAAK,CACPZ,IAAK,EACL+D,SAAU09D,EAAiBM,QAAQC,cAAgB,GACnDrpD,MAAO8oD,EAAiB96B,qBAAuB86B,EAAiB9oD,OAAS,QAAKpI,EAC9EqxD,SACEH,EAAiBM,QAAQE,YAAcR,EAAiBM,QAAQG,SAC5D,GAAGT,EAAiBM,QAAQE,YAAc,SACxCR,EAAiBM,QAAQG,UAAY,WAEvC3xD,IAIVoxD,EAAI/gE,QACC6gE,EAAiBU,WAAWriE,KAAKsiE,IAAS,CAC3CpiE,GAAIoiE,EAAUpiE,GACd+D,SAAUq+D,EAAUr+D,UAAY,GAChC4U,MAAOypD,EAAUC,QAAUD,EAAUE,gBAAkB,GACvDV,SACEQ,EAAUH,YAAcG,EAAUF,SAC9B,GAAGE,EAAUH,YAAc,SAASG,EAAUF,UAAY,WAC1D3xD,OAGV+wD,EAAaK,EAAI,IA7Eb7qC,UAkFV,CAEO,SAASyrC,EAAgBC,GAI9B,MAA0EvmD,EAAAzQ,GAAlCC,EAAAA,EAAAA,UAA+B,IAAG,GAAnE7F,EAAYqW,EAAA,GAAEwmD,EAAexmD,EAAA,GACpCymD,EAAgC9B,IAAxBC,EAAU6B,EAAV7B,WAAYE,EAAO2B,EAAP3B,QAgBpB,OAdA7tD,EAAAA,EAAAA,YAAU,KACJsvD,GACF,WACE,IACE,MACMG,SADqBnlD,EAAAA,EAAIC,IAAI,iCAAiC+kD,MAC1CvpD,KAAKrT,aAC/B68D,EAAgBE,EAClB,CAAE,MAAOz7D,GACPu7D,EAAgB,GAClB,CACD,EARD,EASF,GACC,CAACD,EAAoB3B,IAEjB,CAAEj7D,eAAcm7D,UACzB,CAEO,SAAS6B,EAAYJ,GAI1B,MAA8DrmD,EAAA3Q,GAA9BC,EAAAA,EAAAA,UAA2B,IAAG,GAAvD5F,EAAQsW,EAAA,GAAE0mD,EAAW1mD,EAAA,GAC5B2mD,EAAgClC,IAAxBC,EAAUiC,EAAVjC,WAAYE,EAAO+B,EAAP/B,QAgBpB,OAdA7tD,EAAAA,EAAAA,YAAU,KACJsvD,GACF,WACE,IACE,MACMO,SADqBvlD,EAAAA,EAAIC,IAAI,6BAA6B+kD,MACrCvpD,KAAKpT,SAChCg9D,EAAYE,EACd,CAAE,MAAO77D,GACP27D,EAAY,GACd,CACD,EARD,EASF,GACC,CAACL,EAAoB3B,IAEjB,CAAEh7D,WAAUk7D,UACrB,CAEO,SAASiC,EAAWR,GAIzB,MAA2DnmD,EAAA7Q,GAA7BC,EAAAA,EAAAA,UAA0B,IAAG,GAApD9F,EAAO0W,EAAA,GAAE4mD,EAAU5mD,EAAA,GAC1B6mD,EAAgCtC,IAAxBC,EAAUqC,EAAVrC,WAAYE,EAAOmC,EAAPnC,QAgBpB,OAdA7tD,EAAAA,EAAAA,YAAU,KACJsvD,GACF,WACE,IACE,MACMW,SADqB3lD,EAAAA,EAAIC,IAAI,4BAA4B+kD,MACrCvpD,KAAKtT,QAC/Bs9D,EAAWE,EACb,CAAE,MAAOj8D,GACP+7D,EAAW,GACb,CACD,EARD,EASF,GACC,CAACT,EAAoB3B,IAEjB,CAAEl7D,UAASo7D,UACpB,CAEO,SAASqC,EACdZ,EACAa,GAAoB,GAEpB,MAA6E18C,EAAAnb,GAA3CC,EAAAA,EAAAA,UAAwC,IAAG,GAAtEnN,EAASqoB,EAAA,GAAE28C,EAAY38C,EAAA,GAqB9B,OAnBAzT,EAAAA,EAAAA,YAAU,KACJsvD,GACF,WACE,IACE,MAAMn5C,QAAqB7L,EAAAA,EAAIC,IAAI,gCAAgC+kD,KAC7De,EAAeF,EACjBh6C,EAAapQ,KAAK3a,UAClB+qB,EAAapQ,KAAK3a,UAAUkC,QAAQT,GAAMA,EAAEgnC,YAChDu8B,EAAaC,EACf,CAAE,MAAOx2D,GACP2P,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,uCAAuC,IAExDylD,EAAa,GACf,CACD,EAbD,EAcF,GACC,CAACd,IAEGlkE,CACT,C,mvCCvHA,MApFoCklE,EAAGn3D,SAAQC,cAC7C,MAAkDf,EAAAC,GAAtBC,EAAAA,EAAAA,UAAmB,IAAG,GAA3CkhC,EAAMphC,EAAA,GAAEmtD,EAASntD,EAAA,GACwBK,EAAAJ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAzCktD,EAAU/sD,EAAA,GAAEgtD,EAAahtD,EAAA,GACU2M,EAAA/M,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAnCogC,EAAOtzB,EAAA,GAAEsgD,EAAUtgD,EAAA,GAC6B0D,EAAAzQ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAYyD,EAAA,GAAExD,EAAewD,EAAA,GACsBE,EAAA3Q,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAnDg4D,EAAetnD,EAAA,GAAEunD,EAAkBvnD,EAAA,GAqC1C,OACElS,EAAAA,EAAAA,KAACmC,EAAAA,EAAU,CACTC,OAAQA,EACRC,QAASA,EACTkK,oBAAoB,EACpB1O,MAAM,QACNyE,WAAW,yBAAwBnC,UAEnC8B,EAAAA,EAAAA,MAACqN,EAAO,CAAC,cAAY,iCAAgCnP,SAAA,EACnD8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACmvD,EAAAA,GAAa,CACZ/nD,QAAS,GACT7B,MAAOm9B,EAAO7sC,IAAI+a,EAAAA,IAClB/N,SAAU4rD,EACVtoB,SAAUwoB,EACV17C,YAAY,kBACZo/C,kBAAoB7gD,GAAkB,WAAWA,uBAE5B,IAAtBk9C,EAAWh4D,SAAgBsJ,EAAAA,EAAAA,KAACymC,EAAK,CAAAtmC,SAAEuuD,QAEtC1uD,EAAAA,EAAAA,KAACqvD,EAAQ,CACPp8C,YAAY,+BACZ2yB,KAAK,IACLrgC,MAAOq8B,EACP/+B,SAAWC,GAAM8rD,EAAW9rD,EAAEE,OAAOuC,UAEvCtD,EAAAA,EAAAA,MAAC4N,EAAM,CAAA1P,SAAA,EACLH,EAAAA,EAAAA,KAACymC,EAAK,CAAAtmC,SAAEq5D,KACRx5D,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL8O,KAAK,KACLwN,SAAU5B,GAAsC,IAAtBmgD,EAAWh4D,QAAkC,IAAlBgsC,EAAOhsC,OAC5D+M,QAnEOoL,UACfL,GAAgB,GAChBirD,EAAmB,IACnB,KACEniD,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBmiD,OAAQ,CAC7Bh3B,SACAjrB,aAAc,8BACdmqB,UACA+3B,SAAU,eAGZ,MAAAC,QACQC,EAAAA,EAAAA,IAAiCn3B,EAAQd,GADzCk4B,EAAiBF,EAAjBE,kBAAmBC,EAAeH,EAAfG,gBAAiBC,EAAkBJ,EAAlBI,mBAGtCC,EAAmC,GACrCH,GAAmBG,EAAuBtjE,KAAK,GAAGmjE,WAClDC,GAAiBE,EAAuBtjE,KAAK,GAAGojE,aAChDC,GACFC,EAAuBtjE,KAAK,GAAGqjE,6BAEjC,MAAME,EAAe,iCAAiCD,EAAuBxjE,KAAK,QAClFwZ,EAAAA,GAAMhB,QAAQirD,GAEd73D,GACF,CAAE,MAAO+M,GACHA,EAAImD,SACNknD,EAAmBrqD,EAAImD,SAASvD,MAEhCyqD,EAAmB,0CAEvB,CAAC,QACCjrD,GAAgB,EAClB,GAmC0BrO,SACnB,uBAKM,EAMjB,MAAMmP,EAAUlL,EAAAA,GAAOC,GAAG;;;;;EAOpBoiC,EAAQriC,EAAAA,GAAOC,GAAG;IACpBC,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOS;;EAIZqrD,EAAWjrD,EAAAA,GAAO8qC,QAAQ;IAC5B5qC,EAAAA,GAAM8I;;;;sBAIY7J,EAAAA,GAAO6M;;;;MAIvB9L,EAAAA,GAAM8I;aACC7J,EAAAA,GAAOyD;;;EAKd6I,EAASzL,EAAAA,GAAOC,GAAG;;;;;yBCtFzB,MAxB4B81D,EAAGzmD,UAAS0mD,+BAEpCn4D,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAACipC,EAAO,CAAA9oC,SAAC,uEACTH,EAAAA,EAAAA,KAAA,OAAAG,UACEH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL/H,KAAK,KACL9O,KAAK,SACL4P,QAAUX,KACRwU,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,cACdq9B,aAAcphC,EAAQ4L,OAExB86C,EAAyBt3D,EAAG4Q,GAAS,EAAK,EAC1CvT,SACH,cAUT,MAAMF,EAAYmE,EAAAA,GAAOC,GAAG;;;;sBAINd,EAAAA,GAAOwE;;;EAIvBkhC,EAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMkU;;0lEC7BV,MAoNMvY,EAAYmE,EAAAA,GAAOC,GAAG;;;EAKtB0M,EAAM3M,EAAAA,GAAOC,GAAG;;;;;;;;;;EAYhB4M,EAAO7M,EAAAA,GAAOwG,GAAG;;;EAKjByvD,EAAmBj2D,EAAAA,GAAOC,GAAG;;EAI7B+M,EAAShN,EAAAA,GAAOC,GAAG;WACdd,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM2qB;EAGJqX,EAAYliC,EAAAA,GAAOC,GAAG;WACjBd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM+L;EAGJiqD,EAAiBl2D,EAAAA,GAAOC,GAAG;;kCAEC,EAAGsa,aAAcA;;;IAG/C1R,EAAAA,GAAkB8b;;;EAKhB/X,EAAS5M,EAAAA,GAAOC,GAAG;;;;;;;0BAOCd,EAAAA,GAAO6M;;IAE7B9L,EAAAA,GAAM8I;;;EAKJmtD,EAAen2D,EAAAA,GAAOoe,MAAM;;;;;;;IAO9Ble,EAAAA,GAAMgN;;WAEC/N,EAAAA,GAAOC;;;2BAGSD,EAAAA,GAAO67B;mCACC77B,EAAAA,GAAO67B;;;;aAI7B77B,EAAAA,GAAOyE;6BACSzE,EAAAA,GAAOyE;qCACCzE,EAAAA,GAAOyE;;;;aAI/BzE,EAAAA,GAAOyE;;;EAKdwyD,EAAkBp2D,EAAAA,GAAOC,GAAG;;;;;;EAQ5Bo2D,EAAYr2D,EAAAA,GAAOC,GAAG;;;;;EAOtBq2D,EAAgBt2D,EAAAA,GAAOC,GAAG;IAC5BC,EAAAA,GAAMkU;EAGJmiD,EAAoBv2D,EAAAA,GAAOC,GAAG;WACzBd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM8I;EAGV,MApU4BwtD,EAAGv4D,UAASD,aACtC,MAAO4pB,EAAiCzqB,GAAjBmvB,EAAAA,EAAAA,KAAiB,GAArB,GACb1rB,GAAUC,EAAAA,EAAAA,MACV41D,EAAmB7uC,EAAaxY,IAAI,gBAAkB,GAItDsnD,EAAuB9uC,EAAaxY,IAAI,QAAUwY,EAAaxY,IAAI,SAAW,GAInFlS,EAAAC,GAFuBC,EAAAA,EAAAA,UACD,MAArBq5D,EAA2B,gBAAkB,iBAC9C,GAFMhpD,EAAIvQ,EAAA,GAAEwQ,EAAOxQ,EAAA,GAGqEK,EAAAJ,GAAnCC,EAAAA,EAAAA,UAAS,IAA0B,GAAlFu5D,EAAmBp5D,EAAA,GAAEq5D,EAAsBr5D,EAAA,GACgC2M,EAAA/M,GAAtBC,EAAAA,EAAAA,UAAmB,IAAG,GAA3Ey5D,EAAsB3sD,EAAA,GAAE4sD,EAAyB5sD,EAAA,GACV0D,EAAAzQ,GAAlBC,EAAAA,EAAAA,YAAkB,GAAvC0H,EAAM8I,EAAA,GAAEmpD,EAASnpD,EAAA,GAC8CE,EAAA3Q,GAAxBC,EAAAA,EAAAA,WAAkB,GAAM,GAA/D45D,EAAelpD,EAAA,GAAEmpD,EAAkBnpD,EAAA,GAC+BE,EAAA7Q,GAAzCC,EAAAA,EAAAA,UAAsC,IAAG,GAAlE85D,EAAQlpD,EAAA,GAAEmpD,EAAWnpD,EAAA,GAEtBopD,GAAe3sD,MAAOpQ,EAAKg9D,KAC/B,IACE,IAAKvyD,EACH,aAGIwyD,EAAAA,EAAAA,IAA0BxyD,EAAQzK,EAAKg9D,GAE7CF,GAAaI,IACX,MAAMC,EAAc,IAAID,GAElBE,EAAeD,EAAYtqB,WAAWwqB,GAAYA,EAAQr9D,MAAQA,IAOxE,OALAm9D,EAAYC,GAAa9nE,EAAAA,EAAA,GACpB6nE,EAAYC,IAAa,IAC5BJ,YAGKG,CAAW,GAEtB,CAAE,MAAOxsD,GACPqD,EAAAA,EAAUC,UAAUtD,GAAMuE,IACxBA,EAAKC,UAAU,oCACfD,EAAKkkC,QAAQ,CACXijB,uBACAW,UACAh9D,OACA,GAEN,GAGI27D,GAA2BvrD,MAC/B/L,EACA4Q,EACA+sC,KAEA39C,EAAEgM,iBAEEgsD,SACI/Z,EAAAA,EAAAA,IAA4B,CAChCxe,UAAW7uB,EAAQ3d,GACnB0qD,eACAO,OAAQC,EAAAA,EAA4B8a,gBACpCC,qBAAsBlB,IAKxBI,EADEza,EACwB,IAAIwa,EAAuB1kE,QAAQR,GAAOA,IAAO2d,EAAQ3d,MAEzD,IAAIklE,EAAwBvnD,EAAQ3d,IAChE,EA4BF,OAzBAkT,EAAAA,EAAAA,YAAU,KACR,WACE,GAAI6xD,EAAsB,CACxB,MAAMvoD,QAAiB0pD,EAAAA,EAAAA,IAAyCnB,GAEhEO,EAAmB9oD,EAAS2pD,mBAC5Bf,EAAU5oD,EAAS8a,SACnBkuC,EACEhpD,EAAS4pD,uBAAuB5lE,QAAQulE,GAAiC,cAArBA,EAAQM,YAG1D7pD,EAAS8pD,sBAAsB3lE,QACjCskE,EAAuBzoD,EAAS8pD,uBAChCnB,EACE3oD,EAAS8pD,sBACN9lE,QAAQmd,IAAaA,EAAQktC,gBAC7B/qD,KAAK6d,GAAYA,EAAQ3d,OAG9B+b,EAAQ,gBAEZ,CACD,EArBD,EAqBI,GACH,CAACgpD,IAES,kBAATjpD,GAEA7R,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CACTE,QAASA,EACTD,OAAQA,EACRvE,MAAsC,IAA/Bk9D,EAAoBrkE,OAAe,SAAW,QACrDsH,OAAO,OAAMmC,UAEb8B,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAAC8O,EAAG,CAAA5Q,SAAA,EACFH,EAAAA,EAAAA,KAACiR,EAAI,CAAC7G,IAAK0I,EAAUxI,IAAI,eACzBrI,EAAAA,EAAAA,MAACo4D,EAAgB,CAAAl6D,SAAA,EACfH,EAAAA,EAAAA,KAACsmC,EAAS,CAAAnmC,SAAC,+BACXH,EAAAA,EAAAA,KAACoR,EAAM,CAAAjR,SAAC,wDAEVH,EAAAA,EAAAA,KAACw6D,EAAe,CAAAr6D,SACbm7D,EAASzlE,KAAKimE,IACb75D,EAAAA,EAAAA,MAACw4D,EAAS,CAAmB1zD,OAAO,UAAS5G,SAAA,EAC3CH,EAAAA,EAAAA,KAAC85B,EAAAA,GAAM,CACL72B,QAAS64D,EAAQL,QACjB54D,SAAUA,MACRyU,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,mCACdhZ,IAAKq9D,EAAQr9D,IACbg9D,SAAUK,EAAQL,UAEpBD,GAAaM,EAAQr9D,KAAMq9D,EAAQL,QAAQ,EAE7C10D,OAAO,aAET9E,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAAC06D,EAAa,CAAAv6D,SAAE27D,EAAQptD,SACxB1O,EAAAA,EAAAA,KAAC26D,EAAiB,CAAAx6D,SAAE27D,EAAQ5hE,mBAhBhB4hE,EAAQr9D,aAsB9BuB,EAAAA,EAAAA,KAACgR,EAAM,CAAA7Q,UACLH,EAAAA,EAAAA,KAACu6D,EAAY,CACX92D,QAASA,MACP6T,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,gCAEhB6jD,EAASnzB,SAAS2zB,GAAYN,GAAaM,EAAQr9D,KAAK,IAAO,EAC/D0B,SACH,qDAUTH,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CACTE,QAASA,EACTD,OAAQA,EACRvE,MAAsC,IAA/Bk9D,EAAoBrkE,OAAe,SAAW,QACrDsH,OAAO,OAAMmC,UAEb8B,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAAC8O,EAAG,CAAA5Q,SAAA,EACFH,EAAAA,EAAAA,KAACiR,EAAI,CAAC7G,IAAK0I,EAAUxI,IAAI,eACzBrI,EAAAA,EAAAA,MAACo4D,EAAgB,CAAAl6D,SAAA,EACfH,EAAAA,EAAAA,KAACsmC,EAAS,CAAAnmC,SAAC,iCACXH,EAAAA,EAAAA,KAACoR,EAAM,CAAAjR,SAAC,wEAEVH,EAAAA,EAAAA,KAACs6D,EAAc,CAAC37C,QAAwC,IAA/Bo8C,EAAoBrkE,OAAe,EAAI,EAAEyJ,SAC/D46D,EAAoBllE,KAAK6d,GACxBunD,EAAuB/uD,SAASwH,EAAQ3d,KACtCiK,EAAAA,EAAAA,KAACm6D,EAAmB,CAElBzmD,QAASA,EACT0mD,yBAA0BA,IAFrB1mD,EAAQ3d,KAKfiK,EAAAA,EAAAA,KAACqmD,EAAAA,EAAO,CAEN3yC,QAASA,EACTjQ,QAAUX,GAAMs3D,GAAyBt3D,EAAG4Q,GAAS,GACrDoxC,6BAA2B,GAHtBpxC,EAAQ3d,YASvBkM,EAAAA,EAAAA,MAAC+O,EAAM,CAAA7Q,SAAA,CAAC,0EAENH,EAAAA,EAAAA,KAACu6D,EAAY,CACX92D,QAASA,KACH23D,EACFtpD,EAAQ,iBAGR9M,EAAQrO,MAAK2lE,EAAAA,EAAAA,KAAsB,CAAEC,EAAG,oBAE1CjlD,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5ByS,gBAAiB,sBACjBxS,aAAc,oCACd,EACFtX,SACH,sCAKM,E,6CClMjB,OA1BmCq8D,EACjCp6D,SACAC,UACAszC,gBAaE31C,EAAAA,EAAAA,KAACouD,GAAAA,EAAuB,CACtBhsD,OAAQA,EACRC,QAASA,EACTC,WAAW,0BACX+rD,UAAU,wCACVC,YAhBgBA,CAACvxC,EAAe6kB,KAClC,MAAM5yB,EAAO,CACXytD,aAAc9mB,EAAU5/C,GACxBgnB,QACA6kB,WAGF,OAAO86B,EAAAA,GAAAA,IAAsB1tD,EAAK,I,mjCCuLtC,OA/KgC2tD,EAC9Bv6D,SACAC,UACAu6D,kBACAC,cACAC,eACAC,gCAA+B,MAE/B,IAAK36D,IAAWw6D,EAAiB,OAAO,KAExC,MAA8Ct7D,EAAAC,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAvCw7D,EAAS17D,EAAA,GAAE27D,EAAY37D,EAAA,GACiCK,EAAAJ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxD07D,EAAgBv7D,EAAA,GAAEs4C,EAAmBt4C,EAAA,GAE5Cw7D,GAA4DnG,EAAAA,GAAAA,IAAa4F,GAAjEjnB,EAASwnB,EAATxnB,UAAWuhB,EAAKiG,EAALjG,MAAOE,EAAS+F,EAAT/F,UAAWE,EAAkB6F,EAAlB7F,mBAC/B37D,GAAe28D,EAAAA,GAAAA,IAAgB3iB,GAAW56C,aAAahF,IAAI4F,aAC3DC,GAAW+8D,EAAAA,GAAAA,IAAYhjB,GAAW56C,aAAahF,IAAI6F,SACnDF,GAAUq9D,EAAAA,GAAAA,IAAWpjB,GAAW56C,aAAahF,IAAI2F,QACjDrH,GAAY8kE,EAAAA,GAAAA,IAAaxjB,GAAW56C,aAAahF,GAAIgnE,GAErDK,GAAep7D,EAAAA,GAAAA,KAAarO,GAAqBA,EAAMmK,OAAOE,SAC9D5H,GAAc4L,EAAAA,GAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/DinE,GAAczvC,EAAAA,EAAAA,UAClB,IACE,CACE,CACElrB,MAAO,eACPsM,KAAMrT,GAER,CACE+G,MAAO,UACPsM,KAAMpT,GAER,CACE8G,MAAO,UACPsM,KAAMtT,GAER,CACEgH,MAAO,YACPsM,KAAM3a,IAERkC,QAAQ+mE,GAAQA,EAAItuD,KAAKtY,OAAS,KACtC,CAACiF,EAAcC,EAAUF,EAASrH,KAGpC4U,EAAAA,EAAAA,YAAU,KACRg0D,EAAaI,EAAY,IAAI36D,MAAM,GAClC,CAAC26D,IAEJ,MAAME,EAAOF,EAAYxnE,KAAKynE,IAAG,CAC/B7+D,IAAK6+D,EAAI56D,MACTA,MAAO46D,EAAI56D,MACX86D,MAAOF,EAAItuD,KAAKtY,WAGlB,OAAKi/C,GAGH1zC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACw8D,GAA0B,CACzB7mB,UAAWA,EACXvzC,OAAQ86D,EACR76D,QAASA,IAAM43C,GAAoB,MAErCj6C,EAAAA,EAAAA,KAACmiB,EAAAA,EAAc,CAAC/f,OAAQA,EAAQC,QAASA,EAAQlC,UAC/CH,EAAAA,EAAAA,KAACC,GAAS,CAAC,cAAY,6BAA4BE,SAChDm3D,GACCt3D,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,QAAM,EAACE,MAAO,CAAE0Q,IAAK,UAE7BnY,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAACw7D,GAAU,CAAAt9D,SAAA,CACRw1C,IACC31C,EAAAA,EAAAA,KAAC+mC,GAAoB,CAAA5mC,UACnBH,EAAAA,EAAAA,KAACiG,EAAAA,GAAW,CAACtD,KAAK,KAAKuD,KAAMyvC,OAG/BonB,IACA96D,EAAAA,EAAAA,MAAC4K,GAAO,CAAA1M,SAAA,EACJw1C,EAAU8hB,gBACVz3D,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL8O,KAAK,KACLU,SAAS,SACT8M,SAAUmnD,EACVvwD,OAAO,aACPtD,QAASA,IAAMq5D,IAAennB,GAAWx1C,UAExCuM,EAAAA,GAAAA,GAAE,wCAGLtW,EAAY2E,aAAa6W,YACzB5R,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL8O,KAAK,KACLU,SAAS,UACT0D,OAAO,aACPtD,QAASA,IAAMo5D,IAAclnB,GAC7B,cAAY,kCAAiCx1C,SAC9C,aAIHH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACL8O,KAAK,KACL4E,QAAQ,YACRlE,SAAS,QACT0D,OAAO,aACPtD,QAASA,IAAMw2C,GAAoB,GACnC,cAAY,gCAA+B95C,SAC5C,yBAMP8B,EAAAA,EAAAA,MAACy7D,GAAe,CAAAv9D,SAAA,EACdH,EAAAA,EAAAA,KAAC29D,GAAK,CAAC,cAAY,QAAOx9D,SAAE+2D,KAC5Bl3D,EAAAA,EAAAA,KAAC49D,GAAQ,CAAAz9D,SACNw1C,EAAU3b,SAASnkC,KAAKgyD,IACvB7nD,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CAEFzwC,QAASsyC,EACTllD,KAAK,KACLk7D,MAAM,UACN,cAAY,eAJP,WAAWhW,SAQrBuP,EAAU1gE,OAAS,IAClBuL,EAAAA,EAAAA,MAAC67D,GAAS79D,UAAS,CAAAE,SAAA,CAAC,aAEjBi3D,EAAUvhE,KACR8N,GACCA,EAAS7J,WACPmI,EAAAA,EAAAA,MAAC67D,GAASC,oBAAmB,CAAA59D,SAAA,EAC3BH,EAAAA,EAAAA,KAAC89D,GAASrxD,MAAK,CAAAtM,SAAEwD,EAAS7J,YAC1BkG,EAAAA,EAAAA,KAAA,OAAAG,SACGwD,EAAS+K,QAAS1O,EAAAA,EAAAA,KAAC89D,GAASE,KAAI,CAAA79D,SAAC,0BAEnCwD,EAASg0D,WAAY33D,EAAAA,EAAAA,KAAC89D,GAASE,KAAI,CAAA79D,SAAC,yBALJ,YAAYwD,EAAS5N,YAWlEiK,EAAAA,EAAAA,KAACsoB,EAAAA,GAAI,CACH00C,UAAWA,EACXC,aAAcA,EACdM,KAAMA,EACNx2D,OAAO,aAERs2D,EAAYxnE,KAAKynE,IAChBt9D,EAAAA,EAAAA,KAACi+D,GAAQ,CACP/8C,SAAU87C,IAAcM,EAAI56D,MAE5B06D,aAAcA,EAAaj9D,SAE1Bm9D,EAAItuD,KAAKnZ,KACP62C,GACCswB,IAAcM,EAAI56D,QAChB1C,EAAAA,EAAAA,KAACkoD,GAAAA,EAAqB,CAAqBC,aAAczb,GAA7BA,EAAW32C,OANxC,YAAYunE,EAAI56D,wBApGhB,IAoHlB,EAMP,MAAMzC,GAAYmE,EAAAA,GAAOC,GAAG;IACxBC,EAAAA,GAAM8I;;;;;EAOJqwD,GAAar5D,EAAAA,GAAOC,GAAG;;;;;EAOvB0iC,GAAuB3iC,EAAAA,GAAOC,GAAG;;EAIjCwI,GAAUzI,EAAAA,GAAOC,GAAG;;;EAKpBq5D,GAAkBt5D,EAAAA,GAAOC,GAAG;;;;;;EAQ5Bs5D,GAAQv5D,EAAAA,GAAOC,GAAG;;EAIlBu5D,GAAWx5D,EAAAA,GAAOC,GAAG;;;EAKrBy5D,GAAW,CACf79D,UAAWmE,EAAAA,GAAOC,GAAG;;IAGrB05D,oBAAqB35D,EAAAA,GAAOC,GAAG;;IAG/BoI,MAAOrI,EAAAA,GAAOC,GAAG;MACbC,EAAAA,GAAMgN;IAEV0sD,KAAM55D,EAAAA,GAAOuP,IAAI;aACNpQ,EAAAA,GAAOkrB;KAIdwvC,GAAW75D,EAAAA,GAAOC,GAAG;aACd,EAAG6c,cAAgBA,EAAW,OAAS;;;;gBAIpC,EAAGk8C,kBAAmBA,EAAe,IAAM;IACvD94D,EAAAA,GAAM8I;;;;;;;sEC7QH,MAAM8wD,EAA4B,E,oECAlC,MAAM9yD,EAAa,CACxBuqC,UAAW,EACXtqC,QAAS,EACTiuB,iBAAkB,E,sHCuBpB,MAea5I,EAAkBA,KAC7B,MAAQxL,GAAWlZ,EAAAA,EAAAA,MAAXkZ,OACFlgB,GAAUC,EAAAA,EAAAA,MAUhB,MAAO,EATc2oB,EAAAA,EAAAA,UAAQ,IAAM,IAAI3I,gBAAgBC,IAAS,CAACA,KACzCi5C,EAAAA,EAAAA,cACrBC,IACC,MAAMC,GArBgBC,EAqBqBF,EApBxC,IAAIn5C,gBACO,kBAATq5C,GAAqBhmE,MAAMg+B,QAAQgoC,IAASA,aAAgBr5C,gBAC/Dq5C,EACA7tD,OAAO8N,KAAK+/C,GAAMC,QAAO,CAACC,EAAW//D,KACnC,MAAM8G,EAAQ+4D,EAAK7/D,GACnB,OAAO+/D,EAAKC,OAAOnmE,MAAMg+B,QAAQ/wB,GAASA,EAAM1P,KAAK6C,GAAM,CAAC+F,EAAK/F,KAAM,CAAC,CAAC+F,EAAK8G,IAAQ,GACrF,MAPiB+4D,MAsBtBt5D,EAAQrO,KAAK,CAAEuuB,OAAQm5C,EAAgBhsC,YAAa,GAEtD,CAACrtB,IAGmC,EAQ3B05D,EAAiBA,KAC5B,MAAQx5C,GAAWlZ,EAAAA,EAAAA,MAAXkZ,OACR,OAAO0I,EAAAA,EAAAA,UAAQ,IAAM,IAAI3I,gBAAgBC,IAAS,CAACA,GAAQ,C,yqEClD7D,MAAMy5C,EAAsB,SAoE5B,IAlEyBhY,CAACpkB,EAAmBq8B,GAA6B,KACxE,MAAMxoE,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/D0L,GAAWC,EAAAA,EAAAA,MACwC88D,EAAAt9D,GAAjBmvB,EAAAA,EAAAA,KAAiB,GAAlD1E,EAAY6yC,EAAA,GAAEC,EAAeD,EAAA,GAE9Bja,GAAmBxuD,EAAY2E,aAAagkE,sBAAwB,IAAI7yD,SAASq2B,GAEvFy8B,GAA8B9xC,EAAAA,EAAAA,GAAY,CACxCC,WAAYA,KAAM8xC,EAAAA,EAAAA,GAAc18B,GAChCnV,UAAY8xC,IACVp9D,GACEoN,EAAAA,EAAAA,IAAcnb,EAAAA,EAAC,CAAC,EACXqC,GAAW,IACd2E,aAAYhH,EAAAA,EAAA,GACPqC,EAAY2E,cAAY,IAC3BgkE,qBAAsB,IACjB3oE,EAAY2E,aAAagkE,qBAC5BG,EAAgBnpE,UAMxBka,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAAA,KAAA9B,SAAA,CAAG,iDACmD++D,EAAgBxwD,MAAM,IAAE,KAC5E1O,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,wBAAwBf,MAAO,CAAEwG,eAAgB,YAAa5M,MAAO,SAAUnD,SAAC,yCAI5F,EAEHstB,QAASqE,EAAAA,KAzBHpE,EAAMsxC,EAANtxC,OAAQb,EAASmyC,EAATnyC,WA4BhB5jB,EAAAA,EAAAA,YAAU,KAEN+iB,EAAaxY,IAAImrD,KAAyBx9C,OAAOohB,KACjDnsC,EAAYL,IACX6uD,GACAga,IAEDlxC,EAAO,CAAC,GACR1B,EAAagoB,OAAO2qB,GACpBG,EAAgB9yC,GAClB,GACC,IAgBH,MAAO,CAAE46B,oBAdmBA,KACtBxwD,EAAY+U,OAASwB,EAAAA,EAASC,SAAWg4C,GAAmB/3B,IAI5Dz2B,EAAYL,GACd23B,EAAO,CAAC,IAER1B,EAAasc,IAAI,SAAUnnB,OAAOohB,KAClCr3B,EAAAA,EAAAA,IAAiBpN,OAAOhE,SAASiS,SAAW,IAAMigB,EAAaqG,YAC/DvwB,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,MACpC,EAG4BioD,kBAAiB,C,mFC9D1C,SAAS9mB,EAAeqhC,GAC7B,OAAOl2D,EAAAA,EAAAA,YAAU,KACfnL,OAAOshE,4BAA4Bd,MAAM,GACxCa,EACL,C,oFChBO,MAAME,EAAaA,KACxB,MAAMC,GAAa1uC,EAAAA,EAAAA,SAAO,GAM1B,OAJA3nB,EAAAA,EAAAA,YAAU,KACRq2D,EAAWzuC,SAAU,CAAK,GACzB,IAEIyuC,EAAWzuC,OAAO,C,klCC8F3B,IA/EO,SACLpyB,EACA8gE,GAGA,MAgBEj+D,EAAAC,GAhBoCC,EAAAA,EAAAA,WAAY,KAChD,IAEE,MAAMgtB,EAAO1wB,OAAOmhB,aAAaC,QAAQzgB,GAEzC,OAAO+vB,EAAOwd,KAAKC,MAAMzd,GAAQ+wC,CACnC,CAAE,MAAOlwD,GAQP,OANAoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,8BACfD,EAAKkkC,QAAQ,CACXp5C,OACA,IAEG8gE,CACT,KACA,GAhBKC,EAAWl+D,EAAA,GAAEm+D,EAAcn+D,EAAA,GAuElC,OAlCA2H,EAAAA,EAAAA,YAAU,KACR,IACE,MAAMulB,EAAO1wB,OAAOmhB,aAAaC,QAAQzgB,GACzC,GAAI+vB,EAAM,CACR,MAAMkxC,EAAa1zB,KAAKC,MAAMzd,GACzBmxC,IAAQD,EAAYF,IACvBC,EAAeC,EAEnB,MAAWF,IAAgBD,GAEzBE,EAAeF,EAEnB,CAAE,MAAOlwD,GACPoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,6BACfD,EAAKkkC,QAAQ,CACXp5C,OACA,GAEN,IACC,CAACA,EAAK8gE,KAGTt2D,EAAAA,EAAAA,YAAU,KACR,MAAM22D,EAAuB5hD,IACvBA,EAAMvf,MAAQA,GAChBghE,EAAezhD,EAAMyU,SAAWuZ,KAAKC,MAAMjuB,EAAMyU,UAAY8sC,EAC/D,EAIF,OADAzhE,OAAOoD,iBAAiB,UAAW0+D,GAC5B,IAAM9hE,OAAOimB,oBAAoB,UAAW67C,EAAoB,GACtE,CAACnhE,EAAK8gE,IAEF,CAACC,EAnDUj6D,IAChB,IAEE,MAAMs6D,EAAet6D,aAAiBu6D,SAAWv6D,EAAMi6D,GAAej6D,EACtEk6D,EAAeI,GACf/hE,OAAOmhB,aAAaka,QAAQ16B,EAAKutC,KAAK+zB,UAAUF,GAClD,CAAE,MAAOxwD,GACPoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,4BACfD,EAAKkkC,QAAQ,CACXp5C,OACA,GAEN,GAuCJ,C,moCClGA,MAAMqe,EAAuBA,CAC3ByiD,EAAe,MAOf,MAAgDj+D,EAAAC,GAAtBC,EAAAA,EAAAA,UAAS+9D,GAAa,GAAzCxiD,EAAKzb,EAAA,GAAE0b,EAAQ1b,EAAA,GAC8BK,EAAAJ,GAAtBC,EAAAA,EAAAA,UAAmB,IAAG,GAA7Cw+D,EAAOr+D,EAAA,GAAEs+D,EAAUt+D,EAAA,GACwC2M,EAAA/M,GAAtBC,EAAAA,EAAAA,UAAmB,IAAG,GAA3D0+D,EAAc5xD,EAAA,GAAE6xD,EAAiB7xD,EAAA,GACyB0D,EAAAzQ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA1Dyb,EAAiBjL,EAAA,GAAEouD,EAAoBpuD,EAAA,IAE9C/I,EAAAA,EAAAA,YAAU,KACR,IAAIo3D,GAAY,EAChB,MAAMC,EAAkB,IAAItyB,gBAU5B,MARA,WACE,MAAMh/B,OCpBsBH,WAMhC,IACE,MAAM0D,QAAiBmB,EAAAA,EAAQF,IAAI,qBAAsB,CAAE06B,OAAQqyB,IACnE,OAAKhuD,EAMEA,EAASvD,KALP,CACLwxD,cAAe,GACfC,gBAAiB,GAIvB,CAAE,MAAOrxD,GAMP,MALkB,iBAAdA,GAAKm9C,MAA4C,aAAjBn9C,GAAKwyB,SACvCnvB,EAAAA,EAAUC,UAAUtD,GAAMuE,IACxBA,EAAKC,UAAU,yBAAyB,IAGrC,CACL4sD,cAAe,GACfC,gBAAiB,GAErB,GDLuBC,CAAmBJ,EAAgBpyB,QACjDmyB,IACHJ,EAAWjxD,EAAKwxD,eAChBL,EAAkBnxD,EAAKyxD,iBAE1B,EAND,GAQO,KACLJ,GAAY,EACZC,EAAgB90B,OAAO,CACxB,GACA,KAEHviC,EAAAA,EAAAA,YAAU,KACR,MAAM03D,EAAa5jD,EAAMoD,MAAM,KAC/BigD,EACEO,EAAWjqE,OAAS,GAClBspE,EAAQ9zD,SAASy0D,EAAWA,EAAWjqE,OAAS,MAC/CwpE,EAAeh0D,SAAS6Q,EAAMwmB,eAClC,GACA,CAACxmB,EAAOijD,IAQX,MAAO,CACLjjD,QACAC,WACAC,oBACAC,cAVoBA,KACpB,MAAM0jD,GAAUrxC,EAAAA,EAAAA,IAAiB,KAAK,EAAM5iB,EAAAA,EAASC,SAAS,GAC9D9O,OAAOhE,SAASmK,KACd,uBAAuB8Y,KAAW6jD,EAAU,aAAaC,mBAAmBD,KAAa,GAAG,EAQ/F,C,4JEtDI,MAAM9sE,EAAgC,gCAChCG,EAAkB,kBAElBiP,GAA4B49D,EAAAA,EAAAA,GAAuBhtE,GACnDiP,GAAgB+9D,EAAAA,EAAAA,GAAuB7sE,E,4bCF7C,MAAMgB,EAAoB,oBACpBC,EAAmB,mBACnBG,EAAiB,iBAEjBC,EAA6B,6BAC7BH,EAAmB,mBACnBC,EAAkB,kBAClBG,EAAuB,uBACvBC,EAAsB,sBACtBC,EAAmB,mBACnBC,EAAe,eACfC,EAAkC,kCAClCC,EAAuB,uBAGvBmrE,IADmBD,EAAAA,EAAAA,GAAuB7rE,IACxB6rE,EAAAA,EAAAA,GAAuB5rE,IAKzC8rE,IAJgBF,EAAAA,EAAAA,GAAuBzrE,IACTyrE,EAAAA,EAAAA,GAAuBxrE,IACpCwrE,EAAAA,EAAAA,GAAuB3rE,IACxB2rE,EAAAA,EAAAA,GAAuB1rE,IAClB0rE,EAAAA,EAAAA,GAAuBvrE,IAC5C0rE,GAAoBH,EAAAA,EAAAA,GAAuBtrE,GAM3Cy8B,IALkB6uC,EAAAA,EAAAA,GAAuBrrE,IAC3BqrE,EAAAA,EAAAA,GAAuBprE,IACRorE,EAAAA,EAAAA,GAAuBnrE,IAChCmrE,EAAAA,EAAAA,GAAuBlrE,GAEtBsrE,GACzBryD,UACL,MAAM1a,OC5B+B0a,WAGvC,IAEE,aADuB0E,EAAAA,EAAIC,IAAI,kBAAkB0tD,MACjClyD,KAAK7a,YACvB,CAAE,MAAOkb,GACP,OACO,MADCA,EAAMkD,SAASgO,SAInBtQ,EAAAA,GAAMZ,MAAM,8CACZoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,0BACfD,EAAKkkC,QAAQ,CACXqpB,qBACA,KAPG,IAWb,GDQ6BC,CAA0BD,GAIrD,OAFAp/D,EAASi/D,EAAgB5sE,IAElBA,CAAY,GAIV06D,EAA0BuS,GAC9BvyD,UACL/M,EAASk/D,KAET,MAAQK,SAAwBC,EAAAA,EAAAA,IAAkBF,IAA1CC,cAGR,OAFAv/D,EAASm/D,EAAkBI,IAEpBA,CAAa,C,u2BE3CjB,MAAMppE,EAAsB,sBACtBC,EAAa,aACbO,EAAgB,gBAChBG,EAAc,cACdC,EAA6B,6BAC7BC,EAAqB,qBACrBE,EAAmB,mBACnBD,EAAqB,qBACrBE,EAAsB,sBACtBN,EAA0B,0BAC1BO,EAAgB,gBAChBC,EAAkB,kBAClBC,EAA+B,+BAC/BC,EAA2B,2BAC3BE,EAA4B,4BAC5BE,EAAuB,uBACvBI,EAAmB,mBACnBF,EAAwB,wBACxBQ,EAAuC,uCACvCE,EAAoB,oBACpBE,EAAyB,yBACzBC,EAA8B,8BAC9BC,EAAmB,mBACnBG,EAAoB,oBACpBE,EAAiC,iCAEjCoZ,GAAuB4sD,EAAAA,EAAAA,GAAuB7oE,GAI9CspE,IAHYT,EAAAA,EAAAA,GAAuB5oE,IACpB4oE,EAAAA,EAAAA,GAAuBroE,IACzBqoE,EAAAA,EAAAA,GAAuBloE,IACVkoE,EAAAA,EAAAA,GAAuBjoE,IAIjD2oE,IAHmBV,EAAAA,EAAAA,GAAuBhoE,IACzBgoE,EAAAA,EAAAA,GAAuB9nE,IACrB8nE,EAAAA,EAAAA,GAAuB/nE,IACtB+nE,EAAAA,EAAAA,GAAuB7nE,IAI3CwoE,IAHeX,EAAAA,EAAAA,GAAuB5nE,IACrB4nE,EAAAA,EAAAA,GAAuB3nE,IACX2nE,EAAAA,EAAAA,GAAuB1nE,IACzB0nE,EAAAA,EAAAA,GAAuBnoE,IASlD+oE,IARwBZ,EAAAA,EAAAA,GAAuBznE,IACtBynE,EAAAA,EAAAA,GAAuBvnE,IAC3BunE,EAAAA,EAAAA,GAAuBrnE,IAC3BqnE,EAAAA,EAAAA,GAAuBjnE,IACnBinE,EAAAA,EAAAA,GAAuBnnE,IACTmnE,EAAAA,EAAAA,GAC9C3mE,IAE6B2mE,EAAAA,EAAAA,GAAuBzmE,IACzCsnE,GAAsBb,EAAAA,EAAAA,GAAuBvmE,GAC7CqnE,GAA2Bd,EAAAA,EAAAA,GAAuBtmE,GAKlDqnE,IAJiBf,EAAAA,EAAAA,GAAuBrmE,IACtBqmE,EAAAA,EAAAA,GAAuBlmE,IACZkmE,EAAAA,EAAAA,GAAuBhmE,GAErCslB,GACnBvR,UACL/M,EAAS2/D,GAAyB,IAElC,IACE,MAAMriD,QAAqB7L,EAAAA,EAAIC,IAAI,iBAAiB4M,KAEpD,GAAIhB,EAAapQ,KAGf,OAFAlN,EAAS0/D,EAAkBpiD,EAAapQ,KAAK3R,UAC7CyE,EAAS2/D,GAAyB,IAC3BriD,EAAapQ,KAGtBlR,OAAOhE,SAASmK,MAAO0T,EAAAA,EAAAA,IACzB,CAAE,MAAOtI,GACP,GAA8B,MAA1BA,EAAMkD,SAASgO,OA4BjB,MAAMlR,EA5B2B,CACjC,MAAMyyD,EAAaC,OAAO,8CAE1B,GAAID,EAAY,CACd,MAAM1iD,QAAqB7L,EAAAA,EACxBC,IAAI,iBAAiB4M,IAAc,CAClC8F,OAAQ,CACN87C,YAAaF,KAGhB7S,OAAOgT,IACN,GAAoC,MAAhCA,EAAY1vD,SAASgO,OAIvB,MAAM0hD,EAHNC,MAAM,sBACNpkE,OAAOhE,SAASmK,MAAO0T,EAAAA,EAAAA,IAGzB,IAGJ,GAAIyH,GAAcpQ,KAAK3R,QAGrB,OAFAyE,EAAS0/D,EAAkBpiD,EAAapQ,KAAK3R,UAC7CyE,EAAS2/D,GAAyB,IAC3BriD,EAAapQ,KAAK3R,OAE7B,MACES,OAAOhE,SAASmK,MAAO0T,EAAAA,EAAAA,IAE3B,CAGF,IAISwqD,EAA4BA,IAChCtzD,UACL,IACE,MAAMuQ,QAAqBiX,IAAAA,IAAU,0BAA2B,CAC9De,QAAS,CACPE,OAAQ,sBAIZx1B,EAASy/D,EAAwBniD,EAAapQ,KAAKozD,wBACrD,CAAE,MAAOhzD,GACP9D,QAAQkU,IAAIpQ,EACd,GAISizD,EAAoBA,CAACC,EAAgBn3D,IACzC0D,UACL/M,EAAS6/D,GAAoB,IAC7B,IACE,MAAMviD,QAAqB7L,EAAAA,EAAIC,IAAI,iBAAkB,CACnD0S,OAAQ,CACNq8C,gBAAiBD,EACjBn3D,UAGJrJ,EAAS4/D,EAAgBtiD,EAAapQ,MACxC,CAAE,MAAOI,GACPtN,EAAS6/D,GAAoB,GAC/B,CACA7/D,EAAS6/D,GAAoB,GAAO,EAG3Bn/B,EAA0BU,GAC9Br0B,UACL,MAAMuQ,QAAqBiX,IAAAA,IACzB,mBACA,CACEnQ,OAAQ,CAAEmc,aAAca,IAE1B,CACE9L,QAAS,CACPE,OAAQ,sBAIdx1B,EAAS8/D,EAAyBxiD,EAAapQ,MAAM,C,utBClJlD,MAAM9S,EAAmB,mBACnBC,EAAoB,oBACpBG,EAAc,cACdC,EAAe,eACfH,EAAmB,mBACnBC,EAAoB,oBACpBG,EAAe,eACfC,EAAgB,gBAChBC,EAAqB,qBACrBI,EAAwB,wBACxBE,EAAyB,yBACzBM,EAAoC,oCACpCC,EAAmC,mCACnCE,EAAmB,mBACnBC,EAAoB,oBACpBC,EAAuB,uBACvBT,EAAiC,iCAEjCgS,GAAiB4xD,EAAAA,EAAAA,GAAuB5kE,GACxCsmE,GAAkBC,EAAAA,EAAAA,GAAqBtmE,GACvC68D,GAAa8H,EAAAA,EAAAA,GAAuBxkE,GACpComE,GAAcD,EAAAA,EAAAA,GAAqBlmE,GACnCi8D,GAAkBsI,EAAAA,EAAAA,GAAuB1kE,GACzCumE,GAAmBF,EAAAA,EAAAA,GAAqBpmE,GACxCu8D,GAAckI,EAAAA,EAAAA,GAAuBtkE,GACrComE,GAAeH,EAAAA,EAAAA,GAAqBhmE,GACpCgkB,GAAmBqgD,EAAAA,EAAAA,GAAuBpkE,GAS1CmmE,IARsB/B,EAAAA,EAAAA,GAAuBhkE,IACtBgkE,EAAAA,EAAAA,GAAuB9jE,IACb8jE,EAAAA,EAAAA,GAC5CxjE,IAE2CwjE,EAAAA,EAAAA,GAC3CvjE,IAE4BujE,EAAAA,EAAAA,GAAuBrjE,IAExCqlE,IADkBhC,EAAAA,EAAAA,GAAuBpjE,IACpBojE,EAAAA,EAAAA,GAAuBnjE,IAC5ColE,GAA8BjC,EAAAA,EAAAA,GAAuB5jE,GAErD2V,EAAmBA,CAACmwD,GAAmB,IAC3Cn0D,UAGL,GAFA/M,EAAS0gE,MAEJ3+D,IAAIu1B,gBAEP,OADAt3B,EAASoN,EAAe,CAAEnU,aAAc,CAAC,KAClC,CAAEA,aAAc,CAAC,GAG1B,MAAMiU,QAAauoD,EAAAA,EAAAA,IAAQ1zD,IAAIu1B,gBAAiB4pC,GAC1C98D,EAAO8I,GAAM9I,KAEnB,OAAKA,GAKLpE,EAASoN,EAAehJ,IACjBA,IALLpE,EAASoN,EAAe,CAAEnU,aAAc,CAAC,KAClC,CAAEA,aAAc,CAAC,GAIf,EAIFkoE,EAAgBC,GACpBr0D,UACL/M,EAAS4gE,KAET,MAAMtjD,QAAqBiX,IAAAA,IAAU,4BAA4B6sC,IAAiB,CAChF9rC,QAAS,CACPE,OAAQ,sBAMZ,OAFAx1B,EAASk3D,EAAW55C,EAAapQ,KAAKtT,UAE/B0jB,EAAapQ,KAAKtT,OAAO,EAIvBynE,EAAqBD,GACzBr0D,UACL/M,EAAS6gE,KAET,MAAMvjD,QAAqBiX,IAAAA,IAAU,iCAAiC6sC,IAAiB,CACrF9rC,QAAS,CACPE,OAAQ,sBAMZ,OAFAx1B,EAAS02D,EAAgBp5C,EAAapQ,KAAKrT,eAEpCyjB,EAAapQ,KAAKrT,YAAY,EAI5BynE,EAAiBF,GACrBr0D,UACL/M,EAAS8gE,KAET,MAAMxjD,QAAqBiX,IAAAA,IAAU,6BAA6B6sC,IAAiB,CACjF9rC,QAAS,CACPE,OAAQ,sBAMZ,OAFAx1B,EAAS82D,EAAYx5C,EAAapQ,KAAKpT,WAEhCwjB,EAAapQ,KAAKpT,QAAQ,EAwBxB87B,EAAcA,IAClB7oB,UACL,MAAMuQ,QAAqBiX,IAAAA,IAAU,iBACrCv0B,EAAS+gE,EAAezjD,EAAapQ,KAAKq0D,cAAc,C,0GC3I5D,MAAQC,EAA8Cr2D,EAAAA,GAA9Cq2D,QAASC,EAAqCt2D,EAAAA,GAArCs2D,OAAQC,EAA6Bv2D,EAAAA,GAA7Bu2D,OAAQC,EAAqBx2D,EAAAA,GAArBw2D,iBAEpBrlE,EAA0B,0BAE1Bq5B,EAAwBA,IAAO31B,GAC1CA,EAAS,CACPjO,KAAMuK,EACNpK,QAAS,CACP6J,MAAOC,OAAOC,WACdC,OAAQF,OAAOG,YACfylE,SAAU5lE,OAAOC,YAAcwlE,EAC/B9/C,SAAU3lB,OAAOC,YAAcylE,EAC/BG,UAAW7lE,OAAOC,YAAculE,EAChCM,kBAAmB9lE,OAAOC,YAAc0lE,I,wHCZ9C,MAGaI,EAAah1D,MAAOi1D,EAAQ5W,IACvCx5C,EAAAA,EAAQ2L,KAAK,qEAA0EykD,IAAU,CAC/F5W,SACAt7B,QAAS,CACPmyC,MAAMC,EAAAA,EAAAA,IAAU,iBAKThyC,EAAoBnjB,UAC/B,MAAQkO,EAAuCmP,EAAvCnP,MAAO1mB,EAAgC61B,EAAhC71B,WAAYC,EAAoB41B,EAApB51B,UAAW6U,EAAS+gB,EAAT/gB,KAGtC,IAAI24D,EAAS,uCAUb,GARa,IAAT34D,EAEF24D,EAAS,uCACS,IAAT34D,IAET24D,EAAS,wCAIThmE,OAAOhE,SAASiyB,KAAK7f,SAAS,kBAC9BpO,OAAOhE,SAASiyB,KAAK7f,SAAS,gBAE9B,IACE,MAAMghD,EAAS,CACb,CAAE12D,KAAM,QAAS+O,MAAOwX,GACxB,CAAEvmB,KAAM,YAAa+O,MAAOlP,GAC5B,CAAEG,KAAM,WAAY+O,MAAOjP,UAGvButE,EAAWC,EAAQ5W,EAC3B,CAAE,MAAO99C,GACP9D,QAAQ+D,MAAMD,EAChB,CACF,EAGWwD,EAAmB/D,UAC9B,MAAQkO,EAAUmP,EAAVnP,MAKR,GACEjf,OAAOhE,SAASiyB,KAAK7f,SAAS,kBAC9BpO,OAAOhE,SAASiyB,KAAK7f,SAAS,gBAE9B,IACE,MAAMghD,EAAS,CAAC,CAAE12D,KAAM,QAAS+O,MAAOwX,UAElC8mD,EATK,uCASc3W,EAC3B,CAAE,MAAO99C,GACP9D,QAAQ+D,MAAMD,EAChB,CACF,C,wKCxDK,MAAM60D,EAA4Bp1D,gBAGZ0E,EAAAA,EAAIC,IAAI,0BAA0BtK,MACzC8F,KAGT0sD,EAA4B7sD,MAAO3F,EAAgBzK,EAAag9D,WACrEloD,EAAAA,EAAI2wD,MAAM,0BAA0Bh7D,IAAU,CAClDzK,IAAKA,EACLg9D,QAASA,GACT,EAGS0I,EAAgCt1D,gBAGhB0E,EAAAA,EAAIC,IAAI,kBAAkB4wD,gBACjCp1D,KAGTitD,EAA2CptD,gBAG3B0E,EAAAA,EAAIC,KAAI6wD,EAAAA,EAAAA,KAAwCD,KACvDp1D,I,2MC3Bf,MAAMsR,EAAmBzR,MAC9ByQ,EACAwiD,WAEuBpuD,EAAAA,EAAQF,IAAI,SAAS8L,IAAQ,CAClD4G,OAAQ,CACNo+C,cAAc,EACdtC,YAAaF,MAID9yD,KAiBLu1D,EAAsB11D,gBACV6E,EAAAA,EAAQF,IAAI,SAASJ,MAC5BpE,KAGLw1D,EAAoB31D,UAG/B,IAAI0D,EAEJ,MAAMkyD,EAAgB,CACpBC,WAAYC,EAAQn9B,UACpBo9B,6BAA8BD,EAAQE,iBACtCn2D,MAAOi2D,EAAQj2D,MACf9K,WAAY+gE,EAAQ/gE,WACpBkhE,YAAaH,EAAQI,WACrBC,kBAAmBL,EAAQM,iBAC3BC,qBAAsBP,EAAQQ,oBAAoBtvE,KAAKuvE,IAAG,CACxDlrE,YAAakrE,EAAIlrE,YACjBmrE,kBAAmBD,EAAIE,qBAEzBC,wBAAwBC,EAAAA,EAAAA,GAAwBb,EAAQc,wBACxDC,cAAcF,EAAAA,EAAAA,GAAwBb,EAAQgB,YAC9C13D,YAAa02D,EAAQ12D,YACrBE,mBAAoBw2D,EAAQv2D,iBAC5Bw3D,mBAAoBjB,EAAQkB,kBAC5BC,UAAWnB,EAAQva,SACnB2b,mBAAoBpB,EAAQkB,mBAAmB35D,SAAS85D,EAAAA,GAAoBC,oBACxEtB,EAAQuB,kBACR,GACJC,KAAMxB,EAAQkB,mBAAmB35D,SAAS85D,EAAAA,GAAoBI,MAAQzB,EAAQwB,KAAO,GACrFE,UAAW1B,EAAQ0B,UACnBC,qBAAsB3B,EAAQ4B,mBAC9BC,uBAAwB7B,EAAQ8B,qBAChCC,wBAAyB/B,EAAQgC,sBACjC33D,KAAM21D,EAAQ31D,KACd43D,cAAejC,EAAQkC,aACvBC,WAAYnC,EAAQmC,WACpBC,UAAWpC,EAAQqC,YACnBC,wBAAyBtC,EAAQuC,sBAAwBvC,EAAQwC,qBACjEC,yBAA0BzC,EAAQuC,sBAAwBvC,EAAQ0C,qBAClEC,kCACG3C,EAAQuC,sBAAwBvC,EAAQ4C,8BAC3CC,gBAAiB7C,EAAQuC,sBAAwBvC,EAAQ8C,cACzDC,uBAAwB/C,EAAQuC,qBAChCS,cAAehD,EAAQiD,cAGzBn3D,OAAO8N,KAAKkmD,GAAet8B,SAAS1pC,IACA,kBAAvBgmE,EAAchmE,KACvBgmE,EAAchmE,GAAOgmE,EAAchmE,GAAK6kC,OAC1C,IAGF,IAWE,OATE/wB,EADEoyD,EAAQ5uE,SACO2d,EAAAA,EAAQ+/B,IAAI,SAASkxB,EAAQ5uE,KAAM,CAClD8xE,IAAKpD,UAGU/wD,EAAAA,EAAQ2L,KAAK,QAAS,CACrCwoD,IAAKpD,IAIFlyD,EAASvD,IAClB,CAAE,MAAO/R,GACP,OAAO,IACT,GAGW6qE,EAA2BA,CAACC,EAAOC,KAC9Ct0D,EAAAA,EACGF,IAAI,gBAAgBu0D,SAAc,CACjC3wC,QAAS,CACPE,OAAQ,4BAEV2wC,aAAc,SAEfjZ,MAAMz8C,IACL,GAAwB,MAApBA,EAASgO,OACX,OAGF,MAAM5lB,EAAMmD,OAAOguB,IAAIo8C,gBACrB,IAAIC,KAAK,CAAC51D,EAASvD,MAAO,CACxBnb,KAAM,6EAIJ0uB,EAAOthB,SAASmnE,cAAc,KACpC7lD,EAAKte,KAAOtJ,EACZ4nB,EAAK8lD,aAAa,WAAY,GAAGL,UACjC/mE,SAASy1D,KAAKp+B,YAAY/V,GAC1BA,EAAKoqB,QACLpqB,EAAK+lD,YAAYC,YAAYhmD,EAAK,GAClC,EAGOimD,EAAkB35D,MAC7B0zB,GAEExlB,QACAT,YACAE,qBAOqB9I,EAAAA,EAAQ2L,KAAK,SAASkjB,aAAsB,CACjExlB,QACA1mB,WAAYimB,EACZhmB,UAAWkmB,KAGGxN,I,sWCrIX,MAAMsyD,EAAoBzyD,gBAGR6E,EAAAA,EAAQF,IAAI,oBAAqB,CACtD0S,OAAQ,CACNqW,WAAY6kC,MAIApyD,KAGLy5D,EAA4B55D,MACvCzH,EAKAm5D,KAEA,IAYE,aAXuB7sD,EAAAA,EAAQF,IAAI,yCAA0C,CAC3E06B,OAAQqyB,EACRr6C,OAAQ,CACN9e,QAAS,CACPshE,eAAgBthE,EAAQuhE,cACxBC,oBAAqBxhE,EAAQyhE,kBAC7BC,oBAAqB1hE,EAAQ2hE,uBAKnB/5D,IAClB,CAAE,MAAOK,GAOP,OANAoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,sCACfD,EAAKkkC,QAAQ,CACXzwC,QAAS4kC,KAAK+zB,UAAU34D,IACxB,IAEG,CACL4hE,QAAS,GACTxL,MAAO,EAEX,GAGWyL,EAA+Bp6D,UAG1C,IAEE,aADuB6E,EAAAA,EAAQF,IAAI,mDACnBxE,KAAKk6D,eACvB,CAAE,MAAO75D,GAIP,OAHAoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,wCAAwC,IAElD,CACLzF,mBAAoB,GAExB,GAGWg7D,EAAmBt6D,UAC9B,IAIE,aAHuB6E,EAAAA,EAAQ2L,KAAK,oCAAqC,CACvEgO,QAASnkB,KAEK8F,IAClB,CAAE,MAAOK,GAQP,OAPAY,EAAAA,GAAMZ,MAAMA,EAAMkD,SAASvD,KAAKK,OAChCoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,6BACfD,EAAKkkC,QAAQ,CACX3uC,OAAQA,EAAOmpB,YACf,IAEG,IACT,GAGW+2C,EAA2Bv6D,UACtC,IAIE,aAHuB6E,EAAAA,EAAQ2L,KAAK,6CAA8C,CAChFgO,QAASnkB,KAEK8F,IAClB,CAAE,MAAOK,GAQP,OAPAY,EAAAA,GAAMZ,MAAMA,EAAMkD,SAASvD,KAAKK,OAChCoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,qCACfD,EAAKkkC,QAAQ,CACX3uC,OAAQA,EAAOmpB,YACf,IAEG,IACT,GAGWg3C,EAAiBx6D,UAC5B,IAIE,aAHuB6E,EAAAA,EAAQ2L,KAAK,kCAAmC,CACrEgO,QAASnkB,KAEK8F,IAClB,CAAE,MAAOK,GAQP,OAPAY,EAAAA,GAAMZ,MAAMA,EAAMkD,SAASvD,KAAKK,OAChCoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,2BACfD,EAAKkkC,QAAQ,CACX3uC,OAAQA,EAAOmpB,YACf,IAEG,IACT,GAGWi3C,EAAqBz6D,UAChC,IAIE,aAHuB6E,EAAAA,EAAQ2L,KAAK,sCAAuC,CACzEgO,QAASnkB,KAEK8F,IAClB,CAAE,MAAOK,GAQP,OAPAY,EAAAA,GAAMZ,MAAMA,EAAMkD,SAASvD,KAAKK,OAChCoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,+BACfD,EAAKkkC,QAAQ,CACX3uC,OAAQA,EAAOmpB,YACf,IAEG,IACT,GAGWk3C,EAAsB16D,UAGjC,IAIE,aAHuB6E,EAAAA,EAAQ2L,KAAK,wCAAyC,CAC3EgO,QAASnkB,KAEK8F,KAAK5I,KACvB,CAAE,MAAOiJ,GAQP,OAPAY,EAAAA,GAAMZ,MAAMA,EAAMkD,SAASvD,KAAKK,OAChCoD,EAAAA,EAAUC,UAAUrD,GAAQsE,IAC1BA,EAAKC,UAAU,gCACfD,EAAKkkC,QAAQ,CACX3uC,OAAQA,EAAOmpB,YACf,IAEG,IACT,GAGWm3C,EAAoC36D,MAC/C46D,EACAC,KAEA,IAKE,aAJuBh2D,EAAAA,EAAQ2L,KAAK,iDAAkD,CACpFoqD,MACAE,wBAAyBD,KAEX16D,IAClB,CAAE,MAAOlM,GAUP,OATAmN,EAAAA,GAAMZ,MAAMvM,EAAEyP,SAASvD,KAAKK,OACF,MAAtBvM,EAAEyP,SAASgO,QACb9N,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,8CACfD,EAAKkkC,QAAQ,CACX4xB,OACA,IAGC,IACT,GAGWG,EAAuB/6D,UAclC,MAAMqX,EAA8B,CAClC2jD,uBAAuB,EACvBziE,QAAS,CACP0iE,SAAU1iE,EAAQ8rC,QAAU,UAC5B62B,YAAa3iE,EAAQ+tD,WACrB6U,cAAe5iE,EAAQ6iE,aACvBC,eAAgB9iE,EAAQ+iE,cACxBC,wBAAyBhjE,EAAQijE,sBACjCC,wBAAyBljE,EAAQmjE,sBACjCC,kBAAmBpjE,EAAQqjE,gBAC3BC,cAAetjE,EAAQujE,aACvBjC,eAAgBthE,EAAQuhE,cACxBiC,uBAAwBxjE,EAAQyjE,qBAChCC,kBAAmB1jE,EAAQ2jE,mBAG3B3jE,EAAQ4jE,cACV9kD,EAAO+kD,aAAe7jE,EAAQ4jE,aAQhC,aANuBt3D,EAAAA,EAAQF,KAC7B03D,EAAAA,EAAAA,OACA,CACEhlD,YAGYlX,IAAI,EAmCT0tD,EAAwB7tD,SAIP6E,EAAAA,EAAQ2L,KAAK,yCAA0CrQ,E,gMC9Q9E,MAAMm8D,EAAuBt8D,MAClCzH,EAOAm5D,KAEA,IAcE,aAbuB7sD,EAAAA,EAAQF,IAAI,wBAAyB,CAC1D06B,OAAQqyB,EACRr6C,OAAQ,CACN9e,QAAS,CACPgkE,eAAgBhkE,EAAQikE,cACxBC,YAAalkE,EAAQmkE,WACrBC,aAAcpkE,EAAQqkE,YACtB/C,eAAgBthE,EAAQuhE,cACxBx1B,QAAS/rC,EAAQ8rC,QAAU,YAKjBlkC,IAClB,CAAE,MAAOlM,GAIP,OAHA2P,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,oCAAoC,IAE9C,CAAEo1D,QAAS,GAAIxL,MAAO,EAC/B,GAGWkO,EAAgC78D,UAI3C,IAGE,aAFuB6E,EAAAA,EAAQF,IAAI,qCAEnBxE,IAClB,CAAE,MAAOlM,GAIP,OAHA2P,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,6CAA6C,IAEvD,CAAE+3D,cAAe,EAAGC,YAAa,EAC1C,GAGWC,EAA8Bh9D,UACzC,IAGE,aAFuB6E,EAAAA,EAAQF,IAAI,kCAEnBxE,IAClB,CAAE,MAAOlM,GAIP,OAHA2P,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,2CAA2C,IAErD,CACLk4D,aAAc,GACdC,cAAe,GACf7C,gBAAiB,CACfj7D,YAAa,GACbE,mBAAoB,IAG1B,GAGW69D,EAAgCn9D,OAC3CkO,QACA6kB,cAKA,IAME,WALuBluB,EAAAA,EAAQ2L,KAAK,8CAA+C,CACjFsjB,UAAW5lB,EACX6kB,aAGY5yB,KAAKC,QACjB,MAAM,IAAIw3B,MAAM,yBAGlB,OAAO,CACT,CAAE,MAAO3jC,GAIP,OAHA2P,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,6CAA6C,KAEvD,CACT,GAGWq4D,EAAoCp9D,OAC/Cq9D,YACAC,iBAKA,IAKE,aAJMz4D,EAAAA,EAAQ2L,KAAK,mDAAoD,CACrE+sD,YAAaF,EACbG,YAAaF,KAER,CACT,CAAE,MAAOrpE,GAIP,OAHA2P,EAAAA,EAAUC,UAAU5P,GAAI6Q,IACtBA,EAAKC,UAAU,iDAAiD,KAE3D,CACT,E,2GCnHK,MAAMqrD,EAAgBpwD,gBACJ6E,EAAAA,EAAQ2L,KAAK,kBAAmB,CACrDwjB,WAAYN,KAGEvzB,KAAKs9D,iBAGVC,EAAkB19D,gBACvB6E,EAAAA,EAAQ2L,KAAK,oBAAqB,CACtCwjB,WAAYN,GACZ,C,2JCLG,MAAMoe,EAA2B9xC,UAGtC,IAEE,aADuB0E,EAAAA,EAAIC,IAAI,aAAa+uB,8BAC5BvzB,IAClB,CAAE,MAAOK,GAEP,OAAO,IACT,GAGWq1C,EAA8B71C,gBACnC0E,EAAAA,EAAIygC,OAAO,aAAazR,4BAAoC,EAGvDwe,EAA8BlyC,OACzC0zB,YACAy5B,uBACAvb,gBAAe,EACfO,SAASC,EAAAA,EAA4BurB,QACrC1rB,aAQA,MAAM9sD,EAA+B,CACnC4sD,cAAeH,EACfO,OAAQA,GAINgb,IAAsBhoE,EAAQy4E,uBAAyBzQ,GACvDlb,IAAQ9sD,EAAQ8sD,OAASA,GAS7B,aAP2BvtC,EAAAA,EAAI8L,KAC7BqtD,EAAAA,IAAqC,CACnC32E,GAAIwsC,IAENvuC,IAGkBgb,IAAI,C,m6CC5CnB,MAAM6iB,UAA6B4U,OAEnC,MAAM8wB,EAAU1oD,MACrB3F,EACA85D,GAAmB,KAEnB,IAQE,OAPiBA,QACPtvD,EAAAA,EAAQF,IAAI,MAAO,CAEvB0S,OAAQ,CAAEymD,UAAWr5C,OAAO,IAAI+I,eAE5B3oB,EAAAA,EAAQF,IAAI,UAAUtK,MAEhB8F,IAClB,CAAE,MAAOK,GACP,OAAQA,EAAMkD,UAAUgO,QACtB,KAAK,IACL,KAAK,IACH,MACF,QACmC,MAA7BziB,OAAOhE,SAASiS,WAClBT,QAAQ+D,MAAM,yCACdvR,OAAOhE,SAASmK,KAAO,KAG7B,OAAO,IACT,GAGWyT,EAAU7I,gBACf6E,EAAAA,EAAQsgC,OAAO,aAGrBl2C,OAAOhE,SAASmK,MAAO0T,EAAAA,EAAAA,IAAiB,EAG7B4uB,EAAS13B,OAASkO,QAAOJ,cACpCjJ,EAAAA,EAAQ2L,KAAK,iBAAkB,CAC7BnZ,KAAM,CACJ6W,QACAJ,cAIOiwD,EAAW/9D,OACtBkO,QACAJ,WACAL,YACAE,WACArR,OACA0hE,mBASAn5D,EAAAA,EAAQ2L,KAAK,SAAU,CACrBnZ,KAAM,CACJ6W,QACAJ,WACAtmB,WAAYimB,EACZhmB,UAAWkmB,EACXrR,OACA2hE,gBAAiBD,KAIVz6C,EAAevjB,WAC1ByI,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBs9B,QAAS,CAC9B5qB,gBAAiB,sBACjB+2B,WAEKttC,EAAAA,EAAQsgC,OAAO,gBAGXviB,EAAUA,EACrB1T,WACA+R,cACA4B,4BAA4B,KAC5BpI,eAAe,KACfmH,yBAAyB,SAQzB,IAAIzhB,EAEJ,OAAQ+O,GACN,IAAK,YACH/O,EAAIjb,EAAAA,EAAAA,EAAA,CACFg5E,aAAc,EACdC,0BACEl9C,EAAYm9C,uBAAyBC,EAAAA,GACjCp9C,EAAYq9C,0BACZr9C,EAAYm9C,qBAClB/iD,cAAeZ,EACfvuB,aAAYhH,EAAA,CACV2a,MAAOohB,EAAY3kB,KACnB8C,YAAa6hB,EAAY7hB,YACzBE,mBAAoB2hB,EAAY1hB,kBAC5B0hB,GAAa4C,YAAc,CAC7BA,WAAY5C,GAAa4C,eAGxB5C,GAAa4C,YAAc,CAC9BolC,QAAS,CACPC,aAAcjoC,EAAYukB,YAC1B15C,IAAKyyE,UAAUt9C,EAAYu9C,YAC3BC,qBAAqB,KAGrBx9C,GAAay9C,cAAgB,CAC/BA,aAAcz9C,GAAay9C,eAC1B,CAAF,GACDC,8BAA+B97C,IAEjC,MACF,IAAK,UACH1iB,EAAIjb,EAAA,CACFg5E,aAAc,EACdC,0BACEl9C,EAAYm9C,uBAAyBC,EAAAA,GACjCp9C,EAAYq9C,0BACZr9C,EAAYm9C,qBAClB/iD,cAAeZ,EACfvuB,aAAc,CACZoQ,KAAM2kB,EAAY3kB,KAClBuD,MAAOohB,EAAYphB,MACnBP,mBAAoB2hB,EAAY1hB,kBAElC/Q,QAASyyB,EAAYzyB,SACjBozB,GAA0B,CAAEg9C,yBAA0Bh9C,IAE5D,MACF,IAAK,QACHzhB,EAAIjb,EAAA,CACFg5E,aAAc,EACdC,0BACEl9C,EAAYm9C,uBAAyBC,EAAAA,GACjCp9C,EAAYq9C,0BACZr9C,EAAYm9C,qBAClB/iD,cAAeZ,EACfvuB,aAAc,CACZoQ,KAAM2kB,EAAY3kB,KAClBunB,WAAY5C,EAAY4C,WACxBg7C,qBAAsB59C,EAAY69C,qBAAqBl3E,KAAK,KAC5DwX,YAAa6hB,EAAY7hB,cAEvB6hB,GAAay9C,cAAgB,CAC/BA,aAAcz9C,GAAay9C,eAKnC,OAAO75D,EAAAA,EACJ2L,KAAK,cAAerQ,GACpBigD,OAAO5/C,IACN,MAAIgnB,IAAAA,aAAmBhnB,IAAsC,MAA5BA,GAAOkD,UAAUgO,OAC1C,IAAIsR,EAAqBxiB,GAAOkD,UAAUvD,MAAM4yB,SAEhDvyB,CACR,IAED2/C,MAAMz8C,GAAQxe,EAAAA,EAAA,GAAWwe,EAASvD,KAAK9I,MAAI,IAAE0nE,aAAc,MAAM,EAGzD7+D,EAAqBA,CAChC7F,EACA8wB,IAEOtmB,EAAAA,EAAQ+/B,IAAI,UAAUvqC,IAAU,CACrC+E,YAAa+rB,EAAS/rB,YACtBE,mBAAoB6rB,EAAS5rB,mBAIpBuE,EAAoB9D,MAC/B3F,EACAiC,EACA2kB,KAEA,IAAIn1B,EAAM,GAEV,OAAQwQ,GACN,KAAKwB,EAAAA,EAAS4C,UACZ5U,EAAM,sBAAsBuO,IAC5B,MACF,KAAKyD,EAAAA,EAASC,QACZjS,EAAM,qBAAqBm1B,EAAY/5B,KACvC,MACF,KAAK4W,EAAAA,EAASqK,iBACZrc,EAAM,wBAAwBm1B,EAAY/5B,KAS9C,aALuB2d,EAAAA,EAAQ+/B,IAAI94C,EAAG5G,EAAAA,EAAA,GACjC+7B,GAAW,IACdzC,QAASnkB,MAGK8F,KAAK9I,IAAI,EAGd8J,EAA0B9G,GAC9BwK,EAAAA,EAAQ+/B,IAAI,UAAUvqC,IAAU,CACrCiG,sBAAsB,IAIb29C,EAAoBj+C,gBACzB6E,EAAAA,EAAQ2L,KAAK,sCAAuC,CAAEtC,SAAQ,EAGzD6vC,EAAa/9C,gBACV6E,EAAAA,EAAQ2L,KAAK,qBAAsB,CAAEwuD,kBAAmBxgB,KAAqBr+C,KACxFC,O,qEClOE,IAAK6+D,EAAoB,SAApBA,GAAoB,OAApBA,EAAoB,kBAApBA,EAAoB,gBAApBA,EAAoB,gBAApBA,EAAoB,YAApBA,EAAoB,oBAApBA,CAAoB,K,qECAzB,IAAK7sB,EAA2B,SAA3BA,GAA2B,OAA3BA,EAA2B,kBAA3BA,EAA2B,cAA3BA,EAA2B,kCAA3BA,EAA2B,kCAA3BA,EAA2B,4CAA3BA,EAA2B,0BAA3BA,EAA2B,oBAA3BA,CAA2B,K,qICJhC,IAAK8sB,EAAc,SAAdA,GAAc,OAAdA,EAAAA,EAAc,eAAdA,EAAAA,EAAc,yBAAdA,EAAAA,EAAc,6BAAdA,EAAAA,EAAc,uBAAdA,EAAAA,EAAc,mBAAdA,EAAAA,EAAc,uBAAdA,CAAc,MAgBYt9D,OAAOC,OAAOq9D,GAAgBtP,OAClEhuD,OAAOC,OAAOo9D,EAAAA,IAOT,IAAKE,EAAsB,SAAtBA,GAAsB,OAAtBA,EAAAA,EAAsB,iBAAtBA,EAAAA,EAAsB,yBAAtBA,EAAAA,EAAsB,yBAAtBA,EAAAA,EAAsB,6BAAtBA,EAAAA,EAAsB,uBAAtBA,EAAAA,EAAsB,uBAAtBA,EAAAA,EAAsB,2CAAtBA,EAAAA,EAAsB,+CAAtBA,EAAAA,EAAsB,yCAAtBA,CAAsB,MAY3B,MAAMpjB,EAA8B,CACzC,EAAG,4BACH,EAAG,sBACH,EAAG,gCACH,EAAG,8BACH,EAAG,oCACH,EAAG,uCACH,EAAG,sBACH,EAAG,wBACH,EAAG,oB,qEC3CE,IAAKqjB,EAAa,SAAbA,GAAa,OAAbA,EAAa,oBAAbA,EAAa,yDAAbA,EAAa,uDAAbA,CAAa,K,4FCFlB,IAAKlwB,EAAQ,SAARA,GAAQ,OAARA,EAAQ,gCAARA,EAAQ,8BAARA,EAAQ,0CAARA,EAAQ,4CAARA,EAAQ,sCAARA,EAAQ,4BAARA,EAAQ,4CAARA,EAAQ,4CAARA,CAAQ,MAcb,MAAMmwB,EAAmD,CAC9D,CAACnwB,EAASowB,gBAAiB,SAC3B,CAACpwB,EAASqwB,eAAgB,QAC1B,CAACrwB,EAASswB,qBAAsB,cAChC,CAACtwB,EAASuwB,sBAAuB,eACjC,CAACvwB,EAASwwB,mBAAoB,YAC9B,CAACxwB,EAASC,cAAe,OACzB,CAACD,EAASywB,4BAA6B,qBACvC,CAACzwB,EAAS0wB,uBAAwB,gB,4FCxB7B,IAAKC,EAAoB,SAApBA,GAAoB,OAApBA,EAAoB,0CAApBA,EAAoB,8BAApBA,EAAoB,4CAApBA,CAAoB,MAMpBC,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,4DAAnBA,EAAmB,sEAAnBA,EAAmB,4CAAnBA,EAAmB,4BAAnBA,EAAmB,0BAAnBA,CAAmB,K,qICAxB,MAAMzjE,EAAmBA,CAACvQ,EAAMmD,OAAOhE,SAASmK,KAAMkH,EAAiB,MAC3C,MAA7BrN,OAAOhE,SAASiS,UAClB6iE,WAAWz1C,QAAQ,UAAUhuB,IAAQxQ,EAAK,KAAM,IAClD,EAGW40B,EAAmBA,CAC9Bs/C,EACAC,GAAa,EACb3jE,EAAiB,GACjB4jE,GAAiB,KAGjB,MAAMnO,EAAUgO,WAAW1vD,QAAQ,UAAU/T,MAAWyjE,WAAW1vD,QAAQ,WAC3E,GAAI0hD,EAAS,CASX,GARIkO,IAEFF,WAAWzvD,WAAW,UAAW,KACjCyvD,WAAWzvD,WAAW,WAAY,KAClCyvD,WAAWzvD,WAAW,WAAY,KAClCyvD,WAAWzvD,WAAW,WAAY,OAG/B4vD,EACH,OAAOnO,EAGL9iE,OAAOhE,SAASmK,OAAS28D,EAC3B9mE,SAAS4J,SAET5F,OAAOhE,SAASmK,KAAO28D,CAE3B,MAAWmO,IACTjxE,OAAOhE,SAASmK,KAAO4qE,EACzB,EAGW9sB,EAA6BA,CAACvb,EAAc1oC,OAAOhE,SAASiS,YACvEb,EAAiBs7B,IACV/lB,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,I,wRCrClCkR,IAAAA,OAAa,MACbA,IAAAA,OAAamhE,KACbnhE,IAAAA,OAAaohE,KACbphE,IAAAA,OAAaqhE,KACbrhE,IAAAA,OAAashE,KACbthE,IAAAA,OAAauhE,EAAAA,GAEN,MAAM5hE,EAAiBy6C,GACrBp6C,IAAMo6C,GAAMjwB,KAAKqE,KAAKgzC,MAAO,QAGzBC,EAAqBA,CAACC,EAAgBC,KACjD,IAAIC,EAAc,GACdF,GAASC,EACXC,EAAc5hE,IAAM,GAAG2hE,KAAQD,IAAS,WAAWE,cAC1CF,IACTE,EAAc5hE,IAAM,QAAQ0hE,IAAS,WAAWE,eAGlD,MAAMC,EAA6B,GACnC,IAAK,IAAI3qC,EAAI,EAAGA,GAAK0qC,EAAa1qC,GAAK,EACrC2qC,EAAiB/4E,KAAKouC,GAGxB,OAAO2qC,EAAiB75E,KAAK85E,IACpB,CACLjtE,MAAOye,OAAOwuD,GACdpqE,MAAO4b,OAAOwuD,MAEhB,EAGSC,EAA2C/hE,IAAAA,cAAoBhY,KAAI,CAAC05E,EAAOp/B,KAC/E,CACLztC,MAAO6sE,EACPhqE,MAAO4b,OAAOgvB,EAAQ,OAIpB0/B,EAAwB,GAC9B,IAAK,IAAI9qC,GAAI,IAAI1I,MAAOyzC,cAAe/qC,EAAI,KAAMA,GAAK,EACpD8qC,EAAYl5E,KAAKouC,GAEZ,MAAMgrC,EAA0CF,EAAYh6E,KAAK25E,IAC/D,CACL9sE,MAAOye,OAAOquD,GACdjqE,MAAO4b,OAAOquD,OAILQ,EAAsBA,CAAC/nB,EAAcn6C,IACzCD,IAAMo6C,GAAMgoB,GAAG,oBAAoBniE,OAAOA,E,qKClD5C,MAAMykC,EACX1V,IAEA,MAAQvd,EAAyBud,EAAzBvd,KAAMyrB,EAAmBlO,EAAnBkO,eAEd,IAAKzrB,EACH,MAAM,IAAImnB,MAAM,6BAGlB,OAAQsE,GACN,KAAKkjC,EAAAA,EAAciC,SACjB,OAAOC,EAAAA,EAAAA,KAAc7wD,GACvB,KAAK2uD,EAAAA,EAAcmC,6BACjB,OAAOC,EAAAA,EAAAA,KAAkC/wD,GAC3C,KAAK2uD,EAAAA,EAAcqC,4BACjB,OAAOC,EAAAA,EAAAA,KAAiCjxD,GAC1C,SACE0K,EAAAA,EAAAA,GAAa+gB,GACjB,EAGWylC,EAAqC,CAChD,CAAC5qD,EAAAA,GAAgB8P,KAAMu4C,EAAAA,EAAciC,SACrC,CAACtqD,EAAAA,GAAgBC,oBAAqBooD,EAAAA,EAAcqC,4BACpD,CAAC1qD,EAAAA,GAAgBgQ,qBAAsBq4C,EAAAA,EAAcmC,8BAG1CK,EAAsB,U,2pCCN5B,MAAMC,EAA8Bh9D,GACzB,OAAZA,GACG,wBAAyBA,EAGrB81C,EAAmE,CAC9E,CAAC5jC,EAAAA,GAAgB+P,WAAY,YAC7B,CAAC/P,EAAAA,GAAgB8P,KAAM,cACvB,CAAC9P,EAAAA,GAAgBgQ,qBAAsB,cACvC,CAAChQ,EAAAA,GAAgBC,oBAAqB,uBAG3Bi4B,EAA4BA,CACvC53C,EACAwN,KAEA,MAAMi9D,OAA+BrqE,IAArBoN,EAAQk9D,WAA2Bl9D,EAAQk9D,SAE3D,GAAI1qE,EAAKiF,OAASwB,EAAAA,EAASC,QAAS,CAClC,MAAAikE,EAA8C3qE,EAAKnL,aAA3Cyb,EAAOq6D,EAAPr6D,QAAS1J,EAAQ+jE,EAAR/jE,SAAUmJ,EAAc46D,EAAd56D,eACrB66D,EAAYt6D,IAAYu6D,EAAAA,EAAmBC,QAC3CC,EAAav9D,EAAQ6mC,mBAAqB30B,EAAAA,GAAgB+P,UAEhE,GAAI7oB,IAAagkE,GAAaH,GAAWM,GACvC,OAAIh7D,EACK8nC,EAAAA,EAASswB,oBAEXtwB,EAAAA,EAASqwB,aAEpB,CAEA,OACEloE,EAAK41B,MAAMnN,MACRxjB,GACwB,YAAvBA,EAAKkyB,eACLlyB,EAAK+lE,cAAgBx9D,EAAQ3d,IAC7B46E,KAAaxlE,EAAK3U,OAASunD,EAAAA,EAASuwB,yBACrC93E,MAAQ,IAAI,EAIN26E,EAAmBA,CAC9BjrE,EAIAwN,KAKA,IAAKxN,IAASwN,EAAS,OAAO,EAE9B,MAAA5I,EAA0C5E,EAAKnL,aAAvCyb,EAAO1L,EAAP0L,QAAS1J,EAAQhC,EAARgC,SAAUyvB,EAAUzxB,EAAVyxB,WACrB60C,EAAqBlrE,EAAKiF,OAASwB,EAAAA,EAASC,SAAW8G,EAAQrW,QAAQtH,KAAOwmC,EAC9Eu0C,EAAYt6D,IAAYu6D,EAAAA,EAAmBC,QAC3CL,OAA+BrqE,IAArBoN,EAAQk9D,WAA2Bl9D,EAAQk9D,SACrDK,EAAav9D,EAAQ6mC,mBAAqB30B,EAAAA,GAAgB+P,UAEhE,SAAIy7C,GAAsBtkE,IAAagkE,GAAaH,GAAWM,KAIxD16D,QACLrQ,EAAK41B,MAAM1vB,MACRjB,GACwB,YAAvBA,EAAKkyB,eACLlyB,EAAK+lE,cAAgBx9D,EAAQ3d,KAC5B46E,EACGxlE,EAAK3U,OAASunD,EAAAA,EAASuwB,qBACvBnjE,EAAK3U,OAASunD,EAAAA,EAASC,cACvB7yC,EAAK3U,OAASunD,EAAAA,EAASwwB,mBACvBpjE,EAAK3U,OAASunD,EAAAA,EAASywB,4BACvBrjE,EAAK3U,OAASunD,EAAAA,EAAS0wB,yBAEhC,EAGU9zB,EAAyBA,CACpCz0C,EAMAwN,KAKA,MAAAs9C,EAA0C9qD,EAAKnL,aAAvCyb,EAAOw6C,EAAPx6C,QAAS1J,EAAQkkD,EAARlkD,SAAUyvB,EAAUy0B,EAAVz0B,WAE3B,IACGr2B,KACC,OAAQA,KACTwN,GACDxN,EAAKiF,OAASwB,EAAAA,EAASC,SACvB8G,EAAQrW,QAAQtH,KAAOwmC,EAEvB,OAAO,EAGT,MAAMu0C,EAAYt6D,IAAYu6D,EAAAA,EAAmBC,QAC3CL,OAA+BrqE,IAArBoN,EAAQk9D,WAA2Bl9D,EAAQk9D,SACrDK,EAAav9D,EAAQ6mC,mBAAqB30B,EAAAA,GAAgB+P,UAEhE,SAAI7oB,KAAagkE,GAAaH,GAAWM,KAIlC16D,QACLrQ,EAAK41B,MAAM1vB,MACRjB,GACwB,YAAvBA,EAAKkyB,eACLlyB,EAAK+lE,cAAgBx9D,EAAQ3d,KAC5B46E,EACGxlE,EAAK3U,OAASunD,EAAAA,EAASuwB,qBACvBnjE,EAAK3U,OAASunD,EAAAA,EAASC,gBAEhC,EAGUqzB,EAA0BA,CACrCj7E,EACAsd,IAKI,cAAetd,EAAY2E,cAE3B+iD,EAA0B1nD,EAAqCsd,KAC/DqqC,EAAAA,EAAS0wB,sBAOF6C,EAAyBA,EACpC/uC,YACAgvC,OACAC,cAMAD,EAAKh7E,QAAQ6wC,GACXA,EAAOtL,MAAMnN,MACVxjB,GACwB,YAAvBA,EAAKkyB,eAA+BlyB,EAAK+lE,cAAgB3uC,GAAap3B,EAAK3U,OAASg7E,MAI/EC,EACX/9D,IAEA,MAAM6pC,EAAoB7pC,EAAQ8pC,oBAC5Bk0B,EAAsBn0B,EAAkBhnD,QAC3CmnD,GAAaA,EAASvyC,OAASwB,EAAAA,EAASC,SAAW8wC,EAAS3iD,aAAakb,iBAEtE07D,EAAqBp0B,EAAkBhnD,QAC1CmnD,GACCA,EAASvyC,OAASwB,EAAAA,EAASC,SAC3B8wC,EAAS3iD,aAAa+R,WACrB4wC,EAAS3iD,aAAakb,iBAErB27D,GAAQj0B,EAAAA,EAAAA,GACZ2zB,EAAuB,CACrB/uC,UAAW7uB,EAAQ3d,GACnBw7E,KAAMh0B,EACNi0B,SAAUzzB,EAAAA,EAASC,gBAGjB6zB,GAAal0B,EAAAA,EAAAA,GACjB2zB,EAAuB,CACrB/uC,UAAW7uB,EAAQ3d,GACnBw7E,KAAMh0B,EACNi0B,SAAUzzB,EAAAA,EAASwwB,qBAGjBuD,GAAgBn0B,EAAAA,EAAAA,GACpB2zB,EAAuB,CACrB/uC,UAAW7uB,EAAQ3d,GACnBw7E,KAAMh0B,EACNi0B,SAAUzzB,EAAAA,EAAS0wB,yBAGjBsD,GAAqBp0B,EAAAA,EAAAA,GACzB2zB,EAAuB,CACrB/uC,UAAW7uB,EAAQ3d,GACnBw7E,KAAMh0B,EACNi0B,SAAUzzB,EAAAA,EAASywB,8BAGjBwD,GAAer0B,EAAAA,EAAAA,GACnB2zB,EAAuB,CACrB/uC,UAAW7uB,EAAQ3d,GACnBw7E,KAAMh0B,EACNi0B,SAAUzzB,EAAAA,EAASuwB,wBAIvB,OAAO2D,EAAAA,EAAAA,QACL,IACMv+D,EAAQk9D,SACR,IAAIgB,KAAUC,KAAeC,KAAkBC,GAC/CC,KACDL,KACAD,IAEJh0B,GAAaA,EAAS3nD,KACvBu1B,MAAM,EAAG,EAAE,EAGF47B,EAAqBA,CAChCxzC,EACAw+D,GAAiB,KAEjB,OAAQx+D,GAAS6mC,kBACf,KAAK30B,EAAAA,GAAgB+P,UACnB,MAAO,YAAYjiB,EAAQrW,QAAQ+iB,aAErC,KAAKwF,EAAAA,GAAgB8P,IACnB,MACE,aAAahiB,EAAQ+oC,aAAa01B,wBAA0B,aAAaz+D,EAAQ4L,QAChF5L,EAAQsuD,cAAgBkQ,EACrB,IAAIE,EAAAA,MAAqB1+D,EAAQsuD,cACjC,IAGR,KAAKp8C,EAAAA,GAAgBgQ,oBACnB,MAAO,oBAAoBliB,EAAQ4L,OAErC,KAAKsG,EAAAA,GAAgBC,mBACnB,OAAOH,EAAAA,EAAAA,KAAwBhS,EAAQ4L,MAEzC,QACE,MAAM,IAAImnB,MAAM,6BAA6B/yB,GAAS6mC,oBAE1D,EAGW9mC,EAAyBA,CACpCC,EAKAtM,KAEOirE,EAAAA,EAAAA,KACL58C,EAAAA,GAA4B/hB,EAAQ6mC,kBACpC7mC,EAAQ4L,KACR5L,EAAQsuD,Y,+VAAWjuE,CAAA,CAEb,CAACq+E,EAAAA,IAAoB1+D,EAAQsuD,aAC1B56D,GAELA,GAWKyzC,EACXnnC,IAEA,IAAKA,EAAQ+oC,YAAY61B,cAAgB5+D,EAAQ+oC,YAAY0I,SAC3D,OAAIzxC,EAAQ+nD,QAAgB3gB,EAAAA,GAAwBC,OAC7CD,EAAAA,GAAwBy3B,OAGjC,MAAMC,EACJj8D,QAAQ7C,EAAQ+oC,YAAY61B,cAC5BzkE,MAAQ4kE,SAAS/+D,EAAQ+oC,YAAY61B,aAAe,GAChDI,EACJn8D,QAAQ7C,EAAQ+oC,YAAY0I,WAAat3C,MAAQ8kE,QAAQj/D,EAAQ+oC,YAAY0I,UAAY,GAE3F,OAAIqtB,EAA2B13B,EAAAA,GAAwBiL,YACnDryC,EAAQ+nD,QACNiX,EAAuB53B,EAAAA,GAAwB83B,aACvC93B,EAAAA,GAAwBC,OAC/BD,EAAAA,GAAwBy3B,MAAM,EAmB1BM,EAAoCn/D,IAQ/C,IAxBqCA,KAOrC,MAAMo/D,EAAgC,IAAIz2C,KAAK,aAE/C,OACE,IAAIA,KAAK3oB,EAAQukB,YAAc,IAAM66C,GACrC,IAAIz2C,KAAK3oB,EAAQ+oC,aAAa61B,aAAe,IAAMQ,GACnD,IAAIz2C,KAAK3oB,EAAQ+oC,aAAa0I,UAAY,IAAM2tB,CAA6B,EAa5EC,CAAuBr/D,KACvBA,EAAQ+oC,aAAa0I,UACtB,IAAI9oB,KAAS,IAAIA,KAAK3oB,EAAQ+oC,aAAa0I,UAE3C,OAAO6tB,EAAAA,GAA8BC,eAGvC,IAAKv/D,EAAQw/D,kBAAmB,OAAOF,EAAAA,GAA8BG,eAErE,MAAMC,GAAoB5lE,EAAAA,EAAAA,IAAckG,EAAQw/D,mBAEhD,OAAIE,EAAoB,EAAUJ,EAAAA,GAA8BK,cAC5DD,EAAoB,EAAUJ,EAAAA,GAA8BM,qBACzDN,EAAAA,GAA8BO,eAAe,EAGzCC,EACX9/D,IAEA,IAAKA,EAAS,OAAO,EAErB,IAAKA,EAAQ+oC,YAAa,OAAO,EAEjC,GAAI/oC,EAAQ6mC,mBAAqB30B,EAAAA,GAAgB+P,UAAW,OAAO,EAEnE,MAKQ28C,EALY5+D,EAAQ+oC,YAKpB61B,YAER,QAAKA,GAEE,IAAIj2C,KAAKi2C,GAAe,IAAIj2C,KAAKA,KAAKo3C,IAAI,KAAM,EAAG,GAAG,EAGlDC,EAA0BA,EACrCC,WACAC,SACAh2B,WAOA+1B,EAAS/1B,MAAK,CAACrtC,EAAGstC,KAChB,MAAMg2B,EAAUh5B,EAA2BtqC,GACrCujE,EAAUj5B,EAA2BgD,GAGrCk2B,EAAiBxzD,GACrB+S,OAAOwgD,IAAYvzD,GAAU+S,OAAOugD,IAAYtzD,GAE5CyzD,EAAgBJ,EAAO/1B,EAAE9nD,IAAM69E,EAAOrjE,EAAExa,IAExCk+E,EACJ,IAAI53C,KAAK9rB,EAAEksC,YAAY61B,aAAc4B,UACrC,IAAI73C,KAAKwhB,EAAEpB,YAAY61B,aAAc4B,UAEjCC,EACJ,IAAI93C,KAAKwhB,EAAEpB,YAAY0I,UAAW+uB,UAAY,IAAI73C,KAAK9rB,EAAEksC,YAAY0I,UAAW+uB,UAElF,OAAQt2B,GACN,KAAKlC,EAAAA,GAAO04B,UACV,OACGL,EAAcj5B,EAAAA,GAAwBC,SACrCg5B,EAAcj5B,EAAAA,GAAwBiL,cACtCguB,EAAcj5B,EAAAA,GAAwB83B,eACtCmB,EAAcj5B,EAAAA,GAAwBy3B,SACtCyB,IACCH,IAAY/4B,EAAAA,GAAwBiL,YACjCkuB,EACAE,KACN,EAEJ,KAAKz4B,EAAAA,GAAO24B,YACV,OAAQJ,GAAqBD,EAC/B,KAAKt4B,EAAAA,GAAO44B,SACV,OACGP,EAAcj5B,EAAAA,GAAwBC,SACrCg5B,EAAcj5B,EAAAA,GAAwBiL,cACtCguB,EAAcj5B,EAAAA,GAAwB83B,eACtCmB,EAAcj5B,EAAAA,GAAwBy3B,UACrCsB,IAAY/4B,EAAAA,GAAwBiL,YACjCkuB,EACAE,IACJH,IACF,EAEJ,SACEhqD,EAAAA,EAAAA,GAAa4zB,GACjB,GACA,C,qCCzbG,SAAS5zB,EAAauqD,GAC3B,MAAM,IAAI9tC,MAAM,wBAAwB8tC,IAC1C,C,6GCCO,MAAM52B,EAA0BA,CACrCv3C,EACAouE,EAA0C,WAEnCpuE,EAAMw3C,MAAK,CAACrtC,EAAGstC,IACbvqB,OAAO/c,QAAQsnC,EAAEjgD,QAAQ42E,GAAW75E,MAAQ24B,OAAO/c,QAAQhG,EAAE3S,QAAQ42E,GAAW75E,O,84CCuB3F,MAAM85E,EAAsB,SACtBC,EAA6B,gBAC7BC,EAA6B,gBAEpB,SAASC,GAAyB,aAC/C3K,EAAY,gBACZ4K,EAAe,mBACfC,EAAkB,sBAClBC,EAAqB,mBACrBC,EAAkB,sBAClBC,EAAqB,OACrB/hC,EAAM,UACN8H,EAAS,WACTk6B,IAEA,MAAqD5zE,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA9C2zE,EAAW7zE,EAAA,GAAE8zE,EAAc9zE,EAAA,GACgBK,EAAAJ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA3C6zE,EAAW1zE,EAAA,GAAE2zE,EAAc3zE,EAAA,GAE5B8hB,GAAWzhB,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMmK,OAAO2lB,WAEzDuI,EAAiCzqB,GAAjBmvB,EAAAA,EAAAA,KAAiB,GAArB,GACb1rB,GAAUC,EAAAA,EAAAA,MACVswE,GAAUlW,EAAAA,EAAAA,MAEhBp2D,EAAAA,EAAAA,YAAU,KACR,GAAIssE,EAAJ,CAIE,GAHIvpD,EAAaqc,IAAIosC,IACnBI,EAAgB7oD,EAAaxY,IAAIihE,GAAsBt0D,MAAM,MAE3D6L,EAAaqc,IAAIqsC,GAA6B,CAChD,MAAMc,EAAexpD,EAAaxY,IAAIkhE,GAA6Bv0D,MAAM,KACzE40D,EAAsBS,EACxB,CACA,GAAIxpD,EAAaqc,IAAIssC,GAA6B,CAChD,MAAM/M,EAAe57C,EAAaxY,IAAImhE,GAA6Bx0D,MAAM,KACzE80D,EAAsBrN,EACxB,CAEF,MAEIqC,EAAavzE,OAAQs1B,EAAasc,IAAImsC,EAAqBxK,EAAaxzE,KAAK,MAC5Eu1B,EAAagoB,OAAOygC,GACrBK,EAAmBp+E,OACrBs1B,EAAasc,IAAIosC,EAA4BI,EAAmBr+E,KAAK,MAClEu1B,EAAagoB,OAAO0gC,GACrBM,EAAmBt+E,OACrBs1B,EAAasc,IAAIqsC,EAA4BK,EAAmBv+E,KAAK,MAClEu1B,EAAagoB,OAAO2gC,GAEzB3vE,EAAQ6hB,QAAQ,CAAE3B,OAAQ8G,EAAaqG,YAAa,GACnD,CAAC43C,EAAc4K,EAAiBC,EAAoBC,IAEvD,MAAMU,EAAqBA,KACzBH,EAAe,IACfT,EAAgB,IAChBE,EAAsB,IACtBE,EAAsB,GAAG,EAGrBS,EAAsBzL,EAAap0E,KAAK0P,IAAK,CAAQA,QAAO7C,MAAO6C,MAEnEowE,GACJ31E,EAAAA,EAAAA,KAACkuB,EAAAA,EAAc,CACb3oB,MAAO8vE,EACPxyE,SAAUyyE,EACV1mE,SAAWrJ,IACJA,IACLsvE,EAAgB,IAAI5K,EAAc1kE,IAClC+vE,EAAe,IAAG,EAEpBriE,YAAY,2BACZ66C,WAAY,OAIV8nB,EACJ3L,EAAavzE,OAAS,GACpBsJ,EAAAA,EAAAA,KAAA,OAAK0J,MAAO,CAAEqP,UAAW,IAAK5Y,UAC5BH,EAAAA,EAAAA,KAAC61E,EAAAA,GAAU,CACTzuE,QAASsuE,EACTI,eAAgB7L,EAChBpnE,SAAW6N,GAAWmkE,EAAgBnkE,GAAU,IAChDkJ,IAAI,UACJm8D,SAAO,MAGT,KAWAC,EACHC,GAAsCnzE,IACjCA,EAAEE,OAAOC,QACXgyE,GAAuBiB,GAAS,IAAIA,EAAMD,KAE1ChB,GAAuBiB,GAASA,EAAK3/E,QAAQ1C,GAASA,IAASoiF,KACjE,EAGEE,GACJn2E,EAAAA,EAAAA,KAAAkC,EAAAA,SAAA,CAAA/B,SAuCGuqB,EAAAA,GAAc0rD,kCACbp2E,EAAAA,EAAAA,KAACq2E,EAAAA,GAAa,CAAC3zE,MAAM,oBAAmBvC,UACtC8B,EAAAA,EAAAA,MAACyzC,EAAAA,GAAiB,CAAC,cAAY,0BAAyBv1C,SAAA,EACtDH,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACP6zE,WAAY7yD,EACZ/gB,OAAO1C,EAAAA,EAAAA,KAACu2E,EAAa,CAACC,WAAY/yD,EAAStjB,SAAC,aAC5CyC,UAAWoyE,EAAmB9oE,SAASuqE,EAAAA,GAAoBC,UAC3D7zE,SAAUmzE,EAAwBS,EAAAA,GAAoBC,UACtD/zE,KAAK,QAEP3C,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACP6zE,WAAY7yD,EACZ/gB,OAAO1C,EAAAA,EAAAA,KAACu2E,EAAa,CAACC,WAAY/yD,EAAStjB,SAAC,yBAC5CyC,UAAWoyE,EAAmB9oE,SAASuqE,EAAAA,GAAoBE,sBAC3D9zE,SAAUmzE,EAAwBS,EAAAA,GAAoBE,sBACtDh0E,KAAK,QAEP3C,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACP6zE,WAAY7yD,EACZ/gB,OAAO1C,EAAAA,EAAAA,KAACu2E,EAAa,CAACC,WAAY/yD,EAAStjB,SAAC,cAC5CyC,UAAWoyE,EAAmB9oE,SAASuqE,EAAAA,GAAoBG,WAC3D/zE,SAAUmzE,EAAwBS,EAAAA,GAAoBG,WACtDj0E,KAAK,cAQjB,OAAI8gB,GAEAxhB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmiB,EAAAA,GAAc,CACb/f,OAAQ+yE,EACR9yE,QAASA,IAAM+yE,GAAe,GAC9B7oE,oBAAkB,EAClB6V,UAAU,SACVy0D,mBACE72E,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,QACTV,KAAK,KACL4E,QAAQ,SACR9D,QAASA,IAAM2xE,GAAe,GAC9B52D,gBAAgB,SAChB,cAAY,eACZzX,OAAO,eAEV5G,UAED8B,EAAAA,EAAAA,MAAC60E,EAAK,CAAA32E,SAAA,EACJ8B,EAAAA,EAAAA,MAACgsB,EAAAA,GAAe,CAAA9tB,SAAA,CACbg2E,GACDn2E,EAAAA,EAAAA,KAACq2E,EAAAA,GAAa,CAAC3zE,MAAM,UAASvC,UAC5BH,EAAAA,EAAAA,KAAC01C,EAAAA,GAAiB,CAAC,cAAY,aAAYv1C,SACxC45C,EAAgBlkD,KAAK+lD,IACpB57C,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CAEP6zE,WAAY7yD,EACZ/gB,OAAO1C,EAAAA,EAAAA,KAACu2E,EAAa,CAACC,WAAY/yD,EAAStjB,SAAEy7C,EAAOl5C,QACpDE,UAAWswC,EAAO3tC,QAAUq2C,EAAOr2C,MACnC1C,SAAWC,GAAMA,EAAEE,OAAOC,SAAW+3C,EAAUY,GAC/Cj5C,KAAK,KACL9O,KAAK,SANA,QAAQ+nD,EAAOr2C,gBAW5BvF,EAAAA,EAAAA,KAAC+2E,EAAAA,GAAkB,CAACtzE,QAASgyE,QAE/BxzE,EAAAA,EAAAA,MAAC+0E,EAAW,CAAA72E,SAAA,EACVH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACnD,QAAQ,QAAQ9D,QAASA,IAAM2xE,GAAe,GAAOj1E,SAAC,YAG9D8B,EAAAA,EAAAA,MAACyI,EAAAA,GAAM,CAACnD,QAAQ,UAAU9D,QAASA,IAAM2xE,GAAe,GAAOj1E,SAAA,CAAC,QACxD+0E,EAAW,6BAKzBjzE,EAAAA,EAAAA,MAAA,OAAKyH,MAAO,CAAEsP,aAAc,IAAK7Y,SAAA,EAC/B8B,EAAAA,EAAAA,MAACg1E,EAAe,CAAA92E,SAAA,EACdH,EAAAA,EAAAA,KAAA,OAAK0J,MAAO,CAAE7L,MAAO,QAASsC,SAAEw1E,KAChC31E,EAAAA,EAAAA,KAACsH,EAAAA,GAAU,CACTjE,SAAS,gBACTkE,QAAQ,SACRC,aAAa,OACb/D,QAASA,IAAM2xE,GAAe,QAGjCQ,SAMP3zE,EAAAA,EAAAA,MAACgsB,EAAAA,GAAe,CAAA9tB,SAAA,EACd8B,EAAAA,EAAAA,MAACo0E,EAAAA,GAAa,CAAC3zE,MAAM,SAASw0E,YAAY,WAAU/2E,SAAA,CACjDw1E,EACAC,KAEFO,GACDn2E,EAAAA,EAAAA,KAAC+2E,EAAAA,GAAkB,CAACtzE,QAASgyE,MAGnC,CAEA,MAAMwB,EAAkB7yE,EAAAA,GAAOC,GAAG;;;;;;EAQ5ByyE,EAAQ1yE,EAAAA,GAAOC,GAAG;;;;IAIpB4pB,EAAAA;;;;;EAOE+oD,EAAc5yE,EAAAA,GAAOC,GAAG;;;;;0BAKJd,EAAAA,GAAO4N;EAG3BolE,EAAgBnyE,EAAAA,GAAOC,GAAG;;;;;IAK5B,EAAGmyE,gBACHA,GACA;kgCCrSG,IAAK96B,EAAM,SAANA,GAAM,OAANA,EAAM,sBAANA,EAAM,0BAANA,EAAM,oBAANA,CAAM,MAKX,MAAM3B,EAAkB,CAC7B,CAAEx0C,MAAOm2C,EAAO04B,UAAW1xE,MAAO,eAClC,CAAE6C,MAAOm2C,EAAO24B,YAAa3xE,MAAO,kBACpC,CAAE6C,MAAOm2C,EAAO44B,SAAU5xE,MAAO,aAK7By0E,EAAiB,WA+KvB,MA7K0BC,EAAGC,iBAAgBC,wBAC3C,MAAiFh2E,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA1E+1E,EAAyBj2E,EAAA,GAAEk2E,EAA4Bl2E,EAAA,GACOK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA9Di2E,EAAmB91E,EAAA,GAAE+1E,EAAsB/1E,EAAA,GAEwC2M,EAAA/M,GAA9DC,EAAAA,EAAAA,UAA2Cu4C,EAAgB,IAAG,GAAnF7G,EAAM5kC,EAAA,GAAE0sC,EAAS1sC,EAAA,GACsC0D,EAAAzQ,GAAtBC,EAAAA,EAAAA,UAAmB,IAAG,GAAvDyoE,EAAYj4D,EAAA,GAAE6iE,EAAe7iE,EAAA,GAC+CE,EAAA3Q,GAA/BC,EAAAA,EAAAA,UAA4B,IAAG,GAA5EszE,EAAkB5iE,EAAA,GAAE6iE,EAAqB7iE,EAAA,GACuCE,EAAA7Q,GAAnCC,EAAAA,EAAAA,UAAgC,IAAG,GAAhFwzE,EAAkB5iE,EAAA,GAAE6iE,EAAqB7iE,EAAA,GAC1CulE,EAAa,CAAC1N,EAAc6K,EAAoBE,GAEhDvxD,GAAWzhB,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMmK,OAAO2lB,WAC1DrtB,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/Du6B,GAAcC,EAAAA,EAAAA,QAA8B,MAE5C9uB,GAAWC,EAAAA,EAAAA,MAGX61E,EAAuD,SADrBr2E,GAAjBmvB,EAAAA,EAAAA,KAAiB,GAArB,GACkBld,IAAI2jE,GACnCU,EACJD,GAA6D,SAA1C34D,cAAcC,QAAQi4D,IAA8B/gF,EAAYL,IAErFkT,EAAAA,EAAAA,YAAU,KACH2uE,GAGD34D,eAAiBA,aAAaC,QAAQi4D,IACxCl4D,aAAaka,QAAQg+C,EAAgB,OAAO,GAC7C,CAACS,IAEJ,MAAA5mD,IAA4BC,EAAAA,EAAAA,GAC1B,CAAC,4BAA6B0mD,IAC9B,KACEG,EAAAA,EAAAA,IAAuB,CACrB7N,eACA6K,qBACAE,wBAEJ,CACEvnD,QAASqE,EAAAA,GACT1E,UAAWA,IAAMkqD,EAAkB,KAV/BtoE,GAAIgiB,GAAJhiB,KAAM6d,GAASmE,GAATnE,UAaR8mD,GAAW3kE,IAAM2kE,UAAY,GAC7BoE,GAAgB/oE,IAAM4kE,QAAU,CAAC,EACjCsB,GAAavB,GAASj9E,QAE5BuS,EAAAA,EAAAA,YAAU,KACJnP,SAASorB,OAAOhZ,SAAS,iBAAmBpS,SAASorB,OAAOhZ,SAAS,SACvEsrE,GAA6B,GAE3B19E,SAASorB,OAAOhZ,SAAS,mBAC3BwrE,GAAuB,EACzB,GACC,KAEHzuE,EAAAA,EAAAA,YAAU,KACJqqB,OAAO4hD,IAAc,GACvBvkD,EAAYE,SAASC,eAAe,CAAEC,SAAU,UAClD,GACC,CAACsmD,IAEJ,MAAMW,GAjE4B,IAiETX,EAAiB,GACpCY,GAAYD,GAlEgB,IAoElCtE,EAAAA,EAAAA,IAAwB,CAAEC,YAAUC,OAAQmE,GAAen6B,KAAM1K,EAAO3tC,QAExE,MAAM1O,IACJmJ,EAAAA,EAAAA,KAAC40E,EAAwB,CACvB3K,aAAcA,EACd4K,gBAAiBA,EACjBC,mBAAoBA,EACpBC,sBAAuBA,EACvBC,mBAAoBA,EACpBC,sBAAuBA,EACvB/hC,OAAQA,EACR8H,UAAWA,EACXk6B,WAAYA,KAIhB,OACEjzE,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CACTE,QAASA,KACPq1E,GAAuB,EAAM,EAE/Bt1E,OAAQq1E,EACR55E,MAAM,QAAOsC,UAEbH,EAAAA,EAAAA,KAACk4E,EAAAA,EAAkB,CACjBtpE,SAAUA,KACR8oE,GAAuB,EAAM,OAInC13E,EAAAA,EAAAA,KAAC46D,EAAAA,GAAmB,CAClBx4D,OAAQm1E,EACRl1E,QAASA,IAAMm1E,GAA6B,MAE9Cv1E,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACNsjB,IACAxhB,EAAAA,EAAAA,MAACktB,EAAW,CAAAhvB,SAAA,CAAC,2CAEXH,EAAAA,EAAAA,KAAA,SAAM,8DAIViC,EAAAA,EAAAA,MAACk2E,EAAAA,EAAO,CAAAh4E,SAAA,EACNH,EAAAA,EAAAA,KAACo4E,EAAAA,GAAY,CAAAj4E,SAAEtJ,MACfoL,EAAAA,EAAAA,MAACo2E,EAAAA,GAAa,CAAAl4E,SAAA,EACZ8B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACIsjB,IACAzjB,EAAAA,EAAAA,KAACs4E,EAAY,CAAAn4E,UACX8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CAAK,YAEHH,EAAAA,EAAAA,KAAC27C,EAAAA,GAAkB,CACjBv0C,QAAS2yC,EACTx0C,MAAO2tC,EACPrwC,SAAUm4C,EACV3zC,uBAAuB,eAK9Boc,GAAY5sB,MAEdg2B,IACC7sB,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACoJ,QAAM,EAACC,OAAO,WAAWC,MAAO,CAAEqP,UAAW,QAErD9W,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,OAAKozB,IAAKzC,EAAYxwB,SACnBwzE,GAASj9E,OAAS,GACjBsJ,EAAAA,EAAAA,KAACs6D,EAAc,CAAC,cAAY,gBAAen6D,SACxCwzE,GAASroD,MAAM0sD,GAAiBC,IAAWpiF,KAAK6d,IAC/C1T,EAAAA,EAAAA,KAACqmD,EAAAA,EAAO,CAEN3yC,QAASA,EACT4yC,SAAUxoD,OAAOhE,SAASiS,SAAWjO,OAAOhE,SAASorB,QAFhDxR,EAAQ3d,SAOnBkM,EAAAA,EAAAA,MAACs2E,EAAkB,CAAAp4E,SAAA,EACjB8B,EAAAA,EAAAA,MAACu2E,EAAe,CAAAr4E,SAAA,EACdH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,SAAS8M,MAAOC,EAAAA,GAAOyD,cAAe,yBAGnDhH,EAAAA,EAAAA,KAACy4E,EAAa,CAAAt4E,SAAC,oEAMrBH,EAAAA,EAAAA,KAAC04E,EAAAA,GAAU,CACTC,YAAatB,EACbuB,eAAiBzjB,GACf0iB,EACIP,EAAkBniB,GAClBrzD,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,KAExCk8E,WAAY3vB,KAAK4vB,KAAKxlD,OAAO4hD,IApKX,IAqKlBn8D,UAAU,uBAOrB,EAQA,MAAM9Y,EAAYmE,EAAAA,GAAOC,GAAG;;;;;IAK/B4I,EAAAA,GAAkB8M;;;EAIToV,EAAc/qB,EAAAA,GAAOwmB,EAAE;IAChCtmB,EAAAA,GAAM2qB;;IAENhiB,EAAAA,GAAkB8M;;;EAIhBugD,EAAiBl2D,EAAAA,GAAOC,GAAG;;;;;IAK7B4I,EAAAA,GAAkBmxC;;;IAGlBnxC,EAAAA,GAAkB8rE;;;IAGlB9rE,EAAAA,GAAkB8b;;;EAIhBuvD,EAAel0E,EAAAA,GAAOC,GAAG;;;;;;;;;;;MAWzBC,EAAAA,GAAM8I;;EAGNmrE,EAAqBn0E,EAAAA,GAAOC,GAAG;;;;;;EAO/Bm0E,EAAkBp0E,EAAAA,GAAOC,GAAG;;;;EAK5Bo0E,EAAgBr0E,EAAAA,GAAOC,GAAG;IAC5BC,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOyD;;IAEdiG,EAAAA,GAAkB8M;;;4xCC5Qf,MAAMo+D,EAAU/zE,EAAAA,GAAOC,GAAG;;;;IAI7B4I,EAAAA,GAAkBD;;;;EAMTorE,EAAeh0E,EAAAA,GAAOC,GAAG;;;;IAIlC4I,EAAAA,GAAkBD;;;EAKTqrE,EAAgBj0E,EAAAA,GAAOC,GAAG;;EAQ1B4pB,EAAkB7pB,EAAAA,GAAOC,GAAG;;;;;;;;;;IAUrC4I,EAAAA,GAAkBD;;;;EAMTqpE,EAAgBA,EAC3B3zE,QACAw0E,cAAc,WACd8B,cACA74E,eAOA,MAAkDmB,EAAAC,GAAdC,EAAAA,EAAAA,WAAS,GAAK,GAA3CugC,EAAUzgC,EAAA,GAAE+mD,EAAa/mD,EAAA,GAChC,OACEW,EAAAA,EAAAA,MAACg3E,EAAsB,CAACl3C,WAAYA,EAAW5hC,SAAA,EAC7C8B,EAAAA,EAAAA,MAACuN,EAAK,CACJzI,OAAQmwE,EACR8B,YAAaA,EACbv1E,QAASA,IAAMu1E,GAAe3wB,GAAetmB,GAAY5hC,SAAA,CAExDuC,EACAs2E,IAAeh5E,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAMurC,EAAa,aAAe,qBAE1D/hC,EAAAA,EAAAA,KAACk5E,EAAuB,CAACn3C,WAAYA,EAAW5hC,SAAEA,MAC3B,EAIvB84E,EAAyB70E,EAAAA,GAAOC,GAAG;oBACrB,EAAG09B,gBAAkBA,EAAa,OAAS;6BAClCx+B,EAAAA,GAAOsE;EAG9B2H,EAAQpL,EAAAA,GAAOC,GAAG;;;;YAIZ,EAAG0C,YAAaA,GAAU;IAClCzC,EAAAA,GAAM+L;;;MAGJ,EAAG2oE,iBAAkBA,GAAe;;EAIpCE,EAA0B90E,EAAAA,GAAOC,GAAG;YAC9B,EAAG09B,gBAAkBA,EAAa,OAAS;;EAQ1C2T,EAAoBtxC,EAAAA,GAAOC,GAAG;;;;EAM9B0yE,EAAqBA,EAAGtzE,cACnCxB,EAAAA,EAAAA,MAACk3E,EAAAA,GAAiB,CAACtlF,KAAK,SAAS4P,QAASA,EAAQtD,SAAA,EAChDH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAUuQ,OAAO,iBAAiBzD,MAAOC,EAAAA,GAAOC,YAAa,kB,srCC1GrE,MAAM41E,EAAiB,CAAC,uBAAwB,MAAO,MAAO,cACxDC,EAAwBD,EAAevjF,IAAI+a,EAAAA,IAC3C0oE,EAAqBF,EAAevjF,KAAKuN,IAAI,CACxDV,MAAOU,EACPmC,MAAOnC,MAmIT,KAhIA,UAA0B,YAAE0sB,EAAW,eAAEC,EAAc,4BAAEwD,IACvD,MAAQgmD,EAAuDzpD,EAAvDypD,cAAepuE,EAAwC2kB,EAAxC3kB,KAAM8C,EAAkC6hB,EAAlC7hB,YAAaG,EAAqB0hB,EAArB1hB,iBAEpCorE,EAAiB12E,IACrBitB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBplC,YAAavxC,EAAEE,OAAOuC,SACrB,EA6BL,OAlBA0D,EAAAA,EAAAA,YAAU,KACHsqB,IACLxD,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBxrE,YAAaslB,EAA4BtlB,YACzCG,iBAAkBmlB,EAA4BplB,uBAG3ColB,EAA4BmmD,0BAE/BF,EAAc,CAAEx2E,OAAQ,CAAEuC,MAAOguB,EAA4Bz5B,YAC7Di2B,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBtuE,KAAMooB,EAA4B7kB,WAEtC,GACC,KAGDzM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmpC,EAAAA,GAAU,CACTC,cAAe7yB,QAAQgd,GAA6BmmD,yBACpDt2E,MACEpD,EAAAA,EAAAA,KAAAkC,EAAAA,SAAA,CAAA/B,SAAE,iKAKJtM,KAAK,QACLkT,OAAO,WACPyS,QAAQ,OAEVvX,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,kBACjBH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR57B,YAAY,qBACZpQ,SAAU22E,EACVj0E,MAAOuqB,GAAaukB,aAAe,GACnC,cAAY,6CAGhBpyC,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,sBACjBH,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnB4mE,gBAAc,EACd1mE,YAAY,mBACZ1N,MAAOg0E,EACPnyE,QAASwyE,EAAAA,GACT/2E,SAAW+4C,GACT7rB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBF,cAAe39B,EACf2xB,cAAcsM,EAAAA,EAAAA,IAAmBj+B,OAGrC,cAAY,2CAGhB35C,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,qBACjBH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR57B,YAAY,4BACZpQ,SAtEsBC,IAC5BitB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBpM,WAAYvqE,EAAEE,OAAOuC,SACpB,EAmEGA,MAAOuqB,GAAau9C,YAAc,GAClC,cAAY,0CACZrxD,OAAQ,CACN,CACE2xC,SACEp3C,QAAQuZ,GAAau9C,YAAY32E,WAAYojF,EAAAA,EAAAA,IAAWhqD,GAAau9C,YACvEnxD,aAAc,mCAKtBja,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,6BACjBH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR57B,YAAY,uBACZpQ,SAAWC,GACTitB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBtuE,KAAMrI,EAAEE,OAAOuC,UAGnBA,MAAO4F,EACP,cAAY,qCAGhBlJ,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,uDACjBH,EAAAA,EAAAA,KAACyP,EAAAA,EAAgB,CACfC,YAAY,aACZC,WAAW,YACXpK,MAAO0I,GAAe,GACtBpL,SAAW2iC,GAAczV,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAE7hB,YAAau3B,WAG3EvjC,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,6BACjBH,EAAAA,EAAAA,KAACyP,EAAAA,EAAgB,CACfC,YAAY,oBACZC,WAAW,YACXpK,MAAO6I,GAAoB,GAC3BvL,SAAW2iC,GAAczV,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAE1hB,iBAAkBo3B,YAKtF,C,6pECjIA,MAKMu0C,EAAsBtpE,OAAOC,OAAOC,EAAAA,GAAa9a,KAAKuN,IAAI,CAC9DV,MAAOU,EACPmC,MAAOnC,MA8HT,IA3HA,UAAwB,YAAE0sB,EAAW,eAAEC,EAAc,MAAEhT,EAAK,mBAAEi9D,EAAqB,KACjF,MAAQ7uE,EAA2B2kB,EAA3B3kB,KAAMiD,EAAqB0hB,EAArB1hB,iBAEP6rE,EAAqC14E,GAAnB24E,EAAAA,EAAAA,MAAmB,GAAvB,GAiCrB,OA/BAjxE,EAAAA,EAAAA,YAAU,KAGR,WACE,MAAMkxE,OAnBoBtrE,WAC9B,MAAMuQ,QAAqB7L,EAAAA,EAAIC,IAAI,kCAAmC,CAAE0S,OAAQ,CAAEnJ,WAClF,OAAOqC,EAAapQ,MAAMorE,qBAAuB,EAAE,EAiBdC,CAAwBt9D,GACzD,GAAIo9D,EAAmBzjF,OAAQ,CAC7B,MAAM4jF,EAAmBH,EAAmB,GAC5CpqD,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACdzyB,QAASi9E,IAEb,CACD,EATD,EASI,GACH,KAmBDr4E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,sBAChB65E,EAAmBtjF,OAAS,GAC3BsJ,EAAAA,EAAAA,KAACmqB,EAAAA,GAAO,CAACt2B,KAAK,OAAO0R,MAAOy0E,EAAoBnkB,UAAW,EAAG0kB,OAAK,EAACC,UAAQ,KAE5Ex6E,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnB4mE,gBAAc,EACd1mE,YAAY,uCACZwnE,aAAW,EACXrzE,QAAS6yE,EACTp3E,SA5BY22E,CAAC12E,EAAG0iC,KACE,kBAAtBA,GAAW5xC,QAAoD,kBAAtB4xC,GAAW5xC,QACtDm8B,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACdzyB,QAASyF,EAAEyC,QAEf,EAuBQA,OAAOqL,EAAAA,EAAAA,IAAmBkf,EAAYzyB,SACtC,cAAY,+CAIjByyB,EAAYzyB,UACV48E,EAAepkF,KAAI,EAAG0P,WAAYA,IAAO2G,SAAS4jB,EAAYzyB,WAC7D4E,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,0BACjBH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR57B,YAAY,iCACZpQ,SA/BkBC,IAC5BitB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBpM,WAAYvqE,EAAEE,OAAOuC,SACpB,EA4BOA,MAAOuqB,GAAau9C,YAAc,GAClC,cAAY,wCACZrxD,OAAQ,CACN,CACE2xC,SACEp3C,QAAQuZ,GAAau9C,YAAY32E,WAChCojF,EAAAA,EAAAA,IAAWhqD,GAAau9C,YAC3BnxD,aAAc,mCAM1Bja,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,sDACjBH,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnBE,YAAY,mBACZ7L,QAAS2yE,EACTl3E,SAAWC,GACTitB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBtuE,MAAM0uE,EAAAA,EAAAA,IAAmB/2E,OAG7ByC,OAAOqL,EAAAA,EAAAA,IAAmBzF,GAC1B,cAAY,gCAGhBlJ,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,6BACjBH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACRtpC,MAAOuqB,EAAYphB,OAAS,GAC5BuE,YAAY,uBACZpQ,SAAWC,IACTitB,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACdphB,MAAO5L,EAAEE,OAAOuC,QAChB,EAEJyW,OAAQ,CACN,CACE2xC,SAAU79B,EAAYphB,OAAOhY,OAASgkF,EAAAA,GACtCx+D,aAAc,+BAA+Bw+D,EAAAA,kBAGjDC,iBAAe,EACf,cAAY,2CAGhB14E,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,6BACjBH,EAAAA,EAAAA,KAACyP,EAAAA,EAAgB,CACfC,YAAY,oBACZC,WAAW,UACXpK,MAAO6I,GAAoB,GAC3BvL,SAAW2iC,GAAczV,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAE1hB,iBAAkBo3B,YAKtF,C,woCCNA,IAhIA,UAAkC,YAAE1V,EAAW,eAAEC,EAAc,uBAAE6qD,EAAyB,KACxF,MAAcC,GAAsB5pD,EAAAA,EAAAA,GAAS,CAC3CzD,SAAU,CAAC,kBACX0D,QAASA,KAAM4pD,EAAAA,EAAAA,MACfC,OAAS/rE,GAASA,EAAKnZ,IAAI+a,EAAAA,MAHrB5B,MAMR/F,EAAAA,EAAAA,YAAU,KACH4xE,IACD,gBAAiB/qD,GACrBC,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACd7hB,YAAa4sE,GAAmBhlF,IAAIgkF,EAAAA,OACpC,GACD,CAACgB,IAEJ,MAAQnoD,EAAiE5C,EAAjE4C,WAAYsoD,EAAqDlrD,EAArDkrD,qBAAsBzB,EAA+BzpD,EAA/BypD,cAAetrE,EAAgB6hB,EAAhB7hB,YAyCzD,OACEhM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,yBAChBy6E,EAAuBlkF,OAAS,GAC/BsJ,EAAAA,EAAAA,KAACmqB,EAAAA,GAAO,CAACt2B,KAAK,OAAO0R,MAAOq1E,EAAwB/kB,UAAW,EAAG0kB,OAAK,EAACC,UAAQ,KAEhFv4E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACi7E,EAAAA,GAAkB,CACjB11E,OAAOqL,EAAAA,EAAAA,IAAmB8hB,GAC1B7vB,SAxCyBgM,UACnC,IAAK+sC,EAAQ,OAEb,MAIQs/B,SAJmB3nE,EAAAA,EAAIC,IAAI,4BAA6B,CAC9D0S,OAAQ,CAAE1vB,MAAMqjF,EAAAA,EAAAA,IAAmBj+B,OAGA5sC,KAA7BksE,YAERnrD,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACd4C,YAAYmnD,EAAAA,EAAAA,IAAmBj+B,GAC/Bo/B,qBAAsBE,IACtB,EA4BQ,cAAY,qCAEdj5E,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,CAAC,UACL,KACRH,EAAAA,EAAAA,KAAA,KACEiE,KAAK,wFACLjB,OAAO,SAAQ7C,SAChB,yCAEI,IAAI,4CAMf66E,GAA0D,IAAlCJ,EAAuBlkF,SAC/CuL,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,0BACjBH,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnBE,YAAY,mBACZ1N,MAAOg0E,EACPnyE,QAASwyE,EAAAA,GACT/2E,SAAW+4C,GACT7rB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBF,cAAe39B,EACf2xB,cAAcsM,EAAAA,EAAAA,IAAmBj+B,OAGrC,cAAY,4CAIlB35C,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,wDACjB8B,EAAAA,EAAAA,MAACkoB,EAAAA,GAAmB,CAAAhqB,SAAA,EAClBH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAc,CAAAhqB,UACbH,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACPC,MAAM,kBACNE,UAAWqL,GAAavX,SAAWmkF,GAAmBnkF,OACtDmM,SAjEkBmb,IACxBA,EAAMhb,OAAOC,QACf8sB,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACd7hB,YAAa4sE,GAAmBhlF,KAAK+lD,GAAWA,GAAQr2C,WAG1DwqB,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACd7hB,YAAa,KAEjB,EAuDUtL,KAAK,SAGRk4E,GAAmBhlF,KAAK+lD,IACvB57C,EAAAA,EAAAA,KAACmqB,EAAAA,GAAc,CAAAhqB,UACbH,EAAAA,EAAAA,KAACyC,EAAAA,GAAQ,CACPC,MAAOk5C,GAAQl5C,MACfE,UAAWqL,GAAa/B,SAAS0vC,GAAQr2C,OACzC1C,SAAUA,KAAMs4E,OAnGH51E,EAmGqBq2C,GAAQr2C,WAlGtDwqB,EAAch8B,EAAAA,EAAC,CAAC,EACX+7B,GAAW,IACd7hB,YAAaA,EAAY/B,SAAS3G,GAC9B0I,EAAY1X,QAAQmC,GAAMA,IAAM6M,IAChC,IAAI0I,EAAa1I,MALEA,KAmGoC,EACjD5C,KAAK,QALYi5C,GAAQr2C,iBAazC,C,6pCC9HO,MAAM61E,EAAyBC,EAAAA,GAAgBxlF,IAAI+a,EAAAA,IA8J1D,IA5JA,UAAsC,YACpCkf,EAAW,eACXC,EAAc,uBACd6qD,EAAyB,GAAE,4BAC3BrnD,IAOA,MAAQb,EACN5C,EADM4C,WAAYsoD,EAClBlrD,EADkBkrD,qBAAsB7vE,EACxC2kB,EADwC3kB,KAAM8C,EAC9C6hB,EAD8C7hB,YAAaG,EAC3D0hB,EAD2D1hB,iBAAkBmrE,EAC7EzpD,EAD6EypD,cAGzE+B,EAA+BzsE,UACnC,IAAK+sC,EAAQ,OAEb,MAGQs/B,SAHmB3nE,EAAAA,EAAIC,IAAI,4BAA6B,CAC9D0S,OAAQ,CAAE1vB,MAAMqjF,EAAAA,EAAAA,IAAmBj+B,OAEA5sC,KAA7BksE,YAERnrD,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjB/mD,YAAYmnD,EAAAA,EAAAA,IAAmBj+B,GAC/Bo/B,qBAAsBE,KACrB,GAILjyE,EAAAA,EAAAA,YAAU,KACHsqB,IACLxD,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBxrE,YAAaslB,EAA4BtlB,YACzCG,iBAAkBmlB,EAA4BplB,uBAG5ColB,EAA4BmmD,0BAE9B4B,GAA6B1qE,EAAAA,EAAAA,IAAmB2iB,EAA4Bz5B,WAC5Ei2B,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBtuE,KAAMooB,EAA4B7kB,WAEtC,GACC,IAEH,MAAM6sE,EAAmChlE,QACvCgd,IAAgCA,EAA4BmmD,yBAG9D,OACEz3E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACmpC,EAAAA,GAAU,CACTC,cAAemyC,EACfn4E,MACEnB,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CAAK,kGAEK,KACRH,EAAAA,EAAAA,KAAA,KACEiE,KAAK,wFACLjB,OAAO,SAAQ7C,SAChB,yCAEI,IAAI,8CAIbtM,KAAK,QACLkT,OAAO,WACPyS,QAAQ,OAEVvX,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,yBAChBy6E,EAAuBlkF,OAAS,GAC/BsJ,EAAAA,EAAAA,KAACmqB,EAAAA,GAAO,CAACt2B,KAAK,OAAO0R,MAAOq1E,EAAwB/kB,UAAW,EAAG0kB,OAAK,EAACC,UAAQ,KAEhFv4E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACi7E,EAAAA,GAAkB,CACjB11E,OAAOqL,EAAAA,EAAAA,IAAmB8hB,GAC1B7vB,SAAUy4E,EACV,cAAY,yCAEZC,IACAt5E,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,CAAC,UACL,KACRH,EAAAA,EAAAA,KAAA,KACEiE,KAAK,wFACLjB,OAAO,SAAQ7C,SAChB,yCAEI,IAAI,4CAOjB66E,GAA0D,IAAlCJ,EAAuBlkF,SAC/CuL,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,0BACjBH,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnB4mE,gBAAc,EACd1mE,YAAY,mBACZ1N,MAAOg0E,EACPnyE,QAASwyE,EAAAA,GACT/2E,SAAW+4C,GACT7rB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBF,cAAe39B,EACf2xB,cAAcsM,EAAAA,EAAAA,IAAmBj+B,OAGrC,cAAY,gDAIlB35C,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,sDACjBH,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnBE,YAAY,mBACZ7L,QAASg0E,EACTv4E,SAAWC,GACTitB,GAAgB0pD,GAAc1lF,EAAAA,EAAA,GACzB0lF,GAAc,IACjBtuE,MAAM0uE,EAAAA,EAAAA,IAAmB/2E,OAG7ByC,OAAOqL,EAAAA,EAAAA,IAAmBzF,GAC1B,cAAY,gCAGhBlJ,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,uDACjBH,EAAAA,EAAAA,KAACyP,EAAAA,EAAgB,CACfC,YAAY,aACZC,WAAW,YACXpK,MAAO0I,GAAe,GACtBpL,SAAW2iC,GAAczV,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAE7hB,YAAau3B,WAG3EvjC,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,SAAC,6BACjBH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAkB,CAAAhqB,SAAC,oCACpBH,EAAAA,EAAAA,KAACyP,EAAAA,EAAgB,CACfC,YAAY,oBACZC,WAAW,YACXpK,MAAO6I,GAAoB,GAC3BvL,SAAW2iC,GAAczV,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAE1hB,iBAAkBo3B,YAKtF,C,iuCCxJO,MAAMk1C,EAA8B,GAE9BxN,EAAyC,yBAChDsO,EAAoC,CACxC,gCACA,sDACA,kDACA,uDACA,wDACA,6CACAtO,GACAr3E,IAAI+a,EAAAA,IA8JN,KA5JcyiB,EACZtV,WACAuU,gBACAnG,SACA2D,cACAC,iBACA7pB,OACAqI,eACAglB,kCAEA,MACEl2B,EAYEyyB,EAZFzyB,QACA8N,EAWE2kB,EAXF3kB,KACAuD,EAUEohB,EAVFphB,MACA2lC,EASEvkB,EATFukB,YACAg5B,EAQEv9C,EARFu9C,WACAE,EAOEz9C,EAPFy9C,aACAt/D,EAME6hB,EANF7hB,YACAG,EAKE0hB,EALF1hB,iBACAskB,EAIE5C,EAJF4C,WAEAsoD,GAEElrD,EAHF69C,oBAGE79C,EAFFkrD,sBACA/N,EACEn9C,EADFm9C,qBAGF,IAAI98D,EAAW5B,EACE,oBAAbwP,IACF5N,MAAe9S,GAAWqR,GAASA,EAAMhY,QAAUgkF,IACpC,sBAAb38D,IACF5N,MACEkkC,IACAylC,EAAAA,EAAAA,IAAWzM,IACXE,GACApiE,GACA8C,GAAavX,QACb0X,GAAkB1X,SAEL,2BAAbqnB,IACF5N,MAAeuiB,GAAczkB,GAAavX,SAAWskF,GAAwBzN,KAC9D,uBAAbxvD,IACF5N,MACEuiB,GACAvnB,GACA8C,GAAavX,QACb0X,GAAkB1X,SACjBskF,GAAwBzN,KAS7B,IAAIkO,EAAiB,GACjBC,EAAc,GAClB,GAAInoD,EACFkoD,EAAiB,+BACjBC,EAAc,qFAGd,OADAD,EAAiB,4BACT19D,GACN,IAAK,qBACL,IAAK,oBACH29D,EACE,0FACF,MACF,IAAK,kBACHA,EAAc,2DACd,MACF,IAAK,yBACHA,EAAc,4EAKpB,OACE17E,EAAAA,EAAAA,KAACC,EAAS,CAAC07E,QAASpoD,EAA4BpzB,UAC9C8B,EAAAA,EAAAA,MAACkoB,EAAAA,GAAe,CAACtsB,MAAM,QAAOsC,SAAA,EAC5BH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAY,CAACC,WAAYqxD,EAAgBpxD,QAASqxD,IACrC,oBAAb39D,IACC/d,EAAAA,EAAAA,KAAC47E,EAAAA,EAAmB,CAClB9rD,YAAaA,EACbC,eAAgBA,EAChBhT,MAAO7W,EAAK6W,QAGF,sBAAbgB,IACC/d,EAAAA,EAAAA,KAAC67E,EAAAA,GAAqB,CACpB/rD,YAAaA,EACbC,eAAgBA,EAChBwD,4BAA6BA,IAGnB,2BAAbxV,IACC/d,EAAAA,EAAAA,KAAC87E,EAAAA,EAA6B,CAC5BhsD,YAAaA,EACbC,eAAgBA,IAGN,uBAAbhS,IACC/d,EAAAA,EAAAA,KAAC+7E,EAAAA,EAAiC,CAChCjsD,YAAaA,EACbC,eAAgBA,EAChBwD,4BAA6BA,KAGjCtxB,EAAAA,EAAAA,MAACkoB,EAAAA,GAAa,CAAAhqB,SAAA,EACZH,EAAAA,EAAAA,KAACmqB,EAAAA,GAAe,CAAAhqB,UACbuM,EAAAA,EAAAA,GAAE,iEAEL1M,EAAAA,EAAAA,KAACmqB,EAAAA,GAAkB,CAAAhqB,SAAC,cACpBH,EAAAA,EAAAA,KAAC+S,EAAAA,GAAoB,CACnBE,aAAavG,EAAAA,EAAAA,GAAE,oEACfsvE,iBAAkBz4E,EAAAA,GAAOkrB,YACzBrnB,QAASo0E,EACT34E,SAAW+4C,GACT7rB,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAEm9C,sBAAsB4M,EAAAA,EAAAA,IAAmBj+B,MAE5Er2C,OAAOqL,EAAAA,EAAAA,IAAmBq8D,KAE3BA,IAAyBC,IACxBjrE,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR57B,YAAY,kBACZ+oE,iBAAkBz4E,EAAAA,GAAOkrB,YACzBlpB,MAAOuqB,EAAYq9C,0BACnBtqE,SAAWC,IACTitB,EAAch8B,EAAAA,EAAC,CAAC,EAAI+7B,GAAW,IAAEq9C,0BAA2BrqE,EAAEE,OAAOuC,QAAQ,EAE/Eo1E,iBAAe,WAKvB36E,EAAAA,EAAAA,KAACmqB,EAAAA,GAAU,KACXloB,EAAAA,EAAAA,MAACkoB,EAAAA,GAAiB,CAAAhqB,SAAA,EAChBH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS0T,QAAQ,QAAQ1J,MAAM,QAAQ4F,QAASA,IAAM0oB,EAAO,SAAShsB,SAAC,UAGpFH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7W,KAAK,SACLsc,SAAUA,EACV1M,QAhGS2lB,IAC0BkJ,EAA1B,oBAAbvU,EAAqD,UACxC,2BAAbA,EAA4D,QAC3C,aA8Fb,cAAY,uCACZlgB,MAAM,QAAOsC,SACd,2BAKK,EAKhB,MAAMF,EAAYmE,EAAAA,GAAOC,GAAG;;;;IAIxB,EAAGs3E,aAAcA,GAAU;;IAE3B1uE,EAAAA,GAAkBD;;;;wjCCrLtB,MAAQA,EAAuBC,EAAAA,GAAvBD,mBAEKmmB,EAAgB/uB,EAAAA,GAAOC,GAAG;;WAE5B,EAAGxG,WAAYA,GAAS;IAC/ByG,EAAAA,GAAM8I;;IAEN,EAAGyE,OAAM8pE,YACA,IAAT9pE,GAAc8pE,EACV,kGAKA;;IAEJ3uE;;;;EAUG,SAASghB,GAAW,QAAE3D,EAAO,WAAED,IACpC,OACEnoB,EAAAA,EAAAA,MAACg6E,EAAmB,CAAA97E,SAAA,EAClBH,EAAAA,EAAAA,KAACk8E,EAAc,CAAA/7E,SAAEiqB,KACjBpqB,EAAAA,EAAAA,KAACm8E,EAAW,CAAAh8E,SAAEkqB,MAGpB,CACA,MAAM4xD,EAAsB73E,EAAAA,GAAOC,GAAG;;;EAIhC63E,EAAiB93E,EAAAA,GAAOwmB,EAAE;;WAErBrnB,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM+L;EAEJ8rE,EAAc/3E,EAAAA,GAAO4qB,EAAE;;WAElBzrB,EAAAA,GAAOyE;IACd1D,EAAAA,GAAM2qB;EAyCGq+B,GAtCYlpD,EAAAA,GAAOC,GAAG;;;;IAI/B,EAAGs3E,YAAaA,GAAU;WACnBp4E,EAAAA,GAAOyE;IACd,EAAGo0E,WAAaA,EAAQ93E,EAAAA,GAAMsiC,mBAAqBtiC,EAAAA,GAAMyI;;EAInC3I,EAAAA,GAAOC,GAAG;;WAEzBd,EAAAA,GAAOC;IACdc,EAAAA,GAAMgM;;;;;;;EASmBlM,EAAAA,GAAOC,GAAG;;;;;GAOfD,EAAAA,EAAAA,IAAO0C,EAAAA,EAAK;;WAEzBvD,EAAAA,GAAOC;;;;;EAOSY,EAAAA,GAAOC,GAAG;;;;;;;GAQxBkpD,EAAgBnpD,EAAAA,GAAOC,GAAG;IACnCC,EAAAA,GAAM+L;;;WAGC9M,EAAAA,GAAOyE;EAELq0E,GAAmBj4E,EAAAA,EAAAA,IAAOmpD,EAAc;IACjDjpD,EAAAA,GAAM4W;;WAEC3X,EAAAA,GAAOyD;EAGLs1E,EAAWl4E,EAAAA,GAAOC,GAAG;;6BAELd,EAAAA,GAAOsE;;EAqBvB0J,IAjBkBnN,EAAAA,EAAAA,IAAOm4E,EAAAA,EAAY;;;;IAI9Cj4E,EAAAA,GAAM8I;;;;;;IAMNJ;;;;kBAIczJ,EAAAA,GAAOsE;EAGJzD,EAAAA,GAAOoN,KAAK;WACrB1b,GAAOA,EAAE0mF,KAAQ,MAAU;;;;IAInCl4E,EAAAA,GAAM8I;WACC7J,EAAAA,GAAOyE;sBACK+C,GAAWA,EAAMsE,MAAQ9L,EAAAA,GAAOS,IAAMT,EAAAA,GAAOkrB;;;IAGhE,EAAG8rD,WACHA,GACA,kBACWh3E,EAAAA,GAAOyD,8DAEIzD,EAAAA,GAAOsE;;;;aAMpBtE,EAAAA,GAAOyD;;GAuCPy1E,IAlCkBr4E,EAAAA,EAAAA,IAAOypD,EAAAA,EAAe;;;;;oBAKjCtqD,EAAAA,GAAO6U;4BACC7U,EAAAA,GAAOC;;eAEpBD,EAAAA,GAAOyE;;qBAEDzE,EAAAA,GAAOyE;;;0BAGFzE,EAAAA,GAAOC;;;;;;iCAMAD,EAAAA,GAAOC;;;iCAGPD,EAAAA,GAAOC;;;;sBAIlBD,EAAAA,GAAOC;;;sBAGNuH,GAAUA,EAAMsE,OAAS9L,EAAAA,GAAOS;;;EAK5BI,EAAAA,GAAOC,GAAG;IACjCC,EAAAA,GAAM4W;;;;WAIC3X,EAAAA,GAAOyD;GAyELyK,GAtEkBrN,EAAAA,GAAOuP,IAAI;IACtCrP,EAAAA,GAAM8I;;;WAGC7J,EAAAA,GAAOC;;;;;EAOKY,EAAAA,GAAOC,GAAG;YACpB0G,GAAWA,EAAM/M,OAAS,GAAG+M,EAAM/M,WAAa;;GAIvCoG,EAAAA,EAAAA,IAAOs4E,EAAAA,EAAQ;;EAIf7kE,EAAAA,GAAWC,OAAO,CACtC6kE,mBAAoB,CAClBzkE,OAAQ,aAAa3U,EAAAA,GAAOC,YAC5BF,MAAOC,EAAAA,GAAOC,UACd6V,UAAW,OACXG,QAAS,UACTzB,QAAS,OACTO,eAAgB,SAChBpY,UAAW,SACX6G,OAAQ,UACRgH,gBAAiB,GAAGxK,EAAAA,GAAOY,oBAE7Bo3B,W,+VAAUxnC,CAAA,CACRuP,MAAOC,EAAAA,GAAOY,MACdkU,YAAa,QACVE,EAAAA,GAASrQ,UAEdszB,eAAgB,CACd53B,WAAYL,EAAAA,GAAOC,WAErBi4B,YAAa,CACXjiB,QAAS,OACTP,cAAe,OACfP,aAAc,OAEhBgjB,gBAAiB,CACfjiB,OAAQ,KAEVkiB,YAAa,CACXh4B,SAAU,cAIoBS,EAAAA,EAAAA,IAAOkhC,EAAAA,EAAS;IAC9Ct4B;;;EAKwB5I,EAAAA,GAAOC,GAAG;;;EAKbD,EAAAA,GAAOmM,CAAC;;;;EAMFnM,EAAAA,GAAOC,GAAG;;;;;;GAqC5BqxC,GA7BkBtxC,EAAAA,GAAOC,GAAG;IACrCC,EAAAA,GAAMuG;IACN,EAAGmO,kBAAmBA,GAAgB,kBAAkBA;EAG1B5U,EAAAA,GAAOC,GAAG;;;;;;;;;;;;;EAedD,EAAAA,GAAOC,GAAG;IACpCC,EAAAA,GAAMixC;EAGyBnxC,EAAAA,GAAOC,GAAG;WAClCd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAMuG;EAGuBzG,EAAAA,GAAOC,GAAG;;;;;GAO9Bu4E,EAAex4E,EAAAA,GAAOC,GAAG;;imCC5QtC,IAtCmBw4E,EAAGjuE,WAAUS,QAAOytE,kBACrC,MAAoCx7E,EAAAC,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA7B+qD,EAAIjrD,EAAA,GAAEkrD,EAAOlrD,EAAA,GAC6BK,EAAAJ,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAA1CqrB,EAASlrB,EAAA,GAAEmrB,EAAYnrB,EAAA,GAE9B,OACEM,EAAAA,EAAAA,MAAChC,EAAS,CACR2O,SAAUC,UACR/L,EAAEgM,iBACFge,GAAa,SACPle,EAAS29C,GACfz/B,GAAa,EAAM,EACnB3sB,SAAA,CAED28E,IACC76E,EAAAA,EAAAA,MAACgnC,EAAO,CAAA9oC,SAAA,CACL28E,EAAYnuE,aAAa,4BAA0BmuE,EAAYC,cAAc,QAGlF/8E,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACRtpC,MAAOgnD,EACP1pD,SAAWC,GAAM0pD,EAAQ1pD,EAAEE,OAAOuC,OAClC7C,OACET,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAOmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOyE,MAAOjB,OAAO,gBAAgB,6CAI5EuuC,UAAWhxC,EAAAA,GAAMgN,WACjB2B,YAAY,iBACZ+I,OAAQ,CAAC,CAAE2xC,SAAUp3C,QAAQlH,GAAQ6M,aAAc7M,OAErDrP,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAASsc,SAAU0c,EAAU1sB,SAAC,aAGjC,EAMhB,MAAMF,EAAYmE,EAAAA,GAAOyM,IAAI;;;;;;;sBAOPtN,EAAAA,GAAO6U;;gBAEbjQ,EAAAA,GAAO85C;EAGjBhZ,EAAU7kC,EAAAA,GAAO4qB,EAAE;;IAErB1qB,EAAAA,GAAMuG;iGCgBV,IA1EoBmyE,EAAGC,SAAWC,eAAcC,eAC9C,IACI95E,EADAX,EAAQ,GAGZ,OAAQw6E,GACN,KAAKE,EAAAA,GAAeC,cAClB36E,EAAQ,gBACRW,EAAW,SACX,MACF,KAAK+5E,EAAAA,GAAeE,aAClB56E,EAAQ,eACRW,EAAW,UACX,MACF,KAAK+5E,EAAAA,GAAeG,SAClB76E,EAAQ,WACRW,EAAW,OACX,MACF,KAAK+5E,EAAAA,GAAenX,mBAClBvjE,EAAQ,qBACRW,EAAW,UACX,MACF,KAAK+5E,EAAAA,GAAehX,KAClB1jE,EAAQ,4BACRW,EAAW,UACX,MACF,KAAK+5E,EAAAA,GAAeI,WAClB96E,EAAQ,aACRW,EAAW,UACX,MACF,KAAK+5E,EAAAA,GAAeK,QAClB/6E,EAAQ,eACRW,EAAW,UACX,MACF,KAAK+5E,EAAAA,GAAeM,UAClBh7E,EAAQ,YACRW,EAAW,YACX,MACF,KAAK+5E,EAAAA,GAAeO,WAClBj7E,EAAQ,aACRW,EAAW,aACX,MACF,KAAK+5E,EAAAA,GAAeQ,qBAClBl7E,EAAQ,yBACRW,EAAW,aACX,MACF,KAAK+5E,EAAAA,GAAeS,uBAClBn7E,EAAQ,yBACRW,EAAW,YACX,MACF,KAAK+5E,EAAAA,GAAeU,KAClBp7E,EAAQ,OACRW,EAAW,OACX,MACF,KAAK+5E,EAAAA,GAAeW,wBAClBr7E,EAAQ,0BACRW,EAAW,eACX,MACF,KAAK+5E,EAAAA,GAAeY,mBAClBt7E,EAAQ,qBACRW,EAAW,UAIf,OACEpB,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAACwK,EAAK,CAAAtM,SAAA,EACJH,EAAAA,EAAAA,KAAC8G,EAAAA,EAAI,CAACtQ,KAAM6M,EAAU0D,OAAO,cAC5BrE,KAEFy6E,IACS,EAMhB,MAAMl9E,EAAYmE,EAAAA,GAAOC,GAAG;sBACNd,EAAAA,GAAO6M;sBACP7M,EAAAA,GAAOY;WAClBZ,EAAAA,GAAOyE;;;IAGd1D,EAAAA,GAAM8I;;;EAIJX,EAAQrI,EAAAA,GAAOC,GAAG;;;IAGpBC,EAAAA,GAAM+L;;WAEC9M,EAAAA,GAAOyE;mKCtFH,SAASi2E,GAAS,kBAC/BpY,EAAiB,gBACjBqY,EAAe,oBACfC,EAAmB,aACnBhhC,GAAe,EAAI,cACnBC,GAAgB,IAEhB,GAAIyoB,EAAkBnvE,OAASwnF,EAAgBxnF,OAASynF,EAAoBznF,SAAW,EACrF,OAAO,KAGT,MAAM0nF,EAAyBvY,EAAkBtvE,QAAQ8nF,GACvD5tE,OAAOC,OAAOs1D,EAAAA,IAAqB95D,SAASmyE,KAG9C,OACEp8E,EAAAA,EAAAA,MAACq8E,EAAiB,CAAClhC,cAAeA,EAAcj9C,SAAA,EAC9CH,EAAAA,EAAAA,KAACipC,EAAO,CAAClzC,GAAG,QAAOoK,SAAC,0BACnBmzB,OAAO8qD,EAAuB1nF,QAAU,IACvCuL,EAAAA,EAAAA,MAACs8E,EAAc,CAAAp+E,SAAA,EACbH,EAAAA,EAAAA,KAACw+E,EAAU,CAAAr+E,SAAC,kCACZH,EAAAA,EAAAA,KAACy+E,EAAiB,CAAC,cAAY,yBAAwBt+E,SACpDi+E,EAAuBvoF,KAAKwoF,IAC3Br+E,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CAEFzwC,QAASmpE,EAAAA,GAAyBL,GAClC17E,KAAK,MAFA07E,WAQbH,GAAiBxnF,OAAS,GAAKynF,GAAqBznF,OAAS,KAC7DuL,EAAAA,EAAAA,MAACs8E,EAAc,CAAAp+E,SAAA,EACbH,EAAAA,EAAAA,KAACw+E,EAAU,CAAAr+E,SAAC,eACZ8B,EAAAA,EAAAA,MAAC08E,EAAiB,CAACxhC,aAAcA,EAAc,cAAY,eAAch9C,SAAA,CACtE+9E,EAAgBroF,KAAKonF,IACpBj9E,EAAAA,EAAAA,KAACg9E,EAAAA,EAAW,CAAoDC,QAASA,GAAvD,GAAGA,EAAQC,gBAAgBD,EAAQE,aAEtDgB,EAAoBtoF,KAAKonF,IACxBj9E,EAAAA,EAAAA,KAACg9E,EAAAA,EAAW,CAAoDC,QAASA,GAAvD,GAAGA,EAAQC,gBAAgBD,EAAQE,qBAOnE,CAEA,MAAMmB,EAAoBl6E,EAAAA,GAAOC,GAAG;;IAEhC,EAAG+4C,mBAAoBA,GAAiB;;IAExCnwC,EAAAA,GAAkB8rE;;;EAIhBwF,EAAiBn6E,EAAAA,GAAOC,GAAG;;;EAI3Bo6E,EAAoBr6E,EAAAA,GAAOC,GAAG;;;;;EAMvBs6E,EAAoBv6E,EAAAA,GAAOC,GAAG;;;;;IAKvC,EAAG84C,kBACHA,GACA,WACIlwC,EAAAA,GAAkB8rE;EAKpB9vC,EAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMyI;;;;;EAMJyxE,EAAap6E,EAAAA,GAAOC,GAAG;;;IAGzBC,EAAAA,GAAM+L;;yRC9FK,SAASuuE,GAAkB,WAAElyC,EAAU,QAAEjpC,IACtD,MAAQiL,EAA4Cg+B,EAA5Ch+B,MAAO8+B,EAAqCd,EAArCc,cAAeC,EAAsBf,EAAtBe,kBAExBoxC,GAAW5oB,EAAAA,EAAAA,IAAYzoB,GACvB35C,GAAOmiE,EAAAA,EAAAA,IAAsBvoB,GAEnC,OACExrC,EAAAA,EAAAA,MAAChC,EAAS,CAACwD,QAASA,EAAQtD,SAAA,EAC1BH,EAAAA,EAAAA,KAAA,OAAAG,UACEH,EAAAA,EAAAA,KAAC8G,EAAAA,EAAI,CAACtQ,KAAK,aAAamM,KAAK,KAAKW,MAAOC,EAAAA,GAAOyD,YAAaD,OAAO,SAEtE9E,EAAAA,EAAAA,MAACmpB,EAAI,CAAAjrB,SAAA,EACHH,EAAAA,EAAAA,KAAC0G,EAAI,CAAAvG,SAAEuO,KACPzM,EAAAA,EAAAA,MAAC68E,EAAI,CAAA3+E,SAAA,CACFtM,EAAK,WAASgrF,UAKzB,CAEA,MAAMn4E,EAAOtC,EAAAA,GAAOC,GAAG;IACnBC,EAAAA,GAAM4D;IACNC,EAAAA,GAAOsgC;EAGLxoC,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;;;gBAQZd,EAAAA,GAAOwE;;;;kBAILxE,EAAAA,GAAO6U;MACnB1R;;;;EAMA0kB,EAAOhnB,EAAAA,GAAOC,GAAG;;;;EAMjBy6E,EAAO16E,EAAAA,GAAOC,GAAG;IACnBC,EAAAA,GAAM4W;IACN/S,EAAAA,GAAOC;WACA7E,EAAAA,GAAO8hD;kgCCtDH,SAAS05B,GAA4B,QAAE10D,EAAO,YAAEyf,EAAc,KAC3E,MAA4FxoC,EAAAC,GAAlBC,EAAAA,EAAAA,YAAkB,GAArF2vC,EAA6B7vC,EAAA,GAAE8vC,EAAgC9vC,EAAA,GAWtE,OAA2B,IAAvBwoC,EAAYpzC,OAAqB,MAGnCuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8xC,EAAAA,EAA6B,CAC5BhI,YAA+C,OAAlCqH,EAAyCrH,EAAc,GACpEiI,uBAAwBZ,EACxBa,0BAA2BZ,EAC3Ba,aAZeA,KACnBb,OAAiC9qC,EAAU,IAaxC+jB,GACDrqB,EAAAA,EAAAA,KAACwuC,EAAoB,CAAAruC,SAClB2pC,EAAYj0C,KAAK62C,IAChB1sC,EAAAA,EAAAA,KAAC4+E,EAAiB,CAEhBlyC,WAAYA,EACZjpC,QAASA,IAzBEkrC,KACnB,MAAMwB,EAAQrG,EAAYwH,WAAW5E,GAAeA,EAAW32C,KAAO44C,IACtEyC,EAAiCjB,EAAM,EAuBhB1G,CAAYiD,EAAW32C,KAFjC22C,EAAW32C,UAQ5B,CAEA,MAAMy4C,EAAuBpqC,EAAAA,GAAOC,GAAG;;;;opCCrBvC,MArB6B26E,KAC3B,MAAyD19E,EAAAC,GAArBC,EAAAA,EAAAA,UAAS,aAAY,GAAlDssD,EAAUxsD,EAAA,GAAE29E,EAAa39E,EAAA,GAUhC,OACEW,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,CAAC,0CAETH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS4P,QAXHoL,UACrB,MAAMlU,EAAMmD,OAAOhE,SAASmK,WACtB6uC,UAAUC,UAAUC,UAAUr4C,GAEpCskF,EAAc,WACd3xD,YAAW,IAAM2xD,EAAc,cAAc,IAAK,EAMDphF,MAAM,QAAOsC,SACzD2tD,MAEO,EAMhB,MAAM7tD,EAAYmE,EAAAA,GAAOC,GAAG;;;;;;sBAMNd,EAAAA,GAAOyE;IACzB1D,EAAAA,GAAMkU;;WAECjV,EAAAA,GAAOY;;ilCCtBlB,MAAM+6E,EAAa,CACjB,0CACA,uDACA,mEA0JF,MAvJ0BC,EAAGzrE,UAASrR,UAASD,SAAQksD,kBACrD,MAAMxsD,GAAWC,EAAAA,EAAAA,MACX3L,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAEvBkL,EAAAC,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAvC8a,EAAShb,EAAA,GAAEib,EAAYjb,EAAA,GACcK,EAAAJ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAArCgb,EAAQ7a,EAAA,GAAE8a,EAAW9a,EAAA,GACU2M,EAAA/M,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA/Bub,EAAKzO,EAAA,GAAE0O,EAAQ1O,EAAA,GAEgB0D,EAAAzQ,GAAZC,EAAAA,EAAAA,UAAS,IAAG,GAA/B6N,EAAK2C,EAAA,GAAEm0B,EAAQn0B,EAAA,GACiCE,EAAA3Q,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhD+M,EAAY2D,EAAA,GAAE1D,EAAe0D,EAAA,GAC2CE,EAAA7Q,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxE49E,EAAwBhtE,EAAA,GAAEitE,EAA2BjtE,EAAA,GAEtD4pB,EAAoB5lC,GAAa+U,OAASwB,EAAAA,EAASqK,iBACzD,IAAI3T,EAAqB,UACrBoL,EAAS,gBACT6wE,EAAY,sEACZC,EAAU,gBACVvjD,IACF34B,EAAW,QACXoL,EAAS,oBACT6wE,EACE,wGACFC,EAAU,SA+BZ,OAAIH,GAEAp/E,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CAACC,OAAQA,EAAQC,QAASA,EAASxE,MAAM,QAAOsC,UACzD8B,EAAAA,EAAAA,MAACO,EAAY,CAAArC,SAAA,EACX8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACxD,MAAOC,EAAAA,GAAO0lB,MAAOliB,OAAO,SAASvQ,KAAK,UAAUmM,KAAK,QAC/D3C,EAAAA,EAAAA,KAACoR,GAAM,CAAAjR,SAAC,mBAEV8B,EAAAA,EAAAA,MAACk8B,GAAS,CAAAh+B,SAAA,CAAC,+DACqD,KAC5D/J,EAAYL,IAAM,iDAEpBK,EAAYL,KACZkM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACw/E,GAAU,CAAAr/E,SACR++E,EAAWrpF,KAAI,CAACipB,EAAUimB,KAEvB9iC,EAAAA,EAAAA,MAACw9E,GAAW,CAAAt/E,SAAA,EACVH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,WAAW8M,MAAOC,EAAAA,GAAOC,aACpCxD,EAAAA,EAAAA,KAAC0/E,GAAU,CAAAv/E,SAAE2e,MAFG,YAAYimB,UAOpC/kC,EAAAA,EAAAA,KAAA,OAAAG,UACEH,EAAAA,EAAAA,KAAC0K,EAAAA,EAAM,CACL3D,OAAO,WACPtD,QAASA,KACP3B,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,IAAQ,EAC1CwD,SACH,8BAYbH,EAAAA,EAAAA,KAACmC,EAAAA,GAAU,CAACC,OAAQA,EAAQC,QAASA,EAASxE,MAAM,QAAOsC,UACzD8B,EAAAA,EAAAA,MAACO,EAAY,CAAArC,SAAA,EACXH,EAAAA,EAAAA,KAACkH,EAAa,CAAA/G,UACV67B,IAAqBh8B,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACC,OAAO,cAAcvQ,KAAM6M,EAAUV,KAAK,UAEzE3C,EAAAA,EAAAA,KAACoR,GAAM,CAAAjR,SAAEsO,KACTzO,EAAAA,EAAAA,KAACm+B,GAAS,CAAAh+B,SAAEm/E,KACZr9E,EAAAA,EAAAA,MAAC8c,GAAI,CAACnQ,SA7ESC,UACnB,IAGE,GAFA/L,GAAGgM,iBAECktB,EAGF,OAFAsyB,SACAjsD,IAMF,GAFAmM,GAAgB,IAEXpY,EAAYL,MAAQmoB,IAAAA,QAAkBnB,KAAUoB,EAAAA,EAAAA,IAAkBpB,IAErE,YADAopB,EAAS,mDAIX,MAAMnyC,EAAUoC,EAAYL,GAAK,CAAC,EAAI,CAAEumB,YAAWE,WAAUO,eACvDyrD,EAAAA,EAAAA,IAAgB90D,EAAQ3d,GAAI/B,GAElCqrF,GAA4B,EAC9B,CAAE,MAAOjwE,GACP+2B,EAAS/2B,EAAIwyB,QACf,CAAC,QACCpzB,GAAgB,EAClB,GAoDiCrO,SAAA,EACzB/J,EAAYL,KACZkM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACE8B,EAAAA,EAAAA,MAAC09E,GAAoB,CAAAx/E,SAAA,EACnBH,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR8rC,iBAAe,EACf93E,SAAWC,GAAMyZ,EAAazZ,EAAEE,OAAOuC,OACvC0N,YAAY,aACZ1N,MAAO+W,KAETtc,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR8rC,iBAAe,EACf93E,SAAWC,GAAM2Z,EAAY3Z,EAAEE,OAAOuC,OACtC0N,YAAY,YACZ1N,MAAOiX,QAGXxc,EAAAA,EAAAA,KAAC6uC,EAAAA,GAAS,CACR7yB,OAAQ,CACN,CACE2xC,SAAUt+C,EAAM3Y,OAAS,EACzBwlB,aAAc7M,IAGlBsrE,iBAAe,EACf93E,SAAWC,GAAMka,EAASla,EAAEE,OAAOuC,OACnC0N,YAAY,gBACZ1N,MAAOwX,QAIb/c,EAAAA,EAAAA,KAAC0K,EAAAA,EAAM,CACLyF,UACI/Z,EAAYL,KACU,IAArBumB,EAAU5lB,QAAoC,IAApB8lB,EAAS9lB,QAAiC,IAAjBqmB,EAAMrmB,SAC5D6X,EAEFlL,SAAUA,EACVxP,KAAK,SACLgK,MAAM,OAAMsC,SAEXo/E,WAII,EAMV,MAAM/8E,EAAe4B,EAAAA,GAAOC,GAAG;;;;;;;;;;;;EAchC6C,EAAgB9C,EAAAA,GAAOC,GAAG;;EAI1B+M,GAAShN,EAAAA,GAAOgrB,EAAE;;;IAGpB9qB,EAAAA,GAAMsiC;EAGJzI,GAAY/5B,EAAAA,GAAOw7E,EAAE;;;;;WAKhBr8E,EAAAA,GAAOyD;;IAEd1C,EAAAA,GAAMgM;EAGJyO,GAAO3a,EAAAA,GAAOyM,IAAI;;;;;;EAQlB8uE,GAAuBv7E,EAAAA,GAAOC,GAAG;;;;EAMjCm7E,GAAap7E,EAAAA,GAAOC,GAAG;;;;;;;EASvBo7E,GAAcr7E,EAAAA,GAAOC,GAAG;;;;;WAKnBd,EAAAA,GAAOyE;;IAEd1D,EAAAA,GAAM8I;EAGJsyE,GAAat7E,EAAAA,GAAOtO,CAAC;;;;;;yICvO3B,MAqCM+pF,GAAwBphF,IAC5B,OAAQA,EAAI8kC,eACV,IAAK,SACH,OACEthC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8/E,GAAgB,CAAC11E,IAAK21E,KAAkB,sBAG/C,IAAK,OACH,OACE99E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8/E,GAAgB,CAAC11E,IAAK41E,KAAQ,IAAEvhF,KAGvC,IAAK,UACH,OACEwD,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8/E,GAAgB,CAAC11E,IAAK61E,KAAW,IAAExhF,KAG5C,EAmBIyhF,IAAgBC,EAAAA,GAAAA,KAhBAC,EAAG38E,cACvBzD,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAASgK,MAAM,OAAO0J,QAAQ,YAAY9D,QAASA,EAASJ,SAAS,WAAUlD,SAAC,sBAKvEkgF,EAAGlgF,eACzBH,EAAAA,EAAAA,KAACsgF,GAAgB,CAAAngF,SACdA,EAAStK,KAAK0sB,IACbviB,EAAAA,EAAAA,KAACugF,GAAoB,CAAApgF,UAClBqgF,EAAAA,EAAAA,cAAaj+D,EAAM,GAAIs9D,GAAqBt9D,EAAK9jB,OADzB8jB,EAAK9jB,WAStC,OA9E4BgiF,EAAGx4B,OAAMv5C,QAAOxU,kBAC1C,IAAK+tD,EAAM,OAAO,KAElB,MAAMy4B,GAAe9vD,EAAAA,EAAAA,QAA8B,MAU7C+vD,EAAY9yE,KAAMo6C,GAAM24B,QAAQ,OAChCC,EAAUhzE,KAAM8yE,GAAWG,IAAI,EAAG,OAAOF,QAAQ,OAEvD,OACE5gF,EAAAA,EAAAA,KAACC,GAAS,CAACmzB,IAAKstD,EAAcr7C,OAZbd,KACbm8C,EAAa7vD,SACfvD,YAAW,MACRozD,EAAa7vD,SAAS1wB,SAAS,GAAGA,SAAS,IAAyBwsC,OAAO,GAC3E,IACL,EAOiDxsC,UAC/CH,EAAAA,EAAAA,KAACkgF,GAAa,CACZliE,MAAO,CACLtP,QACAxU,cACAy9D,SAAU,GACVopB,YAAalzE,KAAMgzE,GAAS/yE,OAAO,YACnCkzE,cAAenzE,KAAM8yE,GAAW7yE,OAAO,aAEzCmzE,MAAO,CAACC,GAAAA,GAAYC,OAAQD,GAAAA,GAAYE,QAASF,GAAAA,GAAYG,SAErD,EAoDhB,MAAMphF,GAAYmE,EAAAA,GAAOC,GAAG;;EAGtBi8E,GAAmBl8E,EAAAA,GAAOilC,EAAE;;sBAEZ9lC,EAAAA,GAAOY;;;;;;;;;;;;IAYzB8I,EAAAA,GAAkB8M;;;;;EAMhBwmE,GAAuBn8E,EAAAA,GAAOk9E,EAAE;;;;;;;kBAOpB/9E,EAAAA,GAAO6U;;;;aAIZ7U,EAAAA,GAAOyE;;;;;;;;;;;;;EAcd83E,GAAmB17E,EAAAA,GAAOwG,GAAG;;sgCC9GnC,MAAQmwC,GAA8C+K,EAAAA,GAA9C/K,OAAQgL,GAAsCD,EAAAA,GAAtCC,YAAa6sB,GAAyB9sB,EAAAA,GAAzB8sB,aAAcL,GAAWzsB,EAAAA,GAAXysB,OAkQ3C,OA1PwBgP,EAAG7tE,UAASyS,YAAW8zB,0BAC7C,MAA6D34C,EAAAC,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAtD44C,EAAe94C,EAAA,GAAE+4C,EAAkB/4C,EAAA,GACmCK,EAAAJ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAtEggF,EAAuB7/E,EAAA,GAAE8/E,EAA0B9/E,EAAA,GAEpDkmE,EAAMn0D,EAAQ+oC,YAEdrmD,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/D0L,GAAWC,EAAAA,EAAAA,MACXiD,GAAUC,EAAAA,EAAAA,MACT+mB,EAAiCzqB,IAAjBmvB,EAAAA,EAAAA,KAAiB,GAArB,IAEnBznB,EAAAA,EAAAA,YAAU,KAC0B,SAA9B+iB,EAAaxY,IAAI,UAAqB86C,GAAa,GACtD,IAEH,MAAMozB,EAAoB7yE,WACxByI,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBC,MAAO,CAC5BC,aAAc,2BAGhB,MAAMkqE,GAAYluE,EAAAA,GAAAA,IAAuBC,GAEnC+mC,EACJ,iBAAkB/mC,EAAQrW,SAAWqW,EAAQrW,QAAQsR,cAAczC,SAAS,QAE9E,GAAI9V,EAAYL,GACd,GAAI0kD,EAAQ,OACce,EAAAA,GAAAA,IAAqB9nC,EAAQ3d,IAGnDiP,EAAQrO,KAAKgrF,GAEbtnC,GAAmB,EAEvB,MACEr1C,EAAQrO,KAAKgrF,QAGXlnC,GACFvvC,EAAAA,GAAAA,OAEAA,EAAAA,GAAAA,IAAiBy2E,GAGnB7/E,GACE2e,EAAAA,EAAAA,IAAiB,CACf9jB,MAAM,EACNrB,eAAgB,eAGtB,EAGForD,GAAiDC,EAAAA,GAAAA,GAAiBjzC,EAAQ3d,IAAlE6wD,EAAmBF,EAAnBE,oBAAqBhC,EAAe8B,EAAf9B,gBAEvBwC,EAAeA,MACnB9vC,EAAAA,EAAAA,IAAM,4BAA6B,CACjCsqE,mBAAoBxrF,EAAY+U,OAASwB,EAAAA,EAASqK,mBAGpD4vC,GAAqB,EAGjB0H,EAAcA,MAClBh3C,EAAAA,EAAAA,IAAM,4BAEFlhB,EAAYL,GACdkkD,GAAoB,GAEpBn4C,GAAS2e,EAAAA,EAAAA,IAAiB,CAAE9jB,MAAM,EAAMrB,eAAgB,cAC1D,EAGIumF,EAAqBA,MACzBvqE,EAAAA,EAAAA,IAAM,gCACNmqE,GAA2B,EAAK,EAG5BK,GAAYj8B,EAAAA,EAAAA,IAAanyC,GAE/B,IAAI6M,EAAoBsnD,EAAI1iB,WAC1BljD,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC+hF,EAAAA,EAAY,CAACh7E,OAAO,cAAc,eAAYipE,EAAAA,GAAAA,IAAoBnI,EAAI1iB,SAAU,aAGjF28B,IAAclP,IAAgBkP,IAAcvP,GAC9ChyD,GACEte,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACC,OAAO,YAAYvQ,KAAK,UAAUmM,KAAK,OAAO,eAG/Cm/E,IAAc/7B,KACvBxlC,EAAS,gBAAgB1S,KAAMg6D,EAAIyK,aAAe,GAAGxkE,OAAO,aAG9D,MAAMk0E,EAAuC,IAArB5rF,EAAY+U,KAE9B82E,EAAoC,KAAnB7rF,EAAYL,GAE7BmsF,EACJJ,IAAc/mC,IAAW+mC,IAAclP,IAAgBl/D,EAAQ+nD,SAAYwmB,EAEvEE,EAAwB5rE,QAC5BngB,EAAY2E,aAAa1G,WAAWs6B,MACjCkO,GAAaA,EAASgG,aAAenvB,EAAQ3d,KAAO8mC,EAASC,aAIlE,IAAIzS,EAAU,oBACV23D,IACEE,EACF73D,EAAU,kBACDy3D,IAAc/7B,KACvB17B,EAAU,uBAId,IAAI+3D,EAA8C,KAC9CC,GACFriF,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACrH,SAAS,QAAQ0D,OAAO,WAAWtD,QAAS6qD,EAAaz6D,KAAK,SAAQsM,SAAC,UA4EjF,OAxEKuT,EAAQrW,QAAQilF,WAcVJ,EACTE,GACEpiF,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL,cAAY,kCACZrH,SAAU8+E,IAA0BF,EAAiB,YAAc,aACnEx+E,QAASi+E,EACT7tF,KAAK,SAAQsM,SAEZgiF,IAA0BF,EAAiB,oBAAsB,eAG7DH,IAAc/7B,GACvBq8B,EAAyBx9B,GACvB3iD,EAAAA,EAAAA,MAACsgF,GAAqB,CAAApiF,SAAA,EACpBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACxD,MAAOC,EAAAA,GAAO0lB,MAAOliB,OAAO,YAAYvQ,KAAK,YAAY,yBAIjEwJ,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACrH,SAAS,OAAO0D,OAAO,WAAWtD,QAAS2jD,EAAcvzD,KAAK,SAAQsM,SAAC,cAIxE2hF,IAAclP,IAAgBkP,IAAcvP,KACrD6P,GACEpiF,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACrH,SAAS,QAAQI,QAAS6qD,EAAaz6D,KAAK,SAAQsM,SAAC,WArC/DiiF,GACEpiF,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACLrH,SAAS,oBACTI,QAASA,IACP,QAASiQ,EAAQrW,SACjBqW,EAAQrW,QAAQ1C,KAChBmD,OAAOnB,KAAK+W,EAAQrW,QAAQ1C,IAAK,UAEnC9G,KAAK,SAAQsM,SACd,cAkCD0nE,EAAItiB,WACFu8B,IAAc/mC,GAChBx6B,GACEte,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC+hF,EAAAA,EAAY,CAACh7E,OAAO,YAAW5G,UAC9BH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACxD,MAAOC,EAAAA,GAAOY,MAAO3N,KAAK,UAAUmM,KAAK,SAClC,iCAIVm/E,IAAclP,IAAgBl/D,EAAQ+nD,UAC/CpxC,EAAU,gBACV9J,EAAS,4CACT6hE,GACEpiF,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAACrH,SAAS,UAAUI,QAASo+E,EAAoBhuF,KAAK,SAAQsM,SAAC,kBAIxEkiF,EAA0BD,KAI9Bn5E,EAAAA,EAAAA,YAAU,KACJ4+D,EAAItiB,UAAYu8B,IAAclP,IAAgBl/D,EAAQ+nD,SACxDgmB,GAA2B,EAC7B,GACC,CAAC5Z,EAAItiB,SAAUu8B,KAGhB7/E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACs7C,EAAAA,EAAS,CAACl5C,OAAQg4C,EAAiB/3C,QAASA,IAAMg4C,GAAmB,MACtEr6C,EAAAA,EAAAA,KAACm/E,EAAiB,CAChB/8E,OAAQo/E,EACRn/E,QAASA,IAAMo/E,GAA2B,GAC1CnzB,YAAaA,EACb56C,QAASA,KAEXzR,EAAAA,EAAAA,MAAChC,GAAS,CAAC87B,UAAgC,IAArB3lC,EAAY+U,KAAWhL,SAAA,EAC3C8B,EAAAA,EAAAA,MAACg8B,GAAY,CAACukD,YAAa93D,EAAAA,GAAco9B,8BAA8B3nD,SAAA,EACrEH,EAAAA,EAAAA,KAACipC,GAAO,CAAA9oC,SAAEkqB,KACRlE,IAAanmB,EAAAA,EAAAA,KAACilD,GAAM,CAAA9kD,SAAEogB,IACvByhE,EAAkBI,EAAyBC,EAC3CL,IACC//E,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACI2hF,IAAc/7B,IAAem8B,KAC7BliF,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACLrH,SAAS,QACT0D,OAAQ,UACN+6E,IAAc/7B,IAAe+7B,IAAc/mC,GAAS,OAAS,IAE/Dt3C,QAAS6qD,EACT/mD,QAAQ,YACR1T,KAAK,SAAQsM,SACd,WAID2hF,IAAc/7B,IAAe+7B,IAAc/mC,MAC3C/6C,EAAAA,EAAAA,KAACygF,GAAmB,CAClBx4B,KAAM65B,IAAc/7B,GAAc8hB,EAAIyK,YAAczK,EAAI1iB,SACxDjrD,YAAa,iCACX2tE,EAAI4a,aAAariE,YAAc,aAC7B1M,EAAQ4L,YAAWojE,EAAAA,EAAAA,IAAe7a,EAAIjkE,cAC1C8K,MAAO,YAAYozE,IAAc/7B,GAAc,cAAgB,eAC7DryC,EAAQhF,gBAOnBgc,EAAAA,GAAco9B,gCACb9nD,EAAAA,EAAAA,KAAC+/C,EAAAA,EAAqB,CACpBrsC,QAASA,EACTiV,WAAYm5D,IAAclP,IAAgBkP,IAAcvP,UAI7D,EAMP,MAAMtyE,GAAYmE,EAAAA,GAAOC,GAAG;;;;oBAIR,EAAG03B,eAAiBA,EAAY,OAAS;;;sBAGvCx4B,EAAAA,GAAO4N;gBACbhJ,EAAAA,GAAOw6E;EAEjB1kD,GAAe75B,EAAAA,GAAOC,GAA8B;;;;;;;;IAQtD,EAAGm+E,iBAAkBA,GAAe,4BAA4Bj/E,EAAAA,GAAO4N;EAErE83B,GAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMyI;;EAGJk4C,GAAS7gD,EAAAA,GAAOC,GAAG;;;;;IAKrBC,EAAAA,GAAMgM;EAEJiyE,GAAwBn+E,EAAAA,GAAOC,GAAG;;;;WAI7Bd,EAAAA,GAAO0lB;IACd3kB,EAAAA,GAAMgM;;kBC1RV,OAhC6BsyE,EAAGlvE,cAC9B,MAAMsmB,EAAW,IAAItmB,EAAQvF,sBAAuBuF,EAAQzF,aAE5D,OACEjO,EAAAA,EAAAA,KAACC,GAAS,CAAAE,SACP65B,EAAStjC,OAAS,IACjBuL,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACipC,GAAO,CAAA9oC,SAAC,iCACT8B,EAAAA,EAAAA,MAAC4gF,GAAI,CAAA1iF,SAAA,CACF65B,EAAS1O,MAAM,EAAG4yC,GAAAA,GAA2BroE,KAAKgyD,IACjD7nD,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CAAezwC,QAASsyC,EAASllD,KAAK,KAAKk7D,MAAM,WAA3ChW,KAEX7tB,EAAStjC,OAASwnE,GAAAA,IACjBl+D,EAAAA,EAAAA,KAAC8iF,EAAAA,GAAU,CACTv7D,KAAMyS,EAAS1O,MAAM4yC,GAAAA,GAA2BroE,KAAKgyD,IACnD7nD,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CAAezwC,QAASsyC,EAASllD,KAAK,KAAKk7D,MAAM,WAA3ChW,KACT1nD,UAEHH,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CACFzwC,QAAYykB,EAAStjC,OAASwnE,GAAAA,EAArB,QACTv7D,KAAK,KACLk7D,MAAM,qBAOR,EAMhB,MAAM59D,GAAYmE,EAAAA,GAAOC,GAAG;;sBAENd,EAAAA,GAAO4N;;EAGvB83B,GAAU7kC,EAAAA,GAAOC,GAAG;;IAEtBC,EAAAA,GAAM+L;EAEJwyE,GAAOz+E,EAAAA,GAAOC,GAAG;;;;;;;kECVvB,OAlCyB0+E,EAAGjhB,iBAOxB9hE,EAAAA,EAAAA,KAAA,OAAAG,UACEH,EAAAA,EAAAA,KAACmpC,EAAAA,GAAU,CACTC,eAAa,EACb45C,UAAQ,EACRnlF,MAAM,oBACNhK,KAAK,mBACL2lB,QAAQ,YACRzS,OAAO,YACP3D,MACEnB,EAAAA,EAAAA,MAAChC,GAAS,CAAAE,SAAA,EACRH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAO8M,MAAOC,EAAAA,GAAOu2C,WAAY/yC,OAAO,cAAc,iEAEjE/G,EAAAA,EAAAA,KAACmD,EAAAA,GAAU,CACTC,KAAK,gBACLC,SAAS,OACTsH,aAAa,OACblH,QAtBWoL,gBACfikC,UAAUC,UAAUC,UAAU8uB,GACpC7xD,GAAAA,GAAMhB,QAAQ,+BAA+B,EAqBnC3L,MAAOC,EAAAA,GAAOu2C,WACd/yC,OAAO,yBAWrB,MAAM9G,GAAYmE,EAAAA,GAAOC,GAAG;;;;shCCHrB,MAAM+tE,GAAoB,cAqUjC,OAnUgBtsD,EAAGK,aAAY,EAAO88D,iBAAgB9lC,gBAAe,MACnE,MAAgD77C,EAAAC,IAAdC,EAAAA,EAAAA,WAAS,GAAK,GAAzCqrB,EAASvrB,EAAA,GAAEwrB,EAAYxrB,EAAA,GACkEK,EAAAJ,IAAlEC,EAAAA,EAAAA,UAAyByhF,GAAmB,CAAC,GAAqB,GAAzFvvE,EAAO/R,EAAA,GAAEuhF,EAAUvhF,EAAA,GACqC2M,EAAA/M,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxD07D,EAAgB5uD,EAAA,GAAE2rC,EAAmB3rC,EAAA,GACW0D,EAAAzQ,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAhDu1C,EAAY/kC,EAAA,GAAEwiC,EAAexiC,EAAA,GAEyBE,EAAA3Q,IAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAtD2hF,EAAejxE,EAAA,GAAEkxE,EAAkBlxE,EAAA,GACgBE,EAAA7Q,IAAZC,EAAAA,EAAAA,UAAS,IAAG,GAAnD6hF,EAAejxE,EAAA,GAAEkxE,EAAkBlxE,EAAA,GAItCsK,EAAAnb,IAHsDC,EAAAA,EAAAA,YAGtD,GAHG+hF,EAAqB7mE,EAAA,GAAE8mE,EAAwB9mE,EAAA,GAKhDmrD,GAAOob,GAAkBvvE,GAAS+oC,YAClCp/C,EAAUqW,EAAQrW,QAElBomF,GAAmB7yD,EAAAA,EAAAA,QAAuB,MAC1Cx6B,GAAc4L,EAAAA,EAAAA,KAAarO,GAAqBA,EAAMuL,SAAS9I,cAE/D0L,GAAWC,EAAAA,EAAAA,MACjB2hF,IAAoCrwE,EAAAA,EAAAA,KAA5B+M,GAAUsjE,GAAVtjE,WAAYujE,GAAWD,GAAXC,YACd3+E,IAAUC,EAAAA,EAAAA,MACRqhD,GAAathD,GAAQlL,SAArBwsD,SACDt6B,GAAiCzqB,IAAjBmvB,EAAAA,EAAAA,KAAiB,GAArB,GACbkzD,GAAkB53D,GAAaxY,IAAI4+D,IAEnCyR,GAAeh1E,UACnB,IAEE,IAAKsX,IAAc88D,EAAgB,CACjC,MAAiBa,SAAqBxjE,EAAAA,EAAAA,IAAiBF,GAAYmsC,GAAQq3B,KAAnElwE,QAuCR,OArCKowE,EAAW/tF,IACdiP,GAAQrO,KAAK,KAGfsK,SAASyN,MAAQ,GAAGo1E,EAAWp1E,WAAWo1E,EAAWrnC,YAAYgmC,aAAajsF,cAE9EsL,GAAS+Q,EAAAA,EAAAA,QAETyE,EAAAA,EAAAA,IAAMC,EAAAA,EAAiBmJ,KAAM,CAC3BmiB,WAAYihD,EAAW/tF,GACvB0mD,YAAa,CACXsnC,eAAgBD,EAAW/tF,GAC3BwkD,iBAAkBupC,EAAWvpC,kBAE/BtwB,gBAAiB,YAGf+B,GAAaxY,IAAI,UACnBvD,EAAAA,GAAMhB,SACJhN,EAAAA,EAAAA,MAAA,KAAA9B,SAAA,CAAG,yCAEDH,EAAAA,EAAAA,KAACwK,EAAAA,GAAI,CAACC,GAAG,gBAAgBf,MAAO,CAAEwG,eAAgB,YAAa5M,MAAO,SAAUnD,SAAC,iBAE1E,QAMTosD,IACFvgC,GAAasc,IAAI8pC,GAAmB7lB,GACpCvnD,GAAQ6hB,QAAQ,CAAE3B,OAAQ8G,GAAaqG,cAEzC+wD,GAAmB,GAEnBF,EAAWY,QACXh3D,GAAa,EAEf,CAGA,GAAI3G,IAAc88D,EAAgB,CAChC,MAAMe,EAAuBC,KAAKN,IAEjBG,SAAqBxjE,EAAAA,EAAAA,IAAiB0jE,EAAsBL,KAArEjwE,QAQR,OANKowE,EAAW/tF,IACdiP,GAAQrO,KAAK,KAGfusF,EAAWY,QACXh3D,GAAa,EAEf,CAGI3G,GAAa88D,GACfn2D,GAAa,EAEjB,CAAE,MAAOhqB,GACmB,MAAtBA,EAAEyP,SAASgO,SACT4iE,EACFG,EAAmB,2BAEnBF,GAAmB,GACnBI,EAAyB1gF,EAAEyP,SAASvD,OAG1C,GA2BF,IAxBA/F,EAAAA,EAAAA,YAAU,KACR46E,IAAc,GACb,KAEHK,EAAAA,EAAAA,kBAAgB,KACd,IAAIC,EAEJ,MAAMC,EAAiBA,KACQ,QAAzBtmF,OAAOhE,SAAS6sB,MAAkB88D,EAAiB5yD,QACrD4yD,EAAiB5yD,QAAQC,eAAe,CAAEC,SAAU,WAEpDozD,EAAmBE,sBAAsBD,EAC3C,EAKF,OAFAA,IAEO,KACDD,GACFG,qBAAqBH,EACvB,CACD,GACA,CAACV,IAEAN,EACF,OACEnjF,EAAAA,EAAAA,KAAC68E,GAAAA,EAAU,CACTjuE,SAAUi1E,GACVx0E,MAAOg0E,EACPvG,YAAayG,IAKnB,GAAI12D,EACF,OAAO7sB,EAAAA,EAAAA,KAACI,EAAAA,EAAM,CAACqJ,OAAO,aAGxB,MAAM86E,IACJ1+B,EAAAA,EAAAA,IAAanyC,KAAaoyC,EAAAA,GAAU8sB,cAAgB/K,EAAI2c,sBACpDp6B,GAAWyd,EAAI/B,WAAY2e,EAAAA,EAAAA,IAAsB5c,EAAI/B,WAAa,KAElE4e,IACHv+D,GACDzS,EAAQ2H,WAAWspE,MACnBjxE,EAAQsuD,cACP5rE,EAAY+U,OAASwB,EAAAA,EAASC,SAAWxW,EAAY0W,UAElD83E,GAAiBlxE,GAASw5B,cAAgB+1C,GAAgB/1C,aAEhE,OACEjrC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC0hC,EAAAA,EAAW,CACV/kC,KAAMugE,EACN36B,UAAW7uB,EAAQ3d,GACnBuS,WAAYA,IAAM2xC,GAAoB,GACtC3X,qBAAsBA,IAAMryB,EAAAA,GAAMhB,QAAQ,eAC1C4yB,cAAc,GACdO,UAAU,2BACVuC,YAAa,gCACU,IAArBvuC,EAAY+U,KAAa,UAAY,cAEvCy5B,eAAgB,QACO,IAArBxuC,EAAY+U,KAAa,UAAY,uEAEvC25B,cAAe,GAAG1uC,EAAYC,cAAcD,EAAYE,mDACxD6rC,aAAa,aAEdhc,IAAc88D,IAAkBjjF,EAAAA,EAAAA,KAACg/E,EAAoB,IACrD0F,KAA8B1kF,EAAAA,EAAAA,KAAC+iF,GAAgB,CAACjhB,WAAYpuD,EAAQsuD,eACrEhiE,EAAAA,EAAAA,KAACC,GAAS,CAACkmB,UAAWA,EAAWg3B,aAAcA,EAAc,cAAY,gBAAeh9C,UACtF8B,EAAAA,EAAAA,MAAC4iF,EAAAA,GAAa,CAACC,cAAe3+D,EAAW4+D,eAAa,EAAA5kF,SAAA,EAClDgmB,IACAlkB,EAAAA,EAAAA,MAAC2zC,EAAAA,GAAQ,CACPnrC,GAAI67C,KAAY3uC,EAAAA,EAAAA,GAAgB,YAChC22B,KAAMhqC,EAAAA,GAAMgM,SACZvJ,OAAO,SAAQ5G,SAAA,EAEfH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,eAAeuQ,OAAO,eAAe,4BAIpD/G,EAAAA,EAAAA,KAACglF,EAAAA,EAAiB,CAACtxE,QAASA,EAASyS,UAAWA,KAChDlkB,EAAAA,EAAAA,MAACk2C,GAAW,CAACgF,aAAcA,EAAah9C,SAAA,EACtC8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CACGokF,KACCtiF,EAAAA,EAAAA,MAACs5C,GAAW,CAAC4B,aAAcA,EAAah9C,SAAA,EACtC8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,EACEH,EAAAA,EAAAA,KAACipC,GAAO,CAAA9oC,SAAC,gDACT8B,EAAAA,EAAAA,MAAA,OAAA9B,SAAA,CAAK,mCAC8B,KAC/BykF,IAAkB,iBAAkBvnF,EAClCA,EAAQsR,aACR,cAAc,WAItB3O,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CACL7M,MAAM,cACN4F,QAASA,KACPggF,EAAiB5yD,SAASC,eAAe,CAAEC,SAAU,WACjD82C,EAAI2c,uBAA8C,IAArBpuF,EAAY+U,MAC3CqpC,GAAgB,EAClB,EACAr0C,SACH,0BAKLH,EAAAA,EAAAA,KAACipC,GAAO,CAAA9oC,UAAEuM,EAAAA,GAAAA,GAAE,yCACZ1M,EAAAA,EAAAA,KAAA,OAAK,cAAY,iBAAgBG,UAC9B89C,EAAAA,EAAAA,KAAmBgnC,EAAAA,EAAAA,IAAoBpd,EAAIjkE,gBAE9C5D,EAAAA,EAAAA,KAACipC,GAAO,CAAA9oC,UAAEuM,EAAAA,GAAAA,GAAE,0CACZ1M,EAAAA,EAAAA,KAACklF,GAAe,CAAC,cAAY,kBAAiB/kF,UAC3C89C,EAAAA,EAAAA,IAAmB4pB,EAAI/C,gBAE1B9kE,EAAAA,EAAAA,KAAC++E,EAA2B,CAC1B10D,SAASrqB,EAAAA,EAAAA,KAACw+E,GAAU,CAAAr+E,UAAEuM,EAAAA,GAAAA,GAAE,yCACxBo9B,YAAap2B,EAAQyxE,sBAGtB5uE,QAAQ7C,EAAQsxD,mBAAmBtuE,UAClCuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACw+E,GAAU,CAAAr+E,UAAEuM,EAAAA,GAAAA,GAAE,oDACf1M,EAAAA,EAAAA,KAACklF,GAAe,CAAC,cAAY,4BAA2B/kF,UACrD89C,EAAAA,EAAAA,IACCvqC,EAAQsxD,kBAAkBnvE,KAAKuvF,GAAa,KAAKA,EAAS5uF,SAAQC,KAAK,YAK9E8f,QAAQ7C,EAAQwxD,sBAAsBxuE,UACrCuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACw+E,GAAU,CAAAr+E,UAAEuM,EAAAA,GAAAA,GAAE,qDACf1M,EAAAA,EAAAA,KAACklF,GAAe,CAAC,cAAY,6BAA4B/kF,UACtD89C,EAAAA,EAAAA,IACCvqC,EAAQwxD,qBACLrvE,KAAKwvF,GAAgB,KAAKA,EAAYnrF,gBACtCzD,KAAK,aAMdoxE,EAAItC,wBAAwB7uE,QAAU,GAAK,IAC3CuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACw+E,GAAU,CAAAr+E,UAAEuM,EAAAA,GAAAA,GAAE,qDACf1M,EAAAA,EAAAA,KAACklF,GAAe,CAAC,cAAY,gCAA+B/kF,UACzD89C,EAAAA,EAAAA,IAAmB4pB,EAAItC,8BAI5BsC,EAAInC,cAAchvE,QAAU,GAAK,IACjCuL,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAACw+E,GAAU,CAAAr+E,UAAEuM,EAAAA,GAAAA,GAAE,2CACf1M,EAAAA,EAAAA,KAACklF,GAAe,CAAC,cAAY,mBAAkB/kF,UAC5C89C,EAAAA,EAAAA,IAAmB4pB,EAAInC,mBAI7Btb,IACCnoD,EAAAA,EAAAA,MAACqjF,GAAa,CAAAnlF,SAAA,EACZ8B,EAAAA,EAAAA,MAACu8E,GAAU,CAAAr+E,SAAA,EACRuM,EAAAA,GAAAA,GAAE,gCACH1M,EAAAA,EAAAA,KAACgmD,EAAAA,GAAG,CACFzwC,SACEtT,EAAAA,EAAAA,MAACsjF,GAAa,CAAAplF,SAAA,CACXiqD,GAAS,KAAOA,GAAS,GACtB,SAASA,GAAS,KAClB,UAAUA,GAAS,MAAMA,GAAS,MACtCpqD,EAAAA,EAAAA,KAACwvC,EAAAA,GAAO,CACNj6B,QAAQ,2JACR/N,aAAa,QAAOrH,UAEpBH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,OAAOmM,KAAK,KAAKW,MAAOC,EAAAA,GAAOkrB,mBAIhD9rB,KAAK,KACLoE,OAAO,mBAGX/G,EAAAA,EAAAA,KAACmqD,EAAAA,EAAI,CAACC,SAAUA,QAEhB,MACJpqD,EAAAA,EAAAA,KAACi+E,GAAAA,EAAQ,CACPpY,kBAAmBgC,EAAIjC,oBAAsB,GAC7CsY,gBAAiBxqE,EAAQ8xE,iBACzBrH,oBAAqBzqE,EAAQ+xE,sBAC7BtoC,aAAcA,KAEdynC,KAAkB5kF,EAAAA,EAAAA,KAACk9C,GAAAA,EAAY,CAACxpC,QAASA,EAASypC,aAAcA,IACjE0qB,EAAI2c,wBACHxkF,EAAAA,EAAAA,KAACg6C,EAAAA,EAAiB,CAChBtmC,QAASA,EACT0f,IAAKqwD,EACL1sC,aAAcA,EACdvC,gBAAiBA,EACjByF,oBAAqBA,QAI3Bh4C,EAAAA,EAAAA,MAACyjF,GAAW,CAAAvlF,SAAA,EACVH,EAAAA,EAAAA,KAAC2lF,GAAM,CACLjyE,QAASA,EACTyS,UAAWA,EACX8zB,oBAAqBA,KAEvBj6C,EAAAA,EAAAA,KAAC4iF,GAAoB,CAAClvE,QAASA,IAC9BA,EAAQ2H,WAAWuqE,MAAO5lF,EAAAA,EAAAA,KAACu8C,GAAAA,EAAW,CAAC7oC,QAASA,iBAKxD,EAMP,MAAMzT,GAAYmE,EAAAA,GAAOC,GAAG;oBACR,EAAG8hB,eAAiBA,EAAY,OAAS;IACzD,EAAGg3B,mBAAoBA,GAAgB,UAAUlwC,EAAAA,GAAkB44E;EAEjEtqC,GAAcn3C,EAAAA,GAAOC,GAAG;;;;;gBAKdd,EAAAA,GAAOw4C;;;IAGnBz3C,EAAAA,GAAMuG;IACN,EAAGsyC,kBACHA,GACA,WACIlwC,EAAAA,GAAkB8rE,gIAKlB9rE,EAAAA,GAAkBmxC;EAKpBjG,GAAc/zC,EAAAA,GAAOC,GAAG;;;;;;MAMxBC,EAAAA,GAAMuG;;;IAGR,EAAGsyC,kBACHA,GACA,WACIlwC,EAAAA,GAAkB8rE,6DAGlB9rE,EAAAA,GAAkB8b,uIAKlB9b,EAAAA,GAAkB8M;EAKpB2rE,GAActhF,EAAAA,GAAOC,GAAG;;;;EAKxB4kC,GAAU7kC,EAAAA,GAAOC,GAAG;IACtBC,EAAAA,GAAMyI;;;;;EAMJyxE,GAAap6E,EAAAA,GAAOC,GAAG;;;IAGzBC,EAAAA,GAAM+L;;EAGJ60E,GAAkB9gF,EAAAA,GAAOC,GAAG;;;;EAMrBihF,GAAgBlhF,EAAAA,GAAOC,GAAG;;;;;EAM1BkhF,GAAgBnhF,EAAAA,GAAOC,GAAG;;;;2ECrbvC,IAVoB2iB,KAEhBhnB,EAAAA,EAAAA,KAACqmB,EAAAA,EAAU,CACTC,OAAO5Z,EAAAA,EAAAA,GAAE,+BACT6Z,QAAQ7Z,EAAAA,EAAAA,GAAE,gCACVwP,cAAcsK,EAAAA,EAAAA,IAAO,6C,goCC2C3B,IApCmBH,EAAGC,QAAOC,SAAQrK,eAAc+K,mBAAkB,MACnE,MAA+C3lB,EAAAC,GAAfC,EAAAA,EAAAA,WAAS,GAAM,GAAxCskF,EAAQxkF,EAAA,GAAEykF,EAAWzkF,EAAA,GAEtB0D,GAAUC,EAAAA,EAAAA,OAIhBgE,EAAAA,EAAAA,YAAU,KACJ68E,GAAUhoF,OAAOhE,SAAS4J,QAAQ,GACrC,CAACsB,EAAQlL,SAASiS,WAOrB,OACE9J,EAAAA,EAAAA,MAAChC,EAAS,CAACgnB,gBAAiBA,EAAgB9mB,SAAA,EAC1C8B,EAAAA,EAAAA,MAAC+jF,EAAK,CAAA7lF,SAAA,CACHmmB,GACDrkB,EAAAA,EAAAA,MAACgkF,EAAM,CAAA9lF,SAAA,CAAC,KAAGomB,SAEbtkB,EAAAA,EAAAA,MAACikF,EAAY,CAAA/lF,SAAA,CACV+b,GACDlc,EAAAA,EAAAA,KAAA,UACCwmB,EAAAA,EAAAA,IAAO,wCAAyC,CAC/CjE,MAAMviB,EAAAA,EAAAA,KAAA,KAAGiE,KAAK,WAAU9D,SAAC,qBAG7BH,EAAAA,EAAAA,KAAC0K,EAAAA,GAAM,CAAC7W,KAAK,SAAS4P,QAlBH0iF,KACjBl/D,GAAiB8+D,GAAY,GACjC/gF,EAAQohF,QAAQ,EAgBgCjmF,UAC3CuM,EAAAA,EAAAA,GAAE,oCAEK,EAMhB,MAAMzM,EAAYmE,EAAAA,GAAOC,GAAG;;IAExB,EAAG4iB,qBAIIA,EACH,kIAKA;0BAKkBrS;;;;0BAIArR,EAAAA,GAAOsE;;EAG3Bm+E,EAAQ5hF,EAAAA,GAAOC,GAAG;;;;6BAIKd,EAAAA,GAAO4N;;;;EAK9B80E,EAAS7hF,EAAAA,GAAOC,GAAG;;WAEdd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM2qB;EAEJi3D,EAAe9hF,EAAAA,GAAOC,GAAG;;;IAG3BC,EAAAA,GAAM8I;;aAEG7J,EAAAA,GAAOyE;;;eAGLzE,EAAAA,GAAOC;;;kICdtB,KApE6B6iF,EAC3BjkF,SACAmpE,aACA+a,gBACA7a,cACA8a,iBACA5d,gBACA6d,uBAEA,MAAAC,GAKIC,EAAAA,EAAAA,KAHFC,GAD2BF,EAA3B55D,UACW45D,EAAXE,aACAC,EAAYH,EAAZG,aACAC,EAAcJ,EAAdI,eASIC,EAAevb,EAAW70E,OAAS+0E,EAAY/0E,OAASiyE,EAAcjyE,OAE5E,OAAK0L,GAGHH,EAAAA,EAAAA,MAAChC,EAAS,CAAAE,SAAA,EACR8B,EAAAA,EAAAA,MAACghD,EAAM,CAAA9iD,SAAA,EACLH,EAAAA,EAAAA,KAAC+mF,EAAAA,EAAmB,CAClBrkF,MAAM,iBACNG,SAAWC,GAAMwjF,EAAcxjF,GAC/ByC,MAAOgmE,EACPnkE,QAASu/E,KAEX3mF,EAAAA,EAAAA,KAAC+mF,EAAAA,EAAmB,CAClBrkF,MAAM,QACNG,SAAWC,GAAMyjF,EAAezjF,GAChCyC,MAAOkmE,EACPrkE,QAASw/E,KAEX5mF,EAAAA,EAAAA,KAAC+mF,EAAAA,EAAmB,CAClBrkF,MAAM,WACNG,SAAWC,GAAM0jF,EAAiB1jF,GAClCyC,MAAOojE,EACPvhE,QAASy/E,QAGb5kF,EAAAA,EAAAA,MAAC+kF,EAAa,CAAA7mF,SAAA,EACZH,EAAAA,EAAAA,KAACm5E,EAAiB,CAACtlF,KAAK,SAAS4P,QAjCbwjF,KACxBX,EAAc,IACdC,EAAe,IACfC,EAAiB,GAAG,EA8B4CrmF,SACzD2mF,EAAe,IACd7kF,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA/B,SAAA,EACEH,EAAAA,EAAAA,KAAC8G,EAAAA,GAAI,CAACtQ,KAAK,UAAUuQ,OAAO,cAAczD,MAAOC,EAAAA,GAAOC,YAAa,0BAK3EvB,EAAAA,EAAAA,MAACilF,EAAc,CAAA/mF,SAAA,CAAC,yBAEdH,EAAAA,EAAAA,KAACy8E,EAAW,CAAC5oF,KAAK,SAAS4P,QAASA,IAAM3F,OAAOnB,KAAK,WAAY,UAAUwD,SAAC,yBAnCjE,IAwCN,EAMhB,MAAMF,EAAYmE,EAAAA,GAAOC,GAAG;;;;;sBAKNd,EAAAA,GAAOwE;;EAIhBk7C,EAAS7+C,EAAAA,GAAOC,GAAG;;;;;IAK5B4I,EAAAA,GAAkBD;;;;EAKhBg6E,EAAgB5iF,EAAAA,GAAOC,GAAG;;;;EAMnB80E,EAAoB/0E,EAAAA,GAAOoe,MAAM;;;WAGnCjf,EAAAA,GAAOC;;;IAGdc,EAAAA,GAAMgM;EAEG42E,EAAiB9iF,EAAAA,GAAOC,GAAG;;WAE7Bd,EAAAA,GAAOyD;IACd1C,EAAAA,GAAM8I;EAEGqvE,EAAcr4E,EAAAA,GAAOoe,MAAM;WAC7Bjf,EAAAA,GAAOyD;;;;;koCCzHX,MAAM+yC,EAAkB,CAC7B,CACEx0C,MAAO,OACP7C,MAAO,QAET,CACE6C,MAAO,iBACP7C,MAAO,qBAIEgkF,EAAoBA,KAM/B,MAAgDplF,EAAAC,GAAdC,EAAAA,EAAAA,WAAS,GAAK,GAAzCqrB,EAASvrB,EAAA,GAAEwrB,EAAYxrB,EAAA,GACsCK,EAAAJ,GAA9BC,EAAAA,EAAAA,UAA2B,IAAG,GAA7DmlF,EAAWhlF,EAAA,GAAEwlF,EAAcxlF,EAAA,GACoC2M,EAAA/M,GAA9BC,EAAAA,EAAAA,UAA2B,IAAG,GAA/DolF,EAAYt4E,EAAA,GAAE84E,EAAe94E,EAAA,GAC2C0D,EAAAzQ,GAAnCC,EAAAA,EAAAA,UAAgC,IAAG,GAAxEqlF,EAAc70E,EAAA,GAAEq1E,EAAiBr1E,EAAA,GA0BxC,OAxBA/I,EAAAA,EAAAA,YAAU,KACR,WACE,MAAM+F,QAAa68D,EAAAA,EAAAA,MACnBwb,EAAkB,CAChB,CACE3kF,MAAO,cACP0E,QAAS4H,EAAKk6D,gBAAgBj7D,YAAYpY,IAAI+a,EAAAA,KAEhD,CACElO,MAAO,YACP0E,QAAS4H,EAAKk6D,gBAAgB/6D,mBAAmBtY,IAC/C+a,EAAAA,OAKN,MAAQk7D,EAAgC98D,EAAhC88D,aAAcC,EAAkB/8D,EAAlB+8D,cACtBob,EAAerb,EAAaj2E,IAAI+a,EAAAA,KAChCw2E,EAAgBrb,EAAcl2E,IAAI+a,EAAAA,KAElCkc,GAAa,EACd,EApBD,EAoBI,GACH,IAEI,CACLD,YACA85D,cACAC,eACAC,iBACD,C,6ICxDI,IAAKS,EAAW,SAAXA,GAAW,OAAXA,EAAW,oBAAXA,EAAW,uBAAXA,EAAW,gCAAXA,EAAW,wCAAXA,EAAW,2CAAXA,EAAW,8CAAXA,EAAW,+CAAXA,EAAW,4BAAXA,CAAW,MAWXC,EAAY,SAAZA,GAAY,OAAZA,EAAY,yBAAZA,EAAY,4CAAZA,EAAY,oDAAZA,EAAY,qDAAZA,EAAY,yCAAZA,EAAY,kDAAZA,EAAY,4DAAZA,EAAY,kDAAZA,EAAY,wBAAZA,CAAY,MAYZC,EAAW,SAAXA,GAAW,OAAXA,EAAW,4CAAXA,EAAW,sCAAXA,EAAW,4CAAXA,EAAW,gCAAXA,EAAW,gCAAXA,CAAW,MAQXnkC,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,sBAAzBA,EAAyB,kBAAzBA,EAAyB,oBAAzBA,CAAyB,K","sources":["webpack://halo/./app/client/src/redux/reducers/adminReducer.ts","webpack://halo/./app/client/src/redux/reducers/companyReducer.ts","webpack://halo/./app/client/src/redux/reducers/defaultReducer.jsx","webpack://halo/./app/client/src/redux/reducers/profileReducer.jsx","webpack://halo/./app/client/src/redux/reducers/windowDimensionsReducer.jsx","webpack://halo/./app/client/src/redux/reducers/index.jsx","webpack://halo/./app/client/src/redux/rootReducer.ts","webpack://halo/./app/client/src/redux/store.ts","webpack://halo/./app/client/packs/app.tsx","webpack://halo/./app/client/src/components/MasqueradeBar/MasqueradeBar.tsx","webpack://halo/./app/client/src/components/Messenger/MessengerHeader.tsx","webpack://halo/./app/client/src/components/Messenger/ParticipantsInfoModal.tsx","webpack://halo/./app/client/src/components/Messenger/Messenger.tsx","webpack://halo/./app/client/src/components/MobileRestricted/MobileRestricted.tsx","webpack://halo/./app/client/src/components/MobileRestricted/index.ts","webpack://halo/./app/client/src/components/PrivateRoute.tsx","webpack://halo/./app/client/src/components/PrivateSponsorRoute.tsx","webpack://halo/./app/client/src/components/SubscriptionWarning/SubscriptionEndedModal.tsx","webpack://halo/./app/client/src/components/SubscriptionWarning/SubscriptionWarning.tsx","webpack://halo/./app/client/src/components/TaxonomyUpdateModal/TaxonomyUpdateModal.tsx","webpack://halo/./app/client/src/components/TaxonomyUpdateModal/index.ts","webpack://halo/./app/client/src/components/modals/SSOSponsorOnboardingModal.tsx","webpack://halo/./app/client/src/routes/SubmitProposalRedirect.tsx","webpack://halo/./app/client/src/utils/ScrollToTop.ts","webpack://halo/./app/client/src/components/Navbar/NavbarDropdownMenu.tsx","webpack://halo/./app/client/src/components/LoginSignUpModal/LoginModal.styles.jsx","webpack://halo/./app/client/src/components/LoginSignUpModal/SignUpModal.tsx","webpack://halo/./app/client/src/components/LoginSignUpModal/LoginSignUpModal.tsx","webpack://halo/./app/client/src/components/LoginSignUpModal/index.jsx","webpack://halo/./app/client/src/components/Navbar/NavbarLink.tsx","webpack://halo/./app/client/src/components/Navbar/ScientistNavbarLinks.tsx","webpack://halo/./app/client/src/components/Navbar/LoggedOutNavbarLinks.tsx","webpack://halo/./app/client/src/components/Navbar/MobileMenu.tsx","webpack://halo/./app/client/src/components/Navbar/SponsorNavbarLinks.tsx","webpack://halo/./app/client/src/components/Navbar/UniversityAdminNavbarLinks.tsx","webpack://halo/./app/client/src/components/Navbar/navbarLists.ts","webpack://halo/./app/client/src/components/Navbar/Navbar.tsx","webpack://halo/./app/client/src/routes/notification_campaign_routes.tsx","webpack://halo/./app/client/src/routes/opportunity_routes.tsx","webpack://halo/./app/client/src/routes/request_for_expert_routes.tsx","webpack://halo/./app/client/src/routes/rfp_routes.tsx","webpack://halo/./app/client/src/views/StatusPages/401.tsx","webpack://halo/./app/client/src/views/StatusPages/403.tsx","webpack://halo/./app/client/src/views/ErrorBoundary/ErrorBoundaryFallback.tsx","webpack://halo/./app/client/src/views/ErrorBoundary/ErrorBoundary.tsx","webpack://halo/./app/client/src/requests/googleScholarAuthors.ts","webpack://halo/./app/client/src/views/Onboarding/Progress.tsx","webpack://halo/./app/client/src/views/Onboarding/Step2/Step2.tsx","webpack://halo/./app/client/src/views/Onboarding/Step3aGoogleScholar/AuthorCard.tsx","webpack://halo/./app/client/src/views/Onboarding/Step3aGoogleScholar/Step3aGoogleScholar.tsx","webpack://halo/./app/client/src/views/Onboarding/Step4/Step4NextStep.tsx","webpack://halo/./app/client/src/views/Onboarding/Step4/Step4.tsx","webpack://halo/./app/client/src/views/Onboarding/OnboardingContainer.tsx","webpack://halo/./app/client/src/App.tsx","webpack://halo/./app/client/src/components/FeatureRequestButton/FeatureRequestButton.tsx","webpack://halo/./app/client/src/components/Footer/Footer.tsx","webpack://halo/./app/client/src/components/InviteModal/InviteModal.styles.jsx","webpack://halo/./app/client/src/components/InviteModal/InviteModal.jsx","webpack://halo/./app/client/src/components/InviteModal/index.jsx","webpack://halo/./app/client/src/components/LoginSignUpModal/LoginModal.tsx","webpack://halo/./app/client/src/components/Messenger/Conversation/Participants.tsx","webpack://halo/./app/client/src/utils/ably.ts","webpack://halo/./app/client/src/components/Messenger/Conversation/AttachmentsInfoModal.tsx","webpack://halo/./app/client/src/components/Messenger/Conversation/MessageCompose.tsx","webpack://halo/./app/client/src/components/Messenger/Conversation/MessageList.tsx","webpack://halo/./app/client/src/components/Messenger/Conversation/Conversation.tsx","webpack://halo/./app/client/src/components/modals/RfpQuestionSubmittedModal.tsx","webpack://halo/./app/client/src/requests/requestComments.ts","webpack://halo/./app/client/src/components/RequestDiscussion/tooltipContent.tsx","webpack://halo/./app/client/src/components/RequestDiscussion/RequestDiscussionSubmitForm.tsx","webpack://halo/./app/client/src/components/RequestDiscussion/RequestDiscussionEditForm.tsx","webpack://halo/./app/client/src/components/RequestDiscussion/RequestComment.tsx","webpack://halo/./app/client/src/components/RequestDiscussion/RequestDiscussion.tsx","webpack://halo/./app/client/src/components/RequestFAQs/faqs.ts","webpack://halo/./app/client/src/components/RequestFAQs/RequestFAQs.tsx","webpack://halo/./app/client/src/components/RequestPageComponents/AboutCompany.tsx","webpack://halo/./app/client/src/components/modals/RelevanceFeedbackModal.tsx","webpack://halo/./app/client/src/components/RequestPageComponents/tooltipContent.tsx","webpack://halo/./app/client/src/components/RequestPageComponents/RefineRecommendations.tsx","webpack://halo/./app/client/src/components/RequestPageComponents/RequestPageBanner.tsx","webpack://halo/./app/client/src/hooks/useIsImageLoadable.ts","webpack://halo/./app/client/src/components/RfpCard/RefineRecommendations.tsx","webpack://halo/./app/client/src/components/RfpCard/RfpCardFooter.tsx","webpack://halo/./app/client/src/components/RfpCard/RfpCard.tsx","webpack://halo/./app/client/src/components/SSOEnabledHint/SSOEnabledHint.tsx","webpack://halo/./app/client/src/components/ScientistContribution/ScientistContribution.tsx","webpack://halo/./app/client/src/components/TRLs/TRLs.tsx","webpack://halo/./app/client/src/components/UserVerificationCode/ResendConfirmationModal.tsx","webpack://halo/./app/client/src/components/UserVerificationCode/UserVerificationCode.tsx","webpack://halo/./app/client/src/components/library/Inputs/SearchBarInput.tsx","webpack://halo/./app/client/src/components/library/ModalBases/ShareWithinCompanyModal.tsx","webpack://halo/./app/client/src/components/libraryOld/SelectionMenus/Dropdown.styles.js","webpack://halo/./app/client/src/components/libraryOld/SelectionMenus/Dropdown.jsx","webpack://halo/./app/client/src/components/modals/FuelModal.tsx","webpack://halo/./app/client/src/components/modals/KeywordSignUpModal.tsx","webpack://halo/./app/client/src/components/modals/MessageAttachmentGalleryModal/MessageAttachmentGalleryPreview.tsx","webpack://halo/./app/client/src/components/modals/MessageAttachmentGalleryModal/MessageAttachmentGalleryModal.tsx","webpack://halo/./app/client/src/hooks/useEffectRefresh.ts","webpack://halo/./app/client/src/components/modals/ScientistQuickViewModal/hooks.ts","webpack://halo/./app/client/src/components/modals/InviteNetworkScientistModal.tsx","webpack://halo/./app/client/src/components/RfpCard/UnsubscribedRfpCard.tsx","webpack://halo/./app/client/src/components/modals/RfpUnsubscribeModal.tsx","webpack://halo/./app/client/src/components/modals/SponsorShareScientistModal.tsx","webpack://halo/./app/client/src/components/modals/ScientistQuickViewModal/ScientistQuickViewModal.tsx","webpack://halo/./app/client/src/constants/requests.ts","webpack://halo/./app/client/src/constants/users.ts","webpack://halo/./app/client/src/hooks/router.ts","webpack://halo/./app/client/src/hooks/useFollowRequest.tsx","webpack://halo/./app/client/src/hooks/useHubspotCTAs.ts","webpack://halo/./app/client/src/hooks/useIsMount.ts","webpack://halo/./app/client/src/hooks/useLocalStorage.ts","webpack://halo/./app/client/src/hooks/useSSOSensitiveEmail.ts","webpack://halo/./app/client/src/requests/sso.ts","webpack://halo/./app/client/src/redux/actions/adminActions.ts","webpack://halo/./app/client/src/redux/actions/companyActions.ts","webpack://halo/./app/client/src/requests/subscriptions.ts","webpack://halo/./app/client/src/redux/actions/defaultActions.jsx","webpack://halo/./app/client/src/redux/actions/profileActions.ts","webpack://halo/./app/client/src/redux/actions/windowDimensionsActions.jsx","webpack://halo/./app/client/src/requests/hubspot.js","webpack://halo/./app/client/src/requests/notifications.ts","webpack://halo/./app/client/src/requests/rfps.ts","webpack://halo/./app/client/src/requests/sponsors.ts","webpack://halo/./app/client/src/requests/universities.ts","webpack://halo/./app/client/src/requests/userFollowedRequests.tsx","webpack://halo/./app/client/src/requests/user_request_preferences.ts","webpack://halo/./app/client/src/requests/users.tsx","webpack://halo/./app/client/src/tsTypes/__generated__/enums/proposal_review_status.ts","webpack://halo/./app/client/src/tsTypes/__generated__/enums/user_request_preference_source.ts","webpack://halo/./app/client/src/tsTypes/proposals.ts","webpack://halo/./app/client/src/tsTypes/proposaly.ts","webpack://halo/./app/client/src/tsTypes/roles.ts","webpack://halo/./app/client/src/tsTypes/universityProfiles.ts","webpack://halo/./app/client/src/utils/authUtils.ts","webpack://halo/./app/client/src/utils/dateUtils.ts","webpack://halo/./app/client/src/utils/proposalyUtils.ts","webpack://halo/./app/client/src/utils/requestUtils.ts","webpack://halo/./app/client/src/utils/tsUtils.ts","webpack://halo/./app/client/src/utils/userUtils.ts","webpack://halo/./app/client/src/views/Marketplace/RespondToRequestsFilters.tsx","webpack://halo/./app/client/src/views/Marketplace/RespondToRequests.tsx","webpack://halo/./app/client/src/views/Marketplace/sharedFilterStyles.tsx","webpack://halo/./app/client/src/views/Onboarding/Step3/CompanyScientist.tsx","webpack://halo/./app/client/src/views/Onboarding/Step3/CompanySponsor.tsx","webpack://halo/./app/client/src/views/Onboarding/Step3/ResearchInstitutionAdmin.jsx","webpack://halo/./app/client/src/views/Onboarding/Step3/ResearchInstitutionScientist.tsx","webpack://halo/./app/client/src/views/Onboarding/Step3/Step3.jsx","webpack://halo/./app/client/src/views/Onboarding/StepStyles.tsx","webpack://halo/./app/client/src/views/RFPPage/AccessCode.tsx","webpack://halo/./app/client/src/views/RFPPage/BenefitCard.tsx","webpack://halo/./app/client/src/views/RFPPage/Benefits.tsx","webpack://halo/./app/client/src/components/library/Attachments/RequestAttachment.tsx","webpack://halo/./app/client/src/components/library/Attachments/RequestAttachmentsContainer.tsx","webpack://halo/./app/client/src/views/RFPPage/PreviewRfpPageBanner.tsx","webpack://halo/./app/client/src/components/modals/JoinWaitlistModal.tsx","webpack://halo/./app/client/src/views/RFPPage/AddToCalendarButton.tsx","webpack://halo/./app/client/src/views/RFPPage/RfpCta.tsx","webpack://halo/./app/client/src/views/RFPPage/RfpKeywordsContainer.tsx","webpack://halo/./app/client/src/views/RFPPage/AccessCodeBanner.tsx","webpack://halo/./app/client/src/views/RFPPage/RfpPage.tsx","webpack://halo/./app/client/src/views/StatusPages/404.tsx","webpack://halo/./app/client/src/views/StatusPages/StatusPage.tsx","webpack://halo/./app/client/src/views/UniversityTeam/UniversityTeamSearch.tsx","webpack://halo/./app/client/src/views/UniversityTeam/searchOptions.ts","webpack://halo/./app/client/src/tsTypes/companies.js.erb"],"sourcesContent":["import { SET_IS_ABSOLUTE, SET_SHOULD_SHOW_PRODUCT_TOURS } from \"@redux/actions/adminActions\";\nimport { Reducer } from \"redux\";\n\ninterface AdminReducer {\n shouldShowProductTours: boolean;\n isAbsolute: boolean;\n}\n\nconst initialState: AdminReducer = {\n shouldShowProductTours: false,\n isAbsolute: false,\n};\n\nconst adminReducer: Reducer<AdminReducer> = (state = initialState, action) => {\n switch (action.type) {\n case SET_SHOULD_SHOW_PRODUCT_TOURS:\n return {\n ...state,\n shouldShowProductTours: action.payload,\n };\n case SET_IS_ABSOLUTE:\n return {\n ...state,\n isAbsolute: action.payload,\n };\n default:\n return state;\n }\n};\n\nexport default adminReducer;\n","import { CompanyMember } from \"@tsTypes/index\";\nimport { ShowSubscription } from \"@tsTypes/subscriptions/show\";\nimport { Reducer } from \"redux\";\nimport {\n LOADING_MESSAGES,\n LOAD_COMPANY_MEMBERS,\n LOAD_PROPOSALS,\n LOAD_SUBSCRIPTION,\n LOAD_USER_FOLLOW,\n SET_COMPANY_MEMBERS,\n SET_MESSAGES,\n SET_PROPOSAL_AS_SEEN,\n SET_PROPOSAL_DASHBOARD_RFP,\n SET_SUBSCRIPTION,\n SET_USER_FOLLOW,\n SET_VIEW_AS_COMPANY_SUPER_ADMIN,\n} from \"../actions/companyActions\";\n\ninterface CompanyState {\n isLoadingSubscription: boolean;\n subscription: ShowSubscription | null;\n loadingProposals: boolean;\n proposals: any[];\n proposalDashboardRequest: any;\n userFollow: boolean;\n loadingUserFollow: boolean;\n researchAreaHeadline: string;\n researchAreaImageUrl: string;\n loadingCompanyMembers: boolean;\n companyMembers: CompanyMember[];\n loadingMessages: boolean;\n messages: any[];\n viewAsCompanySuperAdmin: boolean;\n}\n\nconst initialState: CompanyState = {\n isLoadingSubscription: false,\n subscription: null,\n loadingProposals: false,\n proposals: [],\n proposalDashboardRequest: {},\n userFollow: false,\n loadingUserFollow: false,\n researchAreaHeadline: \"\",\n researchAreaImageUrl: \"\",\n loadingCompanyMembers: false,\n companyMembers: [],\n loadingMessages: false,\n messages: [],\n viewAsCompanySuperAdmin: false,\n};\n\nconst companyReducer: Reducer<CompanyState> = (state = initialState, action) => {\n switch (action.type) {\n case LOAD_SUBSCRIPTION:\n return {\n ...state,\n isLoadingSubscription: true,\n };\n case SET_SUBSCRIPTION:\n return {\n ...state,\n subscription: action.payload,\n isLoadingSubscription: false,\n };\n case LOAD_USER_FOLLOW:\n return {\n ...state,\n loadingUserFollow: true,\n };\n case SET_USER_FOLLOW:\n return {\n ...state,\n userFollow: action.payload,\n loadingUserFollow: false,\n };\n case LOAD_PROPOSALS:\n return {\n ...state,\n loadingProposals: true,\n };\n case SET_PROPOSAL_DASHBOARD_RFP:\n return {\n ...state,\n proposalDashboardRequest: action.payload,\n };\n case LOAD_COMPANY_MEMBERS:\n return {\n ...state,\n loadingCompanyMembers: true,\n };\n case SET_COMPANY_MEMBERS:\n return {\n ...state,\n companyMembers: action.payload,\n loadingCompanyMembers: false,\n };\n case LOADING_MESSAGES:\n return {\n ...state,\n loadingMessages: true,\n };\n case SET_MESSAGES:\n return {\n ...state,\n loadingMessages: false,\n messages: action.payload,\n };\n case SET_VIEW_AS_COMPANY_SUPER_ADMIN:\n return {\n ...state,\n viewAsCompanySuperAdmin: action.payload,\n };\n case SET_PROPOSAL_AS_SEEN:\n return {\n ...state,\n proposals: state.proposals.map((p) => {\n if (p.id == action.payload.proposalId) {\n p.seen = true;\n\n const seen_by = p?.seen_by || [];\n\n const fullName =\n action.payload.currentUser?.first_name + \" \" + action.payload.currentUser?.last_name;\n\n if (seen_by.filter((name) => name.join(\" \") === fullName).length === 0) {\n p?.seen_by.push([\n action.payload.currentUser?.first_name,\n action.payload.currentUser?.last_name,\n ]);\n }\n\n return p;\n }\n return p;\n }),\n };\n default:\n return state;\n }\n};\n\nexport default companyReducer;\n","import {\n ADD_FILTER,\n LOADING_CURRENT_COMPANY,\n LOAD_CURRENT_RFP,\n LOAD_DELETE_COMPANY_INTEREST_PARTNER,\n REMOVE_FILTER,\n SEARCH_TERM,\n SET_COMPANIES,\n SET_COMPANY_INFO,\n SET_COMPANY_INTEREST,\n SET_COMPANY_LOGO,\n SET_COMPANY_VIDEO,\n SET_CURRENT_COMPANY,\n SET_FOLLOWED_REQUESTS_INFO,\n SET_FOUNDATIONS,\n SET_GOVERNMENT_ORGANIZATIONS,\n SET_INVITED_USERS,\n SET_LAST_VIEWED_RFP_IDENTIFIER,\n SET_LOAD_COMPANY_INFO,\n SET_LOAD_COMPANY_INTEREST,\n SET_LOAD_COMPANY_PARTNER,\n SET_LOAD_INVITED_USERS,\n SET_UNIVERSITY_TEAM_MEMBERS,\n SHOW_ERROR_BOUNDARY,\n UPDATE_CURRENT_RFP,\n UPDATE_RESULT_LIST,\n} from \"../actions/defaultActions\";\n\nconst initialState = {\n showErrorBoundary: false,\n filters: {},\n searchTerm: \"\",\n isUpdatingToggleRFP: {},\n isUpdatingFollowedCompanies: {},\n isUpdatingResearchFollows: false,\n followedRequestsInfo: [],\n followedCompanies: {},\n resultList: [],\n companies: [],\n foundations: [],\n government_organizations: [],\n currentCompany: {},\n currentRFP: {},\n loadingCurrentCompany: false,\n loadingCurrentRFP: false,\n loadingInvitedUsers: false,\n invitedUsers: [],\n universityTeamMembers: {},\n lastViewedRfpIdentifier: \"\",\n};\n\nconst defaultReducer = (state = initialState, action) => {\n switch (action.type) {\n case SHOW_ERROR_BOUNDARY:\n return {\n ...state,\n showErrorBoundary: action.payload,\n };\n case ADD_FILTER:\n const newFilters = state.filters[action.payload.filterType] || [];\n newFilters.push(action.payload.filterValue);\n return {\n ...state,\n filters: {\n ...state.filters,\n [action.payload.filterType]: Array.from(new Set(newFilters)),\n },\n };\n case REMOVE_FILTER:\n return {\n ...state,\n filters: {\n ...state.filters,\n [action.payload.filterType]: state.filters[action.payload.filterType].filter(\n (v) => v !== action.payload.filterValue\n ),\n },\n };\n case LOADING_CURRENT_COMPANY:\n return {\n ...state,\n loadingCurrentCompany: action.payload,\n };\n case SEARCH_TERM:\n return {\n ...state,\n searchTerm: action.payload,\n };\n case SET_FOLLOWED_REQUESTS_INFO:\n return {\n ...state,\n followedRequestsInfo: action.payload,\n };\n case UPDATE_RESULT_LIST:\n return {\n ...state,\n resultList: action.payload,\n };\n case UPDATE_CURRENT_RFP:\n return {\n ...state,\n currentRFP: action.payload,\n loadingCurrentRFP: false,\n };\n case LOAD_CURRENT_RFP:\n return {\n ...state,\n loadingCurrentRFP: true,\n };\n case SET_CURRENT_COMPANY:\n return {\n ...state,\n currentCompany: action.payload,\n };\n case SET_COMPANIES:\n return {\n ...state,\n companies: action.payload,\n };\n case SET_FOUNDATIONS:\n return {\n ...state,\n foundations: action.payload,\n };\n case SET_GOVERNMENT_ORGANIZATIONS:\n return {\n ...state,\n government_organizations: action.payload,\n };\n case SET_LOAD_COMPANY_PARTNER:\n return {\n ...state,\n loadingCompanyPartner: action.payload,\n };\n case SET_LOAD_COMPANY_INTEREST:\n return {\n ...state,\n loadingCompanyInterest: action.payload,\n };\n case SET_COMPANY_INTEREST:\n return {\n ...state,\n currentCompany: {\n ...state.currentCompany,\n company_research_interests: action.payload,\n },\n loadingCompanyInterest: false,\n };\n case SET_LOAD_COMPANY_INFO:\n return {\n ...state,\n loadingCompanyInfo: action.payload,\n };\n case SET_COMPANY_INFO:\n return {\n ...state,\n currentCompany: {\n ...state.currentCompany,\n location: action.payload.location,\n employee_count: action.payload.employee_count,\n rd_spend_amount: action.payload.rd_spend_amount,\n company_type: action.payload.company_type,\n description: action.payload.description,\n },\n loadingCompanyInfo: false,\n };\n case LOAD_DELETE_COMPANY_INTEREST_PARTNER:\n return {\n ...state,\n loadingDeleteCompanyInterestPartner: action.payload,\n };\n case SET_INVITED_USERS:\n return {\n ...state,\n invitedUsers: action.payload.invited_users,\n loadingInvitedUsers: false,\n };\n case SET_LOAD_INVITED_USERS:\n return {\n ...state,\n loadingInvitedUsers: action.payload,\n };\n case SET_UNIVERSITY_TEAM_MEMBERS:\n return {\n ...state,\n universityTeamMembers: action.payload,\n };\n case SET_COMPANY_LOGO:\n return {\n ...state,\n currentCompany: {\n ...state.currentCompany,\n logo: {\n url: action.payload,\n },\n },\n };\n case SET_COMPANY_VIDEO:\n return {\n ...state,\n currentCompany: {\n ...state.currentCompany,\n video: {\n url: action.payload,\n },\n },\n };\n case SET_LAST_VIEWED_RFP_IDENTIFIER:\n return {\n ...state,\n lastViewedRfpIdentifier: action.payload,\n };\n default:\n return state;\n }\n};\nexport default defaultReducer;\n","import _ from \"lodash\";\nimport {\n FINISH_DELETE_PROPOSAL,\n FINISH_FOLLOW_UNFOLLOW_COMPANY,\n LOADING_RESEARCH_INTEREST_FOLLOWS,\n LOAD_CURRENT_USER,\n LOAD_FUNDINGS,\n LOAD_PATENTS,\n LOAD_PUBLICATIONS,\n SET_CURRENT_USER,\n SET_FUNDINGS,\n SET_PATENTS,\n SET_PROPOSAL_EVAL,\n SET_PUBLICATIONS,\n SET_UNREAD_COUNT,\n START_DELETE_PROPOSAL,\n TOGGLE_LOGIN_MODAL,\n UPDATE_PROFILE_IMAGE,\n UPDATE_RESEARCH_INTEREST_FOLLOWS,\n} from \"../actions/profileActions\";\n\nconst initialState = {\n currentUser: {\n profile_info: {},\n },\n loadingCurrentUser: false,\n loadingPatents: false,\n loadingPublications: false,\n loadingFundings: false,\n loginModalOpen: false,\n loginModalLanding: \"signup\", // or \"login\"\n previousAction: \"\",\n currentPatentId: null,\n currentPublicationId: null,\n currentFundingId: null,\n patents: [],\n publications: [],\n fundings: [],\n loadingResearchInterestFollows: false,\n unreadCount: 0,\n proposalEval: {},\n};\n\nconst profileReducer = (state = initialState, action) => {\n let newObj;\n switch (action.type) {\n case SET_CURRENT_USER:\n return {\n ...state,\n currentUser: action.payload,\n loadingCurrentUser: false,\n };\n case LOAD_CURRENT_USER:\n return {\n ...state,\n loadingCurrentUser: true,\n };\n case SET_PUBLICATIONS:\n return {\n ...state,\n publications: action.payload,\n loadingPublications: false,\n };\n case LOAD_PUBLICATIONS:\n return {\n ...state,\n loadingPublications: true,\n };\n case SET_PATENTS:\n return {\n ...state,\n patents: action.payload,\n loadingPatents: false,\n };\n case LOAD_PATENTS:\n return {\n ...state,\n loadingPatents: true,\n };\n case SET_FUNDINGS:\n return {\n ...state,\n fundings: action.payload,\n loadingFundings: false,\n };\n case LOAD_FUNDINGS:\n return {\n ...state,\n loadingFundings: true,\n };\n case TOGGLE_LOGIN_MODAL:\n return {\n ...state,\n loginModalOpen: action.payload.open,\n previousAction: action.payload.previousAction,\n prePopulatedSignupEmail: action.payload.prePopulatedSignupEmail,\n loginModalLanding: action.payload.landing ?? \"signup\",\n };\n case START_DELETE_PROPOSAL:\n return {\n ...state,\n deletingProposal: true,\n };\n case FINISH_DELETE_PROPOSAL:\n newObj = _.merge({}, state);\n if (action.payload && action.payload.proposalId) {\n newObj.currentUser.proposals = _.filter(\n newObj.currentUser.proposals,\n (p) => p.id !== action.payload.proposalId\n );\n }\n return {\n ...newObj,\n deletingProposal: false,\n };\n case FINISH_FOLLOW_UNFOLLOW_COMPANY:\n return {\n ...state,\n currentUser: {\n ...state.currentUser,\n profile_info: {\n ...state.currentUser.profile_info,\n followed_companies_info: action.payload.isFollowing\n ? [...state.currentUser.profile_info.followed_companies_info, action.payload.company]\n : state.currentUser.profile_info.followed_companies_info.filter(\n (company) => company.id !== action.payload.company.id\n ),\n },\n },\n };\n case LOADING_RESEARCH_INTEREST_FOLLOWS:\n return {\n ...state,\n loadingResearchInterestFollows: action.payload,\n };\n case UPDATE_RESEARCH_INTEREST_FOLLOWS:\n return {\n ...state,\n currentUser: {\n ...state.currentUser,\n profile_info: {\n ...state.currentUser.profile_info,\n followed_research_interests: action.payload,\n },\n },\n loadingResearchInterestFollows: false,\n };\n case SET_UNREAD_COUNT:\n return {\n ...state,\n unreadCount: action.payload,\n };\n case SET_PROPOSAL_EVAL:\n return {\n ...state,\n proposalEval: action.payload,\n };\n case UPDATE_PROFILE_IMAGE:\n return {\n ...state,\n currentUser: {\n ...state.currentUser,\n image: action.payload,\n },\n };\n default:\n return state;\n }\n};\nexport default profileReducer;\n","import { UPDATE_WINDOW_DIMENSION } from \"../actions/windowDimensionsActions\";\n\nconst initialState = {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollPercent: 0,\n};\n\nexport const windowDimensionReducer = (state = initialState, action) => {\n switch (action.type) {\n case UPDATE_WINDOW_DIMENSION:\n return {\n ...state,\n ...action.payload,\n };\n default:\n return state;\n }\n};\n\nexport default windowDimensionReducer;\n","import adminReducer from \"./adminReducer\";\nimport companyReducer from \"./companyReducer\";\nimport defaultReducer from \"./defaultReducer\";\nimport messengerReducer from \"./messengerReducer\";\nimport profileReducer from \"./profileReducer\";\nimport windowDimensionsReducer from \"./windowDimensionsReducer\";\n\nexport default {\n defaultReducer,\n profileReducer,\n messengerReducer,\n companyReducer,\n windowDimensionsReducer,\n adminReducer,\n};\n","import { combineReducers } from \"redux\";\nimport { PersistConfig, persistReducer } from \"redux-persist\";\nimport storage from \"redux-persist/lib/storage\";\n\nimport reducers from \"./reducers\";\n\nconst {\n defaultReducer,\n profileReducer,\n companyReducer,\n windowDimensionsReducer,\n messengerReducer,\n adminReducer,\n} = reducers;\n\nconst defaultConfig = {\n key: \"defaultReducer\",\n storage: storage,\n blacklist: [\"filters\", \"searchTerm\", \"researchFollows\"],\n};\n\nconst profilesConfig = {\n key: \"profileReducer\",\n storage: storage,\n whitelist: [\"currentUser\"],\n};\n\nconst messengerConfig: PersistConfig<any> = {\n key: \"messengerReducer\",\n storage: storage,\n};\n\nconst rootReducer = combineReducers({\n defaultReducer: persistReducer(defaultConfig, defaultReducer),\n profiles: persistReducer(profilesConfig, profileReducer),\n messenger: persistReducer(messengerConfig, messengerReducer),\n company: companyReducer,\n window: windowDimensionsReducer,\n admin: adminReducer,\n});\n\n// Redux persist\nconst persistConfig = {\n key: \"root\",\n storage,\n blacklist: [\"defaultReducer\", \"profiles\", \"window\", \"company\"],\n};\n\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\n\nexport default persistedReducer;\n","import { applyMiddleware, compose, createStore } from \"redux\";\nimport { persistStore } from \"redux-persist\";\nimport thunkMiddleware from \"redux-thunk\";\n\nimport rootReducer from \"./rootReducer\";\n\n// Redux DevTools\nconst composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\nconst enhancer = composeEnhancers(applyMiddleware(thunkMiddleware));\n\nexport const store = createStore(rootReducer, enhancer);\n\n(window as any).store = store;\n\nexport const persistor = persistStore(store);\n\nexport type RootState = ReturnType<typeof store.getState>;\nexport type AppDispatch = typeof store.dispatch;\n","// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file,\n// like app/views/layouts/application.html.erb. All it does is render <div>Hello React</div> at the bottom\n// of the page.\n\nimport ReactDOM from \"react-dom\";\nimport { Provider } from \"react-redux\";\nimport { withRouter } from \"react-router\";\nimport { Route, BrowserRouter as Router } from \"react-router-dom\";\nimport { PersistGate } from \"redux-persist/integration/react\";\nimport { Container, Loader } from \"semantic-ui-react\";\n\nimport App from \"../src/App\";\nimport { persistor, store } from \"../src/redux/store\";\n\nconst LoaderContainer = () => (\n <Container textAlign=\"center\">\n <Loader />\n </Container>\n);\n\nconst Root = () => (\n <Provider store={store}>\n <PersistGate loading={<LoaderContainer />} persistor={persistor}>\n <Router onUpdate={() => window.scrollTo(0, 0)}>\n <Route path=\"/:filter?\" component={withRouter(App)} />\n </Router>\n </PersistGate>\n </Provider>\n);\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n ReactDOM.render(<Root />, document.getElementById(\"full-container\"));\n});\n","import { BlankModal, Checkbox, TextButton } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { setIsAbsolute, setShouldShowProductTours } from \"@redux/actions/adminActions\";\nimport { RootState } from \"@redux/store\";\nimport { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\nexport default function MasqueradeBar() {\n const [isOptionsOpen, setIsOptionsOpen] = useState(false);\n const [requiresRefresh, setRequiresRefresh] = useState(false);\n\n const dispatch = useDispatch();\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const shouldShowProductTours = useSelector(\n (state: RootState) => state.admin.shouldShowProductTours\n );\n const isAbsolute = useSelector((state: RootState) => state.admin.isAbsolute);\n\n return (\n <>\n <BlankModal\n isOpen={isOptionsOpen}\n onClose={() => setIsOptionsOpen(false)}\n width=\"400px\"\n headerText=\"Masquerade options\"\n subHeaderText=\"Changes are applied immediately.\"\n >\n <ModalContent>\n <Checkbox\n label=\"Absolute positioning\"\n size=\"sm\"\n isChecked={isAbsolute}\n onChange={(e) => {\n dispatch(setIsAbsolute(e.target.checked));\n }}\n />\n <Checkbox\n label=\"Show product tours\"\n size=\"sm\"\n isChecked={shouldShowProductTours}\n onChange={(e) => {\n dispatch(setShouldShowProductTours(e.target.checked));\n setRequiresRefresh(true);\n }}\n />\n {requiresRefresh && (\n <TextButton\n size=\"sm\"\n text=\"Requires refresh. Click here to refresh.\"\n iconName=\"Refresh\"\n color={COLORS.HALO_BLUE}\n onClick={() => window.location.reload()}\n />\n )}\n </ModalContent>\n </BlankModal>\n <Container\n position={isAbsolute ? \"absolute\" : \"\"}\n background={gon.global?.env === \"production\" ? COLORS.RED : COLORS.HALO_BLUE}\n >\n Masquerading as {currentUser.first_name} {currentUser.last_name} (ID: {currentUser.id})\n <div>|</div>\n <a href={gon.back_masquerade_path}>\n <TextButton\n size=\"sm\"\n text=\"Return to your main user\"\n color={COLORS.WHITE}\n iconName=\"Open in a new tab\"\n />\n </a>\n <div>|</div>\n <TextButton\n size=\"sm\"\n text=\"Open options\"\n color={COLORS.WHITE}\n iconName={null}\n onClick={() => setIsOptionsOpen(true)}\n />\n </Container>\n </>\n );\n}\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 20px;\n\n width: 100%;\n z-index: 100000;\n text-align: center;\n\n background: ${({ background }) => background};\n color: white;\n\n position: ${({ position }) => position};\n top: 0;\n\n ${FONTS.SEMIBOLD_3};\n`;\n\nconst ModalContent = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n`;\n","import {\n Icon,\n IconButton,\n MoreActionsDropdown,\n MultiUserPreview,\n Thumbnail,\n UserPreview,\n} from \"@components/library\";\nimport type { ExtendedDropdownOption } from \"@components/library/Dropdowns/DropdownOption\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport {\n clearMessengerState,\n setHasUnreadMessage,\n setIsMessengerExpanded,\n setIsMessengerMinimized,\n setIsMessengerOpen,\n} from \"@redux/actions/messengerActions\";\nimport { InboxMessageThread, MessageRecipient } from \"@tsTypes/index\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport { batch, useDispatch } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport styled, { css } from \"styled-components\";\n\ninterface Props {\n recipient: MessageRecipient;\n messengerThread?: InboxMessageThread;\n proposalTitle?: string | null;\n isMessengerMinimized: boolean;\n isMessengerExpanded: boolean;\n hasUnreadMessage: boolean;\n setIsParticipantsModalOpen: Dispatch<SetStateAction<boolean>>;\n}\n\nconst MessengerHeader = ({\n recipient,\n proposalTitle,\n isMessengerMinimized,\n messengerThread,\n isMessengerExpanded,\n hasUnreadMessage,\n setIsParticipantsModalOpen,\n}: Props) => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const toggleMinimizeMessenger = () => {\n // if user opens messenger mark as read\n if (isMessengerMinimized) dispatch(setHasUnreadMessage(false));\n // reduce size of messenger window if minimized\n if (isMessengerExpanded) dispatch(setIsMessengerExpanded(false));\n dispatch(setIsMessengerMinimized(!isMessengerMinimized));\n };\n\n const handleCloseMessenger = (e: Event) => {\n e.stopPropagation();\n batch(() => {\n dispatch(setIsMessengerOpen(false));\n dispatch(clearMessengerState());\n });\n };\n\n const noThreadMoreActionsOptions: ExtendedDropdownOption[] = [\n {\n // expand if reduced and reduce if expanded\n value: \"EXPAND_OR_REDUCE\",\n label: isMessengerExpanded ? \"Reduce\" : \"Expand\",\n onSelect: () => dispatch(setIsMessengerExpanded(!isMessengerExpanded)),\n iconName: isMessengerExpanded ? \"Reduce\" : \"Expand\",\n },\n {\n value: \"VIEW_PROFILE\",\n label: `Visit ${recipient.name}'s profile`,\n onSelect: () => history.push(`/profile/${recipient.profile_id}`),\n iconName: \"Profile\",\n },\n ];\n const moreActionsOptions: ExtendedDropdownOption[] = [\n ...noThreadMoreActionsOptions,\n {\n value: \"OPEN_IN_INBOX\",\n label: \"Open in Inbox\",\n onSelect: () => history.push(`/inbox?thread_id=${messengerThread?.id}`),\n iconName: \"Open in a new tab\",\n },\n {\n value: \"WHO_CAN_SEE_THIS_CONVERSATION\",\n label: `Who can see this conversation`,\n onSelect: () => setIsParticipantsModalOpen(true),\n iconName: \"Employees\",\n },\n ];\n\n let participants;\n if (!messengerThread) {\n participants = [recipient];\n } else if (\"proposal\" in messengerThread) {\n participants = [\n messengerThread.scientist_user,\n ...((\"company_members\" in messengerThread && messengerThread.company_members) || []),\n ];\n } else {\n participants = messengerThread.recipients;\n }\n\n const IS_SINGLE_PARTICIPANT = participants.length <= 2;\n\n const userPreview = IS_SINGLE_PARTICIPANT ? (\n <UserPreview size=\"sm\" user={recipient} />\n ) : (\n <MultiUserPreview users={participants} />\n );\n\n return (\n <HeaderContainer\n isMessengerMinimized={isMessengerMinimized}\n onClick={isMessengerMinimized ? toggleMinimizeMessenger : undefined}\n >\n {isMessengerMinimized ? (\n <FlexContainer>\n <Thumbnail size=\"sm\" users={participants} single={IS_SINGLE_PARTICIPANT} />\n {IS_SINGLE_PARTICIPANT && (\n <Name hasUnreadMessage={hasUnreadMessage}>{recipient.name}</Name>\n )}\n {hasUnreadMessage && <UnreadDot />}\n </FlexContainer>\n ) : (\n <div>\n {userPreview}\n {proposalTitle && (\n <ProposalTitleContainer isMulti={!IS_SINGLE_PARTICIPANT}>\n <Icon name=\"Proposal\" size=\"sm\" margin=\"0 4px 0 0\" color={COLORS.NEUTRAL_500} />\n <ProposalTitle>{proposalTitle}</ProposalTitle>\n </ProposalTitleContainer>\n )}\n </div>\n )}\n <IconContainer>\n {!isMessengerMinimized && (\n <>\n <MoreActionsDropdown\n options={messengerThread ? moreActionsOptions : noThreadMoreActionsOptions}\n menuHorizontalPosition=\"right\"\n >\n <IconButton size=\"xs\" variant=\"fourth\" iconName=\"More Actions\" tooltipWidth=\"100px\" />\n </MoreActionsDropdown>\n <IconButton\n iconName=\"Minimize\"\n size=\"xs\"\n variant=\"fourth\"\n onClick={toggleMinimizeMessenger}\n />\n </>\n )}\n <IconButton\n iconName=\"Close\"\n size=\"xs\"\n variant=\"fourth\"\n onClick={handleCloseMessenger}\n data-testid=\"close-button\"\n />\n </IconContainer>\n </HeaderContainer>\n );\n};\n\nexport default MessengerHeader;\n\nconst HeaderContainer = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n position: relative;\n padding: ${({ isMessengerMinimized }) => (isMessengerMinimized ? \"8px\" : \"12px 8px 12px 12px\")};\n border: 0px solid ${COLORS.NEUTRAL_200};\n box-shadow: 0px 4px 3px -2px rgba(0, 115, 200, 0.1);\n border-radius: 12px 12px 0px 0px;\n ${({ isMessengerMinimized }) =>\n isMessengerMinimized &&\n css`\n &:hover {\n background: ${COLORS.NEUTRAL_50};\n cursor: pointer;\n }\n `}\n`;\n\nconst IconContainer = styled.div`\n display: flex;\n height: 24px;\n`;\n\nconst FlexContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Name = styled.div`\n width: max-content;\n max-width: ${({ hasUnreadMessage }) => (hasUnreadMessage ? \"93px\" : \"115px\")};\n margin-left: 8px;\n color: ${COLORS.BLACK};\n ${FONTS.TAG_SEMIBOLD_1};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst UnreadDot = styled.div`\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: ${COLORS.RED};\n margin-left: 8px;\n`;\nconst ProposalTitleContainer = styled.div`\n display: flex;\n margin-left: ${({ isMulti }) => (isMulti ? \"60\" : \"44\")}px;\n margin-top: 8px;\n`;\nconst ProposalTitle = styled.div`\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.MEDIUM_3};\n ${STYLES.ONE_LINE}\n`;\n","import { BlankModal } from \"@components/library\";\nimport styled from \"styled-components\";\nimport Participants from \"./Conversation/Participants\";\n\nconst ParticipantsInfoModal = ({ messengerThread, isOpen, closeModal }) => {\n return (\n <BlankModal\n isOpen={isOpen}\n onClose={closeModal}\n headerText=\"Who can see this conversation\"\n width=\"540px\"\n height=\"534px\"\n disableBackgroundScroll={false}\n >\n <Container>\n <Participants currentThread={messengerThread} isModal={true} />\n </Container>\n </BlankModal>\n );\n};\n\nexport default ParticipantsInfoModal;\n\nconst Container = styled.div`\n padding: 20px;\n min-height: 450px;\n display: flex;\n flex-direction: column;\n`;\n","import Conversation from \"@components/Messenger/Conversation\";\nimport { COLORS, STYLES } from \"@constants\";\nimport {\n fetchCurrentThreadByParticipants,\n fetchCurrentThreadByProposal,\n} from \"@redux/actions/messengerActions\";\nimport { RootState } from \"@redux/store\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Action } from \"redux\";\nimport { ThunkDispatch } from \"redux-thunk\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\nimport MessengerHeader from \"./MessengerHeader\";\nimport ParticipantsInfoModal from \"./ParticipantsInfoModal\";\n\nconst Messenger = () => {\n const [isParticipantsModalOpen, setIsParticipantsModalOpen] = useState(false);\n\n const dispatch = useDispatch<ThunkDispatch<any, any, Action>>();\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const messengerData = useSelector((state: RootState) => state.messenger.messengerData);\n const isMessengerOpen = useSelector((state: RootState) => state.messenger.isMessengerOpen);\n const isMessengerThreadLoading = useSelector(\n (state: RootState) => state.messenger.isMessengerThreadLoading\n );\n const isMessengerMinimized = useSelector(\n (state: RootState) => state.messenger.isMessengerMinimized\n );\n const isMessengerExpanded = useSelector(\n (state: RootState) => state.messenger.isMessengerExpanded\n );\n const hasUnreadMessage = useSelector((state: RootState) => state.messenger.hasUnreadMessage);\n const messengerThread = useSelector((state: RootState) => state.messenger.messengerThread);\n const messengerOffsetRight = useSelector(\n (state: RootState) => state.messenger.messengerOffsetRight\n );\n\n useEffect(() => {\n (async () => {\n if (!messengerData.recipient) return;\n\n const userId: number = messengerData.recipient.id;\n const { proposalyId, proposalyType } = messengerData;\n\n if (proposalyId && proposalyType) {\n await dispatch(fetchCurrentThreadByProposal(userId, proposalyType, proposalyId));\n } else {\n await dispatch(fetchCurrentThreadByParticipants(currentUser.id, userId));\n }\n })();\n }, [messengerData]);\n\n if (!isMessengerOpen) return null;\n\n if (isMessengerThreadLoading && isMessengerOpen) {\n return (\n <MessengerContainer\n isMessengerMinimized={isMessengerMinimized}\n messengerOffsetRight={messengerOffsetRight}\n >\n <Loader active inline=\"centered\" style={{ margin: \"auto\" }} />\n </MessengerContainer>\n );\n }\n\n return (\n <>\n <ParticipantsInfoModal\n messengerThread={messengerThread}\n isOpen={isParticipantsModalOpen}\n closeModal={() => setIsParticipantsModalOpen(false)}\n />\n <MessengerContainer\n isMessengerMinimized={isMessengerMinimized}\n isMessengerExpanded={isMessengerExpanded}\n messengerOffsetRight={messengerOffsetRight}\n data-testid=\"messenger\"\n >\n <MessengerHeader\n recipient={messengerData?.recipient}\n proposalTitle={messengerData?.proposalTitle}\n isMessengerMinimized={isMessengerMinimized}\n messengerThread={messengerThread}\n isMessengerExpanded={isMessengerExpanded}\n hasUnreadMessage={hasUnreadMessage}\n setIsParticipantsModalOpen={setIsParticipantsModalOpen}\n />\n <ConversationContainer>\n <Conversation currentThread={messengerThread} />\n </ConversationContainer>\n </MessengerContainer>\n </>\n );\n};\n\nexport default Messenger;\n\nconst MessengerContainer = styled.div`\n display: flex;\n flex-direction: ${({ isMessengerMinimized }) => (isMessengerMinimized ? \"row\" : \"column\")};\n background: ${COLORS.WHITE};\n border: 1px solid ${COLORS.NEUTRAL_200};\n box-shadow: ${STYLES.SHADOW_C};\n border-radius: 12px 12px 0px 0px;\n width: ${({ isMessengerMinimized, isMessengerExpanded }) => {\n if (isMessengerMinimized) {\n return \"216px\";\n }\n if (isMessengerExpanded) {\n return \"600px\";\n }\n return \"426px\";\n }};\n height: ${({ isMessengerMinimized, isMessengerExpanded }) => {\n if (isMessengerMinimized) {\n return \"52px\";\n }\n if (isMessengerExpanded) {\n return \"725px\";\n }\n return \"570px\";\n }};\n position: fixed;\n max-height: calc(100% - 115px);\n right: calc(0% + ${({ messengerOffsetRight }) => messengerOffsetRight}px);\n bottom: 0px;\n z-index: 500;\n margin-left: 16px;\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 167ms;\n transition-property: width, height;\n transition: right 0.25s ease-out;\n`;\nconst ConversationContainer = styled.div`\n overflow: hidden;\n position: relative;\n flex: 1 0 0px;\n display: flex;\n height: 266px;\n`;\n","import { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nimport { Button } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\n\nimport macbook from \"src/views/AboutUs/images/macbook.png\";\n\ninterface Props {\n breakpoint: string;\n children: any;\n}\n\nconst MobileRestricted = ({ breakpoint, children }: Props) => {\n return (\n <Controller breakpoint={breakpoint}>\n <Children>{children}</Children>\n <Restriction>\n <Image src={macbook} alt=\"Marketplace\" />\n <Text>\n Access Halo on a larger screen\n <br />\n to enjoy the full experience\n </Text>\n <Link to=\"/\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"md\"\n iconName=\"Arrow Right\"\n iconPosition=\"right\"\n >\n Go home\n </Button>\n </Link>\n </Restriction>\n </Controller>\n );\n};\n\nexport default MobileRestricted;\n\nconst Children = styled.div``;\n\nconst Restriction = styled.div``;\n\nconst Controller = styled.div`\n ${Children} {\n display: unset;\n }\n ${Restriction} {\n display: none;\n }\n @media screen and (max-width: ${({ breakpoint }) => breakpoint}) {\n ${Children} {\n display: none;\n }\n ${Restriction} {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 15vh;\n gap: 40px;\n }\n }\n`;\n\nconst Image = styled.img`\n width: 333px;\n`;\n\nconst Text = styled.div`\n ${FONTS.REGULAR_1}\n color: ${COLORS.NEUTRAL_500};\n text-align: center;\n`;\n","import MobileRestricted from \"./MobileRestricted\";\n\nexport default MobileRestricted;\n","import { RootState } from \"@redux/store\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { useSelector } from \"react-redux\";\nimport { Route } from \"react-router-dom\";\n\nconst PrivateRoute = ({ ...props }) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n if (!currentUser.id) {\n setPrevUrlCookie(window.location.href);\n window.location.href = \"/login\";\n }\n\n return currentUser.id ? <Route {...props} /> : null;\n};\n\nexport default PrivateRoute;\n","import { RootState } from \"@redux/store\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { useSelector } from \"react-redux\";\nimport { Redirect } from \"react-router-dom\";\nimport { USER_ROLES } from \"src/constants/users\";\nimport PrivateRoute from \"./PrivateRoute\";\n\nconst PrivateSponsorRoute = ({ ...props }) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n if (!currentUser.id) {\n setPrevUrlCookie(window.location.href);\n window.location.href = \"/login\";\n }\n\n if (currentUser.role !== USER_ROLES.sponsor) {\n console.warn(\"User %o attempted to access sponsor-only route.\", currentUser);\n return <Redirect to=\"/403\" />;\n }\n\n return <PrivateRoute {...props} />;\n};\n\nexport default PrivateSponsorRoute;\n","import { Button } from \"@components/library\";\nimport BlankModal, { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { t } from \"@utils/i18n\";\nimport { Dispatch, SetStateAction, useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Link, useHistory, useLocation } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\ninterface Props extends BlankModalProps {\n setIsSubscriptionEndedModalOpen: Dispatch<SetStateAction<boolean>>;\n bannerMessage: string;\n}\n\nconst BLOCKED_PATHS = [\"/proposal_library\"];\nconst EXTENDED_ACCESS_PATHS = [\"/review_system\", \"/proposal\"];\n\nconst SubscriptionEndedModal = ({\n isOpen,\n onClose,\n setIsSubscriptionEndedModalOpen,\n bannerMessage,\n}: Props) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const subscription = useSelector((state: RootState) => state.company.subscription);\n\n const { pathname } = useLocation();\n const history = useHistory();\n\n const isBlockedPage =\n BLOCKED_PATHS.includes(pathname) ||\n (!subscription?.has_extension &&\n EXTENDED_ACCESS_PATHS.some((path) => pathname.startsWith(path)));\n\n useEffect(() => {\n setIsSubscriptionEndedModalOpen(isBlockedPage);\n }, [isBlockedPage]);\n\n return (\n <BlankModal\n isOpen={isOpen}\n onClose={onClose}\n hideCloseButton={isBlockedPage}\n closeOnDimmerClick={!isBlockedPage}\n backgroundMode=\"blur\"\n >\n <Container>\n <Title>{bannerMessage}</Title>\n {t([\n \"components.subscription_warning.modal\",\n currentUser.role === UserRole.SPONSOR ? \"sponsor\" : \"expert\",\n ])}\n <Buttons>\n {currentUser.profile_info.is_admin && (\n <Link to={\"/contact\"} target=\"_blank\">\n <Button type=\"button\">{t(\"components.subscription_warning.cta\")}</Button>\n </Link>\n )}\n {isBlockedPage && (\n <Button\n variant={currentUser.profile_info.is_admin ? \"secondary\" : \"primary\"}\n onClick={() => history.push(\"/reviewer_dashboard\")}\n >\n Go to dashboard\n </Button>\n )}\n </Buttons>\n </Container>\n </BlankModal>\n );\n};\n\nexport default SubscriptionEndedModal;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n color: ${COLORS.BLACK};\n padding: 60px 60px 48px;\n ${FONTS.REGULAR_1};\n`;\nconst Title = styled.div`\n ${FONTS.HEADING_4_SEMIBOLD};\n margin-bottom: 20px;\n`;\nconst Buttons = styled.div`\n display: flex;\n gap: 32px;\n margin: 32px auto 0;\n`;\n","import { Button, Icon } from \"@components/library\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { daysUntilDate } from \"@utils/dateUtils\";\nimport { t } from \"@utils/i18n\";\nimport dayjs from \"dayjs\";\nimport { useEffect, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport SubscriptionEndedModal from \"./SubscriptionEndedModal\";\n\nconst { TABLET_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nconst SUBSCRIPTION_ENDING_WARNING_DAYS = 60;\n\nconst SubscriptionWarning = () => {\n const [isSubscriptionEndedModalOpen, setIsSubscriptionEndedModalOpen] = useState(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const subscription = useSelector((state: RootState) => state.company.subscription);\n\n const daysUntilSubscriptionEnds = daysUntilDate(subscription?.end_at);\n\n useEffect(() => {\n setIsSubscriptionEndedModalOpen(daysUntilSubscriptionEnds < 0);\n }, [daysUntilSubscriptionEnds]);\n\n if (\n !subscription?.end_at ||\n daysUntilSubscriptionEnds > SUBSCRIPTION_ENDING_WARNING_DAYS ||\n subscription?.has_upcoming_subscription\n )\n return null;\n\n const isAdmin = currentUser.profile_info.is_admin;\n const bannerMessage = t(\n [\n \"components.subscription_warning\",\n daysUntilSubscriptionEnds < 0 ? \"ended\" : \"ending_soon\",\n isAdmin ? \"admin\" : \"non_admin\",\n ],\n {\n subscriptionEndDate: dayjs(subscription?.end_at).format(\"MMMM D, YYYY\"),\n }\n );\n\n return (\n <>\n {daysUntilSubscriptionEnds < 0 && (\n <SubscriptionEndedModal\n isOpen={isSubscriptionEndedModalOpen}\n onClose={() => setIsSubscriptionEndedModalOpen(false)}\n setIsSubscriptionEndedModalOpen={setIsSubscriptionEndedModalOpen}\n bannerMessage={bannerMessage}\n />\n )}\n <SubscriptionEndBanner>\n <Icon name=\"Attention\" size=\"lg\" color={COLORS.WHITE} margin=\"0 5px 0 0\" />\n {bannerMessage}\n {isAdmin && (\n <Link to={\"/contact\"} target=\"_blank\" style={{ backgroundColor: COLORS.WHITE }}>\n <Button type=\"button\" variant=\"destructive-ghost\" size=\"sm\">\n {t(\"components.subscription_warning.cta\")}\n </Button>\n </Link>\n )}\n </SubscriptionEndBanner>\n </>\n );\n};\n\nconst SubscriptionEndBanner = styled.div`\n display: flex;\n align-items: center;\n height: 60px;\n width: 100%;\n margin: 0px;\n padding: 0 ${WINDOW_DIMENSIONS.PAGE_SIDE_PADDING}px;\n background-color: ${COLORS.RED};\n color: ${COLORS.WHITE};\n ${FONTS.REGULAR_2};\n\n & > a {\n margin-left: auto;\n }\n\n ${TABLET_MEDIA_QUERY} {\n width: 100%;\n height: 80px;\n left: 0;\n padding: 0 18px;\n }\n`;\n\nexport default SubscriptionWarning;\n","import { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nimport toast from \"@components/Toast\";\nimport { Button } from \"@components/library\";\nimport KeywordsDropdown from \"@components/library/Dropdowns/KeywordsDropdown/KeywordsDropdown\";\nimport BlankModal, { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { setCurrentUser } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { skipUpdateUserKeywords, updateUserKeywords } from \"@requests/users\";\nimport { UserRole } from \"@tsTypes/users\";\n\nconst TaxonomyUpdateModal = ({ isOpen, onClose }: BlankModalProps) => {\n if (!isOpen) return null;\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const dispatch = useDispatch();\n\n const [disciplines, setDisciplines] = useState<string[]>(currentUser.disciplines);\n const [areasOfExpertise, setAreasOfExpertise] = useState<string[]>(\n currentUser.areas_of_expertise\n );\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const onSkip = () => {\n try {\n skipUpdateUserKeywords(currentUser.id);\n } catch (err) {\n console.error(err);\n }\n onClose();\n toast.success(\n <p>\n You can always update your expertise in{\" \"}\n <Link to=\"/account\" style={{ textDecoration: \"underline\", color: \"white\" }}>\n Account Settings\n </Link>\n .\n </p>\n );\n };\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n setIsSubmitting(true);\n try {\n const response = await updateUserKeywords(currentUser.id, {\n disciplines,\n areasOfExpertise,\n });\n if (response.data.success) {\n dispatch(\n setCurrentUser({\n ...currentUser,\n disciplines,\n areas_of_expertise: areasOfExpertise,\n has_updated_taxonomy: true,\n })\n );\n onClose();\n }\n } catch (err) {\n console.error(err);\n }\n setIsSubmitting(false);\n };\n\n const header =\n currentUser.role === 0\n ? `${currentUser.first_name}, it's time for a keyword checkup`\n : `${currentUser.first_name}, what is your expertise?`;\n const title =\n currentUser.role === 0\n ? \"We made some changes to our taxonomy\"\n : `We want to help R&D teams collaborate, and we made some changes to our taxonomy`;\n const text =\n currentUser.role === 0\n ? \"Please take a second and update your keywords so we can better recommend opportunities that will interest you.\"\n : `Please take a second and add or update relevant keywords to your profile so R&D teams across ${\n currentUser.profile_info?.company_name ?? \"your company\"\n } can find you.`;\n\n return (\n <BlankModal\n width=\"600px\"\n isOpen={isOpen}\n onClose={onClose}\n hideCloseButton={true}\n closeOnDimmerClick={false}\n disableBackgroundScroll={true}\n headerText={header}\n >\n <form onSubmit={handleSubmit}>\n <Content>\n <Title>{title}</Title>\n <Text>{text}</Text>\n {currentUser.role === UserRole.SCIENTIST && (\n <>\n <Label>Which disciplines are most relevant to your work?</Label>\n <KeywordsDropdown\n keywordType=\"discipline\"\n targetType=\"scientist\"\n value={disciplines}\n onChange={setDisciplines}\n isPortal\n />\n </>\n )}\n <Label>What is your expertise?</Label>\n <KeywordsDropdown\n keywordType=\"area_of_expertise\"\n targetType={currentUser.role === UserRole.SCIENTIST ? \"scientist\" : \"sponsor\"}\n value={areasOfExpertise}\n onChange={setAreasOfExpertise}\n isPortal\n />\n </Content>\n <Footer>\n <div>{currentUser.role === 1 && <SkipLink onClick={onSkip}>Skip for now</SkipLink>}</div>\n <Button\n size=\"md\"\n disabled={\n isSubmitting ||\n (currentUser.role === 0 && (!disciplines.length || !areasOfExpertise.length)) ||\n (currentUser.role === 1 && !areasOfExpertise.length)\n }\n >\n Update\n </Button>\n </Footer>\n </form>\n </BlankModal>\n );\n};\n\nexport default TaxonomyUpdateModal;\n\nconst Content = styled.div`\n padding: 20px;\n`;\n\nconst Footer = styled.div`\n padding: 16px 20px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 16px;\n border-top: 1px solid ${COLORS.NEUTRAL_300};\n`;\n\nconst Title = styled.div`\n ${FONTS.SEMIBOLD_1}\n`;\n\nconst Text = styled.div`\n ${FONTS.REGULAR_1}\n`;\n\nconst Label = styled.div`\n ${FONTS.MEDIUM_2}\n margin: 40px 0 8px;\n`;\nconst SkipLink = styled.a`\n ${FONTS.REGULAR_2}\n color: ${COLORS.NEUTRAL_500};\n text-decoration: underline;\n margin-top: -0.5em;\n\n &:hover {\n color: ${COLORS.BLACK};\n cursor: pointer;\n }\n`;\n","import TaxonomyUpdateModal from \"./TaxonomyUpdateModal\";\nexport default TaxonomyUpdateModal;\n","import { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\nimport { COLORS, FONTS } from \"@constants\";\nimport { fetchCurrentUser } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getCompany } from \"@requests/companies\";\nimport { updateUserKeywords, updateUserProfile } from \"@requests/users\";\nimport { SponsorRole } from \"@tsTypes/sponsorProfiles\";\nimport { getOptionFromValue } from \"@utils/dropdownUtils\";\nimport { USER_ROLES } from \"src/constants/users\";\n\nimport { BlankModal, Button, SingleSelectDropdown, TextButton } from \"@components/library\";\nimport { DropdownOption } from \"@components/library/Dropdowns/DropdownOption\";\nimport KeywordsDropdown from \"@components/library/Dropdowns/KeywordsDropdown/KeywordsDropdown\";\nimport { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\n\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport { sponsorOnboarded } from \"@requests/hubspot\";\nimport { ShowCompany } from \"@tsTypes/index\";\nimport appsignal from \"@utils/appsignal\";\nimport { t } from \"@utils/i18n\";\n\nconst SPONSOR_ROLES_DROPDOWN_OPTIONS = Object.values(SponsorRole).map(\n getOptionFromValue\n) as DropdownOption[];\n\nconst SSOSponsorOnboardingModal = ({ isOpen, onClose }: BlankModalProps) => {\n const dispatch = useDispatch();\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const isCommenter = currentUser.profile_info.commenter;\n\n const [step, setStep] = useState<1 | 2>(1);\n const [company, setCompany] = useState<ShowCompany>({} as ShowCompany);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const [title, setTitle] = useState(currentUser.profile_info.title);\n const [role, setRole] = useState(currentUser.profile_info.role);\n const [areasOfExpertise, setAreasOfExpertise] = useState<string[]>(\n currentUser.areas_of_expertise\n );\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n setIsSubmitting(true);\n\n try {\n if (step === 1) {\n await updateUserProfile(currentUser.id, USER_ROLES.sponsor, {\n ...currentUser.profile_info,\n title,\n role,\n });\n\n sponsorOnboarded(currentUser);\n\n dispatch(fetchCurrentUser());\n\n setStep(2);\n } else {\n const response = await updateUserKeywords(currentUser.id, {\n disciplines: [],\n areasOfExpertise,\n });\n\n if (response.data.success) {\n dispatch(fetchCurrentUser());\n }\n\n onClose();\n }\n } catch (err) {\n appsignal.sendError(err);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleSkip = (e) => {\n e.preventDefault();\n onClose();\n };\n\n useEffect(() => {\n (async () => {\n try {\n if (!currentUser?.profile_info?.company_identifier) {\n return;\n }\n\n const response = await getCompany(currentUser.profile_info.company_identifier);\n\n setCompany(response.company);\n } catch (err) {\n appsignal.sendError(err);\n }\n })();\n }, [currentUser]);\n\n if (!company?.id) return null;\n\n return (\n <BlankModal\n isOpen={isOpen}\n onClose={onClose}\n closeOnDimmerClick={false}\n hideCloseButton\n width=\"540px\"\n >\n <Container onSubmit={handleSubmit}>\n <Top>\n <Logo src={haloLogo} alt=\"Halo logo\" />\n <CompanyLogo src={company.logo?.url} />\n </Top>\n {(() => {\n switch (step) {\n case 1:\n return (\n <>\n <Bottom>\n <Header>\n {t(\n [\n \"components.modals.sso_sponsor_onboarding_modal\",\n isCommenter ? \"commenter_header\" : \"normal_header\",\n ],\n { company_name: company.company_name }\n )}\n </Header>\n <SingleSelectDropdown\n label=\"What's your role?\"\n value={role ? { value: role, label: role } : null}\n options={SPONSOR_ROLES_DROPDOWN_OPTIONS}\n onChange={(newOption) => {\n if (newOption) {\n setRole(newOption.value);\n }\n }}\n placeholder=\"Select your role\"\n isPortal={true}\n />\n <div>\n <Title>What’s your job title?</Title>\n <Input\n key=\"title-input-id\"\n type=\"text\"\n name=\"title\"\n value={title}\n onChange={(e) => {\n setTitle(e.target.value);\n }}\n autoComplete=\"off\"\n data-testid=\"scinet-signup-title-input\"\n placeholder=\"Enter your job title\"\n />\n </div>\n </Bottom>\n <ButtonContainer>\n <Button type=\"submit\" disabled={!role || !title || isSubmitting}>\n Submit\n </Button>\n </ButtonContainer>\n </>\n );\n case 2:\n return (\n <>\n <Bottom>\n <div style={{ margin: \"0 0 8px\" }}>\n Thanks for creating an account.\n <br />\n Complete your profile so other teams at {company.company_name} can find you.\n </div>\n <div>\n <Label>Areas of expertise</Label>\n <KeywordsDropdown\n keywordType=\"area_of_expertise\"\n targetType=\"sponsor\"\n value={areasOfExpertise}\n onChange={setAreasOfExpertise}\n isPortal\n />\n </div>\n </Bottom>\n <ButtonContainer>\n <TextButton text=\"Skip\" onClick={handleSkip} iconName={null} />\n <Button disabled={isSubmitting || !areasOfExpertise.length}>\n Add to profile\n </Button>\n </ButtonContainer>\n </>\n );\n default:\n return null;\n }\n })()}\n </Container>\n </BlankModal>\n );\n};\n\nconst Container = styled.form`\n ${FONTS.REGULAR_2};\n b {\n ${FONTS.BOLD_2};\n }\n`;\n\nconst Top = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n width: 100%;\n\n padding: 16px 32px;\n\n border-bottom: 1px solid ${COLORS.NEUTRAL_200};\n`;\n\nconst Bottom = styled.div`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n width: 100%;\n\n padding: 24px 32px;\n\n ${FONTS.REGULAR_2};\n\n border-bottom: 1px solid ${COLORS.NEUTRAL_200};\n`;\n\nconst Logo = styled.img`\n height: 32px;\n`;\n\nconst CompanyLogo = styled.img`\n box-sizing: border-box;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n\n padding: 8px;\n\n width: 64px;\n height: 64px;\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n border-radius: 12px;\n\n object-fit: contain;\n`;\n\nconst Header = styled.div`\n ${FONTS.HEADING_5_MEDIUM}\n\n margin: 0 0 24px;\n`;\n\nconst Title = styled.label`\n display: flex;\n flex-direction: column;\n\n width: 100%;\n margin: 0 0 10px;\n\n ${FONTS.SEMIBOLD_2};\n`;\n\nconst Input = styled.input`\n height: 36px;\n width: 100%;\n padding: 10px;\n\n border: solid 1px ${COLORS.NEUTRAL_300};\n ${({ error }) => error && `border: solid 1px ${COLORS.RED};`}\n border-radius: 6px;\n\n ${FONTS.REGULAR_2}\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 24px;\n\n width: 100%;\n\n padding: 16px 32px;\n`;\n\nconst Label = styled.div`\n ${FONTS.MEDIUM_2}\n`;\n\nexport default SSOSponsorOnboardingModal;\n","import toast from \"@components/Toast\";\nimport api from \"@requests/request\";\nimport appsignal from \"@utils/appsignal\";\nimport { requestProposalUrlPath } from \"@utils/requestUtils\";\nimport { useEffect } from \"react\";\nimport { useHistory, useParams } from \"react-router-dom\";\n\n// Redirects from old url /submit_proposal/:request_slug to /submit/:request_type/:request_slug\nexport default function SubmitProposalRedirect() {\n const { rfp_identifier: requestSlug } = useParams();\n const history = useHistory();\n\n useEffect(() => {\n (async () => {\n try {\n const response = await api.get(`/requests/${requestSlug}`);\n history.push(requestProposalUrlPath(response.data.request));\n } catch (err) {\n console.error(err);\n toast.error(\n \"Sorry! We couldn't find the request you're looking for. Please visit the My Proposals page to see your proposals.\"\n );\n history.push(\"/404\");\n appsignal.sendError(err, (span) => {\n span.setAction(\"SubmitProposalRedirect#useEffect\");\n });\n }\n })();\n }, [requestSlug]);\n\n return null;\n}\n","import { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport default function ScrollToTop({ children }) {\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return children;\n}\n","import { Icon } from \"@components/library\";\nimport { AdminTag, LicenseTag, SuperAdminTag } from \"@components/library/Tags/users\";\nimport { COLORS, JS_FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { setShowErrorBoundary } from \"@redux/actions/defaultActions\";\nimport { RootState } from \"@redux/store\";\nimport { signOut } from \"@requests/users\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport { t } from \"@utils/i18n\";\nimport { StyleSheet, css } from \"aphrodite\";\nimport { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport { Button, Popup } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\n\nconst NavbarDropdownMenu = () => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const showErrorBoundary = useSelector(\n (state: RootState) => state.defaultReducer.showErrorBoundary\n );\n\n const history = useHistory();\n const dispatch = useDispatch();\n\n const navigate = (to: string) => {\n if (!showErrorBoundary) {\n history.push(to);\n } else {\n dispatch(setShowErrorBoundary(false));\n window.location.href = to;\n }\n };\n\n const navigateToLogout = async () => {\n await signOut();\n // This needs to use window.location.href instead of history.push to prevent\n // accessing the previous session via the browser cache\n window.location.href = marketplacePath();\n };\n\n const navigateToProfile = () => {\n navigate(`/profile/${currentUser.first_name}-${currentUser.last_name}-${currentUser.id}`);\n setIsMenuOpen(false);\n };\n\n const navigateToAccount = () => {\n navigate(\"/account\");\n setIsMenuOpen(false);\n };\n\n const navigateToDashboard = () => {\n navigate(\"/reviewer_dashboard\");\n setIsMenuOpen(false);\n };\n\n const navigateToPublicProfile = async () => {\n navigate(\n `/profile/${currentUser.first_name}-${currentUser.last_name}-${currentUser.id}?public=true`\n );\n setIsMenuOpen(false);\n };\n\n const navigateToCompanyProfile = () => {\n navigate(`/company/${currentUser.profile_info.company_identifier}`);\n setIsMenuOpen(false);\n };\n\n const navigateToInbox = () => {\n navigate(\"/inbox\");\n setIsMenuOpen(false);\n };\n\n const navigateToUniversityProposalLibrary = () => {\n navigate(\"/university_dashboard/proposals\");\n setIsMenuOpen(false);\n };\n\n const currentPFPic = currentUser?.image?.medium?.url;\n\n return (\n <Popup\n trigger={\n <button\n type=\"button\"\n data-testid=\"navbar-menu-trigger\"\n className={css(styles.Navbar_menuWrap)}\n >\n {!currentPFPic ? (\n <div\n className={css(styles.Navbar_menuProfilePic)}\n data-testid=\"navbar-menu-profile-pic\"\n >\n {currentUser.first_name?.[0]?.toUpperCase()}\n {currentUser.last_name?.[0]?.toUpperCase()}\n </div>\n ) : (\n <div\n className={css(styles.Navbar_menuProfilePic)}\n data-testid=\"navbar-menu-profile-pic\"\n style={{\n backgroundImage: `url(${currentUser.image.small.url})`,\n }}\n />\n )}\n <div className={css(styles.Navbar_icon)}>\n <Icon name=\"Chevron Down\" />\n </div>\n <div className={css(styles.Navbar_iconMobile)}>\n <Icon name=\"Burger\" />\n </div>\n </button>\n }\n on=\"click\"\n basic\n className={`${css(styles.Navbar_accountPopup)} transition-fadein`}\n hideOnScroll\n hoverable\n position=\"bottom right\"\n open={isMenuOpen}\n onOpen={() => setIsMenuOpen(true)}\n onClose={() => setIsMenuOpen(false)}\n content={\n <div\n className={css(styles.Navbar_accountPopupContainer)}\n onMouseEnter={() => setIsMenuOpen(true)}\n onMouseLeave={() => setIsMenuOpen(false)}\n >\n <div className={css(styles.Navbar_popupContainer)}>\n <div className={css(styles.Navbar_profilePicContainer)}>\n {!currentPFPic ? (\n <div className={css(styles.Navbar_regularProfilePic)}>\n {currentUser?.first_name?.[0]?.toUpperCase()}\n {currentUser?.last_name?.[0]?.toUpperCase()}\n </div>\n ) : (\n <div\n className={css(styles.Navbar_popupProfilePic)}\n style={{\n backgroundImage: `url(${currentUser.image.medium.url})`,\n }}\n />\n )}\n </div>\n <div className={css(styles.Navbar_popupRightPanel)}>\n <div className={css(styles.Navbar_popupName)}>\n {currentUser.first_name} {currentUser.last_name}\n {currentUser.role === UserRole.SPONSOR &&\n currentUser.profile_info?.is_super_admin && (\n <SuperAdminTagContainer>\n <SuperAdminTag />\n </SuperAdminTagContainer>\n )}\n </div>\n <div className={css(styles.Navbar_popupPosition)}>\n {currentUser.role === UserRole.SPONSOR\n ? currentUser.profile_info.company_name\n : currentUser.profile_info.title}\n </div>\n {currentUser.role === UserRole.SCIENTIST && (\n <div\n onClick={navigateToProfile}\n className={css(styles.Navbar_profileButton)}\n data-testid=\"profile-dropdown-edit-button\"\n >\n Edit Profile\n </div>\n )}\n {currentUser.role === UserRole.SPONSOR && (\n <ProfileTags>\n {Boolean(currentUser.profile_info?.license) && (\n <LicenseTag type={currentUser.profile_info?.license} />\n )}\n {currentUser.profile_info?.is_admin && <AdminTag />}\n </ProfileTags>\n )}\n </div>\n </div>\n <Button onClick={navigateToAccount} className={css(styles.Navbar_button)}>\n Account Settings\n </Button>\n {currentUser.role === UserRole.SPONSOR && !currentUser.profile_info.commenter ? (\n <Button onClick={navigateToDashboard} className={css(styles.Navbar_button)}>\n View Dashboard\n </Button>\n ) : null}\n {currentUser.role === UserRole.SCIENTIST && currentUser.profile_info.is_expert && (\n <Button\n onClick={navigateToProfile}\n className={css(styles.Navbar_button, styles.Navbar_buttonEditProfile)}\n >\n {t(\"components.navbar.links.expert_dashboard\")}\n </Button>\n )}\n {currentUser.id &&\n currentUser.role !== UserRole.UNIVERSITY_ADMIN &&\n !(currentUser.role === UserRole.SPONSOR && !currentUser.profile_info.verified) && (\n <Button\n onClick={navigateToInbox}\n className={css(styles.Navbar_button, styles.Navbar_inbox)}\n >\n Inbox\n </Button>\n )}\n {currentUser.role === UserRole.SCIENTIST && (\n <Button\n onClick={navigateToProfile}\n className={css(styles.Navbar_button, styles.Navbar_buttonEditProfile)}\n >\n Edit Profile\n </Button>\n )}\n {currentUser.role === UserRole.SPONSOR && (\n <Button onClick={navigateToCompanyProfile} className={css(styles.Navbar_button)}>\n {currentUser.profile_info.is_admin ? \"Edit\" : \"View\"} Company Page\n </Button>\n )}\n {currentUser.role === UserRole.UNIVERSITY_ADMIN && (\n <Button\n onClick={navigateToUniversityProposalLibrary}\n className={css(styles.Navbar_button)}\n >\n View Proposals\n </Button>\n )}\n <Button\n onClick={() => {\n track(SegmentEventName.Click, {\n ui_component: \"Navbar Help Center\",\n });\n window.location.href = \"https://knowledge.halo.science/\";\n }}\n className={css(styles.Navbar_button)}\n >\n Help Center\n </Button>\n {currentUser.role === UserRole.SCIENTIST && (\n <Button\n data-testid=\"view-public-profile-button\"\n onClick={navigateToPublicProfile}\n className={css(styles.Navbar_button)}\n >\n View Public Profile\n </Button>\n )}\n <Button onClick={navigateToLogout} className={css(styles.Navbar_signOutButton)}>\n Sign Out\n </Button>\n </div>\n }\n />\n );\n};\n\nexport default NavbarDropdownMenu;\n\nconst ProfileTags = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n margin-top: 8px;\n`;\nconst SuperAdminTagContainer = styled.span`\n display: inline-block;\n position: relative;\n left: 4px;\n top: 2px;\n width: 20px;\n pointer-events: none;\n`;\nconst { TABLET_MEDIA_QUERY } = WINDOW_DIMENSIONS;\nconst styles = StyleSheet.create({\n Navbar_menuWrap: {\n display: \"flex\",\n alignItems: \"center\",\n marginLeft: 24,\n border: \"none\",\n background: \"none\",\n outline: \"none\",\n [TABLET_MEDIA_QUERY]: {\n marginLeft: \"auto\",\n },\n },\n Navbar_menuProfilePic: {\n height: \"36px\",\n width: \"36px\",\n color: COLORS.BLACK,\n backgroundColor: COLORS.NEUTRAL_100,\n marginRight: \"5px\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n ...JS_FONTS.MEDIUM_1,\n cursor: \"pointer\",\n borderRadius: \"50%\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center center\",\n backgroundSize: \"cover\",\n [TABLET_MEDIA_QUERY]: {\n display: \"none\",\n },\n },\n Navbar_icon: {\n cursor: \"pointer\",\n [TABLET_MEDIA_QUERY]: {\n display: \"none\",\n },\n },\n Navbar_iconMobile: {\n display: \"none\",\n [TABLET_MEDIA_QUERY]: {\n display: \"block\",\n fontSize: \"1.2em\",\n },\n },\n Navbar_accountPopup: {\n marginTop: \"15px\",\n marginBottom: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n border: \"none\",\n minWidth: \"300px\",\n [TABLET_MEDIA_QUERY]: {\n boxShadow: \"28px 15px 24px rgba(0, 0, 0, 0.15)\",\n width: \"100%\",\n maxWidth: \"100%\",\n left: 0,\n },\n },\n Navbar_accountPopupContainer: {\n width: \"300px\",\n padding: `10px 0px 0`,\n zIndex: 2000,\n [TABLET_MEDIA_QUERY]: {\n width: \"100%\",\n paddingTop: 0,\n paddingRight: \"32px\",\n paddingBottom: \"25px\",\n paddingLeft: \"32px\",\n },\n },\n Navbar_popupContainer: {\n display: \"flex\",\n marginBottom: \"8px\",\n [TABLET_MEDIA_QUERY]: {\n display: \"none\",\n },\n },\n Navbar_profilePicContainer: {\n width: \"35%\",\n },\n Navbar_regularProfilePic: {\n height: \"80px\",\n width: \"80px\",\n color: COLORS.BLACK,\n backgroundColor: COLORS.NEUTRAL_100,\n marginLeft: \"20px\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n ...JS_FONTS.HEADING_2_SEMIBOLD,\n borderRadius: \"50%\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center center\",\n backgroundSize: \"cover\",\n },\n Navbar_popupProfilePic: {\n height: \"80px\",\n width: \"80px\",\n backgroundColor: COLORS.NEUTRAL_100,\n marginLeft: \"20px\",\n borderRadius: \"50%\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center center\",\n backgroundSize: \"cover\",\n },\n Navbar_popupRightPanel: {\n marginLeft: \"20px\",\n width: \"65%\",\n marginTop: \"8px\",\n marginRight: \"20px\",\n },\n Navbar_popupName: {\n gap: \"6px\",\n color: COLORS.BLACK,\n ...JS_FONTS.MEDIUM_2,\n textTransform: \"capitalize\",\n },\n Navbar_popupPosition: {\n ...JS_FONTS.MEDIUM_3,\n color: COLORS.BLACK,\n },\n Navbar_profileButton: {\n cursor: \"pointer\",\n ...JS_FONTS.MEDIUM_2,\n color: COLORS.HALO_BLUE,\n },\n Navbar_inbox: {\n display: \"none\",\n [TABLET_MEDIA_QUERY]: {\n display: \"unset\",\n },\n },\n Navbar_buttonEditProfile: {\n display: \"none\",\n [TABLET_MEDIA_QUERY]: {\n display: \"block\",\n },\n },\n Navbar_button: {\n padding: \"15px 20px\",\n backgroundColor: COLORS.WHITE,\n borderBottom: `1px solid ${COLORS.NEUTRAL_200}`,\n ...JS_FONTS.MEDIUM_2,\n color: COLORS.NEUTRAL_500,\n width: \"300px\",\n borderRadius: \"0px\",\n marginRight: \"0\",\n textAlign: \"left\",\n [TABLET_MEDIA_QUERY]: {\n width: \"100%\",\n paddingLeft: 0,\n paddingRight: 0,\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_2,\n },\n \":hover\": {\n backgroundColor: COLORS.NEUTRAL_50,\n },\n },\n Navbar_signOutButton: {\n padding: \"15px 20px\",\n ...JS_FONTS.MEDIUM_2,\n backgroundColor: COLORS.WHITE,\n color: COLORS.NEUTRAL_500,\n marginBottom: \"0px\",\n width: \"300px\",\n borderRadius: \"0px\",\n marginRight: \"0\",\n textAlign: \"left\",\n [TABLET_MEDIA_QUERY]: {\n width: \"100%\",\n paddingLeft: 0,\n paddingRight: 0,\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_2,\n },\n \":hover\": {\n backgroundColor: COLORS.NEUTRAL_50,\n },\n },\n});\n","import { COLORS, JS_FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { StyleSheet } from \"aphrodite\";\n\nconst { MOBILE_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nconst styles = StyleSheet.create({\n LoginModal_modal: {\n borderRadius: \"3px\",\n padding: \"30px 30px 14px\",\n },\n LoginModal_innerContainer: {\n backgroundColor: \"white\",\n },\n LoginModal_logoContainer: {\n marginTop: \"8px\",\n textAlign: \"center\",\n },\n LoginModal_closeicon: {\n position: \"absolute\",\n top: \"24px\",\n right: \"24px\",\n },\n LoginModal_hero: {\n marginTop: \"15px\",\n },\n LoginModal_headline: {\n color: COLORS.BLACK,\n ...JS_FONTS.HEADING_4_SEMIBOLD,\n marginBottom: \"5px\",\n textAlign: \"center\",\n },\n LoginModal_subheadline: {\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_2,\n textAlign: \"center\",\n },\n LoginModal_subheadline_rfp: {\n color: COLORS.BLACK,\n textAlign: \"center\",\n \":nth-child(2)\": {\n ...JS_FONTS.REGULAR_1,\n marginBottom: \"12px\",\n },\n \":last-child\": {\n color: COLORS.NEUTRAL_500,\n ...JS_FONTS.REGULAR_2,\n marginBottom: \"8px\",\n },\n },\n LoginModal_innerLeftPane: {\n width: \"50%\",\n display: \"inline-block\",\n verticalAlign: \"top\",\n padding: \"20px 5px 0\",\n ...JS_FONTS.MEDIUM_2,\n [MOBILE_MEDIA_QUERY]: {\n width: \"100%\",\n margin: \"auto\",\n padding: \"15px 0 0\",\n },\n },\n LoginModal_modalText: {\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_2,\n width: \"90%\",\n marginBottom: \"15px\",\n display: \"flex\",\n [MOBILE_MEDIA_QUERY]: {\n marginBottom: \"10px\",\n \":last-child\": {\n marginBottom: \"5px\",\n },\n },\n },\n LoginModal_lineItem: {\n marginLeft: \"5px\",\n },\n LoginModal_innerRightPane: {\n width: \"50%\",\n display: \"inline-block\",\n padding: \"5px 0 0\",\n [MOBILE_MEDIA_QUERY]: {\n width: \"100%\",\n margin: \"auto\",\n },\n },\n LoginModal_innerRightPane_rfp: {\n padding: \"5px 0 0\",\n margin: \"0 auto\",\n },\n LoginModal_formField: {\n marginTop: \"15px\",\n marginBottom: \"15px\",\n \":first-child\": {\n margin: \"0\",\n },\n },\n LoginModal_inputField: {\n width: \"100%\",\n border: `1px solid ${COLORS.NEUTRAL_200}`,\n padding: \"4px 12px\",\n borderRadius: \"4px\",\n height: \"48px\",\n ...JS_FONTS.REGULAR_3,\n },\n LoginModal_nameField: {\n margin: \"0\",\n width: \"48%\",\n display: \"inline-block\",\n \":first-child\": {\n margin: \"0 4% 0 0\",\n },\n },\n LoginModal_placeholderText: {\n marginBottom: \"10px\",\n ...JS_FONTS.REGULAR_3,\n visibility: \"hidden\",\n textAlign: \"center\",\n },\n LoginModal_errorMessage: {\n marginBottom: \"10px\",\n color: \"orange\",\n ...JS_FONTS.REGULAR_3,\n textAlign: \"center\",\n },\n LoginModal_errorField: {\n border: \"solid 1px orange\",\n },\n LoginModal_alreadyHaveAccount: {\n textAlign: \"center\",\n display: \"inline-block\",\n ...JS_FONTS.MEDIUM_2,\n width: \"100%\",\n color: COLORS.BLACK,\n },\n LoginModal_signInLink: {\n marginLeft: \"7px\",\n ...JS_FONTS.REGULAR_2,\n display: \"inline-block\",\n color: COLORS.BLACK,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n },\n LoginModal_forgotPasswordContainer: {\n textAlign: \"center\",\n marginTop: \"14px\",\n },\n LoginModal_footerText: {\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_3,\n },\n LoginModal_forgotPassword: {\n textDecoration: \"underline\",\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_3,\n marginBottom: \"3px\",\n },\n LoginModal_horizontalRule: {\n marginTop: \"14px\",\n marginBottom: \"12px\",\n },\n});\n\nexport default styles;\n","import { SSOEnabledHint } from \"@components/SSOEnabledHint\";\nimport { Button, Icon, IconButton } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { useSSOSensitiveEmail } from \"@hooks/useSSOSensitiveEmail\";\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport api from \"@requests/request\";\nimport { RfpPageRequest } from \"@tsTypes/index\";\nimport { identify, track, usedPersonalEmail } from \"@utils/appUtils\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { css } from \"aphrodite\";\nimport { Dispatch, SetStateAction, useEffect, useState } from \"react\";\nimport { Form, Grid } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\nimport Validator from \"validator\";\nimport styles from \"./LoginModal.styles\";\nimport { ModalType } from \"./LoginSignUpModal\";\n\ninterface Props {\n onClose: () => void;\n previousAction: string;\n setModalType: Dispatch<SetStateAction<ModalType>>;\n currentRFP?: RfpPageRequest;\n}\n\nconst SignUpModal = ({ onClose, previousAction, setModalType, currentRFP }: Props) => {\n const [errors, setErrors] = useState({});\n const [errorMessage, setErrorMessage] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [hasSubmitted, setHasSubmitted] = useState(false);\n\n const [firstName, setFirstName] = useState(\"\");\n const [lastName, setLastName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const { email, setEmail, isEmailSSOEnabled, redirectToSSO } = useSSOSensitiveEmail(\"\");\n const [shouldShowSSO, setShouldShowSSO] = useState(isEmailSSOEnabled);\n\n const easyApply = previousAction === \"easy apply\";\n const isRfpPage = window.location.pathname.includes(\"/research/\") && currentRFP;\n const isProposalPage = window.location.pathname.startsWith(\"/proposal/\");\n const isMarketplace = window.location.pathname.startsWith(\"/marketplace\");\n\n let signupHeadline = \"Move Science Forward\";\n let signupSubtitle = \"Find funding opportunities from industry and bring your ideas to life\";\n let lineItemsHeader = \"\";\n let lineItems = [\n \"Submit a proposal in less than an hour\",\n \"Receive feedback directly from the industry contact\",\n \"Get discovered by industry partners looking for your expertise\",\n ];\n if (isMarketplace) {\n signupHeadline = \"Explore more opportunities\";\n signupSubtitle = \"Create a free account to access our full selection of opportunities\";\n lineItemsHeader = \"Account benefits:\";\n lineItems = [\n \"Get discovered by industry partners seeking your expertise\",\n \"Get matched to opportunities that suit your profile\",\n \"Submit proposals in less than an hour\",\n \"Receive feedback directly from industry contacts\",\n ];\n }\n\n const isScientist = !isProposalPage;\n const isCompany = isProposalPage;\n\n let userType = \"\";\n if (isScientist) {\n userType = \"sci\";\n } else if (isCompany) {\n userType = \"spo\";\n } else {\n userType = \"adm\";\n }\n\n useEffect(() => {\n const event = `${userType}-create account-start`;\n const type = `modal-${previousAction}`;\n\n track(event, { type });\n }, [userType, previousAction]);\n\n useEffect(() => {\n setHasSubmitted(false);\n }, [firstName, lastName, email, password]);\n\n useEffect(() => {\n if (isEmailSSOEnabled) setShouldShowSSO(true);\n }, [isEmailSSOEnabled]);\n\n const handleRegister = async () => {\n setIsSubmitting(true);\n setHasSubmitted(true);\n setErrors({});\n\n if (shouldShowSSO) {\n if (!isEmailSSOEnabled) {\n setErrorMessage(\"Your email/company is not enabled to use SSO.\");\n setIsSubmitting(false);\n return;\n }\n\n redirectToSSO();\n return;\n }\n\n if (invalidSubmit()) {\n setIsSubmitting(false);\n return;\n }\n\n let originalReferrerId;\n if (localStorage?.getItem(\"original_referrer_id\")) {\n originalReferrerId = localStorage.getItem(\"original_referrer_id\");\n localStorage.removeItem(\"original_referrer_id\");\n }\n\n try {\n const responseJson = await api.post(\"/users\", {\n user: {\n email,\n password,\n first_name: firstName,\n last_name: lastName,\n ...(isCompany && { company: true }),\n },\n });\n\n if (isRfpPage) {\n if (easyApply && currentRFP.slug) {\n setPrevUrlCookie(`/submit/request_for_proposal/${currentRFP.slug}`, 0);\n } else {\n setPrevUrlCookie();\n }\n }\n\n const user = responseJson.data;\n identify(user);\n await track(`${userType}-create account-complete`, {\n type: `modal-${previousAction}`,\n });\n\n if (originalReferrerId) {\n window.location.href = `/redirect_login?referrer_id=${originalReferrerId}`;\n } else {\n window.location.href = \"/redirect_login\";\n }\n } catch (error) {\n setIsSubmitting(false);\n console.log(error);\n if (error.response.data.errors.email[0].indexOf(\"already been taken\") > -1) {\n setErrorMessage(\"That email has already been taken.\");\n } else if (\n error.response.data.errors.email[0].indexOf(\"must be a company or university email\") > -1\n ) {\n setErrorMessage(\"Please use company or university email.\");\n } else {\n setErrorMessage(\"Something went wrong. Please try again.\");\n }\n\n setErrors(error.response.data.errors);\n }\n };\n\n const handleLogin = () => {\n if (isRfpPage && easyApply && currentRFP.slug) {\n setPrevUrlCookie(`/submit/request_for_proposal/${currentRFP.slug}`);\n }\n setModalType(\"login\");\n };\n\n const invalidSubmit = () => {\n if (Validator.isEmpty(firstName) || Validator.isEmpty(lastName) || Validator.isEmpty(email)) {\n setErrorMessage(\"Please fill in all fields before continuing.\");\n return true;\n } else if (!Validator.isEmail(email)) {\n setErrorMessage(\"Please enter a valid email address.\");\n return true;\n } else if (usedPersonalEmail(email)) {\n setErrorMessage(`Please use company ${!isCompany ? \"or university \" : \"\"}email.`);\n return true;\n } else if (!Validator.isLength(password, { min: 8, max: 30 })) {\n setErrorMessage(\"Passwords must be between 8-30 characters long.\");\n return true;\n }\n };\n\n const hasErrors =\n hasSubmitted && (errorMessage.length > 0 || Object.keys(errors || {}).length > 0);\n\n return (\n <div>\n <div className={css(styles.LoginModal_closeicon)}>\n <IconButton variant=\"fourth\" iconName=\"Close\" onClick={onClose} tooltipPosition=\"bottom\" />\n </div>\n <div className={css(styles.LoginModal_logoContainer)}>\n <a href=\"/\">\n <img src={haloLogo} />\n </a>\n </div>\n <Grid centered columns={2}>\n <Grid.Row centered columns={2}>\n <Grid.Column width={15}>\n <div className={css(styles.LoginModal_hero)}>\n <div className={css(styles.LoginModal_headline)}>{signupHeadline}</div>\n <div className={css(styles.LoginModal_subheadline)}>{signupSubtitle}</div>\n {isScientist && isRfpPage && (\n <div className={css(styles.LoginModal_subheadline)}>\n This opportunity is for Halo members only. Please create an account to continue.\n </div>\n )}\n </div>\n {lineItems.length > 0 && (\n <div className={css(styles.LoginModal_innerLeftPane)}>\n <p>{lineItemsHeader}</p>\n {lineItems.map((lineItem) => {\n return (\n <div className={css(styles.LoginModal_modalText)} key={lineItem}>\n <span>\n <Icon name=\"Verified\" color={COLORS.HALO_BLUE} />{\" \"}\n </span>\n <div className={css(styles.LoginModal_lineItem)}>{lineItem}</div>\n </div>\n );\n })}\n </div>\n )}\n <div className={css(styles.LoginModal_innerRightPane)}>\n <div\n className={css(\n errorMessage ? styles.LoginModal_errorMessage : styles.LoginModal_placeholderText\n )}\n >\n {errorMessage ? errorMessage : \"Placeholder Text\"}\n </div>\n <div>\n <Form error={hasErrors} onSubmit={handleRegister}>\n {(!shouldShowSSO || firstName || lastName) && (\n <>\n <Form.Field\n className={css(styles.LoginModal_formField, styles.LoginModal_nameField)}\n >\n <input\n className={css(\n styles.LoginModal_inputField,\n hasSubmitted && !firstName && styles.LoginModal_errorField\n )}\n data-testid=\"signup-form-first-name-input\"\n name=\"firstName\"\n onChange={(e) => setFirstName(e.target.value)}\n placeholder=\"First Name\"\n value={firstName}\n />\n </Form.Field>\n <Form.Field\n className={css(styles.LoginModal_formField, styles.LoginModal_nameField)}\n >\n <input\n className={css(\n styles.LoginModal_inputField,\n hasSubmitted && !lastName && styles.LoginModal_errorField\n )}\n data-testid=\"signup-form-last-name-input\"\n name=\"lastName\"\n onChange={(e) => setLastName(e.target.value)}\n placeholder=\"Last Name\"\n value={lastName}\n />\n </Form.Field>\n </>\n )}\n <Form.Field className={css(styles.LoginModal_formField)}>\n <input\n className={css(\n styles.LoginModal_inputField,\n (usedPersonalEmail(email) || (hasSubmitted && !Validator.isEmail(email))) &&\n styles.LoginModal_errorField\n )}\n data-testid=\"signup-form-email-input\"\n name=\"email\"\n onChange={(e) => setEmail(e.target.value)}\n placeholder={isCompany ? \"Company Email\" : \"Company or University Email\"}\n value={email}\n />\n </Form.Field>\n {shouldShowSSO ? (\n <>\n <SSOHintContainer>\n <SSOEnabledHint />\n </SSOHintContainer>\n <Button\n data-testid=\"signup-form-submit-button\"\n disabled={isSubmitting || !email}\n type=\"submit\"\n width=\"100%\"\n >\n Continue\n </Button>\n <SSOToggleContainer\n onClick={() => {\n if (isEmailSSOEnabled) setEmail(\"\");\n setShouldShowSSO(false);\n }}\n >\n <SSOToggle>Use email/password instead</SSOToggle>\n </SSOToggleContainer>\n </>\n ) : (\n <>\n <Form.Field className={css(styles.LoginModal_formField)}>\n <input\n className={css(\n styles.LoginModal_inputField,\n hasSubmitted &&\n (password.length < 8 || password.length > 30) &&\n styles.LoginModal_errorField\n )}\n data-testid=\"signup-form-password-input\"\n name=\"password\"\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n type=\"password\"\n value={password}\n />\n </Form.Field>\n <Button\n data-testid=\"signup-form-submit-button\"\n disabled={isSubmitting}\n type=\"submit\"\n width=\"100%\"\n >\n Create Account\n </Button>\n <SSOToggleContainer>\n <SSOToggle onClick={() => setShouldShowSSO(true)}>\n Sign in with SSO\n </SSOToggle>\n </SSOToggleContainer>\n </>\n )}\n </Form>\n <div className={css(styles.LoginModal_forgotPasswordContainer)}>\n <div className={css(styles.LoginModal_footerText)}>\n By signing up you agree to the{\" \"}\n </div>\n <a\n className={css(styles.LoginModal_forgotPassword)}\n href=\"/terms\"\n target=\"_blank\"\n >\n Terms of Service\n </a>\n <span className={css(styles.LoginModal_footerText)}>{\" & \"}</span>\n <a\n className={css(styles.LoginModal_forgotPassword)}\n href=\"/privacy\"\n target=\"_blank\"\n >\n Privacy Policy\n </a>\n </div>\n </div>\n </div>\n <hr className={css(styles.LoginModal_horizontalRule)} />\n <div className={css(styles.LoginModal_alreadyHaveAccount)}>\n Already have an account?\n <span style={{ marginLeft: \"2px\" }}>\n <div className={css(styles.LoginModal_signInLink)} onClick={handleLogin}>\n Sign in\n </div>\n </span>\n </div>\n </Grid.Column>\n </Grid.Row>\n </Grid>\n </div>\n );\n};\n\nexport default SignUpModal;\n\nconst SSOHintContainer = styled.div`\n display: flex;\n justify-content: center;\n margin: 20px;\n`;\n\nconst SSOToggleContainer = styled.div`\n display: flex;\n justify-content: center;\n margin-top: 10px;\n`;\n\nconst SSOToggle = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n\n text-decoration: underline;\n color: ${COLORS.BLACK};\n ${FONTS.REGULAR_2}\n\n &:hover {\n cursor: pointer;\n color: ${COLORS.BLUE_900};\n }\n`;\n","import { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getRfpForRfpPage } from \"@requests/rfps\";\nimport { css } from \"aphrodite\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Modal } from \"semantic-ui-react\";\n\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RfpPageRequest } from \"@tsTypes/index\";\nimport { track } from \"@utils/appUtils\";\nimport LoginModal from \"./LoginModal\";\nimport styles from \"./LoginModal.styles\";\nimport SignUpModal from \"./SignUpModal\";\n\nexport type ModalType = \"signup\" | \"login\";\n\nfunction LoginSignUpModal() {\n const [modalType, setModalType] = useState<ModalType>(\"signup\");\n const [currentRFP, setCurrentRFP] = useState<RfpPageRequest>();\n\n const loginModalOpen = useSelector((state: RootState) => state.profiles.loginModalOpen);\n const previousAction = useSelector((state: RootState) => state.profiles.previousAction);\n const loginModalLanding = useSelector((state: RootState) => state.profiles.loginModalLanding);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n (async () => {\n const isRfpPage =\n window.location.pathname.includes(\"/research/\") &&\n window.location.pathname.split(\"/\").length > 3;\n\n if (isRfpPage) {\n const identifier = window.location.pathname.split(\"/\").at(-1);\n try {\n const { request } = await getRfpForRfpPage(identifier!);\n setCurrentRFP(request);\n } catch (e) {\n if (e.response.status === 401) {\n console.error(\"Waiting for access code\");\n return;\n }\n throw e;\n }\n }\n })();\n }, []);\n\n useEffect(() => {\n setModalType(loginModalLanding as ModalType);\n }, [loginModalLanding]);\n\n const modalWidth = () => {\n if (modalType === \"signup\") {\n return \"720px\";\n }\n return \"450px\";\n };\n\n const closeLoginModal = () => {\n dispatch(toggleLoginModal({ open: false }));\n };\n\n if (loginModalOpen) {\n track(SegmentEventName.View, {\n ui_component: \"Login Modal\",\n });\n }\n\n return (\n <Modal\n open={loginModalOpen}\n onClose={closeLoginModal}\n size=\"small\"\n className={css(styles.LoginModal_modal)}\n style={{ width: modalWidth(), maxWidth: \"95%\" }}\n >\n <div data-testid=\"login-modal\">\n {modalType === \"signup\" && (\n <SignUpModal\n onClose={closeLoginModal}\n currentRFP={currentRFP}\n previousAction={previousAction}\n setModalType={setModalType}\n />\n )}\n {modalType === \"login\" && <LoginModal setModalType={setModalType} compat />}\n </div>\n </Modal>\n );\n}\n\nexport default LoginSignUpModal;\n","import LoginSignUpModal from \"./LoginSignUpModal\";\n\nexport default LoginSignUpModal;\n","import { InfoTag } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { setShowErrorBoundary } from \"@redux/actions/defaultActions\";\nimport { RootState } from \"@redux/store\";\nimport { ReactNode } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { NavLink, useLocation } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\ninterface Props {\n to: string;\n children: ReactNode;\n asAnchor?: boolean;\n withNewTag?: boolean;\n \"data-testid\"?: string;\n activeStylesMatchType?: \"startsWith\" | \"exact\";\n}\n\nfunction NavbarLink({\n to,\n children,\n asAnchor = false,\n withNewTag = false,\n \"data-testid\": dataTestId,\n activeStylesMatchType = \"exact\",\n}: Props) {\n const showErrorBoundary = useSelector(\n (state: RootState) => state.defaultReducer.showErrorBoundary\n );\n\n const dispatch = useDispatch();\n const { pathname } = useLocation();\n\n const handleClick = () => {\n if (showErrorBoundary) {\n dispatch(setShowErrorBoundary(false));\n window.location.href = to;\n }\n };\n\n let isActive = false;\n if (activeStylesMatchType === \"startsWith\") {\n isActive = String(pathname).startsWith(to) && !showErrorBoundary;\n } else if (activeStylesMatchType === \"exact\") {\n isActive = String(pathname) === to && !showErrorBoundary;\n }\n\n return (\n <Container isActive={isActive}>\n <Link\n to={to}\n as={asAnchor ? \"a\" : NavLink}\n href={asAnchor && to}\n onClick={handleClick}\n $isActive={isActive}\n data-testid={dataTestId}\n >\n {children}\n {withNewTag && (\n <InfoTag accent marginLeft=\"8px\">\n NEW\n </InfoTag>\n )}\n </Link>\n </Container>\n );\n}\n\nexport default NavbarLink;\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n padding: 6px 16px 0;\n border-bottom: 3px solid ${({ isActive }) => (isActive ? COLORS.HALO_BLUE : \"transparent\")};\n`;\nconst Link = styled(NavLink)`\n display: flex;\n align-items: center;\n ${FONTS.MEDIUM_2};\n color: ${COLORS.BLACK};\n &:hover,\n &:focus {\n color: ${COLORS.HALO_BLUE};\n text-decoration: none;\n }\n ${({ $isActive }) =>\n $isActive &&\n `\n color: ${COLORS.HALO_BLUE};\n text-decoration: none;\n `}\n`;\n","import NavbarLink from \"@components/Navbar/NavbarLink\";\nimport { InfoTag } from \"@components/library\";\nimport { COLORS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { t } from \"@utils/i18n\";\nimport { useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\nconst ScientistNavbarLinks = () => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const unreadCount = useSelector((state: RootState) => state.profiles.unreadCount);\n\n return (\n <UserLinks>\n <NavbarLink to={marketplacePath()}>{t(\"components.navbar.links.marketplace\")}</NavbarLink>\n <NavbarLink to=\"/my_proposals\">\n {t(\"components.navbar.links.my_proposals\")}\n </NavbarLink>\n {currentUser.profile_info.is_expert && (\n <NavbarLink to=\"/review_system\">{t(\"components.navbar.links.expert_dashboard\")}</NavbarLink>\n )}\n <NavbarLink to=\"/inbox\">\n {t(\"components.navbar.links.inbox\")}\n {unreadCount > 0 && (\n <InfoTag marginLeft=\"4px\" backgroundColor={COLORS.RED_700}>\n {unreadCount}\n </InfoTag>\n )}\n </NavbarLink>\n </UserLinks>\n );\n};\n\nexport default ScientistNavbarLinks;\n\n// For use in LoggedOutNavbarLinks, ScientistNavbarLinks, SponsorNavbarLinks, and UniversityAdminNavbarLinks\n// Note: This needs to be exported from one of the above components and will not work if exported from Navbar.tsx\nexport const UserLinks = styled.div`\n display: flex;\n gap: 16px;\n height: 100%;\n margin-left: auto;\n`;\n","import NavbarLink from \"@components/Navbar/NavbarLink\";\nimport { marketplace_path } from \"@routes/routes\";\nimport { t } from \"@utils/i18n\";\nimport styled from \"styled-components\";\nimport { UserLinks } from \"./ScientistNavbarLinks\";\n\nconst LoggedOutNavbarLinks = () => {\n return (\n <Container>\n <NavbarLink to={marketplace_path()} activeStylesMatchType=\"startsWith\" asAnchor>\n {t(\"components.navbar.links.marketplace\")}\n </NavbarLink>\n <NavbarLink to=\"https://blog.halo.science/\" asAnchor>\n {t(\"components.navbar.links.blog\")}\n </NavbarLink>\n <NavbarLink to=\"/scientists\" asAnchor>\n {t(\"components.navbar.links.scientists\")}\n </NavbarLink>\n </Container>\n );\n};\n\nexport default LoggedOutNavbarLinks;\n\nconst Container = styled(UserLinks)`\n margin-left: 36px;\n`;\n","import { Button, Icon } from \"@components/library\";\nimport SlideModalBase, { SlideModalBaseProps } from \"@components/library/ModalBases/SlideModalBase\";\nimport { COLORS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nconst MobileMenu = ({ isOpen, onClose }: SlideModalBaseProps) => {\n if (!isOpen) return null;\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const links: { name: string; isCurrentPage: boolean; to?: string; as?: string; href?: string }[] =\n [\n {\n name: \"Marketplace\",\n to: marketplacePath(),\n isCurrentPage: window.location.pathname.startsWith(\"/marketplace\"),\n },\n {\n name: \"Blog\",\n as: \"a\",\n href: \"/blog\",\n isCurrentPage: window.location.pathname.startsWith(\"/blog\"),\n },\n {\n name: \"For Scientists\",\n to: \"/scientists\",\n isCurrentPage: window.location.pathname.startsWith(\"/scientists\"),\n },\n ];\n\n return (\n <SlideModalBase isOpen={isOpen} onClose={onClose} direction=\"bottom\" hideCloseButton>\n <Container>\n <NavLinks>\n <CloseButton type=\"button\" onClick={onClose}>\n <Icon name=\"Close\" size=\"lg\" />\n </CloseButton>\n {links.map((link) => (\n <NavLink\n key={link.name}\n as={link.as}\n to={link.to}\n href={link.href}\n isCurrentPage={link.isCurrentPage}\n >\n {link.name}\n </NavLink>\n ))}\n </NavLinks>\n {!currentUser.id && (\n <a href=\"/login\">\n <Button type=\"button\" variant=\"secondary\" margin=\"36px 0 0\" width=\"100%\">\n Sign in\n </Button>\n </a>\n )}\n </Container>\n </SlideModalBase>\n );\n};\n\nexport default MobileMenu;\n\nconst Container = styled.div`\n position: relative;\n padding: 40px;\n`;\nconst CloseButton = styled.button`\n position: absolute;\n top: 40px;\n right: 32px;\n border: none;\n background-color: transparent;\n`;\nconst NavLinks = styled.div`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\nconst NavLink = styled(Link)`\n font-size: 18px;\n font-weight: 600;\n line-height: 1.7;\n color: ${({ isCurrentPage }) => (isCurrentPage ? COLORS.HALO_BLUE : COLORS.BLACK)};\n &:hover {\n color: ${COLORS.HALO_BLUE};\n text-decoration: none;\n }\n`;\n","import NavbarLink from \"@components/Navbar/NavbarLink\";\nimport { InfoTag, TextButton } from \"@components/library\";\nimport { COLORS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { scientistNetworkName, t } from \"@utils/i18n\";\nimport { useSelector } from \"react-redux\";\nimport { NavLink } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { UserLinks } from \"./ScientistNavbarLinks\";\n\nconst SponsorNavbarLinks = () => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const unreadCount = useSelector((state: RootState) => state.profiles.unreadCount);\n const subscription = useSelector((state: RootState) => state.company.subscription);\n const lastViewedRfpIdentifier = useSelector(\n (state: RootState) => state.defaultReducer.lastViewedRfpIdentifier\n );\n\n if (!currentUser.profile_info.verified && !currentUser.profile_info.is_admin)\n return <Container />;\n\n const showBackToProposalReviewDashboard =\n currentUser.profile_info.verified &&\n currentUser.profile_info.commenter &&\n !location.pathname.startsWith(\"/review_system\");\n\n return (\n <Container showBackToProposalReviewDashboard={showBackToProposalReviewDashboard}>\n {showBackToProposalReviewDashboard && (\n <ButtonLink to={`/review_system?request=${lastViewedRfpIdentifier}`}>\n <TextButton text=\"Back to proposal review\" iconName=\"Arrow Left\" iconPosition=\"left\" />\n </ButtonLink>\n )}\n {!currentUser.profile_info.commenter && (\n <NavbarLink to=\"/reviewer_dashboard\">\n {t(\"components.navbar.links.reviewer_dashboard\")}\n </NavbarLink>\n )}\n {subscription?.features.proposal_library && (\n <NavbarLink to=\"/proposal_library\">\n {t(\"components.navbar.links.proposal_library\")}\n </NavbarLink>\n )}\n {subscription?.features.company_scientist_network && (\n <NavbarLink to=\"/network\">{scientistNetworkName(subscription)}</NavbarLink>\n )}\n {currentUser.profile_info.verified && (\n <NavbarLink to=\"/reviewer_dashboard/teams\">\n {t(\"components.navbar.links.my_team\")}\n </NavbarLink>\n )}\n {currentUser.profile_info.verified && !currentUser.profile_info.commenter && (\n <NavbarLink to=\"/inbox\" data-testid=\"navbar-inbox-link\">\n {t(\"components.navbar.links.inbox\")}\n {unreadCount > 0 && (\n <InfoTag marginLeft=\"4px\" backgroundColor={COLORS.RED_700}>\n {unreadCount}\n </InfoTag>\n )}\n </NavbarLink>\n )}\n </Container>\n );\n};\n\nexport default SponsorNavbarLinks;\n\nconst Container = styled(UserLinks)`\n ${({ showBackToProposalReviewDashboard }) => showBackToProposalReviewDashboard && `width: 100%;`}\n`;\nconst ButtonLink = styled(NavLink)`\n display: flex;\n align-items: center;\n height: 100%;\n margin-right: auto;\n &:hover {\n text-decoration: none;\n }\n`;\n","import NavbarLink from \"@components/Navbar/NavbarLink\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { t } from \"@utils/i18n\";\nimport { UserLinks } from \"./ScientistNavbarLinks\";\n\nconst UniversityAdminNavbarLinks = () => {\n return (\n <UserLinks>\n <NavbarLink to={marketplacePath()}>{t(\"components.navbar.links.marketplace\")}</NavbarLink>\n <NavbarLink to=\"/university_dashboard/proposals\" withNewTag>\n {t(\"components.navbar.links.university_proposals\")}\n </NavbarLink>\n <NavbarLink to=\"/university_dashboard/team\">\n {t(\"components.navbar.links.university_team\")}\n </NavbarLink>\n </UserLinks>\n );\n};\n\nexport default UniversityAdminNavbarLinks;\n","export const NAVBAR_HIDDEN_PATHS = [\n \"/submit/\",\n \"/preview-rfp/\",\n \"/get-started\",\n \"/login\",\n \"/onboarding\",\n \"/review_system\",\n \"/opportunities\",\n];\n\nexport const NAVBAR_BORDER_PATHS = [\n \"/inbox\",\n \"/account\",\n \"/reviewer_dashboard\",\n \"/reviewer_dashboard/teams\",\n \"/reviewer_dashboard/proposals\",\n \"/proposal_library\",\n \"/network\",\n \"/startup_program\",\n \"/request_for_experts\",\n];\n","import NavbarDropdownMenu from \"@components/Navbar/NavbarDropdownMenu\";\nimport { Button, GradientButton, Icon } from \"@components/library\";\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport { RootState } from \"@redux/store\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { useEffect, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Link, useLocation } from \"react-router-dom\";\nimport { COLORS, WINDOW_DIMENSIONS } from \"src/constants\";\nimport styled from \"styled-components\";\nimport LoginSignUpModal from \"../LoginSignUpModal\";\nimport LoggedOutNavbarLinks from \"./LoggedOutNavbarLinks\";\nimport MobileMenu from \"./MobileMenu\";\nimport ScientistNavbarLinks from \"./ScientistNavbarLinks\";\nimport SponsorNavbarLinks from \"./SponsorNavbarLinks\";\nimport UniversityAdminNavbarLinks from \"./UniversityAdminNavbarLinks\";\nimport { NAVBAR_BORDER_PATHS, NAVBAR_HIDDEN_PATHS } from \"./navbarLists\";\n\ninterface Props {\n shouldIgnoreHiddenPaths?: boolean;\n}\n\nconst Navbar = ({ shouldIgnoreHiddenPaths }: Props) => {\n const [isSticky, setIsSticky] = useState(false);\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const isTablet = useSelector((state: RootState) => state.window.isTablet);\n\n const { pathname } = useLocation();\n\n const isUserLoggedOut = !currentUser.id;\n\n // Make nav bar sticky on main pages when user is logged out\n const isLandingPage = pathname === \"/\" || pathname.startsWith(\"/scientists\");\n const isInMarketplaceRelatedPage =\n pathname.startsWith(\"/marketplace\") ||\n pathname.startsWith(\"/research\") ||\n pathname.startsWith(\"/company\");\n\n const handleScroll = () => {\n if (isUserLoggedOut && window.scrollY >= 720 && (isLandingPage || isInMarketplaceRelatedPage)) {\n setIsSticky(true);\n } else if (window.scrollY === 0) {\n setIsSticky(false);\n }\n };\n\n useEffect(() => {\n window.addEventListener(\"scroll\", handleScroll);\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n };\n }, [pathname]);\n\n const shouldHideNavbar =\n NAVBAR_HIDDEN_PATHS.some((path) => pathname !== \"/\" && pathname.startsWith(path)) &&\n !shouldIgnoreHiddenPaths;\n if (shouldHideNavbar) return null;\n\n const hasBorder = NAVBAR_BORDER_PATHS.some(\n (path) => pathname !== \"/\" && pathname.startsWith(path)\n );\n\n // Currently this is essentially only used for when a user is logged out. Eventually this\n // should be consolidated with NavbarDropdownMenu.tsx, designs pending\n const showMobileMenuButton =\n pathname === \"/\" ||\n pathname.startsWith(\"/about\") ||\n pathname.startsWith(\"/scientists\") ||\n pathname.startsWith(\"/unsubscribe\") ||\n (!currentUser.id && isInMarketplaceRelatedPage);\n\n return (\n <>\n <LoginSignUpModal />\n <MobileMenu isOpen={isMobileMenuOpen} onClose={() => setIsMobileMenuOpen(false)} />\n <Container isSticky={isSticky} hasBorder={hasBorder} data-testid=\"navbar-main\">\n <Links>\n {isTablet && showMobileMenuButton && (\n <OpenMobileMenuButton type=\"button\" onClick={() => setIsMobileMenuOpen(true)}>\n <Icon name=\"Burger\" size=\"lg\" />\n </OpenMobileMenuButton>\n )}\n {isUserLoggedOut ? (\n <a href=\"/\">\n <Logo src={haloLogo} alt=\"Halo logo\" />\n </a>\n ) : (\n <Link to={marketplacePath()}>\n <Logo src={haloLogo} alt=\"Halo logo\" />\n </Link>\n )}\n {(() => {\n if (isTablet) return null;\n if (isUserLoggedOut) return <LoggedOutNavbarLinks />;\n if (currentUser.role === UserRole.SCIENTIST) return <ScientistNavbarLinks />;\n if (currentUser.role === UserRole.SPONSOR) return <SponsorNavbarLinks />;\n if (currentUser.role === UserRole.UNIVERSITY_ADMIN)\n return <UniversityAdminNavbarLinks />;\n })()}\n {isUserLoggedOut ? (\n <SignInButtons>\n {!isTablet && (\n <a href=\"/login\">\n <Button variant=\"ghost\" margin=\"0 8px 0 0\">\n Sign in\n </Button>\n </a>\n )}\n <a href=\"/get-started\">\n <GradientButton size=\"md\">Join now</GradientButton>\n </a>\n </SignInButtons>\n ) : (\n <NavbarDropdownMenu />\n )}\n </Links>\n </Container>\n </>\n );\n};\n\nexport default Navbar;\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n position: ${({ isSticky }) => (isSticky ? \"sticky\" : \"static\")};\n top: ${({ isSticky }) => (isSticky ? 0 : \"-84px\")};\n height: 84px;\n width: 100%;\n padding: 0 ${WINDOW_DIMENSIONS.PAGE_SIDE_PADDING}px;\n background-color: ${COLORS.WHITE};\n border-bottom: 1px solid ${({ hasBorder }) => (hasBorder ? COLORS.NEUTRAL_200 : \"transparent\")};\n z-index: 100;\n transition: top 0.3s ease;\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n padding: 0 24px;\n }\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n padding: 0 16px 0 10px;\n }\n`;\nconst Links = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n`;\nconst Logo = styled.img`\n height: 32px;\n margin-right: 24px;\n margin-left: 8px;\n`;\nconst SignInButtons = styled.div`\n display: flex;\n margin-left: auto;\n & a:hover {\n text-decoration: none;\n }\n`;\nconst OpenMobileMenuButton = styled.button`\n border: none;\n background-color: transparent;\n &:focus {\n outline: none;\n }\n`;\n","import { lazyWithRetry } from \"@utils/appUtils\";\nimport { Route } from \"react-router-dom\";\nimport {\n notification_campaigns_unsubscribe_path,\n resume_outreach_notification_campaigns_path,\n} from \"./routes.js\";\nimport { formatPathForRouter } from \"./utils\";\n\nconst UnsubscribePage = lazyWithRetry(\n () => import(\"../views/NotificationCampaigns/Unsubscribe/UnsubscribePage\")\n);\nconst ResumeOutreachPage = lazyWithRetry(\n () => import(\"../views/NotificationCampaigns/ResumeOutreach/ResumeOutreachPage\")\n);\n\nconst routes = [\n <Route\n exact\n key=\"notification_campaign_routes/1\"\n path={formatPathForRouter(notification_campaigns_unsubscribe_path())}\n component={UnsubscribePage}\n />,\n <Route\n exact\n key=\"notification_campaign_routes/2\"\n path={formatPathForRouter(resume_outreach_notification_campaigns_path())}\n component={ResumeOutreachPage}\n />,\n];\n\nexport default routes;\n","import PrivateSponsorRoute from \"@components/PrivateSponsorRoute\";\nimport { lazyWithRetry } from \"@utils/appUtils\";\nimport { RequestType } from \"src/App\";\nimport { edit_opportunity_path, new_opportunity_path } from \"./routes\";\n\nconst RfpRequestForm = lazyWithRetry(() => import(\"../views/RfpRequestForm\"));\n\nconst renderForm = (props) => {\n const searchParams = new URLSearchParams(props.location.search);\n const request_type = searchParams.get(\"type\");\n switch (request_type) {\n case RequestType.REQUEST_FOR_PROPOSAL:\n return <RfpRequestForm />;\n default:\n console.error(\"Unexpected request_type: %s.\", request_type);\n }\n};\n\nconst routes = [\n <PrivateSponsorRoute key=\"opportunity-new\" exact path={new_opportunity_path()}>\n {renderForm}\n </PrivateSponsorRoute>,\n <PrivateSponsorRoute key=\"opportunity-edit\" exact path={edit_opportunity_path(\":slug\")}>\n {renderForm}\n </PrivateSponsorRoute>,\n];\n\nexport default routes;\n","import { RequestableType } from \"@tsTypes/requests\";\nimport { lazyWithRetry } from \"@utils/appUtils\";\nimport { Route } from \"react-router-dom\";\nimport { request_for_expert_path } from \"./routes.js\";\nimport { formatPathForRouter } from \"./utils\";\n\nconst RfePage = lazyWithRetry(() => import(\"../views/RequestForExpertsPage\"));\nconst ProposalPage = lazyWithRetry(() => import(\"../views/ProposalPage\"));\n\nconst routes = [\n <Route\n exact\n key=\"rfe_routes/1\"\n path={formatPathForRouter(request_for_expert_path)}\n component={RfePage}\n />,\n <Route exact key=\"rfe_routes/2\" path={\"/request_for_expert_proposals/:slug\"}>\n <ProposalPage requestableType={RequestableType.REQUEST_FOR_EXPERT} />\n </Route>,\n];\n\nexport default routes;\n","import { lazyWithRetry } from \"@utils/appUtils\";\nimport { Redirect, Route } from \"react-router-dom\";\nimport { seo_request_for_proposal_path } from \"./routes.js\";\nimport { formatPathForRouter } from \"./utils\";\n\nconst RfpPage = lazyWithRetry(() => import(\"../views/RFPPage\"));\n\nconst routes = [\n <Route\n key=\"rfp_routes/1\"\n path={formatPathForRouter(seo_request_for_proposal_path)}\n render={({ match, location }) => (\n <Redirect to={`/request_for_solutions/${match.params.identifier}${location.search}`} />\n )}\n />,\n <Route key=\"rfp_routes/2\" exact path=\"/request_for_solutions/:identifier\" component={RfpPage} />,\n <Route key=\"rfp_routes/3\" exact path=\"/preview-rfp/:previewHash\">\n <RfpPage asPreview />\n </Route>,\n];\n\nexport default routes;\n","import { t, t_html } from \"@utils/i18n\";\nimport StatusPage from \"./StatusPage\";\n\nconst Unauthorized401 = () => {\n return (\n <StatusPage\n quote={t(\"pages.error_pages.401.quote\")}\n author={t(\"pages.error_pages.401.author\")}\n errorMessage={t_html(\"pages.error_pages.401.error_message_html\")}\n />\n );\n};\n\nexport default Unauthorized401;\n","import { t, t_html } from \"@utils/i18n\";\nimport StatusPage from \"./StatusPage\";\n\nconst Forbidden403 = () => {\n return (\n <StatusPage\n quote={t(\"pages.error_pages.403.quote\")}\n author={t(\"pages.error_pages.403.author\")}\n errorMessage={t_html(\"pages.error_pages.403.error_message_html\")}\n />\n );\n};\n\nexport default Forbidden403;\n","import Footer from \"@components/Footer\";\nimport NavBar from \"@components/Navbar\";\nimport { setShowErrorBoundary } from \"@redux/actions/defaultActions\";\nimport { t, t_html } from \"@utils/i18n\";\nimport { ReactNode, useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport styled from \"styled-components\";\nimport NotFound404 from \"../StatusPages\";\nimport Unauthorized401 from \"../StatusPages/401\";\nimport Forbidden403 from \"../StatusPages/403\";\nimport StatusPage from \"../StatusPages/StatusPage\";\n\nconst ErrorBoundaryFallback = ({ error }: { error: any }) => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(setShowErrorBoundary(true));\n }, []);\n\n // NOTE: (justinpchang) If ChunkLoadError, attempt to refresh the page once to refresh JS cache.\n if (error.name === \"ChunkLoadError\") {\n if (!window.location.hash.endsWith(\"refresh\")) {\n window.location.replace(window.location + \"#refresh\");\n window.location.reload();\n }\n }\n\n let innerComponent: ReactNode | null = null;\n if (error.isAxiosError) {\n const status = error.response.status;\n if (status === 401) {\n innerComponent = <Unauthorized401 />;\n } else if (status === 404) {\n innerComponent = <NotFound404 />;\n } else if (status === 403) {\n innerComponent = <Forbidden403 />;\n }\n } else {\n innerComponent = (\n <StatusPage\n quote={t_html(\"pages.error_pages.fallback.quote_html\")}\n author={t(\"pages.error_pages.fallback.author\")}\n errorMessage={t_html(\"pages.error_pages.fallback.error_message_html\")}\n isErrorBoundary\n />\n );\n }\n\n return (\n <Container>\n <NavBar shouldIgnoreHiddenPaths />\n {innerComponent}\n <Footer />\n </Container>\n );\n};\n\nexport default ErrorBoundaryFallback;\n\nconst Container = styled.div`\n height: 100%;\n`;\n","import { ErrorBoundary as AppsignalErrorBoundary } from \"@appsignal/react\";\nimport { useSelector } from \"react-redux\";\n\nimport { RootState } from \"@redux/store\";\nimport appsignal from \"@utils/appsignal\";\nimport ErrorBoundaryFallback from \"./ErrorBoundaryFallback\";\n\nconst ErrorBoundary = ({ children }) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n return (\n <AppsignalErrorBoundary\n instance={appsignal}\n // eslint-disable-next-line react/no-unstable-nested-components\n fallback={(error) => <ErrorBoundaryFallback error={error} />}\n tags={{ userId: currentUser?.id, userEmail: currentUser?.email }}\n >\n {children}\n </AppsignalErrorBoundary>\n );\n};\n\nexport default ErrorBoundary;\n","import { google_scholar_authors_path } from \"@routes/routes\";\nimport { GoogleScholarAuthor } from \"@tsTypes/google_scholar_authors\";\nimport request from \"./request\";\n\nexport const getGoogleScholarAuthors = async (): Promise<GoogleScholarAuthor[]> => {\n const response = await request.get(google_scholar_authors_path());\n return response.data?.authors || [];\n};\n\nexport const getGoogleScholarAuthor = async (\n authorId: string\n): Promise<{\n user_id: number;\n}> => {\n const response = await request.post(\n google_scholar_authors_path(),\n { author_id: authorId },\n { timeout: 10000 }\n );\n return response.data;\n};\n","import { ProgressStep } from \"@components/library\";\nimport { COLORS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { t } from \"@utils/i18n\";\nimport styled from \"styled-components\";\n\ninterface Props {\n completionState: {\n step1: boolean;\n step2: boolean;\n step3a: boolean;\n step3b: boolean;\n };\n}\n\nconst i18nPrefix = \"pages.onboarding_container.progress\";\n\nexport function Progress({ completionState: { step1, step2, step3b } }: Props) {\n return (\n <Tabs>\n <Tab>\n <ProgressStep\n stepNumber={1}\n label={t([i18nPrefix, \"step1\"])}\n isCurrent={!step1}\n isComplete={step1}\n needsUpdate={false}\n formVariant=\"proposal\"\n />\n <TabUnderline isCurrent={!step1} isComplete={step1} />\n </Tab>\n <Tab>\n <ProgressStep\n stepNumber={2}\n label={t([i18nPrefix, \"step2\"])}\n isCurrent={step1 && !step2}\n isComplete={step2}\n needsUpdate={false}\n formVariant=\"proposal\"\n />\n <TabUnderline isCurrent={step1 && !step2} isComplete={step2} />\n </Tab>\n <Tab>\n <ProgressStep\n stepNumber={3}\n label={t([i18nPrefix, \"step3\"])}\n isCurrent={step1 && step2 && !step3b}\n isComplete={step3b}\n needsUpdate={false}\n formVariant=\"proposal\"\n />\n <TabUnderline isCurrent={step1 && step2 && !step3b} isComplete={step3b} />\n </Tab>\n </Tabs>\n );\n}\nconst Tabs = styled.div`\n width: 100%;\n display: flex;\n gap: 8px;\n margin-bottom: 72px;\n padding: 0 50px;\n\n ${WINDOW_DIMENSIONS.TABLET_LANDSCAPE_MEDIA_QUERY} {\n padding: 0 10px;\n }\n`;\n\nconst Tab = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`;\n\nconst TabUnderline = styled.div`\n width: 100%;\n height: 5px;\n background: ${({ isCurrent }) => {\n if (isCurrent) return COLORS.BLUE_LIGHT_500;\n return COLORS.NEUTRAL_200;\n }};\n border-radius: 4px;\n &:after {\n display: block;\n content: \"\";\n height: 5px;\n width: ${({ isCurrent }) => (isCurrent ? \"50%\" : \"100%\")};\n background: ${({ isCurrent, isComplete }) => {\n if (isCurrent) return COLORS.HALO_BLUE;\n if (isComplete) return COLORS.GREEN;\n return COLORS.NEUTRAL_200;\n }};\n }\n`;\n","import { Button } from \"@components/library\";\nimport { COLORS, FEATURE_FLAGS, FONTS } from \"@constants\";\nimport { signOut } from \"@requests/users\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { track } from \"@utils/appUtils\";\nimport { assertAbsurd } from \"@utils/tsUtils\";\nimport { useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { UserDetailedType, UserInfo } from \"../OnboardingContainer\";\nimport * as S from \"../StepStyles\";\n\ninterface Props {\n values: UserInfo;\n setWork: (v?: string) => void;\n setRole: (v?: string) => void;\n setDetailedType: (v?: UserDetailedType) => void;\n onContinue: () => void;\n}\n\nfunction Step2({ values, setWork, setRole, setDetailedType, onContinue }: Props) {\n const { work, role, detailedType } = values;\n\n useEffect(() => {\n switch (detailedType) {\n case UserDetailedType.COMPANY_SPONSOR:\n case UserDetailedType.VENTURE_CAPITAL_SPONSOR:\n case UserDetailedType.GOVERNMENT_SPONSOR:\n setRole(\"company-sponsor\");\n break;\n case UserDetailedType.UNIVERSITY_SCIENTIST:\n setRole(\"research-scientist\");\n break;\n case UserDetailedType.STARTUP_SCIENTIST:\n case UserDetailedType.SUPPLIER:\n case UserDetailedType.CONSULTANT:\n setRole(\"company-scientist\");\n break;\n case UserDetailedType.UNIVERSITY_ADMINISTRATOR:\n setRole(\"research-administrator\");\n break;\n case undefined:\n break;\n default:\n assertAbsurd(detailedType);\n }\n\n if (detailedType) {\n track(SegmentEventName.Click, {\n react_component: \"Onboarding - Step2\",\n ui_component: \"Detailed type selection\",\n detailed_type: detailedType,\n });\n }\n }, [detailedType]);\n\n return (\n <S.StepContainer width=\"608px\">\n <S.StepHeader\n subheading=\"Welcome to Halo\"\n heading=\"Tell us about your organization and role.\"\n />\n <OptionsHeading>Research Institutions</OptionsHeading>\n <OptionsContainer>\n <Option\n selected={detailedType === UserDetailedType.UNIVERSITY_SCIENTIST}\n onClick={() => setDetailedType(UserDetailedType.UNIVERSITY_SCIENTIST)}\n >\n I’m a <b>researcher</b> at a university, lab, or institute\n </Option>\n <Option\n selected={detailedType === UserDetailedType.UNIVERSITY_ADMINISTRATOR}\n onClick={() => setDetailedType(UserDetailedType.UNIVERSITY_ADMINISTRATOR)}\n >\n I’m an <b>administrator</b> at a university\n </Option>\n </OptionsContainer>\n <OptionsHeading>Private Sector</OptionsHeading>\n <OptionsContainer>\n <Option\n selected={detailedType === UserDetailedType.COMPANY_SPONSOR}\n onClick={() => setDetailedType(UserDetailedType.COMPANY_SPONSOR)}\n >\n I’m in <b>corporate R&D</b>, looking to post partnering requests\n </Option>\n <Option\n selected={detailedType === UserDetailedType.STARTUP_SCIENTIST}\n onClick={() => setDetailedType(UserDetailedType.STARTUP_SCIENTIST)}\n data-testid=\"startup-scientist-radio-button\"\n >\n I’m at a <b>startup</b>, looking to submit proposals or apply to programs\n </Option>\n <Option\n selected={detailedType === UserDetailedType.SUPPLIER}\n onClick={() => setDetailedType(UserDetailedType.SUPPLIER)}\n >\n I’m at a <b>supplier or corporation</b>, looking to submit proposals\n </Option>\n <Option\n selected={detailedType === UserDetailedType.CONSULTANT}\n onClick={() => setDetailedType(UserDetailedType.CONSULTANT)}\n >\n I’m at a <b>consultancy</b>, looking to submit proposals\n </Option>\n </OptionsContainer>\n <ButtonContainer work={work}>\n {FEATURE_FLAGS.SIGN_OUT_ON_ONBOARDING && (\n <Button\n type=\"button\"\n onClick={async () => {\n await signOut();\n }}\n >\n Sign Out\n </Button>\n )}\n <Button\n type=\"button\"\n data-testid=\"step2-submit-button\"\n disabled={!role}\n onClick={onContinue}\n width=\"120px\"\n >\n Continue\n </Button>\n </ButtonContainer>\n </S.StepContainer>\n );\n}\n\nexport default Step2;\n\nconst ButtonContainer = styled.div<{ work?: string }>`\n margin-top: ${({ work }) => (work ? \"40px\" : \"0px\")};\n`;\n\nconst OptionsHeading = styled.h2`\n margin: 0 0 16px;\n ${FONTS.SEMIBOLD_1}\n`;\n\nconst OptionsContainer = styled.div`\n display: flex;\n gap: 32px;\n flex-wrap: wrap;\n margin-bottom: 56px;\n`;\n\nconst Option = styled.div<{ selected?: boolean }>`\n flex-shrink: 0;\n width: 288px;\n padding: 16px;\n border: 1px solid ${COLORS.NEUTRAL_250};\n border-radius: 6px;\n cursor: pointer;\n ${FONTS.REGULAR_1}\n\n ${({ selected }) =>\n selected &&\n `\n border: 1px solid ${COLORS.HALO_BLUE};\n background: ${COLORS.BLUE_LIGHT_300};\n color: ${COLORS.BLUE_650};\n `}\n`;\n","import { Icon, ProfilePicture } from \"@components/library\";\nimport { COLORS, FONTS, STYLES, WINDOW_DIMENSIONS } from \"@constants\";\nimport { GoogleScholarAuthor } from \"@tsTypes/google_scholar_authors\";\nimport styled from \"styled-components\";\n\ninterface Props {\n author: GoogleScholarAuthor;\n isSelected: boolean;\n onSelect: (id: number) => void;\n}\n\nconst VISIBLE_PUBLICATION_COUNT = 3;\n\nexport function AuthorCard({ author, isSelected, onSelect }: Props) {\n return (\n <Card isSelected={isSelected} onClick={() => onSelect(author.id)}>\n <ProfilePicture size=\"md\" user={author} />\n <Info>\n <h3 title={author.name}>{author.name}</h3>\n <h4 title={author.title}>{author.title}</h4>\n <h5 title={author.location}>{author.location}</h5>\n </Info>\n <Publications>\n {author.publications.slice(0, VISIBLE_PUBLICATION_COUNT).map((publication) => (\n <Publication key={`publication-${publication.id}`}>\n <Icon name=\"Publication\" size=\"md\" color={COLORS.NEUTRAL_500} />\n <span title={publication.title!}>{publication.title}</span>\n </Publication>\n ))}\n </Publications>\n </Card>\n );\n}\n\nconst Info = styled.div`\n * {\n margin: 0;\n color: inherit;\n ${STYLES.ONE_LINE_ALT}\n }\n h3 {\n ${FONTS.SEMIBOLD_1}\n }\n h4 {\n ${FONTS.MEDIUM_2}\n }\n h5 {\n ${FONTS.REGULAR_2}\n color: ${COLORS.NEUTRAL_500};\n }\n`;\n\nconst Publications = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 8px;\n`;\n\nconst Card = styled.div`\n display: grid;\n grid-template-columns: 50px 200px 1fr;\n grid-gap: 16px;\n\n width: 100%;\n height: 137px;\n padding: 24px;\n border-radius: 4px;\n cursor: pointer;\n\n ${({ isSelected }) =>\n isSelected\n ? `\n background: ${COLORS.BLUE_LIGHT_50};\n border: 1px solid ${COLORS.HALO_BLUE};\n color: ${COLORS.HALO_BLUE};\n `\n : `\n background: ${COLORS.WHITE};\n border: 1px solid ${COLORS.NEUTRAL_250};\n color: ${COLORS.BLACK};\n `}\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n display: flex;\n flex-wrap: wrap;\n height: fit-content;\n\n & > ${ProfilePicture} {\n flex-basis: 50px;\n }\n & > ${Info} {\n flex-basis: calc(100% - 50px - 16px);\n }\n & > ${Publications} {\n flex-basis: 100%;\n }\n }\n`;\n\nconst Publication = styled.div`\n display: grid;\n grid-template-columns: auto 1fr;\n grid-gap: 11px;\n max-width: 100%;\n\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.MEDIUM_2}\n\n & > span {\n ${STYLES.ONE_LINE_ALT}\n }\n`;\n","import toast from \"@components/Toast\";\nimport { Button, InfoTag } from \"@components/library\";\nimport { SearchBarInput } from \"@components/library/Inputs/SearchBarInput\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { getGoogleScholarAuthor } from \"@requests/googleScholarAuthors\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { GoogleScholarAuthor } from \"@tsTypes/google_scholar_authors\";\nimport { track } from \"@utils/appUtils\";\nimport appsignal from \"@utils/appsignal\";\nimport Fuse from \"fuse.js\";\nimport { Dispatch, SetStateAction, useEffect, useMemo, useState } from \"react\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\nimport { UserInfo } from \"../OnboardingContainer\";\nimport { StepHeader } from \"../StepStyles\";\nimport { AuthorCard } from \"./AuthorCard\";\n\ninterface Props {\n userInfo: UserInfo;\n onContinue: (step: string) => void;\n onBack: (step: string) => void;\n authors: GoogleScholarAuthor[];\n selectedAuthorId: number | null;\n setSelectedAuthorId: Dispatch<SetStateAction<number | null>>;\n numDisplayed: number;\n setNumDisplayed: Dispatch<SetStateAction<number>>;\n filteredAuthorIds: number[];\n setFilteredAuthorIds: Dispatch<SetStateAction<number[]>>;\n isFetching: boolean;\n}\n\nexport const DISPLAY_INCREMENT = 3;\n\nconst getAuthorIdFromUrl = (url: string): string | null => {\n try {\n const urlObj = new URL(url);\n if (urlObj.host.includes(\"scholar.google\")) {\n const authorId = urlObj.searchParams.get(\"user\");\n if (authorId) {\n return authorId;\n }\n }\n } catch (e) {\n // Not a valid URL\n }\n\n return null;\n};\n\nexport function Step3aGoogleScholar({\n userInfo,\n onContinue,\n onBack,\n authors,\n selectedAuthorId,\n setSelectedAuthorId,\n numDisplayed,\n setNumDisplayed,\n filteredAuthorIds,\n setFilteredAuthorIds,\n isFetching,\n}: Props) {\n const [searchText, setSearchText] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const queryClient = useQueryClient();\n\n useEffect(() => {\n setNumDisplayed(DISPLAY_INCREMENT);\n setFilteredAuthorIds(authors.map((author) => author.id));\n }, []);\n\n useEffect(() => {\n if (filteredAuthorIds.length === 0) {\n setFilteredAuthorIds(authors.map((author) => author.id));\n }\n }, [authors]);\n\n useEffect(() => {\n if (!searchText && filteredAuthorIds.length === 0) {\n setFilteredAuthorIds(authors.map((author) => author.id));\n setNumDisplayed(DISPLAY_INCREMENT);\n }\n }, [searchText]);\n\n const { mutate: getAuthor } = useMutation({\n mutationFn: getGoogleScholarAuthor,\n onSuccess: ({ user_id }) => {\n setTimeout(() => {\n queryClient.invalidateQueries({ queryKey: [\"getGoogleScholarAuthors\"] });\n setSelectedAuthorId(user_id);\n setFilteredAuthorIds([user_id]);\n setIsLoading(false);\n }, 1000);\n },\n onError: (err) => {\n toast.error(\n \"Something went wrong while fetching your Google Scholar profile. Please try again.\"\n );\n appsignal.sendError(err as any, (span) => {\n span.setAction(\"Step3aGoogleScholar#getAuthor\");\n });\n setIsLoading(false);\n },\n });\n\n const fuse = useMemo(\n () => new Fuse(authors, { keys: [\"name\", \"location\", \"publications.title\"] }),\n [authors]\n );\n\n const filter = (input: string): void => {\n setNumDisplayed(DISPLAY_INCREMENT);\n\n if (!input) {\n setFilteredAuthorIds(authors.map((author) => author.id));\n return;\n }\n\n // Check if input is a Google Scholar URL\n const authorId = getAuthorIdFromUrl(input);\n\n track(SegmentEventName.Search, {\n react_component: \"Step3aGoogleScholar\",\n search_query: input,\n has_author_id: Boolean(authorId),\n });\n\n if (authorId) {\n setIsLoading(true);\n getAuthor(authorId);\n return;\n }\n\n const result = fuse.search(input);\n setFilteredAuthorIds(result.map((r) => r.item.id));\n };\n\n const isResearcher =\n userInfo.role === \"research-scientist\" || userInfo.role === \"company-scientist\";\n const hasResults = authors.length > 0;\n\n // Skip if not researcher or no results (after final refetch)\n if (!isResearcher || (!isFetching && !hasResults)) {\n onContinue(\"step3a\");\n return null;\n }\n\n // Show loader if final refetch is underway\n if (!hasResults) {\n return <Loader active inline=\"centered\" />;\n }\n\n return (\n <Container>\n <StepHeader\n subheading=\"Import profile information\"\n heading={\n <>\n Is this you? You can select a <b>Google Scholar</b> account to save time building your\n Halo profile, or skip to the next step.\n </>\n }\n />\n <FilterContainer>\n <SearchBarInput\n value={searchText}\n onChange={setSearchText}\n onSubmit={filter}\n placeholder=\"Filter by institution, publication, Google Scholar URL, etc.\"\n />\n <div>\n <InfoTag backgroundColor={COLORS.NEUTRAL_400}>{filteredAuthorIds.length}</InfoTag>\n Google Scholar accounts found\n </div>\n </FilterContainer>\n <AuthorsContainer>\n {isLoading ? (\n <>\n Searching for provided Google Scholar URL...\n <Loader active inline=\"centered\" />\n </>\n ) : (\n <>\n {filteredAuthorIds.slice(0, numDisplayed).map((authorId) => {\n const author = authors.find(({ id }) => id === authorId);\n if (!author) return null;\n return (\n <AuthorCard\n key={`author-${author.id}`}\n author={author}\n isSelected={selectedAuthorId === author.id}\n onSelect={(id) => {\n setSelectedAuthorId(id);\n track(SegmentEventName.Click, {\n react_component: \"Step3aGoogleScholar\",\n ui_component: \"AuthorCard\",\n author_id: id,\n });\n }}\n />\n );\n })}\n {numDisplayed < filteredAuthorIds.length && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setNumDisplayed(numDisplayed + DISPLAY_INCREMENT);\n track(SegmentEventName.Click, {\n react_component: \"Step3aGoogleScholar\",\n ui_component: \"Load More Button\",\n num_displayed: numDisplayed + DISPLAY_INCREMENT,\n total: filteredAuthorIds.length,\n });\n }}\n >\n Load more\n </Button>\n )}\n </>\n )}\n </AuthorsContainer>\n <ButtonsContainer canLoadMore={numDisplayed < authors.length}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n onBack(\"step2\");\n track(SegmentEventName.Click, {\n react_component: \"Step3aGoogleScholar\",\n ui_component: \"Back Button\",\n total: filteredAuthorIds.length,\n author_id: selectedAuthorId,\n });\n }}\n >\n Back\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n margin=\"0 24px\"\n onClick={() => {\n onContinue(\"step3a\");\n track(SegmentEventName.Click, {\n react_component: \"Step3aGoogleScholar\",\n ui_component: \"Next Button (with selection)\",\n total: filteredAuthorIds.length,\n author_id: selectedAuthorId,\n });\n }}\n disabled={!selectedAuthorId}\n >\n Continue\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n setSelectedAuthorId(null);\n onContinue(\"step3a\");\n track(SegmentEventName.Click, {\n react_component: \"Step3aGoogleScholar\",\n ui_component: \"Skip Button\",\n total: filteredAuthorIds.length,\n });\n }}\n >\n Skip\n </Button>\n </ButtonsContainer>\n </Container>\n );\n}\n\nexport const Container = styled.div`\n text-align: left;\n padding: 0;\n width: 800px;\n margin-bottom: 200px;\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n padding: 0 30px;\n width: 100%;\n }\n`;\n\nexport const StepTitle = styled.h1`\n margin: 0 0 8px;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.SEMIBOLD_1}\n`;\n\nexport const StepInfo = styled.h2`\n margin: 0;\n ${FONTS.HEADING_3_REGULAR}\n`;\n\nconst FilterContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n margin: 32px 0;\n color: ${COLORS.BLACK};\n ${FONTS.REGULAR_2}\n\n & > form {\n width: min(100%, 515px);\n }\n\n & > div {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n`;\n\nconst AuthorsContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n ${FONTS.SEMIBOLD_2}\n`;\n\nconst ButtonsContainer = styled.div`\n width: 100%;\n margin-top: ${({ canLoadMore }) => (canLoadMore ? \"28px\" : \"40px\")};\n padding-top: 44px;\n border-top: 1px solid ${COLORS.NEUTRAL_200};\n line-height: 50px;\n`;\n","import Icon, { IconName } from \"@components/library/Icon/Icon\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { ReactNode } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\ninterface Props {\n iconName: IconName;\n title: string | ReactNode;\n description: string | ReactNode;\n to: string;\n width: string;\n}\n\nexport default function Step4NextStep({ iconName, title, description, to, width }: Props) {\n return (\n <Container to={to} width={width}>\n <Icon name={iconName} size=\"md\" color={COLORS.BLACK} />\n <Title>{title}</Title>\n <Description>{description}</Description>\n </Container>\n );\n}\n\nconst Container = styled(Link)`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n width: ${({ width }) => width};\n height: 152px;\n padding: 16px;\n\n cursor: pointer;\n border-radius: 6px;\n border: 1px solid ${COLORS.NEUTRAL_250};\n\n &:hover {\n text-decoration: none;\n }\n`;\n\nconst Title = styled.h3`\n margin: 0;\n color: ${COLORS.HALO_BLUE};\n ${FONTS.REGULAR_1}\n`;\n\nconst Description = styled.p`\n margin: 0;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.MEDIUM_3}\n line-height: 1.5;\n`;\n","import { TextButton } from \"@components/library\";\nimport { WINDOW_DIMENSIONS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { company_scientist_network_path, reviewer_dashboard_path } from \"@routes/routes\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { getPrevUrlCookie } from \"@utils/authUtils\";\nimport { useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport * as S from \"../StepStyles\";\nimport Step4NextStep from \"./Step4NextStep\";\n\nconst Step4 = ({ userType }) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const subscription = useSelector((state: RootState) => state.company.subscription);\n\n const routeToPrevUrl = () => {\n getPrevUrlCookie(marketplacePath(\"requests\", { follow: \"true\" }), false, currentUser.role);\n };\n\n const hasPreviousAction = Boolean(getPrevUrlCookie(\"\", false, currentUser.role ?? 0, false));\n\n return (\n <S.StepContainer\n width={[\"research-scientist\", \"company-scientist\"].includes(userType) ? \"800px\" : \"592px\"}\n >\n <S.StepHeader\n subheading=\"Explore Halo\"\n heading={\n <>\n Welcome, {currentUser.first_name}!\n <br />\n Here's what you can do next on Halo.\n </>\n }\n />\n <NextStepsContainer>\n {(() => {\n switch (userType) {\n case \"research-scientist\":\n case \"company-scientist\":\n return (\n <>\n <Step4NextStep\n iconName=\"Profile\"\n title=\"Refine your profile and get discovered\"\n description=\"Add a summary of your work, publications, patents, and more.\"\n to={`/profile/${currentUser.first_name}-${currentUser.last_name}-${currentUser.id}`}\n width=\"246px\"\n />\n <Step4NextStep\n iconName=\"Search\"\n title=\"Find opportunities on the marketplace\"\n description=\"Find opportunities to offer your expertise or apply to R&D requests.\"\n to={marketplacePath(\"requests\")}\n width=\"246px\"\n />\n <Step4NextStep\n iconName=\"Organization\"\n title=\"Join company networks\"\n description=\"Discover and connect with R&D teams actively looking to engage with experts.\"\n to={marketplacePath(\"partners\")}\n width=\"246px\"\n />\n </>\n );\n case \"company-sponsor\":\n return (\n <>\n <Step4NextStep\n iconName=\"RFP\"\n title=\"Draft your first partnering request\"\n description=\"Create a draft of your request and submit it for publishing.\"\n to={reviewer_dashboard_path({ create: true })}\n width=\"280px\"\n />\n {subscription?.features.company_scientist_network &&\n (subscription.features.global_network_search ? (\n <Step4NextStep\n iconName=\"Search\"\n title=\"Search for partners on Halo's network\"\n description=\"Search our network of experts actively seeking to partner.\"\n to={company_scientist_network_path()}\n width=\"280px\"\n />\n ) : (\n <Step4NextStep\n iconName=\"Profile\"\n title=\"Help build your organization's network\"\n description=\"Use Halo to centralize your network of existing partners for your team.\"\n to={company_scientist_network_path()}\n width=\"280px\"\n />\n ))}\n </>\n );\n case \"research-administrator\":\n return (\n <>\n <Step4NextStep\n iconName=\"Profile\"\n title=\"Invite faculty members to join Halo\"\n description=\"Introduce researchers to Halo to help them find relevant opportunities.\"\n to=\"/\"\n width=\"280px\"\n />\n <Step4NextStep\n iconName=\"Search\"\n title=\"Find opportunities on the marketplace\"\n description=\"Find opportunities to share with faculty members.\"\n to={marketplacePath(\"requests\")}\n width=\"280px\"\n />\n </>\n );\n }\n })()}\n </NextStepsContainer>\n {(hasPreviousAction || userType === \"company-sponsor\") && (\n <TextButton\n onClick={routeToPrevUrl}\n text=\"...or continue where you left off\"\n size=\"md\"\n iconName=\"Arrow Right\"\n margin=\"48px 0 0\"\n />\n )}\n </S.StepContainer>\n );\n};\n\nexport default Step4;\n\nconst NextStepsContainer = styled.div`\n display: flex;\n gap: 32px;\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n flex-direction: column;\n }\n`;\n","import toast from \"@components/Toast\";\nimport UserVerificationCode from \"@components/UserVerificationCode\";\nimport { TextButton } from \"@components/library\";\nimport { COLORS } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport { fetchSubscription } from \"@redux/actions/companyActions\";\nimport { setCurrentUser } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getCompany } from \"@requests/companies\";\nimport { getGoogleScholarAuthors } from \"@requests/googleScholarAuthors\";\nimport { trackRegistration } from \"@requests/hubspot\";\nimport { UserNotVerifiedError, cancelSignUp, onboard } from \"@requests/users\";\nimport { proposal_review_system_path } from \"@routes/routes\";\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { ShowCompany } from \"@tsTypes/index\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { identify, track } from \"@utils/appUtils\";\nimport appsignal from \"@utils/appsignal\";\nimport { t } from \"@utils/i18n\";\nimport { toastErrorHandler } from \"@utils/requests\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useHistory, useParams } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { Progress } from \"./Progress\";\nimport Step2 from \"./Step2\";\nimport Step3 from \"./Step3\";\nimport { DISPLAY_INCREMENT, Step3aGoogleScholar } from \"./Step3aGoogleScholar/Step3aGoogleScholar\";\nimport Step4 from \"./Step4\";\n\nexport enum UserDetailedType {\n // Scientist user types\n UNIVERSITY_SCIENTIST = \"university scientist\",\n STARTUP_SCIENTIST = \"startup scientist\",\n SUPPLIER = \"supplier\",\n CONSULTANT = \"consultant\",\n // Sponsor user types\n COMPANY_SPONSOR = \"company sponsor\",\n VENTURE_CAPITAL_SPONSOR = \"venture capital sponsor\", // Deprecated\n GOVERNMENT_SPONSOR = \"government sponsor\", // Deprecated\n // Admin user types\n UNIVERSITY_ADMINISTRATOR = \"university administrator\",\n}\n\nexport interface UserInfo {\n work: string;\n role: string;\n detailedType?: UserDetailedType;\n}\n\nfunction OnboardingContainer() {\n const [profileInfo, setProfileInfo] = useState<any>({});\n const [completionState, setCompletionState] = useState({\n step1: false,\n step2: false,\n step3a: false,\n step3b: false,\n });\n const [userInfo, setUserInfo] = useState<UserInfo>({\n work: \"\",\n role: \"\",\n detailedType: undefined,\n });\n const [company, setCompany] = useState<ShowCompany | null>(null);\n\n const [selectedGoogleScholarAuthorId, setSelectedGoogleScholarAuthorId] = useState<number | null>(\n null\n );\n const [googleScholarAuthorsDisplayCount, setGoogleScholarAuthorsDisplayCount] =\n useState(DISPLAY_INCREMENT);\n const [filteredGoogleScholarAuthorIds, setFilteredGoogleScholarAuthorIds] = useState<number[]>(\n []\n );\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const { company_identifier } = useParams();\n const dispatch = useDispatch();\n const history = useHistory();\n\n const [searchParams] = useSearchParams();\n const commenterInviteRequest = searchParams.get(\"commenter_invite_request\");\n\n useEffect(() => {\n if (currentUser.profile_info?.id) {\n history.push(\"/\");\n }\n if (currentUser.verified) {\n onContinue(\"step1\");\n }\n }, []);\n\n useEffect(() => {\n if (completionState.step1 && commenterInviteRequest) {\n setUserInfo({\n ...userInfo,\n role: \"company-sponsor\",\n detailedType: UserDetailedType.COMPANY_SPONSOR,\n });\n setCompletionState({ ...completionState, step1: true, step2: true });\n }\n }, [completionState.step1]);\n\n useEffect(() => {\n (async () => {\n if (company_identifier) {\n try {\n const response = await getCompany(company_identifier);\n setCompany(response.company);\n } catch (error) {\n console.error(error);\n }\n }\n })();\n }, [company_identifier]);\n\n const scrollToRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n scrollToRef.current?.scrollIntoView({ behavior: \"smooth\" });\n track(SegmentEventName.View, {\n react_component: \"OnboardingContainer\",\n completionState,\n });\n }, [completionState]);\n\n const {\n data: googleScholarAuthors,\n refetch: refetchGoogleScholarAuthors,\n isFetching: isGoogleScholarAuthorsFetching,\n } = useQuery({\n queryKey: [\"getGoogleScholarAuthors\"],\n queryFn: getGoogleScholarAuthors,\n refetchInterval: () => {\n if (completionState.step2) {\n return false;\n }\n return 3000;\n },\n });\n\n const onboardMutation = useMutation({\n mutationFn: (userType: string) =>\n onboard({\n userType,\n profileInfo,\n googleScholarAuthorUserId: selectedGoogleScholarAuthorId,\n detailedType: userInfo.detailedType,\n commenterInviteRequest,\n }),\n onError: (error, variables, context): void => {\n if (error instanceof UserNotVerifiedError) {\n setCompletionState({\n step1: false,\n step2: false,\n step3a: false,\n step3b: false,\n });\n toast.error(t(\"pages.onboarding_container.user_not_verified_message\"));\n return;\n }\n toastErrorHandler(error, variables, context);\n },\n onSuccess: async (updatedUser: any) => {\n dispatch(setCurrentUser(updatedUser));\n\n await trackRegistration({\n ...updatedUser,\n ...(updatedUser.userType === \"admin\" && { role: 2 }),\n });\n identify(updatedUser);\n\n if (updatedUser.role === UserRole.SPONSOR) {\n dispatch(fetchSubscription(updatedUser.profile_info.company_identifier));\n\n if (commenterInviteRequest) {\n history.push(proposal_review_system_path({ request: commenterInviteRequest }));\n }\n }\n\n onContinue(\"step3b\");\n },\n });\n\n const cancelSignUpMutation = useMutation({\n mutationFn: () => cancelSignUp(completionState.toString()),\n onSuccess: () => {\n // Take user back to landing page after canceling sign up\n window.location.href = \"/\";\n },\n onError: toastErrorHandler,\n });\n\n const handleOnboard = (userType: string) => {\n if (onboardMutation.isLoading) {\n return;\n }\n onboardMutation.mutate(userType);\n };\n\n const onVerify = () => {\n dispatch(\n setCurrentUser({\n ...currentUser,\n verified: true,\n })\n );\n onContinue(\"step1\");\n };\n\n const updateValue = (value, newValue) => {\n if (newValue !== userInfo[value]) {\n setProfileInfo({\n ...(profileInfo?.university ? { university: profileInfo.university } : null),\n });\n }\n // if user selects a new work value, then clear role value\n if (value === \"work\" && newValue !== userInfo.work) {\n setUserInfo({\n work: newValue,\n role: \"\",\n });\n } else {\n setUserInfo((prevUserInfo) => {\n const updatedUserInfo = { ...prevUserInfo };\n updatedUserInfo[value] = newValue;\n return updatedUserInfo;\n });\n }\n };\n\n // when the back button is pressed, set the previous step to incomplete\n const onBack = (previousStep) => {\n setCompletionState({ ...completionState, [previousStep]: false });\n };\n\n // when the continue button is pressed, set the current step to complete\n const onContinue = (currentStep) => {\n setCompletionState({ ...completionState, [currentStep]: true });\n };\n\n const currentStep = () => {\n const { step1, step2, step3a, step3b } = completionState;\n if (!step1) {\n return <UserVerificationCode onContinue={onVerify} />;\n } else if (!step2) {\n return (\n <Step2\n values={userInfo}\n setWork={(v) => updateValue(\"work\", v)}\n setRole={(v) => updateValue(\"role\", v)}\n setDetailedType={(v) => updateValue(\"detailedType\", v)}\n onContinue={() => {\n refetchGoogleScholarAuthors();\n onContinue(\"step2\");\n }}\n />\n );\n } else if (!step3a) {\n return (\n <Step3aGoogleScholar\n userInfo={userInfo}\n onContinue={onContinue}\n onBack={onBack}\n authors={googleScholarAuthors ?? []}\n selectedAuthorId={selectedGoogleScholarAuthorId}\n setSelectedAuthorId={setSelectedGoogleScholarAuthorId}\n numDisplayed={googleScholarAuthorsDisplayCount}\n setNumDisplayed={setGoogleScholarAuthorsDisplayCount}\n filteredAuthorIds={filteredGoogleScholarAuthorIds}\n setFilteredAuthorIds={setFilteredGoogleScholarAuthorIds}\n isFetching={isGoogleScholarAuthorsFetching}\n />\n );\n } else if (!step3b) {\n return (\n <Step3\n userType={userInfo.role}\n handleOnboard={handleOnboard}\n isSubmitting={onboardMutation.isLoading}\n onBack={() => {\n setCompletionState({\n ...completionState,\n // Go all the way back to step2 if step3a was not supposed to be shown\n step2:\n Number(googleScholarAuthors?.length) > 0 &&\n (userInfo.role === \"research-scientist\" || userInfo.role === \"company-scientist\"),\n step3a: false,\n });\n }}\n profileInfo={profileInfo}\n setProfileInfo={setProfileInfo}\n user={currentUser}\n selectedGoogleScholarAuthor={googleScholarAuthors?.find(\n ({ id }) => id === selectedGoogleScholarAuthorId\n )}\n />\n );\n }\n return <Step4 userType={userInfo.role} />;\n };\n\n const allStepsComplete = Object.values(completionState).every((step) => step);\n\n return (\n <OnboardingPage>\n <Banner>\n <img src={haloLogo} />\n {!allStepsComplete && (\n <TextButton\n text={t(\"pages.onboarding_container.cancel_sign_up\")}\n color={COLORS.HALO_BLUE}\n iconName={null}\n onClick={() => {\n track(SegmentEventName.Click, {\n react_component: \"OnboardingContainer\",\n ui_component: \"Cancel sign up button\",\n });\n cancelSignUpMutation.mutate({});\n }}\n disabled={cancelSignUpMutation.isLoading}\n />\n )}\n </Banner>\n <Progress completionState={completionState} />\n <StepContainer>\n <div ref={scrollToRef} />\n {currentStep()}\n </StepContainer>\n </OnboardingPage>\n );\n}\n\nexport default OnboardingContainer;\n\nconst OnboardingPage = styled.div`\n display: flex;\n flex: 1;\n flex-direction: column;\n height: 100%;\n width: 100%;\n align-items: center;\n`;\n\nconst Banner = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n text-align: center;\n background-color: ${COLORS.WHITE};\n height: 84px;\n margin-bottom: 48px;\n width: 100vw;\n padding: 26px 36px;\n border-bottom: 1px solid ${COLORS.NEUTRAL_200};\n`;\nconst StepContainer = styled.div`\n padding-bottom: 40px;\n`;\n","import MasqueradeBar from \"@components/MasqueradeBar\";\nimport Messenger from \"@components/Messenger/Messenger\";\nimport MobileRestricted from \"@components/MobileRestricted\";\nimport PrivateSponsorRoute from \"@components/PrivateSponsorRoute\";\nimport SubscriptionWarning from \"@components/SubscriptionWarning\";\nimport TaxonomyUpdateModal from \"@components/TaxonomyUpdateModal\";\nimport { Toaster } from \"@components/Toast\";\nimport toast from \"@components/Toast/Toast\";\nimport SSOSponsorOnboardingModal from \"@components/modals/SSOSponsorOnboardingModal\";\nimport { COLORS, FEATURE_FLAGS, JS_FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { fetchSubscription as fetchSubscriptionAction } from \"@redux/actions/companyActions\";\nimport { clearMessengerState as clearMessengerStateAction } from \"@redux/actions/messengerActions\";\nimport { signOut } from \"@requests/users\";\nimport SubmitProposalRedirect from \"@routes/SubmitProposalRedirect\";\nimport { login_path, profile_page_path } from \"@routes/routes\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { MutationCache, QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\";\nimport { RequestableType } from \"@tsTypes/requests\";\nimport { UserRole } from \"@tsTypes/users\";\nimport ScrollToTop from \"@utils/ScrollToTop\";\nimport { identify, lazyWithRetry, page, setPageTitle } from \"@utils/appUtils\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { t } from \"@utils/i18n\";\nimport { StyleSheet, css } from \"aphrodite\";\nimport axios from \"axios\";\nimport dayjs from \"dayjs\";\nimport { PureComponent, Suspense } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Redirect, Route, Switch } from \"react-router-dom\";\nimport { Loader } from \"semantic-ui-react\";\nimport Footer from \"./components/Footer\";\nimport Navbar from \"./components/Navbar\";\nimport PrivateRoute from \"./components/PrivateRoute\";\nimport { USER_ROLES } from \"./constants/users\";\nimport {\n checkUnread as checkUnreadAction,\n fetchCurrentUser as fetchCurrentUserAction,\n setCurrentUser as setCurrentUserAction,\n} from \"./redux/actions/profileActions\";\nimport { updateWindowDimension as updateWindowDimensionAction } from \"./redux/actions/windowDimensionsActions\";\nimport NotificationCampaignRoutes from \"./routes/notification_campaign_routes\";\nimport OpportunityRoutes from \"./routes/opportunity_routes\";\nimport RequestForExpertRoutes from \"./routes/request_for_expert_routes\";\nimport RfpRoutes from \"./routes/rfp_routes\";\nimport ErrorBoundary from \"./views/ErrorBoundary\";\nimport OnboardingContainer from \"./views/Onboarding/OnboardingContainer\";\nimport Unauthorized401 from \"./views/StatusPages/401\";\nimport Forbidden403 from \"./views/StatusPages/403\";\nimport NotFound404 from \"./views/StatusPages/404\";\nconst RequestForStartupPage = lazyWithRetry(() => import(\"./views/RequestForStartupPage\"));\nconst JobPage = lazyWithRetry(() => import(\"./views/JobPage\"));\nconst CompanyPage = lazyWithRetry(() => import(\"./views/CompanyPage\"));\nconst ProfilePage = lazyWithRetry(() => import(\"./views/ProfilePage\"));\nconst ReviewerDashboard = lazyWithRetry(() => import(\"./views/ReviewerDashboard\"));\nconst ProposalReviewSystem = lazyWithRetry(() => import(\"./views/ProposalReviewSystem\"));\nconst Account = lazyWithRetry(() => import(\"./views/Account\"));\nconst RfpOpenCallProposalForm = lazyWithRetry(() => import(\"./views/RfpOpenCallProposalForm\"));\nconst RequestForStartupProposalForm = lazyWithRetry(\n () => import(\"./views/RequestForStartupProposalForm\")\n);\nconst RequestForExpertProposalForm = lazyWithRetry(\n () => import(\"./views/RequestForExpertProposalForm\")\n);\nconst CommercialApplicationPage = lazyWithRetry(() => import(\"./views/CommercialApplicationPage\"));\nconst Marketplace = lazyWithRetry(() => import(\"./views/Marketplace\"));\nconst TermsPage = lazyWithRetry(() => import(\"./views/TermsPage\"));\nconst PrivacyPage = lazyWithRetry(() => import(\"./views/PrivacyPage\"));\nconst ContactPage = lazyWithRetry(() => import(\"./views/ContactPage\"));\nconst SponsorTeam = lazyWithRetry(() => import(\"./views/SponsorTeam\"));\nconst ForgotPassword = lazyWithRetry(() => import(\"./views/ForgotPassword\"));\nconst ChangePassword = lazyWithRetry(() => import(\"./views/ChangePassword\"));\nconst ProposalPage = lazyWithRetry(() => import(\"./views/ProposalPage\"));\nconst ScientistProposalLibrary = lazyWithRetry(() => import(\"./views/ScientistProposalLibrary\"));\nconst Careers = lazyWithRetry(() => import(\"./views/Careers\"));\nconst Inbox = lazyWithRetry(() => import(\"./views/Inbox\"));\nconst ProposalLibrary = lazyWithRetry(() => import(\"./views/ProposalLibrary\"));\nconst ScientistNetwork = lazyWithRetry(() => import(\"./views/ScientistNetwork\"));\nconst AboutUs = lazyWithRetry(() => import(\"./views/AboutUs\"));\nconst LoginPage = lazyWithRetry(() => import(\"./views/LoginPage\"));\nconst SignUp = lazyWithRetry(() => import(\"./views/SignUp/SignUp\"));\nconst ScientistNetworkSignUp = lazyWithRetry(() => import(\"./views/ScientistNetworkSignUp\"));\nconst RecommendedRfpSignUp = lazyWithRetry(() => import(\"./views/RecommendedRfpSignUp\"));\nconst UniversityProposalLibrary = lazyWithRetry(() => import(\"./views/UniversityProposalLibrary\"));\nconst UniversityTeam = lazyWithRetry(() => import(\"./views/UniversityTeam\"));\nconst FeatureRequestSplashPage = lazyWithRetry(() => import(\"./views/FeatureRequestSplashPage\"));\n\nconst { TABLET_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nexport enum RequestType {\n REQUEST_FOR_PROPOSAL = \"request_for_proposal\",\n OPEN_CALL = \"open_call\",\n REQUEST_FOR_STARTUP = \"request_for_startup\",\n REQUEST_FOR_EXPERT = \"request_for_experts\",\n}\n\nexport const REQUESTABLE_TO_REQUEST_TYPE = {\n [RequestableType.RFP]: RequestType.REQUEST_FOR_PROPOSAL,\n [RequestableType.OPEN_CALL]: RequestType.OPEN_CALL,\n [RequestableType.REQUEST_FOR_STARTUP]: RequestType.REQUEST_FOR_STARTUP,\n [RequestableType.REQUEST_FOR_EXPERT]: RequestType.REQUEST_FOR_EXPERT,\n};\n\n// TODO: (overload119) Add correct typing.\ntype Props = any;\ninterface State {\n isTaxonomyUpdateModalOpen: boolean;\n isSSOSponsorOnboardingModalOpen: boolean;\n isCurrentUserLoading: boolean;\n}\n\nconst queryClient = new QueryClient({\n mutationCache: new MutationCache({\n onError: (error, _variables, _context, mutation) => {\n // Skip if the mutation has its own error handler\n if (mutation.options.onError) return;\n\n const meta = mutation.meta;\n if (!meta?.useGlobalErrorHandler || !axios.isAxiosError(error)) {\n return;\n }\n\n const errorMessage = error.response?.data?.error ?? error.response?.data.errors;\n if (Array.isArray(errorMessage)) {\n toast.error(\n <div className=\"with-list\">\n The following errors prevented that action:\n <ul>\n {errorMessage.map((err) => (\n <li key={err}>{err}</li>\n ))}\n </ul>\n </div>\n );\n } else if (errorMessage) {\n toast.error(errorMessage);\n } else if (error.response?.status === 401) {\n toast.error(\n <div>\n You have to be logged in to do that. <a href={login_path()}>Click here to log in</a>\n </div>\n );\n } else if (error.response?.status === 403) {\n toast.error(\"You don't have permission to do that.\");\n } else {\n const status = error?.response?.status;\n toast.error(\n t([\"error\", status ? \"default_with_code\" : \"default\"], { status: status ?? 500 })\n );\n }\n },\n }),\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\nconst TIMEOUT_IN_MS = 900000; // 15 minutes\nlet sessionTimer: null | number = null;\n\nconst isPageRequiringReload = (url: string): boolean => {\n return url.startsWith(\"/scientists\");\n};\n\nclass App extends PureComponent<Props, State> {\n listener: (() => void) | null;\n\n constructor(props) {\n super(props);\n\n this.listener = null;\n this.state = {\n isTaxonomyUpdateModalOpen: false,\n isSSOSponsorOnboardingModalOpen: false,\n isCurrentUserLoading: true,\n };\n\n axios.defaults.headers.common.Accept = \"application/json\";\n axios.defaults.headers.common[\"Content-Type\"] = \"application/json\";\n }\n\n async componentDidMount() {\n const {\n updateWindowDimension,\n fetchCurrentUser,\n checkUnread,\n clearMessengerState,\n fetchSubscription,\n history,\n } = this.props;\n\n this.listener = history.listen((location, action: \"POP\" | \"PUSH\") => {\n if (action === \"POP\" && isPageRequiringReload(location.pathname)) {\n window.location.reload();\n }\n });\n\n checkUnread();\n page();\n\n // Listen for window resizing, and update `windowDimension` in Redux\n window.addEventListener(\"resize\", updateWindowDimension);\n\n if (window.outerWidth > 0 && window.outerHeight > 0) {\n // Sometimes window hasn't fully loaded yet so we shouldn't set to 0 in those\n // cases\n updateWindowDimension();\n }\n\n const user = await fetchCurrentUser(true);\n\n if (!user.id) {\n clearMessengerState();\n } else {\n // Fetch subscription info if user is a sponsor\n if (user.role === USER_ROLES.sponsor) {\n fetchSubscription(user.profile_info.company_identifier);\n }\n\n const wasUserCreatedMoreThan1DayAgo = dayjs().diff(dayjs(user.created_at), \"days\") > 1;\n const isSponsorUserMissingTitleAndRole =\n user?.role === UserRole.SPONSOR &&\n user.profile_info &&\n !user.profile_info.title &&\n !user.profile_info.role;\n\n this.setState({\n isTaxonomyUpdateModalOpen:\n !location.pathname.startsWith(\"/onboarding\") &&\n !location.pathname.startsWith(\"/contact\") &&\n user?.role !== UserRole.UNIVERSITY_ADMIN &&\n user?.has_updated_taxonomy === false,\n isSSOSponsorOnboardingModalOpen:\n !location.pathname.startsWith(\"/onboarding\") &&\n !location.pathname.startsWith(\"/network\") &&\n !location.pathname.startsWith(\"/contact\") &&\n wasUserCreatedMoreThan1DayAgo &&\n isSponsorUserMissingTitleAndRole,\n });\n }\n\n this.setState({\n isCurrentUserLoading: false,\n });\n\n // Move webflow content into the webflow container in order to place between navbar and footer\n const webflowContent = document.getElementById(\"webflow-content\");\n if (webflowContent) {\n const webflowContainer = document.getElementById(\"webflow-container\");\n\n if (\n this.props.location.pathname === \"/\" ||\n this.props.location.pathname.startsWith(\"/scientists\")\n ) {\n webflowContainer?.appendChild(webflowContent);\n\n // Display the webflow content after moving to prevent initial flashing\n webflowContent.style.display = \"block\";\n }\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.windowWidth === this.props.windowWidth) {\n this.props.checkUnread();\n }\n\n if (this.props?.currentUser) {\n identify(this.props.currentUser);\n\n // NOTE: (overload119) An idle page will\n // auto-logout if this feature is enabled.\n if (this.props.currentUser?.id && FEATURE_FLAGS.SESSION_TIMEOUT) {\n // Prevent more than 1 instance of the timeout.\n if (sessionTimer !== null) {\n clearTimeout(sessionTimer);\n }\n sessionTimer = setTimeout(async () => {\n await signOut();\n toast.error(\"You have been signed out due to inactivity.\");\n clearTimeout(sessionTimer as number);\n sessionTimer = null;\n }, TIMEOUT_IN_MS) as unknown as number;\n }\n }\n\n if (this.props.location !== prevProps.location) {\n page();\n }\n }\n\n componentWillUnmount() {\n const { updateWindowDimension } = this.props;\n window.removeEventListener(\"resize\", updateWindowDimension);\n this.listener?.();\n }\n\n render() {\n const { location, currentUser } = this.props;\n\n setPageTitle(location.pathname);\n\n const isWebflow = location.pathname === \"/\" || location.pathname.startsWith(\"/scientists\");\n\n const noFooter =\n location.pathname.includes(\"/submit_proposal\") ||\n location.pathname.startsWith(\"/opportunities\") ||\n location.pathname.startsWith(\"/university_dashboard\") ||\n location.pathname.startsWith(\"/submit/\") ||\n location.pathname.startsWith(\"/inbox\") ||\n location.pathname.startsWith(\"/login\") ||\n location.pathname.startsWith(\"/get-started\") ||\n location.pathname.startsWith(\"/preview-rfp/\") ||\n location.pathname.startsWith(\"/onboarding\") ||\n location.pathname.includes(\"/signup\") ||\n location.pathname.startsWith(\"/review_system\");\n\n const noChat =\n !currentUser.id ||\n location.pathname.includes(\"/submit_proposal\") ||\n location.pathname.startsWith(\"/submit/\") ||\n location.pathname.startsWith(\"/preview-rfp/\") ||\n location.pathname.startsWith(\"/onboarding\") ||\n location.pathname.includes(\"/signup\");\n\n // Track original referrer id\n if (localStorage && !localStorage.getItem(\"original_referrer_id\")) {\n const urlParams = new URLSearchParams(window.location.search);\n const referrer_id = urlParams.get(\"referrer_id\");\n\n if (referrer_id) {\n localStorage.setItem(\"original_referrer_id\", referrer_id);\n }\n }\n\n // HACK: Temporary fix for unsubscribe page not working.\n // Remove this later and rethink this statement.\n if (\n (!location.pathname.startsWith(\"/contact\") &&\n !location.pathname.startsWith(\"/unsubscribe\") &&\n !gon.current_user_id &&\n currentUser.id) ||\n this.state.isCurrentUserLoading\n ) {\n return <Loader style={{ marginTop: \"30vh\" }} active inline=\"centered\" />;\n }\n\n let homepage = marketplacePath();\n if (currentUser.role === USER_ROLES.sponsor) {\n if (currentUser.profile_info.commenter) homepage = \"/reviewer_dashboard/proposals\";\n else homepage = \"/reviewer_dashboard\";\n }\n if (currentUser.role === USER_ROLES.university_admin) homepage = \"/university_dashboard/team\";\n\n return (\n <QueryClientProvider client={queryClient}>\n {gon.user_masquerade && <MasqueradeBar />}\n <ErrorBoundary>\n <div className={css(styles.Marketplace_app)}>\n <div\n data-test-profile-id={currentUser.profile_id}\n data-testid=\"marketplace-container-main\"\n className={css(\n isWebflow ? null : styles.Marketplace_mainContainer,\n noFooter ? styles.Marketplace_noFooter : null\n )}\n >\n {!noChat && <Messenger />}\n <Navbar />\n {currentUser.role === UserRole.SPONSOR && <SubscriptionWarning />}\n <ScrollToTop>\n <Suspense\n fallback={\n <Loader\n style={{\n marginTop: \"200px\",\n height: \"500px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n display: \"flex\",\n }}\n active\n inline=\"centered\"\n />\n }\n >\n {this.state.isTaxonomyUpdateModalOpen && (\n <TaxonomyUpdateModal\n isOpen={this.state.isTaxonomyUpdateModalOpen}\n onClose={() => this.setState({ isTaxonomyUpdateModalOpen: false })}\n />\n )}\n {this.state.isSSOSponsorOnboardingModalOpen && (\n <SSOSponsorOnboardingModal\n isOpen={this.state.isSSOSponsorOnboardingModalOpen}\n onClose={() => this.setState({ isSSOSponsorOnboardingModalOpen: false })}\n />\n )}\n <Switch>\n {currentUser.id && (\n <Route exact path=\"/\">\n <Redirect to={homepage} />\n </Route>\n )}\n <Route exact path=\"/about\" component={AboutUs} />\n <Route exact path=\"/home\" component={Marketplace} />\n <PrivateRoute exact path=\"/my_proposals\" component={ScientistProposalLibrary} />\n <Route exact path=\"/login\" component={LoginPage} />\n <Redirect from=\"/register\" to=\"/get-started\" />\n <Route exact path=\"/get-started/network\" component={ScientistNetworkSignUp} />\n {currentUser.id ? (\n <Route exact path=\"/get-started/keywords\">\n <Redirect to={profile_page_path(currentUser.profile_id, { keywords: 1 })} />\n </Route>\n ) : (\n <Route\n exact\n path=\"/get-started/keywords\"\n render={() => {\n setPrevUrlCookie(\"/get-started/keywords\");\n return <Redirect to=\"/login\" />;\n }}\n />\n )}\n <Route\n exact\n path=\"/get-started/opportunities\"\n component={RecommendedRfpSignUp}\n />\n <Route exact path=\"/get-started\" component={SignUp} />\n {/* Regular onboarding */}\n <PrivateRoute exact path=\"/onboarding\" component={OnboardingContainer} />\n <Route exact path=\"/submit/:request_type/:slug\">\n {({ match }) => {\n const { request_type } = match.params;\n switch (request_type) {\n case RequestType.REQUEST_FOR_PROPOSAL:\n case RequestType.OPEN_CALL:\n return <RfpOpenCallProposalForm />;\n case RequestType.REQUEST_FOR_STARTUP:\n return <RequestForStartupProposalForm />;\n case RequestType.REQUEST_FOR_EXPERT:\n return <RequestForExpertProposalForm />;\n default:\n console.error(\"Unexpected request_type: %s.\", request_type);\n }\n }}\n </Route>\n <Route exact path=\"/submit_proposal/:rfp_identifier\">\n <SubmitProposalRedirect />\n </Route>\n <Route exact path=\"/company/:identifier\" component={CompanyPage} />\n <Route exact path=\"/profile/:id\" component={ProfilePage} />\n <PrivateSponsorRoute\n exact\n path=\"/reviewer_dashboard\"\n component={ReviewerDashboard}\n />\n <PrivateRoute\n exact\n path=\"/reviewer_dashboard/proposals\"\n render={({ location: _location }) => (\n <Redirect to={{ ..._location, pathname: \"/review_system\" }} />\n )}\n />\n <PrivateRoute path=\"/review_system\" exact component={ProposalReviewSystem} />\n <Redirect path=\"/expert_dashboard\" to=\"/review_system\" />\n <PrivateRoute\n exact\n path=\"/reviewer_dashboard/teams\"\n render={() => (\n <MobileRestricted breakpoint=\"500px\">\n <SponsorTeam />\n </MobileRestricted>\n )}\n />\n <PrivateRoute\n exact\n path=\"/university_dashboard/proposals\"\n component={UniversityProposalLibrary}\n />\n <PrivateRoute\n exact\n path=\"/university_dashboard/team\"\n component={UniversityTeam}\n />\n <PrivateRoute exact path=\"/account\" component={Account} />\n <Route exact path=\"/startup_program/:slug\" component={RequestForStartupPage} />\n <Route\n exact\n path=\"/company/:company_identifier/job/:identifier\"\n component={JobPage}\n />\n {/* NOTE: (justinpchang) Consider refactoring route once more request types are added */}\n <Route exact path=\"/proposal/:slug\" component={ProposalPage} />\n <Route exact path=\"/startup_program_proposal/:slug\">\n <ProposalPage requestableType={RequestableType.REQUEST_FOR_STARTUP} />\n </Route>\n <PrivateRoute exact path=\"/proposal_library\" component={ProposalLibrary} />\n {RfpRoutes}\n {RequestForExpertRoutes}\n {NotificationCampaignRoutes}\n {OpportunityRoutes}\n <Route exact path=\"/network\" component={ScientistNetwork} />\n <Route\n exact\n path=\"/application/:commercial_application\"\n component={CommercialApplicationPage}\n />\n <Route exact path=\"/terms\" component={TermsPage} />\n <Route exact path=\"/privacy\" component={PrivacyPage} />\n <Route exact path=\"/contact\" component={ContactPage} />\n <PrivateRoute exact path=\"/inbox\" component={Inbox} />\n <Route exact path=\"/forgot_password\" component={ForgotPassword} />\n <Route exact path=\"/change_password\" component={ChangePassword} />\n <Route exact path=\"/careers\" component={Careers} />\n <Route exact path=\"/sponsors\">\n <Redirect to=\"/marketplace/partners\" />\n </Route>\n <Route path={\"/marketplace\"} component={Marketplace} />\n <Route exact path=\"/feature_requests\" component={FeatureRequestSplashPage} />\n {/*\n We render nothing on / since the Webflow layout is active on this page.\n For unhandled routes we use window.location.href which properly refreshes the assets\n and loads the Webflow layout. Otherwise it'd be an empty screen.\n */}\n <Route exact path=\"/\" />\n <Route exact path=\"/scientists\" />\n <Route exact path=\"/401\" component={Unauthorized401} />\n <Route exact path=\"/403\" component={Forbidden403} />\n <Route exact path=\"/404\" component={NotFound404} />\n <Route path=\"*\" component={NotFound404} />\n </Switch>\n </Suspense>\n </ScrollToTop>\n </div>\n </div>\n {isWebflow && <div id=\"webflow-container\" />}\n <Toaster />\n {!noFooter && <Footer />}\n </ErrorBoundary>\n {!process.env.CYPRESS && <ReactQueryDevtools initialIsOpen={false} />}\n </QueryClientProvider>\n );\n }\n}\n\nconst mapStateToProps = (state) => ({\n currentUser: state.profiles.currentUser,\n windowWidth: state.window.width,\n});\n\nconst mapDispatchToProps = {\n updateWindowDimension: updateWindowDimensionAction,\n fetchCurrentUser: fetchCurrentUserAction,\n setCurrentUser: setCurrentUserAction,\n checkUnread: checkUnreadAction,\n clearMessengerState: clearMessengerStateAction,\n fetchSubscription: fetchSubscriptionAction,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\n\nconst styles = StyleSheet.create({\n Marketplace_app: {\n position: \"relative\",\n display: \"grid\",\n height: \"fit-content\",\n gridTemplateColumns: \"100%\",\n },\n Marketplace_mainContainer: {\n display: \"inline-block\",\n position: \"relative\",\n minHeight: \"100vh\",\n marginBottom: \"40px\",\n },\n Marketplace_mobileContainer: {\n [TABLET_MEDIA_QUERY]: {\n \":nth-child(1n) > .ui.container\": {\n marginLeft: \"unset\",\n marginRight: \"unset\",\n paddingLeft: \"unset\",\n paddingRight: \"unset\",\n },\n },\n },\n Marketplace_noFooter: {\n marginBottom: \"0px\",\n },\n toast_body: {\n color: COLORS.WHITE,\n marginRight: \"10px\",\n ...JS_FONTS.MEDIUM_3,\n },\n toast_progress: {\n background: COLORS.HALO_BLUE,\n },\n toast_inner: {\n padding: \"15px\",\n paddingBottom: \"20px\",\n borderRadius: \"4px\",\n },\n toast_container: {\n zIndex: 1000000,\n },\n toast_close: {\n position: \"initial\",\n },\n});\n","import { StyledLink } from \"@components/Footer/Footer\";\nimport { Button } from \"@components/library\";\nimport { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\ninterface Props {\n type?: \"button\" | \"link\";\n}\n\nconst CANNY_APP_ID = \"660af386fa664b82e994fd67\";\n\nconst FeatureRequestButton = ({ type = \"link\" }: Props) => {\n const { id, name, email, image, role, profile_info, created_at, roles } = useSelector(\n (state: RootState) => state.profiles.currentUser\n );\n const isSponsor = role === UserRole.SPONSOR;\n const isUniversityAdmin = role === UserRole.UNIVERSITY_ADMIN;\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (!id) return;\n\n let userType: \"Scientist\" | \"Sponsor\" | \"University Admin\" = \"Scientist\";\n if (isSponsor) userType = \"Sponsor\";\n else if (isUniversityAdmin) userType = \"University Admin\";\n\n window.Canny?.(\"identify\", {\n appID: CANNY_APP_ID,\n user: {\n id,\n name,\n email,\n avatarURL: image.url,\n created: new Date(created_at).toISOString(),\n ...(isSponsor && {\n companies: [\n {\n id: profile_info.company_id,\n name: profile_info.company_name,\n },\n ],\n }),\n // Canny prettifies custom field names in the UI using snake_case (or kebab-case)\n customFields: {\n user_type: userType,\n ...(role === UserRole.SCIENTIST && {\n is_startup_scientist: profile_info.is_startup_scientist,\n scientist_affiliation: profile_info.location,\n scientist_number_of_proposals: (profile_info.proposals || []).filter(\n (proposal) => proposal.completed && !proposal.deleted_at\n ).length,\n }),\n ...(isSponsor && {\n is_company_admin: profile_info.is_admin,\n is_company_super_admin: profile_info.is_super_admin,\n sponsor_license_type: profile_info.license,\n sponsor_number_of_review_teams: roles.filter(\n (_role) => _role.resource_type === \"Request\"\n ).length,\n }),\n ...(isUniversityAdmin && {\n university_admin_affiliation: profile_info.university,\n university_admin_number_of_invites: profile_info.invited_users_count,\n university_admin_number_of_accepted_invites: profile_info.accepted_users_count,\n }),\n },\n },\n });\n }, [id]);\n\n const handleClick = () => {\n track(SegmentEventName.Click, {\n ui_component: `Feature Request Button (${type === \"button\" ? \"Splash Page\" : \"Footer\"})`,\n });\n\n if (!id) {\n setPrevUrlCookie(window.location.pathname);\n dispatch(\n toggleLoginModal({\n open: true,\n previousAction: \"submit-feature-request\",\n })\n );\n return;\n }\n\n const authenticatedLink = window.Canny?.(\n \"authenticateCannyLink\",\n isSponsor\n ? \"https://halo-science.canny.io/feature-requests\"\n : \"https://halo-science.canny.io/scientists-startups-feature-requests\"\n );\n window.open(authenticatedLink, \"_blank\");\n };\n\n return type === \"button\" ? (\n <Button onClick={handleClick}>Submit feature request</Button>\n ) : (\n <LinkContainer>\n <StyledLink as=\"button\" onClick={handleClick}>\n Feature requests\n </StyledLink>\n </LinkContainer>\n );\n};\n\nexport default FeatureRequestButton;\n\nconst LinkContainer = styled.div`\n line-height: 1;\n button {\n padding: 0;\n background: none;\n border: none;\n &:focus {\n outline: none;\n }\n }\n`;\n","import FeatureRequestButton from \"@components/FeatureRequestButton\";\nimport { GradientButton, Icon } from \"@components/library\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { useHubspotCTAs } from \"@hooks/useHubspotCTAs\";\nimport haloLogo from \"@images/halo-inverse.svg\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nconst Footer = () => {\n // Initialize HubSpot CTAs for the \"Subscribe\" button\n // Without this, the \"Subscribe\" button doesn't work for signed in users\n useHubspotCTAs([]);\n\n return (\n <OuterContainer>\n <InnerContainer>\n <TopContainer>\n <Logo src={haloLogo} alt=\"Halo home\" />\n <EmailDigestCTAContainer>\n <Header>\n Discover tomorrow's\n <br />\n breakthroughs today.\n </Header>\n <SubHeader>\n Get new partnering opportunities\n <br />\n delivered to your inbox.\n </SubHeader>\n <div>\n <GradientButton\n size=\"md\"\n width=\"127px\"\n maxHeight=\"36px\"\n // Trigger HubSpot CTA for Email Digest Signup\n // https://app.hubspot.com/calls-to-action/6895929/edit/125612443295/content\n className=\"hs-cta-trigger-button hs-cta-trigger-button-125612443295\"\n >\n Subscribe\n </GradientButton>\n </div>\n </EmailDigestCTAContainer>\n <MobileSocialIcons>\n <a href=\"https://twitter.com/halodotscience\" target=\"_blank\" rel=\"noreferrer\">\n <Icon name=\"Twitter\" size=\"xl\" color={COLORS.NEUTRAL_900} />\n </a>\n <a\n href=\"https://www.linkedin.com/company/halodotscience\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Icon name=\"LinkedIn\" size=\"xl\" color={COLORS.NEUTRAL_900} />\n </a>\n </MobileSocialIcons>\n <Line mobileOnly />\n <LinksContainer>\n <LinkColumn>\n <LinkHeader>Company</LinkHeader>\n <StyledLink as=\"a\" href=\"/about\">\n About\n </StyledLink>\n <StyledLink as=\"a\" href=\"https://blog.halo.science\">\n Blog\n </StyledLink>\n <StyledLink as=\"a\" href=\"/careers\">\n Careers\n </StyledLink>\n <StyledLink\n as=\"a\"\n href=\"https://blog.halo.science/a-look-back-at-the-2019-halo-awards\"\n >\n Halo Awards\n </StyledLink>\n </LinkColumn>\n <LinkColumn>\n <LinkHeader>Support</LinkHeader>\n <StyledLink as=\"a\" href=\"https://knowledge.halo.science/faq\">\n FAQs\n </StyledLink>\n <StyledLink as=\"a\" href=\"https://knowledge.halo.science/\">\n Help center\n </StyledLink>\n <FeatureRequestButton />\n <StyledLink as=\"a\" href=\"/contact\">\n Contact us\n </StyledLink>\n </LinkColumn>\n <LinkColumn>\n <LinkHeader>Sponsors</LinkHeader>\n <StyledLink as=\"a\" href=\"https://meetings.hubspot.com/sheena-pulapaka\">\n Request a demo\n </StyledLink>\n <StyledLink as=\"a\" href=\"https://info.halo.science/customer-stories\">\n Customer stories\n </StyledLink>\n {/* TODO: (thaske) temporarily hide until we have this */}\n {/* <StyledLink to=\"/claim\">Claim your page</StyledLink> */}\n </LinkColumn>\n </LinksContainer>\n </TopContainer>\n <SocialIcons>\n <a href=\"https://twitter.com/halodotscience\" target=\"_blank\" rel=\"noreferrer\">\n <Icon name=\"Twitter\" size=\"xl\" color={COLORS.NEUTRAL_900} />\n </a>\n <a\n href=\"https://www.linkedin.com/company/halodotscience\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Icon name=\"LinkedIn\" size=\"xl\" color={COLORS.NEUTRAL_900} />\n </a>\n </SocialIcons>\n </InnerContainer>\n <Line />\n <InnerContainer>\n <BottomContainer>\n <BottomLinks>\n <StyledLink as=\"a\" href=\"/privacy\" color={COLORS.NEUTRAL_250}>\n Privacy Policy\n </StyledLink>\n <StyledLink as=\"a\" href=\"/terms\" color={COLORS.NEUTRAL_250}>\n Terms of Service\n </StyledLink>\n {/* TODO: (thaske) temporarily hide until we have this */}\n {/* <BottomLink>Cookie Policy</BottomLink> */}\n {/* <BottomLink>Accessibility Policy</BottomLink> */}\n </BottomLinks>\n <CopyRight>© 2023 Halo Cures, Inc.</CopyRight>\n </BottomContainer>\n </InnerContainer>\n </OuterContainer>\n );\n};\n\nexport default Footer;\n\nconst FOOTER_MEDIA_QUERY = `@media (max-width: 1090px)`;\n\nconst OuterContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n\n position: relative;\n\n padding: 76px ${WINDOW_DIMENSIONS.PAGE_SIDE_PADDING}px 40px;\n\n ${FONTS.REGULAR_1}\n color: ${COLORS.WHITE};\n background-color: ${COLORS.NEUTRAL_900};\n\n ${FOOTER_MEDIA_QUERY} {\n padding: 80px 32px 32px;\n }\n`;\n\nconst InnerContainer = styled.div`\n max-width: ${WINDOW_DIMENSIONS.DEFAULT_MAX_WIDTH}px;\n width: 100%;\n`;\n\nconst TopContainer = styled.div`\n display: flex;\n justify-content: space-between;\n\n margin: 0 0 48px;\n\n ${FOOTER_MEDIA_QUERY} {\n flex-direction: column;\n gap: 0;\n }\n`;\n\nconst Logo = styled.img`\n width: 65px;\n height: 32px;\n\n ${FOOTER_MEDIA_QUERY} {\n margin: 0 0 64px;\n }\n`;\n\nconst Header = styled.div`\n ${FONTS.HEADING_3_REGULAR};\n margin: 0 0 39px;\n\n ${FOOTER_MEDIA_QUERY} {\n margin: 0 0 24px;\n }\n`;\n\nconst SubHeader = styled.div`\n margin-bottom: 20px;\n`;\n\nconst EmailDigestCTAContainer = styled.div`\n display: flex;\n flex-direction: column;\n\n width: 440px;\n\n @media (max-width: 1440px) {\n width: unset;\n }\n`;\n\n// Also used in FeatureRequestButton, which mainly exists as a \"link\" in the footer\nexport const StyledLink = styled(Link)<{ color?: string }>`\n width: fit-content;\n\n ${FONTS.REGULAR_1}\n\n color: ${({ color }) => color || COLORS.WHITE};\n\n &&:hover {\n color: ${COLORS.BLUE_LIGHT_600};\n\n text-decoration: underline !important;\n text-decoration-color: ${COLORS.BLUE_600} !important;\n -webkit-text-decoration-color: ${COLORS.BLUE_600} !important;\n text-underline-offset: 4px !important;\n }\n\n &:focus {\n color: ${COLORS.WHITE};\n text-decoration: none;\n }\n`;\n\nconst LinksContainer = styled.div`\n display: flex;\n gap: 110px;\n\n ${FOOTER_MEDIA_QUERY} {\n flex-wrap: wrap;\n row-gap: 48px;\n\n margin: 42px 0 0;\n }\n`;\n\nconst LinkColumn = styled.div`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n & ${StyledLink} {\n line-height: 1 !important;\n }\n`;\n\nconst LinkHeader = styled.div`\n ${FONTS.SEMIBOLD_1}\n\n margin: 0 0 24px;\n\n ${FOOTER_MEDIA_QUERY} {\n margin: 0 0 8px;\n }\n`;\n\nconst SocialIcons = styled.div`\n display: flex;\n margin: 0 0 30px;\n\n ${FOOTER_MEDIA_QUERY} {\n display: none;\n }\n`;\n\nconst MobileSocialIcons = styled.div`\n display: none;\n margin: 0 0 30px;\n\n ${FOOTER_MEDIA_QUERY} {\n display: flex;\n margin: 32px 0;\n }\n`;\n\nconst Line = styled.div<{ mobileOnly?: boolean }>`\n height: 1px;\n width: 100vw;\n background: rgba(217, 217, 217, 0.2);\n\n ${({ mobileOnly }) =>\n mobileOnly &&\n `\n display: none;\n\n ${FOOTER_MEDIA_QUERY} {\n display: block;\n\n position: relative;\n left: -32px;\n }\n `}\n`;\n\nconst BottomContainer = styled.div`\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 40px 0 0;\n\n ${FOOTER_MEDIA_QUERY} {\n flex-direction: column;\n padding: 0;\n }\n`;\n\nconst BottomLinks = styled.div`\n display: flex;\n gap: 34px;\n\n line-height: 1;\n\n ${FOOTER_MEDIA_QUERY} {\n flex-direction: column;\n gap: 16px;\n\n margin: 48px 0 84px;\n }\n`;\n\nconst CopyRight = styled.div`\n ${FONTS.REGULAR_1}\n\n color: ${COLORS.NEUTRAL_250};\n\n ${FOOTER_MEDIA_QUERY} {\n width: 100%;\n text-align: center;\n }\n`;\n","import { COLORS, FONTS, JS_FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { StyleSheet } from \"aphrodite\";\nimport styled from \"styled-components\";\n\nconst { MOBILE_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nexport const styles = StyleSheet.create({\n InviteModal_modal: {\n maxWidth: \"654px\",\n width: \"100% !important\",\n padding: \"40px 38px !important\",\n overflow: \"visible\",\n [MOBILE_MEDIA_QUERY]: {\n width: \"350px\",\n padding: \"4.8em 2em\",\n },\n },\n InviteModal_content: {\n padding: \"0px\",\n maxHeight: \"none\",\n },\n InviteModal_modalTextArea: {\n width: \"100%\",\n maxWidth: \"574px\",\n height: \"190px\",\n margin: \"auto\",\n padding: \"10px\",\n ...JS_FONTS.REGULAR_2,\n color: COLORS.BLACK,\n resize: \"none\",\n borderRadius: \"3px\",\n border: `1px solid ${COLORS.NEUTRAL_400}`,\n \":focus\": {\n outline: \"none\",\n borderColor: COLORS.HALO_BLUE,\n boxShadow: \"none !important\",\n },\n \"::placeholder\": {\n color: COLORS.NEUTRAL_500,\n ...JS_FONTS.REGULAR_2,\n },\n },\n InviteModal_modalInput: {\n margin: \".3rem 0 .3rem .3rem\",\n ...JS_FONTS.REGULAR_2,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n \":focus\": {\n outline: \"none\",\n border: \"none\",\n },\n \"::placeholder\": {\n color: COLORS.NEUTRAL_500,\n },\n },\n InviteModal_modalInputZero: {\n marginLeft: \"10px\",\n },\n InviteModal_modalButtonHolder: {\n width: \"100%\",\n maxWidth: \"357px\",\n display: \"flex\",\n textAlign: \"right\",\n marginTop: \"16px\",\n },\n InviteModal_header: {\n display: \"flex\",\n justifyContent: \"space-between\",\n ...JS_FONTS.HEADING_4_SEMIBOLD,\n color: COLORS.BLACK,\n textAlign: \"left\",\n margin: \"0 auto 15px\",\n },\n InviteModal_closeModalButton: {\n width: \"12px\",\n height: \"12px\",\n cursor: \"pointer\",\n marginLeft: \"6px\",\n },\n InviteModal_subheader: {\n color: COLORS.BLACK,\n ...JS_FONTS.REGULAR_2,\n margin: \"0px auto 21px\",\n textAlign: \"left\",\n },\n ConfirmationInviteModal_subheader: {\n margin: \"0px auto 10px\",\n },\n ConfirmationInviteModal_footer: {\n margin: \"30px auto\",\n },\n InviteModal_deleteIcon: {\n width: \"12px\",\n height: \"12px\",\n border: \"none\",\n ...JS_FONTS.MEDIUM_1,\n margin: \"6px\",\n padding: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n },\n InviteModal_errorMessage: {\n marginTop: \"5px\",\n color: COLORS.RED,\n ...JS_FONTS.REGULAR_2,\n textAlign: \"left\",\n marginBottom: \"5px\",\n },\n InviteModal_errorField: {\n border: `solid 1px ${COLORS.RED}`,\n },\n InviteModal_emailChip: {\n backgroundColor: COLORS.NEUTRAL_200,\n ...JS_FONTS.REGULAR_2,\n borderRadius: \"3px\",\n height: \"24px\",\n color: COLORS.BLACK,\n padding: \"0 4px 0 1rem\",\n display: \"inline-flex\",\n alignItems: \"center\",\n margin: \"0.3rem\",\n position: \"relative\",\n },\n InviteModal_invalidEmailChip: {\n backgroundColor: \"#FFEDED\",\n },\n ConfirmationInviteModal_emailChip: {\n padding: \"4px 6px\",\n },\n InviteModal_modalInputDiv: {\n width: \"574px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n minHeight: \"38px\",\n margin: \"0px auto 0px\",\n ...JS_FONTS.REGULAR_2,\n border: `1px solid ${COLORS.NEUTRAL_400}`,\n borderRadius: \"3px\",\n },\n InviteModal_smallerInputDiv: {\n width: \"429px\",\n },\n InviteModal_modalInputDivFocus: {\n outline: \"none\",\n borderColor: COLORS.HALO_BLUE,\n },\n InviteModal_inputLabel: {\n ...JS_FONTS.REGULAR_2,\n color: COLORS.BLACK,\n marginBottom: \"5px\",\n },\n InviteModal_inputLabelDropdown: {\n marginLeft: \"15px\",\n },\n InviteModal_emailDropdown: {\n display: \"flex\",\n position: \"absolute\",\n alignItems: \"center\",\n marginBottom: \"12px\",\n paddingLeft: \"10px\",\n minHeight: \"36px\",\n width: \"100%\",\n color: COLORS.HALO_BLUE,\n backgroundColor: COLORS.WHITE,\n ...JS_FONTS.REGULAR_2,\n border: `0.5px solid ${COLORS.NEUTRAL_200}`,\n boxSizing: \"border-box\",\n borderRadius: \"3px\",\n \":hover\": {\n opacity: 1,\n cursor: \"pointer\",\n },\n },\n InviteModal_modalInputDivFilled: {\n padding: \"0.6rem 0px 0.6rem 0.6rem \",\n },\n});\n\nexport const InviteModalDropdown = styled.div`\n margin-left: 14px;\n width: 130px !important;\n height: 38px !important;\n ${FONTS.REGULAR_2};\n padding: 10px 11px !important;\n border-radius: 3px !important;\n border: ${(props) =>\n props.dropdownActive\n ? `1px solid ${COLORS.HALO_BLUE}`\n : `1px solid ${COLORS.NEUTRAL_400}`} !important;\n &&&&&& i {\n ${FONTS.REGULAR_3};\n color: ${(props) => (props.dropdownActive ? COLORS.HALO_BLUE : COLORS.NEUTRAL_400)};\n margin-right: 0px;\n position: relative;\n right: 0px;\n padding-left: ${(props) => (props.admin ? \"6px\" : \"46px\")};\n }\n`;\nexport const DropdownMenu = styled.div`\n &&&& {\n max-height: unset;\n width: 350px;\n box-sizing: border-box;\n border: 0.5px solid ${COLORS.NEUTRAL_200};\n border-radius: 0px;\n overflow: auto;\n margin-top: 1px;\n }\n`;\nexport const DropdownItem = styled.div`\n border: 2px solid ${COLORS.BLUE_LIGHT_300};\n box-sizing: border-box;\n box-shadow: 0px 14px 24px rgba(151, 158, 170, 0.25);\n border-radius: 3px;\n &&&& {\n ${FONTS.MEDIUM_2};\n color: ${(props) => (props.red ? COLORS.RED : COLORS.BLACK)} !important;\n border-bottom: 1px solid ${COLORS.NEUTRAL_200};\n height: 83px;\n }\n`;\nexport const DropdownSubHeader = styled.div`\n ${FONTS.REGULAR_3};\n color: ${COLORS.NEUTRAL_500};\n margin-top: 5px;\n`;\nexport default styles;\n","import { Button, Icon, IconButton } from \"@components/library\";\nimport { COLORS } from \"@constants\";\nimport { fetchUniversityMembers as fetchUniversityMembersAction } from \"@redux/actions/defaultActions\";\nimport { SegmentEventName, SegmentEventObject } from \"@tsTypes/__generated__/enums\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track, usedPersonalEmail } from \"@utils/appUtils\";\nimport { css } from \"aphrodite\";\nimport { PureComponent } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Dropdown, Modal } from \"semantic-ui-react\";\nimport api from \"src/requests/request\";\nimport Validator from \"validator\";\nimport {\n DropdownItem,\n DropdownMenu,\n DropdownSubHeader,\n InviteModalDropdown,\n styles,\n} from \"./InviteModal.styles\";\n\nconst ROLES = {\n 0: \"Faculty\",\n 2: \"Administrator\",\n};\n\nclass InviteModal extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n contactModalLoading: false,\n message: props.inviteMessage,\n toEmails: \"\",\n email: \"\",\n isExpanded: true,\n step: 0,\n emailList: [],\n error: \"\",\n focused: true,\n dropdownActive: false,\n role: props.role,\n };\n }\n\n initialState = () => {\n const { inviteMessage, role } = this.props;\n\n return {\n contactModalLoading: false,\n message: inviteMessage,\n toEmails: \"\",\n email: \"\",\n isExpanded: true,\n error: \"\",\n step: 0,\n emailList: [],\n focused: true,\n role: role,\n };\n };\n\n componentDidUpdate(prevProps) {\n if (prevProps.open !== this.props.open) {\n this.setState(this.initialState());\n }\n }\n\n handleSubmitMessage = async (e) => {\n const {\n closeModal,\n currentUser,\n typeOfInvite,\n inviteUrl,\n organization,\n trackAndToastHandler,\n requestId,\n fetchUniversityMembers,\n } = this.props;\n\n const { role } = this.state;\n\n e.preventDefault();\n\n const { message, isExpanded, emailList } = this.state;\n\n this.setState({\n contactModalLoading: true,\n });\n\n const emails = emailList\n .map((email) => {\n return email.value;\n })\n .join(\",\");\n\n const data = {\n ...(isExpanded && message && message.length > 0 && { message }),\n to_emails: emails,\n organization,\n role,\n invited_by: currentUser.id,\n };\n\n if (requestId) data.request_id = requestId;\n\n const responseJson = await api.post(inviteUrl, data);\n\n if (!responseJson.data.success) {\n this.setState({\n contactModalLoading: false,\n });\n } else {\n if (typeOfInvite === \"shareRFP\") {\n track(SegmentEventName.Share, {\n request_id: requestId,\n object: SegmentEventObject.Request,\n });\n\n // Don't display confirmation modal for sharing an RFP\n closeModal();\n }\n\n this.setState({\n message: \"\",\n contactModalLoading: false,\n toEmails: \"\",\n step: 1,\n });\n if (currentUser.role === UserRole.UNIVERSITY_ADMIN)\n fetchUniversityMembers(currentUser.profile_info.university_id);\n trackAndToastHandler?.();\n }\n };\n\n handleChange = (e, attr) => {\n // make sure an empty space is not added\n if (attr === \"email\") {\n if (e.target.value.length === 1 && e.target.value === \" \") {\n e.preventDefault();\n return;\n }\n }\n this.setState({ [attr]: e.target.value, error: \"\" });\n };\n\n handleAddOrRemoveEmail = (e) => {\n if (\n this.state.email &&\n ([\"Enter\", \"Tab\", \",\", \";\"].includes(e.key) || e.type === \"blur\" || e.type === \"click\")\n ) {\n e.preventDefault();\n const email = {\n value: this.state.email.trim().toLowerCase(),\n isValid: false,\n };\n\n if (email.value && this.isValid(email.value)) {\n email.isValid = true;\n }\n\n const emailList = [...this.state.emailList, email];\n this.setState({\n emailList,\n email: \"\",\n });\n }\n\n if (e.key === \"Backspace\") {\n if (!this.state.email && this.state.emailList.length) {\n const emailList = [...this.state.emailList];\n emailList.pop();\n\n this.setState({\n emailList,\n error: \"\",\n });\n }\n }\n };\n\n isValid = (email) => {\n let error = null;\n\n if (!Validator.isEmail(email)) {\n error = `${email} is not a valid email address.`;\n }\n\n if (usedPersonalEmail(email)) {\n error = \"Please enter a university or company email.\";\n }\n\n if (this.state.emailList.some((e) => e.value === email)) {\n const temp = email;\n // clearing email state to display error message of a duplicate email\n this.setState({ email: \"\" });\n error = `${temp} has already been added.`;\n }\n if (error) {\n this.setState({ error });\n return false;\n }\n return true;\n };\n\n handlePaste = (e) => {\n e.preventDefault();\n\n const paste = e.clipboardData.getData(\"text\");\n let emails = paste.match(/[\\w\\d\\.-]+@[\\w\\d\\.-]+\\.[\\w\\d\\.-]+/g);\n // take care of duplicates copied to clipboard\n emails = [...new Set(emails)];\n\n if (emails) {\n const emailList = this.state.emailList.map((e) => e.value);\n const filteredDuplicateEmails = emails.filter((email) => !emailList.includes(email));\n\n const toBeAdded = filteredDuplicateEmails.map((email) => ({\n value: email,\n isValid: !usedPersonalEmail(email),\n }));\n\n this.setState({\n emailList: [...this.state.emailList, ...toBeAdded],\n });\n }\n };\n\n // make sure the list of emails are all valid\n validEmailList = () => {\n const { emailList } = this.state;\n\n if (emailList.length < 1) return false;\n\n return !emailList.some((email) => !email.isValid);\n };\n\n handleNextStep = (e) => {\n const { emailList, error } = this.state;\n\n const email = this.state.email.trim().toLowerCase();\n\n if (email && this.isValid(email)) {\n const emailList = [...this.state.emailList, email];\n const toEmails = emailList.join(\", \");\n\n this.setState({\n emailList,\n email: \"\",\n toEmails,\n error: \"\",\n });\n } else if (emailList.length > 0 && email.length === 0) {\n if (this.validEmailList()) {\n this.handleSubmitMessage(e);\n } else {\n this.setState({ error: \"Please make sure that all addresses are properly formed.\" });\n }\n } else if (!email && emailList.length === 0) {\n this.setState({ error: \"Please add an email to invite\" });\n }\n };\n\n deleteEmailFromList = (emailIndex) => {\n const emailList = [...this.state.emailList];\n emailList.splice(emailIndex, 1);\n\n this.setState({\n emailList,\n error: \"\",\n });\n };\n\n focusInput = (e) => {\n const children = e.target.children;\n this.setState({ focused: true });\n if (children.length) children[children.length - 1].focus();\n };\n\n handleBlur = (e) => {\n this.handleAddOrRemoveEmail(e);\n this.setState({ focused: false });\n };\n\n handleCloseConfirmationModal = () => {\n const { closeModal } = this.props;\n\n closeModal();\n this.setState({ emailList: [] });\n };\n\n render() {\n const {\n open,\n closeModal,\n currentUser,\n activeTabIndex,\n typeOfInvite,\n modalHeader,\n modalSubheader,\n inviteSubject,\n } = this.props;\n\n const {\n message,\n toEmails,\n email,\n isExpanded,\n contactModalLoading,\n emailList,\n step,\n error,\n focused,\n role,\n dropdownActive,\n } = this.state;\n\n const emails = emailList.map((email, i) => {\n if (step === 0) {\n return (\n <div\n key={`email-tile-${i}`}\n className={css(\n styles.InviteModal_emailChip,\n !email.isValid && styles.InviteModal_invalidEmailChip\n )}\n data-testid=\"invite-modal-email\"\n >\n {email.value}\n <div\n className={css(styles.InviteModal_deleteIcon)}\n onClick={() => this.deleteEmailFromList(i)}\n >\n <Icon name=\"X\" size=\"xs\" color={email.isValid ? COLORS.BLACK : COLORS.RED} />\n </div>\n </div>\n );\n }\n return (\n <div\n key={i}\n className={css(\n styles.InviteModal_emailChip,\n styles.ConfirmationInviteModal_emailChip,\n emailList.length === 1 && styles.InviteModal_oneEmailChip\n )}\n data-testid=\"invite-modal-email\"\n >\n {email.value}\n </div>\n );\n });\n\n const placeholder =\n emails.length > 0\n ? \"Add email\"\n : typeOfInvite === \"shareRFP\"\n ? \"Enter email address\"\n : \"Add one or more email addresses\";\n\n return (\n <Modal\n open={open}\n onClose={closeModal}\n size=\"tiny\"\n children\n className={`${css(styles.InviteModal_modal)}`}\n data-testid=\"invite-modal\"\n >\n {step === 0 ? (\n <Modal.Content className={`${css(styles.InviteModal_content)}`}>\n <div className={css(styles.InviteModal_header)}>\n {modalHeader}\n <IconButton iconName=\"Close\" size=\"sm\" onClick={closeModal} variant=\"fourth\" />\n </div>\n <div className={css(styles.InviteModal_subheader)}>{modalSubheader}</div>\n <div style={{ display: \"flex\" }}>\n <div>\n <div className={css(styles.InviteModal_inputLabel)}>Email Address</div>\n <div\n className={css(\n styles.InviteModal_modalInputDiv,\n focused && styles.InviteModal_modalInputDivFocus,\n emails.length > 0 && styles.InviteModal_modalInputDivFilled,\n error && styles.InviteModal_errorField,\n typeOfInvite === \"university\" && styles.InviteModal_smallerInputDiv\n )}\n >\n {emails}\n <input\n type=\"text\"\n className={css(\n styles.InviteModal_modalInput,\n emails.length === 0 && styles.InviteModal_modalInputZero\n )}\n style={{\n width: email.length + \"ch\",\n minWidth: emails.length > 0 ? \"10ch\" : \"85%\",\n }}\n placeholder={placeholder}\n value={email}\n autoFocus\n onFocus={this.focusInput}\n onChange={(e) => this.handleChange(e, \"email\")}\n onKeyDown={this.handleAddOrRemoveEmail}\n onPaste={this.handlePaste}\n onBlur={this.handleBlur}\n data-testid=\"invite-new-user-text-field\"\n />\n </div>\n </div>\n {typeOfInvite === \"university\" && (\n <div>\n <div\n className={css(\n styles.InviteModal_inputLabel,\n styles.InviteModal_inputLabelDropdown\n )}\n >\n Role\n </div>\n <InviteModalDropdown\n as={Dropdown}\n fluid\n admin={role === 2}\n text={ROLES[role]}\n selection\n dropdownActive={dropdownActive}\n onClick={() => this.setState({ dropdownActive: !dropdownActive })}\n onBlur={() => this.setState({ dropdownActive: false })}\n icon=\"chevron down\"\n >\n <DropdownMenu as={Dropdown.Menu}>\n <DropdownItem as={Dropdown.Item} onClick={() => this.setState({ role: 2 })}>\n Administrator\n <DropdownSubHeader>\n Administrators can share opportunities with faculty, but cannot submit\n proposals.\n </DropdownSubHeader>\n </DropdownItem>\n <DropdownItem as={Dropdown.Item} onClick={() => this.setState({ role: 0 })}>\n Faculty\n <DropdownSubHeader>\n Faculty conduct research and can submit proposals to opportunities\n </DropdownSubHeader>\n </DropdownItem>\n </DropdownMenu>\n </InviteModalDropdown>\n </div>\n )}\n </div>\n {email.length > 0 && (\n <div style={{ position: \"relative\" }}>\n <div\n className={css(styles.InviteModal_emailDropdown)}\n onClick={this.handleAddOrRemoveEmail}\n >\n Invite '{email.trim().toLowerCase()}' by email\n </div>\n </div>\n )}\n <div className={css(styles.InviteModal_errorMessage)}>{error}</div>\n <div style={{ margin: \"auto\", paddingTop: \"25px\" }}>\n <div className={css(styles.InviteModal_inputLabel)}>Message (Optional)</div>\n <textarea\n className={css(styles.InviteModal_modalTextArea)}\n placeholder={\n typeOfInvite === \"shareRFP\" ? \"Add a message\" : \"Add a message to your invite\"\n }\n value={message}\n rows={5}\n onFocus={(e) =>\n e.currentTarget.setSelectionRange(\n e.currentTarget.value.length,\n e.currentTarget.value.length\n )\n }\n onChange={(e) => this.handleChange(e, \"message\")}\n data-testid=\"invite-new-user-message-field\"\n />\n </div>\n <div className={css(styles.InviteModal_modalButtonHolder)}>\n <Button\n type=\"button\"\n disabled={contactModalLoading || emailList.length === 0}\n onClick={this.handleNextStep}\n data-testid=\"invite-new-user-submit-button\"\n >\n {typeOfInvite === \"shareRFP\" ? \"Share\" : \"Send Invite\"}\n </Button>\n </div>\n </Modal.Content>\n ) : (\n <Modal.Content className={`${css(styles.InviteModal_content)} scrolling`}>\n <div className={css(styles.InviteModal_header)}>Invitation sent!</div>\n <div\n className={css(\n styles.InviteModal_subheader,\n styles.ConfirmationInviteModal_subheader\n )}\n >\n Your invitation to the following people has been sent:\n </div>\n <div>{emails}</div>\n <div\n className={css(styles.InviteModal_subheader, styles.ConfirmationInviteModal_footer)}\n >\n Once they accept your invitation, they will become part of your team!\n </div>\n <Button type=\"button\" onClick={this.handleCloseConfirmationModal}>\n Got it\n </Button>\n </Modal.Content>\n )}\n </Modal>\n );\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n currentUser: state.profiles.currentUser,\n };\n};\n\nconst mapDispatchToProps = {\n fetchUniversityMembers: fetchUniversityMembersAction,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InviteModal);\n","import InviteModal from \"./InviteModal\";\n\nexport default InviteModal;\n","import {\n ChangeEvent,\n Dispatch,\n ReactNode,\n SetStateAction,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nimport { SSOEnabledHint } from \"@components/SSOEnabledHint\";\nimport { GradientButton, Icon } from \"@components/library\";\nimport { COLORS, FONTS, STYLES, WINDOW_DIMENSIONS } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport { useSSOSensitiveEmail } from \"@hooks/useSSOSensitiveEmail\";\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport { RootState } from \"@redux/store\";\nimport { signIn } from \"@requests/users\";\nimport { getPrevUrlCookie } from \"@utils/authUtils\";\nimport { t } from \"@utils/i18n\";\nimport { useSelector } from \"react-redux\";\nimport { ModalType } from \"./LoginSignUpModal\";\n\ninterface Props {\n header?: ReactNode;\n title?: ReactNode;\n bottom?: ReactNode;\n setModalType?: Dispatch<SetStateAction<ModalType>>;\n // Flag for changing styles to be compatible with the old login modal\n // @components/LoginModal/LoginModal.tsx\n compat?: boolean;\n}\n\nconst LoginModal = ({ header, title, bottom, setModalType, compat = false }: Props) => {\n const [password, setPassword] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [hasSubmitted, setHasSubmitted] = useState(false);\n const [error, setError] = useState(\"\");\n\n const { email, setEmail, isEmailSSOEnabled, redirectToSSO } = useSSOSensitiveEmail(\"\");\n const [shouldShowSSO, setShouldShowSSO] = useState(isEmailSSOEnabled);\n\n const previousAction = useSelector((state: RootState) => state.profiles.previousAction);\n\n const [searchParams] = useSearchParams();\n\n useEffect(() => {\n if (isEmailSSOEnabled) setShouldShowSSO(true);\n }, [isEmailSSOEnabled]);\n\n const handleLogin = async (e: SyntheticEvent) => {\n e.preventDefault();\n\n setSubmitting(true);\n setHasSubmitted(true);\n setError(\"\");\n\n if (shouldShowSSO) {\n if (!isEmailSSOEnabled) {\n setError(\"Your email/company is not enabled to use SSO. Please use your password instead.\");\n setSubmitting(false);\n return;\n }\n\n redirectToSSO();\n return;\n }\n\n if (!email || !password) {\n setError(\"Please fill in all fields before continuing.\");\n setSubmitting(false);\n return;\n }\n\n try {\n const response = await signIn({ email, password });\n\n let redirectUrl = \"\";\n if (previousAction === \"submit-feature-request\") {\n redirectUrl = \"/feature_requests\";\n } else {\n const commenterInviteRequest = searchParams.get(\"commenter_invite_request\");\n redirectUrl = `/redirect_login${\n commenterInviteRequest ? `?commenter_invite_request=${commenterInviteRequest}` : \"\"\n }`;\n }\n\n getPrevUrlCookie(redirectUrl, true, response.data.role);\n } catch (err) {\n switch (err.response.status) {\n case 403:\n setError(t(\"error.generic_retry\"));\n break;\n case 429:\n setError(\"You have made too many attempts. Please try again in a few minutes.\");\n break;\n default:\n setError(err.response.data.error);\n }\n setSubmitting(false);\n }\n };\n\n const urlParams = new URLSearchParams();\n const commenterInviteRequest = searchParams.get(\"commenter_invite_request\");\n if (commenterInviteRequest) urlParams.append(\"commenter_invite_request\", commenterInviteRequest);\n\n return (\n <Modal compat={compat}>\n <Top compat={compat}>\n {header ?? (\n <Logo to=\"/\">\n <img src={haloLogo} />\n </Logo>\n )}\n {title ?? (\n <Title>\n <Header>Welcome Back!</Header>\n <Subheader>Sign in to find research partners and keep moving science forward</Subheader>\n </Title>\n )}\n <Form onSubmit={handleLogin}>\n <Error data-testid=\"auth-error-message\">{error}</Error>\n <Input\n error={(hasSubmitted && !email) || error}\n data-testid=\"login-form-email-input\"\n name=\"email\"\n value={email}\n type=\"email\"\n placeholder=\"Email\"\n onChange={(e) => {\n setHasSubmitted(false);\n setEmail(e.target.value);\n }}\n />\n {shouldShowSSO ? (\n <>\n <SSOEnabledHint />\n <GradientButton\n data-testid=\"auth-button\"\n width=\"100%\"\n size=\"md\"\n disabled={submitting}\n type=\"submit\"\n >\n Continue with SSO\n </GradientButton>\n <LoginLink\n as=\"div\"\n onClick={() => {\n if (isEmailSSOEnabled) setEmail(\"\");\n setShouldShowSSO(false);\n }}\n >\n Go back {isEmailSSOEnabled && \" and use a different email\"}\n </LoginLink>\n </>\n ) : (\n <>\n <Input\n error={(hasSubmitted && !password) || error}\n data-testid=\"login-form-password-input\"\n name=\"password\"\n value={password}\n type=\"password\"\n placeholder=\"Password\"\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n setHasSubmitted(false);\n setPassword(e.target.value);\n }}\n />\n <GradientButton\n data-testid=\"auth-button\"\n width=\"100%\"\n size=\"md\"\n disabled={submitting}\n type=\"submit\"\n >\n Sign in\n </GradientButton>\n <LinkContainer>\n <LoginLink as=\"div\" onClick={() => setShouldShowSSO(true)}>\n <Icon name=\"Lock\" size=\"sm\" /> Sign in with SSO\n </LoginLink>\n <LoginLink to=\"/forgot_password\">Forgot password?</LoginLink>\n </LinkContainer>\n </>\n )}\n </Form>\n </Top>\n <Bottom compat={compat}>\n {bottom ?? (\n <>\n Don’t have an account? \n {setModalType ? (\n <SignUp to=\"#\" onClick={() => setModalType(\"signup\")}>\n Sign up\n </SignUp>\n ) : (\n <SignUp to={`/get-started${urlParams.size > 0 ? `?${urlParams.toString()}` : \"\"}`}>\n Sign up\n </SignUp>\n )}\n </>\n )}\n </Bottom>\n </Modal>\n );\n};\n\nexport default LoginModal;\n\nconst { TABLET_MEDIA_QUERY, MOBILE_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nconst Modal = styled.div`\n border-radius: 12px;\n background-color: ${COLORS.WHITE};\n\n ${({ compat }) => !compat && `box-shadow: ${STYLES.SHADOW_E};`}\n\n ${TABLET_MEDIA_QUERY} {\n max-width: 95%;\n width: unset;\n }\n\n ${MOBILE_MEDIA_QUERY} {\n max-width: 100%;\n height: 100%;\n border-radius: 0;\n }\n`;\n\nconst Logo = styled(Link)`\n text-align: center;\n`;\n\nconst Title = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n`;\n\nconst Header = styled.div`\n ${FONTS.HEADING_3_SEMIBOLD}\n ${MOBILE_MEDIA_QUERY} {\n ${FONTS.HEADING_4_SEMIBOLD}\n }\n`;\n\nconst Subheader = styled.div`\n ${FONTS.REGULAR_1}\n max-width: 372px;\n text-align: center;\n ${MOBILE_MEDIA_QUERY} {\n display: none;\n }\n`;\n\nconst Form = styled.form`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n margin-top: -32px;\n`;\n\nconst Error = styled.div`\n ${FONTS.REGULAR_3}\n margin-top: 5px;\n min-height: 20px;\n color: ${COLORS.RED};\n text-align: center;\n max-width: 300px;\n`;\n\nconst Input = styled.input`\n ${FONTS.REGULAR_2}\n\n height: 42px;\n width: 100%;\n padding: 10px;\n\n border: solid 1px ${COLORS.NEUTRAL_200};\n border-radius: 6px;\n\n ${({ error }) => error && `border: solid 1px ${COLORS.RED};`}\n\n ${MOBILE_MEDIA_QUERY} {\n border-color: ${COLORS.NEUTRAL_200};\n }\n`;\n\nconst Top = styled.div`\n display: flex;\n justify-content: center;\n flex-direction: column;\n gap: 40px;\n ${({ compat }) => (compat ? `padding: 10px 10px 30px;` : `padding: 48px;`)}\n ${TABLET_MEDIA_QUERY} {\n padding: 40px 24px;\n }\n`;\n\nconst Bottom = styled.div`\n width: 100%;\n\n display: flex;\n justify-content: center;\n flex-direction: column;\n\n border-top: 1px solid ${COLORS.NEUTRAL_300};\n\n padding: 16px;\n\n text-align: center;\n display: inline-block;\n\n ${({ compat }) =>\n compat\n ? `\n ${FONTS.MEDIUM_2}\n padding-bottom: 4px;`\n : `\n ${FONTS.SEMIBOLD_2}\n `}\n\n ${MOBILE_MEDIA_QUERY} {\n margin-top: 15px;\n width: 100%;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.SEMIBOLD_1}\n text-align: left;\n }\n`;\n\nconst LinkContainer = styled.div`\n display: flex;\n justify-content: space-between;\n width: 100%;\n margin-top: 8px;\n`;\n\nconst LoginLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 4px;\n\n text-decoration: underline;\n color: ${COLORS.BLACK};\n ${FONTS.REGULAR_2}\n\n ${MOBILE_MEDIA_QUERY} {\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.SEMIBOLD_1}\n\n text-decoration: none;\n }\n\n &:hover {\n cursor: pointer;\n color: ${COLORS.BLUE_900};\n }\n`;\n\nconst SignUp = styled(Link)`\n text-decoration: underline;\n color: ${COLORS.BLACK};\n ${FONTS.REGULAR_2}\n\n ${MOBILE_MEDIA_QUERY} {\n display: flex;\n justify-content: center;\n align-items: center;\n\n height: 48px;\n margin-top: 12px;\n\n border-radius: 3px;\n border-style: solid;\n border-width: 2px;\n\n color: ${COLORS.HALO_BLUE};\n ${FONTS.SEMIBOLD_1}\n\n text-decoration: none;\n }\n`;\n","import {\n CompanyAvatar,\n Icon,\n IconButton,\n MoreActionsDropdown,\n UserPreview,\n} from \"@components/library\";\nimport type { ExtendedDropdownOption } from \"@components/library/Dropdowns/DropdownOption\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport type { RootState } from \"@redux/store\";\nimport { InboxMessageThread, MessageRecipient } from \"@tsTypes/index\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\ninterface Props {\n currentThread: InboxMessageThread;\n isModal?: boolean;\n}\n\nconst Participants = ({ currentThread, isModal }: Props) => {\n if (\"proposal\" in currentThread) {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const { company, scientist_user } = currentThread;\n\n const isCompanyHidden = \"private_alias\" in company;\n\n const moreActionsOptions: ExtendedDropdownOption[] = [\n {\n value: \"VIEW_PROFILE\",\n label: `View Profile`,\n onSelect: () => window.open(`/profile/${scientist_user.profile_id}`, \"_blank\"),\n iconName: \"Profile\",\n },\n ];\n\n return (\n <>\n <div data-testid=\"scientist-participant\">\n <SectionTitle>Scientist</SectionTitle>\n <UserPreviewContainer>\n <UserPreview size=\"sm\" user={scientist_user} />\n {isModal && (\n <MoreActionsDropdown options={moreActionsOptions} menuHorizontalPosition=\"right\">\n <IconButton\n size=\"sm\"\n variant=\"fourth\"\n iconName=\"More Actions\"\n tooltipWidth=\"100px\"\n />\n </MoreActionsDropdown>\n )}\n </UserPreviewContainer>\n </div>\n <CompanySectionTitle data-testid=\"company-participant\">\n <UnstyledLink\n as={isCompanyHidden ? \"div\" : Link}\n to={!isCompanyHidden ? `/company/${company.identifier}` : undefined}\n target=\"_blank\"\n >\n {isCompanyHidden ? company.private_alias ?? \"Private Company\" : company.company_name}\n </UnstyledLink>\n </CompanySectionTitle>\n <CompanyMembers isModal={isModal} data-testid=\"company-members\">\n {(\"company_members\" in currentThread && !isCompanyHidden\n ? currentThread.company_members\n : [{}]\n ).map((member) => {\n const isScientistUser = currentUser.id === currentThread.scientist_user.id;\n const shouldDisplayAsExternalLead =\n isScientistUser && member.role === UserRole.SCIENTIST && !(\"id\" in member);\n\n return shouldDisplayAsExternalLead && !isCompanyHidden ? (\n <ExternalLead>\n <CompanyAvatar\n isPrivate={isCompanyHidden}\n imageUrl={company.avatar.url}\n size=\"sm\"\n />\n <ExternalLeadName>{company.company_name} team</ExternalLeadName>\n </ExternalLead>\n ) : (\n <UserPreviewContainer key={(member as MessageRecipient).id}>\n <UserPreview\n size=\"sm\"\n user={member as MessageRecipient}\n userRole={isScientistUser ? UserRole.SPONSOR : member.role}\n isUserHidden={isCompanyHidden}\n isExternalLead={member.role === UserRole.SCIENTIST}\n />\n </UserPreviewContainer>\n );\n })}\n </CompanyMembers>\n {currentUser.role === UserRole.SPONSOR && (\n <Warning isModal={isModal}>\n <Icon name=\"Proposal Privacy\" color={COLORS.ORANGE} size=\"lg\" margin=\"0 0 12px 0\" />\n This conversation is stored with the proposal so you and your team can reference it in\n the future.\n </Warning>\n )}\n </>\n );\n }\n\n // Create map of participants grouped by location\n const dmParticipants = new Map();\n [...(currentThread.recipients ?? [])].forEach((participant) => {\n if (!participant) return;\n if (!dmParticipants.has(participant.location)) {\n dmParticipants.set(participant.location, [participant]);\n return;\n }\n dmParticipants.get(participant.location).push(participant);\n });\n\n return (\n <DMParticipants>\n {Array.from(dmParticipants.keys()).map((location) => (\n <div key={location}>\n <DMSectionTitle>{location}</DMSectionTitle>\n {dmParticipants.get(location).map((participant) => (\n <UserPreviewContainer key={`user-preview-${participant.id}`}>\n <UserPreview size=\"sm\" user={participant} userRole={participant.role} />\n </UserPreviewContainer>\n ))}\n </div>\n ))}\n </DMParticipants>\n );\n};\n\nexport default Participants;\n\nconst UnstyledLink = styled(Link)`\n color: inherit;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: inherit;\n text-decoration: none;\n }\n`;\n\nconst SectionTitle = styled.div`\n ${FONTS.SEMIBOLD_2}\n color: ${COLORS.NEUTRAL_500};\n margin-bottom: 12px;\n`;\n\nconst CompanySectionTitle = styled(SectionTitle)`\n margin-top: 32px;\n`;\n\nconst DMParticipants = styled.div`\n margin-top: -32px;\n`;\n\nconst DMSectionTitle = styled(SectionTitle)`\n margin-top: 32px;\n`;\n\nconst CompanyMembers = styled.div`\n ${({ isModal }) => isModal && \"min-height: 158px\"};\n ${({ isModal }) => !isModal && \"margin-bottom: 16px\"};\n height: 100%;\n overflow-y: scroll;\n\n &::-webkit-scrollbar {\n width: 6px;\n }\n ::-webkit-scrollbar-track {\n background: none;\n }\n &::-webkit-scrollbar-thumb {\n background-color: ${COLORS.NEUTRAL_300};\n }\n`;\n\nconst ExternalLead = styled.div`\n display: grid;\n grid-template-columns: 40px 1fr;\n gap: 6px;\n margin-bottom: 10px;\n margin-left: 14px;\n &:last-child {\n margin-bottom: 0;\n }\n`;\nconst ExternalLeadName = styled.div`\n height: fit-content;\n margin-top: 2px;\n ${STYLES.TWO_LINES};\n ${FONTS.TAG_SEMIBOLD_1};\n`;\n\nconst Warning = styled.div`\n ${FONTS.MEDIUM_3};\n background-color: ${COLORS.ORANGE_100};\n color: ${COLORS.ORANGE};\n border-radius: 6px;\n padding: 20px;\n height: 142px;\n ${({ isModal }) =>\n isModal &&\n `\n height: 88px;\n display: flex;\n align-items: center;\n ${FONTS.MEDIUM_2};\n gap: 10px;\n `}\n`;\n\nconst UserPreviewContainer = styled.div`\n margin-bottom: 10px;\n margin-left: 16px;\n display: flex;\n gap: 10px;\n &:last-child {\n margin-bottom: 0;\n }\n`;\n","import { CREDENTIALS } from \"@constants\";\nimport Ably from \"ably\";\n\n// Do not auto-connect in order to \"save\" connections only when we need it (free plan is up to 200)\n// If you require realtime functionality, we should purchase a full plan.\nconst ably = new Ably.Realtime({\n key: CREDENTIALS.ABLY_FRONTEND_API_KEY,\n autoConnect: false,\n});\n\nexport default ably;\n","import { Button, InfoBanner } from \"@components/library\";\nimport BlankModal, { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { FONTS } from \"@constants\";\nimport { t } from \"@utils/i18n\";\n\nimport styled from \"styled-components\";\n\ninterface Props {\n openFileBrowser: () => any;\n}\n\nconst AttachmentsInfoModal = ({\n openFileBrowser,\n isOpen,\n onClose,\n}: Props & Pick<BlankModalProps, \"isOpen\" | \"onClose\">) => {\n if (!isOpen) return null;\n\n return (\n <BlankModal isOpen={isOpen} onClose={onClose} width=\"494px\" disableBackgroundScroll>\n <Content data-testid=\"attachments-info-modal\">\n <Heading>Attachment Requirements</Heading>\n <List>\n <li>The maximum size for each is 5MB</li>\n <li>The file format needs to be PNG, JPG, or PDF</li>\n </List>\n <InfoBanner\n type=\"attention-orange\"\n text={t(\"common.misc.confidential\")}\n shouldDisplay\n width=\"100%\"\n />\n <ButtonContainer>\n <Button width=\"132px\" onClick={openFileBrowser} data-testid=\"got-it-button\">\n Got it\n </Button>\n </ButtonContainer>\n </Content>\n </BlankModal>\n );\n};\n\nexport default AttachmentsInfoModal;\n\nconst Content = styled.div`\n padding: 48px 56px 24px;\n`;\n\nconst Heading = styled.div`\n ${FONTS.HEADING_3_SEMIBOLD}\n`;\n\nconst List = styled.ul`\n ${FONTS.REGULAR_1}\n margin: 16px 0;\n list-style: inside;\n padding-left: 5px;\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n margin-top: 56px;\n`;\n","import {\n Button,\n ErrorModal,\n Icon,\n IconButton,\n InfoBanner,\n MessageAttachment,\n Tooltip,\n} from \"@components/library\";\nimport { ABLY_CHANNELS, COLORS, FONTS, STYLES } from \"@constants\";\nimport { setMessengerThread } from \"@redux/actions/messengerActions\";\nimport { RootState } from \"@redux/store\";\nimport {\n MessageAttachmentAsJson,\n addMessageToThread,\n createMessageThread,\n getDraftMessage,\n setDraftMessage,\n uploadAttachment,\n} from \"@requests/messages\";\nimport {\n InboxMessageThread,\n MessageAttachmentPartial,\n MessagePartial,\n MessageRecipient,\n} from \"@tsTypes/index\";\nimport { MessageAttachmentContentType } from \"@tsTypes/messages\";\nimport { User } from \"@tsTypes/schema\";\nimport { UserRole } from \"@tsTypes/users\";\nimport ably from \"@utils/ably\";\nimport { debounce } from \"@utils/appUtils\";\nimport { t } from \"@utils/i18n\";\nimport {\n ChangeEvent,\n Dispatch,\n ReactNode,\n SetStateAction,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { USER_ROLES } from \"src/constants/users\";\nimport styled from \"styled-components\";\nimport AttachmentsInfoModal from \"./AttachmentsInfoModal\";\n\ninterface Props {\n currentThread?: InboxMessageThread | null;\n setMessages: Dispatch<SetStateAction<MessagePartial[]>>;\n isInbox?: boolean;\n openGallery: (attachments: MessageAttachmentPartial[], attachmentId: number) => void;\n // recipient is undefined when the current user is the associated scientist of a proposal thread and the\n // request is confidential\n recipient?: MessageRecipient | Pick<User, \"role\">;\n}\n\nconst MAX_FILE_SIZE_IN_BYTES = 5_000_000; // 5MB\nconst MESSAGE_INPUT_MIN_HEIGHT = 112;\n\nconst MessageCompose = ({\n currentThread,\n setMessages,\n isInbox = false,\n recipient,\n openGallery,\n}: Props) => {\n const [messageInput, setMessageInput] = useState(\"\");\n const [isFetchingDraft, setIsFetchingDraft] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [attachments, setAttachments] = useState<\n (MessageAttachmentAsJson | MessageAttachmentPartial)[]\n >([]);\n const [isAttachmentsInfoModalOpen, setIsAttachmentsInfoModalOpen] = useState(false);\n const [isAttachmentUploading, setIsAttachmentUploading] = useState(false);\n const [uploadPercentage, setUploadPercentage] = useState<number>();\n const [hasOpenedAttachmentsInfoModal, setHasOpenedAttachmentsInfoModal] = useState(false);\n const [attachmentError, setAttachmentError] = useState<ReactNode>();\n const [shouldShowJumpToBottom, setShouldShowJumpToBottom] = useState(false);\n\n const dispatch = useDispatch();\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n let proposalyId = useSelector((state: RootState) => state.messenger.messengerData.proposalyId);\n let proposalyType = useSelector(\n (state: RootState) => state.messenger.messengerData.proposalyType\n );\n // overwrite proposal ID if exists\n if (currentThread?.proposaly_id && currentThread.proposaly_type) {\n proposalyType = currentThread.proposaly_type;\n proposalyId = currentThread.proposaly_id;\n }\n\n // Used for draft message loading\n const messageRef = useRef(messageInput);\n const fetchingProposalIdRef = useRef(proposalyId);\n // Used for grabbing file from file input\n const fileInputRef = useRef<HTMLInputElement>(null);\n // Used for cancelling an in-progress upload\n const uploadAttachmentAbortControllerRef = useRef<AbortController>();\n // Used for scroll to just added attachment\n const attachmentsRef = useRef<HTMLDivElement | null>(null);\n // Used for auto-resizing text area\n const messageInputRef = useRef<HTMLTextAreaElement | null>(null);\n // Used for jump to bottom functionality\n const inputContainerRef = useRef<HTMLDivElement | null>(null);\n const inputBottomRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n // Reset state on thread change\n setMessageInput(\"\");\n setAttachments([]);\n setShouldShowJumpToBottom(false);\n // Abort upload\n uploadAttachmentAbortControllerRef.current?.abort();\n // Only show attachments info modal once per conversation per session\n setHasOpenedAttachmentsInfoModal(false);\n\n ably.connect();\n const channel = ably.channels.get(`message_thread_${currentThread?.id}`);\n channel.subscribe(ABLY_CHANNELS.NEW_MESSAGE, function (message) {\n const messageData = JSON.parse(message.data);\n setMessages((messages) => [...messages, messageData]);\n });\n\n return () => {\n channel.unsubscribe();\n };\n }, [currentThread]);\n\n // Fetching drafts\n // TODO adapt for direct message\n const debouncedSetDraftMessage = debounce(setDraftMessage, 500);\n useEffect(() => {\n if (proposalyId && proposalyType) {\n (async () => {\n // Set the most recent currently-fetching proposal\n fetchingProposalIdRef.current = proposalyId;\n setIsFetchingDraft(true);\n\n const draftMessage = await getDraftMessage({ proposalyId, proposalyType });\n\n // This prevents applying the fetched draft in case a new draft started fetching in the meantime\n if (draftMessage && fetchingProposalIdRef.current === proposalyId) {\n // If the user started typing while the draft was fetching, this combines the\n // draft + input instead or replacing what they had typed with the fetched draft\n setMessageInput(draftMessage.content + messageRef.current);\n setAttachments(draftMessage.message_attachments);\n }\n\n setIsFetchingDraft(false);\n })();\n }\n }, [proposalyId]);\n\n // Setting drafts\n // TODO adapt for direct message\n useEffect(() => {\n // Reset message container size\n if (messageInput.length === 0 && messageInputRef.current) {\n messageInputRef.current.style.height = \"unset\";\n }\n\n if (proposalyId) {\n // Store the user's input so it can be added to the fetched draft after fetching is done\n messageRef.current = messageInput;\n\n // Don't set drafts while fetching, because they use the same record and can cause a race\n // condition. Also prevents setting the draft as \"\" while the draft is fetching\n // Also don't set drafts while uploading an attachment (and do it afterwards)\n if (!(isFetchingDraft || isAttachmentUploading)) {\n debouncedSetDraftMessage({\n proposalyId,\n proposalyType,\n content: messageInput,\n attachmentIds: attachments\n .map((attachment) => attachment.id)\n .filter((id) => Boolean(id)) as unknown as number[],\n });\n }\n }\n }, [messageInput]);\n\n const openFileBrowser = () => {\n fileInputRef.current?.click();\n };\n\n const handleAttachmentInitiation = () => {\n // Open info modal if the first time, or go straight to file browser otherwise\n if (!hasOpenedAttachmentsInfoModal) {\n setHasOpenedAttachmentsInfoModal(true);\n setIsAttachmentsInfoModalOpen(true);\n } else {\n openFileBrowser();\n }\n };\n\n const handleAttachmentUpload = async (event: ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n setIsAttachmentUploading(true);\n setIsAttachmentsInfoModalOpen(false);\n\n const files = event.target.files;\n\n if (!files || files.length === 0) {\n setIsAttachmentUploading(false);\n setAttachmentError(\"For some reason the upload didn't work. Please try again\");\n return;\n }\n\n const file = files[0];\n\n if (file.size > MAX_FILE_SIZE_IN_BYTES) {\n setIsAttachmentUploading(false);\n setAttachmentError(\n <>\n This file is too large.\n <br />\n Please upload a file that is smaller than 5MB.\n </>\n );\n return;\n }\n\n if (\n attachments.some(\n (attachment) =>\n attachment.filename === file.name &&\n attachment.size_in_bytes === file.size &&\n attachment.mime_content_type === file.type\n )\n ) {\n setIsAttachmentUploading(false);\n setAttachmentError(\"You have already attached that file.\");\n return;\n }\n\n // Display in progress attachment\n const oldAttachments = [...attachments];\n // flushSync is warned against by the React beta docs due to weird behavior\n // with flushing pending state. Here it makes sense, but be wary when\n // modifying this component logic.\n flushSync(() => {\n setAttachments([\n ...oldAttachments,\n {\n filename: file.name,\n size_in_bytes: file.size,\n mime_content_type: file.type as MessageAttachmentContentType,\n } as MessageAttachmentPartial,\n ]);\n });\n\n const inputContainer = inputContainerRef.current;\n if (inputContainer && messageInputRef.current) {\n const hasVerticalScrollbar =\n inputContainer.scrollHeight > inputContainer.clientHeight &&\n messageInputRef.current.clientHeight > MESSAGE_INPUT_MIN_HEIGHT;\n\n if (hasVerticalScrollbar) {\n // Scroll to newly added attachment if scrollable\n attachmentsRef.current?.lastElementChild?.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n });\n\n // Show jump to bottom icon if scrollable\n setShouldShowJumpToBottom(true);\n }\n }\n\n // Upload attachment\n let attachment: MessageAttachmentAsJson | undefined;\n uploadAttachmentAbortControllerRef.current = new AbortController();\n try {\n attachment = await uploadAttachment(\n file,\n uploadAttachmentAbortControllerRef.current.signal,\n setUploadPercentage\n );\n } catch (_) {\n setAttachmentError(\"For some reason the upload didn't work, please try again\");\n setAttachments(oldAttachments);\n }\n\n // Check if aborted\n if (attachment) {\n // Replace in progress attachment in state with uploaded attachment response\n const newAttachments = [...oldAttachments, attachment];\n setAttachments(newAttachments);\n\n // Update draft message after new attachment finished uploading\n debouncedSetDraftMessage({\n proposalyId,\n proposalyType,\n content: messageInput,\n attachmentIds: newAttachments\n .map((_attachment) => _attachment.id)\n .filter((id) => Boolean(id)) as unknown as number[],\n });\n }\n\n // eslint-disable-next-line require-atomic-updates\n event.target.value = \"\";\n setIsAttachmentUploading(false);\n };\n\n const handleAttachmentRemove = (attachmentId?: number) => {\n if (attachmentId) {\n const newAttachments = attachments.filter((attachment) => attachment.id !== attachmentId);\n setAttachments(newAttachments);\n\n // Remove attachment from draft message\n debouncedSetDraftMessage({\n proposalyId,\n proposalyType,\n content: messageInput,\n attachmentIds: newAttachments\n .map((_attachment) => _attachment.id)\n .filter((id) => Boolean(id)) as unknown as number[],\n });\n } else {\n // Abort upload\n uploadAttachmentAbortControllerRef.current?.abort();\n // Remove last (in progress) attachment\n setAttachments([...attachments.slice(0, attachments.length - 1)]);\n }\n };\n\n // Set message input value and resize textarea to fit text\n // Called on onChange AND onKeyDown to cover all input cases\n const handleInputResizeAndChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n const element = e.target;\n if (!element) return;\n element.style.height = \"inherit\";\n element.style.height = `${element.scrollHeight}px`;\n\n setMessageInput(element.value);\n };\n\n // Scroll to bottom of message input and place cursor at end of input\n const jumpToBottom = () => {\n inputBottomRef.current?.scrollIntoView({\n behavior: \"smooth\",\n block: \"end\",\n });\n setShouldShowJumpToBottom(false);\n\n // Focus end of text\n const textarea = messageInputRef.current;\n if (!textarea) return;\n textarea.focus();\n textarea.setSelectionRange(messageInput.length, messageInput.length);\n };\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n\n const attachmentIds = attachments\n .map((attachment) => attachment.id)\n .filter(Boolean) as unknown as number[];\n\n if (currentThread?.id) {\n await addMessageToThread({\n messageThreadId: currentThread.id,\n content: messageInput,\n attachmentIds,\n });\n } else {\n const { message_thread } = await createMessageThread({\n proposalyType,\n proposalyId,\n userId: (recipient as MessageRecipient).id,\n content: messageInput,\n attachmentIds,\n });\n dispatch(setMessengerThread(message_thread));\n }\n // TODO update the return value of addMessageToThread so that we can just add it to state\n // instead of re-fetching all messages\n\n setAttachments([]);\n setMessageInput(\"\");\n setShouldShowJumpToBottom(false);\n setIsSubmitting(false);\n };\n\n const isProposalThread = currentThread && \"request\" in currentThread;\n const isExternalLead =\n currentUser.role === UserRole.SCIENTIST && currentUser.id !== currentThread?.scientist_user?.id;\n const isToExternalLead =\n currentUser.id === currentThread?.scientist_user?.id && recipient?.role === UserRole.SCIENTIST;\n\n let placeholderRecipientName = (recipient as MessageRecipient | undefined)?.name;\n if (\n isProposalThread &&\n \"private_alias\" in currentThread.company &&\n currentThread.request.confidential &&\n currentUser.id === currentThread.scientist_user.id\n ) {\n placeholderRecipientName = currentThread.company.private_alias ?? \"the company\";\n } else if (isProposalThread && isToExternalLead && \"company_name\" in currentThread.company) {\n placeholderRecipientName = `the ${currentThread.company.company_name} team`;\n }\n\n return (\n <>\n <FileInput\n type=\"file\"\n accept=\"image/png, image/jpeg, application/pdf\"\n ref={fileInputRef}\n onChange={handleAttachmentUpload}\n />\n <AttachmentsInfoModal\n isOpen={isAttachmentsInfoModalOpen}\n onClose={() => setIsAttachmentsInfoModalOpen(false)}\n openFileBrowser={openFileBrowser}\n />\n <ErrorModal\n isOpen={Boolean(attachmentError)}\n onClose={() => setAttachmentError(undefined)}\n message={attachmentError}\n />\n <Container isInbox={isInbox}>\n {isProposalThread &&\n currentThread.request.confidential &&\n (currentUser.role === USER_ROLES.sponsor || isExternalLead) && (\n <InfoBanner\n type=\"attention-orange\"\n text={`You are messaging about an opportunity where ${\n isExternalLead ? \"the\" : \"your\"\n } company's name is anonymized. Do not reveal information about ${\n isExternalLead ? \"the\" : \"your\"\n } company.`}\n margin=\"-16px 0 16px\"\n font={FONTS.REGULAR_3}\n />\n )}\n <InputContainer isInbox={isInbox} ref={inputContainerRef}>\n <div>\n {attachments.length > 0 && (\n <AttachmentsContainer ref={attachmentsRef}>\n {attachments.map((attachment) => (\n <MessageAttachment\n key={`attachment-${attachment.id ?? \"in-prog\"}`}\n attachment={attachment}\n isInbox={isInbox}\n uploadPercentage={!attachment.id ? uploadPercentage : 100}\n onRemove={() => handleAttachmentRemove(attachment.id)}\n onClick={() =>\n attachment.id &&\n openGallery(attachments as MessageAttachmentPartial[], attachment.id)\n }\n />\n ))}\n </AttachmentsContainer>\n )}\n <TextInput\n data-testid=\"message-input\"\n ref={messageInputRef}\n placeholder={\n isFetchingDraft && proposalyId\n ? \"\"\n : `Write a message to ${placeholderRecipientName}`\n }\n value={messageInput}\n isInbox={isInbox}\n onKeyDown={handleInputResizeAndChange}\n onChange={handleInputResizeAndChange}\n onFocus={() => setShouldShowJumpToBottom(false)}\n />\n <div ref={inputBottomRef} />\n </div>\n </InputContainer>\n <JumpToBottomContainer>\n <JumpToBottom isVisible={shouldShowJumpToBottom} onClick={jumpToBottom}>\n <Icon name=\"Chevron Down\" size=\"lg\" color={COLORS.WHITE} />\n </JumpToBottom>\n </JumpToBottomContainer>\n <BottomContainer isInbox={isInbox}>\n <WarningMessageContainer isInbox={isInbox}>\n <Icon name=\"Attention\" color={COLORS.BLACK} />\n <WarningMessage isInbox={isInbox}>{t(\"common.misc.confidential\")}</WarningMessage>\n </WarningMessageContainer>\n <BottomButtonContainer>\n <IconButton\n iconName=\"Attachment\"\n tooltipWidth=\"122px\"\n tooltipText=\"Add attachments\"\n onClick={handleAttachmentInitiation}\n disabled={isSubmitting || isAttachmentUploading}\n variant=\"ghost\"\n data-testid=\"add-attachment-button\"\n />\n <Tooltip\n isActive={!messageInput}\n tooltipWidth={isInbox ? \"310px\" : \"120px\"}\n position=\"top\"\n content={\n isInbox\n ? \"Please include a message with your attachment(s)\"\n : \"Please include a message\"\n }\n >\n <Button\n type=\"button\"\n data-testid=\"send-message-button\"\n iconName=\"Send Message\"\n iconPosition=\"right\"\n onClick={handleSubmit}\n disabled={!messageInput || isSubmitting || isAttachmentUploading}\n size={isInbox ? \"md\" : \"sm\"}\n >\n Send\n </Button>\n </Tooltip>\n </BottomButtonContainer>\n </BottomContainer>\n </Container>\n </>\n );\n};\n\nexport default MessageCompose;\n\nconst FileInput = styled.input`\n && {\n display: none;\n }\n`;\n\nconst Container = styled.div`\n background-color: ${({ isInbox }) => (isInbox ? COLORS.NEUTRAL_100 : COLORS.WHITE)};\n padding: ${({ isInbox }) => (isInbox ? \"24px\" : \"8px 10px 0px\")};\n margin-top: 10px;\n border-radius: 8px;\n`;\n\nconst BottomContainer = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: ${({ isInbox }) => (isInbox ? \"16px\" : \"8px\")};\n`;\n\nconst InputContainer = styled.div`\n background: ${({ isInbox }) => (isInbox ? COLORS.WHITE : COLORS.NEUTRAL_100)};\n max-height: 30vh;\n overflow-y: auto;\n // Use column-reverse to keep the auto-expanding text area scrolled down\n display: flex;\n flex-direction: column-reverse;\n`;\n\nconst JumpToBottomContainer = styled.div`\n width: 100%;\n height: 0;\n position: relative;\n`;\n\nconst JumpToBottom = styled.div`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n bottom: 15px;\n\n display: ${({ isVisible }) => (isVisible ? \"flex\" : \"none\")};\n align-items: center;\n justify-content: center;\n\n width: 30px;\n height: 30px;\n border-radius: 50%;\n\n background-color: ${COLORS.BLACK};\n box-shadow: ${STYLES.SHADOW_D};\n cursor: pointer;\n\n transition: opacity 0.3s ease-in;\n opacity: ${({ isVisible }) => (isVisible ? \"0.5\" : \"0\")};\n\n &:hover {\n opacity: 1;\n }\n`;\n\nconst AttachmentsContainer = styled.div`\n padding: 16px 0 0 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n`;\n\nconst TextInput = styled.textarea`\n min-height: ${MESSAGE_INPUT_MIN_HEIGHT}px;\n width: 100%;\n padding: ${({ isInbox }) => (isInbox ? \"14px 16px\" : \"8px 12px 0 12px\")};\n resize: none;\n border-radius: 6px;\n border: none;\n ${FONTS.REGULAR_2};\n vertical-align: top;\n background: ${({ isInbox }) => !isInbox && COLORS.NEUTRAL_100};\n overflow: hidden;\n\n &::placeholder {\n ${FONTS.REGULAR_2};\n color: ${COLORS.NEUTRAL_500};\n }\n`;\n\nconst WarningMessageContainer = styled.div`\n display: flex;\n align-items: center;\n`;\nconst WarningMessage = styled.div`\n ${({ isInbox }) => (isInbox ? FONTS.MEDIUM_2 : FONTS.TAG_MEDIUM_2)};\n`;\nconst BottomButtonContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n`;\n","import { CompanyAvatar, MessageAttachment, ProfilePicture } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport {\n InboxMessageThread,\n MessageAttachmentPartial,\n MessagePartial,\n MessageRecipient,\n} from \"@tsTypes/index\";\nimport { User } from \"@tsTypes/schema\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { renderNewlines } from \"@utils/textUtils\";\nimport { AxiosError } from \"axios\";\nimport dayjs from \"dayjs\";\nimport { useEffect, useRef } from \"react\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\n\ninterface Props {\n messages: MessagePartial[];\n messageError: AxiosError | undefined;\n recipient?: MessageRecipient | Pick<User, \"role\">;\n currentThread?: InboxMessageThread | null;\n isInbox: boolean;\n isLoading: boolean;\n openGallery: (attachments: MessageAttachmentPartial[], attachmentId: number) => void;\n}\n\nfunction MessageList({\n messages,\n messageError,\n isInbox = false,\n recipient,\n isLoading,\n currentThread,\n openGallery,\n}: Props) {\n const endOfMessagesRef = useRef<null | HTMLDivElement>(null);\n\n useEffect(() => {\n setTimeout(() => {\n endOfMessagesRef.current?.scrollIntoView({\n behavior: \"smooth\",\n block: \"start\",\n inline: \"nearest\",\n });\n }, 50);\n }, [messages]);\n\n if (isLoading && messages.length === 0) {\n return (\n <Container>\n <Loader active inline=\"centered\" style={{ margin: \"auto\" }} />\n </Container>\n );\n }\n\n return (\n <Container data-testid=\"messages-list\">\n <Messages>\n {messages.length && currentThread ? (\n messages.map((message, index: number) => {\n const isFromExternalLead =\n message.user.role === UserRole.SCIENTIST && !(\"id\" in message.user);\n const isUserHidden = Boolean(\n currentThread &&\n \"company\" in currentThread &&\n \"private_alias\" in currentThread.company\n );\n\n return (\n <Message\n key={`inbox-message-${message.id}`}\n ref={index === messages.length - 1 ? endOfMessagesRef : null}\n isInbox={isInbox}\n data-testid=\"message\"\n >\n <MessageTime>{dayjs(message.created_at ?? \"\").fromNow()}</MessageTime>\n <MessageContainer>\n <ProfilePictureContainer>\n {isFromExternalLead && !isUserHidden ? (\n <CompanyAvatar\n isPrivate={isUserHidden}\n imageUrl={\n \"company\" in currentThread && \"avatar\" in currentThread.company\n ? currentThread.company.avatar.url\n : undefined\n }\n size=\"sm\"\n />\n ) : (\n <ProfilePicture\n size=\"sm\"\n user={message.user as MessageRecipient}\n isUserHidden={isUserHidden}\n />\n )}\n </ProfilePictureContainer>\n <MessageContent data-testid=\"message-content\">\n {message.message_attachments.length > 0 && (\n <MessageAttachmentContainer>\n {message.message_attachments.map((attachment) => (\n <MessageAttachment\n key={`sent-attachment-${attachment.id}`}\n attachment={attachment}\n isInbox={isInbox}\n onClick={() => openGallery(message.message_attachments, attachment.id)}\n />\n ))}\n </MessageAttachmentContainer>\n )}\n {renderNewlines(message.content)}\n </MessageContent>\n </MessageContainer>\n </Message>\n );\n })\n ) : (\n <MessageContent>\n {messageError ? (\n <ZeroMessagesState>\n Something went wrong loading your messages. Please try again later\n </ZeroMessagesState>\n ) : (\n <ZeroMessagesState>\n {`This is the beginning of your conversation with ${\n (recipient as MessageRecipient | undefined)?.name\n }`}\n </ZeroMessagesState>\n )}\n </MessageContent>\n )}\n </Messages>\n </Container>\n );\n}\n\nexport default MessageList;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n }\n ::-webkit-scrollbar-track {\n background: none;\n }\n &::-webkit-scrollbar-thumb {\n background-color: ${COLORS.NEUTRAL_300};\n }\n`;\n\nconst MessageTime = styled.div`\n ${FONTS.MEDIUM_3}\n color: ${COLORS.NEUTRAL_400};\n margin-bottom: 16px;\n`;\n\nconst Message = styled.div`\n margin-bottom: 28px;\n padding: ${(props) => (props.isInbox ? \"0 30px 0 0\" : \"0 19px\")};\n\n &:last-child {\n margin-bottom: ${(props) => (props.isInbox ? \"24px\" : \"18px\")};\n }\n ${({ isInbox }) =>\n !isInbox &&\n `\n &:first-child {\n margin-top: 18px;\n }\n `}\n`;\n\nconst MessageContainer = styled.div`\n display: flex;\n overflow-y: hidden;\n flex: 1 0 0px;\n word-break: break-word;\n`;\n\nconst ProfilePictureContainer = styled.div`\n width: 36px;\n height: 36px;\n margin-right: 12px;\n`;\n\nconst MessageContent = styled.div`\n ${FONTS.REGULAR_2}\n`;\n\nconst MessageAttachmentContainer = styled.div`\n & > div {\n margin-bottom: 8px;\n }\n`;\n\nconst Messages = styled.div`\n margin-top: auto;\n`;\nconst ZeroMessagesState = styled.div`\n ${FONTS.MEDIUM_2};\n color: ${COLORS.NEUTRAL_500};\n max-width: calc(100% - 94px);\n padding-left: 12px;\n`;\n","import { Icon } from \"@components/library\";\nimport MessageAttachmentGalleryModal from \"@components/modals/MessageAttachmentGalleryModal/MessageAttachmentGalleryModal\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport emptyState from \"@images/halo-empty-state.png\";\nimport { checkUnread } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport {\n InboxMessageThread,\n MessageAttachmentPartial,\n MessagePartial,\n MessageRecipient,\n} from \"@tsTypes/index\";\nimport { User } from \"@tsTypes/schema\";\nimport { t } from \"@utils/i18n\";\nimport { proposalyPagePath } from \"@utils/proposalyUtils\";\nimport { AxiosError } from \"axios\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport { getMessages } from \"src/requests/messages\";\nimport styled from \"styled-components\";\nimport MessageCompose from \"./MessageCompose\";\nimport MessageList from \"./MessageList\";\n\ninterface Props {\n currentThread?: InboxMessageThread | null;\n isInbox?: boolean;\n height?: string;\n}\n\nconst Conversation = ({ currentThread, isInbox, height }: Props) => {\n const [messages, setMessages] = useState<MessagePartial[]>([]);\n const [messageError, setMessageError] = useState<AxiosError>();\n const [isLoadingMessages, setIsLoadingMessages] = useState(true);\n\n // Empty array closes the gallery, adding items opens it\n const [galleryAttachments, setGalleryAttachments] = useState<MessageAttachmentPartial[]>([]);\n const [focusedGalleryAttachmentIndex, setFocusedGalleryAttachmentIndex] = useState<number>();\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const messengerData = useSelector((state: RootState) => state.messenger.messengerData);\n const isMessengerMinimized = useSelector(\n (state: RootState) => state.messenger.isMessengerMinimized\n );\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n (async () => {\n if (currentThread?.id && (!isMessengerMinimized || isInbox)) {\n try {\n const { message_thread } = await getMessages(currentThread.id);\n\n setMessages(message_thread.messages);\n setIsLoadingMessages(false);\n dispatch(checkUnread());\n } catch (e) {\n setMessageError(e);\n setIsLoadingMessages(false);\n }\n } else {\n setMessages([]);\n setIsLoadingMessages(false);\n }\n })();\n }, [currentThread, isMessengerMinimized]);\n\n // Opens gallery with provided attachments array, focused on provided attachment id\n const openGallery = (attachments: MessageAttachmentPartial[], attachmentId: number) => {\n setGalleryAttachments(attachments);\n const index = attachments.findIndex((attachment) => attachment.id === attachmentId);\n setFocusedGalleryAttachmentIndex(index);\n };\n\n const closeGallery = () => {\n setGalleryAttachments([]);\n setFocusedGalleryAttachmentIndex(undefined);\n };\n\n if (!currentThread?.id && isInbox) {\n return (\n <ZeroState>\n <ZeroStateImage src={emptyState} alt=\"pen and paper\" />\n </ZeroState>\n );\n }\n\n const isThreadScientistUser =\n currentThread && currentUser.id === currentThread.scientist_user?.id;\n const isNonConfidentialProposalThread = currentThread && \"company_members\" in currentThread;\n const isDmThread = currentThread && \"recipients\" in currentThread;\n\n let recipient: MessageRecipient | Pick<User, \"role\"> | undefined;\n if (isInbox && currentThread) {\n if (!isThreadScientistUser) {\n recipient = currentThread.scientist_user;\n } else if (isNonConfidentialProposalThread) {\n recipient = currentThread.company_members[0];\n } else if (isDmThread) {\n recipient = currentThread.recipients.find(\n (_recipient) => _recipient.id !== currentThread.scientist_user.id\n );\n }\n // recipient is undefined when the current user is the associated scientist of a proposal thread and the\n // request is confidential\n } else {\n recipient = messengerData.recipient;\n }\n\n const hasProposalBanner = isInbox && currentThread && \"proposal\" in currentThread;\n\n return (\n <>\n <MessageAttachmentGalleryModal\n attachments={galleryAttachments}\n focusedAttachmentIndex={focusedGalleryAttachmentIndex}\n setFocusedAttachmentIndex={setFocusedGalleryAttachmentIndex}\n closeGallery={closeGallery}\n />\n <Container height={height}>\n <Messenger isInbox={isInbox}>\n <MessageListContainer hasBanner={hasProposalBanner}>\n {hasProposalBanner && (\n <ProposalBanner data-testid=\"proposal-banner\">\n <ProposalLabel>\n <Icon name=\"Proposal\" size=\"xs\" color={COLORS.NEUTRAL_500} margin=\"0 6px 0 0\" />{\" \"}\n Proposal\n </ProposalLabel>\n <ProposalTitle>\n <div>{currentThread.proposal.title ?? t(\"common.misc.untitled_proposal\")}</div>\n <ViewProposal\n to={proposalyPagePath({\n proposaly_type: currentThread.proposaly_type!,\n slug: currentThread.proposal.slug,\n })}\n target=\"_blank\"\n >\n <Icon name=\"Open in a new tab\" />\n </ViewProposal>\n </ProposalTitle>\n </ProposalBanner>\n )}\n <MessageList\n messages={messages}\n messageError={messageError}\n currentThread={currentThread}\n isInbox={Boolean(isInbox)}\n recipient={recipient}\n isLoading={isLoadingMessages}\n openGallery={openGallery}\n />\n </MessageListContainer>\n <MessageCompose\n currentThread={currentThread}\n setMessages={setMessages}\n isInbox={isInbox}\n recipient={recipient}\n openGallery={openGallery}\n />\n </Messenger>\n </Container>\n </>\n );\n};\n\nexport default Conversation;\n\nconst Container = styled.div`\n display: flex;\n flex: auto;\n flex-direction: column;\n height: ${(props) => props.height};\n`;\n\nconst Messenger = styled.div`\n display: grid;\n grid-template-rows: 1fr auto;\n height: 100%;\n padding: ${(props) => (props.isInbox ? \"24px 20px\" : \"0 0 16px 0\")};\n`;\n\nconst MessageListContainer = styled.div`\n display: grid;\n grid-template-rows: ${({ hasBanner }) => (hasBanner ? \"auto 1fr\" : \"1fr\")};\n height: 100%;\n min-height: 0;\n`;\n\nconst ProposalBanner = styled.div`\n min-width: 480px;\n margin-bottom: 24px;\n`;\n\nconst ProposalLabel = styled.div`\n display: flex;\n align-items: center;\n ${FONTS.MEDIUM_3}\n color: ${COLORS.NEUTRAL_500};\n`;\n\nconst ProposalTitle = styled.div`\n display: flex;\n justify-content: space-between;\n ${FONTS.MEDIUM_1};\n margin-top: 5px;\n\n div {\n ${STYLES.TWO_LINES}\n word-break: break-word;\n }\n`;\n\nconst ViewProposal = styled(Link)`\n color: ${COLORS.HALO_BLUE};\n margin: 5px 25px 0 20px;\n ${FONTS.REGULAR_3};\n`;\n\nconst ZeroState = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n`;\n\nconst ZeroStateImage = styled.img`\n width: 250px;\n`;\n","import { BlankModal, Icon, TextButton } from \"@components/library\";\nimport Button from \"@components/library/Buttons/Button\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\n\nconst RfpQuestionSubmittedModal = ({ onClose, isOpen, handleOpenShareModal }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n useEffect(() => {\n if (isCopied) {\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n }\n }, [isCopied]);\n\n useEffect(() => {\n if (isOpen) {\n setIsCopied(false);\n }\n }, [isOpen]);\n\n return (\n <BlankModal onClose={onClose} isOpen={isOpen} width=\"548px\" height=\"350px\">\n <ModalContent>\n <Icon name=\"Success\" color={COLORS.GREEN} size=\"xxl\" />\n <div>\n <Top>\n <Header>Your question was submitted!</Header>\n <SubHeader>\n Your question is currently under review by the team at Halo. We’ll let you know\n when it’s published.\n </SubHeader>\n </Top>\n <SubHeader>Have a colleague who might be interested?</SubHeader>\n <Button iconName=\"Share\" margin=\"0 0 16px 0\" onClick={handleOpenShareModal}>\n Share this opportunity\n </Button>\n <Or>\n or{\" \"}\n <TextButton\n onClick={() => {\n navigator.clipboard.writeText(window.location.href);\n setIsCopied(true);\n }}\n text={isCopied ? \"Copied!\" : \"Copy link to clipboard\"}\n color={isCopied ? COLORS.GREEN : COLORS.HALO_BLUE}\n iconName=\"Copy\"\n iconPosition=\"left\"\n size=\"sm\"\n />\n </Or>\n </div>\n </ModalContent>\n </BlankModal>\n );\n};\n\nexport default RfpQuestionSubmittedModal;\n\nconst ModalContent = styled.div`\n display: flex;\n align-items: flex-start;\n justify-content: center;\n gap: 8px;\n padding: 48px 32px;\n`;\nconst Header = styled.div`\n color: ${COLORS.BLACK};\n ${FONTS.HEADING_4_SEMIBOLD};\n margin: 4px 0px 0px 0px;\n`;\nconst SubHeader = styled.div`\n ${FONTS.REGULAR_2};\n margin: 6px auto 26px auto;\n`;\nconst Top = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n`;\nconst Or = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n ${FONTS.REGULAR_3};\n`;\n","import {\n downvote_request_comment_path,\n request_comment_path,\n request_comments_path,\n upvote_request_comment_path,\n} from \"@routes/routes\";\nimport api from \"./request\";\n\nexport const getRequestComments = async (requestId: number, sortBy: string) => {\n const response = await api.get(`/request_comments`, {\n params: {\n request_id: requestId,\n sort_by: sortBy,\n },\n });\n return response.data;\n};\n\nexport const createRequestComment = ({\n requestId,\n text,\n replyToId,\n open,\n}: {\n requestId: number;\n text: string;\n replyToId?: number;\n open: boolean;\n}) =>\n api.post(request_comments_path(), {\n request_id: requestId,\n reply_to_id: replyToId,\n text,\n open,\n });\n\nexport const editRequestComment = (id: number, text?: string, open?: boolean) =>\n api.put(request_comment_path({ id: id }), { text, open });\n\nexport const upvoteRequestComment = (id: number) => api.post(upvote_request_comment_path({ id }));\n\nexport const downvoteRequestComment = (id: number) =>\n api.post(downvote_request_comment_path({ id }));\n\nexport const deleteRequestComment = (id: number) => api.delete(request_comment_path({ id }));\n","import styled from \"styled-components\";\n\nconst List = styled.ul`\n margin: 0;\n padding-left: 20px;\n`;\n\nconst TOOLTIP_CONTENT = {\n SCIENTIST_UPVOTE: <>Vote up</>,\n SCIENTIST_NEW_QUESTION: (\n <>\n <b>Pro Tips</b>\n <List>\n <li>\n Before submitting a new question, consider upvoting other questions that might address\n your inquiry\n </li>\n <li>Ask questions you think could be valuable to others</li>\n <li>Be succinct — aim for a single sentence question that addresses one core concept</li>\n </List>\n </>\n ),\n SPONSOR_NEW_ANSWER: (\n <>\n <b>Pro Tips</b>\n <List>\n <li>Answer the question as directly as possible</li>\n <li>Provide context and framing to help your audience understand your answer</li>\n <li>Keep your response to 5-8 sentences maximum</li>\n </List>\n </>\n ),\n};\n\nexport default TOOLTIP_CONTENT;\n","import {\n Button,\n Checkbox,\n InfoBanner,\n InputTooltip,\n ProfilePicture,\n TextInput,\n TextLink,\n} from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { createRequestComment } from \"@requests/requestComments\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RequestCommentPartial, RfpPageRequest } from \"@tsTypes/index\";\nimport { RequestForStartupsShowResponse } from \"@tsTypes/request_for_startups/show\";\nimport { track } from \"@utils/appUtils\";\nimport { toastErrorHandler } from \"@utils/requests\";\nimport { Dispatch, SetStateAction, useEffect, useRef, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { USER_ROLES } from \"src/constants/users\";\nimport styled from \"styled-components\";\nimport line from \"./line.svg\";\nimport TOOLTIP_CONTENT from \"./tooltipContent\";\n\ninterface Props {\n companyName: string;\n request: RfpPageRequest | RequestForStartupsShowResponse;\n replyTo?: RequestCommentPartial;\n commentTreeLevel?: number;\n onSuccess: (requestCommentId: number) => void;\n setIsCommenting: Dispatch<SetStateAction<boolean>>;\n}\n\nconst RequestDiscussionSubmitForm = ({\n companyName,\n request,\n replyTo,\n commentTreeLevel = 0,\n onSuccess,\n setIsCommenting,\n}: Props) => {\n const [text, setText] = useState(\"\");\n const [isOpen, setIsOpen] = useState(true);\n const startedWritingRef = useRef(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const createCommentMutation = useMutation({\n mutationFn: createRequestComment,\n onSuccess: (response) => {\n const { id } = response.data;\n setText(\"\");\n onSuccess(id);\n },\n onError: toastErrorHandler,\n });\n\n const handleSubmitComment = () => {\n createCommentMutation.mutate({\n text,\n requestId: request.id,\n replyToId: replyTo?.id ?? undefined,\n open: isOpen,\n });\n };\n\n useEffect(() => {\n if (text.length > 0) startedWritingRef.current = true;\n }, [text]);\n\n useEffect(() => {\n return () => {\n if (startedWritingRef.current && text.length > 0)\n track(SegmentEventName.Abandon, {\n ui_component: \"Abandoned Comment\",\n react_component: \"RequestDiscussionSubmitForm\",\n request_slug: request.slug,\n });\n };\n }, []);\n\n const answering = replyTo?.id;\n\n return (\n <Container answering={answering}>\n {answering && <Line src={line} />}\n <Context>\n <ProfilePicture user={currentUser as any} size=\"xs\" />{\" \"}\n {answering ? <>Respond to {replyTo?.user?.name ?? companyName}</> : <>Ask {companyName}</>}\n </Context>\n <InputTooltip\n content={\n answering ? TOOLTIP_CONTENT.SPONSOR_NEW_ANSWER : TOOLTIP_CONTENT.SCIENTIST_NEW_QUESTION\n }\n width=\"316px\"\n arrowOffsetTop={answering ? \"90px\" : \"125px\"}\n tooltipOffsetTop={answering ? \"-12px\" : \"-100px\"}\n >\n <TextInput\n value={text}\n labelFont={FONTS.HEADING_5_SEMIBOLD}\n onChange={(e) => setText(e.target.value)}\n textarea\n startingHeight={answering ? \"175px\" : \"64px\"}\n resize=\"none\"\n characterLimit={answering ? undefined : 220}\n />\n </InputTooltip>\n {request.confidential && answering && currentUser.role === USER_ROLES.sponsor && (\n <InfoBanner\n type=\"attention-orange\"\n text=\"You are posting publicly on an opportunity where your company's name is anonymized. Do not reveal information about your company.\"\n margin=\"16px 0 0\"\n font={FONTS.REGULAR_3}\n />\n )}\n <CheckboxContainer>\n {answering && currentUser.role === USER_ROLES.sponsor && (\n <Checkbox\n label={\n <span>\n Allow {replyTo?.user?.name} to respond with a follow-up comment or question.\n {commentTreeLevel > 1 && replyTo?.user?.role === USER_ROLES.scientist ? (\n <span>\n {\" \"}\n You can also{\" \"}\n <TextLink to={`/profile/${replyTo?.user?.profile_id}`} color={COLORS.HALO_BLUE}>\n message them directly\n </TextLink>\n .\n </span>\n ) : null}\n </span>\n }\n isChecked={isOpen}\n onChange={(e) => setIsOpen(e.target.checked)}\n size=\"sm\"\n />\n )}\n </CheckboxContainer>\n <Submit>\n <Button\n size=\"sm\"\n width=\"160px\"\n onClick={handleSubmitComment}\n disabled={text.length === 0 || createCommentMutation.isLoading}\n >\n Submit\n </Button>\n <Cancel onClick={() => setIsCommenting(false)}>Cancel</Cancel>\n </Submit>\n </Container>\n );\n};\n\nexport default RequestDiscussionSubmitForm;\n\nexport const Submit = styled.div`\n display: flex;\n align-items: center;\n gap: 24px;\n ${FONTS.REGULAR_2}\n ${({ isEditing }) => isEditing && \"float: right; margin: 16px 0 0;\"}\n`;\nconst Context = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 8px;\n ${FONTS.MEDIUM_2}\n color: ${COLORS.NEUTRAL_500};\n margin-bottom: 8px;\n`;\nconst Container = styled.div`\n position: relative;\n margin: ${({ answering }) => (answering ? \"0 0 32px 24px\" : \"32px 0 56px 0\")};\n`;\nexport const CheckboxContainer = styled.div`\n margin: 16px 0;\n`;\n\nexport const Cancel = styled.div`\n display: block;\n text-decoration: none;\n cursor: pointer;\n ${FONTS.SEMIBOLD_2}\n color: ${COLORS.HALO_BLUE};\n`;\n\nconst Line = styled.img`\n position: absolute;\n left: -18px;\n top: -100px;\n z-index: -1;\n`;\n","import toast from \"@components/Toast\";\nimport { Button, Checkbox, TextInput } from \"@components/library\";\nimport { FONTS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { editRequestComment } from \"@requests/requestComments\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { RequestCommentPartial } from \"@tsTypes/index\";\nimport { Dispatch, SetStateAction, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { Cancel, CheckboxContainer, Submit } from \"./RequestDiscussionSubmitForm\";\n\ninterface Props {\n comment: RequestCommentPartial;\n onSuccess: () => Promise<void>;\n setIsEditing: Dispatch<SetStateAction<boolean>>;\n}\n\nconst RequestDiscussionEditForm = ({ comment, onSuccess, setIsEditing }: Props) => {\n const [text, setText] = useState(comment.text ?? \"\");\n const [isOpen, setIsOpen] = useState(comment.open ?? true);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const mutation = useMutation({\n mutationFn: () => editRequestComment(comment.id, text, isOpen),\n onSuccess: async () => {\n setText(\"\");\n toast.success(\"Response edited!\");\n await onSuccess();\n },\n meta: {\n useGlobalErrorHandler: true,\n },\n });\n\n const handleSubmitComment = () => {\n mutation.mutate();\n };\n\n const answering = currentUser.role === 1;\n\n return (\n <EditContainer>\n <TextInput\n value={text}\n labelFont={FONTS.HEADING_5_SEMIBOLD}\n placeholder=\"Write your answer\"\n onChange={(e) => setText(e.target.value)}\n textarea\n startingHeight=\"150px\"\n resize=\"none\"\n />\n <CheckboxContainer>\n {answering && (\n <Checkbox\n label=\"Allow researchers to respond to your comment\"\n isChecked={isOpen}\n onChange={(e) => setIsOpen(e.target.checked)}\n size=\"sm\"\n />\n )}\n </CheckboxContainer>\n <Submit isEditing>\n <Button\n size=\"sm\"\n margin=\"0 0 0 16px\"\n onClick={handleSubmitComment}\n disabled={mutation.isLoading || text?.length === 0}\n >\n Submit\n </Button>\n <Cancel onClick={() => setIsEditing(false)}>Cancel</Cancel>\n </Submit>\n </EditContainer>\n );\n};\n\nexport default RequestDiscussionEditForm;\n\nconst EditContainer = styled.div`\n width: 100%;\n`;\n","import toast from \"@components/Toast\";\nimport { Button, Icon, ProfilePicture, TextLink, Tooltip } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport {\n deleteRequestComment,\n downvoteRequestComment,\n editRequestComment,\n upvoteRequestComment,\n} from \"@requests/requestComments\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport {\n RequestCommentPartial,\n RfpPageRequest,\n ScientistProfilePartial,\n SponsorProfilePartial,\n UniversityProfilePartial,\n} from \"@tsTypes/index\";\nimport { RequestForStartupsShowResponse } from \"@tsTypes/request_for_startups/show\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport appsignal from \"@utils/appsignal\";\nimport dayjs from \"dayjs\";\nimport { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport RequestDiscussionEditForm from \"./RequestDiscussionEditForm\";\nimport RequestDiscussionSubmitForm from \"./RequestDiscussionSubmitForm\";\nimport line from \"./line.svg\";\nimport TOOLTIP_CONTENT from \"./tooltipContent\";\n\ninterface Props {\n comment: RequestCommentPartial;\n request: RfpPageRequest | RequestForStartupsShowResponse;\n commentTreeLevel?: number;\n refreshComments: () => Promise<void>;\n canAnswer: boolean;\n isCompanyHidden: boolean;\n canShowQA?: boolean;\n}\n\nconst RequestComment = ({\n comment,\n request,\n commentTreeLevel = 0,\n refreshComments,\n canAnswer,\n isCompanyHidden,\n canShowQA = true,\n}: Props) => {\n const {\n id,\n user,\n created_at,\n text,\n open,\n reply_to,\n replies,\n cached_votes_up,\n cached_votes_down,\n upvoted_by_current_user,\n downvoted_by_current_user,\n } = comment;\n\n const [isCommenting, setIsCommenting] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const dispatch = useDispatch();\n\n const isScientist = currentUser.role === UserRole.SCIENTIST;\n const isSponsor = currentUser.role === UserRole.SPONSOR;\n const isUniversityAdmin = currentUser.role === UserRole.UNIVERSITY_ADMIN;\n\n const commentBelongsToCurrentUser = currentUser.id && currentUser.id === user?.id;\n\n const isQuestion = commentTreeLevel === 0;\n const showEditActions =\n commentBelongsToCurrentUser && !isEditing && !(isQuestion && Number(replies?.length) > 0);\n const canUpvote = !isSponsor && !commentBelongsToCurrentUser;\n const showAnswerButton = !isCommenting && isQuestion && !replies?.length && canAnswer;\n const showReplyButton = (() => {\n if (isCommenting || isQuestion || replies?.length) return false;\n\n if (!open) return false;\n\n if (isScientist || isUniversityAdmin) {\n const belongsToThread = reply_to?.user?.id === currentUser.id;\n\n return belongsToThread;\n }\n\n if (isSponsor) {\n const replyToCompanyId = (reply_to?.user?.profile_info as SponsorProfilePartial)?.company_id;\n const currentUserCompanyId = currentUser.profile_info?.company_id;\n\n return replyToCompanyId === currentUserCompanyId;\n }\n\n return false;\n })();\n\n const commenterName =\n isCompanyHidden && user?.role === UserRole.SPONSOR ? \"Team Member\" : user?.name;\n\n let commenterTitle: string | null = \"\";\n let commenterLocation: string | null = \"\";\n\n if (user?.role === UserRole.SCIENTIST) {\n commenterLocation = (user.profile_info as ScientistProfilePartial)?.location;\n commenterTitle = (user.profile_info as ScientistProfilePartial)?.title ?? \"Scientist\";\n } else if (user?.role === UserRole.UNIVERSITY_ADMIN) {\n commenterLocation = (user.profile_info as UniversityProfilePartial)?.university;\n commenterTitle = (user.profile_info as UniversityProfilePartial)?.role;\n } else if (isCompanyHidden) {\n commenterLocation = \"Private Company\";\n commenterTitle = \"Reviewer\";\n } else if ((user?.profile_info as SponsorProfilePartial)?.company_name) {\n commenterLocation = (user?.profile_info as SponsorProfilePartial).company_name;\n commenterTitle = (user?.profile_info as SponsorProfilePartial)?.title ?? \"Reviewer\";\n }\n\n const onUndo = async (requestCommentId) => {\n try {\n await deleteRequestComment(requestCommentId);\n\n await refreshComments();\n\n toast.success(\"Comment deleted!\");\n } catch (e) {\n toast.error(\"There was an error deleting this comment. Please try again later.\");\n\n appsignal.sendError(e, (span) => {\n span.setAction(\"RequestDiscussionSubmitForm#onUndo\");\n span.setTags({\n commentId: String(requestCommentId),\n userId: currentUser.id,\n userEmail: currentUser.email,\n });\n });\n }\n };\n\n const onReplySuccess = async (requestCommentId) => {\n setIsEditing(false);\n setIsCommenting(false);\n await refreshComments();\n toast.success(\n <ToastContent>\n {\"Response posted!\"}\n <UndoButton onClick={() => onUndo(requestCommentId)}>Undo</UndoButton>\n </ToastContent>\n );\n };\n\n const onEditSuccess = async () => {\n setIsEditing(false);\n setIsCommenting(false);\n await refreshComments();\n };\n\n const onUpvote = async () => {\n if (!currentUser.id) {\n dispatch(toggleLoginModal({ open: true }));\n return;\n }\n\n if (!canUpvote) return;\n\n try {\n await upvoteRequestComment(id);\n track(SegmentEventName.Click, {\n ui_component: \"Upvote Comment\",\n react_component: \"RequestComment\",\n request_slug: request.slug,\n is_undo: upvoted_by_current_user,\n });\n refreshComments();\n } catch (e) {\n toast.error(\"There was an error upvoting this comment. Please try again later.\");\n\n appsignal.sendError(e, (span) => {\n span.setAction(\"RequestComment#onUpvote\");\n span.setTags({\n commentId: String(id),\n userId: currentUser.id,\n userEmail: currentUser.email,\n });\n });\n }\n };\n\n const onDownvote = async () => {\n if (!currentUser.id) {\n dispatch(toggleLoginModal({ open: true }));\n return;\n }\n\n if (!isScientist && !isUniversityAdmin) return;\n\n try {\n await downvoteRequestComment(id);\n track(SegmentEventName.Click, {\n ui_component: \"Downvote Comment\",\n react_component: \"RequestComment\",\n request_slug: request.slug,\n is_undo: upvoted_by_current_user,\n });\n refreshComments();\n } catch (e) {\n toast.error(\"There was an error downvoting this comment. Please try again later.\");\n\n appsignal.sendError(e, (span) => {\n span.setAction(\"RequestComment#onDownvote\");\n span.setTags({\n commentId: String(id),\n userId: currentUser.id,\n userEmail: currentUser.email,\n });\n });\n }\n };\n\n const onDelete = async () => {\n try {\n await deleteRequestComment(id);\n toast.success(\"Comment deleted!\");\n refreshComments();\n } catch (e) {\n toast.error(\"There was an error deleting this comment. Please try again later.\");\n\n appsignal.sendError(e, (span) => {\n span.setAction(\"RequestComment#onDelete\");\n span.setTags({\n commentId: String(id),\n userId: currentUser.id,\n userEmail: currentUser.email,\n });\n });\n }\n };\n\n const onCloseThread = async () => {\n try {\n await editRequestComment(id, undefined, false);\n track(SegmentEventName.Click, {\n ui_component: \"Close Thread\",\n react_component: \"RequestComment\",\n request_slug: request.slug,\n });\n toast.success(\n <ToastContent>\n {\"Thread closed!\"}\n <UndoButton onClick={() => editRequestComment(id, undefined, true)}>Undo</UndoButton>\n </ToastContent>\n );\n refreshComments();\n } catch (e) {\n toast.error(\"There was an error closing this thread. Please try again later.\");\n\n appsignal.sendError(e, (span) => {\n span.setAction(\"RequestComment#onCloseThread\");\n span.setTags({\n commentId: String(id),\n userId: currentUser.id,\n userEmail: currentUser.email,\n });\n });\n }\n };\n\n const showAwaitingResponse =\n (showAnswerButton || showReplyButton) && currentUser.role === UserRole.SPONSOR;\n\n return (\n <Container highlight={showAwaitingResponse} isQuestion={isQuestion}>\n {showAwaitingResponse && isQuestion && (\n <AwaitingReponse>Awaiting your response</AwaitingReponse>\n )}\n <Comment>\n <MainContent>\n {isEditing ? (\n <RequestDiscussionEditForm\n comment={comment}\n onSuccess={onEditSuccess}\n setIsEditing={setIsEditing}\n />\n ) : (\n <TextContainer isQuestion={isQuestion}>\n <QuestionAnswer highlight={showAnswerButton} canShowQA={canShowQA}>\n {isQuestion ? \"Q.\" : \"A.\"}\n </QuestionAnswer>\n <div>\n {showAwaitingResponse && !isQuestion && (\n <AwaitingReponse>Awaiting your response</AwaitingReponse>\n )}\n <TextContent>{text}</TextContent>\n </div>\n </TextContainer>\n )}\n {showEditActions && (\n <MessageActions>\n {isSponsor && (\n <Button variant=\"secondary\" size=\"xs\" onClick={() => setIsEditing(true)}>\n Edit\n </Button>\n )}\n <Delete onClick={onDelete}>Delete</Delete>\n </MessageActions>\n )}\n <User isQuestion={isQuestion} isEditing={isEditing}>\n <PictureContainer\n to={user?.role === UserRole.SCIENTIST ? `/profile/${user?.profile_id}` : undefined}\n >\n <ProfilePicture\n user={user!}\n size=\"sm\"\n isUserHidden={user?.role === UserRole.SPONSOR && isCompanyHidden}\n />\n </PictureContainer>\n <UserInfo>\n <Name>\n {user?.role === UserRole.SCIENTIST ? (\n <TextLink\n to={`/profile/${user?.profile_id}`}\n font={FONTS.REGULAR_3}\n onClick={() =>\n track(SegmentEventName.Click, {\n ui_component: \"Scientist Profile Link\",\n react_component: \"RequestComment\",\n request_slug: request.slug,\n })\n }\n >\n {commenterName}, {commenterTitle}, {commenterLocation}\n </TextLink>\n ) : (\n <>\n {commenterName}, {commenterTitle}, {commenterLocation}\n <Icon name=\"Verified\" color={COLORS.HALO_BLUE} size=\"xs\" margin=\"0 0 0 2px\" />\n </>\n )}\n </Name>\n <DatePosted>{dayjs(created_at).format(\"MMMM D, YYYY\")}</DatePosted>\n </UserInfo>\n </User>\n </MainContent>\n {user?.role !== UserRole.SPONSOR && (\n <Tooltip\n content={TOOLTIP_CONTENT.SCIENTIST_UPVOTE}\n position=\"right\"\n tooltipWidth=\"max-content\"\n arrowOffsetTop=\"15px\"\n >\n <QuestionVoteContainer\n canVote={canUpvote}\n didVote={upvoted_by_current_user}\n onClick={onUpvote}\n >\n <Icon name=\"Chevron Up\" size=\"md\" color={COLORS.HALO_BLUE} />\n <QuestionVoteScore>{cached_votes_up}</QuestionVoteScore>\n </QuestionVoteContainer>\n </Tooltip>\n )}\n </Comment>\n {user?.role === UserRole.SPONSOR && (\n <Helpful>\n {currentUser.role === UserRole.SPONSOR\n ? \"Researcher rating\"\n : \"Is this response helpful?\"}\n <HelpfulThumb canVote={canUpvote} onClick={onUpvote}>\n <Icon\n name={`Thumb Up${upvoted_by_current_user ? \" Filled\" : \"\"}`}\n size=\"sm\"\n color={canUpvote ? COLORS.HALO_BLUE : COLORS.NEUTRAL_400}\n />{\" \"}\n {cached_votes_up}\n </HelpfulThumb>\n <HelpfulThumb canVote={canUpvote} onClick={onDownvote}>\n <Icon\n name={`Thumb Down${downvoted_by_current_user ? \" Filled\" : \"\"}`}\n size=\"sm\"\n color={canUpvote ? COLORS.HALO_BLUE : COLORS.NEUTRAL_400}\n />{\" \"}\n {cached_votes_down}\n </HelpfulThumb>\n </Helpful>\n )}\n {(showAnswerButton || showReplyButton) && (\n <>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setIsCommenting(true)}\n margin={showAnswerButton ? \"32px 0 0 24px\" : \"32px 0 8px 24px\"}\n width=\"min-content\"\n >\n {isQuestion ? \"Answer\" : \"Reply\"}\n </Button>\n {open && reply_to && currentUser.role === UserRole.SPONSOR && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={onCloseThread}\n margin=\"0 0 0 24px\"\n width=\"min-content\"\n >\n Close thread\n </Button>\n )}\n </>\n )}\n {isCommenting && (\n <RequestDiscussionSubmitForm\n companyName={\n isCompanyHidden ? \"Private Company\" : (user?.profile_info as any).company_name\n }\n request={request}\n replyTo={comment}\n commentTreeLevel={commentTreeLevel}\n onSuccess={onReplySuccess}\n setIsCommenting={setIsCommenting}\n />\n )}\n {!isQuestion && Number(replies?.length) > 0 && <HorizontalLine />}\n <Answers indentAnswers={isQuestion && Number(replies?.length)}>\n {Number(replies?.length) > 0 && (\n <>\n {isQuestion && <Line src={line} />}\n {replies?.map((reply, index) => (\n <RequestComment\n key={reply.id}\n commentTreeLevel={commentTreeLevel + 1}\n canShowQA={isQuestion && index === 0}\n request={request}\n comment={reply}\n refreshComments={refreshComments}\n canAnswer={canAnswer}\n isCompanyHidden={isCompanyHidden}\n />\n ))}\n </>\n )}\n </Answers>\n </Container>\n );\n};\n\nexport default RequestComment;\n\nconst Container = styled.div`\n ${({ highlight, isQuestion }) =>\n highlight &&\n `\n padding: 16px ${isQuestion ? \"16px\" : \"0px\"} 0px;\n border-radius: 8px;\n background: ${COLORS.ORANGE_50};\n margin-bottom: 56px;\n `}\n`;\n\nconst HorizontalLine = styled.div`\n width: 100%;\n height: 1px;\n background: ${COLORS.NEUTRAL_200};\n margin: 32px 0;\n`;\n\nconst Comment = styled.div`\n display: flex;\n margin: 0 0 24px 0;\n`;\nconst MainContent = styled.div`\n flex: 1;\n`;\nconst TextContainer = styled.div`\n ${({ isQuestion }) => (isQuestion ? FONTS.SEMIBOLD_1 : FONTS.REGULAR_1)}\n display: flex;\n gap: 8px;\n`;\nconst QuestionAnswer = styled.strong`\n background: ${({ highlight }) => (highlight ? COLORS.ORANGE_50 : COLORS.WHITE)};\n height: min-content;\n ${({ canShowQA }) => !canShowQA && \"visibility: hidden;\"}\n`;\nconst TextContent = styled.div`\n word-break: break-word;\n`;\nconst User = styled.div`\n display: inline-flex;\n gap: 8px;\n ${FONTS.REGULAR_3}\n margin-top: 16px;\n margin-left: ${({ isEditing }) => (isEditing ? \"0\" : \"24px\")};\n`;\nconst PictureContainer = styled(Link)`\n flex-grow: 1;\n pointer-events: ${({ to }) => (to ? \"auto\" : \"none\")};\n text-decoration: none !important;\n`;\nconst UserInfo = styled.div`\n text-overflow: ellipsis;\n flex-shrink: 1;\n`;\nconst Name = styled.div`\n display: inline-flex;\n align-items: center;\n ${FONTS.REGULAR_3}\n line-height: 1.5;\n`;\nconst DatePosted = styled.div`\n ${FONTS.REGULAR_3}\n color: ${COLORS.NEUTRAL_500};\n`;\nconst Delete = styled.div`\n display: block;\n text-decoration: underline;\n cursor: pointer;\n ${FONTS.SEMIBOLD_2}\n color: ${COLORS.RED};\n`;\nconst QuestionVoteContainer = styled.div`\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n padding: 10px;\n border: 2px solid ${COLORS.NEUTRAL_100};\n border-radius: 12px;\n font-weight: 600;\n font-size: 12px;\n line-height: 20px;\n color: ${COLORS.BLUE_LIGHT_700};\n height: 100%;\n margin-left: 24px;\n color: ${COLORS.NEUTRAL_500};\n ${({ didVote }) => didVote && `color: ${COLORS.HALO_BLUE};`}\n ${({ canVote }) =>\n canVote &&\n `\n cursor: pointer;\n &:hover {\n background: ${COLORS.BLUE_LIGHT_300};\n border: 2px solid ${COLORS.BLUE_LIGHT_300};\n }\n `}\n`;\nconst QuestionVoteScore = styled.div`\n margin-top: -4px;\n`;\nconst Answers = styled.div`\n position: relative;\n margin: 32px 0 0;\n ${({ indentAnswers }) =>\n indentAnswers &&\n `\n margin: 32px 0 56px;\n padding-left: 28px;\n `}\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\nconst Line = styled.img`\n position: absolute;\n left: 5px;\n top: -108px;\n z-index: -1;\n`;\nconst MessageActions = styled.div`\n margin: 16px 0 8px 24px;\n display: flex;\n align-items: center;\n gap: 16px;\n`;\nconst Helpful = styled.div`\n margin: 16px 0 8px 24px;\n display: flex;\n align-items: center;\n gap: 16px;\n ${FONTS.REGULAR_3}\n`;\nconst HelpfulThumb = styled.div`\n ${({ canVote }) => canVote && \"cursor: pointer;\"}\n display: flex;\n align-items: center;\n gap: 4px;\n color: ${({ canVote }) => (canVote ? COLORS.HALO_BLUE : COLORS.NEUTRAL_400)};\n`;\nconst AwaitingReponse = styled.div`\n ${FONTS.TAG_MEDIUM_2}\n color: ${COLORS.ORANGE_900};\n margin: 0 0 8px;\n`;\nconst ToastContent = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\nconst UndoButton = styled.button`\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n`;\n","import { Button, SelectableDropdown } from \"@components/library\";\nimport { DropdownOption } from \"@components/library/Dropdowns/DropdownOption\";\nimport FuelModal from \"@components/modals/FuelModal\";\nimport RfpQuestionSubmittedModal from \"@components/modals/RfpQuestionSubmittedModal\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getRequestComments } from \"@requests/requestComments\";\nimport { getCanSubmitProposal } from \"@requests/requests\";\nimport { RequestCommentPartial, RfpPageRequest, SponsorCurrentUser } from \"@tsTypes/index\";\nimport { RequestForExpertsShowResponse } from \"@tsTypes/request_for_experts/show\";\nimport { RequestForStartupsShowResponse } from \"@tsTypes/request_for_startups/show\";\nimport { LaunchableRequestStatus, RequestableType } from \"@tsTypes/requests\";\nimport { UserRole } from \"@tsTypes/users\";\nimport {\n canAccessRequestAsLead,\n getLaunchableRequestStatus,\n LaunchableRequest,\n} from \"@utils/requestUtils\";\nimport { checkRfpCompanyHidden } from \"@utils/rfpUtils\";\nimport { Dispatch, ForwardedRef, forwardRef, SetStateAction, useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { USER_ROLES } from \"src/constants/users\";\nimport styled from \"styled-components\";\nimport RequestComment from \"./RequestComment\";\nimport RequestDiscussionSubmitForm from \"./RequestDiscussionSubmitForm\";\n\ninterface Props {\n request: RfpPageRequest | RequestForStartupsShowResponse | RequestForExpertsShowResponse;\n isCommenting: boolean;\n setIsCommenting: Dispatch<SetStateAction<boolean>>;\n setIsShareModalOpen: Dispatch<SetStateAction<boolean>>;\n}\n\nconst SORT_BY_OPTIONS: DropdownOption[] = [\n {\n value: \"votes\",\n label: \"Most upvoted\",\n },\n {\n value: \"recent\",\n label: \"Most recent\",\n },\n {\n value: \"awaiting_response\",\n label: \"Awaiting response\",\n },\n];\n\nconst RequestDiscussion = (\n { request, isCommenting, setIsCommenting, setIsShareModalOpen }: Props,\n ref: ForwardedRef<HTMLDivElement>\n) => {\n const [successModalOpen, setSuccessModalOpen] = useState(false);\n const [isFuelModalOpen, setIsFuelModalOpen] = useState(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const dispatch = useDispatch();\n\n const isForRfs = request.requestable_type === RequestableType.REQUEST_FOR_STARTUP;\n const isCompanyHidden = checkRfpCompanyHidden(request, currentUser);\n const companyName = isCompanyHidden ? \"the company\" : (request.company as any)?.company_name;\n const isFuel =\n \"company_name\" in request.company && request.company.company_name?.includes(\"FUEL\");\n\n const _canAccessRequestAsLead =\n currentUser.role === UserRole.SPONSOR &&\n canAccessRequestAsLead(currentUser as SponsorCurrentUser, request);\n const showRfpDiscussion =\n getLaunchableRequestStatus(request as LaunchableRequest) === LaunchableRequestStatus.ACTIVE;\n\n const [sortBy, setSortBy] = useState<DropdownOption>(\n _canAccessRequestAsLead ? SORT_BY_OPTIONS[2] : SORT_BY_OPTIONS[0]\n );\n const [comments, setComments] = useState<RequestCommentPartial[]>([]);\n\n const canAskQuestion = [UserRole.SCIENTIST, UserRole.UNIVERSITY_ADMIN].includes(currentUser.role);\n\n const refreshComments = async () => {\n const { request_comments } = await getRequestComments(request.id, sortBy.value);\n setComments(request_comments);\n };\n\n useEffect(() => {\n refreshComments();\n }, [sortBy]);\n\n useEffect(() => {\n if (_canAccessRequestAsLead) setSortBy(SORT_BY_OPTIONS[2]);\n }, [currentUser.role]);\n\n const onCommentSuccess = () => {\n refreshComments();\n setIsCommenting(false);\n\n if (canAskQuestion) {\n setSuccessModalOpen(true);\n }\n };\n\n return (\n <>\n <RfpQuestionSubmittedModal\n onClose={() => setSuccessModalOpen(false)}\n isOpen={successModalOpen}\n handleOpenShareModal={() => setIsShareModalOpen(true)}\n />\n <FuelModal isOpen={isFuelModalOpen} onClose={() => setIsFuelModalOpen(false)} />\n <Heading ref={ref} id=\"q-a\">\n Q&A with {companyName}\n </Heading>\n {showRfpDiscussion ? (\n <>\n <p>\n Ask the team at {companyName} any questions you have about this{\" \"}\n {isForRfs ? \"startup program\" : \"RFP\"}.\n </p>\n {(() => {\n if (currentUser.id === undefined) {\n return (\n <QuestionCTA>\n <div>Ask your question</div>\n <Button\n onClick={() => {\n dispatch(toggleLoginModal({ open: true }));\n }}\n >\n Sign In\n </Button>\n </QuestionCTA>\n );\n }\n if (isCommenting) {\n return (\n <RequestDiscussionSubmitForm\n companyName={companyName ?? \"the company\"}\n request={request as any}\n onSuccess={onCommentSuccess}\n setIsCommenting={setIsCommenting}\n />\n );\n }\n if (canAskQuestion) {\n return (\n <Button\n margin=\"32px 0 16px 0\"\n onClick={async () => {\n if (isFuel) {\n const canSubmit = await getCanSubmitProposal(request.id);\n if (canSubmit) setIsCommenting(true);\n else setIsFuelModalOpen(true);\n } else {\n setIsCommenting(true);\n }\n }}\n >\n Ask your question\n </Button>\n );\n }\n })()}\n </>\n ) : (\n <Closed>\n <p>The Q&A is now closed.</p>\n </Closed>\n )}\n {comments.length > 0 && (\n <SortBy>\n Sort by:\n <SelectableDropdown\n options={\n currentUser.role === USER_ROLES.sponsor\n ? SORT_BY_OPTIONS\n : SORT_BY_OPTIONS.filter((option) => option.value !== \"replies\")\n }\n value={sortBy}\n onChange={(e) => setSortBy(e)}\n />\n </SortBy>\n )}\n <Questions>\n {comments.map((comment) => (\n <RequestComment\n key={comment.id}\n request={request as RfpPageRequest}\n comment={comment}\n commentTreeLevel={0}\n canAnswer={_canAccessRequestAsLead}\n isCompanyHidden={isCompanyHidden}\n refreshComments={refreshComments}\n />\n ))}\n </Questions>\n </>\n );\n};\n\nexport default forwardRef(RequestDiscussion);\n\nconst QuestionCTA = styled.div`\n display: flex;\n justify-content: center;\n gap: 30px;\n align-items: center;\n margin: 32px 0 16px 0;\n background: ${COLORS.BLUE_LIGHT_250};\n padding: 16px 32px;\n border-radius: 12px;\n`;\nconst SortBy = styled.div`\n display: flex;\n align-items: center;\n margin-top: 32px;\n margin-bottom: 16px;\n ${FONTS.REGULAR_2};\n`;\nconst Heading = styled.div`\n ${FONTS.HEADING_2_SEMIBOLD};\n margin-bottom: 24px;\n &:not(:first-of-type) {\n margin-top: 48px;\n }\n`;\nconst Questions = styled.div`\n margin-top: 16px;\n`;\nconst Closed = styled.div`\n margin-bottom: 16px;\n`;\n","export const FAQS = [\n {\n href: \"https://knowledge.halo.science/what-is-the-proposal-process\",\n text: \"What are the proposal questions?\",\n },\n {\n href: \"https://knowledge.halo.science/where-do-i-submit-a-proposal\",\n text: \"Where do I submit a proposal?\",\n },\n {\n href: \"https://knowledge.halo.science/who-is-eligible-to-apply\",\n text: \"Who is eligible to submit a proposal?\",\n },\n {\n href: \"https://knowledge.halo.science/do-proposals-require-confidential-information-faq\",\n text: \"Do proposals require confidential information?\",\n },\n {\n href: \"https://knowledge.halo.science/can-university-administrators-join-halo\",\n text: \"Can university administrators join Halo?\",\n },\n {\n href: \"https://knowledge.halo.science/are-indirect-costs-included-in-the-funding-range-provided-by-sponsors\",\n text: \"Are indirect costs included in the funding provided?\",\n },\n {\n href: \"https://knowledge.halo.science/does-halo-charge-universities-or-scientists\",\n text: \"Does Halo charge universities?\",\n },\n];\n\nexport const TESTING4AG_FAQS = [\n {\n href: \"https://knowledge.halo.science/what-are-the-proposal-questions-for-testing4ag\",\n text: \"What are the proposal questions for Testing4Ag?\",\n },\n {\n href: \"https://knowledge.halo.science/what-happens-after-i-submit-a-proposal\",\n text: \"What happens after I submit a proposal for Testing4Ag?\",\n },\n {\n href: \"https://knowledge.halo.science/bayer-testing4ag-shared-results\",\n text: \"How will the results be shared with researchers?\",\n },\n {\n href: \"https://knowledge.halo.science/why-is-an-mta-required-for-testing4ag\",\n text: \"Why is an MTA required?\",\n },\n {\n href: \"https://knowledge.halo.science/what-are-the-terms-of-the-mta-for-bayers-testing4ag-program\",\n text: \"What are the terms of the MTA?\",\n },\n {\n href: \"https://knowledge.halo.science/what-if-i-have-questions-about-the-mta-for-bayers-testing4ag-program\",\n text: \"What if I have questions about the MTA?\",\n },\n];\n\nexport const BASF_RFM_FAQS = [\n {\n href: \"https://knowledge.halo.science/information-basf-request-for-materials\",\n text: \"What information will I need to share to start the Request for Materials process with BASF?\",\n },\n {\n href: \"https://knowledge.halo.science/what-does-the-request-for-materials-process-with-basf-look-like\",\n text: \"What does the Request for Materials process with BASF look like?\",\n },\n {\n href: \"https://knowledge.halo.science/what-biological-results-will-i-get-from-basf\",\n text: \"What biological results will I get from BASF?\",\n },\n {\n href: \"https://knowledge.halo.science/do-i-still-own-the-rights-to-my-molecules\",\n text: \"Do I still own the rights to my molecules?\",\n },\n {\n href: \"https://knowledge.halo.science/what-if-i-have-questions-about-the-basf-mta\",\n text: \"What if I have questions about the BASF MTA?\",\n },\n];\n\nexport const BAYER_COLAB_CAMBRIDGE_RFS_FAQS = [\n {\n text: \"Are selected startups for Co.Lab Cambridge expected to relocate?\",\n href: \"https://knowledge.halo.science/are-selected-startups-expected-to-relocate\",\n },\n {\n text: \"How long is the Co.Lab Cambridge incubator program?\",\n href: \"https://knowledge.halo.science/how-long-is-the-co.lab-cambridge-incubator-program\",\n },\n {\n text: \"Is there a virtual option for the Co.Lab incubator program?\",\n href: \"https://knowledge.halo.science/is-there-a-virtual-option-for-the-co.lab-cambridge-incubator-program\",\n },\n {\n text: \"If my startup is already based in Cambridge, am I still eligible to apply to Co.Lab Cambridge?\",\n href: \"https://knowledge.halo.science/if-my-startup-is-already-based-in-cambridge-am-i-still-eligible-to-apply-to-co.lab-cambridge\",\n },\n];\n\nexport const FUEL_FAQS = [\n {\n href: \"https://knowledge.halo.science/fuel-eligibility\",\n text: \"What are the eligibility requirements for FUEL requests?\",\n },\n {\n href: \"https://knowledge.halo.science/find-more-info-about-fuel\",\n text: \"Where can I find more information about FUEL, its opportunities, proposal budgets, eligibility, or similar topics?\",\n },\n {\n href: \"https://knowledge.halo.science/fuel-budget-constraints\",\n text: \"What are the budget requirements and constraints for FUEL requests?\",\n },\n {\n href: \"https://knowledge.halo.science/can-the-same-proposal-submitted-to-fuel-be-submitted-to-other-agencies-or-sponsors-for-simultaneous-review\",\n text: \"Can the same proposal submitted to FUEL be submitted to other agencies or sponsors for simultaneous review?\",\n },\n];\n","import { TextLink } from \"@components/library\";\nimport { COLORS, COMPANIES, FONTS } from \"@constants\";\nimport { RfpPageRequest } from \"@tsTypes/index\";\nimport styled from \"styled-components\";\nimport {\n BASF_RFM_FAQS,\n BAYER_COLAB_CAMBRIDGE_RFS_FAQS,\n FAQS,\n FUEL_FAQS,\n TESTING4AG_FAQS,\n} from \"./faqs\";\n\ninterface Props {\n request: RfpPageRequest;\n}\n\nconst { FUEL_ID } = COMPANIES;\n\nconst RequestFAQs = ({ request }: Props) => {\n const defaultFaqs = [...FAQS];\n\n if (request.requestable.hubspot_faq_tag) {\n defaultFaqs.push({\n href: `https://knowledge.halo.science/rfps#${request.requestable.hubspot_faq_tag}`,\n text: \"View questions specific to this opportunity\",\n });\n }\n\n const isTesting4Ag = request.title.includes(\"Testing4Ag\");\n const isBasfRfm = request.slug.includes(\n \"free-in-vivo-testing-unleash-your-molecule-s-potential-as-a-crop-protector\"\n );\n const isBayerColabCambridgeRfs = request.slug === \"co-lab-cambridge\";\n const isFuelRequest = request.company.id === FUEL_ID;\n\n let faqs = defaultFaqs;\n if (isTesting4Ag) {\n faqs = TESTING4AG_FAQS;\n } else if (isBasfRfm) {\n faqs = BASF_RFM_FAQS;\n } else if (isBayerColabCambridgeRfs) {\n faqs = BAYER_COLAB_CAMBRIDGE_RFS_FAQS;\n } else if (isFuelRequest) {\n faqs = FUEL_FAQS;\n }\n\n return (\n <Container>\n <Heading>Frequently Asked Questions</Heading>\n {faqs.map((faq) => (\n <div key={faq.href}>\n <TextLink to={{ pathname: faq.href }} font={FONTS.REGULAR_2} newTab>\n {faq.text}\n </TextLink>\n </div>\n ))}\n </Container>\n );\n};\n\nexport default RequestFAQs;\n\nconst Container = styled.div`\n border: 1px solid ${COLORS.NEUTRAL_250};\n border-radius: 8px;\n padding: 24px;\n & ul {\n padding-left: 24px;\n margin-bottom: 0;\n }\n`;\nconst Heading = styled.div`\n ${FONTS.SEMIBOLD_1};\n margin-bottom: 16px;\n`;\n","import { TextLink, UserPreview } from \"@components/library\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { ReviewTeamMember } from \"@tsTypes/index\";\nimport { RequestUnion } from \"@tsTypes/requests\";\nimport { RoleName } from \"@tsTypes/roles\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { canAccessRequestAsLead, findRequestRoleNameOnUser } from \"@utils/requestUtils\";\nimport { renderMarkdownText } from \"@utils/textUtils\";\nimport { sortByHasProfilePicture } from \"@utils/userUtils\";\nimport styled from \"styled-components\";\n\ninterface Props {\n request: RequestUnion;\n isResponsive?: boolean;\n withMarginTop?: boolean;\n customText?: string; // Override the default company \"Who we are\" text\n lineHeight?: string;\n}\n\nexport default function AboutCompany({\n request,\n isResponsive = true,\n withMarginTop = true,\n customText,\n lineHeight,\n}: Props) {\n const company = request.company;\n\n if (request.confidential || \"private_alias\" in company) return null;\n\n let reviewTeamMembers: ReviewTeamMember[] = [];\n if (\"review_team_members\" in request) {\n reviewTeamMembers = request.review_team_members;\n }\n\n let reviewTeamMembersForDisplay: ReviewTeamMember[] = reviewTeamMembers.filter((reviewer) =>\n canAccessRequestAsLead(reviewer, request)\n );\n reviewTeamMembersForDisplay = sortByHasProfilePicture(reviewTeamMembersForDisplay);\n reviewTeamMembersForDisplay = reviewTeamMembersForDisplay.sort(\n (a, b) =>\n Number(findRequestRoleNameOnUser(b, request) === RoleName.REQUEST_LEAD) -\n Number(findRequestRoleNameOnUser(a, request) === RoleName.REQUEST_LEAD)\n );\n\n const text = customText ?? company.description;\n\n return (\n <Container data-testid=\"rfp-about-company\" lineHeight={lineHeight}>\n {Number(text?.length) > 0 && (\n <>\n <Heading id=\"who-we-are\" withMarginTop={withMarginTop}>\n Who we are\n </Heading>\n <div>\n {customText ? (\n renderMarkdownText(text)\n ) : (\n <>\n {renderMarkdownText(text)}\n \n <TextLink\n to={`/company/${company.identifier}`}\n color={COLORS.HALO_BLUE}\n font={FONTS.MEDIUM_1}\n underline\n newTab\n >\n Learn more\n </TextLink>\n </>\n )}\n </div>\n </>\n )}\n {reviewTeamMembersForDisplay.length > 0 && (\n <>\n <Heading withMarginTop>Reviewers</Heading>\n <Reviewers isResponsive={isResponsive}>\n {reviewTeamMembersForDisplay.map((member) => (\n <UserPreview\n key={\"reviewer-\" + member.id}\n user={member as any}\n size=\"xl\"\n userRole={UserRole.SPONSOR}\n />\n ))}\n </Reviewers>\n </>\n )}\n </Container>\n );\n}\n\nconst Container = styled.div`\n ${FONTS.REGULAR_1}\n line-height: ${({ lineHeight }) => lineHeight ?? \"2\"};\n & p {\n margin-bottom: 16px !important;\n }\n`;\nconst Heading = styled.div`\n ${FONTS.HEADING_4_SEMIBOLD};\n ${({ withMarginTop }) => withMarginTop && `margin-top: 64px;`}\n margin-bottom: 24px;\n`;\nconst Reviewers = styled.div`\n display: grid;\n grid-template-columns: 1fr;\n grid-gap: 64px 48px;\n ${({ isResponsive }) =>\n isResponsive &&\n `\n ${WINDOW_DIMENSIONS.EXTRA_WIDE_MEDIA_QUERY} {\n grid-template-columns: 1fr 1fr;\n }\n `}\n`;\n","import { BlankModal, Button, Icon } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RequestUnion } from \"@tsTypes/requests\";\nimport { track } from \"@utils/appUtils\";\nimport { t } from \"@utils/i18n\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\ninterface RelevanceFeedbackModalProps {\n isOpen: boolean;\n onClose: () => void;\n isRelevant?: boolean;\n request: RequestUnion;\n trackingProps?: Record<string, any>;\n onSubmit?: (option?: string) => void;\n}\n\nconst i18nPrefix = \"components.refine_recommendations\";\n\nconst RelevanceFeedbackModal: React.FC<RelevanceFeedbackModalProps> = ({\n isOpen,\n onClose,\n isRelevant,\n request,\n trackingProps = {},\n onSubmit,\n}) => {\n const [selectedOption, setSelectedOption] = useState<string | undefined>(undefined);\n const [otherText, setOtherText] = useState<string>(\"\");\n\n // Reset state and close modal\n const handleCloseModal = () => {\n setSelectedOption(undefined);\n setOtherText(\"\");\n onClose();\n };\n\n const handleSubmit = () => {\n const feedbackText = selectedOption === \"Other\" ? `Other: ${otherText}` : selectedOption;\n\n track(SegmentEventName.Submit, {\n react_component: \"RelevanceFeedbackModal\",\n ui_component: isRelevant ? \"Relevant modal\" : \"Not relevant modal\",\n request_slug: request.slug,\n selected_option: feedbackText,\n ...trackingProps,\n });\n\n onSubmit?.(feedbackText);\n\n handleCloseModal();\n };\n\n const options = isRelevant\n ? t([i18nPrefix, \"modal.options.relevant\"])\n : t([i18nPrefix, \"modal.options.not_relevant\"]);\n\n const description = isRelevant\n ? t([i18nPrefix, \"modal.description_relevant\"])\n : t([i18nPrefix, \"modal.description_not_relevant\"]);\n\n const isOtherSelected = selectedOption === \"Other\";\n const isSubmitDisabled = !selectedOption || (isOtherSelected && !otherText.trim());\n\n return (\n <BlankModal isOpen={isOpen} onClose={handleCloseModal} width=\"400px\">\n <ModalContent>\n {!isRelevant && (\n <ModalIcon>\n <Icon name=\"Checkmark\" color={COLORS.NEUTRAL_700} size=\"lg\" />\n </ModalIcon>\n )}\n\n <Header>{t([i18nPrefix, \"modal.header\"])}</Header>\n\n <SubHeader>{description}</SubHeader>\n <OptionsContainer>\n {(Array.isArray(options) ? options : []).map((option) => (\n <OptionButton\n key={option}\n isSelected={selectedOption === option}\n onClick={() => setSelectedOption(option)}\n >\n {option}\n </OptionButton>\n ))}\n\n {isOtherSelected && (\n <TextInputContainer>\n <TextInput\n placeholder={t([i18nPrefix, \"modal.options.other\"])}\n value={otherText}\n onChange={(e) => setOtherText(e.target.value)}\n autoFocus\n />\n </TextInputContainer>\n )}\n </OptionsContainer>\n\n <ModalActions>\n <Button variant=\"secondary\" onClick={handleCloseModal} size=\"md\">\n {t([i18nPrefix, \"modal.skip\"])}\n </Button>\n <Button variant=\"primary\" onClick={handleSubmit} disabled={isSubmitDisabled} size=\"md\">\n {t([i18nPrefix, \"modal.submit\"])}\n </Button>\n </ModalActions>\n </ModalContent>\n </BlankModal>\n );\n};\n\nexport default RelevanceFeedbackModal;\n\nconst ModalContent = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 48px;\n width: 100%;\n text-align: center;\n`;\n\nconst ModalIcon = styled.div`\n margin-bottom: 16px;\n`;\n\nconst Header = styled.h3`\n ${FONTS.HEADING_5_REGULAR};\n margin: 0 0 16px 0;\n color: ${COLORS.NEUTRAL_800};\n`;\n\nconst SubHeader = styled.p`\n ${FONTS.REGULAR_2};\n color: ${COLORS.NEUTRAL_500};\n margin: 0 0 24px 0;\n max-width: 400px;\n`;\n\nconst OptionsContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: 12px;\n margin-bottom: 24px;\n`;\n\nconst OptionButton = styled.button<{ isSelected: boolean }>`\n padding: 16px;\n border-radius: 8px;\n border: 1px solid ${(props) => (props.isSelected ? COLORS.BLUE_500 : COLORS.NEUTRAL_250)};\n background-color: ${(props) => (props.isSelected ? COLORS.BLUE_LIGHT_50 : \"white\")};\n text-align: left;\n ${FONTS.REGULAR_2};\n color: ${COLORS.NEUTRAL_700};\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n border-color: ${COLORS.BLUE_450};\n background-color: ${(props) => (props.isSelected ? COLORS.BLUE_LIGHT_50 : COLORS.NEUTRAL_50)};\n }\n`;\n\nconst TextInputContainer = styled.div`\n width: 100%;\n margin-top: -4px;\n`;\n\nconst TextInput = styled.input`\n width: 100%;\n padding: 12px 16px;\n border-radius: 8px;\n border: 1px solid ${COLORS.NEUTRAL_250};\n ${FONTS.REGULAR_2};\n color: ${COLORS.NEUTRAL_700};\n\n &:focus {\n outline: none;\n border-color: ${COLORS.BLUE_450};\n }\n`;\n\nconst ModalActions = styled.div`\n display: flex;\n justify-content: center;\n gap: 12px;\n width: 100%;\n`;\n","import { Link } from \"react-router-dom\";\n\nexport const TOOLTIP_CONTENT = {\n RELEVANT: {\n NOT_SIGNED_IN: (\n <>\n <b>Mark as relevant</b>\n <div>Help Halo improve our request recommendations.</div>\n </>\n ),\n SIGNED_IN: (\n <>\n <b>Mark as relevant</b>\n <div>\n Help Halo improve our request recommendations. Requests you mark as relevant will also be\n added to your{\" \"}\n <Link to=\"/my_proposals\" style={{ textDecoration: \"underline\", color: \"white\" }}>\n Saved requests\n </Link>\n </div>\n </>\n ),\n },\n NOT_RELEVANT: (\n <>\n <b>Mark as not relevant</b>\n <div>\n Remove this partnering request from your marketplace view and decline any updates about it.\n </div>\n </>\n ),\n};\n","import { Icon, Tooltip } from \"@components/library\";\nimport RelevanceFeedbackModal from \"@components/modals/RelevanceFeedbackModal\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport useLocalStorage from \"@hooks/useLocalStorage\";\nimport { RootState } from \"@redux/store\";\nimport {\n getUserRequestPreference,\n updateUserRequestPreference,\n} from \"@requests/user_request_preferences\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { UserRequestPreferenceSource } from \"@tsTypes/__generated__/enums/user_request_preference_source\";\nimport { RequestUnion } from \"@tsTypes/requests\";\nimport appsignal from \"@utils/appsignal\";\nimport { track } from \"@utils/appUtils\";\nimport { openLoginModalWithRedirect } from \"@utils/authUtils\";\nimport { t } from \"@utils/i18n\";\nimport React, { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { TOOLTIP_CONTENT } from \"./tooltipContent\";\n\ninterface RefineRecommendationsProps {\n request: RequestUnion;\n isComplete: boolean;\n trackingProps?: Record<string, any>;\n}\n\nfunction useRequestPreferences(requestId: number, isLoggedIn: boolean) {\n const [localPreference, setLocalPreference] = useLocalStorage<boolean | null>(\n `request_preference_${requestId}`,\n null\n );\n\n const queryClient = useQueryClient();\n const queryKey = [\"userRequestPreference\", requestId, isLoggedIn, localPreference];\n\n const { data: isInterestedQuery } = useQuery({\n queryKey: queryKey,\n queryFn: async () => {\n if (isLoggedIn) {\n const preference = await getUserRequestPreference(requestId);\n return preference?.is_interested ?? null;\n }\n return localPreference;\n },\n });\n\n const { mutate: updateInterest } = useMutation({\n mutationFn: async ({ isInterested, reason }: { isInterested: boolean; reason?: string }) => {\n if (isLoggedIn) {\n return updateUserRequestPreference({\n requestId,\n isInterested,\n source: UserRequestPreferenceSource.RequestPage,\n reason,\n });\n }\n setLocalPreference(isInterested);\n },\n onSuccess: () => {\n queryClient.invalidateQueries(queryKey);\n },\n onError: (error: Error) => {\n appsignal.sendError(error, (span) => {\n span.setAction(\"RefineRecommendations#updatePreference\");\n span.setTags({\n requestId: String(requestId),\n });\n });\n },\n });\n\n return {\n isInterested: isInterestedQuery,\n updateInterest,\n };\n}\n\nconst i18nPrefix = \"components.refine_recommendations\";\n\nconst RefineRecommendations: React.FC<RefineRecommendationsProps> = ({\n request,\n trackingProps = {},\n isComplete,\n}) => {\n const [isRelevant, setIsRelevant] = useState<boolean | undefined>(undefined);\n const [showModal, setShowModal] = useState(false);\n\n const dispatch = useDispatch();\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const isLoggedIn = Boolean(currentUser.id);\n\n const { isInterested, updateInterest } = useRequestPreferences(request.id, isLoggedIn);\n\n const handleRelevantClick = () => {\n if (isInterested) return;\n\n track(SegmentEventName.Click, {\n react_component: \"RefineRecommendations\",\n ui_component: \"Relevant button\",\n request_slug: request.slug,\n is_logged_in: isLoggedIn,\n ...trackingProps,\n });\n\n if (!isComplete) {\n setIsRelevant(true);\n setShowModal(true);\n } else {\n updateInterest({ isInterested: true });\n }\n };\n\n const handleNotRelevantClick = () => {\n if (isInterested === false) return;\n\n track(SegmentEventName.Click, {\n react_component: \"RefineRecommendations\",\n ui_component: \"Not relevant button\",\n request_slug: request.slug,\n is_logged_in: isLoggedIn,\n ...trackingProps,\n });\n\n setIsRelevant(false);\n setShowModal(true);\n };\n\n const handleFeedbackSubmit = (reason?: string) => {\n if (isRelevant === undefined) return;\n\n track(SegmentEventName.Submit, {\n react_component: \"RefineRecommendations\",\n ui_component: isRelevant ? \"Relevant feedback\" : \"Not relevant feedback\",\n request_slug: request.slug,\n selected_option: reason,\n is_logged_in: isLoggedIn,\n ...trackingProps,\n });\n\n updateInterest({ isInterested: isRelevant, reason });\n setShowModal(false);\n\n if (!isLoggedIn) {\n dispatch(openLoginModalWithRedirect());\n }\n };\n\n const handleModalClose = () => {\n setShowModal(false);\n if (!isLoggedIn) {\n dispatch(openLoginModalWithRedirect());\n }\n };\n\n return (\n <>\n <Container>\n <SectionHeading>\n <Icon name=\"Magic\" color={COLORS.NEUTRAL_700} size=\"sm\" />\n <HeadingText>{t([i18nPrefix, \"header\"])}</HeadingText>\n </SectionHeading>\n <QuestionText>{t([i18nPrefix, \"question\"])}</QuestionText>\n <ButtonContainer>\n <Tooltip\n position=\"left\"\n tooltipWidth=\"275px\"\n contentWidth=\"100%\"\n arrowOffsetTop={\"36px\"}\n content={TOOLTIP_CONTENT.RELEVANT.NOT_SIGNED_IN}\n // Uncomment this when Saved Requests page is built:\n // content={TOOLTIP_CONTENT.RELEVANT[isLoggedIn ? \"SIGNED_IN\" : \"NOT_SIGNED_IN\"]}\n // arrowOffsetTop={isLoggedIn ? \"56px\" : \"36px\"}\n >\n <RelevantButton\n onClick={handleRelevantClick}\n $selected={isInterested}\n aria-label={t([i18nPrefix, \"buttons.relevant.aria_label\"])}\n >\n <Icon name=\"Checkmark\" color={COLORS.BLUE_500} size=\"sm\" />\n {t([i18nPrefix, \"buttons.relevant.text\"])}\n </RelevantButton>\n </Tooltip>\n <Tooltip\n position=\"left\"\n tooltipWidth=\"275px\"\n arrowOffsetTop=\"45px\"\n contentWidth=\"100%\"\n content={TOOLTIP_CONTENT.NOT_RELEVANT}\n >\n <NotRelevantButton\n onClick={handleNotRelevantClick}\n $selected={isInterested === false}\n aria-label={t([i18nPrefix, \"buttons.not_relevant.aria_label\"])}\n >\n <Icon name=\"Block\" color={COLORS.NEUTRAL_500} size=\"sm\" />\n {t([i18nPrefix, \"buttons.not_relevant.text\"])}\n </NotRelevantButton>\n </Tooltip>\n </ButtonContainer>\n </Container>\n\n <RelevanceFeedbackModal\n request={request}\n isOpen={showModal}\n isRelevant={isRelevant}\n trackingProps={trackingProps}\n onClose={handleModalClose}\n onSubmit={handleFeedbackSubmit}\n />\n </>\n );\n};\n\nexport default RefineRecommendations;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 24px;\n width: 100%;\n`;\n\nconst SectionHeading = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n`;\n\nconst HeadingText = styled.div`\n ${FONTS.SEMIBOLD_1};\n color: ${COLORS.NEUTRAL_800};\n`;\n\nconst QuestionText = styled.div`\n ${FONTS.REGULAR_2};\n color: ${COLORS.NEUTRAL_500};\n margin-bottom: 16px;\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n align-items: center;\n align-self: stretch;\n`;\n\nconst BaseButton = styled.button`\n display: flex;\n height: 43px;\n padding: 8px 10px;\n justify-content: center;\n align-items: center;\n gap: 4px;\n flex: 1 0 0;\n\n width: 100%;\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n background-color: ${COLORS.WHITE};\n\n box-shadow: ${STYLES.SHADOW_CARD};\n\n color: ${COLORS.BLUE_500};\n\n ${FONTS.BUTTON_3}\n`;\n\nconst RelevantButton = styled(BaseButton)<{ $selected?: boolean }>`\n color: ${COLORS.BLUE_500};\n background: ${COLORS.WHITE};\n\n border-radius: 4px 0px 0px 4px;\n\n box-shadow: 0px 1px 3px 0px rgba(4, 11, 19, 0.06);\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n margin-right: 0;\n\n ${(props) =>\n props.$selected &&\n `\n background: ${COLORS.BLUE_LIGHT_300};\n border: 1px solid ${COLORS.BLUE_500};\n margin-right: -1px;\n `}\n`;\n\nconst NotRelevantButton = styled(BaseButton)<{ $selected?: boolean }>`\n color: ${COLORS.NEUTRAL_500};\n background: ${COLORS.WHITE};\n\n border-radius: 0px 4px 4px 0px;\n\n box-shadow: 0px 1px 3px 0px rgba(4, 11, 19, 0.06);\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n border-left: none;\n margin-left: 0;\n\n ${(props) =>\n props.$selected &&\n `\n background: ${COLORS.NEUTRAL_100};\n border: 1px solid ${COLORS.NEUTRAL_500};\n margin-left: -1px;\n `}\n`;\n","import { CompanyAvatar, Icon } from \"@components/library\";\nimport Tooltip from \"@components/library/Tooltips/Tooltip\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport useIsImageLoadable from \"@hooks/useIsImageLoadable\";\nimport { RootState } from \"@redux/store\";\nimport { CompanyPartial, ConfidentialCompany } from \"@tsTypes/index\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n// @ts-ignore\nimport { CompanyVerificationStatus } from \"@tsTypes/companies.js.erb\";\nimport { RequestForStartupsShowResponse } from \"@tsTypes/request_for_startups/show\";\nimport { RequestableType, RequestUnion } from \"@tsTypes/requests\";\nimport { useSelector } from \"react-redux\";\n\nconst HALO_COMPANY_ID = 2825;\n\ninterface Props {\n request: RequestUnion;\n asPreview?: boolean;\n}\nexport default function Banner({ request, asPreview = false }: Props) {\n const isTablet = useSelector((state: RootState) => state.window.isTablet);\n\n const isCompanyPrivate = \"private_alias\" in request.company || request.confidential;\n const isRfs = request.requestable_type === RequestableType.REQUEST_FOR_STARTUP;\n const typedRfs = request.requestable as RequestForStartupsShowResponse[\"requestable\"];\n const isHaloCompanyRequest = request.company.id === HALO_COMPANY_ID;\n\n const backgroundImageUrl =\n (isRfs && typedRfs.banner_image.url) || request.commercial_application?.banner_image.url;\n const isImageLoadable = useIsImageLoadable(backgroundImageUrl);\n\n return (\n <Container backgroundImageUrl={isImageLoadable && backgroundImageUrl} asPreview={asPreview}>\n <TopRow asPreview={asPreview}>\n <CompanyContainer\n as={\n (isCompanyPrivate || isHaloCompanyRequest || (isRfs && !typedRfs.company_linked)) &&\n \"div\"\n }\n to={\n !isCompanyPrivate &&\n !isHaloCompanyRequest &&\n ((isRfs && typedRfs.company_linked) || !isRfs) &&\n `/company/${(request.company as CompanyPartial).identifier}`\n }\n asPreview={asPreview}\n data-testid=\"company-name\"\n >\n <CompanyAvatar\n imageUrl={\"avatar\" in request.company ? request.company.avatar.url : null}\n isPrivate={isCompanyPrivate}\n size={isTablet ? \"sm\" : \"lg\"}\n />\n {isCompanyPrivate\n ? (request.company as ConfidentialCompany).private_alias ?? \"Private Company\"\n : (request.company as CompanyPartial).company_name}\n {request.company.verification_status === CompanyVerificationStatus.VERIFIED && (\n <Icon name=\"Verified\" size=\"sm\" margin=\"0 0 0 -12px\" color={COLORS.BLUE_LIGHT_650} />\n )}\n {isCompanyPrivate && (\n <Tooltip\n content={\n <>\n This industry partner has opted to post this partnering request anonymously and\n will disclose their identity to finalists.\n <br />\n <a\n href=\"https://knowledge.halo.science/why-are-sponsors-private-for-some-rfps\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Learn more.\n </a>\n </>\n }\n position=\"right\"\n tooltipWidth=\"300px\"\n shouldFlex={true}\n asPortal={true}\n arrowOffsetTop=\"45px\"\n >\n <IconWrapper>\n <Icon name=\"Info Inverted\" size=\"sm\" color={COLORS.BLUE_450} />\n </IconWrapper>\n </Tooltip>\n )}\n </CompanyContainer>\n {isRfs && <ParentProgram asPreview={asPreview}>{typedRfs.parent_program}</ParentProgram>}\n </TopRow>\n <Title title={request.title} asPreview={asPreview} data-testid=\"rfp-title\">\n {request.title}\n </Title>\n {request.commercial_application ? (\n <CommercialApplication to={`/application/${request.commercial_application.slug}`}>\n {request.commercial_application.name}\n </CommercialApplication>\n ) : (\n <div />\n )}\n </Container>\n );\n}\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 16px;\n min-height: 400px;\n padding: 32px;\n background: ${({ backgroundImageUrl }) =>\n backgroundImageUrl ? `url(${backgroundImageUrl})` : \"#3B82F6\"};\n background-size: cover;\n border-radius: 12px;\n`;\nconst TopRow = styled.div`\n display: flex;\n align-items: center;\n gap: 16px;\n ${({ asPreview }) =>\n !asPreview &&\n `\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n `}\n`;\nconst CompanyContainer = styled(Link)`\n display: flex;\n align-items: center;\n gap: 16px;\n color: ${COLORS.WHITE};\n ${FONTS.HEADING_5_BOLD};\n &:hover {\n color: ${COLORS.WHITE};\n text-decoration: none;\n }\n`;\nconst ParentProgram = styled.div`\n color: ${COLORS.WHITE};\n ${FONTS.HEADING_5_REGULAR};\n ${({ asPreview }) =>\n !asPreview &&\n `\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n ${FONTS.REGULAR_2};\n }\n `}\n`;\nconst Title = styled.div`\n max-width: 1048px;\n ${({ title }) => {\n if (title.length > 50) return FONTS.HEADING_JUMBO;\n return FONTS.HEADING_BANNER;\n }};\n margin-bottom: 48px;\n color: ${COLORS.WHITE};\n line-height: 1.2;\n letter-spacing: -0.03em;\n overflow-wrap: break-word;\n ${({ asPreview, title }) =>\n !asPreview &&\n `\n font-size: ${(() => {\n if (title.length > 67) return 52;\n return 64;\n })()}px;\n @media screen and (max-width: 1212px) {\n font-size: 52px;\n }\n @media screen and (max-width: 784px) {\n font-size: 42px;\n }\n `}\n`;\nconst CommercialApplication = styled(Link)`\n display: flex;\n align-items: center;\n width: fit-content;\n height: 32px;\n padding: 0 12px 2px;\n background-color: ${COLORS.BLUE_750};\n border-radius: 100px;\n color: ${COLORS.WHITE};\n ${FONTS.SEMIBOLD_3};\n &:hover {\n color: ${COLORS.WHITE};\n background-color: ${COLORS.BLUE_600};\n text-decoration: none;\n }\n`;\n\nconst IconWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 20px;\n width: 20px;\n margin-left: -12px;\n`;\n","import { useEffect, useState } from \"react\";\n\nexport default function useIsImageLoadable(imageUrl: string | null | undefined) {\n const [isLoadable, setIsLoadable] = useState(false);\n\n useEffect(() => {\n if (imageUrl) {\n const img = new Image();\n img.onload = () => setIsLoadable(true);\n img.onerror = () => setIsLoadable(false);\n img.src = imageUrl;\n }\n }, [imageUrl]);\n\n return isLoadable;\n}\n","import { Icon } from \"@components/library\";\nimport toast from \"@components/Toast\";\nimport { COLORS, STYLES } from \"@constants\";\nimport useLocalStorage from \"@hooks/useLocalStorage\";\nimport { RootState } from \"@redux/store\";\nimport {\n deleteUserRequestPreference,\n getUserRequestPreference,\n updateUserRequestPreference,\n} from \"@requests/user_request_preferences\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { UserRequestPreferenceSource } from \"@tsTypes/__generated__/enums/user_request_preference_source\";\nimport { RequestForCard } from \"@tsTypes/index\";\nimport appsignal from \"@utils/appsignal\";\nimport { track } from \"@utils/appUtils\";\nimport { t } from \"@utils/i18n\";\nimport React, { useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\ninterface RefineRecommendationsProps {\n request: RequestForCard;\n trackingProps?: Record<string, any>;\n handleFade: () => void;\n handleReveal: () => void;\n}\n\nfunction useRequestPreferences(request: RequestForCard, isLoggedIn: boolean) {\n const [localPreference, setLocalPreference] = useLocalStorage<boolean | null>(\n `request_preference_${request.id}`,\n null\n );\n\n const queryClient = useQueryClient();\n const queryKey = [\"userRequestPreference\", request.id, isLoggedIn, localPreference];\n\n const { data: isInterestedQuery } = useQuery({\n queryKey,\n queryFn: async () => {\n if (isLoggedIn) {\n const preference = await getUserRequestPreference(request.id);\n return preference?.is_interested ?? null;\n }\n return localPreference;\n },\n initialData: request.user_request_preference?.is_interested,\n // Prevent automatic refetching\n // This allows us to use the initial data from request.user_request_preference\n // and only update the data when mutations explicitly invalidate the query\n staleTime: Infinity,\n });\n\n const { mutate: updateInterest } = useMutation({\n mutationFn: async (isInterested: boolean) => {\n if (isLoggedIn)\n return updateUserRequestPreference({\n requestId: request.id,\n isInterested,\n source: UserRequestPreferenceSource.MarketplaceCard,\n });\n setLocalPreference(isInterested);\n },\n onSuccess: () => {\n queryClient.invalidateQueries(queryKey);\n },\n onError: (error: Error) => {\n appsignal.sendError(error, (span) => {\n span.setAction(\"useRequestPreferences#updateInterest\");\n span.setTags({\n requestId: String(request.id),\n });\n });\n },\n });\n\n const { mutate: deleteInterest } = useMutation({\n mutationFn: async () => {\n if (isLoggedIn) return deleteUserRequestPreference(request.id);\n setLocalPreference(null);\n },\n onSuccess: () => {\n queryClient.invalidateQueries(queryKey);\n },\n onError: (error: Error) => {\n appsignal.sendError(error, (span) => {\n span.setAction(\"useRequestPreferences#deleteInterest\");\n span.setTags({\n requestId: String(request.id),\n });\n });\n },\n });\n\n return {\n isInterested: isInterestedQuery,\n updateInterest,\n deleteInterest,\n };\n}\n\nconst i18nPrefix = \"components.refine_recommendations\";\n\nconst RefineRecommendations: React.FC<RefineRecommendationsProps> = ({\n request,\n trackingProps = {},\n handleFade,\n handleReveal,\n}) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const isLoggedIn = Boolean(currentUser.id);\n\n const { isInterested, updateInterest, deleteInterest } = useRequestPreferences(\n request,\n isLoggedIn\n );\n\n const handleRelevantClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n track(SegmentEventName.Click, {\n react_component: \"RefineRecommendations\",\n ui_component: \"Relevant button\",\n request_slug: request.slug,\n is_logged_in: isLoggedIn,\n ...trackingProps,\n });\n\n updateInterest(true);\n\n toast.success(\n <div>\n {t([i18nPrefix, \"toasts.relevant\"])}{\" \"}\n <UndoButton onClick={deleteInterest}>{t([i18nPrefix, \"buttons.undo\"])}</UndoButton>\n </div>\n );\n };\n\n const handleNotRelevantClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n track(SegmentEventName.Click, {\n react_component: \"RefineRecommendations\",\n ui_component: \"Not relevant button\",\n request_slug: request.slug,\n is_logged_in: isLoggedIn,\n ...trackingProps,\n });\n\n updateInterest(false);\n\n toast.success(\n <div>\n {t([i18nPrefix, \"toasts.not_relevant\"])}{\" \"}\n <UndoButton onClick={deleteInterest}>{t([i18nPrefix, \"buttons.undo\"])}</UndoButton>\n </div>\n );\n };\n\n useEffect(() => {\n if (isInterested === false) handleFade();\n else handleReveal();\n }, [isInterested]);\n\n return (\n <ButtonContainer>\n <RelevantButton\n onClick={handleRelevantClick}\n $selected={isInterested}\n aria-label={t([i18nPrefix, \"buttons.relevant.aria_label\"])}\n >\n <Icon name=\"Checkmark\" color={COLORS.BLUE_500} size=\"sm\" />\n </RelevantButton>\n <NotRelevantButton\n onClick={handleNotRelevantClick}\n $selected={isInterested === false}\n aria-label={t([i18nPrefix, \"buttons.not_relevant.aria_label\"])}\n >\n <Icon name=\"Block\" color={COLORS.NEUTRAL_500} size=\"sm\" />\n </NotRelevantButton>\n </ButtonContainer>\n );\n};\n\nexport default RefineRecommendations;\n\nconst ButtonContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst BaseButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 34px;\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n background-color: ${COLORS.WHITE};\n\n box-shadow: ${STYLES.SHADOW_CARD};\n`;\n\nconst RelevantButton = styled(BaseButton)<{ $selected?: boolean }>`\n border-radius: 4px 0px 0px 4px;\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n margin-right: 0;\n\n ${(props) =>\n props.$selected &&\n `\n background: ${COLORS.BLUE_LIGHT_300};\n border: 1px solid ${COLORS.BLUE_500};\n `}\n`;\n\nconst NotRelevantButton = styled(BaseButton)<{ $selected?: boolean }>`\n border-radius: 0px 4px 4px 0px;\n\n border: 1px solid ${COLORS.NEUTRAL_250};\n border-left: none;\n margin-left: 0;\n\n ${(props) =>\n props.$selected &&\n `\n background: ${COLORS.NEUTRAL_100};\n border: 1px solid ${COLORS.NEUTRAL_500};\n margin-left: -1px;\n `}\n`;\nconst UndoButton = styled.button`\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n`;\n","import { Button, Icon, RequestStatusIcon, Tag } from \"@components/library\";\nimport { IconName } from \"@components/library/Icon/Icon\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RequestForCard } from \"@tsTypes/index\";\nimport { RequestableType } from \"@tsTypes/requests\";\nimport { RfpStatus } from \"@tsTypes/rfps\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport { getRfpStatus, getRfpStatusText } from \"@utils/rfpUtils\";\nimport dayjs from \"dayjs\";\nimport { useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\ninterface Props {\n request: RequestForCard;\n isUserFollowing: boolean;\n isCardHovered: boolean;\n shouldShowUnsubscribeButton?: boolean;\n}\n\nconst RfpCardFooter = ({\n request,\n isUserFollowing,\n isCardHovered,\n shouldShowUnsubscribeButton = false,\n}: Props) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const statusElementOptions = {\n comingSoon: <Status color={COLORS.ORANGE}>Coming soon!</Status>,\n active: (\n <Status color={COLORS.GREEN_800}>\n Apply by {dayjs(request.requestable.deadline ?? 0).format(\"MMM D\")}\n </Status>\n ),\n inExtension: <Status color={COLORS.NEUTRAL_600}>Complete</Status>,\n pastDeadline: <Status color={COLORS.NEUTRAL_600}>Complete</Status>,\n };\n\n if (request.requestable_type === RequestableType.RFP && request.requestable.is_trial) {\n const waitListStatus = (\n <Status color={COLORS.GREEN_800}>\n <RequestStatusIcon status=\"trial\" />\n Accepting first 5 proposals\n </Status>\n );\n\n statusElementOptions.active = waitListStatus;\n statusElementOptions.inExtension = waitListStatus;\n }\n\n let statusTagContent = \"Solutions\";\n let statusTagIconName: IconName = \"RFP\";\n switch (request.requestable_type) {\n case RequestableType.REQUEST_FOR_EXPERT:\n statusTagContent = \"Experts\";\n statusTagIconName = \"Request for experts\";\n break;\n }\n\n const shouldShowNotifyButton =\n getRfpStatus(request) === RfpStatus.COMING_SOON && currentUser.role !== UserRole.SPONSOR;\n\n return (\n <Container data-testid=\"footer\">\n {!shouldShowUnsubscribeButton && !shouldShowNotifyButton && (\n <Tag\n size=\"sm\"\n backgroundColor={COLORS.BLUE_LIGHT_300}\n color={COLORS.BLUE_600}\n font={FONTS.SEMIBOLD_3}\n content={statusTagContent}\n iconName={statusTagIconName}\n />\n )}\n {getRfpStatusText(request, statusElementOptions)}\n {shouldShowUnsubscribeButton ? (\n <Button\n variant=\"destructive-secondary\"\n size=\"sm\"\n onClick={() => {\n track(SegmentEventName.Click, {\n react_component: \"RfpCardFooter\",\n ui_component: \"Decline Updates Button\",\n request_slug: request.slug,\n });\n }}\n >\n Stop notifications\n </Button>\n ) : (\n shouldShowNotifyButton &&\n (isUserFollowing ? (\n <OptedIn>\n <Icon name=\"Success\" color={COLORS.GREEN} size=\"sm\" />\n You'll be notified\n </OptedIn>\n ) : (\n <NotifyMe>\n <Icon name=\"Bell\" color={COLORS.HALO_BLUE} />\n <NotifyMeText isCardHovered={isCardHovered}>Notify me</NotifyMeText>\n </NotifyMe>\n ))\n )}\n </Container>\n );\n};\n\nexport default RfpCardFooter;\n\nconst Container = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 18px 24px;\n border-top: 1px solid ${COLORS.NEUTRAL_200};\n ${FONTS.SEMIBOLD_3};\n`;\nconst Status = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n color: ${({ color }) => color};\n`;\nconst OptedIn = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n color: ${COLORS.GREEN};\n`;\nconst NotifyMe = styled.div`\n display: flex;\n align-items: center;\n overflow: hidden;\n color: ${COLORS.HALO_BLUE};\n pointer-events: fill;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n`;\nconst NotifyMeText = styled.span`\n display: inline-block;\n max-width: 0;\n white-space: nowrap;\n overflow: hidden;\n -webkit-transition: 0.2s ease-in-out;\n transition: 0.2s ease-in-out;\n ${({ isCardHovered }) =>\n isCardHovered &&\n `\n max-width: 67px;\n margin-left: 4px;\n `}\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n max-width: 67px;\n margin-left: 4px;\n }\n`;\n","import { Card, CompanyAvatar, Tag, TruncatedText, XMoreWrapper } from \"@components/library\";\nimport { COLORS, FEATURE_FLAGS, FONTS } from \"@constants\";\nimport useFollowRequest from \"@hooks/useFollowRequest\";\nimport { RootState } from \"@redux/store\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { ConfidentialCompany, RequestForCard } from \"@tsTypes/index\";\nimport { LaunchableRequestStatus } from \"@tsTypes/requests\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport { getLaunchableRequestStatus, requestPageUrlPath } from \"@utils/requestUtils\";\nimport { checkRfpCompanyHidden } from \"@utils/rfpUtils\";\nimport { useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport RefineRecommendations from \"./RefineRecommendations\";\nimport RfpCardFooter from \"./RfpCardFooter\";\n\ninterface Props {\n request: RequestForCard;\n onClick?: (...args: any[]) => any;\n shouldShowUnsubscribeButton?: boolean;\n fromHref?: string;\n}\n\nconst RfpCard = ({ request, onClick, shouldShowUnsubscribeButton = false, fromHref }: Props) => {\n const [isCardHovered, setIsCardHovered] = useState(false);\n const [shouldFade, setShouldFade] = useState(false);\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const { title, company, disciplines, areas_of_expertise } = request;\n\n const { handleFollowRequest, isUserFollowing } = useFollowRequest(request.id);\n\n const handleNotify = () => {\n if (getLaunchableRequestStatus(request) !== LaunchableRequestStatus.COMING_SOON) return;\n\n handleFollowRequest();\n\n track(SegmentEventName.Click, {\n ui_component: \"Coming soon request card\",\n react_component: \"RfpCardNew\",\n logged_in: false,\n });\n };\n\n let keywords: string[];\n if (!currentUser?.id) {\n keywords = [...(disciplines ?? []), ...(areas_of_expertise ?? [])];\n } else if (currentUser.role === UserRole.UNIVERSITY_ADMIN) {\n keywords = disciplines;\n } else {\n keywords = areas_of_expertise;\n }\n // Remove duplicates just in case\n keywords = Array.from(new Set(keywords));\n\n const isComingSoon = getLaunchableRequestStatus(request) === LaunchableRequestStatus.COMING_SOON;\n const isPrivate = checkRfpCompanyHidden(request, currentUser);\n\n const CardLink = isComingSoon || shouldShowUnsubscribeButton ? DisabledCardLink : ActiveCardLink;\n\n return (\n <FadeWrapper shouldFade={shouldFade}>\n <CardLink\n to={{\n pathname: requestPageUrlPath(request),\n fromHref,\n }}\n >\n <Card\n padding=\"0px\"\n showHoverBorder\n onClick={onClick ?? handleNotify}\n onMouseEnter={() => setIsCardHovered(true)}\n onMouseLeave={() => setIsCardHovered(false)}\n data-testid=\"rfp-card\"\n >\n <MainContent>\n <Company data-testid=\"company-name\">\n <CompanyAvatar\n isPrivate={isPrivate}\n imageUrl={\"avatar\" in company ? company.avatar.url : null}\n size=\"sm\"\n />\n {isPrivate ? (\n (company as ConfidentialCompany).private_alias ?? \"Private\"\n ) : (\n <TruncatedText\n text={\"company_name\" in company ? company.company_name : \"\"}\n font={FONTS.SEMIBOLD_1}\n textWidth=\"calc(100% - 48px)\"\n tooltipWidth=\"200px\"\n />\n )}\n </Company>\n <Title data-testid=\"title\">\n <TruncatedText text={title} lines={4} font={FONTS.MEDIUM_1} />\n </Title>\n <KeywordContainer data-testid=\"keywords\">\n <XMoreWrapper maxLines={2}>\n {keywords.map((keyword) => (\n <Tag key={keyword} content={keyword} size=\"sm\" />\n ))}\n </XMoreWrapper>\n </KeywordContainer>\n {FEATURE_FLAGS.RELEVANT_NOT_RELEVANT_BUTTONS && (\n <RefineRecommendations\n request={request}\n handleReveal={() => setShouldFade(false)}\n handleFade={() => setShouldFade(true)}\n />\n )}\n </MainContent>\n <RfpCardFooter\n request={request}\n isUserFollowing={isUserFollowing ?? false}\n isCardHovered={isCardHovered}\n shouldShowUnsubscribeButton={shouldShowUnsubscribeButton}\n />\n </Card>\n </CardLink>\n </FadeWrapper>\n );\n};\n\nexport default RfpCard;\n\nconst FadeWrapper = styled.div<{ shouldFade: boolean }>`\n opacity: ${({ shouldFade }) => (shouldFade ? 0.4 : 1)};\n transition: opacity 0.3s ease-out;\n`;\n\nconst ActiveCardLink = styled(Link)`\n display: block;\n :visited,\n :link {\n color: ${COLORS.BLACK};\n text-decoration: none;\n }\n`;\nconst DisabledCardLink = styled.div`\n display: block;\n color: ${COLORS.BLACK};\n text-decoration: none;\n`;\nconst MainContent = styled.div`\n display: flex;\n flex-direction: column;\n min-height: 305px;\n background-color: ${({ backgroundColor }) => backgroundColor};\n padding: 24px 24px 16px;\n border-radius: ${({ borderRadius }) => borderRadius};\n`;\nconst Company = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 32px;\n ${FONTS.SEMIBOLD_1};\n`;\nconst Title = styled.div`\n height: 54px;\n margin-bottom: auto;\n ${FONTS.MEDIUM_1};\n`;\nconst KeywordContainer = styled.div`\n margin-bottom: 16px;\n`;\n","import { Icon } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport styled from \"styled-components\";\n\nconst SSOEnabledHint = ({ text = \"Single sign-on enabled\" }) => (\n <Hint>\n <Icon name=\"Lock\" color={COLORS.NEUTRAL_500} size=\"xs\" />\n {text}\n </Hint>\n);\n\nexport { SSOEnabledHint };\n\nconst Hint = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.REGULAR_2}\n`;\n","import { Icon } from \"@components/library\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport { FundingPartial } from \"@tsTypes/fundings/_funding\";\nimport { ScientistAttachmentProposal } from \"@tsTypes/index\";\nimport { PatentPartial } from \"@tsTypes/patents/_patent\";\nimport { PublicationPartial } from \"@tsTypes/publications/_publication\";\nimport { RequestableType } from \"@tsTypes/requests\";\nimport { Company, Foundation, GovernmentOrganization, University } from \"@tsTypes/schema\";\nimport { t } from \"@utils/i18n\";\nimport { proposalyPagePath } from \"@utils/proposalyUtils\";\nimport { REQUESTABLE_TO_ICON_NAME } from \"@utils/requestUtils\";\nimport dayjs from \"dayjs\";\nimport { ReactNode, useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\ninterface Props {\n contribution: PublicationPartial | FundingPartial | PatentPartial | ScientistAttachmentProposal;\n isExpandable?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nfunction formatDate(date: string) {\n return dayjs(date).format(\"MMM YYYY\");\n}\n\nconst ScientistContribution = ({ contribution, isExpandable = true, size = \"lg\" }: Props) => {\n const [isExpanded, setIsExpanded] = useState(false);\n\n let url: string | null | undefined;\n if (\"url\" in contribution) url = contribution.url;\n if (\"requestable_type\" in contribution) {\n url = proposalyPagePath(contribution);\n }\n\n let title = contribution.title;\n let additionalInfo: ReactNode;\n let date: string | null = null;\n let content: string | null = null;\n // Publication\n if (\"publication_name\" in contribution) {\n additionalInfo = (\n <PublicationName isExpanded={isExpanded} hasUrl={Boolean(url)}>\n <Icon name=\"Publication\" color={COLORS.NEUTRAL_400} />\n <span>{contribution.publication_name}</span>\n </PublicationName>\n );\n if (contribution.date) date = formatDate(contribution.date);\n content = contribution.abstract;\n\n // Funding\n } else if (\"amount\" in contribution) {\n const { sponsor } = contribution;\n if (sponsor || contribution.other_sponsor) {\n title = `${\n (sponsor as Foundation)?.foundation_name ??\n (sponsor as GovernmentOrganization)?.org_name ??\n (sponsor as Company)?.company_name ??\n (sponsor as University)?.name ??\n contribution.other_sponsor\n } - ${title}`;\n }\n if (contribution.amount) {\n additionalInfo = (\n <Detail>\n <Icon name=\"Funding\" color={COLORS.NEUTRAL_400} />$\n {Intl.NumberFormat().format(Math.floor(contribution.amount))}\n </Detail>\n );\n }\n if (contribution.date) date = formatDate(contribution.date);\n if (contribution.end_date) date += ` - ${formatDate(contribution.end_date)}`;\n content = contribution.description;\n\n // Patent\n } else if (\"filing_date\" in contribution) {\n if (contribution.status) {\n additionalInfo = (\n <Detail>\n <Icon name=\"Status\" color={COLORS.NEUTRAL_400} />\n Status: {t([\"models.patent.status\", contribution.status])}\n </Detail>\n );\n }\n if (contribution.filing_date) {\n date = `Filing Date: ${formatDate(contribution.filing_date)}`;\n }\n content = contribution.abstract;\n\n // Proposal\n } else if (\"requestable_type\" in contribution) {\n const { requestable_type, request, completed, first_completed_at } = contribution;\n\n if (!title) title = `RFP: ${request.title}`;\n\n let requestLabel = \"RFP\";\n switch (requestable_type) {\n case RequestableType.REQUEST_FOR_EXPERT:\n requestLabel = \"Request for Experts\";\n break;\n case RequestableType.OPEN_CALL:\n requestLabel = \"Open Call\";\n break;\n case RequestableType.REQUEST_FOR_STARTUP:\n requestLabel = \"Startup Program\";\n break;\n }\n additionalInfo = (\n <Detail>\n <Icon\n name={REQUESTABLE_TO_ICON_NAME[requestable_type]}\n color={COLORS.NEUTRAL_400}\n size=\"sm\"\n />\n {requestLabel}: {request.title}\n </Detail>\n );\n\n if (completed && first_completed_at) {\n date = formatDate(first_completed_at);\n } else if (!completed) {\n date = \"Not submitted (Draft)\";\n }\n\n content = contribution.preview;\n }\n\n return (\n <Container size={size}>\n <Preview\n type=\"button\"\n onClick={() => isExpandable && setIsExpanded(!isExpanded)}\n size={size}\n isExpandable={isExpandable}\n >\n <TopRow size={size}>\n <Title\n as={(() => {\n if (url && \"requestable_type\" in contribution) return Link;\n else if (url) return \"a\";\n return \"div\";\n })()}\n href={\n // eslint-disable-next-line no-nested-ternary\n url?.startsWith(\"http\")\n ? url\n : url?.startsWith(\"10.\")\n ? `https://doi.org/${url}`\n : `https://${url}`\n }\n to={url}\n target=\"_blank\"\n size={size}\n isExpanded={isExpanded}\n onClick={(e) => url && e.stopPropagation()}\n >\n {title}\n </Title>\n {isExpandable && content && <Icon name={isExpanded ? \"Chevron Up\" : \"Chevron Down\"} />}\n </TopRow>\n {isExpanded && <Content>{content}</Content>}\n <Details isExpanded={isExpanded}>\n {additionalInfo}\n {date && (\n <Detail>\n <Icon name=\"Calendar\" color={COLORS.NEUTRAL_400} />\n {date}\n </Detail>\n )}\n </Details>\n </Preview>\n </Container>\n );\n};\n\nexport default ScientistContribution;\n\nconst Container = styled.div`\n width: 100%;\n min-width: 0;\n padding: ${({ size }) => (size === \"sm\" ? \"4px 8px\" : \"16px\")};\n background: ${({ size }) => (size === \"md\" ? COLORS.NEUTRAL_200 : COLORS.NEUTRAL_50)};\n border-radius: 8px;\n`;\nconst Preview = styled.button`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n width: 100%;\n padding: 0;\n ${FONTS.MEDIUM_3};\n text-align: left;\n background: none;\n border: none;\n &:hover {\n text-decoration: none;\n cursor: ${({ isExpandable }) => (isExpandable ? \"pointer\" : \"default\")};\n }\n &:focus {\n outline: none;\n text-decoration: none;\n }\n`;\nconst TopRow = styled.div`\n display: flex;\n justify-content: space-between;\n gap: 16px;\n ${({ size }) => size === \"sm\" && \"height: 40px\"};\n margin-bottom: 4px;\n width: 100%;\n`;\nconst Title = styled.div`\n ${({ size }) => (size === \"sm\" ? FONTS.MEDIUM_3 : FONTS.MEDIUM_2)};\n ${({ isExpanded, size }) => {\n if (size === \"lg\" && !isExpanded) return STYLES.ONE_LINE_ALT;\n if (size === \"sm\") return STYLES.TWO_LINES;\n if (size === \"md\") return STYLES.THREE_LINES;\n }};\n color: ${COLORS.BLACK};\n ${({ as: _as }) =>\n _as !== \"div\" &&\n `\n &:hover,\n &:focus {\n color: ${COLORS.BLACK};\n text-decoration: underline;\n outline: none;\n }\n `}\n`;\nconst Details = styled.div`\n display: flex;\n align-items: ${({ isExpanded }) => (isExpanded ? \"flex-start\" : \"center\")};\n gap: 24px;\n color: ${COLORS.NEUTRAL_400};\n width: 100%;\n`;\nconst Detail = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n`;\nconst PublicationName = styled(Detail)`\n ${({ isExpanded }) => isExpanded && \"align-items: flex-start\"};\n max-width: calc(100% - 110px);\n & > span {\n ${({ isExpanded }) => isExpanded && \"margin-top: 2px\"};\n ${({ isExpanded, hasUrl }) => (hasUrl || !isExpanded) && STYLES.ONE_LINE_ALT};\n }\n`;\nconst Content = styled.div`\n margin: 12px 0;\n ${FONTS.REGULAR_3};\n`;\n","import { Icon, Tooltip } from \"@components/library\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport { TECHNOLOGY_READINESS_LEVELS } from \"@tsTypes/proposals\";\nimport Slider from \"rc-slider\";\nimport styled from \"styled-components\";\n\ninterface Props {\n trlRange: [number, number];\n asInput?: boolean;\n onChange?: (values: [number, number]) => void;\n}\n\nexport const TOOLTIP_EXAMPLES = {\n 1: \"Literature review to validate initial idea.\",\n 2: \"Hypothesis created and validated using basic science principles in the lab.\",\n 3: \"Ideas validated using cell models, computational modeling or in-silico experiments.\",\n 4: \"Drug validated in a mouse model or genetically-modified plants grown in a greenhouse.\",\n 5: \"Hypothesis evaluated and refined in a small-scale experimental test in a relevant environment.\",\n 6: \"Product tested in clinical trials, factories, or field trials with no further requirement to make changes to the product.\",\n 7: \"Product received FDA approval.\",\n 8: \"Product can be manufactured at scale.\",\n 9: \"Product is accessible for consumers.\",\n};\n\nexport const DEFAULT_TRL_RANGE = [1, 9] as [number, number];\n\nconst SliderHandle = (handle) => (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <div {...handle.props} className=\"rc-slider-handle\" data-testid=\"trl-handle\">\n {sliderHandleIcon}\n </div>\n);\n\nconst TRLs = ({ trlRange, asInput = false, onChange }: Props) => {\n const handleLabelClick = (level) => {\n if (!onChange) return;\n\n const halfwayPoint = (trlRange[0] + trlRange[1]) / 2;\n if (level < halfwayPoint) {\n onChange([level, trlRange[1]]);\n } else {\n onChange([trlRange[0], level]);\n }\n };\n\n return (\n <Container>\n <SliderContainer asInput={asInput}>\n <SliderTrackBackground />\n {asInput ? (\n <Slider\n range\n vertical\n reverse\n value={trlRange}\n min={1}\n max={Object.keys(TECHNOLOGY_READINESS_LEVELS).length}\n dots\n allowCross={false}\n handleRender={SliderHandle}\n onChange={\n onChange && ((newRange: number | number[]) => onChange(newRange as [number, number]))\n }\n />\n ) : (\n <>\n <DotContainer>\n {Object.keys(TECHNOLOGY_READINESS_LEVELS).map((level) => (\n <Dot\n key={level}\n isActive={Number(level) >= trlRange[0] && Number(level) <= trlRange[1]}\n />\n ))}\n </DotContainer>\n <SelectedBar trlRange={trlRange} />\n </>\n )}\n </SliderContainer>\n <Levels>\n {Object.values(TECHNOLOGY_READINESS_LEVELS).map((value, i) => {\n const isSelected = trlRange[0] <= i + 1 && trlRange[1] >= i + 1;\n return (\n <Level\n key={value}\n isSelected={isSelected}\n data-testid={`trl-${i + 1}`}\n data-selected={isSelected}\n >\n <Label type=\"button\" onClick={() => handleLabelClick(i + 1)} asInput={asInput}>\n {i + 1}. {value}\n </Label>\n <Tooltip\n content={\n <>\n <b>Example: </b>\n <br />\n {TOOLTIP_EXAMPLES[i + 1]}\n </>\n }\n position=\"right\"\n tooltipWidth=\"320px\"\n arrowOffsetTop=\"calc(50% - 8px)\"\n >\n <Icon name=\"Info\" size=\"xs\" margin=\"0 0 0 6px\" color={COLORS.NEUTRAL_400} />\n </Tooltip>\n </Level>\n );\n })}\n </Levels>\n </Container>\n );\n};\n\nexport default TRLs;\n\nconst Container = styled.div`\n display: flex;\n gap: 16px;\n min-width: 410px;\n`;\nconst SliderContainer = styled.div`\n display: flex;\n align-items: ${({ asInput }) => (asInput ? \"center\" : \"flex-start\")};\n position: relative;\n height: 408px;\n width: 24px;\n .rc-slider {\n height: 384px;\n width: 6px;\n padding: 0;\n left: 9px;\n cursor: pointer;\n .rc-slider-rail {\n width: 6px;\n left: 0;\n background-color: ${COLORS.NEUTRAL_200};\n }\n .rc-slider-track {\n background-color: ${COLORS.HALO_BLUE};\n width: 6px;\n left: 0;\n }\n .rc-slider-step {\n width: 6px;\n .rc-slider-dot {\n width: 6px;\n height: 1px;\n margin: 0;\n border-radius: 0;\n border: none;\n background-color: ${COLORS.NEUTRAL_400};\n }\n .rc-slider-dot-active {\n background-color: ${COLORS.NEUTRAL_200};\n }\n }\n .rc-slider-handle {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n margin-left: -9px;\n border: none;\n box-shadow: ${STYLES.SHADOW_A};\n background-color: ${COLORS.WHITE};\n opacity: 1;\n }\n }\n`;\nconst SliderTrackBackground = styled.div`\n position: absolute;\n left: 9px;\n width: 6px;\n height: 100%;\n background-color: ${COLORS.NEUTRAL_200};\n border-radius: 3px;\n`;\nconst DotContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n top: 12px;\n left: 9px;\n height: calc(100% - 24px);\n width: 9px;\n`;\nconst Dot = styled.div`\n width: 6px;\n height: 1px;\n background-color: ${({ isActive }) => (isActive ? COLORS.NEUTRAL_200 : COLORS.NEUTRAL_400)};\n z-index: 1;\n`;\nconst SelectedBar = styled.div`\n position: relative;\n top: ${({ trlRange }) => 48 * (trlRange[0] - 1)}px;\n height: ${({ trlRange }) => 48 * (trlRange[1] - trlRange[0]) + 24}px;\n width: 6px;\n background-color: ${COLORS.HALO_BLUE};\n border-radius: 3px;\n`;\nconst Levels = styled.div`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\nconst Level = styled.div`\n display: flex;\n align-items: center;\n ${FONTS.MEDIUM_2};\n color: ${({ isSelected }) => (isSelected ? COLORS.BLACK : COLORS.NEUTRAL_400)};\n`;\nconst Label = styled.button`\n padding: 0;\n border: none;\n background-color: transparent;\n ${({ asInput }) => !asInput && \"pointer-events: none;\"}\n :focus {\n outline: none;\n }\n`;\nconst sliderHandleIcon = (\n <svg width=\"10\" height=\"8\" viewBox=\"0 0 10 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 1L-4.17233e-07 1\" stroke={COLORS.HALO_BLUE} strokeWidth=\"1.5\" />\n <path d=\"M10 4L-4.17233e-07 4\" stroke={COLORS.HALO_BLUE} strokeWidth=\"1.5\" />\n <path d=\"M10 7L-4.17233e-07 7\" stroke={COLORS.HALO_BLUE} strokeWidth=\"1.5\" />\n </svg>\n);\n","import { Button } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { Modal } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\n\nconst ResendConfirmationModal = ({ confirmationModalOpen, setConfirmationModalOpen }) => {\n return (\n <ConfirmationModal\n open={confirmationModalOpen}\n onClose={() => setConfirmationModalOpen(false)}\n size=\"tiny\"\n closeOnDimmerClick={true}\n className=\"scrolling\"\n >\n <ModalContent>\n <h1>Your verification email has been resent.</h1>\n <p>Please check your spam and quarantine folders in your email.</p>\n <p>\n If you continue to have problems, please{\" \"}\n <a href=\"/contact\" target=\"_blank\">\n contact us\n </a>{\" \"}\n for assistance.\n </p>\n <Button type=\"button\" onClick={() => setConfirmationModalOpen(false)}>\n Close\n </Button>\n </ModalContent>\n </ConfirmationModal>\n );\n};\n\nconst ConfirmationModal = styled(Modal)`\n overflow: visible;\n color: ${COLORS.BLACK};\n ${FONTS.REGULAR_2};\n`;\nconst ModalContent = styled(Modal.Content)`\n h1 {\n ${FONTS.HEADING_4_SEMIBOLD};\n color: ${COLORS.BLACK};\n border: none;\n padding-bottom: 12px;\n }\n p {\n ${FONTS.REGULAR_2};\n color: ${COLORS.BLACK};\n border: none;\n padding-bottom: 8px;\n }\n`;\n\nexport default ResendConfirmationModal;\n","import { useEffect, useState } from \"react\";\nimport ReactCodeInput from \"react-verification-code-input\";\nimport styled from \"styled-components\";\n\nimport toast from \"@components/Toast\";\nimport { Button, TextInput } from \"@components/library\";\nimport { COLORS, FEATURE_FLAGS, FONTS } from \"@constants\";\nimport { RootState } from \"@redux/store\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { track } from \"@utils/appUtils\";\nimport { t, t_link } from \"@utils/i18n\";\nimport { toastErrorHandler } from \"@utils/requests\";\nimport { useSelector } from \"react-redux\";\nimport { TextInputError } from \"src/components/library/Inputs/TextInput\";\nimport { cancelSignUp, resendEmailInvite, signOut, verifyUser } from \"src/requests/users\";\nimport { StepContainer, StepHeader } from \"src/views/Onboarding/StepStyles\";\nimport ResendConfirmationModal from \"./ResendConfirmationModal\";\n\nfunction UserVerificationCode({ onContinue }) {\n const currentUserEmail = useSelector((state: RootState) => state.profiles.currentUser.email);\n const isTablet = useSelector((state: RootState) => state.window.isTablet);\n\n const [isEmailInputVisible, setIsEmailInputVisible] = useState(false);\n const [email, setEmail] = useState(currentUserEmail || \"\");\n\n const [confirmationModalOpen, setConfirmationModalOpen] = useState(false);\n const [code, setCode] = useState(\"\");\n const [error, setError] = useState(false);\n const [emailInputError, setEmailInputError] = useState<TextInputError | null>(null);\n\n const verificationMutation = useMutation({\n mutationFn: verifyUser,\n onSuccess: (result) => {\n if (result) {\n onContinue();\n } else {\n setError(true);\n }\n },\n onError: toastErrorHandler,\n });\n\n const resendVerificationMutation = useMutation({\n mutationFn: resendEmailInvite,\n onSuccess: () => {\n toast.success(\"A new verification code has been sent to your email.\");\n setIsEmailInputVisible(false);\n },\n onError: (err: any) => {\n switch (err.response?.status) {\n case 409:\n toast.error(\n t_link(\n \"pages.onboarding_container.user_verification_code.error.email_taken\",\n <span\n style={{ textDecoration: \"underline\" }}\n onClick={async () => {\n await cancelSignUp(\"resendEmailVerification409\");\n window.location.href = \"/login\";\n }}\n >\n log in instead\n </span>\n )\n );\n return false;\n case 429:\n toast.error(\n t(\"pages.onboarding_container.user_verification_code.error.too_many_requests\")\n );\n return false;\n }\n throw error;\n },\n });\n\n useEffect(() => {\n // Auto-verify when user enters 4 digits\n if (code.length === 4 && !error) {\n verificationMutation.mutate(code);\n }\n }, [code]);\n\n const handleOnChange = (verificationCode: string) => {\n if (verificationCode.length && error) setError(false);\n setCode(verificationCode);\n };\n\n return (\n <>\n <ResendConfirmationModal\n confirmationModalOpen={confirmationModalOpen}\n setConfirmationModalOpen={setConfirmationModalOpen}\n />\n <StepContainer step={1} data-testid=\"onboarding-step1\" width=\"470px\">\n <StepHeader subheading=\"Welcome to Halo\" heading=\"Please verify your email address.\" />\n <StyledCodeInput\n error={error}\n required\n type=\"number\"\n fields={4}\n fieldHeight={isTablet ? 100 : 121}\n fieldWidth={isTablet ? 85 : 109}\n placeholder={[\" \", \" \", \" \", \" \"]}\n onChange={handleOnChange}\n disabled={verificationMutation.isLoading}\n />\n <DropdownRow>\n {error && (\n <DropdownTitle style={{ color: COLORS.RED }}>\n {t(\"pages.onboarding_container.user_verification_code.error.incorrect\")}\n </DropdownTitle>\n )}\n <DropdownTitle>\n {t(\"pages.onboarding_container.user_verification_code.instructions\")}{\" \"}\n <ResendEmailLink onClick={() => setIsEmailInputVisible(true)}>\n {t(\"pages.onboarding_container.user_verification_code.resend_email\")}\n </ResendEmailLink>\n </DropdownTitle>\n {isEmailInputVisible && (\n <EmailSection\n onSubmit={(e) => {\n e.preventDefault();\n track(SegmentEventName.Submit, {\n react_component: \"UserVerificationCode\",\n action: \"Resend email verification\",\n currentUserEmail,\n sentToEmail: email,\n });\n\n if (email.trim() === \"\") {\n setEmailInputError({\n hasError: true,\n errorMessage: \"Please enter a valid email address.\",\n });\n return;\n }\n setEmailInputError(null);\n resendVerificationMutation.mutate(email);\n }}\n >\n <TextInput\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n errors={emailInputError ? [emailInputError] : undefined}\n />\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"sm\"\n margin=\"12px 0 0\"\n disabled={resendVerificationMutation.isLoading}\n >\n {t(\"pages.onboarding_container.user_verification_code.resend_code\")}\n </Button>\n </EmailSection>\n )}\n <Padding height={20} />\n {FEATURE_FLAGS.SIGN_OUT_ON_ONBOARDING && (\n <Button\n type=\"button\"\n variant=\"destructive-secondary\"\n onClick={async () => {\n await signOut();\n }}\n margin=\"0 16px 0 0\"\n >\n Sign Out\n </Button>\n )}\n </DropdownRow>\n </StepContainer>\n </>\n );\n}\n\nexport default UserVerificationCode;\n\nconst DropdownRow = styled.div`\n width: 324px;\n position: relative;\n align-self: flex-start;\n margin-bottom: 28px;\n\n &:last-of-type {\n margin-bottom: 35px;\n }\n`;\n\nconst DropdownTitle = styled.div`\n ${FONTS.MEDIUM_2};\n width: 100%;\n padding-bottom: 7px;\n color: ${COLORS.BLACK};\n`;\n\n// Styles below overwrite library's default styles to match our design system\nconst StyledCodeInput = styled(ReactCodeInput)`\n margin-bottom: 33px;\n width: unset !important;\n > div {\n > input {\n background: ${COLORS.NEUTRAL_100};\n border: 0.5px solid ${COLORS.HALO_BLUE} !important;\n border-radius: 4px;\n color: ${COLORS.BLACK};\n font-size: 32px;\n caret-color: ${COLORS.BLACK} !important;\n }\n > input:focus {\n border: 2px solid ${COLORS.HALO_BLUE} !important;\n }\n > input:not(:last-child) {\n margin-right: 8px;\n }\n > input:focus + input {\n border-left: 0.5px solid ${COLORS.HALO_BLUE};\n }\n > input:focus + input:not(:placeholder-shown) {\n border-left: 0.5px solid ${COLORS.HALO_BLUE};\n }\n > input:last-child:focus,\n input:not(:placeholder-shown) {\n border-color: ${COLORS.HALO_BLUE};\n }\n > input {\n border-color: ${(props) => props.error && COLORS.RED} !important;\n }\n }\n`;\n\nconst ResendEmailLink = styled.span`\n ${FONTS.REGULAR_2};\n text-align: left;\n white-space: no-wrap;\n color: ${COLORS.HALO_BLUE};\n cursor: pointer;\n :hover {\n text-decoration: underline;\n }\n`;\n\nconst Padding = styled.div`\n height: ${(props) => (props.height ? `${props.height}px` : \"10px\")};\n display: block;\n`;\n\nconst EmailSection = styled.form`\n margin: 12px 0;\n`;\n","import { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport styled from \"styled-components\";\nimport Icon from \"../Icon\";\n\ninterface Props {\n value: string;\n onChange: (value: string) => any;\n onSubmit: (value: string) => any;\n placeholder: string;\n buttonText?: string | null;\n shouldSubmitOnClear?: boolean;\n}\n\nexport const SearchBarInput = ({\n value,\n onChange,\n onSubmit,\n placeholder,\n buttonText = \"Apply\",\n shouldSubmitOnClear = true,\n}: Props) => {\n return (\n <Container\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit(value);\n }}\n >\n <Icon name=\"Search\" color={COLORS.NEUTRAL_500} margin=\"0 4px 0 0\" />\n <Input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />\n <ClearContainer\n onClick={() => {\n onChange(\"\");\n if (shouldSubmitOnClear) {\n onSubmit(\"\");\n }\n }}\n >\n <Icon name=\"X\" color={COLORS.NEUTRAL_350} size=\"xs\" margin=\"0 6px 0 0\" />\n </ClearContainer>\n {Boolean(buttonText) && <Button type=\"submit\">{buttonText}</Button>}\n </Container>\n );\n};\n\nconst Container = styled.form`\n display: flex;\n align-items: center;\n padding: 0 3px 0 6px;\n height: 36px;\n border: 1px solid ${COLORS.NEUTRAL_200};\n border-radius: 6px;\n\n &:focus-within {\n border: 1px solid ${COLORS.HALO_BLUE};\n }\n\n &:hover {\n cursor: pointer;\n &:not(:focus-within) {\n border: 1px solid ${COLORS.NEUTRAL_400};\n }\n &:focus-within {\n border: 1px solid ${COLORS.HALO_BLUE};\n }\n }\n\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n height: 40px;\n }\n`;\n\nconst Input = styled.input`\n flex-grow: 1;\n min-width: 0;\n border: none;\n outline: none;\n color: ${COLORS.BLACK};\n ${FONTS.TAG_MEDIUM_1};\n\n &::placeholder {\n opacity: 1;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.REGULAR_2};\n }\n`;\n\nconst ClearContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n opacity: 0.7;\n &:hover {\n opacity: 1;\n }\n`;\n\nconst Button = styled.button`\n padding: 7px 14px;\n background-color: ${COLORS.BLUE_LIGHT_300};\n color: ${COLORS.HALO_BLUE};\n border: none;\n border-radius: 4px;\n ${FONTS.BUTTON_3}\n\n &:hover {\n background-color: ${COLORS.BLUE_LIGHT_400};\n }\n\n &:active {\n background-color: ${COLORS.BLUE_LIGHT_500};\n }\n`;\n","import toast from \"@components/Toast\";\nimport { Button } from \"@components/library\";\nimport EmailDropdown from \"@components/library/Dropdowns/EmailDropdown\";\nimport BlankModal, { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { fetchAllCompanyMembers } from \"@redux/actions/companyActions\";\nimport { RootState } from \"@redux/store\";\nimport { generateEmailDropdownOptions, getOptionFromValue } from \"@utils/dropdownUtils\";\nimport { SyntheticEvent, useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { UserOption } from \"../Dropdowns/UserDropdown\";\n\nexport interface ShareWithinCompanyProps extends BlankModalProps {\n toastText: string;\n handleShare: (email: string, message: string) => Promise<any>; // throw on error\n}\n\nconst ShareWithinCompanyModal = ({\n isOpen,\n onClose,\n headerText,\n toastText,\n handleShare,\n}: ShareWithinCompanyProps) => {\n if (!isOpen) return null;\n\n const dispatch = useDispatch();\n const companyMembers = useSelector((state: RootState) => state.company.companyMembers);\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const dropdownOptions: UserOption[] = generateEmailDropdownOptions(companyMembers, [\n currentUser.email,\n ]);\n\n const [emails, setEmails] = useState<string[]>([]);\n const [emailError, setEmailError] = useState(\"\");\n const [message, setMessage] = useState<string>(\"\");\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n useEffect(() => {\n dispatch(fetchAllCompanyMembers(currentUser.profile_info?.company_id));\n }, []);\n\n const handleSubmit = (e: SyntheticEvent) => {\n e.preventDefault();\n if (isSubmitting) return;\n setIsSubmitting(true);\n Promise.all(emails.map((email) => handleShare(email, message)))\n .then(() => {\n onClose();\n toast.success(toastText);\n })\n .catch((err) => console.error(err))\n .finally(() => setIsSubmitting(false));\n };\n\n return (\n <BlankModal\n isOpen={isOpen}\n onClose={onClose}\n closeOnDimmerClick={emails.length === 0 && message.length === 0}\n headerText={headerText}\n width=\"600px\"\n >\n <Content data-testid=\"share-within-company-modal\">\n <form onSubmit={handleSubmit}>\n <Label>Email Address(es)</Label>\n <EmailDropdown\n value={emails.map(getOptionFromValue) as any}\n options={dropdownOptions}\n onChange={setEmails}\n setError={setEmailError}\n />\n <Error>{emailError}</Error>\n <Label extraMarginTop>Message (Optional)</Label>\n <TextArea\n placeholder=\"Add a message\"\n rows=\"4\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n data-testid=\"message-input\"\n />\n <SubmitButtonContainer>\n <Button\n type=\"submit\"\n size={\"md\"}\n iconName=\"Share\"\n disabled={emails.length === 0 || Boolean(emailError) || isSubmitting}\n data-testid=\"submit-button\"\n >\n Share\n </Button>\n </SubmitButtonContainer>\n </form>\n </Content>\n </BlankModal>\n );\n};\n\nexport default ShareWithinCompanyModal;\n\nconst Content = styled.div`\n padding: 20px;\n`;\n\nconst Label = styled.label`\n ${FONTS.SEMIBOLD_2}\n margin-bottom: 10px;\n ${(p) => p.extraMarginTop && \"margin-top: 30px;\"}\n`;\n\nconst Error = styled.div`\n ${FONTS.REGULAR_2}\n color: ${COLORS.RED};\n margin-top: 5px;\n`;\n\nconst TextArea = styled.textarea`\n ${FONTS.REGULAR_2}\n width: 100%;\n margin: auto;\n padding: 10px;\n border: 1px solid ${COLORS.NEUTRAL_300};\n border-radius: 6px;\n resize: none;\n\n &::placeholder {\n ${FONTS.REGULAR_2}\n color: ${COLORS.NEUTRAL_500};\n }\n`;\n\nconst SubmitButtonContainer = styled.div`\n margin-top: 30px;\n`;\n","import DROPDOWN_STYLES from \"@components/library/Dropdowns/dropdownStyles\";\nimport { COLORS, FONTS, JS_FONTS } from \"@constants\";\nimport Select from \"react-select\";\nimport AsyncSelect from \"react-select/async\";\nimport CreatableSelect from \"react-select/creatable\";\nimport styled from \"styled-components\";\n\nconst SelectType = (props) => {\n return props.creatable ? (\n <CreatableSelect id=\"clearable-select\" {...props} />\n ) : props.async ? (\n <AsyncSelect id=\"async-select\" {...props} />\n ) : (\n <Select id=\"regular-select\" {...props} />\n );\n};\n\nexport const DropdownContainer = styled.div`\n width: ${({ width }) => width || \"100%\"};\n ${({ containerStyles }) => `${containerStyles}`};\n input {\n box-shadow: none;\n }\n ${FONTS.REGULAR_2};\n`;\n\nexport const DropdownStyles = styled(SelectType)`\n ${DROPDOWN_STYLES};\n\n .Select__menu {\n margin-top: 6px;\n }\n .Select__menu-list {\n max-height: 250px;\n }\n`;\n\nexport const TagContainer = styled.div`\n width: fit-content;\n background-color: ${COLORS.NEUTRAL_200};\n border-radius: 6px;\n margin: 2px;\n box-sizing: border-box;\n ${FONTS.REGULAR_3};\n padding: 3px 6px 3px 6px;\n white-space: nowrap;\n display: flex;\n min-width: 0;\n`;\n\nexport const CreatedTagContainer = styled(TagContainer)`\n display: inline-block;\n padding: none;\n`;\n\nexport const CreateLabel = styled.div`\n ${FONTS.REGULAR_3};\n padding-left: 3px;\n`;\n\nexport const menuHeaderStyle = styled.div`\n padding: 8px 12px;\n color: grey;\n`;\n\nexport const customStyles = {\n option: (styles, { isFocused, isSelected }) => ({\n ...styles,\n backgroundColor: isFocused || isSelected ? COLORS.NEUTRAL_100 : \"transparent\",\n border: isSelected ? `1px solid ${COLORS.HALO_BLUE}` : \"unset\",\n borderRadius: isSelected ? `2px` : \"unset\",\n \":hover\": {\n backgroundColor: COLORS.NEUTRAL_100,\n },\n ...JS_FONTS.REGULAR_2,\n color: COLORS.BLACK,\n cursor: \"pointer\",\n }),\n control: (base) => ({\n ...base,\n ...JS_FONTS.REGULAR_2,\n borderRadius: \"6px\",\n }),\n menu: (base) => ({\n ...base,\n ...JS_FONTS.REGULAR_2,\n zIndex: 9999,\n marginTop: \"2px\",\n borderRadius: \"6px\",\n }),\n multiValue: (base) => ({\n ...base,\n backgroundColor: COLORS.NEUTRAL_100,\n ...JS_FONTS.REGULAR_2,\n }),\n singleValue: (base) => ({\n ...base,\n ...JS_FONTS.REGULAR_2,\n }),\n placeholder: (base, { isFocused }) => ({\n ...base,\n display: isFocused ? \"none\" : \"block\",\n color: COLORS.NEUTRAL_500,\n ...JS_FONTS.REGULAR_2,\n }),\n};\n","import Fuse from \"fuse.js\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { components } from \"react-select\";\nimport * as S from \"./Dropdown.styles\";\n\nconst TagOption = ({ children, ...props }) => {\n // This is the best way I found to add different styles to a \"created\" tag\n if (children.research_type?.includes(\"[New Tag]\")) {\n return (\n <components.Option {...props}>\n <S.CreateLabel>\n {\"Create \"}\n <S.CreatedTagContainer>{children.research_type?.substring(9)}</S.CreatedTagContainer>\n </S.CreateLabel>\n </components.Option>\n );\n }\n return (\n <components.Option {...props}>\n <S.TagContainer>{children.research_type || children}</S.TagContainer>\n </components.Option>\n );\n};\n\nconst fuzzySearch = (options, filter) => {\n if (!(options instanceof Array)) {\n options = [options];\n }\n if (filter.length === 0) {\n return true;\n }\n const fuseOptions = {\n threshold: 0.1,\n distance: 0,\n minMatchCharLength: 1,\n keys: [\"label\"],\n };\n const fuse = new Fuse(options, fuseOptions);\n return fuse.search(filter).length > 0;\n};\n\nconst MenuList = ({ children, ...props }) => {\n const { creatable, isMulti } = { ...props };\n\n const menuHeaderText =\n props.menuHeaderText ??\n (creatable ? \"Select an existing tag or create new\" : \"Select an existing tag\");\n\n return <components.MenuList {...props}>{children}</components.MenuList>;\n};\n\nconst CustomDropdownIndicator = (icon) => (props) => {\n return <components.DropdownIndicator {...props}>{icon}</components.DropdownIndicator>;\n};\n\nconst CustomNoOptionsMessage = (customNoOptionMessage) => (props) => {\n return (\n <components.NoOptionsMessage {...props}>{customNoOptionMessage}</components.NoOptionsMessage>\n );\n};\n\nconst Dropdown = (props) => {\n const {\n menuHeaderText,\n components,\n creatable,\n isMulti,\n fuzzy,\n options,\n maxOptions,\n onChange,\n value,\n icon,\n isLoading,\n styles,\n selectStyles,\n customNoOptionMessage,\n placeholder,\n menuIsOpen,\n closeMenuOnSelect,\n } = props;\n\n const [selectedValue, setSelectedValue] = useState(value ?? []);\n const [isMenuOpen, setIsMenuOpen] = useState(menuIsOpen);\n\n const selectedValueRef = useRef(selectedValue);\n\n const tagLimitReached = selectedValue?.length >= maxOptions;\n\n useEffect(() => {\n const val = value?.value || value;\n setSelectedValue(Array.isArray(val) ? val : [val]);\n }, [value]);\n\n useEffect(() => {\n if (isMulti && selectedValueRef.current?.length === maxOptions) {\n setIsMenuOpen(false);\n } else {\n setIsMenuOpen(menuIsOpen);\n }\n\n selectedValueRef.current = selectedValue;\n }, [selectedValue]);\n\n const handleChange = (onChange) => (e, sel) => {\n const val = e ? (Array.isArray(e) ? e.map((x) => x.value ?? x) : e ? [e] : []) : [];\n setSelectedValue(val);\n if (typeof onChange === \"function\") {\n onChange(e, sel);\n }\n };\n\n const placeholderText = placeholder\n ? placeholder\n : creatable\n ? \"Select an existing tag or create new\"\n : \"Select an existing tag\";\n\n return (\n <S.DropdownContainer {...props}>\n <S.DropdownStyles\n // note changing classNamePrefix will affect some of the default styles\n className={\"Select\"}\n classNamePrefix={\"Select\"}\n // filterOption={fuzzy ? fuzzySearch : undefined}\n placeholder={placeholderText}\n formatCreateLabel={\n isMulti\n ? (inputValue) => `[New Tag]${inputValue}`\n : (inputValue) => `Create: ${inputValue}`\n }\n closeMenuOnSelect={!isMulti ? true : closeMenuOnSelect}\n components={{\n IndicatorSeparator: () => null,\n ...(isMulti && { Option: TagOption }),\n ...(icon && { DropdownIndicator: CustomDropdownIndicator(icon) }),\n ...(isLoading && { DropdownIndicator: () => null }),\n ...(customNoOptionMessage && {\n NoOptionsMessage: CustomNoOptionsMessage(customNoOptionMessage),\n }),\n ...(tagLimitReached && {\n NoOptionsMessage: () => null,\n }),\n MenuList: (selectProps) => (\n <MenuList\n creatable={creatable}\n menuHeaderText={\n tagLimitReached ? \"Max number of tags selected\" : menuHeaderText ?? undefined\n }\n {...selectProps}\n />\n ),\n ...components,\n }}\n menuIsOpen={isMulti ? isMenuOpen : menuIsOpen}\n {...props}\n styles={{\n ...S.customStyles,\n ...styles,\n ...selectStyles,\n }}\n // the mapping changes 'text' to 'label' to avoid doing this everywhere the component is used\n options={tagLimitReached ? [] : options?.map((elem) => ({ label: elem.text, ...elem }))}\n onChange={handleChange(onChange)}\n value={\n value\n ? isMulti\n ? options\n ?.map((elem) => ({ label: elem.text, ...elem }))\n .filter((option) => selectedValue.includes(option?.value))\n : options\n ?.map((elem) => ({ label: elem.text, ...elem }))\n .filter((option) => String(selectedValue) === option?.value)?.[0]\n : undefined\n }\n />\n </S.DropdownContainer>\n );\n};\n\nDropdown.propTypes = {\n /** Support multiple selected options */\n isMulti: PropTypes.bool,\n /** Support creation of new option. Use CreatableSelect instead of Select*/\n creatable: PropTypes.bool,\n /** Use AsyncSelect instead of Select. Note that you don't _have to_ use async component if you just update the options passed asyncronously.*/\n async: PropTypes.bool,\n /** Support the fuzzy search. You can customize this with the `filterOption` prop.*/\n fuzzy: PropTypes.bool,\n /** Close the select menu when the user selects an option. By default false for isMulti, and true otherwise.*/\n closeMenuOnSelect: PropTypes.bool,\n /** Array of options that populate the select menu e.g. `{ label: '', value: '' }` if you use `text` instead of `label` it is changed to `label` internally*/\n options: PropTypes.array,\n /** Placeholder for the select value */\n placeholder: PropTypes.string,\n /** Text that goes at the menu header, which is above all the options but inside the dropdown.*/\n menuHeaderText: PropTypes.string,\n /** Maximum number of options that can be selected (if it is a multi select)*/\n maxOptions: PropTypes.number,\n /** Default placement of the menu in relation to the control. 'auto' will flip when there isn't enough space below the control. One of `\"auto\"`, `\"bottom\"`, `\"top\"`.*/\n menuPlacement: PropTypes.oneOf([\"auto\", \"bottom\", \"top\"]),\n /** Number of options to jump in menu when page{up|down} keys are used e.g. `number = 5` */\n pageSize: PropTypes.number,\n /** The value of the component. If multi, it should be an array. This value should correspond to one or more of the values of the options.*/\n value: PropTypes.any,\n /** Will cause the select to be displayed in the loading state, even if the Async select is not currently waiting for loadOptions to resolve*/\n isLoading: PropTypes.bool,\n /** Disables default icon styling*/\n disableIconColor: PropTypes.bool,\n /** Applies styles to the dropdown. This is the prefered way to style it. (see https://react-select.com/styles). Note that styles in DropdownStyles will have priority over these changes. */\n selectStyles: PropTypes.object,\n /** Whether the menu is open*/\n menuIsOpen: PropTypes.bool,\n /**\n * The `onChange` function will be passed an event or a value, action pair. e is an event when the user is typing into the Dropdown component. On actions such as clear, delete, or selection of a tag, e will be the value in the dropdown and action will be a string describing the action. For single selections, e is just the `value` of the corresponding `option` while in multi-select (with `isMulti`) dropdowns it will be an array of values.\n *\n * Example of an onChange function that handles asynchronous loading.\n * ```\n * (e, action) => {\n * if (e.target) { // check if this is an event\n * this.asyncAction(e.target.value) // async action you will do\n * } else { // if it's not an event, e has the value of the dropdown\n * this.setState({\n * localValue: e.value,\n * });\n * }\n * }\n * ```\n */\n onChange: PropTypes.func,\n /** Applies error border style */\n errorColor: PropTypes.bool,\n /** Default halo styles */\n defaultShadow: PropTypes.bool,\n /** Instead of the default \"No Options\" have an alternative message for when no options are present */\n customNoOptionMessage: PropTypes.string,\n /** Set width. Can be any valid css value. */\n width: PropTypes.string,\n /** Styles to apply to the containing div. This is the best way to apply things like padding. */\n containerStyles: PropTypes.string,\n};\n\nDropdown.defaultProps = {\n isMulti: false,\n creatable: false,\n async: false,\n fuzzy: true,\n menuPlacement: \"auto\",\n disableIconColor: false,\n errorColor: false,\n};\n\nexport default Dropdown;\n","import { BlankModal, Icon } from \"@components/library\";\nimport Button from \"@components/library/Buttons/Button\";\nimport { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport styled from \"styled-components\";\n\nconst FuelModal = ({ isOpen, onClose }: BlankModalProps) => {\n return (\n <BlankModal onClose={onClose} isOpen={isOpen} width=\"419px\">\n <Top data-testid=\"fuel-modal\">\n <Icon name=\"Lock\" size=\"lg\" />\n <Header>\n Only FUEL members can <br />\n respond to this request.\n </Header>\n <InfoText>\n Future Use of Energy in Louisiana (FUEL) is a coalition of organizations focused on\n positioning Louisiana as a global energy transition leader. Interested in joining FUEL?\n </InfoText>\n <Button\n size=\"md\"\n iconName=\"Open in a new tab\"\n iconPosition=\"right\"\n margin=\"8px 0 0\"\n to=\"https://fuelouisiana.org/\"\n openInNewTab\n isExternalLink\n >\n Learn more about FUEL\n </Button>\n </Top>\n <Bottom>\n Already part of FUEL? <a href=\"mailto:info@fuelouisiana.org\">Contact FUEL for support</a>\n </Bottom>\n </BlankModal>\n );\n};\n\nexport default FuelModal;\n\nconst { MOBILE_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nconst Header = styled.h3`\n color: ${COLORS.BLACK};\n ${FONTS.HEADING_5_REGULAR};\n margin: 4px 0px 0px 0px;\n`;\n\nconst InfoText = styled.p`\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.REGULAR_2};\n text-align: center;\n margin: 16px 0;\n`;\n\nconst Top = styled.div`\n text-align: center;\n\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n padding: 48px;\n`;\n\nconst Bottom = styled.div`\n width: 100%;\n\n display: flex;\n justify-content: center;\n flex-direction: column;\n\n border-top: 1px solid ${COLORS.NEUTRAL_300};\n\n padding: 24px 48px;\n\n text-align: center;\n display: inline-block;\n ${FONTS.MEDIUM_2}\n\n ${MOBILE_MEDIA_QUERY} {\n margin-top: 15px;\n width: 100%;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.SEMIBOLD_1}\n text-align: left;\n }\n`;\n","import LoginModal from \"@components/LoginSignUpModal/LoginModal\";\nimport toast from \"@components/Toast\";\nimport { Button, KeywordsDropdown } from \"@components/library\";\nimport { COLORS, FONTS, STYLES, WINDOW_DIMENSIONS } from \"@constants\";\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport { setCurrentUser } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { skipUpdateUserKeywords, updateUserKeywords } from \"@requests/users\";\nimport { profile_page_path } from \"@routes/routes\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport appsignal from \"@utils/appsignal\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { t } from \"@utils/i18n\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link, useHistory } from \"react-router-dom\";\nimport { USER_ROLES } from \"src/constants/users\";\nimport styled from \"styled-components\";\n\ninterface Props {\n onSubmit?: () => void;\n}\n\nconst KeywordSignUpModal = (props: Props) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n const dispatch = useDispatch();\n const history = useHistory();\n\n const [modalState, setModalState] = useState<\"login\" | \"keywords\">(\"login\");\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const [disciplines, setDisciplines] = useState<string[]>(currentUser.disciplines);\n const [areasOfExpertise, setAreasOfExpertise] = useState<string[]>(\n currentUser.areas_of_expertise\n );\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n\n track(SegmentEventName.Click, {\n ui_component: \"Add to Profile\",\n react_component: \"KeywordSignUp\",\n });\n\n setIsSubmitting(true);\n\n let response: any;\n try {\n response = await updateUserKeywords(currentUser.id, {\n disciplines,\n areasOfExpertise,\n });\n setIsSubmitting(false);\n } catch (err) {\n appsignal.sendError(err, (span) => {\n span.setAction(\"KeywordSignUp#handleSubmit\");\n span.setTags({\n currentUserId: currentUser.id,\n });\n });\n }\n\n if (response?.data?.success) {\n dispatch(\n setCurrentUser({\n ...currentUser,\n disciplines,\n areas_of_expertise: areasOfExpertise,\n has_updated_taxonomy: true,\n })\n );\n\n if (currentUser.role === USER_ROLES.scientist) {\n history.push(profile_page_path(currentUser.profile_id));\n } else {\n history.push(\"/\");\n }\n\n props.onSubmit?.();\n }\n };\n\n const onSkip = () => {\n track(SegmentEventName.Click, {\n ui_component: \"Skip\",\n react_component: \"KeywordSignUp\",\n });\n\n try {\n skipUpdateUserKeywords(currentUser.id);\n } catch (err) {\n console.error(err);\n }\n\n history.push(marketplacePath());\n\n toast.success(\n <p>\n {t(\"pages.keyword_sign_up.toast.text\")}\n <Link\n to={`/profile/${currentUser.first_name}-${currentUser.last_name}-${currentUser.id}`}\n style={{ textDecoration: \"underline\", color: \"white\" }}\n >\n {t(\"pages.keyword_sign_up.toast.link\")}\n </Link>\n </p>\n );\n };\n\n useEffect(() => {\n if (currentUser.id) {\n if (currentUser.role === USER_ROLES.sponsor) {\n history.push(\"/reviewer_dashboard\");\n return;\n }\n\n setModalState(\"keywords\");\n } else if (modalState === \"login\") {\n setPrevUrlCookie();\n }\n }, [currentUser.id]);\n\n if (modalState === \"keywords\") {\n return (\n <Modal>\n <Top>\n <Logo>\n <Link to=\"/\">\n <img src={haloLogo} />\n </Link>\n </Logo>\n <Header>\n {currentUser.role === UserRole.SCIENTIST\n ? t(\"pages.keyword_sign_up.header.scientist\")\n : t(\"pages.keyword_sign_up.header.admin\")}\n </Header>\n <Form onSubmit={handleSubmit}>\n <SingleInputContainer>\n <Title>\n {t([\n \"pages.keyword_sign_up.disciplines_label\",\n currentUser.role === UserRole.SCIENTIST ? \"scientist\" : \"university_admin\",\n ])}\n </Title>\n <KeywordsDropdown\n keywordType=\"discipline\"\n targetType={\n currentUser.role === UserRole.SCIENTIST ? \"scientist\" : \"university_admin\"\n }\n value={disciplines}\n onChange={setDisciplines}\n isPortal\n />\n </SingleInputContainer>\n {currentUser.role === USER_ROLES.scientist && (\n <SingleInputContainer>\n <Title>{t(\"pages.keyword_sign_up.expertise_label\")}</Title>\n <KeywordsDropdown\n keywordType=\"area_of_expertise\"\n targetType=\"scientist\"\n value={areasOfExpertise}\n onChange={setAreasOfExpertise}\n isPortal\n />\n </SingleInputContainer>\n )}\n </Form>\n </Top>\n <Bottom>\n <ButtonContainer>\n <Button\n size=\"md\"\n type=\"submit\"\n variant=\"ghost\"\n disabled={isSubmitting}\n onClick={onSkip}\n data-testid=\"keyword-signup-skip-button\"\n >\n {t(\"pages.keyword_sign_up.skip\")}\n </Button>\n <Button\n size=\"md\"\n type=\"submit\"\n disabled={isSubmitting}\n onClick={handleSubmit}\n data-testid=\"keyword-signup-add-to-profile-button\"\n >\n {t(\"pages.keyword_sign_up.primary_button\")}\n </Button>\n </ButtonContainer>\n </Bottom>\n </Modal>\n );\n }\n\n return (\n <LoginModal\n header={\n <Logo margin=\"12px auto 0\">\n <Link to=\"/\">\n <img src={haloLogo} />\n </Link>\n </Logo>\n }\n title={<SignInTitle>{t(\"pages.keyword_sign_up.sign_in_title\")}</SignInTitle>}\n bottom={\n <>\n Don’t have an account? \n <SignUp to=\"/get-started\">Sign up</SignUp>\n </>\n }\n />\n );\n};\n\nconst { TABLET_MEDIA_QUERY, MOBILE_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nconst Modal = styled.div`\n border-radius: 16px;\n\n background-color: ${COLORS.WHITE};\n box-shadow: ${STYLES.SHADOW_D};\n\n ${TABLET_MEDIA_QUERY} {\n max-width: 95%;\n width: unset;\n }\n\n ${MOBILE_MEDIA_QUERY} {\n max-width: 100%;\n height: 100%;\n border-radius: 0;\n }\n`;\n\nconst Logo = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 16px;\n\n width: 100%;\n\n text-align: center;\n`;\n\nconst Header = styled.div`\n margin: 40px auto;\n\n ${FONTS.HEADING_5_REGULAR}\n\n text-align: center;\n\n max-width: 400px;\n\n ${MOBILE_MEDIA_QUERY} {\n ${FONTS.HEADING_4_SEMIBOLD}\n }\n`;\n\nconst SignInTitle = styled.div`\n ${FONTS.HEADING_5_REGULAR}\n\n width: 400px;\n\n text-align: center;\n\n ${MOBILE_MEDIA_QUERY} {\n max-width: 100%;\n }\n`;\n\nconst Form = styled.form`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 48px;\n`;\n\nconst Top = styled.div`\n display: flex;\n justify-content: center;\n flex-direction: column;\n\n padding: 48px;\n\n ${TABLET_MEDIA_QUERY} {\n padding: 40px 24px;\n }\n`;\n\nconst Bottom = styled.div`\n display: inline-block;\n justify-content: center;\n flex-direction: column;\n\n width: 100%;\n padding: 16px;\n\n border-top: 1px solid ${COLORS.NEUTRAL_300};\n\n ${FONTS.SEMIBOLD_2}\n text-align: center;\n\n ${MOBILE_MEDIA_QUERY} {\n width: 100%;\n margin-top: 15px;\n\n color: ${COLORS.NEUTRAL_500};\n\n ${FONTS.SEMIBOLD_1}\n text-align: left;\n }\n`;\n\nconst SignUp = styled(Link)`\n color: ${COLORS.BLACK};\n\n text-decoration: underline;\n ${FONTS.REGULAR_2}\n\n cursor: pointer;\n\n ${MOBILE_MEDIA_QUERY} {\n display: flex;\n justify-content: center;\n align-items: center;\n\n height: 48px;\n margin-top: 12px;\n\n border-radius: 3px;\n border-style: solid;\n border-width: 2px;\n\n color: ${COLORS.HALO_BLUE};\n ${FONTS.SEMIBOLD_1}\n\n text-decoration: none;\n }\n`;\n\nconst SingleInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n\n width: 100%;\n`;\n\nconst Title = styled.label`\n display: flex;\n flex-direction: column;\n\n width: 100%;\n\n ${FONTS.SEMIBOLD_2};\n\n margin-bottom: 0px;\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n gap: 4px;\n\n width: 100%;\n`;\n\nexport default KeywordSignUpModal;\n","import { Button } from \"@components/library\";\nimport { AttachmentForDisplay } from \"@components/library/Attachments/MessageAttachment\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { RequestAttachmentPartial } from \"@tsTypes/request_attachments/_request_attachment\";\nimport { stopPropagation } from \"@utils/appUtils\";\nimport { useMemo, useState } from \"react\";\nimport { Document, Page } from \"react-pdf/dist/esm/entry.webpack5\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\n\ninterface Props {\n attachments: (AttachmentForDisplay | RequestAttachmentPartial)[];\n focusedAttachmentId: number | undefined;\n}\n\ninterface LoadState {\n [attachmentId: number]: {\n isLoading: boolean;\n hasError: boolean;\n numPdfPages?: number;\n };\n}\n\nconst INITIAL_LOAD_STATE = {\n isLoading: true,\n hasError: false,\n numPdfPages: 0,\n};\n\n/**\n * Handles display of attachments within the message attachment gallery.\n * Loads all previews concurrently in the background but only displays the focused one.\n *\n * TODO:\n * - Add support for zoom\n */\nconst MessageAttachmentGalleryPreview = ({ attachments, focusedAttachmentId }: Props) => {\n // Prioritize the first focused attachment to load first\n const prioritizedAttachments = useMemo<AttachmentForDisplay[]>(() => {\n const focusedIndex = attachments.findIndex(\n (attachment) => attachment.id === focusedAttachmentId\n );\n return [...attachments.slice(focusedIndex), ...attachments.slice(0, focusedIndex)];\n }, [attachments]);\n\n const [loadStates, setLoadStates] = useState<LoadState>(() => {\n const newLoadStates = {};\n attachments.forEach((attachment) => {\n newLoadStates[attachment.id!] = INITIAL_LOAD_STATE;\n });\n return newLoadStates;\n });\n\n // Set given image attachment as loaded\n const handleImageLoad = (attachmentId: number) => {\n setLoadStates((oldLoadStates) => ({\n ...oldLoadStates,\n [attachmentId]: {\n isLoading: false,\n hasError: false,\n },\n }));\n };\n\n // Set given image attachment number of pages\n const handlePdfLoad = ({ numPages }: { numPages: number }, attachmentId: number) => {\n setLoadStates((oldLoadStates) => ({\n ...oldLoadStates,\n [attachmentId]: {\n isLoading: false,\n hasError: false,\n numPdfPages: numPages,\n },\n }));\n };\n\n const handleError = (attachmentId: number) => {\n setLoadStates((oldLoadStates) => ({\n ...oldLoadStates,\n [attachmentId]: {\n isLoading: false,\n hasError: true,\n numPdfPages: 0,\n },\n }));\n };\n\n console.log(prioritizedAttachments);\n\n // Render all attachments but only show the focused attachment\n return (\n <>\n {prioritizedAttachments.map((attachment) => {\n const { id, mime_content_type, download_url } = attachment;\n const url = \"url\" in attachment ? attachment.url : attachment.file_url;\n const isImage = mime_content_type?.startsWith(\"image/\");\n const { isLoading, hasError, numPdfPages } = loadStates[id!];\n\n return (\n <Container key={`attachment-preview-${id}`} active={id === focusedAttachmentId}>\n {(() => {\n if (hasError) {\n return (\n <Error>\n We can’t preview this file at the moment.\n <br />\n <a href={download_url} download>\n <Button iconName=\"Download\" margin=\"20px 0\">\n Download file\n </Button>\n </a>\n </Error>\n );\n }\n if (isImage) {\n return (\n <Image.Container>\n <Loader active={isLoading} size=\"big\" inverted />\n <Image.Content\n src={url}\n active={!isLoading}\n onError={() => handleError(id!)}\n onLoad={() => handleImageLoad(id!)}\n onClick={stopPropagation}\n />\n </Image.Container>\n );\n }\n // is PDF\n return (\n <Pdf.Container>\n <div onClick={stopPropagation}>\n <Document\n file={url}\n loading={\n <Loader\n style={{ marginTop: \"35vh\" }}\n active\n size=\"big\"\n inverted\n inline=\"centered\"\n />\n }\n onLoadError={() => handleError(id!)}\n onLoadSuccess={(pdf) => handlePdfLoad(pdf, id!)}\n >\n {!isLoading &&\n Array.from(new Array(numPdfPages), (_, i) => (\n <Page\n loading=\"\"\n pageNumber={i + 1}\n key={`attachment-pdf-${id}-page-${i + 1}`}\n renderAnnotationLayer={false}\n renderTextLayer={false}\n onLoadError={() => handleError(id!)}\n />\n ))}\n </Document>\n </div>\n </Pdf.Container>\n );\n })()}\n </Container>\n );\n })}\n </>\n );\n};\n\nexport default MessageAttachmentGalleryPreview;\n\nconst Container = styled.div`\n margin: 13px 0;\n height: 0;\n\n display: flex;\n flex: 0 0 85%;\n justify-content: space-around;\n align-items: center;\n gap: 30px;\n\n ${({ active }) => !active && \"display: none;\"}\n`;\n\nconst Error = styled.div`\n display: block;\n\n ${FONTS.REGULAR_1}\n color: ${COLORS.WHITE};\n text-align: center;\n`;\n\nconst Image = {\n Container: styled.div`\n height: 100%;\n\n flex-grow: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n Content: styled.img`\n max-width: 95%;\n max-height: 100%;\n\n object-fit: contain;\n\n ${({ active }) => !active && \"display: none;\"}\n `,\n};\n\nconst Pdf = {\n Container: styled.div`\n max-width: 95%;\n max-height: 100%;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n `,\n};\n","import { Dispatch, MouseEvent, SetStateAction, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport styled from \"styled-components\";\n\nimport { Icon, IconButton, Tooltip } from \"@components/library\";\nimport { AttachmentForDisplay } from \"@components/library/Attachments/MessageAttachment\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport { RequestAttachmentPartial } from \"@tsTypes/request_attachments/_request_attachment\";\nimport { stopPropagation } from \"@utils/appUtils\";\nimport { formatBytes, formatMIMEContentType } from \"@utils/textUtils\";\nimport MessageAttachmentGalleryPreview from \"./MessageAttachmentGalleryPreview\";\n\ninterface Props {\n attachments: (AttachmentForDisplay | RequestAttachmentPartial)[];\n focusedAttachmentIndex: number | undefined;\n setFocusedAttachmentIndex: Dispatch<SetStateAction<number | undefined>>;\n closeGallery: () => void;\n}\n\nconst MessageAttachmentGalleryModal = ({\n attachments,\n focusedAttachmentIndex,\n setFocusedAttachmentIndex,\n closeGallery,\n}: Props) => {\n const isOpen = attachments.length > 0 && typeof focusedAttachmentIndex !== \"undefined\";\n\n const onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"Escape\":\n closeGallery();\n break;\n case \"ArrowLeft\":\n setFocusedAttachmentIndex((oldIndex) => Math.max(0, oldIndex! - 1));\n break;\n case \"ArrowRight\":\n setFocusedAttachmentIndex((oldIndex) => Math.min(attachments.length - 1, oldIndex! + 1));\n break;\n }\n };\n\n useEffect(() => {\n if (isOpen) {\n // Close on Escape\n document.addEventListener(\"keydown\", onKeyDown, false);\n // Disable background scroll\n document.querySelector(\"html\")!.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown, false);\n document.querySelector(\"html\")!.style.overflow = \"unset\";\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const focusedAttachment = attachments[focusedAttachmentIndex];\n\n const handleArrowClick = (event: MouseEvent, increment: -1 | 1) => {\n event.stopPropagation();\n setFocusedAttachmentIndex(focusedAttachmentIndex + increment);\n };\n\n const handleThumbnailClick = (event: MouseEvent, newFocusedIndex: number) => {\n event.stopPropagation();\n setFocusedAttachmentIndex(newFocusedIndex);\n };\n\n const { mime_content_type, size_in_bytes, download_url } = focusedAttachment;\n const name = \"title\" in focusedAttachment ? focusedAttachment.title : focusedAttachment.filename;\n const isImage = mime_content_type?.startsWith(\"image/\");\n\n const modal = (\n <>\n <Background\n aria-modal\n aria-labelledby=\"Message Attachment Gallery\"\n tabIndex={-1}\n role=\"dialog\"\n />\n <Wrapper>\n <Content onClick={closeGallery} data-testid=\"message-attachment-gallery\">\n <Header.Background onClick={stopPropagation}>\n <Header.Container>\n <Header.Metadata.Container>\n <Header.Metadata.Name>{name}</Header.Metadata.Name>\n <Header.Metadata.Info>\n {formatMIMEContentType(mime_content_type)} • {formatBytes(size_in_bytes)}\n </Header.Metadata.Info>\n </Header.Metadata.Container>\n <Header.Buttons>\n <a href={download_url} download>\n <IconButton\n iconName=\"Download\"\n variant=\"ghost-white\"\n size=\"md\"\n tooltipPosition=\"bottom\"\n />\n </a>\n <IconButton\n iconName=\"Close\"\n variant=\"ghost-white\"\n size=\"md\"\n tooltipPosition=\"bottom\"\n onClick={closeGallery}\n data-testid=\"close-button\"\n />\n </Header.Buttons>\n </Header.Container>\n </Header.Background>\n <Arrow\n position=\"left\"\n disabled={focusedAttachmentIndex === 0}\n onClick={(event: MouseEvent) => handleArrowClick(event, -1)}\n >\n <Icon name=\"Chevron Left\" size=\"lg\" />\n </Arrow>\n <Arrow\n position=\"right\"\n disabled={focusedAttachmentIndex === attachments.length - 1}\n onClick={(event: MouseEvent) => handleArrowClick(event, 1)}\n >\n <Icon name=\"Chevron Right\" size=\"lg\" />\n </Arrow>\n <MessageAttachmentGalleryPreview\n attachments={attachments}\n focusedAttachmentId={focusedAttachment.id}\n />\n {attachments.length > 1 && (\n <Thumbnail.Island isImage={isImage} onClick={stopPropagation}>\n {attachments.map((attachment, index) => (\n <Tooltip\n key={`gallery-attachment-${attachment.id}-thumbnail`}\n content={\"title\" in attachment ? attachment.title : attachment.filename}\n position=\"top\"\n remainOnHover={false}\n shouldWrap={false}\n >\n <Thumbnail.Img\n src={attachment.thumbnail_url}\n focused={index === focusedAttachmentIndex}\n onClick={(event: MouseEvent) => handleThumbnailClick(event, index)}\n />\n </Tooltip>\n ))}\n </Thumbnail.Island>\n )}\n </Content>\n </Wrapper>\n </>\n );\n\n return isOpen ? ReactDOM.createPortal(modal, document.body) : null;\n};\n\nexport default MessageAttachmentGalleryModal;\n\nconst Background = styled.div`\n z-index: 501;\n\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n\n background: linear-gradient(180deg, ${COLORS.NEUTRAL_900} 0%, ${COLORS.BLACK} 34.91%);\n opacity: 0.9;\n`;\n\nconst Wrapper = styled.div`\n z-index: 502;\n\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n\n display: flex;\n overflow: auto;\n`;\n\nconst Content = styled.div`\n width: 100%;\n padding-top: 42px;\n\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex-grow: 1;\n`;\n\nconst Header = {\n Background: styled.div`\n z-index: 503;\n\n position: fixed;\n left: 0px;\n right: 0px;\n top: 0px;\n height: 62px;\n padding: 10px 34px;\n\n // Set \"opacity\" to 0.9 without affecting child\n background: linear-gradient(180deg, ${COLORS.NEUTRAL_900}E6 0%, transparent 100%);\n `,\n Container: styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: white;\n `,\n Metadata: {\n Container: styled.div`\n max-width: 75%;\n\n display: flex;\n align-items: center;\n gap: 23px;\n color: ${COLORS.WHITE};\n `,\n Name: styled.div`\n ${FONTS.REGULAR_2}\n ${STYLES.ONE_LINE}\n `,\n Info: styled.div`\n flex: none;\n ${FONTS.REGULAR_3}\n `,\n },\n Buttons: styled.div`\n display: flex;\n gap: 1px;\n `,\n};\n\nconst Arrow = styled.button`\n position: fixed;\n top: 44%;\n ${({ position }) => `${position}: 0; margin-${position}: 34px;`}\n width: 48px;\n height: 48px;\n\n display: flex;\n flex-shrink: 0;\n justify-content: center;\n align-items: center;\n background: ${COLORS.WHITE};\n border-radius: 10px;\n border: none;\n box-shadow: ${STYLES.SHADOW_D};\n opacity: 0.3;\n transition: opacity 0.1s;\n\n &:hover {\n opacity: 1;\n box-shadow: 0px 6px 24px -4px ${COLORS.BLACK};\n }\n\n ${({ disabled }) => disabled && \"opacity: 0; pointer-events: none;\"}\n`;\n\nconst Thumbnail = {\n Island: styled.div`\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 16px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n border-radius: 8px;\n\n ${({ isImage }) =>\n !isImage &&\n `\n background: ${COLORS.BLACK};\n opacity: 0.4;\n transition: opacity 0.1s;\n\n &:hover {\n opacity: 1;\n }\n `}\n `,\n Img: styled.img`\n width: 40px;\n height: 40px;\n\n background: ${COLORS.WHITE};\n border-radius: 4px;\n object-fit: cover;\n opacity: 0.5;\n\n ${({ focused }) =>\n focused &&\n `\n opacity: 1;\n box-shadow: 0 0 0 2px ${COLORS.HALO_BLUE};\n `}\n\n &:hover {\n opacity: 1;\n cursor: pointer;\n }\n `,\n};\n","import { useState } from \"react\";\n\n// This is a custom hook that is used to force refresh a component.\n// Put refreshKey in the deps array\n// TODO: (justinpchang) Remove once redux dependencies are removed and replace with setState\nexport function useEffectRefresh(): { refreshKey: unknown; refresh: () => void } {\n const [refreshKey, setRefreshKey] = useState({});\n const refresh = () => setRefreshKey({});\n return { refreshKey, refresh };\n}\n","import { useEffectRefresh } from \"@hooks/useEffectRefresh\";\nimport api from \"@requests/request\";\nimport { getUser } from \"@requests/users\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FundingPartial } from \"@tsTypes/fundings/_funding\";\nimport { ScientistAttachmentProposal, ScientistShowUser } from \"@tsTypes/index\";\nimport { PatentPartial } from \"@tsTypes/patents/_patent\";\nimport { PublicationPartial } from \"@tsTypes/publications/_publication\";\nimport appsignal from \"@utils/appsignal\";\nimport { useEffect, useState } from \"react\";\nimport { NetworkScientist } from \"src/views/ScientistNetwork/ScientistNetwork\";\n\nexport type PositionInfo = {\n id: number;\n location: string | undefined;\n title: string | undefined;\n duration: string | undefined;\n};\n\nexport function ScientistQueryKey(id: number | undefined) {\n return [\"useScientist\", id];\n}\n\nexport function useScientist(id: number | undefined): {\n scientist: NetworkScientist | undefined;\n about: string;\n positions: PositionInfo[];\n isScientistLoading: boolean;\n} {\n const [scientist, setScientist] = useState<NetworkScientist>();\n const [about, setAbout] = useState(\"\");\n const [positions, setPositions] = useState<PositionInfo[]>([]);\n\n const { isLoading } = useQuery({\n queryKey: ScientistQueryKey(id),\n queryFn: async () => {\n if (!id) {\n return null;\n }\n const response = await getUser(id);\n return response;\n },\n onError: () => {\n setAbout(\"\");\n setPositions([]);\n },\n onSuccess: (response) => {\n if (!response) {\n setAbout(\"\");\n setPositions([]);\n return;\n }\n const user = response.user;\n const scientistProfile = (user as ScientistShowUser).profile_info;\n setScientist({\n id: user.id,\n name: user.name,\n image: user.image,\n profile_id: user.profile_id,\n keywords: user.keywords,\n is_in_network: scientistProfile.is_in_network,\n profile_info: {\n id: scientistProfile.id,\n title: scientistProfile.title ?? \"\",\n location: scientistProfile.location ?? \"\",\n },\n });\n // Add about text\n setAbout(scientistProfile.about ?? \"\");\n const pos: PositionInfo[] = [];\n // Add university position\n if (scientistProfile.university_id) {\n pos.push({\n id: -1,\n location: scientistProfile.university ?? \"\",\n title: scientistProfile.title ?? \"\",\n duration:\n scientistProfile.university_start_year || scientistProfile.university_end_year\n ? `${scientistProfile.university_start_year ?? \"?\"} - ${\n scientistProfile.university_end_year ?? \"?\"\n }`\n : undefined,\n });\n }\n // Add startup position\n if (scientistProfile.startup?.id) {\n pos.push({\n id: -2,\n location: scientistProfile.startup.startup_name ?? \"\",\n title: scientistProfile.is_startup_scientist ? scientistProfile.title ?? \"\" : undefined,\n duration:\n scientistProfile.startup.start_year || scientistProfile.startup.end_year\n ? `${scientistProfile.startup.start_year ?? \"?\"} - ${\n scientistProfile.startup.end_year ?? \"?\"\n }`\n : undefined,\n });\n }\n // Add educations\n pos.push(\n ...scientistProfile.educations.map((education) => ({\n id: education.id,\n location: education.location ?? \"\",\n title: education.degree ?? education.field_of_study ?? \"\",\n duration:\n education.start_year || education.end_year\n ? `${education.start_year ?? \"?\"} - ${education.end_year ?? \"?\"}`\n : undefined,\n }))\n );\n setPositions(pos);\n },\n });\n\n return { scientist, about, positions, isScientistLoading: isLoading };\n}\n\nexport function usePublications(scientistProfileId: number | undefined): {\n publications: PublicationPartial[];\n refresh: () => void;\n} {\n const [publications, setPublications] = useState<PublicationPartial[]>([]);\n const { refreshKey, refresh } = useEffectRefresh();\n\n useEffect(() => {\n if (scientistProfileId) {\n (async () => {\n try {\n const responseJson = await api.get(`/publications?profile_info_id=${scientistProfileId}`);\n const pubs = responseJson.data.publications;\n setPublications(pubs);\n } catch (_) {\n setPublications([]);\n }\n })();\n }\n }, [scientistProfileId, refreshKey]);\n\n return { publications, refresh };\n}\n\nexport function useFundings(scientistProfileId: number | undefined): {\n fundings: FundingPartial[];\n refresh: () => void;\n} {\n const [fundings, setFundings] = useState<FundingPartial[]>([]);\n const { refreshKey, refresh } = useEffectRefresh();\n\n useEffect(() => {\n if (scientistProfileId) {\n (async () => {\n try {\n const responseJson = await api.get(`/fundings?profile_info_id=${scientistProfileId}`);\n const funds = responseJson.data.fundings;\n setFundings(funds);\n } catch (_) {\n setFundings([]);\n }\n })();\n }\n }, [scientistProfileId, refreshKey]);\n\n return { fundings, refresh };\n}\n\nexport function usePatents(scientistProfileId: number | undefined): {\n patents: PatentPartial[];\n refresh: () => void;\n} {\n const [patents, setPatents] = useState<PatentPartial[]>([]);\n const { refreshKey, refresh } = useEffectRefresh();\n\n useEffect(() => {\n if (scientistProfileId) {\n (async () => {\n try {\n const responseJson = await api.get(`/patents?profile_info_id=${scientistProfileId}`);\n const pats = responseJson.data.patents;\n setPatents(pats);\n } catch (_) {\n setPatents([]);\n }\n })();\n }\n }, [scientistProfileId, refreshKey]);\n\n return { patents, refresh };\n}\n\nexport function useProposals(\n scientistProfileId: number | undefined,\n asUniversityAdmin = false\n): ScientistAttachmentProposal[] {\n const [proposals, setProposals] = useState<ScientistAttachmentProposal[]>([]);\n\n useEffect(() => {\n if (scientistProfileId) {\n (async () => {\n try {\n const responseJson = await api.get(`/scientist_profile/proposals/${scientistProfileId}`);\n const rawProposals = asUniversityAdmin\n ? responseJson.data.proposals\n : responseJson.data.proposals.filter((p) => p.completed);\n setProposals(rawProposals);\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"ScientistQuickViewModal#useProposals\");\n });\n setProposals([]);\n }\n })();\n }\n }, [scientistProfileId]);\n\n return proposals;\n}\n","import { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport toast from \"@components/Toast\";\nimport { Button, EmailDropdown } from \"@components/library\";\nimport BlankModal, { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { inviteScientistsToCompanyNetwork } from \"@requests/companyNetworkScientists\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { track } from \"@utils/appUtils\";\nimport { getOptionFromValue } from \"@utils/dropdownUtils\";\n\nconst InviteNetworkScientistModal = ({ isOpen, onClose }: BlankModalProps) => {\n const [emails, setEmails] = useState<string[]>([]);\n const [emailError, setEmailError] = useState(\"\");\n const [message, setMessage] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submissionError, setSubmissionError] = useState(\"\");\n\n const onSubmit = async () => {\n setIsSubmitting(true);\n setSubmissionError(\"\");\n try {\n track(SegmentEventName.Invite, {\n emails,\n ui_component: \"InviteNetworkScientistModal\",\n message,\n invitees: \"scientists\",\n });\n\n const { immediately_added, sent_invitation, already_in_network } =\n await inviteScientistsToCompanyNetwork(emails, message);\n\n const toastCustomizedMessage: string[] = [];\n if (immediately_added) toastCustomizedMessage.push(`${immediately_added} added`);\n if (sent_invitation) toastCustomizedMessage.push(`${sent_invitation} invited`);\n if (already_in_network)\n toastCustomizedMessage.push(`${already_in_network} already in your network`);\n\n const toastMessage = `You've expanded your network! ${toastCustomizedMessage.join(\", \")}`;\n toast.success(toastMessage);\n\n onClose();\n } catch (err) {\n if (err.response) {\n setSubmissionError(err.response.data);\n } else {\n setSubmissionError(\"Something went wrong. Please try again.\");\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <BlankModal\n isOpen={isOpen}\n onClose={onClose}\n closeOnDimmerClick={false}\n width=\"540px\"\n headerText=\"Invite to your network\"\n >\n <Content data-testid=\"scientist-network-invite-modal\">\n <div>\n <EmailDropdown\n options={[]}\n value={emails.map(getOptionFromValue) as any}\n onChange={setEmails}\n setError={setEmailError}\n placeholder=\"Invite by email\"\n formatCreateLabel={(input: string) => `Invite '${input}' to your network`}\n />\n {emailError.length !== 0 && <Error>{emailError}</Error>}\n </div>\n <TextArea\n placeholder=\"Add a message to your invite\"\n rows=\"4\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n />\n <Footer>\n <Error>{submissionError}</Error>\n <Button\n type=\"button\"\n size=\"md\"\n disabled={isSubmitting || emailError.length !== 0 || emails.length === 0}\n onClick={onSubmit}\n >\n Send Invite\n </Button>\n </Footer>\n </Content>\n </BlankModal>\n );\n};\n\nexport default InviteNetworkScientistModal;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 24px 20px;\n`;\n\nconst Error = styled.div`\n ${FONTS.REGULAR_2}\n color: ${COLORS.RED};\n margin-top: 5px;\n`;\n\nconst TextArea = styled.textarea`\n ${FONTS.REGULAR_2}\n width: 100%;\n margin: auto;\n padding: 10px;\n border: 1px solid ${COLORS.NEUTRAL_300};\n border-radius: 6px;\n resize: vertical;\n &::placeholder {\n ${FONTS.REGULAR_2}\n color: ${COLORS.NEUTRAL_500};\n opacity: 1;\n }\n`;\n\nconst Footer = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 4px;\n`;\n","import { Button } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RfpRequestForCard } from \"@tsTypes/index\";\nimport { track } from \"@utils/appUtils\";\nimport styled from \"styled-components\";\n\ninterface Props {\n request: RfpRequestForCard;\n toggleUnsubscribeFromRfp: (\n e: MouseEvent,\n request: RfpRequestForCard,\n isInterested: boolean\n ) => void;\n}\n\nconst UnsubscribedRfpCard = ({ request, toggleUnsubscribeFromRfp }: Props) => {\n return (\n <Container>\n <Heading>We won't contact you with further updates about this opportunity.</Heading>\n <div>\n <Button\n size=\"sm\"\n type=\"button\"\n onClick={(e) => {\n track(SegmentEventName.Click, {\n react_component: \"UnsubscribedRfpCard\",\n ui_component: \"Undo Button\",\n request_slug: request.slug,\n });\n toggleUnsubscribeFromRfp(e, request, true);\n }}\n >\n Undo\n </Button>\n </div>\n </Container>\n );\n};\n\nexport default UnsubscribedRfpCard;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n min-height: 240px;\n background-color: ${COLORS.NEUTRAL_50};\n padding: 24px 24px 16px;\n border-radius: 4px;\n`;\nconst Heading = styled.div`\n ${FONTS.MEDIUM_1}\n margin: 0 0 20px;\n`;\n","import RfpCard from \"@components/RfpCard/RfpCard\";\nimport UnsubscribedRfpCard from \"@components/RfpCard/UnsubscribedRfpCard\";\nimport { BlankModal, Switch } from \"@components/library\";\nimport { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport haloLogo from \"@images/logos/halo_logo.svg\";\nimport {\n fetchRequestForProposalsFromNotification,\n updateNotificationSetting,\n} from \"@requests/notifications\";\nimport { updateUserRequestPreference } from \"@requests/user_request_preferences\";\nimport { account_settings_path } from \"@routes/routes\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { UserRequestPreferenceSource } from \"@tsTypes/__generated__/enums/user_request_preference_source\";\nimport { NotificationSettingsPartial, RfpRequestForCard } from \"@tsTypes/index\";\nimport { track } from \"@utils/appUtils\";\nimport appsignal from \"@utils/appsignal\";\nimport { useEffect, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nconst RfpUnsubscribeModal = ({ onClose, isOpen }: BlankModalProps) => {\n const [searchParams] = useSearchParams();\n const history = useHistory();\n const unsubscribeParam = searchParams.get(\"unsubscribe\") ?? \"\";\n // NOTE: (overload119) nid is signed, whereas _nid is not.\n // In the past we used the signed_id until we discovered bugs related to it in some small % of cases\n // so we added the _nid fallback.\n const notifIdentifierParam = searchParams.get(\"nid\") ?? searchParams.get(\"_nid\") ?? \"\";\n\n const [step, setStep] = useState<\"opportunities\" | \"communication\">(\n unsubscribeParam === \"1\" ? \"opportunities\" : \"communication\"\n );\n const [requestForProposals, setRequestForProposals] = useState([] as RfpRequestForCard[]);\n const [unsubscribedRequestIds, setUnsubscribedRequestIds] = useState<number[]>([]);\n const [userId, setUserId] = useState<number>();\n const [isShadowProfile, setIsShadowProfile] = useState<boolean>(false);\n const [settings, setSettings] = useState<NotificationSettingsPartial>([]);\n\n const handleToggle = async (key, enabled) => {\n try {\n if (!userId) {\n return;\n }\n\n await updateNotificationSetting(userId, key, enabled);\n\n setSettings((prevSettings) => {\n const newSettings = [...prevSettings];\n\n const settingIndex = newSettings.findIndex((setting) => setting.key === key);\n\n newSettings[settingIndex] = {\n ...newSettings[settingIndex],\n enabled,\n };\n\n return newSettings;\n });\n } catch (err) {\n appsignal.sendError(err, (span) => {\n span.setAction(\"RfpUnsubscribeModal#handleToggle\");\n span.setTags({\n notifIdentifierParam,\n enabled,\n key,\n });\n });\n }\n };\n\n const toggleUnsubscribeFromRfp = async (\n e: MouseEvent,\n request: RfpRequestForCard,\n isInterested: boolean\n ) => {\n e.preventDefault();\n\n if (notifIdentifierParam) {\n await updateUserRequestPreference({\n requestId: request.id,\n isInterested,\n source: UserRequestPreferenceSource.PreferenceModal,\n signedNotificationId: notifIdentifierParam,\n });\n }\n\n if (isInterested) {\n setUnsubscribedRequestIds([...unsubscribedRequestIds.filter((id) => id !== request.id)]);\n } else {\n setUnsubscribedRequestIds([...unsubscribedRequestIds, request.id]);\n }\n };\n\n useEffect(() => {\n (async () => {\n if (notifIdentifierParam) {\n const response = await fetchRequestForProposalsFromNotification(notifIdentifierParam);\n\n setIsShadowProfile(response.is_shadow_profile);\n setUserId(response.user_id);\n setSettings(\n response.notification_settings?.filter((setting) => setting.category === \"marketing\")\n );\n\n if (response.request_for_proposals.length) {\n setRequestForProposals(response.request_for_proposals);\n setUnsubscribedRequestIds(\n response.request_for_proposals\n .filter((request) => !request.is_interested)\n .map((request) => request.id)\n );\n } else {\n setStep(\"communication\");\n }\n }\n })();\n }, [notifIdentifierParam]);\n\n if (step === \"communication\") {\n return (\n <BlankModal\n onClose={onClose}\n isOpen={isOpen}\n width={requestForProposals.length === 3 ? \"1316px\" : \"960px\"}\n height=\"100%\"\n >\n <Container>\n <Top>\n <Logo src={haloLogo} alt=\"Halo home\" />\n <HeadingContainer>\n <Subheader>Communication preferences</Subheader>\n <Header>Choose which Halo emails you'd like to receive.</Header>\n </HeadingContainer>\n <OptionContainer>\n {settings.map((setting) => (\n <OptionRow key={setting.key} margin=\"4px 0 0\">\n <Switch\n checked={setting.enabled}\n onChange={() => {\n track(SegmentEventName.Click, {\n react_component: \"RfpUnsubscribeModal\",\n ui_component: \"Communication Preferences Toggle\",\n key: setting.key,\n enabled: !setting.enabled,\n });\n handleToggle(setting.key, !setting.enabled);\n }}\n margin=\"4px 0 0\"\n />\n <div>\n <OptionHeading>{setting.title}</OptionHeading>\n <OptionDescription>{setting.description}</OptionDescription>\n </div>\n </OptionRow>\n ))}\n </OptionContainer>\n </Top>\n <Bottom>\n <StyledButton\n onClick={() => {\n track(SegmentEventName.Click, {\n react_component: \"RfpUnsubscribeModal\",\n ui_component: \"Unsubscribe From All Button\",\n });\n settings.forEach((setting) => handleToggle(setting.key, false));\n }}\n >\n Unsubscribe from all Halo communications\n </StyledButton>\n </Bottom>\n </Container>\n </BlankModal>\n );\n }\n\n return (\n <BlankModal\n onClose={onClose}\n isOpen={isOpen}\n width={requestForProposals.length === 3 ? \"1316px\" : \"960px\"}\n height=\"100%\"\n >\n <Container>\n <Top>\n <Logo src={haloLogo} alt=\"Halo home\" />\n <HeadingContainer>\n <Subheader>Opportunity recommendations</Subheader>\n <Header>Let us know which opportunities you'd prefer not to hear about.</Header>\n </HeadingContainer>\n <CardsContainer columns={requestForProposals.length === 3 ? 3 : 2}>\n {requestForProposals.map((request) =>\n unsubscribedRequestIds.includes(request.id) ? (\n <UnsubscribedRfpCard\n key={request.id}\n request={request}\n toggleUnsubscribeFromRfp={toggleUnsubscribeFromRfp}\n />\n ) : (\n <RfpCard\n key={request.id}\n request={request}\n onClick={(e) => toggleUnsubscribeFromRfp(e, request, false)}\n shouldShowUnsubscribeButton\n />\n )\n )}\n </CardsContainer>\n </Top>\n <Bottom>\n Not interested in hearing about future opportunities? Let us know your\n <StyledButton\n onClick={() => {\n if (isShadowProfile) {\n setStep(\"communication\");\n } else {\n // Logged in users have account settings, so we take them there to control them.\n history.push(account_settings_path({ q: \"notifications\" }));\n }\n track(SegmentEventName.Click, {\n react_component: \"RfpUnsubscribeModal\",\n ui_component: \"Communication Preferences Button\",\n });\n }}\n >\n communication preferences.\n </StyledButton>\n </Bottom>\n </Container>\n </BlankModal>\n );\n};\n\nconst Container = styled.div`\n display: grid;\n grid-template-rows: 1fr auto;\n`;\n\nconst Top = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n\n gap: 40px;\n\n padding: 48px;\n\n box-sizing: border-box;\n`;\n\nconst Logo = styled.img`\n width: 65px;\n height: 32px;\n`;\n\nconst HeadingContainer = styled.div`\n width: 100%;\n`;\n\nconst Header = styled.div`\n color: ${COLORS.BLACK};\n ${FONTS.HEADING_3_REGULAR}\n`;\n\nconst Subheader = styled.div`\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.SEMIBOLD_1}\n`;\n\nconst CardsContainer = styled.div`\n display: grid;\n grid-template-columns: repeat(${({ columns }) => columns}, minmax(0, 1fr));\n grid-gap: 20px;\n\n ${WINDOW_DIMENSIONS.TABLET_LANDSCAPE_MEDIA_QUERY} {\n grid-template-columns: minmax(0, 1fr);\n }\n`;\n\nconst Bottom = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n\n padding: 24px 72px;\n\n border-top: 1px solid ${COLORS.NEUTRAL_300};\n\n ${FONTS.REGULAR_2}\n line-height: 14px;\n gap: 3px;\n`;\n\nconst StyledButton = styled.button`\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n outline: inherit;\n\n ${FONTS.SEMIBOLD_2}\n\n color: ${COLORS.HALO_BLUE};\n\n text-decoration: underline !important;\n text-decoration-color: ${COLORS.BLUE_600} !important;\n -webkit-text-decoration-color: ${COLORS.BLUE_600} !important;\n text-underline-offset: 4px !important;\n\n &:hover {\n color: ${COLORS.BLACK};\n text-decoration-color: ${COLORS.BLACK} !important;\n -webkit-text-decoration-color: ${COLORS.BLACK} !important;\n }\n\n &:focus {\n color: ${COLORS.BLACK};\n text-decoration: none;\n }\n`;\n\nconst OptionContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 34px;\n width: 100%;\n`;\n\nconst OptionRow = styled.div`\n display: flex;\n gap: 11px;\n align-items: flex-start;\n width: 100%;\n`;\n\nconst OptionHeading = styled.div`\n ${FONTS.MEDIUM_1}\n`;\n\nconst OptionDescription = styled.div`\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.REGULAR_2}\n`;\n\nexport default RfpUnsubscribeModal;\n","import { AxiosResponse } from \"axios\";\n\nimport { BlankModalProps } from \"@components/library/ModalBases/BlankModal\";\nimport ShareWithinCompanyModal from \"@components/library/ModalBases/ShareWithinCompanyModal\";\nimport { sponsorShareScientist } from \"@requests/sponsors\";\n\nexport interface SponsorShareScientistModalProps extends BlankModalProps {\n scientist: any;\n}\n\nconst SponsorShareScientistModal = ({\n isOpen,\n onClose,\n scientist,\n}: SponsorShareScientistModalProps) => {\n const handleShare = (email: string, message: string): Promise<AxiosResponse> => {\n const data = {\n scientist_id: scientist.id,\n email,\n message,\n };\n\n return sponsorShareScientist(data);\n };\n\n return (\n <ShareWithinCompanyModal\n isOpen={isOpen}\n onClose={onClose}\n headerText=\"Share Scientist Profile\"\n toastText=\"Scientist profile shared successfully\"\n handleShare={handleShare}\n />\n );\n};\n\nexport default SponsorShareScientistModal;\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\n\nimport { Button, Tabs, Tag, UserPreview } from \"@components/library\";\nimport SlideModalBase, { SlideModalBaseProps } from \"@components/library/ModalBases/SlideModalBase\";\nimport { COLORS, FONTS } from \"@constants\";\nimport SponsorShareScientistModal from \"../SponsorShareScientistModal\";\nimport {\n PositionInfo,\n useFundings,\n usePatents,\n useProposals,\n usePublications,\n useScientist,\n} from \"./hooks\";\n\nimport ScientistContribution from \"@components/ScientistContribution\";\nimport { RootState } from \"@redux/store\";\nimport { t } from \"@utils/i18n\";\nimport { useSelector } from \"react-redux\";\nimport { NetworkScientist } from \"src/views/ScientistNetwork/ScientistNetwork\";\n\ninterface Props extends SlideModalBaseProps {\n scientistUserId: number | undefined;\n sendMessage?: (scientist: NetworkScientist) => void;\n addToNetwork?: (scientist: NetworkScientist) => void;\n forUniversityProposalLibrary?: boolean;\n}\n\nconst ScientistQuickViewModal = ({\n isOpen,\n onClose,\n scientistUserId,\n sendMessage,\n addToNetwork,\n forUniversityProposalLibrary = false,\n}: Props) => {\n if (!isOpen || !scientistUserId) return null;\n\n const [activeTab, setActiveTab] = useState(\"\");\n const [isShareModalOpen, setIsShareModalOpen] = useState(false);\n\n const { scientist, about, positions, isScientistLoading } = useScientist(scientistUserId);\n const publications = usePublications(scientist?.profile_info.id).publications;\n const fundings = useFundings(scientist?.profile_info.id).fundings;\n const patents = usePatents(scientist?.profile_info.id).patents;\n const proposals = useProposals(scientist?.profile_info.id, forUniversityProposalLibrary);\n\n const windowHeight = useSelector((state: RootState) => state.window.height);\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const visibleTabs = useMemo(\n () =>\n [\n {\n label: \"Publications\",\n data: publications,\n },\n {\n label: \"Funding\",\n data: fundings,\n },\n {\n label: \"Patents\",\n data: patents,\n },\n {\n label: \"Proposals\",\n data: proposals,\n },\n ].filter((tab) => tab.data.length > 0),\n [publications, fundings, patents, proposals]\n );\n\n useEffect(() => {\n setActiveTab(visibleTabs[0]?.label);\n }, [visibleTabs]);\n\n const tabs = visibleTabs.map((tab) => ({\n key: tab.label,\n label: tab.label,\n count: tab.data.length,\n }));\n\n if (!scientist) return null;\n\n return (\n <>\n <SponsorShareScientistModal\n scientist={scientist}\n isOpen={isShareModalOpen}\n onClose={() => setIsShareModalOpen(false)}\n />\n <SlideModalBase isOpen={isOpen} onClose={onClose}>\n <Container data-testid=\"scientist-quick-view-modal\">\n {isScientistLoading ? (\n <Loader active style={{ top: \"30%\" }} />\n ) : (\n <>\n <TopContent>\n {scientist && (\n <UserPreviewContainer>\n <UserPreview size=\"xl\" user={scientist} />\n </UserPreviewContainer>\n )}\n {!forUniversityProposalLibrary && (\n <Buttons>\n {!scientist.is_in_network && (\n <Button\n type=\"button\"\n size=\"sm\"\n iconName=\"Invite\"\n disabled={isScientistLoading}\n margin=\"0 10px 0 0\"\n onClick={() => addToNetwork?.(scientist)}\n >\n {t(\"components.buttons.add_to_network\")}\n </Button>\n )}\n {!currentUser.profile_info.commenter && (\n <Button\n type=\"button\"\n size=\"sm\"\n iconName=\"Message\"\n margin=\"0 10px 0 0\"\n onClick={() => sendMessage?.(scientist)}\n data-testid=\"sci-net-slideout-message-button\"\n >\n Message\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n iconName=\"Share\"\n margin=\"0 10px 0 0\"\n onClick={() => setIsShareModalOpen(true)}\n data-testid=\"sci-net-slideout-share-button\"\n >\n Share Profile\n </Button>\n </Buttons>\n )}\n </TopContent>\n <ScrollContainer>\n <About data-testid=\"about\">{about}</About>\n <Keywords>\n {scientist.keywords.map((keyword) => (\n <Tag\n key={`keyword-${keyword}`}\n content={keyword}\n size=\"sm\"\n theme=\"neutral\"\n data-testid=\"keyword-tag\"\n />\n ))}\n </Keywords>\n {positions.length > 0 && (\n <Position.Container>\n Positions:\n {positions.map(\n (position: PositionInfo) =>\n position.location && (\n <Position.IndividualContainer key={`position-${position.id}`}>\n <Position.Title>{position.location}</Position.Title>\n <div>\n {position.title ?? <Position.Note>(No title provided)</Position.Note>}\n </div>\n {position.duration ?? <Position.Note>(No date provided)</Position.Note>}\n </Position.IndividualContainer>\n )\n )}\n </Position.Container>\n )}\n <Tabs\n activeTab={activeTab}\n setActiveTab={setActiveTab}\n tabs={tabs}\n margin=\"0 0 24px\"\n />\n {visibleTabs.map((tab) => (\n <TabPanel\n isActive={activeTab === tab.label}\n key={`tabpanel-${tab.label}`}\n windowHeight={windowHeight}\n >\n {tab.data.map(\n (attachment) =>\n activeTab === tab.label && (\n <ScientistContribution key={attachment.id} contribution={attachment} />\n )\n )}\n </TabPanel>\n ))}\n </ScrollContainer>\n </>\n )}\n </Container>\n </SlideModalBase>\n </>\n );\n};\n\nexport default ScientistQuickViewModal;\n\nconst Container = styled.div`\n ${FONTS.REGULAR_2};\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 622px;\n`;\n\nconst TopContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 50px 24px 24px 24px;\n`;\n\nconst UserPreviewContainer = styled.div`\n margin-right: 48px;\n`;\n\nconst Buttons = styled.div`\n display: flex;\n margin: 6px 0;\n`;\n\nconst ScrollContainer = styled.div`\n height: 100%;\n padding-left: 24px;\n padding-right: 24px;\n overflow-x: hidden;\n overflow-y: auto;\n`;\n\nconst About = styled.div`\n margin-bottom: 20px;\n`;\n\nconst Keywords = styled.div`\n margin-bottom: 40px;\n line-height: 30px;\n`;\n\nconst Position = {\n Container: styled.div`\n margin-bottom: 40px;\n `,\n IndividualContainer: styled.div`\n margin-top: 14px;\n `,\n Title: styled.div`\n ${FONTS.SEMIBOLD_2};\n `,\n Note: styled.span`\n color: ${COLORS.NEUTRAL_400};\n `,\n};\n\nconst TabPanel = styled.div`\n display: ${({ isActive }) => (isActive ? \"flex\" : \" none\")};\n flex-direction: column;\n gap: 8px;\n // 242px is the height of the top non-scrolling section and 53px is the height of the tabs\n min-height: ${({ windowHeight }) => windowHeight - 242 - 53}px;\n ${FONTS.REGULAR_2};\n & > div {\n margin-top: 0 !important;\n & > div {\n padding-top: 0 !important;\n }\n }\n`;\n","export const MAX_KEYWORD_DISPLAY_COUNT = 10;\n","export const USER_ROLES = {\n scientist: 0,\n sponsor: 1,\n university_admin: 2,\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useHistory, useLocation } from \"react-router-dom\";\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n *\n * Adapted from react-router-dom v6\n */\nconst createSearchParams = (init) => {\n return new URLSearchParams(\n typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams\n ? init\n : Object.keys(init).reduce((memo: any, key) => {\n const value = init[key];\n return memo.concat(Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]);\n }, [])\n );\n};\n\n// Wrapper for reading and writing search parameters\n// Setter can either take an key-value object or a URLSearchParams instance\n// Will be replaced by react-router v6 eventually\n// Adapted from react-router-dom v6\nexport const useSearchParams = (): [URLSearchParams, (nextInit: object) => void] => {\n const { search } = useLocation();\n const history = useHistory();\n const searchParams = useMemo(() => new URLSearchParams(search), [search]);\n const setSearchParams = useCallback(\n (nextInit) => {\n const newSearchParams = createSearchParams(nextInit);\n history.push({ search: newSearchParams.toString() });\n },\n [history]\n );\n\n return [searchParams, setSearchParams];\n};\n\n// Custom hook to parse query string of current page\n// Usage: const queryParams = useQueryParams(); query.get(\"param_name\");\n/**\n * @deprecated Use `useSearchParams` instead\n */\nexport const useQueryParams = () => {\n const { search } = useLocation();\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import toast from \"@components/Toast/Toast\";\nimport { useSearchParams } from \"@hooks/router\";\nimport { setCurrentUser, toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { followRequest } from \"@requests/userFollowedRequests\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { toastErrorHandler } from \"@utils/requests\";\nimport { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\n\nconst NOTIFY_SEARCH_PARAM = \"notify\";\n\nconst useFollowRequest = (requestId: number, shouldSkipFollowOnRedirect = false) => {\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const dispatch = useDispatch();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const isUserFollowing = (currentUser.profile_info.followed_request_ids ?? []).includes(requestId);\n\n const { mutate, isLoading } = useMutation({\n mutationFn: () => followRequest(requestId),\n onSuccess: (followedRequest) => {\n dispatch(\n setCurrentUser({\n ...currentUser,\n profile_info: {\n ...currentUser.profile_info,\n followed_request_ids: [\n ...currentUser.profile_info.followed_request_ids,\n followedRequest.id,\n ],\n },\n })\n );\n\n toast.success(\n <p>\n You'll be notified when applications open for {followedRequest.title}.{\" \"}\n <Link to=\"/account/?q=following\" style={{ textDecoration: \"underline\", color: \"white\" }}>\n View your followed opportunities.\n </Link>\n </p>\n );\n },\n onError: toastErrorHandler,\n });\n\n useEffect(() => {\n if (\n searchParams.get(NOTIFY_SEARCH_PARAM) === String(requestId) &&\n currentUser.id &&\n !isUserFollowing &&\n !shouldSkipFollowOnRedirect\n ) {\n mutate({});\n searchParams.delete(NOTIFY_SEARCH_PARAM);\n setSearchParams(searchParams);\n }\n }, []);\n\n const handleFollowRequest = () => {\n if (currentUser.role === UserRole.SPONSOR || isUserFollowing || isLoading) {\n return;\n }\n\n if (currentUser.id) {\n mutate({});\n } else {\n searchParams.set(\"notify\", String(requestId));\n setPrevUrlCookie(window.location.pathname + \"?\" + searchParams.toString());\n dispatch(toggleLoginModal({ open: true }));\n }\n };\n\n return { handleFollowRequest, isUserFollowing };\n};\n\nexport default useFollowRequest;\n","import { useEffect, DependencyList } from \"react\";\n\ndeclare global {\n interface Window {\n __hsWebInteractiveInstance: any;\n }\n}\n\n/**\n * This is a hook meant to workaround the limitation in the Hubspot tracking code on SPAs.\n * Hubspot expects pages to be static HTML so this reattaches the event listeners\n * whenever a component re-renders.\n *\n * As of Jan 17 2024, this seems to have the most details around this issue.\n * https://community.hubspot.com/t5/APIs-Integrations/Force-CTA-Scripts-to-Run-on-History-Change-for-single-page/m-p/879567#M69070\n */\nexport function useHubspotCTAs(dependencies: DependencyList): void {\n return useEffect(() => {\n window.__hsWebInteractiveInstance?.init();\n }, dependencies);\n}\n","import { useEffect, useRef } from \"react\";\n\n// Utility hook to indicate whether the current render is the first render\n// Used for skipping first render for certain useEffect hooks\nexport const useIsMount = (): boolean => {\n const isMountRef = useRef(true);\n\n useEffect(() => {\n isMountRef.current = false;\n }, []);\n\n return isMountRef.current;\n};\n","import appsignal from \"@utils/appsignal\";\nimport isEqual from \"lodash/isEqual\";\nimport { useEffect, useState } from \"react\";\n\n/**\n * Custom hook for managing data in localStorage\n * @param key The localStorage key to store the data under\n * @param initialValue The initial value to use if no value is found in localStorage\n * @returns A tuple containing the current value and a function to update it\n *\n * @example\n * // Store a simple string\n * const [name, setName] = useLocalStorage('userName', '');\n *\n * @example\n * // Store an object\n * const [settings, setSettings] = useLocalStorage('userSettings', {\n * theme: 'light',\n * notifications: true\n * });\n *\n * @example\n * // Update with callback function\n * const [counter, setCounter] = useLocalStorage('counter', 0);\n * setCounter(prev => prev + 1);\n */\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T\n): [T, (value: T | ((val: T) => T)) => void] {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Get from local storage by key\n const item = window.localStorage.getItem(key);\n // Parse stored json or if none return initialValue\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n // If error also return initialValue\n appsignal.sendError(error, (span) => {\n span.setAction(\"useLocalStorage#initialize\");\n span.setTags({\n key,\n });\n });\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that\n // persists the new value to localStorage.\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n } catch (error) {\n appsignal.sendError(error, (span) => {\n span.setAction(\"useLocalStorage#setValue\");\n span.setTags({\n key,\n });\n });\n }\n };\n\n // Update local storage if the key changes\n useEffect(() => {\n try {\n const item = window.localStorage.getItem(key);\n if (item) {\n const parsedItem = JSON.parse(item);\n if (!isEqual(parsedItem, storedValue)) {\n setStoredValue(parsedItem);\n }\n } else if (storedValue !== initialValue) {\n // If no item in storage, reset to initial value\n setStoredValue(initialValue);\n }\n } catch (error) {\n appsignal.sendError(error, (span) => {\n span.setAction(\"useLocalStorage#useEffect\");\n span.setTags({\n key,\n });\n });\n }\n }, [key, initialValue]);\n\n // Add cross-tab synchronization\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(event.newValue ? JSON.parse(event.newValue) : initialValue);\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n\nexport default useLocalStorage;\n","import { getSSOEmailDomains } from \"@requests/sso\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { getPrevUrlCookie } from \"@utils/authUtils\";\nimport { Dispatch, SetStateAction, useEffect, useState } from \"react\";\n\nconst useSSOSensitiveEmail = (\n initialValue = \"\"\n): {\n email: string;\n setEmail: Dispatch<SetStateAction<string>>;\n isEmailSSOEnabled: boolean;\n redirectToSSO: () => void;\n} => {\n const [email, setEmail] = useState(initialValue);\n const [domains, setDomains] = useState<string[]>([]);\n const [excludedEmails, setExcludedEmails] = useState<string[]>([]);\n const [isEmailSSOEnabled, setIsEmailSSOEnabled] = useState(false);\n\n useEffect(() => {\n let isAborted = false;\n const abortController = new AbortController();\n\n (async () => {\n const data = await getSSOEmailDomains(abortController.signal);\n if (!isAborted) {\n setDomains(data.email_domains);\n setExcludedEmails(data.excluded_emails);\n }\n })();\n\n return () => {\n isAborted = true;\n abortController.abort();\n };\n }, []);\n\n useEffect(() => {\n const emailParts = email.split(\"@\");\n setIsEmailSSOEnabled(\n emailParts.length > 1 &&\n domains.includes(emailParts[emailParts.length - 1]) &&\n !excludedEmails.includes(email.toLowerCase())\n );\n }, [email, domains]);\n\n const redirectToSSO = () => {\n const prevUrl = getPrevUrlCookie(\"/\", true, UserRole.SPONSOR, false);\n window.location.href =\n `/sso/redirect?email=${email}` + (prevUrl ? `&prev_url=${encodeURIComponent(prevUrl)}` : \"\");\n };\n\n return {\n email,\n setEmail,\n isEmailSSOEnabled,\n redirectToSSO,\n };\n};\n\nexport { useSSOSensitiveEmail };\n","import appsignal from \"@utils/appsignal\";\nimport request from \"./request\";\n\nexport const getSSOEmailDomains = async (\n abortSignal?: AbortSignal\n): Promise<{\n email_domains: string[];\n excluded_emails: string[];\n}> => {\n try {\n const response = await request.get(\"/sso/email_domains\", { signal: abortSignal });\n if (!response) {\n return {\n email_domains: [],\n excluded_emails: [],\n };\n }\n return response.data;\n } catch (err) {\n if (err?.code !== \"ECONNABORTED\" && err?.message !== \"canceled\") {\n appsignal.sendError(err, (span) => {\n span.setAction(\"sso#getSSOEmailDomains\");\n });\n }\n return {\n email_domains: [],\n excluded_emails: [],\n };\n }\n};\n","import { payloadActionGenerator } from \"@utils/redux\";\n\nexport const SET_SHOULD_SHOW_PRODUCT_TOURS = \"SET_SHOULD_SHOW_PRODUCT_TOURS\";\nexport const SET_IS_ABSOLUTE = \"SET_IS_ABSOLUTE\";\n\nexport const setShouldShowProductTours = payloadActionGenerator(SET_SHOULD_SHOW_PRODUCT_TOURS);\nexport const setIsAbsolute = payloadActionGenerator(SET_IS_ABSOLUTE);\n","import { getMostRecentSubscription } from \"@requests/subscriptions\";\nimport { payloadActionGenerator } from \"@utils/redux\";\nimport { getCompanyMembers } from \"src/requests/sponsors\";\n\nexport const LOAD_SUBSCRIPTION = \"LOAD_SUBSCRIPTION\";\nexport const SET_SUBSCRIPTION = \"SET_SUBSCRIPTION\";\nexport const LOAD_PROPOSALS = \"LOAD_PROPOSALS\";\nexport const SET_REVIEWER_DASHBOARD_RFP = \"SET_REVIEWER_DASHBOARD_RFP\";\nexport const SET_PROPOSAL_DASHBOARD_RFP = \"SET_PROPOSAL_DASHBOARD_RFP\";\nexport const LOAD_USER_FOLLOW = \"LOAD_USER_FOLLOW\";\nexport const SET_USER_FOLLOW = \"SET_USER_FOLLOW\";\nexport const LOAD_COMPANY_MEMBERS = \"LOAD_COMPANY_MEMBERS\";\nexport const SET_COMPANY_MEMBERS = \"SET_COMPANY_MEMBERS\";\nexport const LOADING_MESSAGES = \"LOADING_MESSAGES\";\nexport const SET_MESSAGES = \"SET_MESSAGES\";\nexport const SET_VIEW_AS_COMPANY_SUPER_ADMIN = \"SET_VIEW_AS_COMPANY_SUPER_ADMIN\";\nexport const SET_PROPOSAL_AS_SEEN = \"SET_PROPOSAL_AS_SEEN\";\n\nexport const loadSubscription = payloadActionGenerator(LOAD_SUBSCRIPTION);\nexport const setSubscription = payloadActionGenerator(SET_SUBSCRIPTION);\nexport const loadProposals = payloadActionGenerator(LOAD_PROPOSALS);\nexport const setProposalDashboardRequest = payloadActionGenerator(SET_PROPOSAL_DASHBOARD_RFP);\nexport const loadUserFollow = payloadActionGenerator(LOAD_USER_FOLLOW);\nexport const setUserFollow = payloadActionGenerator(SET_USER_FOLLOW);\nexport const loadCompanyMembers = payloadActionGenerator(LOAD_COMPANY_MEMBERS);\nexport const setCompanyMembers = payloadActionGenerator(SET_COMPANY_MEMBERS);\nexport const loadingMessages = payloadActionGenerator(LOADING_MESSAGES);\nexport const setMessages = payloadActionGenerator(SET_MESSAGES);\nexport const setViewAsCompanySuperAdmin = payloadActionGenerator(SET_VIEW_AS_COMPANY_SUPER_ADMIN);\nexport const setProposalAsSeen = payloadActionGenerator(SET_PROPOSAL_AS_SEEN);\n\nexport const fetchSubscription = (companyIdentifier) => {\n return async (dispatch) => {\n const subscription = await getMostRecentSubscription(companyIdentifier);\n\n dispatch(setSubscription(subscription));\n\n return subscription;\n };\n};\n\nexport const fetchAllCompanyMembers = (companyId) => {\n return async (dispatch) => {\n dispatch(loadCompanyMembers());\n\n const { sponsor_users } = await getCompanyMembers(companyId);\n dispatch(setCompanyMembers(sponsor_users));\n\n return sponsor_users;\n };\n};\n","import toast from \"@components/Toast/Toast\";\nimport { ShowSubscription } from \"@tsTypes/subscriptions/show\";\nimport appsignal from \"@utils/appsignal\";\nimport api from \"./request\";\n\nexport const getMostRecentSubscription = async (\n companyIdentifier: string\n): Promise<ShowSubscription | null> => {\n try {\n const response = await api.get(`/subscriptions/${companyIdentifier}`);\n return response.data.subscription;\n } catch (error) {\n switch (error.response.status) {\n case 404:\n return null;\n default:\n toast.error(\"Could not fetch company subscription data.\");\n appsignal.sendError(error, (span) => {\n span.setAction(\"getCurrentSubscription\");\n span.setTags({\n companyIdentifier,\n });\n });\n return null;\n }\n }\n};\n","import { marketplacePath } from \"@routes/utils\";\nimport { payloadActionGenerator } from \"@utils/redux\";\nimport axios from \"axios\";\nimport api from \"src/requests/request\";\n\nexport const SHOW_ERROR_BOUNDARY = \"SHOW_ERROR_BOUNDARY\";\nexport const ADD_FILTER = \"ADD_FILTER\";\nexport const REMOVE_FILTER = \"REMOVE_FILTER\";\nexport const SEARCH_TERM = \"SEARCH_TERM\";\nexport const SET_FOLLOWED_REQUESTS_INFO = \"SET_FOLLOWED_REQUESTS_INFO\";\nexport const UPDATE_RESULT_LIST = \"UPDATE_RESULT_LIST\";\nexport const LOAD_CURRENT_RFP = \"LOAD_CURRENT_RFP\";\nexport const UPDATE_CURRENT_RFP = \"UPDATE_CURRENT_RFP\";\nexport const SET_CURRENT_COMPANY = \"SET_CURRENT_COMPANY\";\nexport const LOADING_CURRENT_COMPANY = \"LOADING_CURRENT_COMPANY\";\nexport const SET_COMPANIES = \"SET_COMPANIES\";\nexport const SET_FOUNDATIONS = \"SET_FOUNDATIONS\";\nexport const SET_GOVERNMENT_ORGANIZATIONS = \"SET_GOVERNMENT_ORGANIZATIONS\";\nexport const SET_LOAD_COMPANY_PARTNER = \"SET_LOAD_COMPANY_PARTNER\";\nexport const SET_LOAD_COMPANY_INTEREST = \"SET_LOAD_COMPANY_INTEREST\";\nexport const SET_COMPANY_INTEREST = \"SET_COMPANY_INTEREST\";\nexport const SET_COMPANY_INFO = \"SET_COMPANY_INFO\";\nexport const SET_LOAD_COMPANY_INFO = \"SET_LOAD_COMPANY_INFO\";\nexport const LOAD_DELETE_COMPANY_INTEREST_PARTNER = \"LOAD_DELETE_COMPANY_INTEREST_PARTNER\";\nexport const SET_INVITED_USERS = \"SET_INVITED_USERS\";\nexport const SET_LOAD_INVITED_USERS = \"SET_LOAD_INVITED_USERS\";\nexport const SET_UNIVERSITY_TEAM_MEMBERS = \"SET_UNIVERSITY_TEAM_MEMBERS\";\nexport const SET_COMPANY_LOGO = \"SET_COMPANY_LOGO\";\nexport const SET_COMPANY_VIDEO = \"SET_COMPANY_VIDEO\";\nexport const SET_LAST_VIEWED_RFP_IDENTIFIER = \"SET_LAST_VIEWED_RFP_IDENTIFIER\";\n\nexport const setShowErrorBoundary = payloadActionGenerator(SHOW_ERROR_BOUNDARY);\nexport const addFilter = payloadActionGenerator(ADD_FILTER);\nexport const removeFilter = payloadActionGenerator(REMOVE_FILTER);\nexport const searchTerm = payloadActionGenerator(SEARCH_TERM);\nexport const setFollowedRequestsInfo = payloadActionGenerator(SET_FOLLOWED_REQUESTS_INFO);\nexport const updateResultList = payloadActionGenerator(UPDATE_RESULT_LIST);\nexport const loadCurrentRFP = payloadActionGenerator(LOAD_CURRENT_RFP);\nexport const updateCurrentRFP = payloadActionGenerator(UPDATE_CURRENT_RFP);\nexport const setCurrentCompany = payloadActionGenerator(SET_CURRENT_COMPANY);\nexport const setCompanies = payloadActionGenerator(SET_COMPANIES);\nexport const setFoundations = payloadActionGenerator(SET_FOUNDATIONS);\nexport const setGovernmentOrganizations = payloadActionGenerator(SET_GOVERNMENT_ORGANIZATIONS);\nexport const setLoadingCurrentCompany = payloadActionGenerator(LOADING_CURRENT_COMPANY);\nexport const setLoadCompanyPartner = payloadActionGenerator(SET_LOAD_COMPANY_PARTNER);\nexport const setLoadCompanyInterest = payloadActionGenerator(SET_LOAD_COMPANY_INTEREST);\nexport const setCompanyInterest = payloadActionGenerator(SET_COMPANY_INTEREST);\nexport const setCompanyInfo = payloadActionGenerator(SET_COMPANY_INFO);\nexport const setLoadCompanyInfo = payloadActionGenerator(SET_LOAD_COMPANY_INFO);\nexport const loadDeleteCompanyInterestPartner = payloadActionGenerator(\n LOAD_DELETE_COMPANY_INTEREST_PARTNER\n);\nexport const setInvitedUsers = payloadActionGenerator(SET_INVITED_USERS);\nexport const setLoadInvitedUsers = payloadActionGenerator(SET_LOAD_INVITED_USERS);\nexport const setUniversityTeamMembers = payloadActionGenerator(SET_UNIVERSITY_TEAM_MEMBERS);\nexport const setCompanyLogo = payloadActionGenerator(SET_COMPANY_LOGO);\nexport const setCompanyVideo = payloadActionGenerator(SET_COMPANY_VIDEO);\nexport const setLastViewedRFPIdentifier = payloadActionGenerator(SET_LAST_VIEWED_RFP_IDENTIFIER);\n\nexport const loadCompany = (identifier) => {\n return async (dispatch) => {\n dispatch(setLoadingCurrentCompany(true));\n\n try {\n const responseJson = await api.get(`/company_info/${identifier}`);\n\n if (responseJson.data) {\n dispatch(setCurrentCompany(responseJson.data.company));\n dispatch(setLoadingCurrentCompany(false));\n return responseJson.data;\n }\n\n window.location.href = marketplacePath();\n } catch (error) {\n if (error.response.status === 401) {\n const accessCode = prompt(\"Please enter the access code for this page\");\n\n if (accessCode) {\n const responseJson = await api\n .get(`/company_info/${identifier}`, {\n params: {\n access_code: accessCode,\n },\n })\n .catch((secondError) => {\n if (secondError.response.status === 401) {\n alert(\"Incorrect password\");\n window.location.href = marketplacePath();\n } else {\n throw secondError;\n }\n });\n\n if (responseJson?.data.company) {\n dispatch(setCurrentCompany(responseJson.data.company));\n dispatch(setLoadingCurrentCompany(false));\n return responseJson.data.company;\n }\n } else {\n window.location.href = marketplacePath();\n }\n } else {\n throw error;\n }\n }\n };\n};\n\nexport const fetchFollowedRequestsInfo = () => {\n return async (dispatch) => {\n try {\n const responseJson = await axios.get(\"/followed_requests_info\", {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n dispatch(setFollowedRequestsInfo(responseJson.data.followed_requests_info));\n } catch (err) {\n console.log(err);\n }\n };\n};\n\nexport const fetchInvitedUsers = (organizationId, role) => {\n return async (dispatch) => {\n dispatch(setLoadInvitedUsers(true));\n try {\n const responseJson = await api.get(\"/invited_users\", {\n params: {\n organization_id: organizationId,\n role,\n },\n });\n dispatch(setInvitedUsers(responseJson.data));\n } catch (err) {\n dispatch(setLoadInvitedUsers(false));\n }\n dispatch(setLoadInvitedUsers(false));\n };\n};\nexport const fetchUniversityMembers = (university_id) => {\n return async (dispatch) => {\n const responseJson = await axios.get(\n \"/university_team\",\n {\n params: { organization: university_id },\n },\n {\n headers: {\n Accept: \"application/json\",\n },\n }\n );\n dispatch(setUniversityTeamMembers(responseJson.data));\n };\n};\n","import { RootState } from \"@redux/store\";\nimport { getUser } from \"@requests/users\";\nimport { emptyActionGenerator, payloadActionGenerator } from \"@utils/redux\";\nimport { authenticityToken } from \"@utils/requests\";\nimport axios from \"axios\";\nimport { AnyAction } from \"redux\";\nimport { ThunkDispatch } from \"redux-thunk\";\n\nexport const SET_CURRENT_USER = \"SET_CURRENT_USER\";\nexport const LOAD_CURRENT_USER = \"LOAD_CURRENT_USER\";\nexport const SET_PATENTS = \"SET_PATENTS\";\nexport const LOAD_PATENTS = \"LOAD_PATENTS\";\nexport const SET_PUBLICATIONS = \"SET_PUBLICATIONS\";\nexport const LOAD_PUBLICATIONS = \"LOAD_PUBLICATIONS\";\nexport const SET_FUNDINGS = \"SET_FUNDINGS\";\nexport const LOAD_FUNDINGS = \"LOAD_FUNDINGS\";\nexport const TOGGLE_LOGIN_MODAL = \"TOGGLE_LOGIN_MODAL\";\nexport const START_DELETE_PROPOSAL = \"START_DELETE_PROPOSAL\";\nexport const FINISH_DELETE_PROPOSAL = \"FINISH_DELETE_PROPOSAL\";\nexport const LOADING_RESEARCH_INTEREST_FOLLOWS = \"LOADING_RESEARCH_INTEREST_FOLLOWS\";\nexport const UPDATE_RESEARCH_INTEREST_FOLLOWS = \"UPDATE_RESEARCH_INTEREST_FOLLOWS\";\nexport const SET_UNREAD_COUNT = \"SET_UNREAD_COUNT\";\nexport const SET_PROPOSAL_EVAL = \"SET_PROPOSAL_EVAL\";\nexport const UPDATE_PROFILE_IMAGE = \"UPDATE_PROFILE_IMAGE\";\nexport const FINISH_FOLLOW_UNFOLLOW_COMPANY = \"FINISH_FOLLOW_UNFOLLOW_COMPANY\";\n\nexport const setCurrentUser = payloadActionGenerator(SET_CURRENT_USER);\nexport const loadCurrentUser = emptyActionGenerator(LOAD_CURRENT_USER);\nexport const setPatents = payloadActionGenerator(SET_PATENTS);\nexport const loadPatents = emptyActionGenerator(LOAD_PATENTS);\nexport const setPublications = payloadActionGenerator(SET_PUBLICATIONS);\nexport const loadPublications = emptyActionGenerator(LOAD_PUBLICATIONS);\nexport const setFundings = payloadActionGenerator(SET_FUNDINGS);\nexport const loadFundings = emptyActionGenerator(LOAD_FUNDINGS);\nexport const toggleLoginModal = payloadActionGenerator(TOGGLE_LOGIN_MODAL);\nexport const startDeleteProposal = payloadActionGenerator(START_DELETE_PROPOSAL);\nexport const finishDeleteProposal = payloadActionGenerator(FINISH_DELETE_PROPOSAL);\nexport const loadingResearchInterestFollows = payloadActionGenerator(\n LOADING_RESEARCH_INTEREST_FOLLOWS\n);\nexport const updateResearchInterestFollows = payloadActionGenerator(\n UPDATE_RESEARCH_INTEREST_FOLLOWS\n);\nexport const setUnreadCount = payloadActionGenerator(SET_UNREAD_COUNT);\nexport const setProposalEval = payloadActionGenerator(SET_PROPOSAL_EVAL);\nexport const updateProfileImage = payloadActionGenerator(UPDATE_PROFILE_IMAGE);\nexport const finishFollowUnfollowCompany = payloadActionGenerator(FINISH_FOLLOW_UNFOLLOW_COMPANY);\n\nexport const fetchCurrentUser = (fetchFromSession = false) => {\n return async (dispatch: ThunkDispatch<RootState, any, AnyAction>) => {\n dispatch(loadCurrentUser());\n\n if (!gon.current_user_id) {\n dispatch(setCurrentUser({ profile_info: {} }));\n return { profile_info: {} };\n }\n\n const data = await getUser(gon.current_user_id, fetchFromSession);\n const user = data?.user;\n\n if (!user) {\n dispatch(setCurrentUser({ profile_info: {} }));\n return { profile_info: {} };\n }\n\n dispatch(setCurrentUser(user));\n return user;\n };\n};\n\nexport const fetchPatents = (profileInfoId: number) => {\n return async (dispatch) => {\n dispatch(loadPatents());\n\n const responseJson = await axios.get(`/patents?profile_info_id=${profileInfoId}`, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n dispatch(setPatents(responseJson.data.patents));\n\n return responseJson.data.patents;\n };\n};\n\nexport const fetchPublications = (profileInfoId: number) => {\n return async (dispatch) => {\n dispatch(loadPublications());\n\n const responseJson = await axios.get(`/publications?profile_info_id=${profileInfoId}`, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n dispatch(setPublications(responseJson.data.publications));\n\n return responseJson.data.publications;\n };\n};\n\nexport const fetchFundings = (profileInfoId: number) => {\n return async (dispatch) => {\n dispatch(loadFundings());\n\n const responseJson = await axios.get(`/fundings?profile_info_id=${profileInfoId}`, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n dispatch(setFundings(responseJson.data.fundings));\n\n return responseJson.data.fundings;\n };\n};\n\nexport const deleteProposal = (proposalId) => {\n return async (dispatch) => {\n dispatch(startDeleteProposal());\n const url = `/proposals/${proposalId}`;\n\n try {\n await axios.delete(url, {\n headers: {\n \"X-CSRF-Token\": authenticityToken() as any,\n Accept: \"application/json\",\n },\n });\n\n dispatch(finishDeleteProposal({ proposalId }));\n } catch (err) {\n dispatch(finishDeleteProposal());\n }\n };\n};\n\nexport const checkUnread = () => {\n return async (dispatch) => {\n const responseJson = await axios.get(`/check_unread`);\n dispatch(setUnreadCount(responseJson.data.unread_count));\n };\n};\n","import { WINDOW_DIMENSIONS } from \"@constants\";\n\nconst { DESKTOP, MOBILE, TABLET, TABLET_LANDSCAPE } = WINDOW_DIMENSIONS;\n\nexport const UPDATE_WINDOW_DIMENSION = \"UPDATE_WINDOW_DIMENSION\";\n\nexport const updateWindowDimension = () => (dispatch) =>\n dispatch({\n type: UPDATE_WINDOW_DIMENSION,\n payload: {\n width: window.innerWidth,\n height: window.innerHeight,\n isMobile: window.innerWidth <= MOBILE,\n isTablet: window.innerWidth <= TABLET,\n isDesktop: window.innerWidth >= DESKTOP,\n isTabletLandscape: window.innerWidth <= TABLET_LANDSCAPE,\n },\n });\n","import { getCookie } from \"@utils/requests\";\nimport request from \"./request\";\n\nconst PORTAL_ID = \"6895929\";\n\n// https://legacydocs.hubspot.com/docs/methods/forms/submit_form\nexport const submitForm = async (formId, fields) =>\n request.post(`https://api.hsforms.com/submissions/v3/integration/submit/${PORTAL_ID}/${formId}`, {\n fields,\n context: {\n hutk: getCookie(\"hubspotutk\"),\n },\n });\n\n// track registration\nexport const trackRegistration = async (userInfo) => {\n const { email, first_name, last_name, role } = userInfo;\n\n // Scientist Registration\n let formId = \"5fb3e11f-bf56-4b75-9a0b-632e5888e33f\";\n\n if (role === 1) {\n // Sponsor Registration\n formId = \"de8f6135-4e40-4d48-9b48-b5dcd36fd945\";\n } else if (role === 2) {\n // University Admin Registration\n formId = \"9091aea2-ed31-496e-97ee-eed2ff1f6b95\";\n }\n\n if (\n window.location.host.includes(\"halocures.com\") ||\n window.location.host.includes(\"halo.science\")\n ) {\n try {\n const fields = [\n { name: \"email\", value: email },\n { name: \"firstname\", value: first_name },\n { name: \"lastname\", value: last_name },\n ];\n\n await submitForm(formId, fields);\n } catch (err) {\n console.error(err);\n }\n }\n};\n\nexport const sponsorOnboarded = async (userInfo) => {\n const { email } = userInfo;\n\n // Sponsor Registration\n const formId = \"de8f6135-4e40-4d48-9b48-b5dcd36fd945\";\n\n if (\n window.location.host.includes(\"halocures.com\") ||\n window.location.host.includes(\"halo.science\")\n ) {\n try {\n const fields = [{ name: \"email\", value: email }];\n\n await submitForm(formId, fields);\n } catch (err) {\n console.error(err);\n }\n }\n};\n","import { request_for_proposals_notification_path } from \"@routes/routes\";\nimport {\n NotificationRfpsResponse,\n NotificationSettingsShowResponse,\n NotificationUserInfoResponse,\n} from \"@tsTypes/index\";\nimport api from \"./request\";\n\nexport const fetchNotificationSettings = async (\n userId: number\n): Promise<NotificationSettingsShowResponse> => {\n const responseJson = await api.get(`/notification_settings/${userId}`);\n return responseJson.data;\n};\n\nexport const updateNotificationSetting = async (userId: number, key: string, enabled: boolean) => {\n await api.patch(`/notification_settings/${userId}`, {\n key: key,\n enabled: enabled,\n });\n};\n\nexport const fetchUserInfoFromNotification = async (\n notificationId: string\n): Promise<NotificationUserInfoResponse> => {\n const responseJson = await api.get(`/notifications/${notificationId}/user_info`);\n return responseJson.data;\n};\n\nexport const fetchRequestForProposalsFromNotification = async (\n notificationId: string\n): Promise<NotificationRfpsResponse> => {\n const responseJson = await api.get(request_for_proposals_notification_path(notificationId));\n return responseJson.data;\n};\n","import { ReviewerDashboardRequest, RfpPageResponse, RfpsShowResponse } from \"@tsTypes/index\";\nimport { RfpPartnershipModel } from \"@tsTypes/rfps\";\nimport { stringArrayToBulletText } from \"@utils/textUtils\";\nimport { RfpSubmitData } from \"src/views/RfpRequestForm/RfpRequestForm\";\nimport request from \"./request\";\n\nexport const getRfpForRfpPage = async (\n slug: string,\n accessCode?: string | null\n): Promise<RfpPageResponse> => {\n const response = await request.get(`/rfps/${slug}`, {\n params: {\n for_rfp_page: true,\n access_code: accessCode,\n },\n });\n\n return response.data;\n};\n\nexport const getRequestForProposalByRequestId = async (\n requestId: number\n): Promise<RfpsShowResponse | null> => {\n try {\n const response = await request.get(`/rfps/${requestId}`, {\n params: { by_id: true },\n });\n\n return response.data;\n } catch {\n return null;\n }\n};\n\nexport const getRfpByRequestSlug = async (requestSlug: string): Promise<RfpsShowResponse> => {\n const response = await request.get(`/rfps/${requestSlug}`);\n return response.data;\n};\n\nexport const createOrUpdateRfp = async (\n rfpData: RfpSubmitData\n): Promise<ReviewerDashboardRequest | null> => {\n let response: { data: ReviewerDashboardRequest };\n\n const formattedData = {\n is_private: rfpData.isPrivate,\n company_research_interest_id: rfpData.areaOfInterestId,\n title: rfpData.title,\n background: rfpData.background,\n looking_for: rfpData.lookingFor,\n request_solutions: rfpData.requestSolutions,\n request_requirements: rfpData.requestRequirements.map((req) => ({\n description: req.description,\n allow_attachments: req.allowAttachments,\n })),\n preferred_requirements: stringArrayToBulletText(rfpData.niceToHaveRequirements),\n out_of_scope: stringArrayToBulletText(rfpData.outOfScope),\n disciplines: rfpData.disciplines,\n areas_of_expertise: rfpData.areasOfExpertise,\n partnership_models: rfpData.partnershipModels,\n trl_range: rfpData.trlRange,\n sponsored_research: rfpData.partnershipModels?.includes(RfpPartnershipModel.SPONSORED_RESEARCH)\n ? rfpData.sponsoredResearch\n : \"\",\n gift: rfpData.partnershipModels?.includes(RfpPartnershipModel.GIFT) ? rfpData.gift : \"\",\n expertise: rfpData.expertise,\n tools_and_technology: rfpData.toolsAndTechnology,\n compounds_and_reagents: rfpData.compoundsAndReagents,\n facilities_and_services: rfpData.facilitiesAndServices,\n data: rfpData.data,\n market_access: rfpData.marketAccess,\n networking: rfpData.networking,\n submitted: rfpData.isSubmitted,\n visible_on_marketplace: !rfpData.forInternalEmployees && rfpData.visibleOnMarketplace,\n visible_on_company_page: !rfpData.forInternalEmployees && rfpData.visibleOnCompanyPage,\n visible_on_notification_campaign:\n !rfpData.forInternalEmployees && rfpData.visibleOnNotificationCampaign,\n has_access_code: rfpData.forInternalEmployees || rfpData.hasAccessCode,\n for_internal_employees: rfpData.forInternalEmployees,\n partner_types: rfpData.partnerTypes,\n };\n\n Object.keys(formattedData).forEach((key) => {\n if (typeof formattedData[key] === \"string\") {\n formattedData[key] = formattedData[key].trim();\n }\n });\n\n try {\n if (rfpData.id) {\n response = await request.put(`/rfps/${rfpData.id}`, {\n rfp: formattedData,\n });\n } else {\n response = await request.post(`/rfps`, {\n rfp: formattedData,\n });\n }\n\n return response.data;\n } catch (_) {\n return null;\n }\n};\n\nexport const exportRequestForProposal = (rfpId, rfpIdentifier) => {\n request\n .get(`/rfps/export/${rfpId}.docx`, {\n headers: {\n Accept: \"application/octet-stream\",\n },\n responseType: \"blob\",\n })\n .then((response) => {\n if (response.status !== 200) {\n return;\n }\n\n const url = window.URL.createObjectURL(\n new Blob([response.data], {\n type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n })\n );\n\n const link = document.createElement(\"a\");\n link.href = url;\n link.setAttribute(\"download\", `${rfpIdentifier}.docx`);\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n });\n};\n\nexport const joinRfpWaitlist = async (\n requestId: number,\n {\n email,\n firstName,\n lastName,\n }: {\n email?: string;\n firstName?: string;\n lastName?: string;\n }\n): Promise<void> => {\n const response = await request.post(`/rfps/${requestId}/waitlist`, {\n email,\n first_name: firstName,\n last_name: lastName,\n });\n\n return response.data;\n};\n","import toast from \"@components/Toast\";\nimport {\n company_network_scientists_path,\n search_suggest_company_network_scientists_path,\n} from \"@routes/routes\";\nimport { ConnectionType } from \"@tsTypes/__generated__/enums/connection_type\";\nimport { CompanyNetworkScientistsIndexResponse } from \"@tsTypes/company_network_scientists\";\nimport {\n CompanyMember,\n SponsorProfilesIndexResponse,\n SponsorTeamMembersResponse,\n UpdatePendingReviewTeamMembershipStatusResponse,\n UpgradeToSuperAdminResponse,\n} from \"@tsTypes/index\";\nimport appsignal from \"@utils/appsignal\";\nimport { AxiosResponse } from \"axios\";\nimport request from \"./request\";\n\nexport const getCompanyMembers = async (\n companyId: number\n): Promise<SponsorProfilesIndexResponse> => {\n const response = await request.get(\"/sponsor_profiles\", {\n params: {\n company_id: companyId,\n },\n });\n\n return response.data;\n};\n\nexport const getFilteredCompanyMembers = async (\n options: {\n keywordFilter: string[];\n companyRoleFilter: string[];\n requestRoleFilter: string[];\n },\n abortSignal: AbortSignal\n): Promise<SponsorTeamMembersResponse> => {\n try {\n const response = await request.get(\"/sponsor_profiles/sponsor_team_members\", {\n signal: abortSignal,\n params: {\n options: {\n keyword_filter: options.keywordFilter,\n company_role_filter: options.companyRoleFilter,\n request_role_filter: options.requestRoleFilter,\n },\n },\n });\n\n return response.data;\n } catch (error) {\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#getFilteredCompanyMembers\");\n span.setTags({\n options: JSON.stringify(options),\n });\n });\n return {\n members: [],\n count: 0,\n };\n }\n};\n\nexport const getSponsorTeamKeywordOptions = async (): Promise<{\n areas_of_expertise: string[];\n}> => {\n try {\n const response = await request.get(\"/sponsor_profiles/sponsor_team_keyword_options\");\n return response.data.keyword_options;\n } catch (error) {\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#getSponsorTeamKeywordOptions\");\n });\n return {\n areas_of_expertise: [],\n };\n }\n};\n\nexport const upgradeToPremium = async (userId: number): Promise<CompanyMember | null> => {\n try {\n const response = await request.post(\"/company_roles/upgrade_to_premium\", {\n user_id: userId,\n });\n return response.data;\n } catch (error) {\n toast.error(error.response.data.error);\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#upgradeToPremium\");\n span.setTags({\n userId: userId.toString(),\n });\n });\n return null;\n }\n};\n\nexport const upgradeToStandardLicense = async (userId: number): Promise<CompanyMember | null> => {\n try {\n const response = await request.post(\"/company_roles/upgrade_to_standard_license\", {\n user_id: userId,\n });\n return response.data;\n } catch (error) {\n toast.error(error.response.data.error);\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#upgradeToStandardLicense\");\n span.setTags({\n userId: userId.toString(),\n });\n });\n return null;\n }\n};\n\nexport const upgradeToAdmin = async (userId: number): Promise<CompanyMember | null> => {\n try {\n const response = await request.post(\"/company_roles/upgrade_to_admin\", {\n user_id: userId,\n });\n return response.data;\n } catch (error) {\n toast.error(error.response.data.error);\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#upgradeToAdmin\");\n span.setTags({\n userId: userId.toString(),\n });\n });\n return null;\n }\n};\n\nexport const downgradeFromAdmin = async (userId: number): Promise<CompanyMember | null> => {\n try {\n const response = await request.post(\"/company_roles/downgrade_from_admin\", {\n user_id: userId,\n });\n return response.data;\n } catch (error) {\n toast.error(error.response.data.error);\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#downgradeFromAdmin\");\n span.setTags({\n userId: userId.toString(),\n });\n });\n return null;\n }\n};\n\nexport const upgradeToSuperAdmin = async (\n userId: number\n): Promise<UpgradeToSuperAdminResponse[\"users\"] | null> => {\n try {\n const response = await request.post(\"/company_roles/upgrade_to_super_admin\", {\n user_id: userId,\n });\n return response.data.users;\n } catch (error) {\n toast.error(error.response.data.error);\n appsignal.sendError(error, (span) => {\n span.setAction(\"sponsors#upgradeToSuperAdmin\");\n span.setTags({\n userId: userId.toString(),\n });\n });\n return null;\n }\n};\n\nexport const updatePendingReviewTeamMembership = async (\n sid: string,\n isApprovedForLicense: string | null\n): Promise<UpdatePendingReviewTeamMembershipStatusResponse | null> => {\n try {\n const response = await request.post(\"/pending_review_team_memberships/update_status\", {\n sid,\n is_approved_for_license: isApprovedForLicense,\n });\n return response.data;\n } catch (e) {\n toast.error(e.response.data.error);\n if (e.response.status !== 401) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"sponsors#updatePendingReviewTeamMembership\");\n span.setTags({\n sid,\n });\n });\n }\n return null;\n }\n};\n\nexport const getNetworkScientists = async (options: {\n pageNumber: number;\n sortBy?: \"RECENT\" | \"ALPHABETICAL\" | \"DEFAULT\";\n searchFilter?: string[];\n countryFilter?: string[];\n institutionTypeFilter?: string[];\n institutionNameFilter?: string[];\n requestIdFilter?: string[];\n statusFilter?: string | null;\n keywordFilter?: string[];\n submittersOnlyFilter?: boolean;\n connectionFilter?: ConnectionType;\n accessToken?: string | null;\n}): Promise<CompanyNetworkScientistsIndexResponse> => {\n const params: Record<string, any> = {\n for_scientist_network: true,\n options: {\n order_by: options.sortBy ?? \"DEFAULT\",\n page_number: options.pageNumber,\n search_filter: options.searchFilter,\n country_filter: options.countryFilter,\n institution_type_filter: options.institutionTypeFilter,\n institution_name_filter: options.institutionNameFilter,\n request_id_filter: options.requestIdFilter,\n status_filter: options.statusFilter,\n keyword_filter: options.keywordFilter,\n submitters_only_filter: options.submittersOnlyFilter,\n connection_filter: options.connectionFilter,\n },\n };\n if (options.accessToken) {\n params.access_token = options.accessToken;\n }\n const response = await request.get<CompanyNetworkScientistsIndexResponse>(\n company_network_scientists_path(),\n {\n params,\n }\n );\n return response.data;\n};\n\nexport const getScientistNetworkOptions = async (): Promise<{\n keywords: {\n disciplines: string[];\n areas_of_expertise: string[];\n };\n institution_names: {\n all: string[];\n universities: string[];\n startups: string[];\n };\n}> => {\n try {\n const response = await request.get(search_suggest_company_network_scientists_path());\n return response.data;\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"sponsors#getNetworkScientistOptions\");\n });\n return {\n keywords: {\n disciplines: [],\n areas_of_expertise: [],\n },\n institution_names: {\n all: [],\n universities: [],\n startups: [],\n },\n };\n }\n};\n\nexport const sponsorShareScientist = async (data: {\n scientist_id: number;\n email: string;\n message: string;\n}): Promise<AxiosResponse> => request.post(\"/notifications/sponsor_share_scientist\", data);\n","import { UniversityMembersOptionsResponse, UniversityMembersResponse } from \"@tsTypes/index\";\nimport appsignal from \"@utils/appsignal\";\nimport { SORT_BY_OPTIONS } from \"src/views/UniversityTeam/searchOptions\";\nimport request from \"./request\";\n\nexport const getUniversityMembers = async (\n options: {\n facultyFilter: boolean;\n nameFilter: string[];\n titleFilter: string[];\n keywordFilter: string[];\n sortBy: typeof SORT_BY_OPTIONS[number][\"value\"];\n },\n abortSignal: AbortSignal\n): Promise<UniversityMembersResponse> => {\n try {\n const response = await request.get(\"/universities/members\", {\n signal: abortSignal,\n params: {\n options: {\n faculty_filter: options.facultyFilter,\n name_filter: options.nameFilter,\n title_filter: options.titleFilter,\n keyword_filter: options.keywordFilter,\n sort_by: options.sortBy ?? \"NAME\",\n },\n },\n });\n\n return response.data;\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"universities#getUniversityMembers\");\n });\n return { members: [], count: 0 };\n }\n};\n\nexport const getUniversityMembersTabCounts = async (): Promise<{\n faculty_count: number;\n admin_count: number;\n}> => {\n try {\n const response = await request.get(\"/universities/members/tab_counts\");\n\n return response.data;\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"universities#getUniversityMembersTabCounts\");\n });\n return { faculty_count: 0, admin_count: 0 };\n }\n};\n\nexport const getUniversityMembersOptions = async (): Promise<UniversityMembersOptionsResponse> => {\n try {\n const response = await request.get(\"/universities/members/options\");\n\n return response.data;\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"universities#getUniversityMembersOptions\");\n });\n return {\n name_options: [],\n title_options: [],\n keyword_options: {\n disciplines: [],\n areas_of_expertise: [],\n },\n };\n }\n};\n\nexport const sendInviteFromUniversityAdmin = async ({\n email,\n message,\n}: {\n email: string;\n message: string;\n}): Promise<boolean> => {\n try {\n const response = await request.post(\"/notifications/invite_from_university_admin\", {\n to_emails: email,\n message,\n });\n\n if (!response.data.success) {\n throw new Error(\"Failed to send invite\");\n }\n\n return true;\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"universities#sendInviteFromUniversityAdmin\");\n });\n return false;\n }\n};\n\nexport const sendUniversityAdminInviteToSubmit = async ({\n toUserIds,\n requestIds,\n}: {\n toUserIds: number[];\n requestIds: number[];\n}): Promise<boolean> => {\n try {\n await request.post(\"/notifications/university_admin_invite_to_submit\", {\n to_user_ids: toUserIds,\n request_ids: requestIds,\n });\n return true;\n } catch (e) {\n appsignal.sendError(e, (span) => {\n span.setAction(\"universities#sendUniversityAdminInviteToSubmit\");\n });\n return false;\n }\n};\n","import { Request } from \"@tsTypes/schema\";\nimport request from \"./request\";\n\nexport const followRequest = async (requestId: number): Promise<Request> => {\n const response = await request.post(\"/follow_request\", {\n request_id: requestId,\n });\n\n return response.data.followed_request;\n};\n\nexport const unfollowRequest = async (requestId: number): Promise<void> => {\n await request.post(\"/unfollow_request\", {\n request_id: requestId,\n });\n};\n","import { Request, UserRequestPreference } from \"@tsTypes/schema.js\";\nimport * as Routes from \"../routes/routes.js\";\nimport { UserRequestPreferenceSource } from \"../tsTypes/__generated__/enums/user_request_preference_source\";\nimport api from \"./request\";\n\ntype UserRequestPreferenceResponse = Pick<UserRequestPreference, \"id\" | \"is_interested\"> & {\n request?: Pick<Request, \"id\" | \"title\">;\n};\n\nexport const getUserRequestPreference = async (\n requestId: number\n): Promise<UserRequestPreferenceResponse | null> => {\n try {\n const response = await api.get(`/requests/${requestId}/user_request_preference`);\n return response.data;\n } catch (error) {\n // Return null if the preference doesn't exist or there's an error\n return null;\n }\n};\n\nexport const deleteUserRequestPreference = async (requestId: number) => {\n await api.delete(`/requests/${requestId}/user_request_preference`);\n};\n\nexport const updateUserRequestPreference = async ({\n requestId,\n signedNotificationId,\n isInterested = true,\n source = UserRequestPreferenceSource.Unknown,\n reason,\n}: {\n requestId: number;\n isInterested?: boolean;\n source?: UserRequestPreferenceSource;\n reason?: string;\n signedNotificationId?: string;\n}) => {\n const payload: Record<string, any> = {\n is_interested: isInterested,\n source: source,\n };\n\n // Only include if provided\n if (signedNotificationId) payload.signed_notification_id = signedNotificationId;\n if (reason) payload.reason = reason;\n\n const responseJson = await api.post(\n Routes.update_request_interests_path({\n id: requestId,\n }),\n payload\n );\n\n return responseJson.data;\n};\n","import { marketplacePath } from \"@routes/utils\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { ScientistCurrentUser, UsersShowResponse } from \"@tsTypes/index\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport axios, { AxiosError } from \"axios\";\nimport { UserDetailedType } from \"src/views/Onboarding/OnboardingContainer\";\nimport { HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION } from \"src/views/Onboarding/Step3/Step3\";\nimport request from \"./request\";\n\nexport class UserNotVerifiedError extends Error {}\n\nexport const getUser = async (\n userId: number,\n fetchFromSession = false\n): Promise<UsersShowResponse | null> => {\n try {\n const response = fetchFromSession\n ? await request.get(\"/me\", {\n // The timestamp param is added to force a new request as opposed to using a cached response\n params: { timestamp: Number(new Date()) },\n })\n : await request.get(`/users/${userId}`);\n\n return response.data;\n } catch (error) {\n switch (error.response?.status) {\n case 401:\n case 404:\n break;\n default:\n if (window.location.pathname !== \"/\") {\n console.error(\"Redirecting to / since after failure.\");\n window.location.href = \"/\";\n }\n }\n return null;\n }\n};\n\nexport const signOut = async () => {\n await request.delete(\"/sign_out\");\n // This needs to use window.location.href instead of history.push to prevent\n // accessing the previous session via the browser cache\n window.location.href = marketplacePath();\n};\n\nexport const signIn = async ({ email, password }) =>\n request.post(\"/users/sign_in\", {\n user: {\n email,\n password,\n },\n });\n\nexport const register = async ({\n email,\n password,\n firstName,\n lastName,\n role,\n invitedUserId = undefined,\n}: {\n email: string;\n password: string;\n firstName: string;\n lastName: string;\n role?: UserRole;\n invitedUserId?: string;\n}) =>\n request.post(\"/users\", {\n user: {\n email,\n password,\n first_name: firstName,\n last_name: lastName,\n role,\n invited_user_id: invitedUserId,\n },\n });\n\nexport const cancelSignUp = async (source) => {\n track(SegmentEventName.Abandon, {\n react_component: \"OnboardingContainer\",\n source,\n });\n return request.delete(\"/onboarding\");\n};\n\nexport const onboard = ({\n userType,\n profileInfo,\n googleScholarAuthorUserId = null,\n detailedType = null,\n commenterInviteRequest = null,\n}: {\n userType;\n profileInfo;\n googleScholarAuthorUserId?: number | null;\n detailedType?: UserDetailedType | null;\n commenterInviteRequest?: string | null;\n}) => {\n let data;\n\n switch (userType) {\n case \"scientist\":\n data = {\n account_type: 0,\n how_did_you_hear_about_us:\n profileInfo.howDidYouHearAboutUs === HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION\n ? profileInfo.howDidYouHearAboutUsOther\n : profileInfo.howDidYouHearAboutUs,\n detailed_type: detailedType,\n profile_info: {\n title: profileInfo.role,\n disciplines: profileInfo.disciplines,\n areas_of_expertise: profileInfo.areasOfExpertise,\n ...(profileInfo?.university && {\n university: profileInfo?.university,\n }),\n },\n ...(!profileInfo?.university && {\n startup: {\n startup_name: profileInfo.companyName,\n url: encodeURI(profileInfo.companyURL),\n primary_affiliation: true,\n },\n }),\n ...(profileInfo?.country_code && {\n country_code: profileInfo?.country_code,\n }),\n google_scholar_author_user_id: googleScholarAuthorUserId,\n };\n break;\n case \"sponsor\":\n data = {\n account_type: 1,\n how_did_you_hear_about_us:\n profileInfo.howDidYouHearAboutUs === HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION\n ? profileInfo.howDidYouHearAboutUsOther\n : profileInfo.howDidYouHearAboutUs,\n detailed_type: detailedType,\n profile_info: {\n role: profileInfo.role,\n title: profileInfo.title,\n areas_of_expertise: profileInfo.areasOfExpertise,\n },\n company: profileInfo.company,\n ...(commenterInviteRequest && { commenter_invite_request: commenterInviteRequest }),\n };\n break;\n case \"admin\":\n data = {\n account_type: 2,\n how_did_you_hear_about_us:\n profileInfo.howDidYouHearAboutUs === HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION\n ? profileInfo.howDidYouHearAboutUsOther\n : profileInfo.howDidYouHearAboutUs,\n detailed_type: detailedType,\n profile_info: {\n role: profileInfo.role,\n university: profileInfo.university,\n university_expertise: profileInfo.universityExpertise?.join(\",\"),\n disciplines: profileInfo.disciplines,\n },\n ...(profileInfo?.country_code && {\n country_code: profileInfo?.country_code,\n }),\n };\n break;\n }\n return request\n .post(`/onboarding`, data)\n .catch((error: Error | AxiosError) => {\n if (axios.isAxiosError(error) && error?.response?.status === 403) {\n throw new UserNotVerifiedError(error?.response?.data?.message);\n } else {\n throw error;\n }\n })\n .then((response) => ({ ...response.data.user, viewed_tours: [] }));\n};\n\nexport const updateUserKeywords = (\n userId: string,\n keywords: { disciplines: string[]; areasOfExpertise: string[] }\n) => {\n return request.put(`/users/${userId}`, {\n disciplines: keywords.disciplines,\n areas_of_expertise: keywords.areasOfExpertise,\n });\n};\n\nexport const updateUserProfile = async (\n userId: number | undefined,\n role: UserRole,\n profileInfo: any\n): Promise<ScientistCurrentUser> => {\n let url = \"\";\n\n switch (role) {\n case UserRole.SCIENTIST:\n url = `/scientist_profile/${userId}`;\n break;\n case UserRole.SPONSOR:\n url = `/sponsor_profiles/${profileInfo.id}`;\n break;\n case UserRole.UNIVERSITY_ADMIN:\n url = `/university_profiles/${profileInfo.id}`;\n break;\n }\n\n const response = await request.put(url, {\n ...profileInfo,\n user_id: userId,\n });\n\n return response.data.user;\n};\n\nexport const skipUpdateUserKeywords = (userId: string) => {\n return request.put(`/users/${userId}`, {\n has_updated_taxonomy: true,\n });\n};\n\nexport const resendEmailInvite = async (email: string): Promise<void> => {\n await request.post(\"/register/resend_email_verification\", { email });\n};\n\nexport const verifyUser = async (verificationCode: string): Promise<boolean> => {\n return (await request.post(\"/onboarding/verify\", { verification_code: verificationCode })).data\n .success;\n};\n","/* eslint no-unused-vars: 0 */\n\n/**\n * This file was automatically generated by ruby_to_typescript.rake.\n * Do not modify it by hand.\n */\nexport enum ProposalReviewStatus {\n PENDING = \"pending\",\n SCREEN = \"screen\",\n ASSESS = \"assess\",\n MEET = \"meet\",\n DECLINED = \"declined\",\n}\n","/* eslint no-unused-vars: 0 */\n\n/**\n * This file was automatically generated by ruby_to_typescript.rake.\n * Do not modify it by hand.\n */\nexport enum UserRequestPreferenceSource {\n Unknown = \"Unknown\",\n Email = \"Email\",\n PreferenceModal = \"PreferenceModal\",\n MarketplaceCard = \"MarketplaceCard\",\n FollowedNotification = \"FollowedNotification\",\n RequestPage = \"RequestPage\",\n Internal = \"Internal\",\n}\n","import { ProposalReviewStatus } from \"./__generated__/enums/proposal_review_status\";\n\nexport enum ProposalStatus {\n OPEN = 0,\n QUALIFIED = 3,\n SHORTLISTED = 4,\n FINALIST = 5,\n FUNDED = 6,\n DECLINED = 2,\n}\n\n/**\n * TODO: (overload119) HALO-2148:\n * Helper to denote that the statuses can either be a ProposalStatus (V1) or a ProposalReviewStatus (V2).\n * After a full migration, this can be removed.\n */\nexport type ProposalStatusOrProposalReviewStatus = ProposalStatus | ProposalReviewStatus;\n\nexport const PROPOSAL_STATUS_VALUES = Object.values(ProposalStatus).concat(\n Object.values(ProposalReviewStatus)\n);\n\nexport type ProposalStatusToBoolean = { [key in ProposalStatusOrProposalReviewStatus]: boolean };\n\n// Stage is based on status but has more info such as furthest status reached, etc.\n// Used exclusively for the front-end, such as in ProposalStageTag\nexport enum ProposalStageNotStatus {\n DRAFT = 0,\n SUBMITTED = 1,\n QUALIFIED = 2,\n SHORTLISTED = 3,\n FINALIST = 4,\n DECLINED = 5,\n DECLINED_QUALIFIED = 6,\n DECLINED_SHORTLISTED = 7,\n DECLINED_FINALIST = 8,\n}\n\nexport const TECHNOLOGY_READINESS_LEVELS = {\n 1: \"Basic principles observed\",\n 2: \"Concept development\",\n 3: \"Experimental proof of concept\",\n 4: \"Validated in lab conditions\",\n 5: \"Validated in relevant environment\",\n 6: \"Demonstrated in relevant environment\",\n 7: \"Regulatory approval\",\n 8: \"Product in production\",\n 9: \"Product in market\",\n};\n\nexport interface CompanyProposalLibraryFilterOptions {\n rfpIdFilter?: string[];\n requestIdFilter?: string[];\n statusFilter?: string[];\n countryFilter?: string[];\n keywordFilter?: string[];\n institutionTypeFilter?: string[];\n institutionNameFilter?: string[];\n technologyReadinessLevelFilter?: string[];\n searchFilter?: string[];\n searchDirection?: \"ASC\" | \"DESC\";\n pageNumber?: number;\n}\n","import { Proposal, RequestForExpertProposal, RequestForStartupProposal } from \"./schema\";\n\nexport type Proposaly = Proposal | RequestForStartupProposal | RequestForExpertProposal;\n\nexport enum ProposalyType {\n PROPOSAL = \"Proposal\",\n REQUEST_FOR_STARTUP_PROPOSAL = \"RequestForStartupProposal\",\n REQUEST_FOR_EXPERT_PROPOSAL = \"RequestForExpertProposal\",\n}\n","// Also update in app/models/role.rb\n\nexport enum RoleName {\n // resource: Company\n COMPANY_MEMBER = \"company_member\",\n COMPANY_ADMIN = \"company_admin\",\n COMPANY_SUPER_ADMIN = \"company_super_admin\",\n\n // resource: Request\n REQUEST_DRAFT_EDITOR = \"request_draft_editor\",\n REQUEST_COMMENTER = \"request_commenter\",\n REQUEST_LEAD = \"request_lead\",\n REQUEST_EXTERNAL_COMMENTER = \"request_expert\",\n REQUEST_EXTERNAL_LEAD = \"request_lead_expert\",\n}\n\nexport const PRETTY_ROLE_NAMES: { [key in RoleName]: string } = {\n [RoleName.COMPANY_MEMBER]: \"Member\",\n [RoleName.COMPANY_ADMIN]: \"Admin\",\n [RoleName.COMPANY_SUPER_ADMIN]: \"Super Admin\",\n [RoleName.REQUEST_DRAFT_EDITOR]: \"Draft Editor\",\n [RoleName.REQUEST_COMMENTER]: \"Commenter\",\n [RoleName.REQUEST_LEAD]: \"Lead\",\n [RoleName.REQUEST_EXTERNAL_COMMENTER]: \"External Commenter\",\n [RoleName.REQUEST_EXTERNAL_LEAD]: \"External Lead\",\n};\n\nexport type RoleResourceType = \"Company\" | \"Request\";\n","export enum UniversityAdminRoles {\n CORPORATE_RELATIONS = \"Corporate Relations\",\n TECH_TRANSFER = \"Tech Transfer\",\n RESEARCH_DEVELOPMENT = \"Research Development\",\n}\n\nexport enum UniversityExpertise {\n HEALTHCARE_AND_LIFE_SCIENCES = \"Healthcare and Life Sciences\",\n ENGINEERING_AND_PHYSICAL_SCIENCES = \"Engineering and Physical Sciences\",\n NEW_VENTURE_CREATION = \"New Venture Creation\",\n DATA_SCIENCE = \"Data Science\",\n AGRICULTURE = \"Agriculture\",\n}\n","import { toggleLoginModal } from \"@redux/actions/profileActions\";\n\ntype UserRole = 0 | 1 | 2 | \"\";\n\n// Allow saving type-specific prev urls\n// Usage: Set different prev urls for different user types\nexport const setPrevUrlCookie = (url = window.location.href, role: UserRole = \"\") => {\n if (window.location.pathname !== \"/\") {\n docCookies.setItem(`prevUrl${role}`, url, 1800, \"/\");\n }\n};\n\nexport const getPrevUrlCookie = (\n targetLink,\n deletePrev = true,\n role: UserRole = \"\",\n shouldRedirect = true\n) => {\n // Try type-specific url before general url\n const prevUrl = docCookies.getItem(`prevUrl${role}`) ?? docCookies.getItem(`prevUrl`);\n if (prevUrl) {\n if (deletePrev) {\n // Make sure to clean up all general and type-specific urls\n docCookies.removeItem(\"prevUrl\", \"/\");\n docCookies.removeItem(\"prevUrl0\", \"/\");\n docCookies.removeItem(\"prevUrl1\", \"/\");\n docCookies.removeItem(\"prevUrl2\", \"/\");\n }\n\n if (!shouldRedirect) {\n return prevUrl;\n }\n\n if (window.location.href === prevUrl) {\n location.reload();\n } else {\n window.location.href = prevUrl;\n }\n } else if (shouldRedirect) {\n window.location.href = targetLink;\n }\n};\n\nexport const openLoginModalWithRedirect = (redirectUrl = window.location.pathname) => {\n setPrevUrlCookie(redirectUrl);\n return toggleLoginModal({ open: true });\n};\n","import { DropdownOption } from \"@components/library/Dropdowns/DropdownOption\";\nimport dayjs from \"dayjs\";\nimport dayjsBusinessDays from \"dayjs-business-days2\";\nimport localeData from \"dayjs/plugin/localeData\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport timezone from \"dayjs/plugin/timezone\";\nimport utc from \"dayjs/plugin/utc\";\n\ndayjs.locale(\"en\");\ndayjs.extend(localeData);\ndayjs.extend(relativeTime);\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(dayjsBusinessDays);\n\nexport const daysUntilDate = (date) => {\n return dayjs(date).diff(Date.now(), \"days\");\n};\n\nexport const dayDropdownOptions = (month?: string, year?: string): DropdownOption[] => {\n let daysInMonth = 31;\n if (month && year) {\n daysInMonth = dayjs(`${year}-${month}`, \"YYYY-MM\").daysInMonth();\n } else if (month) {\n daysInMonth = dayjs(`2020-${month}`, \"YYYY-MM\").daysInMonth(); // 2020 is a leap year\n }\n\n const daysInMonthArray: number[] = [];\n for (let i = 1; i <= daysInMonth; i += 1) {\n daysInMonthArray.push(i);\n }\n\n return daysInMonthArray.map((day) => {\n return {\n label: String(day),\n value: String(day),\n };\n });\n};\n\nexport const MONTH_DROPDOWN_OPTIONS: DropdownOption[] = dayjs.monthsShort().map((month, index) => {\n return {\n label: month,\n value: String(index + 1),\n };\n});\n\nconst yearOptions: number[] = [];\nfor (let i = new Date().getFullYear(); i > 1950; i -= 1) {\n yearOptions.push(i);\n}\nexport const YEAR_DROPDOWN_OPTIONS: DropdownOption[] = yearOptions.map((year) => {\n return {\n label: String(year),\n value: String(year),\n };\n});\n\nexport const formatDateToEastern = (date: string, format: string) => {\n return dayjs(date).tz(\"America/New_York\").format(format);\n};\n","import {\n proposal_path,\n request_for_expert_proposal_path,\n request_for_startup_proposal_path,\n} from \"@routes/routes\";\nimport { Proposaly, ProposalyType } from \"@tsTypes/proposaly\";\nimport { RequestableType } from \"@tsTypes/requests\";\nimport { assertAbsurd } from \"./tsUtils\";\n\nexport const proposalyPagePath = (\n proposal: Pick<Proposaly, \"slug\"> & { proposaly_type: ProposalyType }\n) => {\n const { slug, proposaly_type } = proposal;\n\n if (!slug) {\n throw new Error(\"Proposal slug is required\");\n }\n\n switch (proposaly_type) {\n case ProposalyType.PROPOSAL:\n return proposal_path(slug);\n case ProposalyType.REQUEST_FOR_STARTUP_PROPOSAL:\n return request_for_startup_proposal_path(slug);\n case ProposalyType.REQUEST_FOR_EXPERT_PROPOSAL:\n return request_for_expert_proposal_path(slug);\n default:\n assertAbsurd(proposaly_type);\n }\n};\n\nexport const REQUESTABLE_TYPE_TO_PROPOSALY_TYPE = {\n [RequestableType.RFP]: ProposalyType.PROPOSAL,\n [RequestableType.REQUEST_FOR_EXPERT]: ProposalyType.REQUEST_FOR_EXPERT_PROPOSAL,\n [RequestableType.REQUEST_FOR_STARTUP]: ProposalyType.REQUEST_FOR_STARTUP_PROPOSAL,\n};\n\nexport const PROPOSAL_SLUG_PARAM = \"proposal\";\n","import { IconName } from \"@components/library/Icon/Icon\";\nimport { request_for_expert_path, submit_proposal_path } from \"@routes/routes\";\nimport {\n RequestForCard,\n ReviewTeamMember,\n ReviewerDashboardRequest,\n RolePartial,\n ScientistCurrentUser,\n SponsorDropdownRequest,\n SponsorProfilePartial,\n} from \"@tsTypes/index\";\nimport {\n LaunchableRequestStatus,\n RequestFeedbackDeadlineStatus,\n RequestableType,\n} from \"@tsTypes/requests\";\nimport { RoleName } from \"@tsTypes/roles\";\nimport { Company, OpenCall, Request, User } from \"@tsTypes/schema\";\nimport { SponsorLicenseType } from \"@tsTypes/sponsorProfiles\";\nimport { AnyUser, UserRole } from \"@tsTypes/users\";\nimport dayjs from \"dayjs\";\nimport { uniqBy } from \"lodash\";\nimport { REQUESTABLE_TO_REQUEST_TYPE } from \"src/App\";\nimport { SortBy } from \"src/views/Marketplace/RespondToRequests\";\nimport { RfpOpenCallProposalFormRequest } from \"src/views/RfpOpenCallProposalForm/RfpOpenCallProposalForm\";\nimport { ACCESS_CODE_PARAM } from \"src/views/RFPPage/RfpPage\";\nimport { daysUntilDate } from \"./dateUtils\";\nimport { assertAbsurd } from \"./tsUtils\";\nimport { sortByHasProfilePicture } from \"./userUtils\";\n\nexport const isUsingResponseDeadlinesV2 = (request: SponsorDropdownRequest | null): boolean => {\n if (request === null) return false;\n return \"review_stage_status\" in request;\n};\n\nexport const REQUESTABLE_TO_ICON_NAME: { [key in RequestableType]: IconName } = {\n [RequestableType.OPEN_CALL]: \"Open Call\",\n [RequestableType.RFP]: \"Opportunity\",\n [RequestableType.REQUEST_FOR_STARTUP]: \"Accelerator\",\n [RequestableType.REQUEST_FOR_EXPERT]: \"Request for experts\",\n};\n\nexport const findRequestRoleNameOnUser = (\n user: ReviewTeamMember,\n request: Pick<Request, \"id\" | \"requestable_type\"> & { complete?: boolean }\n): RoleName | null => {\n const isDraft = request.complete !== undefined && !request.complete;\n\n if (user.role === UserRole.SPONSOR) {\n const { license, is_admin, is_super_admin } = user.profile_info;\n const isPremium = license === SponsorLicenseType.PREMIUM;\n const isOpenCall = request.requestable_type === RequestableType.OPEN_CALL;\n\n if (is_admin && (isPremium || isDraft || isOpenCall)) {\n if (is_super_admin) {\n return RoleName.COMPANY_SUPER_ADMIN;\n }\n return RoleName.COMPANY_ADMIN;\n }\n }\n\n return (\n user.roles.find(\n (role) =>\n role.resource_type === \"Request\" &&\n role.resource_id === request.id &&\n isDraft === (role.name === RoleName.REQUEST_DRAFT_EDITOR)\n )?.name ?? null\n );\n};\n\nexport const canAccessRequest = (\n user: Pick<User, \"role\"> & {\n roles: RolePartial[];\n profile_info: Partial<Pick<SponsorProfilePartial, \"license\" | \"is_admin\" | \"company_id\">>;\n },\n request: Pick<Request, \"id\" | \"requestable_type\"> & {\n complete?: boolean;\n company: Partial<Pick<Company, \"id\">>;\n }\n): boolean => {\n if (!user || !request) return false;\n\n const { license, is_admin, company_id } = user.profile_info as SponsorProfilePartial;\n const isSponsorAtCompany = user.role === UserRole.SPONSOR && request.company.id === company_id;\n const isPremium = license === SponsorLicenseType.PREMIUM;\n const isDraft = request.complete !== undefined && !request.complete;\n const isOpenCall = request.requestable_type === RequestableType.OPEN_CALL;\n\n if (isSponsorAtCompany && is_admin && (isPremium || isDraft || isOpenCall)) {\n return true;\n }\n\n return Boolean(\n user.roles.some(\n (role) =>\n role.resource_type === \"Request\" &&\n role.resource_id === request.id &&\n (isDraft\n ? role.name === RoleName.REQUEST_DRAFT_EDITOR\n : role.name === RoleName.REQUEST_LEAD ||\n role.name === RoleName.REQUEST_COMMENTER ||\n role.name === RoleName.REQUEST_EXTERNAL_COMMENTER ||\n role.name === RoleName.REQUEST_EXTERNAL_LEAD)\n )\n );\n};\n\nexport const canAccessRequestAsLead = (\n user: Pick<User, \"role\"> & {\n roles: RolePartial[];\n profile_info:\n | Pick<SponsorProfilePartial, \"license\" | \"is_admin\" | \"company_id\">\n | Record<string, unknown>;\n },\n request: Pick<Request, \"id\" | \"requestable_type\"> & {\n complete?: boolean;\n company: Partial<Pick<Company, \"id\">>;\n }\n): boolean => {\n const { license, is_admin, company_id } = user.profile_info as SponsorProfilePartial;\n\n if (\n !user ||\n !(\"id\" in user) ||\n !request ||\n user.role !== UserRole.SPONSOR ||\n request.company.id !== company_id\n ) {\n return false;\n }\n\n const isPremium = license === SponsorLicenseType.PREMIUM;\n const isDraft = request.complete !== undefined && !request.complete;\n const isOpenCall = request.requestable_type === RequestableType.OPEN_CALL;\n\n if (is_admin && (isPremium || isDraft || isOpenCall)) {\n return true;\n }\n\n return Boolean(\n user.roles.some(\n (role) =>\n role.resource_type === \"Request\" &&\n role.resource_id === request.id &&\n (isDraft\n ? role.name === RoleName.REQUEST_DRAFT_EDITOR\n : role.name === RoleName.REQUEST_LEAD)\n )\n );\n};\n\nexport const isExternalLeadOnRequest = (\n currentUser: AnyUser,\n request: Pick<Request, \"id\" | \"requestable_type\"> & {\n complete?: boolean;\n company: Partial<Pick<Company, \"id\">>;\n }\n): boolean => {\n if (\"is_expert\" in currentUser.profile_info) {\n return (\n findRequestRoleNameOnUser(currentUser as ScientistCurrentUser, request) ===\n RoleName.REQUEST_EXTERNAL_LEAD\n );\n }\n\n return false;\n};\n\nexport const filterReviewTeamByRole = ({\n requestId,\n team,\n roleName,\n}: {\n requestId: number;\n team: ReviewTeamMember[];\n roleName: RoleName;\n}): ReviewTeamMember[] =>\n team.filter((member) =>\n member.roles.find(\n (role) =>\n role.resource_type === \"Request\" && role.resource_id === requestId && role.name === roleName\n )\n );\n\nexport const reviewTeamMembersForReviewerDashboardThumbnails = (\n request: ReviewerDashboardRequest\n) => {\n const reviewTeamMembers = request.review_team_members;\n const superAdminReviewers = reviewTeamMembers.filter(\n (reviewer) => reviewer.role === UserRole.SPONSOR && reviewer.profile_info.is_super_admin\n );\n const onlyAdminReviewers = reviewTeamMembers.filter(\n (reviewer) =>\n reviewer.role === UserRole.SPONSOR &&\n reviewer.profile_info.is_admin &&\n !reviewer.profile_info.is_super_admin\n );\n const leads = sortByHasProfilePicture(\n filterReviewTeamByRole({\n requestId: request.id,\n team: reviewTeamMembers,\n roleName: RoleName.REQUEST_LEAD,\n })\n );\n const commenters = sortByHasProfilePicture(\n filterReviewTeamByRole({\n requestId: request.id,\n team: reviewTeamMembers,\n roleName: RoleName.REQUEST_COMMENTER,\n })\n );\n const externalLeads = sortByHasProfilePicture(\n filterReviewTeamByRole({\n requestId: request.id,\n team: reviewTeamMembers,\n roleName: RoleName.REQUEST_EXTERNAL_LEAD,\n })\n );\n const externalCommenters = sortByHasProfilePicture(\n filterReviewTeamByRole({\n requestId: request.id,\n team: reviewTeamMembers,\n roleName: RoleName.REQUEST_EXTERNAL_COMMENTER,\n })\n );\n const draftEditors = sortByHasProfilePicture(\n filterReviewTeamByRole({\n requestId: request.id,\n team: reviewTeamMembers,\n roleName: RoleName.REQUEST_DRAFT_EDITOR,\n })\n );\n\n return uniqBy(\n [\n ...(request.complete\n ? [...leads, ...commenters, ...externalLeads, ...externalCommenters]\n : draftEditors),\n ...onlyAdminReviewers,\n ...superAdminReviewers,\n ],\n (reviewer) => reviewer.id\n ).slice(0, 3);\n};\n\nexport const requestPageUrlPath = (\n request?: Record<string, any>,\n hideAccessCode = false\n): string => {\n switch (request?.requestable_type) {\n case RequestableType.OPEN_CALL: {\n return `/company/${request.company.identifier}`;\n }\n case RequestableType.RFP: {\n return (\n `/research/${request.requestable?.rfp_program_identifier || \"program\"}/${request.slug}` +\n (request.access_code && !hideAccessCode\n ? `?${ACCESS_CODE_PARAM}=${request.access_code}`\n : \"\")\n );\n }\n case RequestableType.REQUEST_FOR_STARTUP: {\n return `/startup_program/${request.slug}`;\n }\n case RequestableType.REQUEST_FOR_EXPERT: {\n return request_for_expert_path(request.slug);\n }\n default: {\n throw new Error(`Invalid requestable type: ${request?.requestable_type}`);\n }\n }\n};\n\nexport const requestProposalUrlPath = (\n request: {\n requestable_type: RequestableType | string;\n slug: string;\n access_code?: string | null;\n },\n options?: any\n): string => {\n return submit_proposal_path(\n REQUESTABLE_TO_REQUEST_TYPE[request.requestable_type],\n request.slug,\n request.access_code\n ? {\n [ACCESS_CODE_PARAM]: request.access_code,\n ...options,\n }\n : options\n );\n};\n\nexport type LaunchableRequest = Pick<Request, \"enabled\" | \"feedback_deadline\"> & {\n requestable: {\n launch_date: string | null;\n deadline: string | null;\n };\n};\n\nexport const getLaunchableRequestStatus = <Request extends LaunchableRequest>(\n request: Request\n): LaunchableRequestStatus => {\n if (!request.requestable.launch_date && !request.requestable.deadline) {\n if (request.enabled) return LaunchableRequestStatus.ACTIVE;\n return LaunchableRequestStatus.CLOSED;\n }\n\n const isBeforeLaunchDate =\n Boolean(request.requestable.launch_date) &&\n dayjs().isBefore(request.requestable.launch_date ?? 0);\n const isPastDeadline =\n Boolean(request.requestable.deadline) && dayjs().isAfter(request.requestable.deadline ?? 0);\n\n if (isBeforeLaunchDate) return LaunchableRequestStatus.COMING_SOON;\n if (request.enabled)\n if (isPastDeadline) return LaunchableRequestStatus.IN_EXTENSION;\n else return LaunchableRequestStatus.ACTIVE;\n return LaunchableRequestStatus.CLOSED;\n};\n\nexport const canUseFeedbackDeadline = (request: {\n created_at?: string;\n requestable?: {\n launch_date: string | null;\n deadline: string | null;\n } | null;\n}): boolean => {\n const FEEDBACK_DEADLINE_CUTOFF_DATE = new Date(\"8-17-2023\");\n\n return (\n new Date(request.created_at ?? 0) >= FEEDBACK_DEADLINE_CUTOFF_DATE ||\n new Date(request.requestable?.launch_date ?? 0) >= FEEDBACK_DEADLINE_CUTOFF_DATE ||\n new Date(request.requestable?.deadline ?? 0) >= FEEDBACK_DEADLINE_CUTOFF_DATE\n );\n};\n\nexport const getRequestFeedbackDeadlineStatus = (request: {\n feedback_deadline: string | null;\n created_at?: string;\n requestable?: {\n launch_date: string | null;\n deadline: string | null;\n } | null;\n}): RequestFeedbackDeadlineStatus => {\n if (\n !canUseFeedbackDeadline(request) ||\n !request.requestable?.deadline ||\n new Date() < new Date(request.requestable?.deadline)\n ) {\n return RequestFeedbackDeadlineStatus.NOT_APPLICABLE;\n }\n\n if (!request.feedback_deadline) return RequestFeedbackDeadlineStatus.NEEDS_DEADLINE;\n\n const daysUntilDeadline = daysUntilDate(request.feedback_deadline);\n\n if (daysUntilDeadline < 0) return RequestFeedbackDeadlineStatus.PAST_DEADLINE;\n if (daysUntilDeadline < 5) return RequestFeedbackDeadlineStatus.DEADLINE_APPROACHING;\n return RequestFeedbackDeadlineStatus.BEFORE_DEADLINE;\n};\n\nexport const isNonOpenCallAfterJan1st2024 = (\n request?: SponsorDropdownRequest | RfpOpenCallProposalFormRequest\n): boolean => {\n if (!request) return false;\n\n if (!request.requestable) return false;\n\n if (request.requestable_type === RequestableType.OPEN_CALL) return false;\n\n const requestable = request.requestable as Exclude<\n typeof request.requestable,\n Pick<OpenCall, \"company_research_interest_id\">\n >;\n\n const { launch_date } = requestable;\n\n if (!launch_date) return false;\n\n return new Date(launch_date) > new Date(Date.UTC(2024, 0, 1));\n};\n\nexport const sortMarketplaceRequests = ({\n requests,\n scores,\n sort,\n}: {\n requests: RequestForCard[];\n scores: Record<number, number>;\n sort: SortBy;\n}): void => {\n // @ts-ignore\n requests.sort((a, b) => {\n const aStatus = getLaunchableRequestStatus(a as any);\n const bStatus = getLaunchableRequestStatus(b as any);\n\n // Sort elements with status higher than elements without status\n const compareStatus = (status: LaunchableRequestStatus) =>\n Number(bStatus === status) - Number(aStatus === status);\n\n const compareScores = scores[b.id] - scores[a.id];\n\n const compareLaunchDate =\n new Date(a.requestable.launch_date!).getTime() -\n new Date(b.requestable.launch_date!).getTime();\n\n const compareDeadline =\n new Date(b.requestable.deadline!).getTime() - new Date(a.requestable.deadline!).getTime();\n\n switch (sort) {\n case SortBy.RELEVANCE:\n return (\n (compareStatus(LaunchableRequestStatus.ACTIVE) ||\n compareStatus(LaunchableRequestStatus.COMING_SOON) ||\n compareStatus(LaunchableRequestStatus.IN_EXTENSION) ||\n compareStatus(LaunchableRequestStatus.CLOSED) ||\n compareScores ||\n (aStatus === LaunchableRequestStatus.COMING_SOON\n ? compareLaunchDate\n : compareDeadline)) ??\n 0\n );\n case SortBy.LAUNCH_DATE:\n return -compareLaunchDate || compareScores;\n case SortBy.DEADLINE:\n return (\n (compareStatus(LaunchableRequestStatus.ACTIVE) ||\n compareStatus(LaunchableRequestStatus.COMING_SOON) ||\n compareStatus(LaunchableRequestStatus.IN_EXTENSION) ||\n compareStatus(LaunchableRequestStatus.CLOSED) ||\n (aStatus === LaunchableRequestStatus.COMING_SOON\n ? compareLaunchDate\n : compareDeadline) ||\n compareScores) ??\n 0\n );\n default:\n assertAbsurd(sort);\n }\n });\n};\n","export function assertAbsurd(argument: never) {\n throw new Error(`Unexpected argument: ${argument}`);\n}\n","import { User } from \"@tsTypes/schema\";\nimport { UniversityExpertise } from \"@tsTypes/universityProfiles\";\n\nexport const sortByHasProfilePicture = <T extends Pick<User, \"image\"> & Record<string, unknown>>(\n users: T[],\n imageSize: \"small\" | \"medium\" | \"large\" = \"medium\"\n): T[] => {\n return users.sort((a, b) => {\n return Number(Boolean(b.image?.[imageSize].url)) - Number(Boolean(a.image?.[imageSize].url));\n });\n};\n\nexport const hasInvalidUniversityExpertise = (expertise: string): boolean => {\n return expertise.split(\",\").some((e) => {\n return !(Object.values(UniversityExpertise) as string[]).includes(e);\n });\n};\n","import { Button, Checkbox, ChipsInput, IconButton, SlideModalBase } from \"@components/library\";\nimport { SearchBarInput } from \"@components/library/Inputs/SearchBarInput\";\nimport { COLORS, FEATURE_FLAGS } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport { useIsMount } from \"@hooks/useIsMount\";\nimport { RootState } from \"@redux/store\";\nimport { RequestPartnerTypes, RequestableType } from \"@tsTypes/requests\";\nimport { ChangeEvent, Dispatch, SetStateAction, useEffect, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { SORT_BY_OPTIONS } from \"./RespondToRequests\";\nimport {\n CheckboxContainer,\n FilterContainer,\n FilterSection,\n ResetFiltersButton,\n} from \"./sharedFilterStyles\";\n\ninterface Props {\n searchFilter: string[];\n setSearchFilter: Dispatch<SetStateAction<string[]>>;\n requestTypesFilter: RequestableType[];\n setRequestTypesFilter: Dispatch<SetStateAction<RequestableType[]>>;\n partnerTypesFilter: RequestPartnerTypes[];\n setPartnerTypesFilter: Dispatch<SetStateAction<RequestPartnerTypes[]>>;\n sortBy: typeof SORT_BY_OPTIONS[number];\n setSortBy: Dispatch<SetStateAction<typeof SORT_BY_OPTIONS[number]>>;\n totalCount: number;\n}\n\nconst SEARCH_FILTER_PARAM = \"search\";\nconst REQUEST_TYPES_FILTER_PARAM = \"request_types\";\nconst PARTNER_TYPES_FILTER_PARAM = \"partner_types\";\n\nexport default function RespondToRequestsFilters({\n searchFilter,\n setSearchFilter,\n requestTypesFilter,\n setRequestTypesFilter,\n partnerTypesFilter,\n setPartnerTypesFilter,\n sortBy,\n setSortBy,\n totalCount,\n}: Props) {\n const [isPanelOpen, setIsPanelOpen] = useState(false);\n const [searchInput, setSearchInput] = useState(\"\");\n\n const isTablet = useSelector((state: RootState) => state.window.isTablet);\n\n const [searchParams] = useSearchParams();\n const history = useHistory();\n const isMount = useIsMount();\n\n useEffect(() => {\n if (isMount) {\n if (searchParams.has(SEARCH_FILTER_PARAM)) {\n setSearchFilter(searchParams.get(SEARCH_FILTER_PARAM)!.split(\";\"));\n }\n if (searchParams.has(REQUEST_TYPES_FILTER_PARAM)) {\n const requestTypes = searchParams.get(REQUEST_TYPES_FILTER_PARAM)!.split(\";\");\n setRequestTypesFilter(requestTypes as RequestableType[]);\n }\n if (searchParams.has(PARTNER_TYPES_FILTER_PARAM)) {\n const partnerTypes = searchParams.get(PARTNER_TYPES_FILTER_PARAM)!.split(\";\");\n setPartnerTypesFilter(partnerTypes as RequestPartnerTypes[]);\n }\n return;\n }\n\n if (searchFilter.length) searchParams.set(SEARCH_FILTER_PARAM, searchFilter.join(\";\"));\n else searchParams.delete(SEARCH_FILTER_PARAM);\n if (requestTypesFilter.length)\n searchParams.set(REQUEST_TYPES_FILTER_PARAM, requestTypesFilter.join(\";\"));\n else searchParams.delete(REQUEST_TYPES_FILTER_PARAM);\n if (partnerTypesFilter.length)\n searchParams.set(PARTNER_TYPES_FILTER_PARAM, partnerTypesFilter.join(\";\"));\n else searchParams.delete(PARTNER_TYPES_FILTER_PARAM);\n\n history.replace({ search: searchParams.toString() });\n }, [searchFilter, setSearchFilter, requestTypesFilter, setRequestTypesFilter]);\n\n const handleClearFilters = () => {\n setSearchInput(\"\");\n setSearchFilter([]);\n setRequestTypesFilter([]);\n setPartnerTypesFilter([]);\n };\n\n const searchFilterAsChips = searchFilter.map((value) => ({ value, label: value }));\n\n const searchBarEl = (\n <SearchBarInput\n value={searchInput}\n onChange={setSearchInput}\n onSubmit={(value) => {\n if (!value) return;\n setSearchFilter([...searchFilter, value]);\n setSearchInput(\"\");\n }}\n placeholder=\"Expertise, request, etc.\"\n buttonText={null}\n />\n );\n\n const searchFilterEl =\n searchFilter.length > 0 ? (\n <div style={{ marginTop: 16 }}>\n <ChipsInput\n options={searchFilterAsChips}\n selectedValues={searchFilter}\n onChange={(values) => setSearchFilter(values ?? [])}\n gap=\"8px 8px\"\n hideAll\n />\n </div>\n ) : null;\n\n const handleRequestTypeChange =\n (requestType: RequestableType) => (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setRequestTypesFilter((prev) => [...prev, requestType]);\n } else {\n setRequestTypesFilter((prev) => prev.filter((type) => type !== requestType));\n }\n };\n\n const handlePartnerTypeChange =\n (partnerType: RequestPartnerTypes) => (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setPartnerTypesFilter((prev) => [...prev, partnerType]);\n } else {\n setPartnerTypesFilter((prev) => prev.filter((type) => type !== partnerType));\n }\n };\n\n const commonFiltersEl = (\n <>\n {/*\n <FilterSection label=\"Companies seeking\">\n <CheckboxContainer data-testid=\"request-type-checkboxes\">\n <Checkbox\n isReversed={isTablet}\n label={\n <CheckboxLabel withMargin={isTablet}>\n <Icon name=\"RFP\" size=\"sm\" color={COLORS.BLACK} margin=\"0 -4px 0 0\" />\n Solutions\n </CheckboxLabel>\n }\n isChecked={requestTypesFilter.includes(RequestableType.RFP)}\n onChange={handleRequestTypeChange(RequestableType.RFP)}\n size=\"sm\"\n />\n <Checkbox\n isReversed={isTablet}\n label={\n <CheckboxLabel withMargin={isTablet}>\n <Icon\n name=\"Request for experts\"\n size=\"xs\"\n color={COLORS.BLACK}\n margin=\"0 -1px 0 2px\"\n />\n Experts\n <InfoTag accent marginLeft=\"2px\">\n NEW\n </InfoTag>\n </CheckboxLabel>\n }\n isChecked={requestTypesFilter.includes(RequestableType.REQUEST_FOR_EXPERT)}\n onChange={handleRequestTypeChange(RequestableType.REQUEST_FOR_EXPERT)}\n size=\"sm\"\n />\n </CheckboxContainer>\n </FilterSection>\n */}\n {FEATURE_FLAGS.MARKETPLACE_PARTNER_TYPE_FILTER && (\n <FilterSection label=\"Preferred partner\">\n <CheckboxContainer data-testid=\"partner-type-checkboxes\">\n <Checkbox\n isReversed={isTablet}\n label={<CheckboxLabel withMargin={isTablet}>Startups</CheckboxLabel>}\n isChecked={partnerTypesFilter.includes(RequestPartnerTypes.STARTUPS)}\n onChange={handlePartnerTypeChange(RequestPartnerTypes.STARTUPS)}\n size=\"sm\"\n />\n <Checkbox\n isReversed={isTablet}\n label={<CheckboxLabel withMargin={isTablet}>Academic researchers</CheckboxLabel>}\n isChecked={partnerTypesFilter.includes(RequestPartnerTypes.ACADEMIC_RESEARCHERS)}\n onChange={handlePartnerTypeChange(RequestPartnerTypes.ACADEMIC_RESEARCHERS)}\n size=\"sm\"\n />\n <Checkbox\n isReversed={isTablet}\n label={<CheckboxLabel withMargin={isTablet}>Suppliers</CheckboxLabel>}\n isChecked={partnerTypesFilter.includes(RequestPartnerTypes.SUPPLIERS)}\n onChange={handlePartnerTypeChange(RequestPartnerTypes.SUPPLIERS)}\n size=\"sm\"\n />\n </CheckboxContainer>\n </FilterSection>\n )}\n </>\n );\n\n if (isTablet)\n return (\n <>\n <SlideModalBase\n isOpen={isPanelOpen}\n onClose={() => setIsPanelOpen(false)}\n closeOnDimmerClick\n direction=\"bottom\"\n customCloseButton={\n <IconButton\n iconName=\"Close\"\n size=\"sm\"\n variant=\"fourth\"\n onClick={() => setIsPanelOpen(false)}\n tooltipPosition=\"bottom\"\n data-testid=\"close-button\"\n margin=\"0 -6px 0 0\"\n />\n }\n >\n <Panel>\n <FilterContainer>\n {commonFiltersEl}\n <FilterSection label=\"Sort by\">\n <CheckboxContainer data-testid=\"sort-radio\">\n {SORT_BY_OPTIONS.map((option) => (\n <Checkbox\n key={`sort-${option.value}`}\n isReversed={isTablet}\n label={<CheckboxLabel withMargin={isTablet}>{option.label}</CheckboxLabel>}\n isChecked={sortBy.value === option.value}\n onChange={(e) => e.target.checked && setSortBy(option)}\n size=\"sm\"\n type=\"radio\"\n />\n ))}\n </CheckboxContainer>\n </FilterSection>\n <ResetFiltersButton onClick={handleClearFilters} />\n </FilterContainer>\n <PanelFooter>\n <Button variant=\"ghost\" onClick={() => setIsPanelOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={() => setIsPanelOpen(false)}>\n View {totalCount} opportunities\n </Button>\n </PanelFooter>\n </Panel>\n </SlideModalBase>\n <div style={{ marginBottom: 22 }}>\n <SearchAndFilter>\n <div style={{ width: \"100%\" }}>{searchBarEl}</div>\n <IconButton\n iconName=\"Filter & sort\"\n variant=\"fourth\"\n tooltipWidth=\"90px\"\n onClick={() => setIsPanelOpen(true)}\n />\n </SearchAndFilter>\n {searchFilterEl}\n </div>\n </>\n );\n\n return (\n <FilterContainer>\n <FilterSection label=\"Search\" labelMargin=\"0 0 23px\">\n {searchBarEl}\n {searchFilterEl}\n </FilterSection>\n {commonFiltersEl}\n <ResetFiltersButton onClick={handleClearFilters} />\n </FilterContainer>\n );\n}\n\nconst SearchAndFilter = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n margin-bottom: 16px;\n`;\n\nconst Panel = styled.div`\n height: calc(100vh - 80px);\n width: 100%;\n\n ${FilterContainer} {\n padding: 45px 24px;\n overflow-y: auto;\n max-height: calc(100vh - 84px);\n }\n`;\n\nconst PanelFooter = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n border-top: 1px solid ${COLORS.NEUTRAL_250};\n`;\n\nconst CheckboxLabel = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n ${({ withMargin }) =>\n withMargin &&\n `\n margin: 4px;\n `}\n`;\n","import RfpCard from \"@components/RfpCard/RfpCard\";\nimport { BlankModal, Icon, Pagination, SelectableDropdown } from \"@components/library\";\nimport { RfpUnsubscribeModal } from \"@components/modals\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getMarketplaceRequests } from \"@requests/requests\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { RequestPartnerTypes, RequestableType } from \"@tsTypes/requests\";\nimport { sortMarketplaceRequests } from \"@utils/requestUtils\";\nimport { toastErrorHandler } from \"@utils/requests\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\nimport KeywordSignUpModal from \"../../components/modals/KeywordSignUpModal\";\nimport RespondToRequestsFilters from \"./RespondToRequestsFilters\";\nimport { Columns, ContentColumn, FilterColumn } from \"./sharedFilterStyles\";\n\ninterface Props {\n currentPageNum: number;\n setCurrentPageNum: (newPageNum: number) => void;\n}\n\nexport enum SortBy {\n RELEVANCE = \"relevance\",\n LAUNCH_DATE = \"launch_date\",\n DEADLINE = \"deadline\",\n}\nexport const SORT_BY_OPTIONS = [\n { value: SortBy.RELEVANCE, label: \"Recommended\" },\n { value: SortBy.LAUNCH_DATE, label: \"Recently added\" },\n { value: SortBy.DEADLINE, label: \"Deadline\" },\n] as const;\n\nexport const MAX_REQUEST_CARD_WIDTH = 586;\nconst NON_FEATURED_CARDS_PER_PAGE = 15;\nconst VIEW_ALL_PARAM = \"view_all\";\n\nconst RespondToRequests = ({ currentPageNum, setCurrentPageNum }: Props) => {\n const [isRfpUnsubscribeModalOpen, setIsRfpUnsubscribeModalOpen] = useState(false);\n const [isKeywordsModalOpen, setIsKeywordsModalOpen] = useState(false);\n\n const [sortBy, setSortBy] = useState<(typeof SORT_BY_OPTIONS)[number]>(SORT_BY_OPTIONS[0]);\n const [searchFilter, setSearchFilter] = useState<string[]>([]);\n const [requestTypesFilter, setRequestTypesFilter] = useState<RequestableType[]>([]);\n const [partnerTypesFilter, setPartnerTypesFilter] = useState<RequestPartnerTypes[]>([]);\n const allFilters = [searchFilter, requestTypesFilter, partnerTypesFilter];\n\n const isTablet = useSelector((state: RootState) => state.window.isTablet);\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const scrollToRef = useRef<HTMLDivElement | null>(null);\n\n const dispatch = useDispatch();\n\n const [searchParams] = useSearchParams();\n const canViewAllParam = searchParams.get(VIEW_ALL_PARAM) === \"true\";\n const canViewAll =\n canViewAllParam || localStorage?.getItem(VIEW_ALL_PARAM) === \"true\" || currentUser.id;\n\n useEffect(() => {\n if (!canViewAllParam) return;\n\n // Save the view_all param to local storage so this session can always view all RFPs even without the param\n if (localStorage && !localStorage.getItem(VIEW_ALL_PARAM))\n localStorage.setItem(VIEW_ALL_PARAM, \"true\");\n }, [canViewAllParam]);\n\n const { data, isLoading } = useQuery(\n [\"getMarketplaceRequests\", ...allFilters],\n () =>\n getMarketplaceRequests({\n searchFilter,\n requestTypesFilter,\n partnerTypesFilter,\n }),\n {\n onError: toastErrorHandler,\n onSuccess: () => setCurrentPageNum(1),\n }\n );\n const requests = data?.requests ?? [];\n const requestScores = data?.scores ?? {};\n const totalCount = requests.length;\n\n useEffect(() => {\n if (location.search.includes(\"unsubscribe=\") && location.search.includes(\"nid=\")) {\n setIsRfpUnsubscribeModalOpen(true);\n }\n if (location.search.includes(\"modal=keywords\")) {\n setIsKeywordsModalOpen(true);\n }\n }, []);\n\n useEffect(() => {\n if (Number(totalCount) > 0) {\n scrollToRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [currentPageNum]);\n\n const beginningOfPage = (currentPageNum - 1) * NON_FEATURED_CARDS_PER_PAGE;\n const endOfPage = beginningOfPage + NON_FEATURED_CARDS_PER_PAGE;\n\n sortMarketplaceRequests({ requests, scores: requestScores, sort: sortBy.value });\n\n const filters = (\n <RespondToRequestsFilters\n searchFilter={searchFilter}\n setSearchFilter={setSearchFilter}\n requestTypesFilter={requestTypesFilter}\n setRequestTypesFilter={setRequestTypesFilter}\n partnerTypesFilter={partnerTypesFilter}\n setPartnerTypesFilter={setPartnerTypesFilter}\n sortBy={sortBy}\n setSortBy={setSortBy}\n totalCount={totalCount}\n />\n );\n\n return (\n <>\n <BlankModal\n onClose={() => {\n setIsKeywordsModalOpen(false);\n }}\n isOpen={isKeywordsModalOpen}\n width=\"540px\"\n >\n <KeywordSignUpModal\n onSubmit={() => {\n setIsKeywordsModalOpen(false);\n }}\n />\n </BlankModal>\n <RfpUnsubscribeModal\n isOpen={isRfpUnsubscribeModalOpen}\n onClose={() => setIsRfpUnsubscribeModalOpen(false)}\n />\n <Container>\n {!isTablet && (\n <Description>\n Find requests from corporate R&D teams.\n <br />\n Submit a non-confidential response in about 30 minutes.\n </Description>\n )}\n <Columns>\n <FilterColumn>{filters}</FilterColumn>\n <ContentColumn>\n <>\n {!isTablet && (\n <CountAndSort>\n <div>\n Sort by:\n <SelectableDropdown\n options={SORT_BY_OPTIONS}\n value={sortBy}\n onChange={setSortBy}\n menuHorizontalPosition=\"right\"\n />\n </div>\n </CountAndSort>\n )}\n {isTablet && filters}\n </>\n {isLoading ? (\n <Loader active inline=\"centered\" style={{ marginTop: 100 }} />\n ) : (\n <>\n <div ref={scrollToRef}>\n {requests.length > 0 ? (\n <CardsContainer data-testid=\"request-cards\">\n {requests.slice(beginningOfPage, endOfPage).map((request) => (\n <RfpCard\n key={request.id}\n request={request}\n fromHref={window.location.pathname + window.location.search}\n />\n ))}\n </CardsContainer>\n ) : (\n <NoResultsContainer>\n <NoResultsHeader>\n <Icon name=\"Search\" color={COLORS.NEUTRAL_500} />\n Sorry, no results.\n </NoResultsHeader>\n <NoResultsText>\n Try changing your search terms or adjusting your filters.\n </NoResultsText>\n </NoResultsContainer>\n )}\n </div>\n <Pagination\n currentPage={currentPageNum}\n setCurrentPage={(pageNumber: number) =>\n canViewAll\n ? setCurrentPageNum(pageNumber)\n : dispatch(toggleLoginModal({ open: true }))\n }\n totalPages={Math.ceil(Number(totalCount) / NON_FEATURED_CARDS_PER_PAGE)}\n marginTop=\"56px\"\n />\n </>\n )}\n </ContentColumn>\n </Columns>\n </Container>\n </>\n );\n};\n\nexport default RespondToRequests;\n\n// These are also used in FindPartners.tsx\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n gap: 56px;\n margin-top: 48px;\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n margin-top: 32px;\n }\n`;\nexport const Description = styled.h2`\n ${FONTS.HEADING_3_REGULAR};\n margin-bottom: 8px;\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n display: none;\n }\n`;\nconst CardsContainer = styled.div`\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n grid-gap: 20px;\n max-width: 2350px;\n ${WINDOW_DIMENSIONS.EXTRA_WIDE_MEDIA_QUERY} {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n ${WINDOW_DIMENSIONS.DESKTOP_MEDIA_QUERY} {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n ${WINDOW_DIMENSIONS.TABLET_LANDSCAPE_MEDIA_QUERY} {\n grid-template-columns: minmax(0, 1fr);\n }\n`;\nconst CountAndSort = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 24px;\n margin-bottom: 24px;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 6px;\n ${FONTS.REGULAR_2}\n }\n`;\nconst NoResultsContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 128px 0px;\n`;\nconst NoResultsHeader = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n`;\nconst NoResultsText = styled.div`\n ${FONTS.REGULAR_2}\n color: ${COLORS.NEUTRAL_500};\n text-align: center;\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n max-width: 240px;\n }\n`;\n","import { Icon } from \"@components/library\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { ReactNode, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { ClearFilterButton } from \"../UniversityTeam/UniversityTeamSearch\";\n\n/**\n * Page layout\n */\n\nexport const Columns = styled.div`\n display: flex;\n gap: 36px;\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n flex-direction: column;\n gap: 10px;\n }\n`;\n\nexport const FilterColumn = styled.div`\n flex: 0 0 280px;\n max-width: 280px;\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n display: none;\n }\n`;\n\nexport const ContentColumn = styled.div`\n flex: 1;\n`;\n\n/**\n * Filters\n */\n\nexport const FilterContainer = styled.div`\n position: sticky;\n top: 50px;\n\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n padding: 0 0 32px 0;\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n position: relative;\n top: 0;\n }\n`;\n\nexport const FilterSection = ({\n label,\n labelMargin = \"0 0 16px\",\n collapsible,\n children,\n}: {\n label: string;\n labelMargin?: string;\n collapsible?: boolean;\n children: ReactNode;\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n return (\n <FilterSectionContainer isExpanded={isExpanded}>\n <Label\n margin={labelMargin}\n collapsible={collapsible}\n onClick={() => collapsible && setIsExpanded(!isExpanded)}\n >\n {label}\n {collapsible && <Icon name={isExpanded ? \"Chevron Up\" : \"Chevron Down\"} />}\n </Label>\n <FilterContentsContainer isExpanded={isExpanded}>{children}</FilterContentsContainer>\n </FilterSectionContainer>\n );\n};\n\nconst FilterSectionContainer = styled.div`\n padding-bottom: ${({ isExpanded }) => (isExpanded ? \"24px\" : \"0\")};\n border-bottom: 1px solid ${COLORS.NEUTRAL_200};\n`;\n\nconst Label = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: ${({ margin }) => margin ?? \"0 0 16px\"};\n ${FONTS.SEMIBOLD_1}\n\n &:hover {\n ${({ collapsible }) => collapsible && `cursor: pointer;`}\n }\n`;\n\nconst FilterContentsContainer = styled.div`\n height: ${({ isExpanded }) => (isExpanded ? \"auto\" : \"0\")};\n overflow: hidden;\n`;\n\n/**\n * Inputs\n */\n\nexport const CheckboxContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n`;\n\nexport const ResetFiltersButton = ({ onClick }: { onClick: () => void }) => (\n <ClearFilterButton type=\"button\" onClick={onClick}>\n <Icon name=\"Refresh\" margin=\"0 4px 2px -4px\" color={COLORS.HALO_BLUE} />\n Reset filters\n </ClearFilterButton>\n);\n","import { InfoBanner, SingleSelectDropdown, TextInput } from \"@components/library\";\nimport KeywordsDropdown from \"@components/library/Dropdowns/KeywordsDropdown/KeywordsDropdown\";\nimport { COUNTRY_OPTIONS } from \"@constants\";\nimport { getOptionFromValue, getValueFromOption } from \"@utils/dropdownUtils\";\nimport { isValidURL } from \"@utils/textUtils\";\nimport { useEffect } from \"react\";\nimport * as S from \"../StepStyles\";\n\nexport const STARTUP_TITLES = [\"Business Development\", \"CEO\", \"CSO\", \"Researcher\"];\nexport const STARTUP_TITLE_OPTIONS = STARTUP_TITLES.map(getOptionFromValue);\nexport const companyRoleOptions = STARTUP_TITLES.map((text) => ({\n label: text,\n value: text,\n}));\n\nfunction CompanyScientist({ profileInfo, setProfileInfo, selectedGoogleScholarAuthor }) {\n const { countryOption, role, disciplines, areasOfExpertise } = profileInfo;\n\n const handleCompany = (e) => {\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n companyName: e.target.value,\n }));\n };\n\n const handleCompanyWebsite = (e) => {\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n companyURL: e.target.value,\n }));\n };\n\n // Prefill data if author is selected\n useEffect(() => {\n if (!selectedGoogleScholarAuthor) return;\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n disciplines: selectedGoogleScholarAuthor.disciplines,\n areasOfExpertise: selectedGoogleScholarAuthor.areas_of_expertise,\n }));\n // step2: startup, step3: startup (match!)\n if (!selectedGoogleScholarAuthor.is_university_scientist) {\n // prefill company name, role\n handleCompany({ target: { value: selectedGoogleScholarAuthor.location } });\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n role: selectedGoogleScholarAuthor.title,\n }));\n }\n }, []);\n\n return (\n <>\n <InfoBanner\n shouldDisplay={Boolean(selectedGoogleScholarAuthor?.is_university_scientist)}\n text={\n <>\n Google Scholar shows a research institution as your current organization, but\n you've indicated you're currently at a company. Please add your details below.\n </>\n }\n type=\"ghost\"\n margin=\"0 0 32px\"\n padding=\"0\"\n />\n <S.DropdownRow>\n <S.DropdownTitle>Company name</S.DropdownTitle>\n <TextInput\n placeholder=\"Enter company name\"\n onChange={handleCompany}\n value={profileInfo?.companyName || \"\"}\n data-testid=\"company-scientist-company-name-input\"\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>Company location</S.DropdownTitle>\n <SingleSelectDropdown\n withSearchIcon\n placeholder=\"Search countries\"\n value={countryOption}\n options={COUNTRY_OPTIONS}\n onChange={(option) =>\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n countryOption: option,\n country_code: getValueFromOption(option),\n }))\n }\n data-testid=\"company-scientist-country-dropdown\"\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>Company website</S.DropdownTitle>\n <TextInput\n placeholder=\"Enter company website URL\"\n onChange={handleCompanyWebsite}\n value={profileInfo?.companyURL || \"\"}\n data-testid=\"company-scientist-company-website-input\"\n errors={[\n {\n hasError:\n Boolean(profileInfo?.companyURL?.length) && !isValidURL(profileInfo?.companyURL),\n errorMessage: \"Please enter a valid URL\",\n },\n ]}\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>What is your job title?</S.DropdownTitle>\n <TextInput\n placeholder=\"Enter your job title\"\n onChange={(e) =>\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n role: e.target.value,\n }))\n }\n value={role}\n data-testid=\"company-scientist-role-input\"\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>Which disciplines are most relevant to your work?</S.DropdownTitle>\n <KeywordsDropdown\n keywordType=\"discipline\"\n targetType=\"scientist\"\n value={disciplines ?? []}\n onChange={(selection) => setProfileInfo({ ...profileInfo, disciplines: selection })}\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>What is your expertise?</S.DropdownTitle>\n <KeywordsDropdown\n keywordType=\"area_of_expertise\"\n targetType=\"scientist\"\n value={areasOfExpertise ?? []}\n onChange={(selection) => setProfileInfo({ ...profileInfo, areasOfExpertise: selection })}\n />\n </S.DropdownRow>\n </>\n );\n}\n\nexport default CompanyScientist;\n","import { useEffect } from \"react\";\n\nimport { SingleSelectDropdown, TextInput } from \"@components/library\";\nimport KeywordsDropdown from \"@components/library/Dropdowns/KeywordsDropdown/KeywordsDropdown\";\nimport { SponsorRole } from \"@tsTypes/sponsorProfiles\";\nimport { getOptionFromValue, getValueFromOption } from \"@utils/dropdownUtils\";\nimport { isValidURL } from \"@utils/textUtils\";\nimport api from \"src/requests/request\";\nimport { useCompanyOptions } from \"../Hooks\";\nimport * as S from \"../StepStyles\";\nimport { COMPANY_SPONSOR_TITLE_LIMIT } from \"./Step3\";\n\nconst fetchCompanySuggestions = async (email) => {\n const responseJson = await api.get(\"/onboarding/company_suggestions\", { params: { email } });\n return responseJson.data?.company_suggestions || [];\n};\n\nconst roleDropdownOptions = Object.values(SponsorRole).map((text) => ({\n label: text,\n value: text,\n}));\n\nfunction CompanySponsor({ profileInfo, setProfileInfo, email, prefillCompanyName = \"\" }) {\n const { role, areasOfExpertise } = profileInfo;\n\n const [companyOptions] = useCompanyOptions();\n\n useEffect(() => {\n // Returns array of suggestions. Current UI only calls on initial load.\n // set company based on first suggestion\n (async () => {\n const fetchedSuggestions = await fetchCompanySuggestions(email);\n if (fetchedSuggestions.length) {\n const suggestedCompany = fetchedSuggestions[0];\n setProfileInfo({\n ...profileInfo,\n company: suggestedCompany,\n });\n }\n })();\n }, []);\n\n const handleCompany = (e, selection) => {\n if (selection?.action === \"select-option\" || selection?.action === \"create-option\") {\n setProfileInfo({\n ...profileInfo,\n company: e.value,\n });\n }\n };\n\n const handleCompanyWebsite = (e) => {\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n companyURL: e.target.value,\n }));\n };\n\n return (\n <>\n <S.DropdownRow>\n <S.DropdownTitle>Organization name</S.DropdownTitle>\n {prefillCompanyName.length > 0 ? (\n <S.Input type=\"text\" value={prefillCompanyName} tabIndex={-1} fixed readOnly />\n ) : (\n <SingleSelectDropdown\n withSearchIcon\n placeholder=\"Search organization names or add new\"\n isCreatable\n options={companyOptions}\n onChange={handleCompany}\n value={getOptionFromValue(profileInfo.company)}\n data-testid=\"company-sponsor-step-4-company-dropdown\"\n />\n )}\n </S.DropdownRow>\n {profileInfo.company &&\n !companyOptions.map(({ value }) => value).includes(profileInfo.company) && (\n <S.DropdownRow>\n <S.DropdownTitle>Organization website</S.DropdownTitle>\n <TextInput\n placeholder=\"Enter organization website URL\"\n onChange={handleCompanyWebsite}\n value={profileInfo?.companyURL || \"\"}\n data-testid=\"company-sponsor-company-website-input\"\n errors={[\n {\n hasError:\n Boolean(profileInfo?.companyURL?.length) &&\n !isValidURL(profileInfo?.companyURL),\n errorMessage: \"Please enter a valid URL\",\n },\n ]}\n />\n </S.DropdownRow>\n )}\n <S.DropdownRow>\n <S.DropdownTitle>Which of the following best describes your role?</S.DropdownTitle>\n <SingleSelectDropdown\n placeholder=\"Select your role\"\n options={roleDropdownOptions}\n onChange={(e) =>\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n role: getValueFromOption(e),\n }))\n }\n value={getOptionFromValue(role)}\n data-testid=\"ri-scientist-role-input\"\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>What is your job title?</S.DropdownTitle>\n <TextInput\n value={profileInfo.title || \"\"}\n placeholder=\"Enter your job title\"\n onChange={(e) => {\n setProfileInfo({\n ...profileInfo,\n title: e.target.value,\n });\n }}\n errors={[\n {\n hasError: profileInfo.title?.length > COMPANY_SPONSOR_TITLE_LIMIT,\n errorMessage: `Job title must be less than ${COMPANY_SPONSOR_TITLE_LIMIT} characters`,\n },\n ]}\n hideClearButton\n data-testid=\"company-sponsor-step-4-title-field\"\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>What is your expertise?</S.DropdownTitle>\n <KeywordsDropdown\n keywordType=\"area_of_expertise\"\n targetType=\"sponsor\"\n value={areasOfExpertise ?? []}\n onChange={(selection) => setProfileInfo({ ...profileInfo, areasOfExpertise: selection })}\n />\n </S.DropdownRow>\n </>\n );\n}\n\nexport default CompanySponsor;\n","import { Checkbox, SingleSelectDropdown, UniversityDropdown } from \"@components/library\";\nimport { COUNTRY_OPTIONS } from \"@constants\";\nimport { getDisciplines } from \"@requests/keywords\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { getOptionFromValue, getValueFromOption } from \"@utils/dropdownUtils\";\nimport { useEffect } from \"react\";\nimport api from \"src/requests/request\";\nimport * as S from \"../StepStyles\";\n\nfunction ResearchInstitutionAdmin({ profileInfo, setProfileInfo, prefillInstitutionName = \"\" }) {\n const { data: disciplineOptions } = useQuery({\n queryKey: [\"getDisciplines\"],\n queryFn: () => getDisciplines(),\n select: (data) => data.map(getOptionFromValue),\n });\n\n useEffect(() => {\n if (!disciplineOptions) return;\n if (\"disciplines\" in profileInfo) return;\n setProfileInfo({\n ...profileInfo,\n disciplines: disciplineOptions?.map(getValueFromOption),\n });\n }, [disciplineOptions]);\n\n const { university, universityHasCountry, countryOption, disciplines } = profileInfo;\n\n const handleDisciplines = (value) => {\n setProfileInfo({\n ...profileInfo,\n disciplines: disciplines.includes(value)\n ? disciplines.filter((v) => v !== value)\n : [...disciplines, value],\n });\n };\n\n const handleSelectUniversityOption = async (option) => {\n if (!option) return;\n\n const responseJson = await api.get(\"/universities/has_country\", {\n params: { name: getValueFromOption(option) },\n });\n\n const { has_country } = responseJson.data;\n\n setProfileInfo({\n ...profileInfo,\n university: getValueFromOption(option),\n universityHasCountry: has_country,\n });\n };\n\n const handleAllDisciplines = (event) => {\n if (event.target.checked) {\n setProfileInfo({\n ...profileInfo,\n disciplines: disciplineOptions?.map((option) => option?.value),\n });\n } else {\n setProfileInfo({\n ...profileInfo,\n disciplines: [],\n });\n }\n };\n\n return (\n <>\n <S.DropdownRow>\n <S.DropdownTitle>Research institution</S.DropdownTitle>\n {prefillInstitutionName.length > 0 ? (\n <S.Input type=\"text\" value={prefillInstitutionName} tabIndex={-1} fixed readOnly />\n ) : (\n <>\n <UniversityDropdown\n value={getOptionFromValue(university)}\n onChange={handleSelectUniversityOption}\n data-testid=\"ri-admin-institution-name-input\"\n />\n <S.ContactLink>\n You can{\" \"}\n <a\n href=\"/contact?message=Hello, I can't find my institution as an option. My institution is: \"\n target=\"_blank\"\n >\n request that we add your institution\n </a>{\" \"}\n if you don’t see it above.\n </S.ContactLink>\n </>\n )}\n </S.DropdownRow>\n {!universityHasCountry && prefillInstitutionName.length === 0 && (\n <S.DropdownRow>\n <S.DropdownTitle>Institution location</S.DropdownTitle>\n <SingleSelectDropdown\n placeholder=\"Search countries\"\n value={countryOption}\n options={COUNTRY_OPTIONS}\n onChange={(option) =>\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n countryOption: option,\n country_code: getValueFromOption(option),\n }))\n }\n data-testid=\"ri-admin-institution-location-input\"\n />\n </S.DropdownRow>\n )}\n <S.DropdownRow>\n <S.DropdownTitle>Which topics would you like to hear about on Halo?</S.DropdownTitle>\n <S.CheckboxContainer>\n <S.CheckboxItem>\n <Checkbox\n label=\"All disciplines\"\n isChecked={disciplines?.length === disciplineOptions?.length}\n onChange={handleAllDisciplines}\n size=\"sm\"\n />\n </S.CheckboxItem>\n {disciplineOptions?.map((option) => (\n <S.CheckboxItem key={option?.value}>\n <Checkbox\n label={option?.label}\n isChecked={disciplines?.includes(option?.value)}\n onChange={() => handleDisciplines(option?.value)}\n size=\"sm\"\n />\n </S.CheckboxItem>\n ))}\n </S.CheckboxContainer>\n </S.DropdownRow>\n </>\n );\n}\n\nexport default ResearchInstitutionAdmin;\n","import { InfoBanner, SingleSelectDropdown, UniversityDropdown } from \"@components/library\";\nimport KeywordsDropdown from \"@components/library/Dropdowns/KeywordsDropdown/KeywordsDropdown\";\nimport { COUNTRY_OPTIONS } from \"@constants\";\nimport { getOptionFromValue, getValueFromOption } from \"@utils/dropdownUtils\";\nimport { useEffect } from \"react\";\nimport { SCIENTIST_ROLES } from \"src/constants\";\nimport api from \"src/requests/request\";\nimport * as S from \"../StepStyles\";\n\nexport const SCIENTIST_ROLE_OPTIONS = SCIENTIST_ROLES.map(getOptionFromValue);\n\nfunction ResearchInstitutionScientist({\n profileInfo,\n setProfileInfo,\n prefillInstitutionName = \"\",\n selectedGoogleScholarAuthor,\n}: {\n profileInfo: any;\n setProfileInfo: any;\n prefillInstitutionName?: string;\n selectedGoogleScholarAuthor?: any;\n}) {\n const { university, universityHasCountry, role, disciplines, areasOfExpertise, countryOption } =\n profileInfo;\n\n const handleSelectUniversityOption = async (option) => {\n if (!option) return;\n\n const responseJson = await api.get(\"/universities/has_country\", {\n params: { name: getValueFromOption(option) },\n });\n const { has_country } = responseJson.data;\n\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n university: getValueFromOption(option),\n universityHasCountry: has_country,\n }));\n };\n\n // Prefill data if author is selected\n useEffect(() => {\n if (!selectedGoogleScholarAuthor) return;\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n disciplines: selectedGoogleScholarAuthor.disciplines,\n areasOfExpertise: selectedGoogleScholarAuthor.areas_of_expertise,\n }));\n // step2: university, step3a: university (match!)\n if (selectedGoogleScholarAuthor.is_university_scientist) {\n // pre-fill university, has_country, title\n handleSelectUniversityOption(getOptionFromValue(selectedGoogleScholarAuthor.location));\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n role: selectedGoogleScholarAuthor.title,\n }));\n }\n }, []);\n\n const googleScholarInstitutionNotFound = Boolean(\n selectedGoogleScholarAuthor && !selectedGoogleScholarAuthor.is_university_scientist\n );\n\n return (\n <>\n <InfoBanner\n shouldDisplay={googleScholarInstitutionNotFound}\n text={\n <div>\n The institution listed in your Google Scholar profile is not currently in our database.\n You can{\" \"}\n <a\n href=\"/contact?message=Hello, I can't find my institution as an option. My institution is: \"\n target=\"_blank\"\n >\n request that we add your institution\n </a>{\" \"}\n or choose a different institution below.\n </div>\n }\n type=\"ghost\"\n margin=\"0 0 32px\"\n padding=\"0\"\n />\n <S.DropdownRow>\n <S.DropdownTitle>Research institution</S.DropdownTitle>\n {prefillInstitutionName.length > 0 ? (\n <S.Input type=\"text\" value={prefillInstitutionName} tabIndex={-1} fixed readOnly />\n ) : (\n <>\n <UniversityDropdown\n value={getOptionFromValue(university)}\n onChange={handleSelectUniversityOption}\n data-testid=\"ri-scientist-institution-name-input\"\n />\n {!googleScholarInstitutionNotFound && (\n <S.ContactLink>\n You can{\" \"}\n <a\n href=\"/contact?message=Hello, I can't find my institution as an option. My institution is: \"\n target=\"_blank\"\n >\n request that we add your institution\n </a>{\" \"}\n if you don’t see it above.\n </S.ContactLink>\n )}\n </>\n )}\n </S.DropdownRow>\n {!universityHasCountry && prefillInstitutionName.length === 0 && (\n <S.DropdownRow>\n <S.DropdownTitle>Institution location</S.DropdownTitle>\n <SingleSelectDropdown\n withSearchIcon\n placeholder=\"Search countries\"\n value={countryOption}\n options={COUNTRY_OPTIONS}\n onChange={(option) =>\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n countryOption: option,\n country_code: getValueFromOption(option),\n }))\n }\n data-testid=\"ri-scientist-institution-location-input\"\n />\n </S.DropdownRow>\n )}\n <S.DropdownRow>\n <S.DropdownTitle>Which of the following best describes your role?</S.DropdownTitle>\n <SingleSelectDropdown\n placeholder=\"Select your role\"\n options={SCIENTIST_ROLE_OPTIONS}\n onChange={(e) =>\n setProfileInfo((oldProfileInfo) => ({\n ...oldProfileInfo,\n role: getValueFromOption(e),\n }))\n }\n value={getOptionFromValue(role)}\n data-testid=\"ri-scientist-role-input\"\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>Which disciplines are most relevant to your work?</S.DropdownTitle>\n <KeywordsDropdown\n keywordType=\"discipline\"\n targetType=\"scientist\"\n value={disciplines ?? []}\n onChange={(selection) => setProfileInfo({ ...profileInfo, disciplines: selection })}\n />\n </S.DropdownRow>\n <S.DropdownRow>\n <S.DropdownTitle>What is your expertise?</S.DropdownTitle>\n <S.DropdownSubtitle>Choose between 3 and 10 terms.</S.DropdownSubtitle>\n <KeywordsDropdown\n keywordType=\"area_of_expertise\"\n targetType=\"scientist\"\n value={areasOfExpertise ?? []}\n onChange={(selection) => setProfileInfo({ ...profileInfo, areasOfExpertise: selection })}\n />\n </S.DropdownRow>\n </>\n );\n}\n\nexport default ResearchInstitutionScientist;\n","import Step3CompanyScientist from \"./CompanyScientist\";\nimport Step3CompanySponsor from \"./CompanySponsor\";\nimport Step3ResearchInstitutionAdmin from \"./ResearchInstitutionAdmin\";\nimport Step3ResearchInstitutionScientist from \"./ResearchInstitutionScientist\";\n\nimport { Button, SingleSelectDropdown, TextInput } from \"@components/library\";\nimport { COLORS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { getOptionFromValue, getValueFromOption } from \"@utils/dropdownUtils\";\nimport { t } from \"@utils/i18n\";\nimport { isValidURL } from \"@utils/textUtils\";\nimport styled from \"styled-components\";\nimport * as S from \"../StepStyles\";\n\nexport const COMPANY_SPONSOR_TITLE_LIMIT = 50;\n\nexport const HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION = \"Other (describe below)\";\nconst HOW_DID_YOU_HEAR_ABOUT_US_OPTIONS = [\n \"I received an email from Halo\",\n \"I received an email from a university administrator\",\n \"I received an email from a company/organization\",\n \"I received an email from a fellow researcher/startup\",\n \"I was actively searching for partnering opportunities\",\n \"I read an article or listened to a podcast\",\n HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION,\n].map(getOptionFromValue);\n\nconst Step3 = ({\n userType,\n handleOnboard,\n onBack,\n profileInfo,\n setProfileInfo,\n user,\n isSubmitting,\n selectedGoogleScholarAuthor,\n}) => {\n const {\n company,\n role,\n title,\n companyName,\n companyURL,\n country_code,\n disciplines,\n areasOfExpertise,\n university,\n universityExpertise,\n universityHasCountry,\n howDidYouHearAboutUs,\n } = profileInfo;\n\n let disabled = isSubmitting;\n if (userType === \"company-sponsor\")\n disabled ||= !(company && title && title.length <= COMPANY_SPONSOR_TITLE_LIMIT);\n if (userType === \"company-scientist\")\n disabled ||= !(\n companyName &&\n isValidURL(companyURL) &&\n country_code &&\n role &&\n disciplines?.length &&\n areasOfExpertise?.length\n );\n if (userType === \"research-administrator\")\n disabled ||= !(university && disciplines?.length && (universityHasCountry || country_code));\n if (userType === \"research-scientist\")\n disabled ||= !(\n university &&\n role &&\n disciplines?.length &&\n areasOfExpertise?.length &&\n (universityHasCountry || country_code)\n );\n\n const onContinue = () => {\n if (userType === \"company-sponsor\") return handleOnboard(\"sponsor\");\n if (userType === \"research-administrator\") return handleOnboard(\"admin\");\n return handleOnboard(\"scientist\");\n };\n\n let stepSubheading = \"\";\n let stepHeading = \"\";\n if (selectedGoogleScholarAuthor) {\n stepSubheading = \"Confirm imported information\";\n stepHeading = \"Here's what we gathered from Google Scholar.\\nWe'll import more after signup.\";\n } else {\n stepSubheading = \"Enter profile information\";\n switch (userType) {\n case \"research-scientist\":\n case \"company-scientist\":\n stepHeading =\n \"Create a profile to start offering your expertise.\\nYou can add more information later.\";\n break;\n case \"company-sponsor\":\n stepHeading = \"Create a profile to start finding solutions and experts.\";\n break;\n case \"research-administrator\":\n stepHeading = \"Create a profile to start connecting faculty with relevant opportunities.\";\n break;\n }\n }\n\n return (\n <Container center={!selectedGoogleScholarAuthor}>\n <S.StepContainer width=\"592px\">\n <S.StepHeader subheading={stepSubheading} heading={stepHeading} />\n {userType === \"company-sponsor\" && (\n <Step3CompanySponsor\n profileInfo={profileInfo}\n setProfileInfo={setProfileInfo}\n email={user.email}\n />\n )}\n {userType === \"company-scientist\" && (\n <Step3CompanyScientist\n profileInfo={profileInfo}\n setProfileInfo={setProfileInfo}\n selectedGoogleScholarAuthor={selectedGoogleScholarAuthor}\n />\n )}\n {userType === \"research-administrator\" && (\n <Step3ResearchInstitutionAdmin\n profileInfo={profileInfo}\n setProfileInfo={setProfileInfo}\n />\n )}\n {userType === \"research-scientist\" && (\n <Step3ResearchInstitutionScientist\n profileInfo={profileInfo}\n setProfileInfo={setProfileInfo}\n selectedGoogleScholarAuthor={selectedGoogleScholarAuthor}\n />\n )}\n <S.DropdownRow>\n <S.DropdownTitle>\n {t(\"pages.onboarding_container.how_did_you_hear_about_us.label\")}\n </S.DropdownTitle>\n <S.DropdownSubtitle>Optional</S.DropdownSubtitle>\n <SingleSelectDropdown\n placeholder={t(\"pages.onboarding_container.how_did_you_hear_about_us.placeholder\")}\n placeholderColor={COLORS.NEUTRAL_400}\n options={HOW_DID_YOU_HEAR_ABOUT_US_OPTIONS}\n onChange={(option) =>\n setProfileInfo({ ...profileInfo, howDidYouHearAboutUs: getValueFromOption(option) })\n }\n value={getOptionFromValue(howDidYouHearAboutUs)}\n />\n {howDidYouHearAboutUs === HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION && (\n <>\n <br />\n <TextInput\n placeholder=\"Please describe\"\n placeholderColor={COLORS.NEUTRAL_400}\n value={profileInfo.howDidYouHearAboutUsOther}\n onChange={(e) => {\n setProfileInfo({ ...profileInfo, howDidYouHearAboutUsOther: e.target.value });\n }}\n hideClearButton\n />\n </>\n )}\n </S.DropdownRow>\n <S.Hairline />\n <S.ButtonContainer>\n <Button type=\"button\" variant=\"ghost\" width=\"120px\" onClick={() => onBack(\"step2\")}>\n Back\n </Button>\n <Button\n type=\"button\"\n disabled={disabled}\n onClick={onContinue}\n data-testid=\"company-sponsor-step-4-submit-button\"\n width=\"120px\"\n >\n Complete signup\n </Button>\n </S.ButtonContainer>\n </S.StepContainer>\n </Container>\n );\n};\n\nexport default Step3;\nconst Container = styled.div`\n text-align: left;\n padding: 0;\n margin-bottom: 200px;\n ${({ center }) => !center && `width: 800px;`}\n\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n padding: 0 30px;\n width: 100%;\n }\n`;\n","import { COLORS, FONTS, JS_FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { StyleSheet } from \"aphrodite\";\nimport { ReactNode } from \"react\";\nimport ReactCodeInput from \"react-verification-code-input\";\nimport { Dropdown as DropdownOld, Icon, Loader as Loader_ } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\nimport Dropdown from \"../../components/libraryOld/SelectionMenus/Dropdown\";\n\nconst { TABLET_MEDIA_QUERY } = WINDOW_DIMENSIONS;\n\nexport const StepContainer = styled.div`\n padding: 0;\n width: ${({ width }) => width || \"500px\"};\n ${FONTS.REGULAR_2};\n\n ${({ step, center }) =>\n step === 1 || center\n ? `\n display: flex;\n flex-direction: column;\n align-items: center;\n `\n : \"\"}\n\n ${TABLET_MEDIA_QUERY} {\n padding: 0 30px;\n width: 100%;\n }\n`;\n\ninterface StepHeaderProps {\n heading: string | ReactNode;\n subheading: string | ReactNode;\n}\nexport function StepHeader({ heading, subheading }: StepHeaderProps) {\n return (\n <StepHeaderContainer>\n <StepSubheading>{subheading}</StepSubheading>\n <StepHeading>{heading}</StepHeading>\n </StepHeaderContainer>\n );\n}\nconst StepHeaderContainer = styled.div`\n width: 100%;\n margin-bottom: 56px;\n`;\nconst StepSubheading = styled.h2`\n margin: 0;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.SEMIBOLD_1};\n`;\nconst StepHeading = styled.h1`\n margin: 0 0 56px;\n color: ${COLORS.BLACK};\n ${FONTS.HEADING_3_REGULAR};\n`;\n\nexport const StepTitle = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n ${({ center }) => center && `justify-content: center;`}\n color: ${COLORS.BLACK};\n ${({ large }) => (large ? FONTS.HEADING_3_SEMIBOLD : FONTS.HEADING_4_SEMIBOLD)};\n margin-bottom: 30px;\n`;\n\nexport const HelpAction = styled.div`\n position: relative;\n color: ${COLORS.HALO_BLUE};\n ${FONTS.MEDIUM_2};\n cursor: pointer;\n :hover {\n text-decoration: underline;\n }\n\n margin-bottom: 60px;\n`;\n\nexport const IconContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 324px;\n`;\n\nexport const HelpIcon = styled(Icon)`\n position: relative;\n color: ${COLORS.HALO_BLUE} !important;\n font-size: 16px !important;\n top: 1px;\n margin-bottom: 1px;\n text-decoration: none !important;\n`;\n\nexport const DropdownRow = styled.div`\n position: relative;\n margin-bottom: 40px;\n\n &:last-of-type {\n margin-bottom: 35px;\n }\n`;\nexport const DropdownTitle = styled.div`\n ${FONTS.SEMIBOLD_1};\n width: 100%;\n padding-bottom: 7px;\n color: ${COLORS.BLACK};\n`;\nexport const DropdownSubtitle = styled(DropdownTitle)`\n ${FONTS.REGULAR_3};\n margin-top: -4px;\n color: ${COLORS.NEUTRAL_500};\n`;\n\nexport const Hairline = styled.div`\n width: 100%;\n border-bottom: 1px solid ${COLORS.NEUTRAL_200};\n margin-bottom: 40px;\n`;\n\nexport const CompanyDropdown = styled(DropdownOld)`\n padding-top: 6px !important;\n padding-bottom: 6px !important;\n margin: 0;\n ${FONTS.REGULAR_2};\n width: 350px !important;\n min-height: 38px !important;\n display: flex !important;\n align-items: center !important;\n flex-wrap: wrap !important;\n ${TABLET_MEDIA_QUERY} {\n width: 100% !important;\n }\n\n border-color: ${COLORS.NEUTRAL_200};\n`;\n\nexport const Input = styled.input`\n width: ${(p) => (p.half && \"49%\") || \"100%\"};\n height: 38px;\n margin: 0 auto;\n padding: 11px 28px 11px 10px;\n ${FONTS.REGULAR_2};\n color: ${COLORS.BLACK};\n border: 1px solid ${(props) => (props.error ? COLORS.RED : COLORS.NEUTRAL_400)};\n border-radius: 3px;\n\n ${({ fixed }) =>\n fixed &&\n `\n color: ${COLORS.NEUTRAL_500};\n border: none;\n background-color: ${COLORS.NEUTRAL_200};\n pointer-events: none;\n `}\n\n &::placeholder {\n opacity: 1;\n color: ${COLORS.NEUTRAL_500};\n }\n`;\n\n// Styles below overwrite library's default styles to match our design system\nexport const StyledCodeInput = styled(ReactCodeInput)`\n margin-bottom: 33px;\n width: unset !important;\n > div {\n > input {\n background: ${COLORS.NEUTRAL_100};\n border: 0.5px solid ${COLORS.HALO_BLUE} !important;\n border-radius: 4px;\n color: ${COLORS.BLACK};\n font-size: 32px;\n caret-color: ${COLORS.BLACK} !important;\n }\n > input:focus {\n border: 2px solid ${COLORS.HALO_BLUE} !important;\n }\n > input:not(:last-child) {\n margin-right: 8px;\n }\n > input:focus + input {\n border-left: 0.5px solid ${COLORS.HALO_BLUE};\n }\n > input:focus + input:not(:placeholder-shown) {\n border-left: 0.5px solid ${COLORS.HALO_BLUE};\n }\n > input:last-child:focus,\n input:not(:placeholder-shown) {\n border-color: ${COLORS.HALO_BLUE};\n }\n > input {\n border-color: ${(props) => props.error && COLORS.RED} !important;\n }\n }\n`;\n\nexport const ContactLink = styled.div`\n ${FONTS.REGULAR_3};\n text-align: left;\n width: 90%;\n margin-top: 10px;\n color: ${COLORS.NEUTRAL_500};\n`;\n\nexport const ResendEmailLink = styled.span`\n ${FONTS.REGULAR_2};\n text-align: left;\n white-space: no-wrap;\n color: ${COLORS.HALO_BLUE};\n cursor: pointer;\n :hover {\n text-decoration: underline;\n }\n`;\n\nexport const Padding = styled.div`\n height: ${(props) => (props.height ? `${props.height}px` : \"10px\")};\n display: block;\n`;\n\nexport const Loader = styled(Loader_)`\n margin-top: 50px !important;\n`;\n\nexport const styles = StyleSheet.create({\n Dropdown_blueLabel: {\n border: `1px solid ${COLORS.HALO_BLUE}`,\n color: COLORS.HALO_BLUE,\n boxShadow: \"none\",\n padding: \"2px 6px\",\n display: \"flex\",\n justifyContent: \"center\",\n textAlign: \"center\",\n margin: \"2px 4px\",\n backgroundColor: `${COLORS.WHITE} !important`,\n },\n toast_body: {\n color: COLORS.WHITE,\n marginRight: \"10px\",\n ...JS_FONTS.MEDIUM_3,\n },\n toast_progress: {\n background: COLORS.HALO_BLUE,\n },\n toast_inner: {\n padding: \"15px\",\n paddingBottom: \"20px\",\n borderRadius: \"4px\",\n },\n toast_container: {\n zIndex: 1000000,\n },\n toast_close: {\n position: \"initial\",\n },\n});\n\nexport const CompanyDropdownNew = styled(Dropdown)`\n ${TABLET_MEDIA_QUERY} {\n width: 100% !important;\n }\n`;\n\nexport const EmailSection = styled.div`\n margin-top: 25px;\n margin-bottom: 30px;\n`;\n\nexport const OpenEmail = styled.a`\n img {\n margin-right: 6px;\n }\n`;\n\nexport const ButtonContainer = styled.div`\n display: flex;\n\n & > button:first-of-type {\n margin-right: 16px;\n }\n`;\n\nexport const StepDescription = styled.div`\n ${FONTS.REGULAR_1}\n ${({ marginBottom }) => marginBottom && `margin-bottom: ${marginBottom}px`}\n`;\n\nexport const NextStepsContainer = styled.div`\n display: flex;\n margin-bottom: 30px;\n\n &:last-of-type {\n margin-bottom: 60px;\n }\n\n & > img {\n align-self: flex-start;\n margin-right: 10px;\n margin-top: 3px;\n }\n`;\n\nexport const NextStepHeader = styled.div`\n ${FONTS.HEADING_5_SEMIBOLD}\n`;\n\nexport const NextStepDescription = styled.div`\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.REGULAR_1}\n`;\n\nexport const CheckboxContainer = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n row-gap: 16px;\n`;\n\nexport const CheckboxItem = styled.div`\n flex: 1 0 50%;\n`;\n","import { Button, Icon, TextInput } from \"@components/library\";\nimport { COLORS, FONTS, STYLES } from \"@constants\";\nimport { useState } from \"react\";\nimport styled from \"styled-components\";\n\ninterface Props {\n onSubmit: (code: string) => Promise<void>;\n error: string;\n requestData?: {\n company_name: string;\n request_title: string;\n };\n}\n\nconst AccessCode = ({ onSubmit, error, requestData }: Props) => {\n const [code, setCode] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n return (\n <Container\n onSubmit={async (e) => {\n e.preventDefault();\n setIsLoading(true);\n await onSubmit(code);\n setIsLoading(false);\n }}\n >\n {requestData && (\n <Heading>\n {requestData.company_name} invited you to apply to {requestData.request_title}.\n </Heading>\n )}\n <TextInput\n value={code}\n onChange={(e) => setCode(e.target.value)}\n label={\n <>\n <Icon name=\"Lock\" size=\"sm\" color={COLORS.BLACK} margin=\"1px 4px 0 0\" />\n This opportunity is password-protected.\n </>\n }\n labelFont={FONTS.SEMIBOLD_2}\n placeholder=\"Enter password\"\n errors={[{ hasError: Boolean(error), errorMessage: error }]}\n />\n <Button type=\"submit\" disabled={isLoading}>\n Submit\n </Button>\n </Container>\n );\n};\n\nexport default AccessCode;\n\nconst Container = styled.form`\n display: flex;\n flex-direction: column;\n gap: 30px;\n max-width: 500px;\n margin: 40px auto;\n padding: 40px;\n border: 1px solid ${COLORS.NEUTRAL_100};\n border-radius: 12px;\n box-shadow: ${STYLES.SHADOW_CARD};\n`;\n\nconst Heading = styled.h1`\n margin: 0;\n ${FONTS.REGULAR_1}\n`;\n","import Icon, { IconName } from \"@components/library/Icon/Icon\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { RfpBenefitType } from \"@tsTypes/rfps\";\nimport { FundingBenefit, NonMonetaryBenefit } from \"@tsTypes/schema\";\nimport styled from \"styled-components\";\n\ninterface Props {\n benefit: FundingBenefit | NonMonetaryBenefit;\n}\n\nconst BenefitCard = ({ benefit: { benefit_type, details } }: Props) => {\n let label = \"\";\n let iconName: IconName;\n\n switch (benefit_type) {\n case RfpBenefitType.MARKET_ACCESS:\n label = \"Market Access\";\n iconName = \"Public\";\n break;\n case RfpBenefitType.EARLY_ACCESS:\n label = \"Early Access\";\n iconName = \"History\";\n break;\n case RfpBenefitType.EXPOSURE:\n label = \"Exposure\";\n iconName = \"View\";\n break;\n case RfpBenefitType.SPONSORED_RESEARCH:\n label = \"Sponsored Research\";\n iconName = \"Funding\";\n break;\n case RfpBenefitType.GIFT:\n label = \"Gift (Unrestricted grant)\";\n iconName = \"Funding\";\n break;\n case RfpBenefitType.INVESTMENT:\n label = \"Investment\";\n iconName = \"Funding\";\n break;\n case RfpBenefitType.PAYMENT:\n label = \"Compensation\";\n iconName = \"Funding\";\n break;\n case RfpBenefitType.EXPERTISE:\n label = \"Expertise\";\n iconName = \"Expertise\";\n break;\n case RfpBenefitType.NETWORKING:\n label = \"Networking\";\n iconName = \"Networking\";\n break;\n case RfpBenefitType.TOOLS_AND_TECHNOLOGY:\n label = \"Tools and Technologies\";\n iconName = \"Technology\";\n break;\n case RfpBenefitType.COMPOUNDS_AND_REAGENTS:\n label = \"Compounds and Reagents\";\n iconName = \"Compounds\";\n break;\n case RfpBenefitType.DATA:\n label = \"Data\";\n iconName = \"Data\";\n break;\n case RfpBenefitType.FACILITIES_AND_SERVICES:\n label = \"Facilities and Services\";\n iconName = \"Organization\";\n break;\n case RfpBenefitType.SERVICES_AGREEMENT:\n label = \"Services Agreement\";\n iconName = \"Funding\";\n break;\n }\n\n return (\n <Container>\n <Title>\n <Icon name={iconName} margin=\"0 6px 0 0\" />\n {label}\n </Title>\n {details}\n </Container>\n );\n};\n\nexport default BenefitCard;\n\nconst Container = styled.div`\n border: 1px solid ${COLORS.NEUTRAL_300};\n background-color: ${COLORS.WHITE};\n color: ${COLORS.BLACK};\n border-radius: 4px;\n padding: 16px;\n ${FONTS.REGULAR_2};\n word-break: break-word;\n white-space: pre-wrap;\n`;\nconst Title = styled.div`\n display: flex;\n align-items: center;\n ${FONTS.SEMIBOLD_1};\n margin-bottom: 16px;\n color: ${COLORS.BLACK};\n`;\n","import { Tag } from \"@components/library\";\nimport { FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { PARTNERSHIP_MODEL_LABELS, RfpPartnershipModel } from \"@tsTypes/rfps\";\nimport { FundingBenefit, NonMonetaryBenefit } from \"@tsTypes/schema\";\nimport styled from \"styled-components\";\nimport BenefitCard from \"./BenefitCard\";\n\ninterface Props {\n partnershipModels: RfpPartnershipModel[];\n fundingBenefits: FundingBenefit[];\n nonMonetaryBenefits: NonMonetaryBenefit[];\n isResponsive?: boolean;\n withMarginTop?: boolean;\n}\n\nexport default function Benefits({\n partnershipModels,\n fundingBenefits,\n nonMonetaryBenefits,\n isResponsive = true,\n withMarginTop = true,\n}: Props) {\n if (partnershipModels.length + fundingBenefits.length + nonMonetaryBenefits.length === 0)\n return null;\n\n // Accounts for the fact that partnership model options can change over time\n const validPartnershipModels = partnershipModels.filter((partnershipModel) =>\n Object.values(RfpPartnershipModel).includes(partnershipModel)\n );\n\n return (\n <WhatWeCanOfferYou withMarginTop={withMarginTop}>\n <Heading id=\"offer\">What we can offer you</Heading>\n {Number(validPartnershipModels.length) > 0 && (\n <BenefitSection>\n <Subheading>Eligible partnership models:</Subheading>\n <PartnershipModels data-testid=\"rfp-partnership-models\">\n {validPartnershipModels.map((partnershipModel) => (\n <Tag\n key={partnershipModel}\n content={PARTNERSHIP_MODEL_LABELS[partnershipModel]}\n size=\"md\"\n />\n ))}\n </PartnershipModels>\n </BenefitSection>\n )}\n {(fundingBenefits?.length > 0 || nonMonetaryBenefits?.length > 0) && (\n <BenefitSection>\n <Subheading>Benefits:</Subheading>\n <BenefitsContainer isResponsive={isResponsive} data-testid=\"rfp-benefits\">\n {fundingBenefits.map((benefit) => (\n <BenefitCard key={`${benefit.benefit_type}-${benefit.details}`} benefit={benefit} />\n ))}\n {nonMonetaryBenefits.map((benefit) => (\n <BenefitCard key={`${benefit.benefit_type}-${benefit.details}`} benefit={benefit} />\n ))}\n </BenefitsContainer>\n </BenefitSection>\n )}\n </WhatWeCanOfferYou>\n );\n}\n\nconst WhatWeCanOfferYou = styled.div`\n width: calc(100% + 108px);\n ${({ withMarginTop }) => withMarginTop && `margin-top: 64px;`}\n\n ${WINDOW_DIMENSIONS.DESKTOP_MEDIA_QUERY} {\n width: 100%;\n }\n`;\nconst BenefitSection = styled.div`\n display: flex;\n flex-direction: column;\n`;\nconst PartnershipModels = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin: 16px 0 24px;\n`;\nexport const BenefitsContainer = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n margin-top: 16px;\n ${({ isResponsive }) =>\n isResponsive &&\n `\n ${WINDOW_DIMENSIONS.DESKTOP_MEDIA_QUERY} {\n grid-template-columns: 1fr;\n }\n `}\n`;\nconst Heading = styled.div`\n ${FONTS.HEADING_4_SEMIBOLD};\n margin-bottom: 24px;\n &:not(:first-of-type) {\n margin-top: 64px;\n }\n`;\nconst Subheading = styled.div`\n display: flex;\n align-items: center;\n ${FONTS.SEMIBOLD_1};\n margin: 24px 0 8px;\n`;\n","import { COLORS, FONTS, STYLES } from \"@constants\";\nimport { RequestAttachmentPartial } from \"@tsTypes/request_attachments/_request_attachment\";\nimport { formatBytes, formatMIMEContentType } from \"@utils/textUtils\";\nimport styled from \"styled-components\";\nimport Icon from \"../Icon\";\n\ninterface Props {\n attachment: RequestAttachmentPartial;\n onClick: () => void;\n}\n\nexport default function RequestAttachment({ attachment, onClick }: Props) {\n const { title, size_in_bytes, mime_content_type } = attachment;\n\n const fileSize = formatBytes(size_in_bytes);\n const type = formatMIMEContentType(mime_content_type);\n\n return (\n <Container onClick={onClick}>\n <div>\n <Icon name=\"Attachment\" size=\"md\" color={COLORS.NEUTRAL_500} margin=\"0\" />\n </div>\n <Info>\n <Name>{title}</Name>\n <Meta>\n {type} • {fileSize}\n </Meta>\n </Info>\n </Container>\n );\n}\n\nconst Name = styled.div`\n ${FONTS.MEDIUM_3}\n ${STYLES.TWO_LINES}\n`;\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n padding: 8px 12px 8px 8px;\n gap: 12px;\n max-width: 280px;\n min-height: 64px;\n border-radius: 8px;\n background: ${COLORS.NEUTRAL_50};\n\n &:hover {\n cursor: pointer;\n background: ${COLORS.NEUTRAL_100};\n ${Name} {\n text-decoration: underline;\n }\n }\n`;\n\nconst Info = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nconst Meta = styled.div`\n ${FONTS.REGULAR_3}\n ${STYLES.ONE_LINE}\n color: ${COLORS.NEUTRAL_600};\n`;\n","import MessageAttachmentGalleryModal from \"@components/modals/MessageAttachmentGalleryModal/MessageAttachmentGalleryModal\";\nimport { RequestAttachmentPartial } from \"@tsTypes/request_attachments/_request_attachment\";\nimport { ReactNode, useState } from \"react\";\nimport styled from \"styled-components\";\nimport RequestAttachment from \"./RequestAttachment\";\n\ninterface Props {\n heading: ReactNode;\n attachments: RequestAttachmentPartial[];\n}\n\nexport default function RequestAttachmentsContainer({ heading, attachments = [] }: Props) {\n const [focusedGalleryAttachmentIndex, setFocusedGalleryAttachmentIndex] = useState<number>();\n\n const openGallery = (attachmentId: number) => {\n const index = attachments.findIndex((attachment) => attachment.id === attachmentId);\n setFocusedGalleryAttachmentIndex(index);\n };\n\n const closeGallery = () => {\n setFocusedGalleryAttachmentIndex(undefined);\n };\n\n if (attachments.length === 0) return null;\n\n return (\n <>\n <MessageAttachmentGalleryModal\n attachments={focusedGalleryAttachmentIndex !== null ? attachments : []}\n focusedAttachmentIndex={focusedGalleryAttachmentIndex}\n setFocusedAttachmentIndex={setFocusedGalleryAttachmentIndex}\n closeGallery={closeGallery}\n />\n {heading}\n <AttachmentsContainer>\n {attachments.map((attachment) => (\n <RequestAttachment\n key={attachment.id}\n attachment={attachment}\n onClick={() => openGallery(attachment.id)}\n />\n ))}\n </AttachmentsContainer>\n </>\n );\n}\n\nconst AttachmentsContainer = styled.div`\n display: grid;\n grid-template-columns: 280px 280px;\n gap: 16px;\n`;\n","import { Button } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { useState } from \"react\";\nimport styled from \"styled-components\";\n\nconst PreviewRfpPageBanner = () => {\n const [buttonText, setButtonText] = useState(\"Copy Link\");\n\n const handleCopyLink = async () => {\n const url = window.location.href;\n await navigator.clipboard.writeText(url);\n\n setButtonText(\"Copied!\");\n setTimeout(() => setButtonText(\"Copy Link\"), 2000);\n };\n\n return (\n <Container>\n This is a preview and not live on Halo\n <Button type=\"button\" onClick={handleCopyLink} width=\"125px\">\n {buttonText}\n </Button>\n </Container>\n );\n};\n\nexport default PreviewRfpPageBanner;\n\nconst Container = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n height: 73px;\n background-color: ${COLORS.BLACK};\n ${FONTS.MEDIUM_1};\n font-weight: 450; // Normally we don't need font-weight with the FONTS constants, but this is a special case\n color: ${COLORS.WHITE};\n padding: 0 24px 0 32px;\n`;\n","import { FormEvent, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport Validator from \"validator\";\n\nimport { BlankModal, Icon, TextInput } from \"@components/library\";\nimport Button from \"@components/library/Buttons/Button\";\nimport { IconName } from \"@components/library/Icon/Icon\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { joinRfpWaitlist } from \"@requests/rfps\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { usedPersonalEmail } from \"@utils/appUtils\";\n\nconst LINE_ITEMS = [\n \"Submit a proposal in less than an hour.\",\n \"Receive feedback directly from the industry contact.\",\n \"Get discovered by industry partners looking for your expertise.\",\n];\n\nconst JoinWaitlistModal = ({ request, onClose, isOpen, handleShare }) => {\n const dispatch = useDispatch();\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const [firstName, setFirstName] = useState(\"\");\n const [lastName, setLastName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [hasSuccessfullySubmitted, setHasSuccessfullySubmitted] = useState(false);\n\n const isUniversityAdmin = currentUser?.role === UserRole.UNIVERSITY_ADMIN;\n let iconName: IconName = \"History\";\n let header = \"Join Waitlist\";\n let subheader = \"Indicate your interest and get notified if the opportunity reopens.\";\n let ctaText = \"Join waitlist\";\n if (isUniversityAdmin) {\n iconName = \"Share\";\n header = \"Share Opportunity\";\n subheader =\n \"Scientists can join the waitlist to show their interest and get notified if this opportunity reopens.\";\n ctaText = \"Share\";\n }\n\n const handleSubmit = async (e?: FormEvent<HTMLFormElement>) => {\n try {\n e?.preventDefault();\n\n if (isUniversityAdmin) {\n handleShare();\n onClose();\n return;\n }\n\n setIsSubmitting(true);\n\n if (!currentUser.id && (!Validator.isEmail(email) || usedPersonalEmail(email))) {\n setError(\"Please use a valid company or university email.\");\n return;\n }\n\n const payload = currentUser.id ? {} : { firstName, lastName, email };\n await joinRfpWaitlist(request.id, payload);\n\n setHasSuccessfullySubmitted(true);\n } catch (err) {\n setError(err.message);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (hasSuccessfullySubmitted) {\n return (\n <BlankModal isOpen={isOpen} onClose={onClose} width=\"540px\">\n <ModalContent>\n <div>\n <Icon color={COLORS.GREEN} margin=\"0 auto\" name=\"Success\" size=\"lg\" />\n <Header>Thank you!</Header>\n </div>\n <SubHeader>\n You’ve been added to the waitlist for this opportunity.{\" \"}\n {!currentUser.id && \"Don't have a Halo account? Create one now.\"}\n </SubHeader>\n {!currentUser.id && (\n <>\n <BulletList>\n {LINE_ITEMS.map((lineItem, i) => {\n return (\n <BulletPoint key={`lineItem-${i}`}>\n <Icon name=\"Verified\" color={COLORS.HALO_BLUE} />\n <BulletText>{lineItem}</BulletText>\n </BulletPoint>\n );\n })}\n </BulletList>\n <div>\n <Button\n margin=\"24px 0 0\"\n onClick={() => {\n dispatch(toggleLoginModal({ open: true }));\n }}\n >\n Create Account\n </Button>\n </div>\n </>\n )}\n </ModalContent>\n </BlankModal>\n );\n }\n\n return (\n <BlankModal isOpen={isOpen} onClose={onClose} width=\"540px\">\n <ModalContent>\n <IconContainer>\n {!isUniversityAdmin && <Icon margin=\"10px auto 0\" name={iconName} size=\"lg\" />}\n </IconContainer>\n <Header>{header}</Header>\n <SubHeader>{subheader}</SubHeader>\n <Form onSubmit={handleSubmit}>\n {!currentUser.id && (\n <>\n <DoubleInputContainer>\n <TextInput\n hideClearButton\n onChange={(e) => setFirstName(e.target.value)}\n placeholder=\"First Name\"\n value={firstName}\n />\n <TextInput\n hideClearButton\n onChange={(e) => setLastName(e.target.value)}\n placeholder=\"Last Name\"\n value={lastName}\n />\n </DoubleInputContainer>\n <TextInput\n errors={[\n {\n hasError: error.length > 0,\n errorMessage: error,\n },\n ]}\n hideClearButton\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Email Address\"\n value={email}\n />\n </>\n )}\n <Button\n disabled={\n (!currentUser.id &&\n (firstName.length === 0 || lastName.length === 0 || email.length === 0)) ||\n isSubmitting\n }\n iconName={iconName}\n type=\"submit\"\n width=\"100%\"\n >\n {ctaText}\n </Button>\n </Form>\n </ModalContent>\n </BlankModal>\n );\n};\n\nexport default JoinWaitlistModal;\n\nexport const ModalContent = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n\n padding: 63px 92px 101px;\n\n width: 100%;\n height: 100%;\n\n text-align: center;\n`;\n\nconst IconContainer = styled.div`\n min-height: 10px;\n`;\n\nconst Header = styled.h3`\n margin: 0px;\n\n ${FONTS.HEADING_3_SEMIBOLD};\n`;\n\nconst SubHeader = styled.h6`\n margin: 0 0 20px 0;\n\n max-width: 400px;\n\n color: ${COLORS.NEUTRAL_500};\n\n ${FONTS.MEDIUM_2};\n`;\n\nconst Form = styled.form`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n width: 100%;\n`;\n\nconst DoubleInputContainer = styled.div`\n display: flex;\n justify-content: space-between;\n gap: 16px;\n`;\n\nconst BulletList = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n\n margin: 8px 0 0;\n`;\n\nconst BulletPoint = styled.div`\n display: inline-flex;\n align-items: flex-start;\n gap: 8px;\n\n color: ${COLORS.BLACK};\n\n ${FONTS.REGULAR_2};\n`;\n\nconst BulletText = styled.p`\n margin: 0px;\n\n width: 250px;\n\n text-align: left;\n`;\n","import { Button } from \"@components/library\";\nimport { COLORS, WINDOW_DIMENSIONS } from \"@constants\";\nimport googleCalendar from \"@images/icons/google_calendar.svg\";\nimport ical from \"@images/icons/ical.svg\";\nimport outlook from \"@images/icons/outlook.svg\";\nimport dayjs from \"dayjs\";\nimport { cloneElement, useRef } from \"react\";\nimport AddToCalendarHOC, { SHARE_SITES } from \"react-add-to-calendar-hoc\";\nimport styled from \"styled-components\";\n\nconst AddToCalendarButton = ({ date, title, description }) => {\n if (!date) return null;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const handleBlur = () => {\n if (containerRef.current) {\n setTimeout(() => {\n (containerRef.current?.children[0].children[0] as HTMLButtonElement).click();\n }, 200);\n }\n };\n\n const startDate = dayjs(date).startOf(\"day\");\n const endDate = dayjs(startDate).add(1, \"day\").startOf(\"day\");\n\n return (\n <Container ref={containerRef} onBlur={handleBlur}>\n <AddToCalendar\n event={{\n title,\n description,\n duration: 24,\n endDatetime: dayjs(endDate).format(\"YYYYMMDD\"),\n startDatetime: dayjs(startDate).format(\"YYYYMMDD\"),\n }}\n items={[SHARE_SITES.GOOGLE, SHARE_SITES.OUTLOOK, SHARE_SITES.ICAL]}\n />\n </Container>\n );\n};\n\n// AddToCalendarHOC passes entire <a /> components with logic that is abstracted\n// away from the consumers (like us), so we use React.cloneElement to be able to\n// take the read-only react component passed by AddToCalendarHOC and pass in the\n// output of getDropdownComponent (gives us more control over the icons/text in\n// each dropdown item and doesn't lose the calendar logic that is not exposed).\nconst getDropdownComponent = (key) => {\n switch (key.toLowerCase()) {\n case \"google\":\n return (\n <>\n <DropdownItemIcon src={googleCalendar} /> Google Calendar\n </>\n );\n case \"ical\":\n return (\n <>\n <DropdownItemIcon src={ical} /> {key}\n </>\n );\n case \"outlook\":\n return (\n <>\n <DropdownItemIcon src={outlook} /> {key}\n </>\n );\n }\n};\n\nconst ButtonWrapper = ({ onClick }) => (\n <Button type=\"button\" width=\"100%\" variant=\"secondary\" onClick={onClick} iconName=\"Calendar\">\n Add to Calendar\n </Button>\n);\n\nconst DropdownWrapper = ({ children }) => (\n <CalendarDropdown>\n {children.map((link) => (\n <CalendarDropdownItem key={link.key}>\n {cloneElement(link, [], getDropdownComponent(link.key))}\n </CalendarDropdownItem>\n ))}\n </CalendarDropdown>\n);\n\nconst AddToCalendar = AddToCalendarHOC(ButtonWrapper, DropdownWrapper);\n\nexport default AddToCalendarButton;\n\nconst Container = styled.div`\n position: relative;\n`;\nconst CalendarDropdown = styled.ul`\n list-style-type: none;\n background-color: ${COLORS.WHITE};\n margin: auto;\n padding: 10px;\n font-size: 14px;\n text-align: left;\n border-radius: 8px;\n box-shadow: 0px 10px 22px rgba(29, 71, 123, 0.08), 0px 2px 12px rgba(29, 71, 123, 0.08);\n width: 222px;\n position: absolute;\n top: 44px;\n left: calc(50%);\n transform: translateX(-50%);\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n align-items: center;\n justify-content: center;\n line-height: 1.2em;\n }\n`;\nconst CalendarDropdownItem = styled.li`\n padding: 0px 10px;\n align-self: stretch;\n height: 38px;\n margin: auto;\n cursor: pointer;\n &:hover {\n background: ${COLORS.NEUTRAL_100};\n border-radius: 4px;\n }\n a {\n color: ${COLORS.BLACK};\n vertical-align: text-top;\n padding: 3px 0px 3px 5px;\n display: inline-block;\n width: 100%;\n height: 100%;\n &:hover,\n &:active,\n &:visited,\n &:focus {\n text-decoration: none;\n }\n }\n`;\nconst DropdownItemIcon = styled.img`\n padding-right: 8px;\n`;\n","import RefineRecommendations from \"@components/RequestPageComponents/RefineRecommendations\";\nimport StatusCircle from \"@components/StatusCircle\";\nimport { Button, Icon } from \"@components/library\";\nimport FuelModal from \"@components/modals/FuelModal\";\nimport JoinWaitlistModal from \"@components/modals/JoinWaitlistModal\";\nimport { COLORS, FEATURE_FLAGS, FONTS, STYLES } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport useFollowRequest from \"@hooks/useFollowRequest\";\nimport { toggleLoginModal } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getCanSubmitProposal } from \"@requests/requests\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RfpPageRequest } from \"@tsTypes/index\";\nimport { RfpStatus } from \"@tsTypes/rfps\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { track } from \"@utils/appUtils\";\nimport { setPrevUrlCookie } from \"@utils/authUtils\";\nimport { formatDateToEastern } from \"@utils/dateUtils\";\nimport { requestProposalUrlPath } from \"@utils/requestUtils\";\nimport { getRfpStatus } from \"@utils/rfpUtils\";\nimport { withoutTooltip } from \"@utils/textUtils\";\nimport dayjs from \"dayjs\";\nimport { ReactElement, ReactNode, useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport AddToCalendarButton from \"./AddToCalendarButton\";\n\nconst { ACTIVE, COMING_SOON, IN_EXTENSION, CLOSED } = RfpStatus;\n\ninterface Props {\n request: RfpPageRequest;\n asPreview: boolean;\n setIsShareModalOpen: (isOpen: boolean) => void;\n}\n\nconst RfpCtaContainer = ({ request, asPreview, setIsShareModalOpen }: Props) => {\n const [isFuelModalOpen, setIsFuelModalOpen] = useState(false);\n const [isJoinWaitlistModalOpen, setIsJoinWaitlistModalOpen] = useState(false);\n\n const rfp = request.requestable;\n\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const dispatch = useDispatch();\n const history = useHistory();\n const [searchParams] = useSearchParams();\n\n useEffect(() => {\n if (searchParams.get(\"share\") === \"true\") handleShare();\n }, []);\n\n const handleSubmitClick = async () => {\n track(SegmentEventName.Click, {\n ui_component: \"Submit Proposal Button\",\n });\n\n const submitUrl = requestProposalUrlPath(request);\n\n const isFuel =\n \"company_name\" in request.company && request.company.company_name?.includes(\"FUEL\");\n\n if (currentUser.id) {\n if (isFuel) {\n const canSubmit = await getCanSubmitProposal(request.id);\n\n if (canSubmit) {\n history.push(submitUrl);\n } else {\n setIsFuelModalOpen(true);\n }\n } else {\n history.push(submitUrl);\n }\n } else {\n if (isFuel) {\n setPrevUrlCookie();\n } else {\n setPrevUrlCookie(submitUrl);\n }\n\n dispatch(\n toggleLoginModal({\n open: true,\n previousAction: \"easy apply\",\n })\n );\n }\n };\n\n const { handleFollowRequest, isUserFollowing } = useFollowRequest(request.id);\n\n const handleNotify = () => {\n track(\"Clicked follow RFP button\", {\n isUniversityMember: currentUser.role === UserRole.UNIVERSITY_ADMIN,\n });\n\n handleFollowRequest();\n };\n\n const handleShare = () => {\n track(\"Clicked share RFP button\");\n\n if (currentUser.id) {\n setIsShareModalOpen(true);\n } else {\n dispatch(toggleLoginModal({ open: true, previousAction: \"share rfp\" }));\n }\n };\n\n const handleJoinWaitlist = () => {\n track(\"Clicked join waitlist button\");\n setIsJoinWaitlistModalOpen(true);\n };\n\n const rfpStatus = getRfpStatus(request);\n\n let status: ReactNode = rfp.deadline && (\n <>\n <StatusCircle margin=\"0 8px 0 0\" /> Deadline: {formatDateToEastern(rfp.deadline, \"MMMM D\")}\n </>\n );\n if (rfpStatus === IN_EXTENSION || rfpStatus === CLOSED) {\n status = (\n <>\n <Icon margin=\"0 4px 0 0\" name=\"Success\" size=\"sm\" /> Complete\n </>\n );\n } else if (rfpStatus === COMING_SOON) {\n status = `Coming Soon: ${dayjs(rfp.launch_date ?? 0).format(\"MMMM D\")}`;\n }\n\n const viewAsScientist = currentUser.role !== 2;\n\n const isJamesStanton = currentUser.id === 24;\n\n const canApply =\n rfpStatus === ACTIVE || (rfpStatus === IN_EXTENSION && request.enabled) || isJamesStanton;\n\n const hasIncompleteProposal = Boolean(\n currentUser.profile_info.proposals?.find(\n (proposal) => proposal.request_id === request.id && !proposal.completed\n )\n );\n\n let heading = \"Share Opportunity\";\n if (viewAsScientist) {\n if (canApply) {\n heading = \"Submit Proposal\";\n } else if (rfpStatus === COMING_SOON) {\n heading = \"Follow Opportunity\";\n }\n }\n\n let scientistPrimaryButton: ReactElement | null = null;\n let universityPrimaryButton = (\n <Button iconName=\"Share\" margin=\"0 0 10px\" onClick={handleShare} type=\"button\">\n Share\n </Button>\n );\n if (!request.company.is_partner) {\n scientistPrimaryButton = (\n <Button\n iconName=\"Open in a new tab\"\n onClick={() =>\n \"url\" in request.company &&\n request.company.url &&\n window.open(request.company.url, \"_blank\")\n }\n type=\"button\"\n >\n View Site\n </Button>\n );\n } else if (canApply) {\n scientistPrimaryButton = (\n <Button\n data-testid=\"rfp-page-submit-proposal-button\"\n iconName={hasIncompleteProposal && !isJamesStanton ? \"Attention\" : \"Easy Apply\"}\n onClick={handleSubmitClick}\n type=\"button\"\n >\n {hasIncompleteProposal && !isJamesStanton ? \"Complete Proposal\" : \"Easy Apply\"}\n </Button>\n );\n } else if (rfpStatus === COMING_SOON) {\n scientistPrimaryButton = isUserFollowing ? (\n <FollowingConfirmation>\n <Icon color={COLORS.GREEN} margin=\"0 4px 0 0\" name=\"Success\" />\n You'll be notified\n </FollowingConfirmation>\n ) : (\n <Button iconName=\"Bell\" margin=\"10px 0 0\" onClick={handleNotify} type=\"button\">\n Notify Me\n </Button>\n );\n } else if (rfpStatus === IN_EXTENSION || rfpStatus === CLOSED) {\n scientistPrimaryButton = (\n <Button iconName=\"Share\" onClick={handleShare} type=\"button\">\n Share\n </Button>\n );\n }\n\n if (rfp.is_trial) {\n if (rfpStatus === ACTIVE) {\n status = (\n <>\n <StatusCircle margin=\"0 8px 0 0\">\n <Icon color={COLORS.WHITE} name=\"History\" size=\"sm\" />\n </StatusCircle>\n Accepting first 5 proposals\n </>\n );\n } else if (rfpStatus === IN_EXTENSION && request.enabled) {\n heading = \"Join Waitlist\";\n status = \"Get notified if this opportunity reopens.\";\n scientistPrimaryButton = (\n <Button iconName=\"History\" onClick={handleJoinWaitlist} type=\"button\">\n Join waitlist\n </Button>\n );\n universityPrimaryButton = scientistPrimaryButton;\n }\n }\n\n useEffect(() => {\n if (rfp.is_trial && rfpStatus === IN_EXTENSION && request.enabled) {\n setIsJoinWaitlistModalOpen(true);\n }\n }, [rfp.is_trial, rfpStatus]);\n\n return (\n <>\n <FuelModal isOpen={isFuelModalOpen} onClose={() => setIsFuelModalOpen(false)} />\n <JoinWaitlistModal\n isOpen={isJoinWaitlistModalOpen}\n onClose={() => setIsJoinWaitlistModalOpen(false)}\n handleShare={handleShare}\n request={request}\n />\n <Container isSponsor={currentUser.role === 1}>\n <TopContainer $showBorder={FEATURE_FLAGS.RELEVANT_NOT_RELEVANT_BUTTONS}>\n <Heading>{heading}</Heading>\n {!asPreview && <Status>{status}</Status>}\n {viewAsScientist ? scientistPrimaryButton : universityPrimaryButton}\n {viewAsScientist && (\n <>\n {(rfpStatus === COMING_SOON || canApply) && (\n <Button\n iconName=\"Share\"\n margin={`10px 0 ${\n rfpStatus === COMING_SOON || rfpStatus === ACTIVE ? \"10px\" : 0\n }`}\n onClick={handleShare}\n variant=\"secondary\"\n type=\"button\"\n >\n Share\n </Button>\n )}\n {(rfpStatus === COMING_SOON || rfpStatus === ACTIVE) && (\n <AddToCalendarButton\n date={rfpStatus === COMING_SOON ? rfp.launch_date : rfp.deadline}\n description={`https://halo.science/research/${\n rfp.rfp_program?.identifier ?? \"program\"\n }/${request.slug}\\n\\n${withoutTooltip(rfp.background)}`}\n title={`Halo RFP ${rfpStatus === COMING_SOON ? \"Launch Date\" : \"Deadline\"}: ${\n request.title\n }`}\n />\n )}\n </>\n )}\n </TopContainer>\n {FEATURE_FLAGS.RELEVANT_NOT_RELEVANT_BUTTONS && (\n <RefineRecommendations\n request={request}\n isComplete={rfpStatus === IN_EXTENSION || rfpStatus === CLOSED}\n />\n )}\n </Container>\n </>\n );\n};\n\nexport default RfpCtaContainer;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n text-align: center;\n pointer-events: ${({ isSponsor }) => (isSponsor ? \"none\" : \"auto\")};\n\n border-radius: 8px;\n border: 1px solid ${COLORS.NEUTRAL_250};\n box-shadow: ${STYLES.SHADOW_B};\n`;\nconst TopContainer = styled.div<{ $showBorder?: boolean }>`\n display: flex;\n flex-direction: column;\n text-align: center;\n\n width: 100%;\n padding: 40px 32px 24px;\n\n ${({ $showBorder }) => $showBorder && `border-bottom: 1px solid ${COLORS.NEUTRAL_250};`}\n`;\nconst Heading = styled.div`\n ${FONTS.HEADING_4_SEMIBOLD};\n margin-bottom: 24px;\n`;\nconst Status = styled.div`\n display: flex;\n align-items: center;\n margin: 0 auto 24px;\n height: 24px;\n ${FONTS.MEDIUM_2};\n`;\nconst FollowingConfirmation = styled.div`\n display: flex;\n align-items: center;\n height: 42px;\n color: ${COLORS.GREEN};\n ${FONTS.MEDIUM_2};\n margin: 0 auto 10px;\n`;\n","import { Tag, TagTooltip } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport { RfpPageRequest } from \"@tsTypes/index\";\nimport { MAX_KEYWORD_DISPLAY_COUNT } from \"src/constants/requests\";\nimport styled from \"styled-components\";\n\ninterface Props {\n request: RfpPageRequest;\n}\n\nconst RfpKeywordsContainer = ({ request }: Props) => {\n const keywords = [...request.areas_of_expertise, ...request.disciplines];\n\n return (\n <Container>\n {keywords.length > 0 && (\n <div>\n <Heading>Seeking partners focused on</Heading>\n <Tags>\n {keywords.slice(0, MAX_KEYWORD_DISPLAY_COUNT).map((keyword) => (\n <Tag key={keyword} content={keyword} size=\"sm\" theme=\"neutral\" />\n ))}\n {keywords.length > MAX_KEYWORD_DISPLAY_COUNT && (\n <TagTooltip\n tags={keywords.slice(MAX_KEYWORD_DISPLAY_COUNT).map((keyword) => (\n <Tag key={keyword} content={keyword} size=\"sm\" theme=\"neutral\" />\n ))}\n >\n <Tag\n content={`${keywords.length - MAX_KEYWORD_DISPLAY_COUNT} more`}\n size=\"sm\"\n theme=\"neutral\"\n />\n </TagTooltip>\n )}\n </Tags>\n </div>\n )}\n </Container>\n );\n};\n\nexport default RfpKeywordsContainer;\n\nconst Container = styled.div`\n padding: 24px;\n border: 1px solid ${COLORS.NEUTRAL_250};\n border-radius: 8px;\n`;\nconst Heading = styled.div`\n margin-bottom: 20px;\n ${FONTS.SEMIBOLD_1};\n`;\nconst Tags = styled.div`\n display: flex;\n flex-wrap: wrap;\n line-height: 1;\n & > div {\n margin-top: 8px;\n }\n`;\n","import toast from \"@components/Toast/Toast\";\nimport { Icon, InfoBanner, TextButton } from \"@components/library\";\nimport { COLORS } from \"@constants\";\nimport styled from \"styled-components\";\n\ninterface Props {\n accessCode: string;\n}\n\nconst AccessCodeBanner = ({ accessCode }: Props) => {\n const handleCopyCode = async () => {\n await navigator.clipboard.writeText(accessCode);\n toast.success(\"Password copied to clipboard\");\n };\n\n return (\n <div>\n <InfoBanner\n shouldDisplay\n hideIcon\n width=\"calc(100% - 96px)\"\n type=\"attention-orange\"\n padding=\"18px 24px\"\n margin=\"28px auto\"\n text={\n <Container>\n <Icon name=\"Lock\" color={COLORS.ORANGE_900} margin=\"0 8px 0 0\" />\n External partners need a password to access this opportunity.\n <TextButton\n text=\"Copy password\"\n iconName=\"Copy\"\n iconPosition=\"left\"\n onClick={handleCopyCode}\n color={COLORS.ORANGE_900}\n margin=\"0 24px 0 auto\"\n />\n </Container>\n }\n />\n </div>\n );\n};\n\nexport default AccessCodeBanner;\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n`;\n","import InviteModal from \"@components/InviteModal\";\nimport { RequestPageBanner } from \"@components/RequestPageComponents\";\nimport TRLs from \"@components/TRLs\";\nimport toast from \"@components/Toast\";\nimport { Button, Icon, PageContainer, Tag, TextLink, Tooltip } from \"@components/library\";\nimport RequestAttachmentsContainer from \"@components/library/Attachments/RequestAttachmentsContainer\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { useSearchParams } from \"@hooks/router\";\nimport { fetchCurrentUser } from \"@redux/actions/profileActions\";\nimport { RootState } from \"@redux/store\";\nimport { getRfpForRfpPage } from \"@requests/rfps\";\nimport { marketplacePath } from \"@routes/utils\";\nimport { SegmentEventName } from \"@tsTypes/__generated__/enums\";\nimport { RfpStatus } from \"@tsTypes/rfps\";\nimport { getArrayFromRubyRange, track } from \"@utils/appUtils\";\nimport { getRfpStatus } from \"@utils/rfpUtils\";\nimport { fixMarkdownNewlines, renderMarkdownText } from \"@utils/textUtils\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link, useHistory, useParams } from \"react-router-dom\";\nimport { Loader } from \"semantic-ui-react\";\nimport styled from \"styled-components\";\nimport RequestDiscussion from \"../../components/RequestDiscussion/RequestDiscussion\";\nimport PreviewRfpPageBanner from \"./PreviewRfpPageBanner\";\nimport RfpCta from \"./RfpCta\";\nimport RfpKeywordsContainer from \"./RfpKeywordsContainer\";\n// @ts-ignore\nimport { RfpPageRequest } from \"@tsTypes/index\";\nimport { UserRole } from \"@tsTypes/users\";\nimport { t } from \"@utils/i18n\";\nimport RequestFAQs from \"../../components/RequestFAQs\";\nimport AboutCompany from \"../../components/RequestPageComponents/AboutCompany\";\nimport AccessCode from \"./AccessCode\";\nimport AccessCodeBanner from \"./AccessCodeBanner\";\nimport Benefits from \"./Benefits\";\n\ninterface Props {\n asPreview?: boolean;\n rfpPreviewData?: RfpPageRequest;\n isResponsive?: boolean;\n}\n\nexport const ACCESS_CODE_PARAM = \"access_code\";\n\nconst RfpPage = ({ asPreview = false, rfpPreviewData, isResponsive = true }: Props) => {\n const [isLoading, setIsLoading] = useState(true);\n const [request, setRequest] = useState<RfpPageRequest>(rfpPreviewData ?? ({} as RfpPageRequest));\n const [isShareModalOpen, setIsShareModalOpen] = useState(false);\n const [isCommenting, setIsCommenting] = useState(false);\n\n const [needsAccessCode, setNeedsAccessCode] = useState(false);\n const [accessCodeError, setAccessCodeError] = useState(\"\");\n const [accessCodeRequestData, setAccessCodeRequestData] = useState<{\n company_name: string;\n request_title: string;\n }>();\n\n const rfp = (rfpPreviewData ?? request).requestable;\n const company = request.company;\n\n const rfpDiscussionRef = useRef<HTMLDivElement>(null);\n const currentUser = useSelector((state: RootState) => state.profiles.currentUser);\n\n const dispatch = useDispatch();\n const { identifier, previewHash } = useParams();\n const history = useHistory();\n const { fromHref } = history.location;\n const [searchParams] = useSearchParams();\n const accessCodeParam = searchParams.get(ACCESS_CODE_PARAM);\n\n const fetchRequest = async (code?: string) => {\n try {\n // RFP Page\n if (!asPreview && !rfpPreviewData) {\n const { request: rfpRequest } = await getRfpForRfpPage(identifier, code ?? accessCodeParam);\n\n if (!rfpRequest.id) {\n history.push(\"/\");\n }\n\n document.title = `${rfpRequest.title} | ${rfpRequest.requestable.rfp_program?.name} | Halo`;\n\n dispatch(fetchCurrentUser());\n\n track(SegmentEventName.View, {\n request_id: rfpRequest.id,\n requestable: {\n requestable_id: rfpRequest.id,\n requestable_type: rfpRequest.requestable_type,\n },\n react_component: \"RfpPage\",\n });\n\n if (searchParams.get(\"saved\")) {\n toast.success(\n <p>\n Saved! You can find your draft in \n <Link to=\"/my_proposals\" style={{ textDecoration: \"underline\", color: \"white\" }}>\n My proposals\n </Link>\n .\n </p>\n );\n }\n\n if (code) {\n searchParams.set(ACCESS_CODE_PARAM, code);\n history.replace({ search: searchParams.toString() });\n }\n setNeedsAccessCode(false);\n\n setRequest(rfpRequest);\n setIsLoading(false);\n return;\n }\n\n // RFP Preview Page\n if (asPreview && !rfpPreviewData) {\n const decodedRfpIdentifier = atob(previewHash);\n\n const { request: rfpRequest } = await getRfpForRfpPage(decodedRfpIdentifier, previewHash);\n\n if (!rfpRequest.id) {\n history.push(\"/\");\n }\n\n setRequest(rfpRequest);\n setIsLoading(false);\n return;\n }\n\n // RFP Form Preview\n if (asPreview && rfpPreviewData) {\n setIsLoading(false);\n }\n } catch (e) {\n if (e.response.status === 401) {\n if (needsAccessCode) {\n setAccessCodeError(\"Access code incorrect.\");\n } else {\n setNeedsAccessCode(true);\n setAccessCodeRequestData(e.response.data);\n }\n }\n }\n };\n\n useEffect(() => {\n fetchRequest();\n }, []);\n\n useLayoutEffect(() => {\n let animationFrameId: number;\n\n const checkAndScroll = () => {\n if (window.location.hash === \"#qa\" && rfpDiscussionRef.current) {\n rfpDiscussionRef.current.scrollIntoView({ behavior: \"smooth\" });\n } else {\n animationFrameId = requestAnimationFrame(checkAndScroll);\n }\n };\n\n checkAndScroll();\n\n return () => {\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n }\n };\n }, [rfpDiscussionRef]);\n\n if (needsAccessCode) {\n return (\n <AccessCode\n onSubmit={fetchRequest}\n error={accessCodeError}\n requestData={accessCodeRequestData}\n />\n );\n }\n\n if (isLoading) {\n return <Loader inline=\"centered\" />;\n }\n\n const showRfpDiscussionBanner =\n getRfpStatus(request) !== RfpStatus.IN_EXTENSION && rfp.is_discussion_enabled;\n const trlRange = rfp.trl_range ? getArrayFromRubyRange(rfp.trl_range) : null;\n\n const shouldShowAccessCodeBanner =\n !asPreview &&\n request.visibility.none &&\n request.access_code &&\n (currentUser.role === UserRole.SPONSOR || currentUser.is_admin);\n\n const isConfidential = request?.confidential || rfpPreviewData?.confidential;\n\n return (\n <>\n <InviteModal\n open={isShareModalOpen}\n requestId={request.id}\n closeModal={() => setIsShareModalOpen(false)}\n trackAndToastHandler={() => toast.success(\"RFP shared!\")}\n inviteMessage=\"\"\n inviteUrl=\"/notifications/share_rfp\"\n modalHeader={`Share this opportunity with ${\n currentUser.role === 2 ? \"faculty\" : \"colleagues\"\n }`}\n modalSubheader={`Your ${\n currentUser.role === 2 ? \"faculty\" : \"colleague(s)\"\n } will receive an email with a link to this opportunity`}\n inviteSubject={`${currentUser.first_name} ${currentUser.last_name} shared a funding opportunity with you.`}\n typeOfInvite=\"shareRFP\"\n />\n {asPreview && !rfpPreviewData && <PreviewRfpPageBanner />}\n {shouldShowAccessCodeBanner && <AccessCodeBanner accessCode={request.access_code!} />}\n <Container asPreview={asPreview} isResponsive={isResponsive} data-testid=\"rfp-page-main\">\n <PageContainer hasPaddingTop={asPreview} hasTopDivider>\n {!asPreview && (\n <TextLink\n to={fromHref ?? marketplacePath(\"requests\")}\n font={FONTS.MEDIUM_2}\n margin=\"24px 0\"\n >\n <Icon name=\"Chevron Left\" margin=\"0 0 0 -8px\" />\n Back to Opportunities\n </TextLink>\n )}\n <RequestPageBanner request={request} asPreview={asPreview} />\n <MainContent isResponsive={isResponsive}>\n <div>\n {showRfpDiscussionBanner && (\n <QuestionCTA isResponsive={isResponsive}>\n <div>\n <Heading>What questions do you have about this RFP?</Heading>\n <div>\n Get them answered by the team at{\" \"}\n {!isConfidential && \"company_name\" in company\n ? company.company_name\n : \"the company\"}\n .\n </div>\n </div>\n <Button\n width=\"max-content\"\n onClick={() => {\n rfpDiscussionRef.current?.scrollIntoView({ behavior: \"smooth\" });\n if (rfp.is_discussion_enabled && currentUser.role === 0) {\n setIsCommenting(true);\n }\n }}\n >\n Ask your question\n </Button>\n </QuestionCTA>\n )}\n <Heading>{t(\"pages.rfp_page.headings.background\")}</Heading>\n <div data-testid=\"rfp-background\">\n {renderMarkdownText(fixMarkdownNewlines(rfp.background))}\n </div>\n <Heading>{t(\"pages.rfp_page.headings.looking_for\")}</Heading>\n <BulletedSection data-testid=\"rfp-looking-for\">\n {renderMarkdownText(rfp.looking_for)}\n </BulletedSection>\n <RequestAttachmentsContainer\n heading={<Subheading>{t(\"pages.rfp_page.headings.attachments\")}</Subheading>}\n attachments={request.request_attachments}\n />\n {/* These fields are stored as strings, and the first 3 characters just render a bullet point */}\n {Boolean(request.request_solutions?.length) && (\n <>\n <Subheading>{t(\"pages.rfp_page.headings.solutions_of_interest\")}</Subheading>\n <BulletedSection data-testid=\"rfp-solutions-of-interest\">\n {renderMarkdownText(\n request.request_solutions.map((solution) => `* ${solution.name}`).join(\"\\n\")\n )}\n </BulletedSection>\n </>\n )}\n {Boolean(request.request_requirements?.length) && (\n <>\n <Subheading>{t(\"pages.rfp_page.headings.must_have_requirements\")}</Subheading>\n <BulletedSection data-testid=\"rfp-must-have-requirements\">\n {renderMarkdownText(\n request.request_requirements\n .map((requirement) => `* ${requirement.description}`)\n .join(\"\\n\")\n )}\n </BulletedSection>\n </>\n )}\n\n {(rfp.preferred_requirements?.length ?? 0) > 2 && (\n <>\n <Subheading>{t(\"pages.rfp_page.headings.preferred_requirements\")}</Subheading>\n <BulletedSection data-testid=\"rfp-nice-to-have-requirements\">\n {renderMarkdownText(rfp.preferred_requirements)}\n </BulletedSection>\n </>\n )}\n {(rfp.out_of_scope?.length ?? 0) > 2 && (\n <>\n <Subheading>{t(\"pages.rfp_page.headings.out_of_scope\")}</Subheading>\n <BulletedSection data-testid=\"rfp-out-of-scope\">\n {renderMarkdownText(rfp.out_of_scope)}\n </BulletedSection>\n </>\n )}\n {trlRange ? (\n <TRLsContainer>\n <Subheading>\n {t(\"pages.rfp_page.headings.trl\")}\n <Tag\n content={\n <TrlTagContent>\n {trlRange[0] === trlRange[1]\n ? `Level ${trlRange[0]}`\n : `Levels ${trlRange[0]}-${trlRange[1]}`}\n <Tooltip\n content=\"Technology readiness levels help describe the maturity of solutions. An organization may seek solutions that fall only within a specified range of TRLs.\"\n tooltipWidth=\"410px\"\n >\n <Icon name=\"Info\" size=\"xs\" color={COLORS.NEUTRAL_400} />\n </Tooltip>\n </TrlTagContent>\n }\n size=\"md\"\n margin=\"0 0 0 16px\"\n />\n </Subheading>\n <TRLs trlRange={trlRange} />\n </TRLsContainer>\n ) : null}\n <Benefits\n partnershipModels={rfp.partnership_models ?? []}\n fundingBenefits={request.funding_benefits}\n nonMonetaryBenefits={request.non_monetary_benefits}\n isResponsive={isResponsive}\n />\n {!isConfidential && <AboutCompany request={request} isResponsive={isResponsive} />}\n {rfp.is_discussion_enabled && (\n <RequestDiscussion\n request={request}\n ref={rfpDiscussionRef}\n isCommenting={isCommenting}\n setIsCommenting={setIsCommenting}\n setIsShareModalOpen={setIsShareModalOpen}\n />\n )}\n </div>\n <RightColumn>\n <RfpCta\n request={request}\n asPreview={asPreview}\n setIsShareModalOpen={setIsShareModalOpen}\n />\n <RfpKeywordsContainer request={request} />\n {request.visibility.any && <RequestFAQs request={request} />}\n </RightColumn>\n </MainContent>\n </PageContainer>\n </Container>\n </>\n );\n};\n\nexport default RfpPage;\n\nconst Container = styled.div`\n pointer-events: ${({ asPreview }) => (asPreview ? \"none\" : \"auto\")};\n ${({ isResponsive }) => !isResponsive && `width: ${WINDOW_DIMENSIONS.BASE_WINDOW_WIDTH}px;`}\n`;\nconst QuestionCTA = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 64px;\n background: ${COLORS.BLUE_LIGHT_250};\n padding: 32px 64px 32px 48px;\n border-radius: 12px;\n ${FONTS.REGULAR_1}\n ${({ isResponsive }) =>\n isResponsive &&\n `\n ${WINDOW_DIMENSIONS.DESKTOP_MEDIA_QUERY} {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n ${WINDOW_DIMENSIONS.EXTRA_WIDE_MEDIA_QUERY} {\n width: max-content;\n }\n `}\n`;\nconst MainContent = styled.div`\n display: grid;\n grid-template-columns: 1fr 350px;\n gap: 190px;\n padding: 84px 0 100px;\n & p {\n ${FONTS.REGULAR_1};\n margin: 0;\n }\n ${({ isResponsive }) =>\n isResponsive &&\n `\n ${WINDOW_DIMENSIONS.DESKTOP_MEDIA_QUERY} {\n gap: 80px;\n }\n ${WINDOW_DIMENSIONS.TABLET_LANDSCAPE_MEDIA_QUERY} {\n display: flex;\n flex-direction: column-reverse;\n gap: 64px;\n }\n ${WINDOW_DIMENSIONS.MOBILE_MEDIA_QUERY} {\n padding: 84px 32px 100px;\n }\n `}\n`;\nconst RightColumn = styled.div`\n display: flex;\n flex-direction: column;\n gap: 40px;\n`;\nconst Heading = styled.div`\n ${FONTS.HEADING_4_SEMIBOLD};\n margin-bottom: 24px;\n &:not(:first-of-type) {\n margin-top: 64px;\n }\n`;\nconst Subheading = styled.div`\n display: flex;\n align-items: center;\n ${FONTS.SEMIBOLD_1};\n margin: 24px 0 8px;\n`;\nconst BulletedSection = styled.div`\n & ul {\n padding-left: 4px;\n }\n`;\n// Used in RequestForStartupPage\nexport const TRLsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 12px;\n`;\nexport const TrlTagContent = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n","import { t, t_html } from \"@utils/i18n\";\nimport StatusPage from \"./StatusPage\";\n\nconst NotFound404 = () => {\n return (\n <StatusPage\n quote={t(\"pages.error_pages.404.quote\")}\n author={t(\"pages.error_pages.404.author\")}\n errorMessage={t_html(\"pages.error_pages.404.error_message_html\")}\n />\n );\n};\n\nexport default NotFound404;\n","import { Button } from \"@components/library\";\nimport { COLORS, FONTS } from \"@constants\";\nimport backgroundImage from \"@images/backgrounds/error_page_background.png\";\nimport { t, t_html } from \"@utils/i18n\";\nimport { ReactElement, useEffect, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\ninterface Props {\n quote: string | ReactElement;\n author: string;\n errorMessage: ReactElement;\n isErrorBoundary?: boolean;\n}\n\nconst StatusPage = ({ quote, author, errorMessage, isErrorBoundary = false }: Props) => {\n const [didCatch, setDidCatch] = useState(false);\n\n const history = useHistory();\n\n // This is a workaround to simulate going back. React Router methods won't work if the app\n // caught, so we need to manually refresh after navigating back\n useEffect(() => {\n if (didCatch) window.location.reload();\n }, [history.location.pathname]);\n\n const handleCtaClick = () => {\n if (isErrorBoundary) setDidCatch(true);\n history.goBack();\n };\n\n return (\n <Container isErrorBoundary={isErrorBoundary}>\n <Quote>\n {quote}\n <Author>- {author}</Author>\n </Quote>\n <ErrorMessage>\n {errorMessage}\n <br />\n {t_html(\"pages.error_pages.shared.contact_html\", {\n link: <a href=\"/contact\">contact us</a>,\n })}\n </ErrorMessage>\n <Button type=\"button\" onClick={handleCtaClick}>\n {t(\"pages.error_pages.shared.cta\")}\n </Button>\n </Container>\n );\n};\n\nexport default StatusPage;\n\nconst Container = styled.div`\n width: 100%;\n ${({ isErrorBoundary }) => {\n const navbarHeight = 84;\n const appContainerMarginBottom = 40;\n\n return isErrorBoundary\n ? `\n height: calc(100% - (${navbarHeight}px ));\n min-height: fit-content;\n padding-bottom: calc(100px + ${appContainerMarginBottom}px); \n `\n : `\n height: calc(100% - (${navbarHeight}px - ${appContainerMarginBottom}px));\n padding-bottom: 100px; \n `;\n }};\n background-image: url(${backgroundImage});\n background-size: max(100%, 1280px);\n background-position: bottom;\n background-repeat: no-repeat;\n border-top: 1px solid ${COLORS.NEUTRAL_200};\n text-align: center;\n`;\nconst Quote = styled.div`\n max-width: 592px;\n margin: 80px auto 0;\n padding: 40px 0;\n border-bottom: 1px solid ${COLORS.NEUTRAL_250};\n font-size: 42px;\n line-height: 1.24;\n font-weight: 400;\n`;\nconst Author = styled.div`\n margin-top: 8px;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.HEADING_3_REGULAR};\n`;\nconst ErrorMessage = styled.div`\n width: 382px;\n margin: 40px auto 16px;\n ${FONTS.REGULAR_2};\n a {\n color: ${COLORS.BLACK};\n text-decoration: underline;\n &:hover {\n color: ${COLORS.HALO_BLUE};\n }\n }\n`;\n","import { Icon, MultiSelectDropdown } from \"@components/library\";\nimport type { DropdownOption } from \"@components/library/Dropdowns/DropdownOption\";\nimport { COLORS, FONTS, WINDOW_DIMENSIONS } from \"@constants\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport styled from \"styled-components\";\nimport { useDynamicOptions } from \"./searchOptions\";\n\ninterface Props {\n isOpen: boolean;\n nameFilter: DropdownOption[];\n setNameFilter: Dispatch<SetStateAction<DropdownOption[]>>;\n titleFilter: DropdownOption[];\n setTitleFilter: Dispatch<SetStateAction<DropdownOption[]>>;\n keywordFilter: DropdownOption[];\n setKeywordFilter: Dispatch<SetStateAction<DropdownOption[]>>;\n}\n\nconst UniversityTeamSearch = ({\n isOpen,\n nameFilter,\n setNameFilter,\n titleFilter,\n setTitleFilter,\n keywordFilter,\n setKeywordFilter,\n}: Props) => {\n const {\n isLoading: isOptionsLoading,\n nameOptions,\n titleOptions,\n keywordOptions,\n } = useDynamicOptions();\n\n const handleClearFilter = () => {\n setNameFilter([]);\n setTitleFilter([]);\n setKeywordFilter([]);\n };\n\n const filtersCount = nameFilter.length + titleFilter.length + keywordFilter.length;\n\n if (!isOpen) return null;\n\n return (\n <Container>\n <TopRow>\n <MultiSelectDropdown\n label=\"Faculty member\"\n onChange={(e) => setNameFilter(e)}\n value={nameFilter}\n options={nameOptions}\n />\n <MultiSelectDropdown\n label=\"Title\"\n onChange={(e) => setTitleFilter(e)}\n value={titleFilter}\n options={titleOptions}\n />\n <MultiSelectDropdown\n label=\"Keywords\"\n onChange={(e) => setKeywordFilter(e)}\n value={keywordFilter}\n options={keywordOptions}\n />\n </TopRow>\n <FooterButtons>\n <ClearFilterButton type=\"button\" onClick={handleClearFilter}>\n {filtersCount > 0 && (\n <>\n <Icon name=\"Refresh\" margin=\"0 4px 2px 0\" color={COLORS.HALO_BLUE} />\n Clear all filters\n </>\n )}\n </ClearFilterButton>\n <MissingAFilter>\n Missing a filter? \n <ContactLink type=\"button\" onClick={() => window.open(\"/contact\", \"_blank\")}>\n Let us know\n </ContactLink>\n </MissingAFilter>\n </FooterButtons>\n </Container>\n );\n};\n\nexport default UniversityTeamSearch;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n margin: 24px 0;\n padding: 24px;\n background-color: ${COLORS.NEUTRAL_50};\n border-radius: 8px;\n`;\n\nexport const TopRow = styled.div`\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n grid-gap: 0 16px;\n margin: 0 0 24px;\n ${WINDOW_DIMENSIONS.TABLET_MEDIA_QUERY} {\n grid-template-columns: 1fr;\n grid-gap: 24px 0;\n }\n`;\nconst FooterButtons = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n// Used in other filtering components\nexport const ClearFilterButton = styled.button`\n display: flex;\n align-items: center;\n color: ${COLORS.HALO_BLUE};\n border: none;\n background-color: transparent;\n ${FONTS.MEDIUM_2};\n`;\nexport const MissingAFilter = styled.div`\n margin-left: auto;\n color: ${COLORS.NEUTRAL_500};\n ${FONTS.REGULAR_2}\n`;\nexport const ContactLink = styled.button`\n color: ${COLORS.NEUTRAL_500};\n text-decoration: underline;\n border: none;\n background-color: transparent;\n padding: 0;\n`;\n","import { DropdownOption, DropdownOptionGroup } from \"@components/library/Dropdowns/DropdownOption\";\nimport { getUniversityMembersOptions } from \"@requests/universities\";\nimport { getOptionFromValue } from \"@utils/dropdownUtils\";\nimport { useEffect, useState } from \"react\";\n\nexport const SORT_BY_OPTIONS = [\n {\n value: \"NAME\",\n label: \"Name\",\n },\n {\n value: \"PROPOSAL_COUNT\",\n label: \"Active proposals\",\n },\n] as const;\n\nexport const useDynamicOptions = (): {\n isLoading: boolean;\n nameOptions: DropdownOption[];\n titleOptions: DropdownOption[];\n keywordOptions: DropdownOptionGroup[];\n} => {\n const [isLoading, setIsLoading] = useState(true);\n const [nameOptions, setNameOptions] = useState<DropdownOption[]>([]);\n const [titleOptions, setTitleOptions] = useState<DropdownOption[]>([]);\n const [keywordOptions, setKeywordOptions] = useState<DropdownOptionGroup[]>([]);\n\n useEffect(() => {\n (async () => {\n const data = await getUniversityMembersOptions();\n setKeywordOptions([\n {\n label: \"Disciplines\",\n options: data.keyword_options.disciplines.map(getOptionFromValue) as DropdownOption[],\n },\n {\n label: \"Expertise\",\n options: data.keyword_options.areas_of_expertise.map(\n getOptionFromValue\n ) as DropdownOption[],\n },\n ]);\n\n const { name_options, title_options } = data;\n setNameOptions(name_options.map(getOptionFromValue) as DropdownOption[]);\n setTitleOptions(title_options.map(getOptionFromValue) as DropdownOption[]);\n\n setIsLoading(false);\n })();\n }, []);\n\n return {\n isLoading,\n nameOptions,\n titleOptions,\n keywordOptions,\n };\n};\n","export enum CompanySize {\n UNDER_10 = \"Under 10\",\n TEN_TO_FIFTY = \"10 - 50\",\n FIFTY_TO_TWO_HUNDRED = \"50 - 200\",\n TWO_HUNDRED_TO_FIVE_HUNDRED = \"200 - 500\",\n FIVE_HUNDRED_TO_ONE_THOUSAND = \"500 - 1,000\",\n ONE_THOUSAND_TO_FIVE_THOUSAND = \"1,000 - 5,000\",\n FIVE_THOUSAND_TO_TEN_THOUSAND = \"5,000 - 10,000\",\n TEN_THOUSAND_PLUS = \"10,000+\",\n}\n\nexport enum CompanySpend {\n UNDER_500K = \"Under $500k\",\n FIVE_HUNDRED_K_TO_ONE_MILLION = \"$500k - $1M\",\n ONE_MILLION_TO_TWO_AND_A_HALF_MILLION = \"$1M - $2.5M\",\n TWO_AND_A_HALF_MILLION_TO_FIVE_MILLION = \"$2.5M - $5M\",\n FIVE_MILLION_TO_TEN_MILLION = \"$5M - $10M\",\n TEN_MILLION_TO_ONE_HUNDRED_MILLION = \"$10M - $100M\",\n ONE_HUNDRED_MILLION_TO_FIVE_HUNDRED_MILLION = \"$100M - $500M\",\n FIVE_HUNDRED_MILLION_TO_ONE_BILLION = \"$500M - $1B\",\n ONE_BILLION_PLUS = \"$1B+\",\n}\n\nexport enum CompanyType {\n RESEARCH_INSTITUTION = \"Research Institution\",\n GOVERNMENT_AGENCY = \"Government Agency\",\n NONPROFIT_FOUNDATION = \"Nonprofit/Foundation\",\n PRIVATELY_HELD = \"Privately Held\",\n PUBLIC_COMPANY = \"Public Company\",\n}\n\nexport enum CompanyVerificationStatus {\n UNCLAIMED = \"unclaimed\",\n CLAIMED = \"claimed\",\n VERIFIED = \"verified\",\n}\n"],"names":["initialState","shouldShowProductTours","isAbsolute","adminReducer","state","action","type","SET_SHOULD_SHOW_PRODUCT_TOURS","_objectSpread","payload","SET_IS_ABSOLUTE","isLoadingSubscription","subscription","loadingProposals","proposals","proposalDashboardRequest","userFollow","loadingUserFollow","researchAreaHeadline","researchAreaImageUrl","loadingCompanyMembers","companyMembers","loadingMessages","messages","viewAsCompanySuperAdmin","companyReducer","LOAD_SUBSCRIPTION","SET_SUBSCRIPTION","LOAD_USER_FOLLOW","SET_USER_FOLLOW","LOAD_PROPOSALS","SET_PROPOSAL_DASHBOARD_RFP","LOAD_COMPANY_MEMBERS","SET_COMPANY_MEMBERS","LOADING_MESSAGES","SET_MESSAGES","SET_VIEW_AS_COMPANY_SUPER_ADMIN","SET_PROPOSAL_AS_SEEN","map","p","id","proposalId","seen","seen_by","fullName","currentUser","first_name","last_name","filter","name","join","length","push","showErrorBoundary","filters","searchTerm","isUpdatingToggleRFP","isUpdatingFollowedCompanies","isUpdatingResearchFollows","followedRequestsInfo","followedCompanies","resultList","companies","foundations","government_organizations","currentCompany","currentRFP","loadingCurrentCompany","loadingCurrentRFP","loadingInvitedUsers","invitedUsers","universityTeamMembers","lastViewedRfpIdentifier","defaultReducer","SHOW_ERROR_BOUNDARY","ADD_FILTER","newFilters","filterType","filterValue","Array","from","Set","REMOVE_FILTER","v","LOADING_CURRENT_COMPANY","SEARCH_TERM","SET_FOLLOWED_REQUESTS_INFO","UPDATE_RESULT_LIST","UPDATE_CURRENT_RFP","LOAD_CURRENT_RFP","SET_CURRENT_COMPANY","SET_COMPANIES","SET_FOUNDATIONS","SET_GOVERNMENT_ORGANIZATIONS","SET_LOAD_COMPANY_PARTNER","loadingCompanyPartner","SET_LOAD_COMPANY_INTEREST","loadingCompanyInterest","SET_COMPANY_INTEREST","company_research_interests","SET_LOAD_COMPANY_INFO","loadingCompanyInfo","SET_COMPANY_INFO","location","employee_count","rd_spend_amount","company_type","description","LOAD_DELETE_COMPANY_INTEREST_PARTNER","loadingDeleteCompanyInterestPartner","SET_INVITED_USERS","invited_users","SET_LOAD_INVITED_USERS","SET_UNIVERSITY_TEAM_MEMBERS","SET_COMPANY_LOGO","logo","url","SET_COMPANY_VIDEO","video","SET_LAST_VIEWED_RFP_IDENTIFIER","profile_info","loadingCurrentUser","loadingPatents","loadingPublications","loadingFundings","loginModalOpen","loginModalLanding","previousAction","currentPatentId","currentPublicationId","currentFundingId","patents","publications","fundings","loadingResearchInterestFollows","unreadCount","proposalEval","profileReducer","newObj","SET_CURRENT_USER","LOAD_CURRENT_USER","SET_PUBLICATIONS","LOAD_PUBLICATIONS","SET_PATENTS","LOAD_PATENTS","SET_FUNDINGS","LOAD_FUNDINGS","TOGGLE_LOGIN_MODAL","open","prePopulatedSignupEmail","landing","START_DELETE_PROPOSAL","deletingProposal","FINISH_DELETE_PROPOSAL","_","FINISH_FOLLOW_UNFOLLOW_COMPANY","followed_companies_info","isFollowing","company","LOADING_RESEARCH_INTEREST_FOLLOWS","UPDATE_RESEARCH_INTEREST_FOLLOWS","followed_research_interests","SET_UNREAD_COUNT","SET_PROPOSAL_EVAL","UPDATE_PROFILE_IMAGE","image","width","window","innerWidth","height","innerHeight","scrollPercent","windowDimensionReducer","UPDATE_WINDOW_DIMENSION","messengerReducer","windowDimensionsReducer","reducers","defaultConfig","key","storage","blacklist","profilesConfig","whitelist","messengerConfig","rootReducer","combineReducers","persistReducer","profiles","messenger","admin","persistConfig","enhancer","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","applyMiddleware","thunkMiddleware","store","createStore","persistor","persistStore","LoaderContainer","_jsx","Container","textAlign","children","Loader","Root","Provider","PersistGate","loading","Router","onUpdate","scrollTo","Route","path","component","withRouter","App","document","addEventListener","ReactDOM","getElementById","MasqueradeBar","_useState2","_slicedToArray","useState","isOptionsOpen","setIsOptionsOpen","_useState4","requiresRefresh","setRequiresRefresh","dispatch","useDispatch","useSelector","_jsxs","_Fragment","BlankModal","isOpen","onClose","headerText","subHeaderText","ModalContent","Checkbox","label","size","isChecked","onChange","e","setIsAbsolute","target","checked","setShouldShowProductTours","TextButton","text","iconName","color","COLORS","HALO_BLUE","onClick","reload","position","background","gon","global","env","RED","href","back_masquerade_path","WHITE","styled","div","FONTS","SEMIBOLD_3","MessengerHeader","recipient","proposalTitle","isMessengerMinimized","messengerThread","isMessengerExpanded","hasUnreadMessage","setIsParticipantsModalOpen","history","useHistory","toggleMinimizeMessenger","setHasUnreadMessage","setIsMessengerExpanded","setIsMessengerMinimized","noThreadMoreActionsOptions","value","onSelect","profile_id","moreActionsOptions","participants","scientist_user","company_members","recipients","IS_SINGLE_PARTICIPANT","userPreview","UserPreview","user","MultiUserPreview","users","HeaderContainer","undefined","FlexContainer","Thumbnail","single","Name","UnreadDot","ProposalTitleContainer","isMulti","Icon","margin","NEUTRAL_500","ProposalTitle","IconContainer","MoreActionsDropdown","options","menuHorizontalPosition","IconButton","variant","tooltipWidth","stopPropagation","batch","setIsMessengerOpen","clearMessengerState","NEUTRAL_200","css","NEUTRAL_50","BLACK","TAG_SEMIBOLD_1","MEDIUM_3","STYLES","ONE_LINE","ParticipantsInfoModal","closeModal","disableBackgroundScroll","Participants","currentThread","isModal","Messenger","isParticipantsModalOpen","messengerData","isMessengerOpen","isMessengerThreadLoading","messengerOffsetRight","useEffect","userId","proposalyId","proposalyType","fetchCurrentThreadByProposal","fetchCurrentThreadByParticipants","MessengerContainer","active","inline","style","ConversationContainer","Conversation","SHADOW_C","MobileRestricted","breakpoint","Controller","Children","Restriction","Image","src","macbook","alt","Text","Link","to","Button","iconPosition","img","REGULAR_1","_ref","props","_extends","_objectDestructuringEmpty","setPrevUrlCookie","role","USER_ROLES","sponsor","console","warn","Redirect","PrivateRoute","BLOCKED_PATHS","EXTENDED_ACCESS_PATHS","SubscriptionEndedModal","setIsSubscriptionEndedModalOpen","bannerMessage","pathname","useLocation","isBlockedPage","includes","has_extension","some","startsWith","hideCloseButton","closeOnDimmerClick","backgroundMode","Title","t","UserRole","SPONSOR","Buttons","is_admin","HEADING_4_SEMIBOLD","TABLET_MEDIA_QUERY","WINDOW_DIMENSIONS","SubscriptionEndBanner","PAGE_SIDE_PADDING","REGULAR_2","SubscriptionWarning","isSubscriptionEndedModalOpen","daysUntilSubscriptionEnds","daysUntilDate","end_at","has_upcoming_subscription","isAdmin","subscriptionEndDate","dayjs","format","backgroundColor","TaxonomyUpdateModal","disciplines","setDisciplines","areas_of_expertise","areasOfExpertise","setAreasOfExpertise","_useState6","isSubmitting","setIsSubmitting","header","title","company_name","onSubmit","async","preventDefault","updateUserKeywords","data","success","setCurrentUser","has_updated_taxonomy","err","error","Content","SCIENTIST","Label","KeywordsDropdown","keywordType","targetType","isPortal","Footer","SkipLink","onSkip","skipUpdateUserKeywords","toast","textDecoration","disabled","NEUTRAL_300","SEMIBOLD_1","MEDIUM_2","a","SPONSOR_ROLES_DROPDOWN_OPTIONS","Object","values","SponsorRole","getOptionFromValue","form","BOLD_2","Top","Bottom","Logo","CompanyLogo","NEUTRAL_250","Header","HEADING_5_MEDIUM","SEMIBOLD_2","Input","input","ButtonContainer","SSOSponsorOnboardingModal","isCommenter","commenter","step","setStep","setCompany","_useState8","setTitle","_useState10","setRole","_useState12","handleSkip","company_identifier","response","getCompany","appsignal","sendError","updateUserProfile","sponsorOnboarded","fetchCurrentUser","haloLogo","SingleSelectDropdown","newOption","placeholder","autoComplete","SubmitProposalRedirect","requestSlug","useParams","rfp_identifier","api","get","requestProposalUrlPath","request","span","setAction","ScrollToTop","NavbarDropdownMenu","isMenuOpen","setIsMenuOpen","navigate","setShowErrorBoundary","navigateToProfile","currentPFPic","medium","Popup","trigger","className","styles","Navbar_menuWrap","Navbar_menuProfilePic","backgroundImage","small","toUpperCase","Navbar_icon","Navbar_iconMobile","on","basic","Navbar_accountPopup","hideOnScroll","hoverable","onOpen","content","Navbar_accountPopupContainer","onMouseEnter","onMouseLeave","Navbar_popupContainer","Navbar_profilePicContainer","Navbar_popupProfilePic","Navbar_regularProfilePic","Navbar_popupRightPanel","Navbar_popupName","is_super_admin","SuperAdminTagContainer","SuperAdminTag","Navbar_popupPosition","Navbar_profileButton","ProfileTags","Boolean","license","LicenseTag","AdminTag","navigateToAccount","Navbar_button","navigateToDashboard","is_expert","Navbar_buttonEditProfile","UNIVERSITY_ADMIN","verified","navigateToInbox","Navbar_inbox","navigateToCompanyProfile","navigateToUniversityProposalLibrary","track","SegmentEventName","Click","ui_component","signOut","marketplacePath","Navbar_signOutButton","StyleSheet","create","display","alignItems","marginLeft","border","outline","NEUTRAL_100","marginRight","justifyContent","JS_FONTS","MEDIUM_1","cursor","borderRadius","backgroundRepeat","backgroundPosition","backgroundSize","fontSize","marginTop","marginBottom","paddingBottom","paddingLeft","paddingRight","minWidth","boxShadow","maxWidth","left","padding","zIndex","paddingTop","HEADING_2_SEMIBOLD","gap","textTransform","borderBottom","MOBILE_MEDIA_QUERY","LoginModal_modal","LoginModal_innerContainer","LoginModal_logoContainer","LoginModal_closeicon","top","right","LoginModal_hero","LoginModal_headline","LoginModal_subheadline","LoginModal_subheadline_rfp","LoginModal_innerLeftPane","verticalAlign","LoginModal_modalText","LoginModal_lineItem","LoginModal_innerRightPane","LoginModal_innerRightPane_rfp","LoginModal_formField","LoginModal_inputField","REGULAR_3","LoginModal_nameField","LoginModal_placeholderText","visibility","LoginModal_errorMessage","LoginModal_errorField","LoginModal_alreadyHaveAccount","LoginModal_signInLink","LoginModal_forgotPasswordContainer","LoginModal_footerText","LoginModal_forgotPassword","LoginModal_horizontalRule","SignUpModal","setModalType","errors","setErrors","errorMessage","setErrorMessage","hasSubmitted","setHasSubmitted","firstName","setFirstName","lastName","setLastName","_useState14","password","setPassword","_useSSOSensitiveEmail","useSSOSensitiveEmail","email","setEmail","isEmailSSOEnabled","redirectToSSO","_useState16","shouldShowSSO","setShouldShowSSO","easyApply","isRfpPage","isProposalPage","signupHeadline","signupSubtitle","lineItemsHeader","lineItems","isScientist","isCompany","userType","event","invalidSubmit","Validator","usedPersonalEmail","min","max","hasErrors","keys","tooltipPosition","Grid","centered","columns","Row","Column","lineItem","Form","originalReferrerId","localStorage","getItem","removeItem","responseJson","post","slug","identify","log","indexOf","Field","SSOHintContainer","SSOEnabledHint","SSOToggleContainer","SSOToggle","handleLogin","BLUE_900","modalType","setCurrentRFP","split","identifier","at","getRfpForRfpPage","status","closeLoginModal","toggleLoginModal","View","Modal","LoginModal","compat","asAnchor","withNewTag","dataTestId","activeStylesMatchType","isActive","String","as","NavLink","handleClick","$isActive","InfoTag","accent","ScientistNavbarLinks","UserLinks","NavbarLink","RED_700","LoggedOutNavbarLinks","marketplace_path","MobileMenu","links","isCurrentPage","SlideModalBase","direction","NavLinks","CloseButton","link","button","SponsorNavbarLinks","showBackToProposalReviewDashboard","ButtonLink","features","proposal_library","company_scientist_network","scientistNetworkName","UniversityAdminNavbarLinks","NAVBAR_HIDDEN_PATHS","NAVBAR_BORDER_PATHS","Navbar","shouldIgnoreHiddenPaths","isSticky","setIsSticky","isMobileMenuOpen","setIsMobileMenuOpen","isTablet","isUserLoggedOut","isLandingPage","isInMarketplaceRelatedPage","handleScroll","scrollY","removeEventListener","hasBorder","showMobileMenuButton","LoginSignUpModal","Links","OpenMobileMenuButton","SignInButtons","GradientButton","UnsubscribePage","lazyWithRetry","ResumeOutreachPage","exact","formatPathForRouter","notification_campaigns_unsubscribe_path","resume_outreach_notification_campaigns_path","RfpRequestForm","renderForm","request_type","URLSearchParams","search","RequestType","REQUEST_FOR_PROPOSAL","PrivateSponsorRoute","new_opportunity_path","edit_opportunity_path","RfePage","ProposalPage","request_for_expert_path","requestableType","RequestableType","REQUEST_FOR_EXPERT","RfpPage","seo_request_for_proposal_path","render","match","params","asPreview","Unauthorized401","StatusPage","quote","author","t_html","Forbidden403","ErrorBoundaryFallback","hash","endsWith","replace","innerComponent","isAxiosError","NotFound404","isErrorBoundary","NavBar","ErrorBoundary","AppsignalErrorBoundary","instance","fallback","tags","userEmail","getGoogleScholarAuthors","google_scholar_authors_path","authors","getGoogleScholarAuthor","author_id","authorId","timeout","i18nPrefix","Progress","completionState","step1","step2","step3b","Tabs","Tab","ProgressStep","stepNumber","isCurrent","isComplete","needsUpdate","formVariant","TabUnderline","TABLET_LANDSCAPE_MEDIA_QUERY","BLUE_LIGHT_500","GREEN","setWork","setDetailedType","onContinue","work","detailedType","UserDetailedType","COMPANY_SPONSOR","VENTURE_CAPITAL_SPONSOR","GOVERNMENT_SPONSOR","UNIVERSITY_SCIENTIST","STARTUP_SCIENTIST","SUPPLIER","CONSULTANT","UNIVERSITY_ADMINISTRATOR","assertAbsurd","react_component","detailed_type","S","subheading","heading","OptionsHeading","OptionsContainer","Option","selected","FEATURE_FLAGS","SIGN_OUT_ON_ONBOARDING","h2","BLUE_LIGHT_300","BLUE_650","VISIBLE_PUBLICATION_COUNT","AuthorCard","isSelected","Card","ProfilePicture","Info","Publications","slice","publication","Publication","ONE_LINE_ALT","BLUE_LIGHT_50","DISPLAY_INCREMENT","getAuthorIdFromUrl","urlObj","URL","host","searchParams","Step3aGoogleScholar","userInfo","onBack","selectedAuthorId","setSelectedAuthorId","numDisplayed","setNumDisplayed","filteredAuthorIds","setFilteredAuthorIds","isFetching","searchText","setSearchText","isLoading","setIsLoading","queryClient","useQueryClient","getAuthor","useMutation","mutationFn","onSuccess","user_id","setTimeout","invalidateQueries","queryKey","onError","mutate","fuse","useMemo","Fuse","isResearcher","hasResults","StepHeader","FilterContainer","SearchBarInput","Search","search_query","has_author_id","result","r","item","NEUTRAL_400","AuthorsContainer","find","num_displayed","total","ButtonsContainer","canLoadMore","h1","HEADING_3_REGULAR","Step4NextStep","Description","h3","Step4","hasPreviousAction","getPrevUrlCookie","NextStepsContainer","reviewer_dashboard_path","global_network_search","company_scientist_network_path","routeToPrevUrl","follow","profileInfo","setProfileInfo","step3a","setCompletionState","setUserInfo","selectedGoogleScholarAuthorId","setSelectedGoogleScholarAuthorId","googleScholarAuthorsDisplayCount","setGoogleScholarAuthorsDisplayCount","filteredGoogleScholarAuthorIds","setFilteredGoogleScholarAuthorIds","commenterInviteRequest","useSearchParams","scrollToRef","useRef","current","scrollIntoView","behavior","_useQuery","useQuery","queryFn","refetchInterval","googleScholarAuthors","refetchGoogleScholarAuthors","refetch","isGoogleScholarAuthorsFetching","onboardMutation","onboard","googleScholarAuthorUserId","variables","context","UserNotVerifiedError","toastErrorHandler","updatedUser","trackRegistration","fetchSubscription","proposal_review_system_path","cancelSignUpMutation","cancelSignUp","toString","handleOnboard","onVerify","updateValue","newValue","university","prevUserInfo","updatedUserInfo","previousStep","currentStep","allStepsComplete","every","OnboardingPage","Banner","StepContainer","ref","Step3","Number","selectedGoogleScholarAuthor","Step2","UserVerificationCode","RequestForStartupPage","JobPage","CompanyPage","ProfilePage","ReviewerDashboard","ProposalReviewSystem","Account","RfpOpenCallProposalForm","RequestForStartupProposalForm","RequestForExpertProposalForm","CommercialApplicationPage","Marketplace","TermsPage","PrivacyPage","ContactPage","SponsorTeam","ForgotPassword","ChangePassword","ScientistProposalLibrary","Careers","Inbox","ProposalLibrary","ScientistNetwork","AboutUs","LoginPage","SignUp","ScientistNetworkSignUp","RecommendedRfpSignUp","UniversityProposalLibrary","UniversityTeam","FeatureRequestSplashPage","REQUESTABLE_TO_REQUEST_TYPE","RFP","OPEN_CALL","REQUEST_FOR_STARTUP","QueryClient","mutationCache","MutationCache","_variables","_context","mutation","meta","useGlobalErrorHandler","axios","isArray","login_path","defaultOptions","queries","refetchOnWindowFocus","sessionTimer","PureComponent","constructor","super","listener","this","isTaxonomyUpdateModalOpen","isSSOSponsorOnboardingModalOpen","isCurrentUserLoading","headers","common","Accept","componentDidMount","_this$props","updateWindowDimension","checkUnread","listen","page","outerWidth","outerHeight","wasUserCreatedMoreThan1DayAgo","diff","created_at","isSponsorUserMissingTitleAndRole","setState","webflowContent","webflowContainer","appendChild","componentDidUpdate","prevProps","windowWidth","SESSION_TIMEOUT","clearTimeout","componentWillUnmount","_this$props2","setPageTitle","isWebflow","noFooter","noChat","referrer_id","setItem","current_user_id","homepage","university_admin","QueryClientProvider","client","user_masquerade","Marketplace_app","Marketplace_mainContainer","Marketplace_noFooter","Suspense","Switch","profile_page_path","keywords","OnboardingContainer","_location","RfpRoutes","RequestForExpertRoutes","NotificationCampaignRoutes","OpportunityRoutes","Toaster","process","CYPRESS","ReactQueryDevtools","initialIsOpen","mapDispatchToProps","updateWindowDimensionAction","fetchCurrentUserAction","setCurrentUserAction","checkUnreadAction","clearMessengerStateAction","fetchSubscriptionAction","connect","gridTemplateColumns","minHeight","Marketplace_mobileContainer","toast_body","toast_progress","toast_inner","toast_container","toast_close","FeatureRequestButton","_useSelector","roles","isSponsor","isUniversityAdmin","Canny","appID","avatarURL","created","Date","toISOString","company_id","customFields","user_type","is_startup_scientist","scientist_affiliation","scientist_number_of_proposals","proposal","completed","deleted_at","is_company_admin","is_company_super_admin","sponsor_license_type","sponsor_number_of_review_teams","_role","resource_type","university_admin_affiliation","university_admin_number_of_invites","invited_users_count","university_admin_number_of_accepted_invites","accepted_users_count","authenticatedLink","LinkContainer","StyledLink","useHubspotCTAs","OuterContainer","InnerContainer","TopContainer","EmailDigestCTAContainer","SubHeader","maxHeight","MobileSocialIcons","rel","NEUTRAL_900","Line","mobileOnly","LinksContainer","LinkColumn","LinkHeader","SocialIcons","BottomContainer","BottomLinks","CopyRight","FOOTER_MEDIA_QUERY","DEFAULT_MAX_WIDTH","BLUE_LIGHT_600","BLUE_600","InviteModal_modal","overflow","InviteModal_content","InviteModal_modalTextArea","resize","borderColor","InviteModal_modalInput","InviteModal_modalInputZero","InviteModal_modalButtonHolder","InviteModal_header","InviteModal_closeModalButton","InviteModal_subheader","ConfirmationInviteModal_subheader","ConfirmationInviteModal_footer","InviteModal_deleteIcon","InviteModal_errorMessage","InviteModal_errorField","InviteModal_emailChip","InviteModal_invalidEmailChip","ConfirmationInviteModal_emailChip","InviteModal_modalInputDiv","flexWrap","InviteModal_smallerInputDiv","InviteModal_modalInputDivFocus","InviteModal_inputLabel","InviteModal_inputLabelDropdown","InviteModal_emailDropdown","boxSizing","opacity","InviteModal_modalInputDivFilled","InviteModalDropdown","dropdownActive","DropdownMenu","DropdownItem","red","DropdownSubHeader","ROLES","InviteModal","contactModalLoading","message","inviteMessage","toEmails","isExpanded","emailList","focused","handleSubmitMessage","typeOfInvite","inviteUrl","organization","trackAndToastHandler","requestId","fetchUniversityMembers","_this$state","emails","to_emails","invited_by","request_id","Share","object","SegmentEventObject","Request","university_id","handleChange","attr","handleAddOrRemoveEmail","trim","toLowerCase","isValid","pop","temp","handlePaste","clipboardData","getData","toBeAdded","validEmailList","handleNextStep","_this$state2","deleteEmailFromList","emailIndex","splice","focusInput","focus","handleBlur","handleCloseConfirmationModal","_this$props3","activeTabIndex","modalHeader","modalSubheader","_this$state3","inviteSubject","i","InviteModal_oneEmailChip","autoFocus","onFocus","onKeyDown","onPaste","onBlur","Dropdown","fluid","selection","icon","Menu","Item","rows","currentTarget","setSelectionRange","fetchUniversityMembersAction","bottom","submitting","setSubmitting","setError","urlParams","append","Subheader","signIn","redirectUrl","Error","LoginLink","SHADOW_E","HEADING_3_SEMIBOLD","isCompanyHidden","SectionTitle","UserPreviewContainer","CompanySectionTitle","UnstyledLink","private_alias","CompanyMembers","member","isScientistUser","ExternalLead","CompanyAvatar","isPrivate","imageUrl","avatar","ExternalLeadName","userRole","isUserHidden","isExternalLead","Warning","ORANGE","dmParticipants","Map","forEach","participant","has","set","DMParticipants","DMSectionTitle","TWO_LINES","ORANGE_100","Ably","CREDENTIALS","ABLY_FRONTEND_API_KEY","autoConnect","AttachmentsInfoModal","openFileBrowser","Heading","List","InfoBanner","shouldDisplay","ul","MessageCompose","setMessages","isInbox","openGallery","messageInput","setMessageInput","isFetchingDraft","setIsFetchingDraft","attachments","setAttachments","isAttachmentsInfoModalOpen","setIsAttachmentsInfoModalOpen","isAttachmentUploading","setIsAttachmentUploading","uploadPercentage","setUploadPercentage","hasOpenedAttachmentsInfoModal","setHasOpenedAttachmentsInfoModal","_useState18","attachmentError","setAttachmentError","_useState20","shouldShowJumpToBottom","setShouldShowJumpToBottom","proposaly_id","proposaly_type","messageRef","fetchingProposalIdRef","fileInputRef","uploadAttachmentAbortControllerRef","attachmentsRef","messageInputRef","inputContainerRef","inputBottomRef","abort","ably","channel","channels","subscribe","ABLY_CHANNELS","NEW_MESSAGE","messageData","JSON","parse","unsubscribe","debouncedSetDraftMessage","debounce","setDraftMessage","draftMessage","getDraftMessage","message_attachments","attachmentIds","attachment","click","handleInputResizeAndChange","element","scrollHeight","isProposalThread","isToExternalLead","placeholderRecipientName","confidential","FileInput","accept","files","file","filename","size_in_bytes","mime_content_type","oldAttachments","flushSync","inputContainer","clientHeight","lastElementChild","block","AbortController","uploadAttachment","signal","newAttachments","_attachment","ErrorModal","font","InputContainer","AttachmentsContainer","MessageAttachment","onRemove","attachmentId","handleAttachmentRemove","TextInput","JumpToBottomContainer","JumpToBottom","isVisible","jumpToBottom","textarea","WarningMessageContainer","WarningMessage","BottomButtonContainer","tooltipText","handleAttachmentInitiation","Tooltip","addMessageToThread","messageThreadId","message_thread","createMessageThread","setMessengerThread","SHADOW_D","TAG_MEDIUM_2","messageError","endOfMessagesRef","Messages","index","isFromExternalLead","Message","MessageTime","fromNow","MessageContainer","ProfilePictureContainer","MessageContent","MessageAttachmentContainer","renderNewlines","ZeroMessagesState","setMessageError","isLoadingMessages","setIsLoadingMessages","galleryAttachments","setGalleryAttachments","focusedGalleryAttachmentIndex","setFocusedGalleryAttachmentIndex","getMessages","findIndex","ZeroState","ZeroStateImage","emptyState","isThreadScientistUser","isDmThread","_recipient","hasProposalBanner","MessageAttachmentGalleryModal","focusedAttachmentIndex","setFocusedAttachmentIndex","closeGallery","MessageListContainer","hasBanner","ProposalBanner","ProposalLabel","ViewProposal","proposalyPagePath","MessageList","RfpQuestionSubmittedModal","handleOpenShareModal","isCopied","setIsCopied","Or","navigator","clipboard","writeText","getRequestComments","sortBy","sort_by","createRequestComment","replyToId","request_comments_path","reply_to_id","editRequestComment","put","request_comment_path","upvoteRequestComment","upvote_request_comment_path","downvoteRequestComment","downvote_request_comment_path","deleteRequestComment","delete","SCIENTIST_UPVOTE","SCIENTIST_NEW_QUESTION","SPONSOR_NEW_ANSWER","RequestDiscussionSubmitForm","companyName","replyTo","commentTreeLevel","setIsCommenting","setText","setIsOpen","startedWritingRef","createCommentMutation","Abandon","request_slug","answering","line","Context","InputTooltip","TOOLTIP_CONTENT","arrowOffsetTop","tooltipOffsetTop","labelFont","HEADING_5_SEMIBOLD","startingHeight","characterLimit","CheckboxContainer","scientist","TextLink","Submit","handleSubmitComment","Cancel","isEditing","RequestDiscussionEditForm","comment","setIsEditing","EditContainer","RequestComment","refreshComments","canAnswer","canShowQA","reply_to","replies","cached_votes_up","cached_votes_down","upvoted_by_current_user","downvoted_by_current_user","isCommenting","commentBelongsToCurrentUser","isQuestion","showEditActions","canUpvote","showAnswerButton","showReplyButton","replyToCompanyId","currentUserCompanyId","commenterName","commenterTitle","commenterLocation","onUpvote","is_undo","setTags","commentId","showAwaitingResponse","highlight","AwaitingReponse","Comment","MainContent","TextContainer","QuestionAnswer","TextContent","MessageActions","Delete","User","PictureContainer","UserInfo","DatePosted","QuestionVoteContainer","canVote","didVote","QuestionVoteScore","Helpful","HelpfulThumb","ToastContent","UndoButton","requestCommentId","onUndo","HorizontalLine","Answers","indentAnswers","reply","ORANGE_50","strong","BLUE_LIGHT_700","ORANGE_900","SORT_BY_OPTIONS","RequestDiscussion","setIsShareModalOpen","successModalOpen","setSuccessModalOpen","isFuelModalOpen","setIsFuelModalOpen","isForRfs","requestable_type","checkRfpCompanyHidden","isFuel","_canAccessRequestAsLead","canAccessRequestAsLead","showRfpDiscussion","getLaunchableRequestStatus","LaunchableRequestStatus","ACTIVE","setSortBy","comments","setComments","canAskQuestion","request_comments","onCommentSuccess","FuelModal","QuestionCTA","getCanSubmitProposal","Closed","SortBy","SelectableDropdown","option","Questions","forwardRef","BLUE_LIGHT_250","FAQS","TESTING4AG_FAQS","BASF_RFM_FAQS","BAYER_COLAB_CAMBRIDGE_RFS_FAQS","FUEL_FAQS","FUEL_ID","COMPANIES","RequestFAQs","defaultFaqs","requestable","hubspot_faq_tag","isTesting4Ag","isBasfRfm","isBayerColabCambridgeRfs","isFuelRequest","faqs","faq","newTab","AboutCompany","isResponsive","withMarginTop","customText","lineHeight","reviewTeamMembers","review_team_members","reviewTeamMembersForDisplay","reviewer","sortByHasProfilePicture","sort","b","findRequestRoleNameOnUser","RoleName","REQUEST_LEAD","renderMarkdownText","underline","Reviewers","EXTRA_WIDE_MEDIA_QUERY","RelevanceFeedbackModal","isRelevant","trackingProps","selectedOption","setSelectedOption","otherText","setOtherText","handleCloseModal","isOtherSelected","isSubmitDisabled","ModalIcon","NEUTRAL_700","OptionButton","TextInputContainer","ModalActions","handleSubmit","feedbackText","selected_option","HEADING_5_REGULAR","NEUTRAL_800","BLUE_500","BLUE_450","RELEVANT","NOT_SIGNED_IN","SIGNED_IN","NOT_RELEVANT","RefineRecommendations","setIsRelevant","showModal","setShowModal","isLoggedIn","_useRequestPreference","_useLocalStorage2","useLocalStorage","localPreference","setLocalPreference","isInterested","preference","getUserRequestPreference","is_interested","updateInterest","reason","updateUserRequestPreference","source","UserRequestPreferenceSource","RequestPage","useRequestPreferences","SectionHeading","HeadingText","QuestionText","contentWidth","RelevantButton","handleRelevantClick","is_logged_in","$selected","NotRelevantButton","handleNotRelevantClick","handleModalClose","openLoginModalWithRedirect","BaseButton","SHADOW_CARD","BUTTON_3","HALO_COMPANY_ID","isCompanyPrivate","isRfs","typedRfs","isHaloCompanyRequest","backgroundImageUrl","banner_image","commercial_application","isImageLoadable","isLoadable","setIsLoadable","onload","onerror","useIsImageLoadable","TopRow","CompanyContainer","company_linked","verification_status","CompanyVerificationStatus","VERIFIED","BLUE_LIGHT_650","shouldFlex","asPortal","IconWrapper","ParentProgram","parent_program","CommercialApplication","HEADING_5_BOLD","HEADING_JUMBO","HEADING_BANNER","BLUE_750","handleFade","handleReveal","initialData","user_request_preference","staleTime","Infinity","MarketplaceCard","deleteInterest","deleteUserRequestPreference","RfpCardFooter","isUserFollowing","isCardHovered","shouldShowUnsubscribeButton","statusElementOptions","comingSoon","Status","GREEN_800","deadline","inExtension","NEUTRAL_600","pastDeadline","is_trial","waitListStatus","RequestStatusIcon","statusTagContent","statusTagIconName","shouldShowNotifyButton","getRfpStatus","RfpStatus","COMING_SOON","Tag","getRfpStatusText","OptedIn","NotifyMe","NotifyMeText","RfpCard","fromHref","setIsCardHovered","shouldFade","setShouldFade","_useFollowRequest","useFollowRequest","handleFollowRequest","isComingSoon","CardLink","DisabledCardLink","ActiveCardLink","FadeWrapper","requestPageUrlPath","showHoverBorder","handleNotify","logged_in","Company","TruncatedText","textWidth","lines","KeywordContainer","XMoreWrapper","maxLines","keyword","RELEVANT_NOT_RELEVANT_BUTTONS","Hint","formatDate","date","ScientistContribution","contribution","isExpandable","setIsExpanded","additionalInfo","PublicationName","hasUrl","publication_name","abstract","other_sponsor","foundation_name","org_name","amount","Detail","Intl","NumberFormat","Math","floor","end_date","filing_date","first_completed_at","requestLabel","REQUESTABLE_TO_ICON_NAME","preview","Preview","Details","THREE_LINES","_as","TOOLTIP_EXAMPLES","DEFAULT_TRL_RANGE","SliderHandle","handle","sliderHandleIcon","TRLs","trlRange","asInput","SliderContainer","SliderTrackBackground","Slider","range","vertical","reverse","TECHNOLOGY_READINESS_LEVELS","dots","allowCross","handleRender","newRange","DotContainer","level","Dot","SelectedBar","Levels","Level","halfwayPoint","handleLabelClick","SHADOW_A","viewBox","fill","xmlns","d","stroke","strokeWidth","ConfirmationModal","ResendConfirmationModal","confirmationModalOpen","setConfirmationModalOpen","currentUserEmail","isEmailInputVisible","setIsEmailInputVisible","code","setCode","emailInputError","setEmailInputError","verificationMutation","verifyUser","resendVerificationMutation","resendEmailInvite","t_link","StyledCodeInput","required","fields","fieldHeight","fieldWidth","verificationCode","DropdownRow","DropdownTitle","ResendEmailLink","EmailSection","sentToEmail","hasError","Padding","ReactCodeInput","buttonText","shouldSubmitOnClear","ClearContainer","NEUTRAL_350","TAG_MEDIUM_1","BLUE_LIGHT_400","ShareWithinCompanyModal","toastText","handleShare","dropdownOptions","generateEmailDropdownOptions","setEmails","emailError","setEmailError","setMessage","fetchAllCompanyMembers","Promise","all","then","catch","finally","EmailDropdown","extraMarginTop","TextArea","SubmitButtonContainer","DropdownContainer","containerStyles","DropdownStyles","creatable","CreatableSelect","AsyncSelect","Select","DROPDOWN_STYLES","TagContainer","CreatedTagContainer","CreateLabel","customStyles","isFocused","control","base","menu","multiValue","singleValue","TagOption","_objectWithoutProperties","_excluded","research_type","components","substring","MenuList","_ref2","_excluded2","_props","menuHeaderText","CustomDropdownIndicator","DropdownIndicator","CustomNoOptionsMessage","customNoOptionMessage","NoOptionsMessage","fuzzy","maxOptions","selectStyles","menuIsOpen","closeMenuOnSelect","selectedValue","setSelectedValue","selectedValueRef","tagLimitReached","val","placeholderText","classNamePrefix","formatCreateLabel","inputValue","IndicatorSeparator","selectProps","elem","sel","x","defaultProps","menuPlacement","disableIconColor","errorColor","InfoText","openInNewTab","isExternalLink","SignInTitle","SingleInputContainer","modalState","setModalState","currentUserId","INITIAL_LOAD_STATE","numPdfPages","MessageAttachmentGalleryPreview","focusedAttachmentId","prioritizedAttachments","focusedIndex","newLoadStates","loadStates","setLoadStates","handleError","oldLoadStates","download_url","file_url","isImage","_loadStates","download","inverted","onLoad","handleImageLoad","Pdf","Document","onLoadError","onLoadSuccess","pdf","handlePdfLoad","numPages","Page","pageNumber","renderAnnotationLayer","renderTextLayer","oldIndex","querySelector","focusedAttachment","handleArrowClick","increment","modal","Background","tabIndex","Wrapper","Metadata","formatMIMEContentType","formatBytes","Arrow","Island","remainOnHover","shouldWrap","Img","thumbnail_url","handleThumbnailClick","newFocusedIndex","body","useEffectRefresh","refreshKey","setRefreshKey","refresh","ScientistQueryKey","useScientist","setScientist","about","setAbout","positions","setPositions","isScientistLoading","getUser","scientistProfile","is_in_network","pos","duration","university_start_year","university_end_year","startup","startup_name","start_year","end_year","educations","education","degree","field_of_study","usePublications","scientistProfileId","setPublications","_useEffectRefresh","pubs","useFundings","setFundings","_useEffectRefresh2","funds","usePatents","setPatents","_useEffectRefresh3","pats","useProposals","asUniversityAdmin","setProposals","rawProposals","InviteNetworkScientistModal","submissionError","setSubmissionError","Invite","invitees","_await$inviteScientis","inviteScientistsToCompanyNetwork","immediately_added","sent_invitation","already_in_network","toastCustomizedMessage","toastMessage","UnsubscribedRfpCard","toggleUnsubscribeFromRfp","HeadingContainer","CardsContainer","StyledButton","OptionContainer","OptionRow","OptionHeading","OptionDescription","RfpUnsubscribeModal","unsubscribeParam","notifIdentifierParam","requestForProposals","setRequestForProposals","unsubscribedRequestIds","setUnsubscribedRequestIds","setUserId","isShadowProfile","setIsShadowProfile","settings","setSettings","handleToggle","enabled","updateNotificationSetting","prevSettings","newSettings","settingIndex","setting","PreferenceModal","signedNotificationId","fetchRequestForProposalsFromNotification","is_shadow_profile","notification_settings","category","request_for_proposals","account_settings_path","q","SponsorShareScientistModal","scientist_id","sponsorShareScientist","ScientistQuickViewModal","scientistUserId","sendMessage","addToNetwork","forUniversityProposalLibrary","activeTab","setActiveTab","isShareModalOpen","_useScientist","windowHeight","visibleTabs","tab","tabs","count","TopContent","ScrollContainer","About","Keywords","theme","Position","IndividualContainer","Note","TabPanel","MAX_KEYWORD_DISPLAY_COUNT","useCallback","nextInit","newSearchParams","init","reduce","memo","concat","useQueryParams","NOTIFY_SEARCH_PARAM","shouldSkipFollowOnRedirect","_useSearchParams2","setSearchParams","followed_request_ids","_useMutation","followRequest","followedRequest","dependencies","__hsWebInteractiveInstance","useIsMount","isMountRef","initialValue","storedValue","setStoredValue","parsedItem","isEqual","handleStorageChange","valueToStore","Function","stringify","domains","setDomains","excludedEmails","setExcludedEmails","setIsEmailSSOEnabled","isAborted","abortController","abortSignal","email_domains","excluded_emails","getSSOEmailDomains","emailParts","prevUrl","encodeURIComponent","payloadActionGenerator","setSubscription","loadCompanyMembers","setCompanyMembers","companyIdentifier","getMostRecentSubscription","companyId","sponsor_users","getCompanyMembers","setFollowedRequestsInfo","setCurrentCompany","setLoadingCurrentCompany","setInvitedUsers","setLoadInvitedUsers","setUniversityTeamMembers","loadCompany","accessCode","prompt","access_code","secondError","alert","fetchFollowedRequestsInfo","followed_requests_info","fetchInvitedUsers","organizationId","organization_id","loadCurrentUser","emptyActionGenerator","loadPatents","loadPublications","loadFundings","setUnreadCount","updateProfileImage","finishFollowUnfollowCompany","fetchFromSession","fetchPatents","profileInfoId","fetchPublications","fetchFundings","unread_count","DESKTOP","MOBILE","TABLET","TABLET_LANDSCAPE","isMobile","isDesktop","isTabletLandscape","submitForm","formId","hutk","getCookie","fetchNotificationSettings","patch","fetchUserInfoFromNotification","notificationId","request_for_proposals_notification_path","for_rfp_page","getRfpByRequestSlug","createOrUpdateRfp","formattedData","is_private","rfpData","company_research_interest_id","areaOfInterestId","looking_for","lookingFor","request_solutions","requestSolutions","request_requirements","requestRequirements","req","allow_attachments","allowAttachments","preferred_requirements","stringArrayToBulletText","niceToHaveRequirements","out_of_scope","outOfScope","partnership_models","partnershipModels","trl_range","sponsored_research","RfpPartnershipModel","SPONSORED_RESEARCH","sponsoredResearch","gift","GIFT","expertise","tools_and_technology","toolsAndTechnology","compounds_and_reagents","compoundsAndReagents","facilities_and_services","facilitiesAndServices","market_access","marketAccess","networking","submitted","isSubmitted","visible_on_marketplace","forInternalEmployees","visibleOnMarketplace","visible_on_company_page","visibleOnCompanyPage","visible_on_notification_campaign","visibleOnNotificationCampaign","has_access_code","hasAccessCode","for_internal_employees","partner_types","partnerTypes","rfp","exportRequestForProposal","rfpId","rfpIdentifier","responseType","createObjectURL","Blob","createElement","setAttribute","parentNode","removeChild","joinRfpWaitlist","getFilteredCompanyMembers","keyword_filter","keywordFilter","company_role_filter","companyRoleFilter","request_role_filter","requestRoleFilter","members","getSponsorTeamKeywordOptions","keyword_options","upgradeToPremium","upgradeToStandardLicense","upgradeToAdmin","downgradeFromAdmin","upgradeToSuperAdmin","updatePendingReviewTeamMembership","sid","isApprovedForLicense","is_approved_for_license","getNetworkScientists","for_scientist_network","order_by","page_number","search_filter","searchFilter","country_filter","countryFilter","institution_type_filter","institutionTypeFilter","institution_name_filter","institutionNameFilter","request_id_filter","requestIdFilter","status_filter","statusFilter","submitters_only_filter","submittersOnlyFilter","connection_filter","connectionFilter","accessToken","access_token","company_network_scientists_path","getUniversityMembers","faculty_filter","facultyFilter","name_filter","nameFilter","title_filter","titleFilter","getUniversityMembersTabCounts","faculty_count","admin_count","getUniversityMembersOptions","name_options","title_options","sendInviteFromUniversityAdmin","sendUniversityAdminInviteToSubmit","toUserIds","requestIds","to_user_ids","request_ids","followed_request","unfollowRequest","Unknown","signed_notification_id","Routes","timestamp","register","invitedUserId","invited_user_id","account_type","how_did_you_hear_about_us","howDidYouHearAboutUs","HOW_DID_YOU_HEAR_ABOUT_US_OTHER_OPTION","howDidYouHearAboutUsOther","encodeURI","companyURL","primary_affiliation","country_code","google_scholar_author_user_id","commenter_invite_request","university_expertise","universityExpertise","viewed_tours","verification_code","ProposalReviewStatus","ProposalStatus","ProposalStageNotStatus","ProposalyType","PRETTY_ROLE_NAMES","COMPANY_MEMBER","COMPANY_ADMIN","COMPANY_SUPER_ADMIN","REQUEST_DRAFT_EDITOR","REQUEST_COMMENTER","REQUEST_EXTERNAL_COMMENTER","REQUEST_EXTERNAL_LEAD","UniversityAdminRoles","UniversityExpertise","docCookies","targetLink","deletePrev","shouldRedirect","localeData","relativeTime","utc","timezone","dayjsBusinessDays","now","dayDropdownOptions","month","year","daysInMonth","daysInMonthArray","day","MONTH_DROPDOWN_OPTIONS","yearOptions","getFullYear","YEAR_DROPDOWN_OPTIONS","formatDateToEastern","tz","PROPOSAL","proposal_path","REQUEST_FOR_STARTUP_PROPOSAL","request_for_startup_proposal_path","REQUEST_FOR_EXPERT_PROPOSAL","request_for_expert_proposal_path","REQUESTABLE_TYPE_TO_PROPOSALY_TYPE","PROPOSAL_SLUG_PARAM","isUsingResponseDeadlinesV2","isDraft","complete","_user$profile_info","isPremium","SponsorLicenseType","PREMIUM","isOpenCall","resource_id","canAccessRequest","isSponsorAtCompany","isExternalLeadOnRequest","filterReviewTeamByRole","team","roleName","reviewTeamMembersForReviewerDashboardThumbnails","superAdminReviewers","onlyAdminReviewers","leads","commenters","externalLeads","externalCommenters","draftEditors","uniqBy","hideAccessCode","rfp_program_identifier","ACCESS_CODE_PARAM","submit_proposal_path","launch_date","CLOSED","isBeforeLaunchDate","isBefore","isPastDeadline","isAfter","IN_EXTENSION","getRequestFeedbackDeadlineStatus","FEEDBACK_DEADLINE_CUTOFF_DATE","canUseFeedbackDeadline","RequestFeedbackDeadlineStatus","NOT_APPLICABLE","feedback_deadline","NEEDS_DEADLINE","daysUntilDeadline","PAST_DEADLINE","DEADLINE_APPROACHING","BEFORE_DEADLINE","isNonOpenCallAfterJan1st2024","UTC","sortMarketplaceRequests","requests","scores","aStatus","bStatus","compareStatus","compareScores","compareLaunchDate","getTime","compareDeadline","RELEVANCE","LAUNCH_DATE","DEADLINE","argument","imageSize","SEARCH_FILTER_PARAM","REQUEST_TYPES_FILTER_PARAM","PARTNER_TYPES_FILTER_PARAM","RespondToRequestsFilters","setSearchFilter","requestTypesFilter","setRequestTypesFilter","partnerTypesFilter","setPartnerTypesFilter","totalCount","isPanelOpen","setIsPanelOpen","searchInput","setSearchInput","isMount","requestTypes","handleClearFilters","searchFilterAsChips","searchBarEl","searchFilterEl","ChipsInput","selectedValues","hideAll","handlePartnerTypeChange","partnerType","prev","commonFiltersEl","MARKETPLACE_PARTNER_TYPE_FILTER","FilterSection","isReversed","CheckboxLabel","withMargin","RequestPartnerTypes","STARTUPS","ACADEMIC_RESEARCHERS","SUPPLIERS","customCloseButton","Panel","ResetFiltersButton","PanelFooter","SearchAndFilter","labelMargin","VIEW_ALL_PARAM","RespondToRequests","currentPageNum","setCurrentPageNum","isRfpUnsubscribeModalOpen","setIsRfpUnsubscribeModalOpen","isKeywordsModalOpen","setIsKeywordsModalOpen","allFilters","canViewAllParam","canViewAll","getMarketplaceRequests","requestScores","beginningOfPage","endOfPage","KeywordSignUpModal","Columns","FilterColumn","ContentColumn","CountAndSort","NoResultsContainer","NoResultsHeader","NoResultsText","Pagination","currentPage","setCurrentPage","totalPages","ceil","DESKTOP_MEDIA_QUERY","collapsible","FilterSectionContainer","FilterContentsContainer","ClearFilterButton","STARTUP_TITLES","STARTUP_TITLE_OPTIONS","companyRoleOptions","countryOption","handleCompany","oldProfileInfo","is_university_scientist","withSearchIcon","COUNTRY_OPTIONS","getValueFromOption","isValidURL","roleDropdownOptions","prefillCompanyName","companyOptions","useCompanyOptions","fetchedSuggestions","company_suggestions","fetchCompanySuggestions","suggestedCompany","fixed","readOnly","isCreatable","COMPANY_SPONSOR_TITLE_LIMIT","hideClearButton","prefillInstitutionName","disciplineOptions","getDisciplines","select","universityHasCountry","UniversityDropdown","has_country","handleDisciplines","SCIENTIST_ROLE_OPTIONS","SCIENTIST_ROLES","handleSelectUniversityOption","googleScholarInstitutionNotFound","HOW_DID_YOU_HEAR_ABOUT_US_OPTIONS","stepSubheading","stepHeading","center","Step3CompanySponsor","Step3CompanyScientist","Step3ResearchInstitutionAdmin","Step3ResearchInstitutionScientist","placeholderColor","StepHeaderContainer","StepSubheading","StepHeading","large","DropdownSubtitle","Hairline","DropdownOld","half","ContactLink","Loader_","Dropdown_blueLabel","CheckboxItem","AccessCode","requestData","request_title","BenefitCard","benefit","benefit_type","details","RfpBenefitType","MARKET_ACCESS","EARLY_ACCESS","EXPOSURE","INVESTMENT","PAYMENT","EXPERTISE","NETWORKING","TOOLS_AND_TECHNOLOGY","COMPOUNDS_AND_REAGENTS","DATA","FACILITIES_AND_SERVICES","SERVICES_AGREEMENT","Benefits","fundingBenefits","nonMonetaryBenefits","validPartnershipModels","partnershipModel","WhatWeCanOfferYou","BenefitSection","Subheading","PartnershipModels","PARTNERSHIP_MODEL_LABELS","BenefitsContainer","RequestAttachment","fileSize","Meta","RequestAttachmentsContainer","PreviewRfpPageBanner","setButtonText","LINE_ITEMS","JoinWaitlistModal","hasSuccessfullySubmitted","setHasSuccessfullySubmitted","subheader","ctaText","BulletList","BulletPoint","BulletText","DoubleInputContainer","h6","getDropdownComponent","DropdownItemIcon","googleCalendar","ical","outlook","AddToCalendar","AddToCalendarHOC","ButtonWrapper","DropdownWrapper","CalendarDropdown","CalendarDropdownItem","cloneElement","AddToCalendarButton","containerRef","startDate","startOf","endDate","add","endDatetime","startDatetime","items","SHARE_SITES","GOOGLE","OUTLOOK","ICAL","li","RfpCtaContainer","isJoinWaitlistModalOpen","setIsJoinWaitlistModalOpen","handleSubmitClick","submitUrl","isUniversityMember","handleJoinWaitlist","rfpStatus","StatusCircle","viewAsScientist","isJamesStanton","canApply","hasIncompleteProposal","scientistPrimaryButton","universityPrimaryButton","is_partner","FollowingConfirmation","$showBorder","rfp_program","withoutTooltip","SHADOW_B","RfpKeywordsContainer","Tags","TagTooltip","AccessCodeBanner","hideIcon","rfpPreviewData","setRequest","needsAccessCode","setNeedsAccessCode","accessCodeError","setAccessCodeError","accessCodeRequestData","setAccessCodeRequestData","rfpDiscussionRef","_useParams","previewHash","accessCodeParam","fetchRequest","rfpRequest","requestable_id","decodedRfpIdentifier","atob","useLayoutEffect","animationFrameId","checkAndScroll","requestAnimationFrame","cancelAnimationFrame","showRfpDiscussionBanner","is_discussion_enabled","getArrayFromRubyRange","shouldShowAccessCodeBanner","none","isConfidential","PageContainer","hasPaddingTop","hasTopDivider","RequestPageBanner","fixMarkdownNewlines","BulletedSection","request_attachments","solution","requirement","TRLsContainer","TrlTagContent","funding_benefits","non_monetary_benefits","RightColumn","RfpCta","any","BASE_WINDOW_WIDTH","didCatch","setDidCatch","Quote","Author","ErrorMessage","handleCtaClick","goBack","UniversityTeamSearch","setNameFilter","setTitleFilter","setKeywordFilter","_useDynamicOptions","useDynamicOptions","nameOptions","titleOptions","keywordOptions","filtersCount","MultiSelectDropdown","FooterButtons","handleClearFilter","MissingAFilter","setNameOptions","setTitleOptions","setKeywordOptions","CompanySize","CompanySpend","CompanyType"],"sourceRoot":""}