@clickview/lite 0.72.0 → 0.72.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/1109-4f5b0dab9b-lite.chunk.js +2 -0
- package/dist/scripts/1109-4f5b0dab9b-lite.chunk.js.map +1 -0
- package/dist/scripts/1667-fcdff22585-lite.chunk.js +3 -0
- package/dist/scripts/1667-fcdff22585-lite.chunk.js.map +1 -0
- package/dist/scripts/{3596-d760a67a58-lite.chunk.js → 3596-89a39d3781-lite.chunk.js} +3 -3
- package/dist/scripts/{3596-d760a67a58-lite.chunk.js.map → 3596-89a39d3781-lite.chunk.js.map} +1 -1
- package/dist/scripts/3816-ca44792dca-lite.chunk.js +2 -0
- package/dist/scripts/3816-ca44792dca-lite.chunk.js.map +1 -0
- package/dist/scripts/7601-c1b07b72c6-lite.chunk.js +2 -0
- package/dist/scripts/7601-c1b07b72c6-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-6e723fdeb1.min.js → bundle-23f3b64e36.min.js} +3 -3
- package/dist/scripts/{bundle-6e723fdeb1.min.js.map → bundle-23f3b64e36.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1109-98508a03fe-lite.chunk.js +0 -2
- package/dist/scripts/1109-98508a03fe-lite.chunk.js.map +0 -1
- package/dist/scripts/1667-ac162f04d0-lite.chunk.js +0 -3
- package/dist/scripts/1667-ac162f04d0-lite.chunk.js.map +0 -1
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js +0 -2
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js.map +0 -1
- package/dist/scripts/7601-b439c82e82-lite.chunk.js +0 -2
- package/dist/scripts/7601-b439c82e82-lite.chunk.js.map +0 -1
- /package/dist/scripts/{1667-ac162f04d0-lite.chunk.js.LICENSE.txt → 1667-fcdff22585-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3596-d760a67a58-lite.chunk.js.LICENSE.txt → 3596-89a39d3781-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-6e723fdeb1.min.js.LICENSE.txt → bundle-23f3b64e36.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3816-abed23a1ce-lite.chunk.js","mappings":"qgDAOA,IAAMA,EAAa,GAiBb,SAAUC,EACdC,EACAC,GAEA,IAEMC,EAFS,UAA0BF,EAASF,GAE1BK,KAAI,SAAAC,GAAK,OAAIH,EAAW,SAAiBG,GAAO,IAElEC,EAAY,qBAA6BH,GAEzCI,EAAW,YAAoBD,EAAUE,MACzCC,EAAQH,EAAUE,KAAKE,OACzBH,EAASI,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGC,EAAKC,GAAKD,GAAI,GAAK,CAAC,GAC/D,KAEJ,MAAO,CACLN,SAAAA,EACAE,MAAAA,EACAM,WAAYT,EAAUS,WAE1B,CAQM,SAAUC,EACdC,EACAf,EACAgB,G,YAEMC,EAASD,GAAY,SAACE,GAC1B,MAAmB,WAAf,EAAOA,GACFA,EAAIN,GAENM,CACT,EAEMC,EAAe,SAA0B,IAAIC,KAEmB,G,EAApC,WAAiC,I,EAAG,E,unBAA9DnB,EAAQ,KAAEoB,EAAW,KAE7B,aAAgB,WACd,GAAKN,aAAI,EAAJA,EAAMP,OAAX,CAGA,IAAMc,EAAsB,GAE5BP,EAAKQ,SAAQ,SAAAL,GACX,IAAMM,EAAMP,EAAOC,GAEfC,EAAaM,QAAQC,IAAIF,KAG7BF,EAAeK,KAAKT,GACpBC,EAAaM,QAAQG,IAAIJ,GAC3B,IAEKF,EAAed,QAGpBa,GAAY,SAAAQ,GAAC,kBAAUA,GAAC,EAAK,UAAqBP,EAAgBzB,GAAYK,IAAIF,IAAW,GAjBrF,CAkBV,GAAG,CAACe,aAAI,EAAJA,EAAMP,SAEV,IAAMJ,EAAY,qBAA6BH,GAEzCI,EAAW,YAAoBD,EAAUE,MACzCC,EAAQH,EAAUE,KAAKE,OACzBH,EAASI,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGO,EAAON,GAAQA,GAAI,GAAK,CAAC,GACpE,KAEJ,MAAO,CACLmB,4BAAoD,QAAxB,EAAmB,QAAnB,EAAA1B,EAAUA,iBAAS,eAAG,UAAE,eAAE2B,cACtD1B,SAAAA,EACAE,MAAAA,EACAM,WAAYT,EAAUS,WAE1B,C,wECnGMmB,EAAmB,I,iHC2BnB,SAAUC,EACdjC,EACAkC,EACAC,EACAC,EACAC,EACAC,GAEA,I,ID1BgCC,EAC1BC,ECyB+C,G,GAAX,IAAAC,UAAS,G,EAAE,E,o4BAA7CC,EAAY,KAAEC,EAAe,KAE/BC,EAAcV,EAcdW,GAAW,QAZjB,SAAgBC,GACd,IAAK9C,EACH,OAAO,KAET,IAAM+C,EAAU/C,EAAW8C,GAE3B,OAAKC,EAGEA,EAAQvB,IAFN,IAGX,GAIEY,EACAC,GAwCF,ODrFgCE,ECwDd,CAChBS,cATF,WACE,GAAKd,GAAclC,GAAe6C,EAIlC,OADAF,GAAgB,SAAAM,GAAU,OAAIA,EAAa,CAAC,IACrCL,EAAYC,EAASK,WAC9B,EAIEC,WAAWN,aAAQ,EAARA,EAAUK,YACrBrC,WAAYgC,aAAQ,EAARA,EAAUhC,WACtByB,gBAAAA,GD3DIE,EAAe,WACnB,IAAID,EAAQ1B,WAAZ,CAGA,GAAK0B,EAAQD,gBAON,CACL,IAAQA,EAAoBC,EAApBD,gBAKR,GAJ4BA,EAAgBc,wBAAwBC,OAASf,EAAgBgB,UAEzEhB,EAAgBiB,aAAevB,EAGjD,MACH,MAVC,GAJ4BwB,OAAOC,YAAcC,SAASC,gBAAgBL,UAEtDI,SAASC,gBAAgBJ,aAAevB,EAG1D,OAWJO,EAAQS,eAnBA,CAoBV,GAEA,IAAAY,YAAU,WACR,IAAMC,EAAWC,EAAA,WAAwBtB,EAAc,KAEjDF,EAAkBC,EAAQD,iBAAmBkB,OAKnD,OAHIjB,EAAQY,SACVb,EAAgByB,iBAAiB,SAAUF,GAEtC,kBAAMvB,EAAgB0B,oBAAoB,SAAUH,EAAS,CACtE,GAAG,CAAEtB,EAAQY,QAASZ,EAAQS,cAAeT,EAAQD,mBC6BrD,IAAAsB,YAAU,WACHf,GAGDA,EAASoB,oBAAsB/B,IACjCU,IACAD,GAAgB,SAAAM,GAAU,OAAIA,EAAa,CAAC,IAEhD,GAAG,CAAEJ,aAAQ,EAARA,EAAUoB,mBAAoB/B,KAEnC,IAAA0B,YAAU,W,QACR,IAAKf,aAAQ,EAARA,EAAUqB,aAAeJ,EAAA,aAA0B3B,GAAxD,CAGA,IAAMgC,IAAoE,QAA/B,EAAmB,QAAnB,EAAAtB,EAASqB,kBAAU,eAAEE,kBAAU,eAAEC,OAAO,EAAG,IAElFF,IAAoBG,EAAA,eAA+BH,IAAoBG,EAAA,eAG3EnC,EAAQO,EAAcG,EAASqB,WAPvB,CAQV,GAAG,CAACrB,aAAQ,EAARA,EAAUqB,aAEP,CACL3D,MAAOsC,aAAQ,EAARA,EAAUtC,MACjB4C,WAAWN,aAAQ,EAARA,EAAUK,YACrBA,WAAYL,aAAQ,EAARA,EAAUK,WACtBrC,WAAYgC,aAAQ,EAARA,EAAUhC,WACtB0D,WAAY1B,aAAQ,EAARA,EAAU0B,WACtBC,sBAAuB3B,aAAQ,EAARA,EAAU2B,sBAErC,C,kBC1GA,IAAYC,E,iBAAZ,SAAYA,GACV,2CACA,yBACA,+BACA,yCACA,2BACA,2BACA,eACD,CARD,CAAYA,IAAAA,EAAc,I,yFCSpB,SAAUC,EAAiBC,EAAmBC,EAAgBC,GAClE,OAAKF,GAAcC,EAGZ,CACLE,YAAa,cACbC,OAAQ,qBACRC,KAAM,CAAEL,EAAWC,EAAOhE,GAAI,YAAmBgE,EAAOK,OACxDC,OAAQ,CACNL,KAAAA,IAPK,IAUX,CAEM,SAAUM,EAAuBP,GAGrC,I,QAFIQ,EAAW,EAENC,EAAI,EAA0B,QAAvB,EAAAA,GAAe,QAAX,EAAAT,EAAOK,YAAI,eAAEzE,eAAM,SAAO6E,IAC5CD,GAAYR,EAAOK,KAAKK,WAAWD,GAGrC,OAAO,IAAsBD,EAAW,WAC1C,C,gLCxBM,SAAUG,EAAkBC,G,YAC1BC,EAAgB,OAAH,wBACdD,EAAMC,eAAa,CACtB7E,GAAc,QAAV,EAAA4E,EAAMlF,YAAI,eAAEM,GAChBqE,KAAgB,QAAV,EAAAO,EAAMlF,YAAI,eAAE2E,OAGdS,EAAmB,OAAH,sBACpBC,SAAU,6BACPH,EAAME,kBAAgB,CACzBE,WAAY,WACZC,OAAQ,aACRC,WAAY,aAGd,OACE,gBAACC,EAAA,EAA6B,iBACxBP,EAAK,CACTC,cAAeA,EACfC,iBAAkBA,EAClBM,SAAyB,QAAf,EAAAR,EAAMlF,KAAK2F,YAAI,eAAEC,IAC3BC,aAAiC,QAAnB,EAAAX,EAAMlF,KAAK8F,gBAAQ,eAAEC,SAGzC,CCvBM,SAAUC,EAAcd,GAC5B,OACE,gBAACe,EAAA,EAAG,CAACC,GAAG,KAAKC,GAAI,EAAGC,GAAIlB,EAAMmB,cAAgB,EAAI,EAAGC,GAAIpB,EAAMmB,cAAgB,EAAI,GACjF,uBAAKE,UAAS,+BACZ,gBAACtB,EAAiB,CAChBjF,KAAMkF,EAAM7E,KACZmG,gBAAiBtB,EAAMuB,SAASC,kBAChCC,uBAAwB,WAAK,QAAC,OAAuC,QAAvC,KAAAzB,EAAMuB,UAASG,gCAAwB,sBAAG1B,EAAM7E,KAAK,EACnF8E,cAAe,CACb0B,UAAW3B,EAAM2B,UACjBC,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmB,GAErBC,QAAStC,EAAMmB,iBAKzB,C,gDC9BA,QAA4B,Q,sGCe5B,IAAMoB,EAAY,4BAIZ,SAAUC,EAAmBxC,G,QAC3ByC,EAAQzC,EAAM7E,KAAKuH,WAHW,IAKhC1C,EAAM7E,KAAKuH,UASTC,EAAiB,2BACjBC,EAAqD,QAApC,EAAAD,EAAejD,cAAqB,QAAI,CAAC,EAC5DmD,EAAqC,QAArB,EAAAD,aAAa,EAAbA,EAAeE,cAAM,QAAI,GAEzCD,IAAkBE,MAAMC,QAAQH,KAClCA,EAAgB,CAACA,IAEnB,I,EAAMI,EAAgB,OAAH,wBACdN,GAAc,CACjBjD,OAAQ,OAAF,wBACDkD,GAAa,CAChBE,OAAQ,GAAF,Q,EAAQD,E,omBAAgB,4BAI5B5C,EAAgB,CACpB4B,MAAO7B,EAAM8B,YAAYD,MACzBF,UAAW3B,EAAM2B,UACjBU,kBAAmBrC,EAAMqC,mBAErBnC,EAAmB,CACvBG,OAAQ,mBACRF,SAAU,6BACVC,WAAY,WACZE,WAAY,sBAGd,OACE,uBAAKe,UAlC2B,IAA5BrB,EAAMqC,kBACD,0BAEF,gDAgCL,gBAACa,EAAA,EAAO,CACNC,QAASF,EACThD,cAAeA,EACfC,iBAAkBA,GAElB,sBAAImB,UAAU,MACZ,gBAAC+B,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,cAGvC,yBACE,gBAACD,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,YAAY,IAE/C,gBAACH,EAAA,EAAO,CACNC,QAASnD,EAAMuB,SAAS+B,eACxBjC,UAAU,YACVpB,cAAeA,EACfC,iBAAgB,+BACXA,GAAgB,CACnBI,WAAY,iBAGd,gBAAC8C,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,oBAC3B,KAIZ,uBAAKhC,UAAS,4BAAuB,IAClCrB,EAAM7E,KAAKoI,OAAOC,MAAM,EAAGf,GAAO/H,KAAI,SAAC+I,EAAG5D,GACzC,OACE,gBAAC6D,EAAA,EAAS,CACR1H,IAAK6D,EACL8D,MAAOF,EACPG,gBAAiB5D,EAAMuB,SAASqC,gBAChCC,sBAAuB7D,EAAM8D,UAC7B7D,cAAgB,CACd2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO0B,EAAEzB,OACTC,SAAUwB,EAAEvB,UACZC,SAAUsB,EAAErB,WAEdC,kBAAmBrC,EAAMqC,mBAE3B0B,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,kBAG9B,KAEF,uBAAK3C,UAAU,oBACb,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,iBACV8B,QAASF,EACThD,cAAeA,EACfC,iBAAkBA,GAElB,gBAACkD,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,cAK7C,C,eClHM,SAAUY,EAAoBjE,GAClC,OACE,uBAAKqB,UAAU,QACb,gBAAC6C,EAAA,EAAS,CACRP,MAAO3D,EAAM7E,KACb0I,sBAAuB7D,EAAM8D,UAC7BF,gBAAiB,SAACH,EAAGU,GAAI,OAAKnE,EAAMuB,SAASqC,gBAAgBH,EAAGU,EAAK,EACrElE,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3B+B,sBAAoB,EACpBC,kBAAmBC,EAAA,oBAA8BtE,EAAM+D,gBACvDC,iBAAkBhE,EAAMgE,mBAIhC,C,yBCcM,SAAUO,EAAmBvE,GACjC,IArBMwE,EAqBAC,GArBAD,GAAc,EAAAE,EAAA,MAEJC,IAAMH,EAAYI,IACzB,EAEF,EAkBDrB,EAASvD,EAAM6E,SAAStB,OAAOzI,KAAK0I,MAAM,EAAGiB,GAE7CK,EAA4C,CAChD1E,WAAY,WACZC,OAAQ,cACRF,SAAU,yBAGN4E,EAAqB,+BACtB/E,EAAMC,eAAa,CACtB7E,GAAI4E,EAAM6E,SAASzJ,GACnBqE,KAAMO,EAAM6E,SAASpF,OAGvB,OACE,uBAAK4B,UAAU,aACb,gBAAC2D,EAAA,EAAG,CAAC3D,UAAU,wBACb,gBAACN,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,EAAGC,UAAU,QAC3B,gBAAC,KAAY,CACX8B,QAASnD,EAAMkF,gBACfjF,cAAeD,EAAMC,cACrBC,iBAAgB,+BACX4E,GAAuB,CAC1BxE,WAAY,aAEdxF,KAAMkF,EAAM6E,SACZhB,sBAAuB7D,EAAM6D,sBAC7BsB,mBAAoB,IACpBC,UAAU,aACVC,YAAarF,EAAMgE,iBAAiBqB,YACpCC,YAAatF,EAAMsF,YACnB5C,WAAW,EACX6C,WAAS,KAGb,gBAACxE,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,GACd,uBAAKC,UAAU,kCACb,uBAAKA,UAAS,qBCnFE,UDoFbkC,aAAM,EAANA,EAAQ7I,KAAI,SAAAiJ,GACX,IAAM6B,EAAkB,+BACnBT,GAAqB,CACxBU,QAAS9B,EAAMvI,GACfsK,UAAW/B,EAAMlE,OAGnB,OACE,uBAAKzD,IAAK2H,EAAMvI,GAAIiG,UAAU,QAC5B,gBAACqC,EAAA,EAAS,CACRC,MAAOA,EACPC,gBAAiB5D,EAAM4D,gBACvB3D,cAAeuF,EACftF,iBAAkB,CAChBG,OAAQ,WACRF,SAAU,yBAEZwF,KAAK,KACL5B,eAAgB/D,EAAM+D,eACtB6B,mBAAiB,EACjB5B,iBAAkBhE,EAAMgE,mBAIhC,KAEF,uBAAK3C,UAAU,sBACb,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,wBACV8B,QAASnD,EAAMkF,gBACfjF,cAAe8E,EACf7E,iBAAgB,+BACX4E,GAAuB,CAC1BxE,WAAY,aAGd,gBAAC8C,EAAA,EAAI,CAACb,UApGJ,4BAoG0Bc,OAAO,sBAQnD,CEzHM,SAAUwC,EAAoB7F,GAClC,OACE,uBAAKqB,UAAU,SACb,gBAACkD,EAAkB,CACjBM,SAAU7E,EAAM7E,KAChB+J,gBAAiBlF,EAAMuB,SAASuE,mBAAmB9F,EAAM7E,MACzD0I,sBAAuB7D,EAAM8D,UAC7B7D,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3BiD,YAAatF,EAAMsF,YACnBS,cAAY,EACZnC,gBAAiB5D,EAAMuB,SAASqC,gBAChCG,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,mBAIhC,C,eCaM,SAAUgC,EAAiBhG,GAC/B,IAvBMwE,EAuBAC,GAvBAD,GAAc,EAAAE,EAAA,MAEJC,IAAMH,EAAYI,IACzB,EAELJ,EAAYpD,IAAMoD,EAAYtD,GACzB,EAEF,EAiBDqC,EAASvD,EAAMiG,OAAO1C,OAAOzI,KAAK0I,MAAM,EAAGiB,GAE3CyB,EAA0C,CAC9C9F,WAAY,WACZC,OAAQ,YACRF,SAAU,uBAGNgG,EAAmB,+BACpBnG,EAAMC,eAAa,CACtB7E,GAAI4E,EAAMiG,OAAO7K,GACjBqE,KAAMO,EAAMiG,OAAOxG,OAGrB,OACE,uBAAK4B,UAAU,aACb,gBAAC2D,EAAA,EAAG,CAAC3D,UAAU,wBACb,gBAACN,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,EAAGC,UAAU,QAC3B,gBAAC6B,EAAA,EAAO,CACNC,QAASnD,EAAMoG,cACf/E,UAAU,oBACVpB,cAAekG,EACfjG,iBAAgB,+BACXgG,GAAqB,CACxB5F,WAAY,mBAGd,gBAAC+F,EAAA,EAAgB,CACfJ,OAAQjG,EAAMiG,OACdpC,sBAAuB7D,EAAM6D,sBAC7BkC,aAAc/F,EAAM+F,aACpBO,WAAW,uBAIjB,gBAACvF,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,GACd,uBAAKC,UAAU,kCACb,uBAAKA,UAAS,qBCpFE,UDqFbkC,aAAM,EAANA,EAAQ7I,KAAI,SAAAiJ,GACX,IAAM6B,EAAkB,+BACnBW,GAAmB,CACtBV,QAAS9B,EAAMvI,GACfsK,UAAW/B,EAAMlE,OASnB,OALAkE,EAAQ,OAAH,wBACAA,GAAK,CACRsC,OAAQjG,EAAMiG,SAId,uBAAKjK,IAAK2H,EAAMvI,GAAIiG,UAAU,QAC5B,gBAACqC,EAAA,EAAS,CACRC,MAAOA,EACPC,gBAAiB5D,EAAM4D,gBACvB3D,cAAeuF,EACftF,iBAAkB,CAChBG,OAAQ,WACRF,SAAU,uBAEZwF,KAAK,KACL5B,eAAgB/D,EAAM+D,eACtB6B,mBAAiB,EACjB5B,iBAAkBhE,EAAMgE,mBAIhC,KAEF,uBAAK3C,UAAU,sBACb,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,wBACV8B,QAASnD,EAAMoG,cACfnG,cAAekG,EACfjG,iBAAgB,+BACXgG,GAAqB,CACxB5F,WAAY,aAGd,gBAAC8C,EAAA,EAAI,CAACb,UA5GJ,0BA4G0Bc,OAAO,sBAQnD,CEhIM,SAAUkD,EAAkBvG,GAChC,OACE,uBAAKqB,UAAU,SACb,gBAAC2E,EAAgB,CACfnC,sBAAuB7D,EAAM8D,UAC7BmC,OAAQjG,EAAM7E,KACdiL,cAAepG,EAAMuB,SAASiF,iBAAiBxG,EAAM7E,MACrDyI,gBAAiB5D,EAAMuB,SAASqC,gBAChC3D,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3B0D,cAAY,EACZhC,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,mBAIhC,C,qCCIM,SAAUyC,EAAoBzG,GAClC,IAZMwE,EAYAC,GAZAD,GAAc,EAAAE,EAAA,MAEJO,GACP,EAELT,EAAYvD,GACP,EAEF,EAMDyF,EAAiB,CACrBzG,cAAeD,EAAMC,cACrBC,iBAAkBF,EAAME,kBAG1B,OACE,gCACE,sBAAImB,UAAU,sBACXrB,EAAMuD,OAAOC,MAAM,EAAGiB,GAAW/J,KAAI,SAAA+I,G,MAC9BkD,IAAqBlD,EAAEmD,kBAA2B,QAAR,EAAAnD,EAAEoD,cAAM,eAAEzL,IAE1D,OACE,sBAAIY,IAAG,UAAKgE,EAAM8G,aAAY,YAAIrD,EAAErI,IAAMiG,UAAU,6BAClD,gBAAC6B,EAAA,EAAO,iBACFwD,EAAc,CAClBrF,UAAU,UACV8B,QAASnD,EAAM4D,gBAAgBH,KAE9BkD,GAAoB,gCAAE,gBAAC,IAAa,CAAChD,MAAOF,IAAK,KACjDA,EAAEhE,MAIX,KAGF,gBAACyD,EAAA,EAAO,iBACFwD,EAAc,CAClBrF,UAAU,YACV8B,QAASnD,EAAMmD,UAEf,gBAACC,EAAA,EAAI,CAACb,UAzDI,6BAyDkBc,OAAO,YAI3C,C,oECpBM,SAAU0D,EAAoB/G,G,UAU1BlF,EATF0J,GAAc,EAAAE,EAAA,KAEdsC,EAAmB,OADZC,EAAA,UAAwBzC,EAAa,MAG5C0C,KAA2C,QAA7B,EAAuB,QAAvB,EAAAlH,EAAMmH,WAAW5D,cAAM,eAAEzI,YAAI,eAAEE,QAE7CoM,EAA0BF,GAAalH,EAAMmH,WAAW5D,OAAOzI,KAAKuM,MAAK,SAAA5D,GAAI,MAAC,SAAa,QAAX,EAAAA,EAAE6D,iBAAS,eAAE5G,IAAG,IAiBhGT,GAdEnF,EAAI,+BACLkF,EAAMC,eAAa,CACtB7E,GAAI4E,EAAMmH,WAAW/L,GACrBqE,KAAMO,EAAMmH,WAAW1H,OAGrB2H,IACFtM,EAAK2K,QAAU2B,EAAwBhM,GACvCN,EAAK4K,UAAY0B,EAAwB3H,MAGpC3E,GAIHyM,EAAoC,WAAzBvH,EAAMwH,eAEvB,OACE,uBAAKnG,UAAS,kBAAa2F,EAAU,GAAK,SACxC,gBAACjG,EAAA,EAAG,iBAAKkG,EAAA,wBAAqC,CAAE5F,UAAS,6CAAwC2F,EAAU,YAAc,eACvH,uBAAK3F,UAAS,4CAAuC2F,EAAU,UAAY,cACzE,gBAACS,EAAA,EAAS,CACR3M,KAAMsM,aAAuB,EAAvBA,EAAyBE,UAC/BnE,QAASnD,EAAMmD,QACfuE,UAAW,gBACXzH,cAAeA,EACfC,iBAAgB,+BACXF,EAAME,kBAAgB,CACzBI,WAAY,kBAGd,gBAACqH,EAAA,EAAI,CAACC,KAAM5H,EAAM6H,WAClB,gBAACC,EAAA,GAAa,CAACF,KAAM5H,EAAM+H,oBAE3B,uBAAK1G,UAAS,wFChG2B,UDiGvC,gBAAC+B,EAAA,EAAI,CAACb,UAzEF,6BAyEwBc,OAAO,eAM3C,gBAACtC,EAAA,EAAG,iBAAKkG,EAAA,sBAAmC,CAAE5F,UAAW2F,EAAU,OAAS,UACxEhH,EAAMgI,UACN,gBAACC,EAAA,EAAgB,CACfC,QAASlI,EAAMmI,qBACbnI,EAAMmH,WACNnH,EAAMoI,YACNpI,EAAMwH,eACNxH,EAAME,kBAERmB,UAAU,kBACVgH,yBAAyB,sBAI7B,gBAACnF,EAAA,EAAO,CACNC,QAASnD,EAAMmD,QACflD,cAAeA,EACfC,iBAAgB,+BACXF,EAAME,kBAAgB,CACzBI,WAAY,cAGd,sBAAIe,UAAU,YAAW,wBAAMA,UAAU,WAAWrB,EAAMmH,WAAW1H,QAGtE8H,IAAavH,EAAMsI,YAClB,gBAACC,EAAA,EAAkB,KACjB,gBAACC,EAAA,EAAK,CAACZ,KAAMY,EAAA,SAAkB1N,KAAOkF,EAAMmH,WAAsBsB,SAClE,gBAACD,EAAA,EAAK,CAACZ,KAAMY,EAAA,iBAA0B1N,KAA2C,QAApC,EAAAkF,EAAMmH,WAAsBvG,gBAAQ,eAAE8H,QAIvFxB,GACC,gBAACT,EAAmB,CAClBK,aAAc9G,EAAMmH,WAAW/L,GAC/BmI,OAAQvD,EAAMmH,WAAW5D,OAAOzI,KAChCqI,QAASnD,EAAMmD,QACflD,cAAeA,EACfC,iBAAgB,+BACXF,EAAME,kBAAgB,CACzBI,WAAY,YAEdsD,gBAAiB5D,EAAM4D,mBAMnC,CE1IM,SAAU+E,EAAoB3I,GAClC,OACE,uBAAKqB,UAAS,4BAAuB,IACnC,gBAAC0F,EAAmB,CAClB9G,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3BnC,iBAAkB,CAChBG,OAAQ,cACRD,WAAY,WACZD,SAAU,uBAEZgD,QAASnD,EAAMuB,SAASuE,mBAAmB9F,EAAM7E,MACjDiN,YAAapI,EAAMoI,YACnBjB,WAAYnH,EAAM7E,KAClBqM,eAAe,WACfK,SAAUF,EAAA,WACVI,kBAAmBD,EAAA,qBACnBE,SAAUhI,EAAMgE,iBAAiBgE,SACjCpE,gBAAiB5D,EAAMuB,SAASqC,gBAChCuE,qBAAsBnI,EAAMuB,SAAS4G,uBAI7C,CC9BM,SAAUS,EAAkB5I,GAChC,OACE,uBAAKqB,UAAS,4BAAuB,IACnC,gBAAC0F,EAAmB,CAClB9G,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3BnC,iBAAkB,CAChBG,OAAQ,YACRD,WAAY,WACZD,SAAU,qBAEZgD,QAASnD,EAAMuB,SAASiF,iBAAiBxG,EAAM7E,MAC/CqM,eAAe,SACfL,WAAYnH,EAAM7E,KAClBiN,YAAapI,EAAMoI,YACnBP,SAAUF,EAAA,SACVI,kBAAmBD,EAAA,mBACnBQ,YAAU,EACVN,SAAUhI,EAAMgE,iBAAiBgE,SACjCpE,gBAAiB5D,EAAMuB,SAASqC,gBAChCuE,qBAAsBnI,EAAMuB,SAAS4G,uBAI7C,C,cCrCM,SAAUU,EAAc7I,GAC5B,OACE,gBAACe,EAAA,EAAG,CAACC,GAAG,KAAKC,GAAI,EAAGC,GAAIlB,EAAMmB,cAAgB,EAAI,EAAGC,GAAIpB,EAAMmB,cAAgB,EAAI,GACjF,uBAAKE,UAAS,+BACZ,gBAAC,KAAiB,CAChBvG,KAAMkF,EAAM7E,KACZmG,gBAAiBtB,EAAMuB,SAASuH,yBAChCrH,uBACE,WAAK,QAAC,OAA8C,QAA9C,KAAAzB,EAAMuB,UAASwH,uCAA+B,sBAAG/I,EAAM7E,KAAK,EAEpE6N,uBAAwBhJ,EAAMgJ,uBAC9B/I,cAAe,CACb0B,UAAW3B,EAAM2B,UACjBC,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmB,GAErBC,QAAStC,EAAMmB,cACf8H,iBAAkBjJ,EAAMgE,iBAAiBkF,yBAKnD,C,0BCvBM,SAAUC,EAAYnJ,GAa1B,IAXE2D,EAWIyF,GAXJzF,EAWiC3D,EAAM7E,KATnCmJ,EAAA,SAAmBX,GACd0F,EAAA,EAEL/E,EAAA,gBAA0BX,GACrB2F,EAAA,EAEF5F,EAAA,GAKT,OACE,uBAAKrC,UAAS,4BAAuB,IACnC,gBAAC+H,EAAS,CACRzF,MAAO3D,EAAM7E,KACbyI,gBAAiB5D,EAAMuB,SAASqC,gBAChC2F,2BAA4BvJ,EAAMuB,SAASgI,2BAC3C1F,sBAAuB7D,EAAM8D,UAC7B7D,cAAgB,CACd2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3B0B,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,mBAIhC,C,8tBCpBA,IA+BawF,EAAqB,QAAW,SAASxJ,G,oBAC9CwE,GAAc,EAAAE,EAAA,KACd+E,EAAoBjF,EAAYS,IAAMT,EAAYvD,GAExD,KAAkB,QAAb,EAAAjB,EAAM0J,eAAO,eAAE1O,WAAuB,QAAZ,EAAAgF,EAAM2J,cAAM,eAAEC,iBAAgC,QAAf,EAAA5J,EAAM6J,iBAAS,eAAED,cAC7E,OAAO,iCAET,IAAME,EAAqB,GAAH,SACK,QAAxB,EAAe,QAAf,EAAA9J,EAAM6J,iBAAS,eAAEH,eAAO,QAAI,IAAE,EACT,QAArB,EAAY,QAAZ,EAAA1J,EAAM2J,cAAM,eAAED,eAAO,QAAI,KAGxBK,EAAU,eACd5I,cAAe2I,EAAmB9O,OAAS,GACxCgF,GAGL,OACE,uBAAKqB,UAAU,qBACb,qBAAG2I,KAAK,SAAS3I,UAAU,mBAAkB,gBAAC+B,EAAA,EAAI,CAACb,UAlDvC,4BAkD6Dc,OAAO,kBAE7EyG,EAAmB9O,QACpB,gBAACgK,EAAA,EAAG,CAAChE,GAAG,KAAKK,UAAU,gCACpByI,EAAmBtG,MAAM,EApDR,GAoDgC9I,KAAI,SAACuP,EAAGtI,GACxD,OAAQsI,EAAErC,KAAKsC,eACb,IAAK,UACH,OACE,gBAACpJ,EAAa,eACZ9E,IAAK2F,EACLxG,KAAM8O,EACNtI,UAAWA,GACPoI,IAGV,IAAK,UACH,OACE,gBAAClB,EAAa,eACZ7M,IAAK2F,EACLxG,KAAM8O,EACNtI,UAAWA,GACPoI,IAKd,KAIU,QAAb,EAAA/J,EAAM0J,eAAO,eAAEhP,KAAI,SAACyP,EAAQC,G,QACrB/H,EAAoByH,EAAmB9O,OAASoP,EAAQ,EAAIA,EAElE,GAAI,yBAA0BD,GAAUA,EAAOE,qBAC7C,OACE,gBAAC7H,EAAkB,eACjBxG,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMV,OAAmB,QAAX,EAAAI,EAAOvC,YAAI,eAAEsC,eACnB,IAAK,cACL,IAAK,OACL,IAAK,QACH,OAAc,IAAVE,GAAeD,EAAO/H,WAAakC,EAAA,UAAoB6F,GAEvD,gBAAClG,EAAmB,eAClBjI,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMR,gBAACZ,EAAW,eACVnN,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAKV,IAAK,WACH,OAAIN,EAEA,gBAACd,EAAmB,eAClB3M,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMR,gBAAClE,EAAmB,eAClB7J,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAKV,IAAK,SAGH,OAAIN,KAAuC,QAAjB,EAFXU,EAEkBG,kBAAU,eAAElP,IAEzC,gBAACwN,EAAiB,eAChB5M,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMR,gBAACxD,EAAiB,eAChBvK,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAKd,IAGN,I,WC7LM,GAAY,0BAQZ,SAAUQ,GAAiBvK,GAC/B,OAAKA,EAAMwK,WAIT,uBAAKnJ,UAAU,QACb,qBAAGA,UAAU,WACX,gBAAC+B,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,eAAe,IAClD,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAASnD,EAAMyK,WAAWzK,EAAMwK,WAAYxK,EAAM8B,aAClD4I,eAAgB,CAAEC,SAAS,IAE1B3K,EAAMwK,aAGX,qBAAGnJ,UAAU,qBACX,gBAAC+B,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,qBACnC,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAASnD,EAAMyK,WAAWzK,EAAM8B,YAAYD,MAAO,OAAF,wBAAO7B,EAAM8B,aAAW,CAAE8I,gBAAiB,YAE3F5K,EAAM8B,YAAYD,OAErB,gBAACuB,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,kBAtBhC,gCA0BX,CCpCA,IAAM,GAAY,2BAaZ,SAAUwH,GAAkB7K,G,MAChC,OAAsB,QAAjB,EAAAA,EAAM8K,mBAAW,eAAE9P,QAItB,uBAAKqG,UAAU,kCACb,gBAAC+B,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,eAAe,IAGjDrD,EAAM8K,YAAYpQ,KAAI,SAACqQ,EAAYX,GAAK,OACvC,gBAAC,WAAc,CAACpO,IAAG,UAAK+O,EAAU,YAAIX,IACzB,IAAVA,GAAe,wBAAM/I,UAAU,QAAM,KAEtC,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAASnD,EAAMyK,WAAWM,EAAY/K,EAAM8B,aAC5C4I,eAAgB,CAAEC,SAAS,IAE1BI,GAEY,KAlBd,gCAsBX,CA7BAF,GAAkBG,aAAe,CAC/BF,YAAa,GACbhJ,YAAa,CAAC,G,kVCRV,SAAUmJ,GAAqBC,GACnC,IACMC,GAAYpH,GADS,EAAAqH,GAAA,KAAnBrH,gBACyBsH,GAAA,qBAEjC,GAGI,EAAAC,GAAA,KAFFtC,EAAsB,EAAtBA,uBACAuC,EAAsB,EAAtBA,uBAUIC,EANAL,EACKD,EAAe,CAACA,aAAY,EAAZA,EAAc9P,IAAM,KAEtC4N,aAAsB,EAAtBA,EAAwBtO,KAAI,SAAA+Q,GAAC,OAAIA,EAAErQ,EAAE,IAK9C,OAAO,mBACLmQ,GACAC,GACAE,GAAA,eAA4BF,GAEhC,C,+DC3BaG,GAAa,CACxBhI,MAAO,sBACPsC,OAAQ,oBACRpB,SACE,kHAEF+G,eAAgB,gCAAF,OAAkCC,GAAA,WAAgB,KAChEC,KAAM,qBACNC,YAAa,4BACbC,QAAS,OACTC,SAAU,8B,u+DCFZ,SAASC,GAAqB7O,G,UAYxBuM,EAAevM,EAASuM,aAEtBF,EAsBJ,QAtBc,EAAiB,QAAjB,EAAArM,aAAQ,EAARA,EAAUqM,eAAO,eAAEyC,QAAO,SAAAhC,G,oBACxC,GAAsB,WAAlBA,EAAOiC,QAAyC,aAAlBjC,EAAOiC,OACvC,OAAO,EAET,GAAsB,aAAlBjC,EAAOiC,OAAuB,CAChC,IAAMvH,EAAWsF,EAEjB,UAAwB,QAApB,EAAc,QAAd,EAAAtF,EAASwH,aAAK,eAAEvR,YAAI,eAAEE,UACK,QAA3B,EAAqB,QAArB,EAAA6J,EAASyH,oBAAY,eAAExR,YAAI,eAAEE,UACR,QAArB,EAAe,QAAf,EAAA6J,EAAStB,cAAM,eAAEzI,YAAI,eAAEE,WAG3B4O,KACO,EACR,CAED,OAAqE,KAAb,QAApD,EAA8C,QAA9C,EAACO,EAAuC5G,cAAM,eAAEzI,YAAI,eAAEE,UACxD4O,KACO,EAIX,WAAE,QAAI,GAENvM,EAASqM,QAAUA,EACnBrM,EAASuM,aAAeA,EAIxB,IAAM2C,EAA2B,QAAV,EAAA7C,EAAQ,UAAE,eAAE1H,OAEnC,OAAO,OAAP,wBACK3E,GAAQ,CACXqM,QAAS8C,GAAA,6BAA8C9C,EAAS6C,IAEpE,CAEA,SAASE,GAAgB/Q,GACvB,OAAOgR,OAAOC,QAAQjR,GAAKT,QAAO,SAAC2R,EAAM,GAAe,IAAXC,EAAW,QAAN,GAC5CC,EAAmBD,EAQvB,MANqB,WAAjB,GAAOA,GACTC,EAAmBL,GAAgBI,GAC1B,CAAE,SAAU,UAAW,UAAWE,SAAS,GAAOF,MAC3DC,EAAmBD,EAAMjO,YAGtBgO,EAAK5R,OAGH,GAAP,OAAU4R,EAAI,YAAIE,GAFTA,CAGX,GAAG,GACL,CAEO,IAAM,GAAuB,CAClCE,SAAQ,SACNnL,EACAoL,GAC4B,IAA5BC,EAAA,uDAA0B,GAEpBC,EAAaD,EAAQxS,KAAI,SAAA0S,GAAC,MAAI,CAAEA,EAAEhS,GAAIgS,aAAC,EAADA,EAAG9P,OAAQ,IACjD+P,EAAaZ,GAAgBQ,GAE7BjR,EAAM,aAAH,OAAgB6F,EAAK,YAAIsL,EAAU,YAAIE,GAM5C,EAAAJ,EAHF,YAAIK,GAAA,sBAAmC,kBAAmBC,EAAa,KACvEpC,EAAS,EAATA,UACGqC,EAAc,KAHb,uCAMA1S,EAAO,CACXoS,QAAAA,EACAO,QAASF,EACTN,QAASP,OAAOC,QAAQa,GACrBvS,QAAO,SAAC2R,EAAM,GAAF,cAAI5Q,EAAG,KAAE6Q,EAAK,YACzB,+BAAMD,GAAI,MAAG5Q,EAAI2O,QAAQ,WAAY,IAAMkC,GAAK,GAAK,CAAC,GAC1DhL,MAAAA,EACA6L,mBAAmB,EACnBvC,YAAaA,EACbwC,KAAMhC,IAGR,MAAO,CACLjL,IAAK,sBACLkN,UAAW,iBACXhG,KAAMiG,GAAA,OACN/S,KAAAA,EACAgT,WAAY,SAACzQ,GACX,IAAM0Q,EAAyB1Q,EAAS6P,QAAQ7F,MAAK,SAAA+F,GAAC,OAAIA,EAAEY,WAAaC,GAAA,sBAAiC,IAM1G,OAAIF,EACK,CACLb,QAAS,CAACa,IAIP1Q,CACT,EACArB,IAAAA,EAEJ,EAEAkS,SAAQ,SACNrM,EACAsM,GAIc,IAHdlB,EAAA,uDAAsB,CAAC,EACvBrC,IAAA,yDACAtN,EAAe,uCACfmF,EAAc,uCAEVzG,EAAM,aAAH,OAAgB6F,EAAK,YAAI+I,EAAe,YAAIuD,EAAU,YAAI7Q,GAEjEtB,GAAO0Q,OAAO0B,KAAKnB,GAASvS,KAAI,SAAA2T,GAC9B,IAAMlC,EAASc,EAAQoB,GACvB,OAAOtL,MAAMC,QAAQmJ,GAAUA,EAAOmC,KAAK,KAAOnC,CACpD,IAAGmC,KAAK,KAMJ,MAAArB,EAHF,YAAIK,GAAA,sBAAmC,2BAA4BiB,EAAuB,KAC1FpD,EAAS,EAATA,UACGqC,EAAc,KAHb,uCAaA1S,EAAO,CACX0T,WAAY,UACZf,QATcU,EAAWzT,KAAI,SAAA0P,GAC7B,MAAc,UAAVA,GAAsBmE,EAGnB,CAAEnE,MAAAA,EAAO6C,QAAS,CAAEsB,wBAAAA,IAFlB,CAAEnE,MAAAA,EAGb,IAKE6C,QAASP,OAAOC,QAAQa,GACrBvS,QAAO,SAAC2R,EAAM,GAAF,cAAI5Q,EAAG,KAAE6Q,EAAK,YACzB,+BAAMD,GAAI,MAAG5Q,EAAI2O,QAAQ,WAAY,IAAMkC,GAAK,GAAK,CAAC,GAC1DhL,MAAAA,EACA+I,gBAAAA,EACAtN,OAAQA,QAAAA,OAAUmR,EAClBtD,YAAaA,EACb1I,MAAAA,GAGF,MAAO,CACL/B,IAAK,sBACLkN,UAAW,iBACXhG,KAAMiG,GAAA,OACN/S,KAAAA,EACAkB,IAAAA,EACA8R,WAAY5B,GAEhB,EAEAtK,OAAM,SACJC,EACA4L,GAM0B,IAL1BR,EAAA,uDAAsB,CAAC,EACvBrC,IAAA,yDACAtN,EAAe,uCACfmF,EAAc,uCACdiM,EAA0C,uCAC1CC,EAA0B,uCAEtB3S,EAAM,UAAH,OAAa6F,EAAK,YAAI+I,EAAe,YAAI6C,EAAO,YAAInQ,GAE3DtB,GAAO0Q,OAAO0B,KAAKnB,GAASvS,KAAI,SAAA2T,GAC9B,IAAMlC,EAASc,EAAQoB,GACvB,OAAOtL,MAAMC,QAAQmJ,GAAUA,EAAOmC,KAAK,KAAOnC,CACpD,IAAGmC,KAAK,KAER,IAAM5O,EAASgN,OAAOkC,OAAO,CAAC,EAAG,OAAF,QAC7BxE,MAAOqD,EACPnQ,OAAQA,QAAAA,OAAUmR,EAClB5M,MAAAA,EACA+I,gBAAAA,EACAnI,MAAAA,GACGwK,IAGL,MAAO,CACLvM,IAAKmO,GAAA,aAAqB,sBAAuBnP,GACjDkO,UAAWiB,GAAA,aAAqB,cAAenP,GAC/C1D,IAAAA,EACA8R,WAAY5B,GACZwC,QAAAA,EACAC,MAAAA,EAEJ,EAEAG,uBAAsB,SACpBjN,EACA4L,GAIkB,IAHlBR,EAAA,uDAAsB,CAAC,EACvB3P,EAAe,uCACfoR,EAAqC,uCACrCC,EAAkB,uCAEZjP,EAAS,OAAH,QACV0K,MAAOqD,EACPnQ,OAAAA,EACAuE,MAAAA,GACGoL,GAGDjR,EAAM,kBAAH,OAAqB6F,EAAK,YAAI4L,EAAQa,KAAK,KAAI,YAAIhR,GAO1D,OALAtB,GAAO0Q,OAAO0B,KAAKnB,GAASvS,KAAI,SAAA2T,GAC9B,IAAMlC,EAASc,EAAQoB,GACvB,OAAOtL,MAAMC,QAAQmJ,GAAUA,EAAOmC,KAAK,KAAOnC,CACpD,IAAGmC,KAAK,KAED,CACL5N,IAAKmO,GAAA,aAAqB,+CAAgDnP,GAC1EkO,UAAWiB,GAAA,aAAqB,uCAAwCnP,GACxE1D,IAAAA,EACA0S,QAAAA,EACAC,MAAAA,EACAI,WAAW,EAEf,G,wRC9OF,IAAMC,GAAkB,CAAE,yBAA0B,wBAC9CC,GAAkB,CAAE,yBAA0B,uBAAwB,a,muBCyB5E,SAASC,K,cACD5J,EAAc,mBAAkC6J,GAAA,iBAEhDC,GAAW,UACXC,GAAW,EAAAC,EAAA,GAAY,MAEvBC,EAAoB,mBAAiCC,GAAA,wBACrDC,EAA4C,QAAtB,EAAAF,EAAkBzU,YAAI,eAAE4U,SAE9CC,EAA4BP,EAASQ,WAAWC,GAAA,aAAuBR,EAASM,0BAGhFG,EAAmB,oBACP,QAAhB,EAAAxK,EAAYxK,YAAI,eAAEiV,kBAAmBP,GAAA,kBAFY,CAAE,gBAAiB,gBAAiB,YAAa,gBAAiB,cAKjHQ,EAAiC,QAArB,EAAAF,EAAiBhV,YAAI,QAAI,GACnCmV,EAAuBD,aAAS,EAATA,EAAWE,WAAU,SAAAC,GAAC,OAAIA,EAAEvI,OAASwI,GAAA,UAA0B,IACtFC,EAAmD,QAA/B,EAAAL,EAAUC,UAAqB,eAAE7U,GAK3D,GAHKuU,IACHK,EAAY,GAAH,UAAQA,EAAUxM,MAAM,EAAGyM,IAAqB,GAAKD,EAAUxM,MAAMyM,EAAuB,MAEnGR,EAAqB,CACvB,IAAMa,EAAkBN,aAAS,EAATA,EAAWE,WAAU,SAAAC,GAAC,OAAIA,EAAE/U,GAAGwD,aAAe6Q,EAAoB7Q,UAAU,IACpGoR,EAAY,GAAH,UAAQA,EAAUxM,MAAM,EAAG8M,IAAgB,GAAKN,EAAUxM,MAAM8M,EAAkB,IAC5F,CAOD,MAAO,CACLC,sBALAhB,EAAkBhT,iBACA,QAAhB,EAAA+I,EAAYxK,YAAI,eAAEiV,kBAAmBD,EAAiBvT,cAKxDyT,UAAAA,EACAK,kBAAAA,EACAZ,oBAAAA,EACAE,0BAAAA,EAEJ,CAEA,SAASa,K,QACDlL,EAAc,mBAAkC6J,GAAA,iBAChDsB,EAAU,mBAA+BC,GAAA,UAAuC,QAAhB,EAAApL,EAAYxK,YAAI,eAAE6V,cAExF,GAEI,EAAArF,GAAA,KADFsF,EAAkB,EAAlBA,mBAAoB5H,EAAsB,EAAtBA,uBAAwB6H,EAAuB,EAAvBA,wBAAyBtF,EAAsB,EAAtBA,uBAGjEuF,EAAsBF,GAAsBC,IAElD,OAAKtF,GAGDvC,aAAsB,EAAtBA,EAAwBhO,QAAS,IAAM8V,GAGrBC,GAAA,6BAAwCD,EAAoBE,iBAC5DC,GAAA,UAHbR,EAMF,OAAP,wBACKA,GAAO,CACV3V,KAAkB,QAAZ,EAAA2V,EAAQ3V,YAAI,eAAEqR,QAAO,SAAA1D,GAEzB,OAAOA,EAAOyI,MAAQzI,EAAOoE,MAAQ,EACvC,MAdO4D,CAgBX,CAMM,SAAUU,GACdrP,G,gBAEMwD,EAAc,mBAAkC6J,GAAA,iBAChDiC,EAAc,oBAA2C,QAAhB,EAAA9L,EAAYxK,YAAI,eAAEM,KAAM+T,GAAA,OAAkB7J,EAAYxK,KAAKM,KACpGiW,EAAS,mBAA6BC,GAAA,YACtCC,EAAa,oBACD,QAAhB,EAAAjM,EAAYxK,YAAI,eAAEiV,kBAAmByB,GAAA,aAA4BlM,EAAYxK,KAAK2W,aAE9ErC,GAAW,UACXC,GAAW,EAAAC,EAAA,GAAY,MAE7B,EAMIJ,KALFqB,EAAqB,EAArBA,sBACAP,EAAS,EAATA,UACAK,EAAiB,EAAjBA,kBACAZ,EAAmB,EAAnBA,oBACAE,EAAyB,EAAzBA,0BAGF,GAEI,EAAArE,GAAA,KADFsF,EAAkB,EAAlBA,mBAAoB5H,EAAsB,EAAtBA,uBAAwB6H,EAAuB,EAAvBA,wBAAyBtF,EAAsB,EAAtBA,uBAGjEuF,EAAsBF,GAAsBC,IAC5Ca,EAAwBZ,aAAmB,EAAnBA,EAAqB1V,GAE7CuW,GAAc,EAAAC,GAAA,KAEd9N,GAAY,EAAA+N,GAAA,KAEZC,EAAe7G,GAAqB6F,GACpCiB,EAAgD,QAA/B,EAAiB,QAAjB,EAAAD,EAAahX,YAAI,eAAEgX,oBAAY,eAAEpX,KAAI,SAAA+Q,GAAC,OAAIA,EAAErQ,EAAE,IAC/D4W,EAAkB,oBAAmCF,aAAY,EAAZA,EAAchX,OACvEmX,GAAA,sCAA2DF,IAEvDtB,EAAUD,KAEhB,GAAgD,EAAApF,GAAA,KAAxCrH,EAAc,EAAdA,eAAgBmO,EAAmB,EAAnBA,oBAElB/G,EAAYpH,EAAesH,GAAA,qBAC3B8G,EAAsBD,EAAoB,uBAC1CE,EAAqBrO,EAAesH,GAAA,iBACpCgH,EAAiBtO,EAAesH,GAAA,gBAEhC1B,ED7IF,SACJ7H,GAIkB,I,EAHlB2O,EAAA,uDAAoB,GACpB6B,EAAsB,uCACtBtJ,EAAsC,uCACtCuJ,EAAkB,uCAEZC,GAAa/B,aAAO,EAAPA,EAASzV,SAAUyX,GAAA,4BACpC3Q,EACA2O,EACA,CAAC6B,GACDC,EACA,IAGItF,EAAU,UAAkBuF,EAAYD,EAAYtD,GAAkBD,IAC5E/B,EAAQ,8BAAgCyF,GAAA,UACxCzF,EAAQ,kBAAoB0F,GAAA,aAExB7Q,aAAW,EAAXA,EAAa8Q,eACf3F,EAAQ,uBAAyB4F,GAAA,iBAE/B7J,EAAuBhO,SACzBiS,EAAQ,wBAA0BjE,EAAuBtO,KAAI,SAAAwQ,GAAY,OAAIA,EAAa9P,EAAE,KAG9F,IAAM0X,EAGA,QAHkB,EAAA9J,aAAsB,EAAtBA,EAAwB/N,QAAO,SAACC,EAAiBgQ,GAEvE,OADAhQ,EAAIgQ,EAAa9P,IAAM8P,EAChBhQ,CACT,GAAG,CAAC,UAAE,QAAI,CAAC,EAIL6X,GAFUN,GAAA,qBAA+B3Q,GAETiL,SAAS,kBAEzCxP,EAAU,UACd,cAAsBuE,GACtB,CAAC,kBACDmL,EACgC,UAAhCnL,EAAY8I,iBAGRoI,GAAeD,EAEf1V,EAAW,mBAAyC2V,GAAezV,GAEzE,IAAKyV,EACH,OAAO,KAET,IAAK3V,EAASvC,KACZ,OAAOuC,EAET,IAAK2L,IAA0BA,aAAsB,EAAtBA,EAAwBhO,QAAS,EAC9D,OAAOqC,EAET,I,EAOM4V,G,EAPc5V,EAASvC,KAAK4O,Q,umBAOJrK,MAAK,SAAC6T,EAAGC,GAErC,GAAID,EAAElR,SAAWmR,EAAEnR,OACjB,OAAO,EAET,IAAMoR,EAAgBN,EAAgBI,EAAEZ,gBAClCe,EAAgBP,EAAgBK,EAAEb,gBAExC,OAAKc,EAGAC,EAIED,EAAcvG,MAAQwG,EAAcxG,OAHjC,EAHD,CAOX,IAEA,OAAO,OAAP,wBACKxP,GAAQ,CACXvC,KAAM,OAAF,wBACCuC,EAASvC,MAAI,CAChB4O,QAASuJ,KAGf,CCsDiBK,CACbxR,EACA2O,EAAQ3V,KACR4W,EACA1I,EACAmC,GAGItB,EC5JF,SACJ/H,GAGuB,IAFvB2O,EAAA,uDAAoB,GAEpB4B,EAAuB,uCAEjBkB,GAHgC,wCAGkB7Y,KAAI,SAAA8Y,GAAC,OAAIA,EAAEpY,EAAE,IAU/D6R,GARawD,aAAO,EAAPA,EAASzV,SAAUyX,GAAA,4BACpC3Q,EACA2O,EACA8C,GACA,EACA,KAG4B,CAAC,GAM3BA,aAAwB,EAAxBA,EAA0BvY,UAC5BiS,EAAQ,wBAA0BsG,GAEpC,I,EAEME,GAFUhB,GAAA,qBAA+B3Q,GAENiL,SAAS,WAE5CxP,EAAU,UACd,cAAsBuE,GACtB,CAAC,WACDmL,EACgC,UAAhCnL,EAAY8I,iBAGRoI,GAAeS,GAA2BpB,EAE1ChV,EAAW,mBAA2C2V,GAAezV,GAE3E,OAAKyV,EAGA3V,EAASvC,KAGP,OAAP,wBACKuC,GAAQ,CACXvC,KAAM,OAAF,wBACCuC,EAASvC,MAAI,CAChB4O,S,EAAarM,EAASvC,KAAK4O,Q,2mBANtBrM,EAHA,IAYX,CDuGoBqW,CAChB5R,EACA2O,EAAQ3V,KACRkO,EACAqJ,GAuBF,MAAO,CACLvQ,YAAAA,EACAwD,YAAAA,EACA8L,YAAAA,EACAC,OAAAA,EACAE,WAAAA,EACAnC,SAAAA,EACAC,SAAAA,EACAsC,YAAAA,EACA7N,UAAAA,EACAgO,aAAAA,EACAhB,oBAAAA,EACA9H,uBAAAA,EACAgJ,gBAAAA,EACAvB,QAAAA,EACA9G,OAAAA,EACAE,UAAAA,EACA8J,sBAnCE,QAAyB,CAC3BC,WAAY,kBACZ9R,YAAAA,IAHA+R,UAqCAnC,sBAAAA,EACAvG,UAAAA,EACAgH,oBAAAA,EACAnC,UAAAA,EACA8D,cAlCAhQ,EAAUvH,cACVgP,GACAjG,EAAY/I,iBACM,QAAhB,EAAA+I,EAAYxK,YAAI,eAAEiV,kBAAmBqB,EAAY7U,eACnDkU,EAAQlU,cACR8U,EAAO9U,cACPyM,MACkB,QAAhB,EAAA1D,EAAYxK,YAAI,eAAEiV,mBAAoBX,EAAS2E,qBAChD1E,EAAS2E,mBACVzD,EA0BAF,kBAAAA,EACAZ,oBAAAA,EACAE,0BAAAA,EACA5L,eAAAA,EACAmO,oBAAAA,EACAE,mBAAAA,EACAC,eAAAA,EAEJ,C,sfE9MO,IAAM,GAAY,eAYnB,SAAU4B,GAAoBlX,G,gBAC1B+E,EAAgD/E,EAAhD+E,YAAaoS,EAAmCnX,EAAnCmX,eAAgBC,EAAmBpX,EAAnBoX,eAE/BC,GAAS,UACTC,EAAQ,mBAERC,EAAwB,oBAAuD,QAAlB,EAAAC,WAAkB,eAAEvY,KACjFwY,EAWN,SAA0BrV,G,UACxB,QAAKA,IAGG,QADD,EAAyE,QAAzE,EAAsB,QAAtB,EAAApC,EAAQoX,sBAAc,yBAAM7G,GAAA,sBAAmC,mBAAU,eAC5EmH,YAAI,uBAAG,SAACtE,GAAS,OAAKA,EAAEvR,aAAeO,CAAS,IACtD,CAhBiCuV,CAA0C,QAAzB,EAAA3X,EAAQsT,yBAAiB,eAAEzR,YACvE+V,EACJ5X,EAAQ+W,gBACRI,aAAc,EAAdA,EAAgBlZ,SAChB+B,EAAQ4S,4BACP6E,EAEGI,EAA6B,mBACjCD,GAWO,YACL7S,EAAYD,MACZqS,EACAC,EACgC,UAAhCrS,EAAY8I,gBACZ,KACA,KAIJ,SAAS2J,EAAiBjX,GACxB,GAAKP,EAAQ+W,gBAAkBI,aAAc,EAAdA,EAAgBlZ,QAA/C,CAEA,IAAImZ,EAAiB,OAAH,UAAQpX,EAAQoX,gBAElC,GAAIpX,EAAQ4S,4BAA8B6E,EAA0B,CAClE,IAAMK,EAAuB,GAAH,OAAMvH,GAAA,sBAAmC,2BACnE6G,EAAiB,OAAH,wBACTA,G,8YAAc,IAChBU,EAAoB,U,gDAAQV,EAAeU,K,ojBAAqB,CAAE9X,EAAQsT,qBAE9E,CAED,OAAO,YACLvO,EAAYD,MACZqS,EACAC,EACgC,UAAhCrS,EAAY8I,gBACZtN,EAjB2D,C,KAmB/D,CAEA,SAASZ,EAAUY,GACjB+W,EAAME,EAAiBjX,GACzB,CASA,IAAMwX,GAAgB,QACpBP,EACA7X,GATF,SAAiBqY,EAAoBC,GACnC,GAAmB,IAAfD,EACF,OAAO,QAAgBC,GAEzBZ,EAAOzF,MAAMsG,EAAA,YAA0B,GAAW,SACpD,IAME,SAAAna,GAAI,OAAIA,EAAK4O,OAAO,IAUhBnG,EAA4B,QAAnB,EAAAuR,EAAc/Z,aAAK,eAAEoR,QAAO,SAAA9P,GAAC,MAAiB,UAAbA,EAAE+P,QAAmC,SAAb/P,EAAE+P,MAAiB,KAC3F,EAAA8I,GAAA,GAAc3R,GAEd,IAAMxI,ECnGF,SAAkCgC,G,MACtC,OAAO,WAAc,W,QACnB,KAA0B,QAArB,EAAAA,EAAQ+X,qBAAa,eAAE9Z,WAA6C,QAAlC,EAAA+B,EAAQ6X,kCAA0B,eAAE5Z,SAAmC,cAAzB+B,EAAQoY,aAC3F,OAAOpY,EAAQ+X,cAEjB,IAEIM,EACAC,E,EAHEC,E,gDAAsDvY,EAAQ+X,gB,ojBAC9DS,EAAgD,GAGlDC,GAAc,EAElBzY,EAAQ6X,2BAA2B7Y,SAAQ,SAACZ,EAAMiP,G,UAChD,GAA+B,IAA3BmL,EAAgBva,OAApB,CAMA,GAJwBsJ,EAAA,UAAoBnJ,IACV,KAAb,QAAnB,EAAAA,EAAK6U,UAAUlV,YAAI,eAAEE,UACG,QAAxB,EAAmB,QAAnB,EAAAG,EAAK6U,UAAUlV,YAAI,eAAG,UAAE,eAAE2a,UAAWC,GAAA,qBAarC,YAVsBjH,IAAlB2G,IACFA,EAAgBhL,EAChBiL,EAAoB,EACpBG,GAAc,GAGZA,GACFH,SAEFE,EAAgBpZ,KAAKhB,GAIvBqa,GAAc,CApB0B,CAqB1C,IAEA,IAAMG,EAA8D,CAClEva,GAAI,KACJwM,KAAM,KACNnI,KAAM,KACN8D,OAAQgS,EACR7S,UAA6B,IAAlB0S,EAAsB,EAAIC,EACrChL,sBAAsB,EACtB+B,OAAQ,MAMV,MAH6B,UAAzBrP,EAAQoY,cAA4BI,EAAgBva,QACtDsa,EAAqBM,OAAOR,EAAe,EAAGO,GAEzCL,CACT,GAAG,CACDvY,EAAQuX,sBACa,QAArB,EAAAvX,EAAQ+X,qBAAa,eAAE9Z,OACvB+B,EAAQ6X,2BACR7X,EAAQoY,cAEZ,CD4CgBU,CAAwB,CACpCf,cAAeA,EAAc/Z,MAC7B6Z,2BAA2D,QAA/B,EAAAA,EAA2B9Z,YAAI,eAAE4O,QAC7D4K,sBAAuBA,EAAsBxZ,KAC7Cqa,aAbKpY,EAAQ4S,0BAGN6E,EAA2B,YAAc,QAFvC,SAeX,OAAO,OAAP,wBACKM,GAAa,CAChB9V,sBAAuB8V,EAAc9V,wBAA0BjC,EAAQ+W,iBAAkBI,aAAc,EAAdA,EAAgBlZ,QACzGD,MAAAA,EACA2B,UAAAA,EACAoZ,gBAA2C,QAA1B,EAAAxB,EAAsBxZ,YAAI,eAAEgb,gBAC7ChL,YAAuC,QAA1B,EAAAwJ,EAAsBxZ,YAAI,eAAEgQ,aAE7C,CE/G+B,GAAD,OACzBwC,GAAA,sBAAmC,kB,kICjBlC,SAAUyI,GAAcxZ,GAC5B,I,IAAoF,G,GAAlD,QAAa,uBAAgC,G,EAAK,E,s4BAA5EyZ,EAAQ,KAAEC,EAAW,KAE7B,aAAgB,WACdD,GAAYzZ,GAAgB0Z,GAAY,EAC1C,GAAG,CAAC1Z,GACN,C,4BCFM,GAAY,iCAOZ,SAAU2Z,GAAwBlW,G,QAChCmW,EAAYnW,EAAMoW,UAAmD,YAApB,QAAnB,EAAW,QAAX,EAAApW,EAAM6B,aAAK,eAAEwU,cAAM,eAAEnM,eACrDoM,GAAA,sCACAA,GAAA,6BAEJ,OACE,gBAAC,aAAiC,CAACzJ,MAAO,IACxC,gBAAC0J,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACC,IAAKL,IAEvB,gBAACI,GAAA,UAAkB,KAChBvW,EAAM6B,MACH,gBAACuB,EAAA,EAAI,CAACC,OAAO,mBAAmBtG,QAAS,CAAE8E,MAAO7B,EAAM6B,SACxD,gBAACuB,EAAA,EAAI,CAACC,OAAO,yBAInB,gBAACkT,GAAA,OAAe,KACd,gBAACnT,EAAA,EAAI,CAACC,OAAO,SACb,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAAS,CAAE7D,YAAa,aAAqBC,OAAQ,oCAErD,gBAAC6D,EAAA,EAAI,CAACC,OAAO,qBAMzB,CCjBO,IACDoT,GAAYxB,EAAA,mBADO,wBAOnB,SAAUyB,GAAkB1W,G,wBHtBWjD,EGuB3C,EAA6BiD,EAArB8B,YAAAA,OAAW,IAAG,GAAC,EAAC,EAElB6U,GAAe,EAAAC,GAAA,GAAgB,CAAEzW,SAAU,iBACzC6D,GAAqB,EAAA6S,GAAA,GAAoB,CAC/CC,gBAAiB,oBACjBC,IAAKjV,EAAY8Q,cAFX5O,iBAKFgT,EAAa7F,GAAmBrP,GAEhCmV,EAAgB,uBAA+BD,GAE/CE,KAAeD,aAAa,EAAbA,EAAe/C,eAAelZ,QAC7C8T,GHpCqC/R,EGoCiBma,GAAcD,EHnCnE,mBAA+Bla,GAAW,0BAC/CA,EAAQ+E,YAAYD,MACpB9E,EAAQmX,eACRnX,EAAQoX,kBGiCJW,EAAgBb,GAAoB,OAAD,wBAAMgD,GAAkBD,IAE3D/J,EAAU,gBAAwB,CACtCnS,KAAMkc,EACNG,oBAAqBF,aAAa,EAAbA,EAAeE,oBACpCrI,uBAAwBoI,GAAcpI,KAGxC,EAAAsI,GAAA,GAAmBC,GAAA,sBAAsC,CACvDC,MAAwB,QAAjB,EAAAxV,EAAYD,aAAK,QAAI,GAC5B0V,cAAe,CACbC,cAAef,GACfgB,YAAa,YACbC,kBAAmB,mBAErBC,eAAe,KAMjB,IAAMC,EACJZ,EAAWlD,eAAiB7G,EAMxB4K,EACJ/C,EAAc9V,yBAEZgY,EAAWrN,QAAUqN,EAAWrN,OAAOpN,iBACvCya,EAAWnN,WAAamN,EAAWnN,UAAUtN,iBAC7C2a,GAAcpI,EAAuBvS,iBACrC0Q,EAME6K,GACe,QAAnB,EAAAhD,EAAc/Z,aAAK,eAAEC,UACE,QAAvB,EAAiB,QAAjB,EAAAgc,EAAWrN,cAAM,eAAE7O,YAAI,eAAE8O,gBACC,QAA1B,EAAoB,QAApB,EAAAoN,EAAWnN,iBAAS,eAAE/O,YAAI,eAAE8O,cAK9B,OAFAmM,GAAc8B,GAETD,EAIH,uBAAKvW,UAAU,QACb,gBAACkJ,GAAgB,CACfC,WAAYsK,EAAcgB,gBAC1BhU,YAAaA,EACb2I,WAAY,yBAGZqK,EAAcgB,iBACd,gBAACjL,GAAiB,CAChBC,YAAagK,EAAchK,YAC3BhJ,YAAaA,EACb2I,WAAY,0BAIZuM,EAAWlT,UAAUhJ,QAAUkc,EAAWvG,QAAQ3V,QAAUkc,EAAWhF,gBAAgBlX,MACzF,gBAACid,EAAA,EAAa,CACZjW,YAAaA,EACbkW,YAAa/K,aAAO,EAAPA,EAAS+K,YACtBC,YAAahL,aAAO,EAAPA,EAASgL,YACtB/X,iBAAkB,CAChBG,OAAQ,mBACRF,SAAU,oBAEZgD,QAAS,CAAE7D,YAAa,YAAoBC,OAAQ,kBACpD2Y,kBAAmBpJ,EAAuBzT,aAI7Cwc,GACC,+BACGC,EAEG,gBAACK,GAAA,WAA4B,CAACtL,MAAO8J,GACnC,gBAACnN,EAAkB,CACjB1H,YAAaA,EACb4H,QAASoL,EAAc/Z,MACvB4O,OAAyB,QAAjB,EAAAqN,EAAWrN,cAAM,eAAE7O,KAC3B+O,UAA+B,QAApB,EAAAmN,EAAWnN,iBAAS,eAAE/O,KACjCgJ,WAAYhC,EAAY8Q,aAAeoE,EAAWlT,UAAUhJ,KAC5DwK,YAAa0R,EAAW1R,YAAYxK,KACpCkO,uBAAwBgO,EAAWhO,uBACnCZ,aAAe4O,EAAW7L,WAAa6L,EAAW7E,oBAClDpO,eAAgBiT,EAAWjT,eAC3BxC,SAAU,iBACRyV,EAAWlG,oBACXkG,EAAWhO,uBACiB,SAA5BlH,EAAY8Q,aAEd5O,iBAAkBA,KAItB,gBAACkS,GAAuB,CACtBrU,MAAOC,EAAYD,MACnBuU,YAAuD,QAA3C,EAA8B,QAA9B,EAAAY,EAAWlG,2BAAmB,eAAEsH,mBAAW,eAAElO,cAAc6C,SAAS,gBAKpF+H,EAAcnX,SAAWmX,EAAczZ,aACvC,gBAACgd,GAAA,EAAoB,CACnBhd,WAAYyZ,EAAczZ,WAC1BqB,UAAWoY,EAAcpY,UACzBgB,WAAYoX,EAAcpX,WAC1B4a,eAAa,MApEhB,gCA2EX,C,8qBCvKA,IACM,GAAYrD,EAAA,mBADA,8BA0BZ,SAAUsD,GAAoBvY,GAClC,IAnBuBgO,EAAwBwK,EAAmB,EAmB5DnV,GAnBiB2K,EAmBQhO,EAAMgO,SAnBUwK,EAmBAxY,EAAMwY,YAlBzB,mCACzBvK,GAAA,uBAAoC,yBACpCA,GAAA,kBAA+B,6BAC/BA,GAAA,mBAAgC,qBAChCA,GAAA,eAA4B,iBAC5BA,GAAA,kBAA+B,oBAC/BA,GAAA,uBAAoC,0BACpCA,GAAA,8BAA2CuK,EAAa,iCAAmC,0BAC3FvK,GAAA,iBAA8B,mBAC9BA,GAAA,8BAA2CuK,EAAa,gCAAkC,yBAC1FvK,GAAA,wBAAqC,0BAAwB,KAC7DA,GAAA,uBAAoC,0BAGTD,IAM9B,OAAK3K,EAIH,gBAACoV,GAAA,EAAY,CACXpX,UAAS,+BACTqX,QAAS,WACTpB,MAAO,GAAUjU,GACjBsV,iBAAiB,MACjBC,iBAAe,EACfC,yBAAyB,SATpB,gCAYX,CCjDA,UAAgB,8BAAgC,SCkBhD,IAAM,GAAY,kCAElB,SAASC,GAAQC,EAA0BP,GACzC,OAAIO,EAAO/K,WAAaC,GAAA,8BACfuK,EAAavD,EAAA,YAA0B,GAAW,yBAA2B8D,EAAOtZ,KAEzFsZ,EAAO/K,WAAaC,GAAA,+BACfuK,EAAavD,EAAA,YAA0B,GAAW,+BAEpD8D,EAAOtZ,IAChB,CAEA,SAASuZ,GAAkBD,GACzB,OAAIA,EAAO/K,WAAaC,GAAA,uBACf,CACLgL,mBAAoBF,EAAOG,QAAQzZ,KACnC0Z,0BAA2BJ,EAAOG,QAAQd,aAIvC,CAAC,CACV,CAmBM,SAAUgB,GAAyBpZ,GACvC,OAAKA,EAAMlF,MAASkF,EAAMlF,KAAKE,OAI7B,uBAAKqG,UAAW,kCACbrB,EAAMlF,KAAKJ,KAAI,SAACqe,EAAQM,GACvB,OACE,gBAACC,GAAA,EAAmB,CAClBC,iBAAkB,aAElBvd,IAAKqd,EACLG,YAAaH,EACbje,GAAIie,EAAIza,WAERa,KAAMqZ,GAAQC,EAAQ/Y,EAAMwY,YAC5BU,QAASH,EAAOG,QAAQpe,KACxB2e,WAAYV,EAAOU,WACnBC,aAAcX,EAAO/K,SAErBlK,UAAW9D,EAAM8D,UACjBwB,YAAatF,EAAMsF,YACnB/D,SAAUvB,EAAM2Z,eAChB3Q,uBAAwBhJ,EAAMgJ,uBAC9BjF,eAAgB/D,EAAM+D,eACtB6V,YAAa5Z,EAAM6Z,eAAed,GAClC/U,iBAAkBhE,EAAMgE,iBACxB8V,iBAAkB,SAAAC,GAAM,OAAI/Z,EAAM8Z,iBAAiBf,EAAQM,EAAKU,EAAO,EACvEC,eACE,gBAACzB,GAAmB,CAClBvK,SAAU+K,EAAO/K,SACjBwK,WAAYxY,EAAMwY,aAGtByB,iBAAkBja,EAAMia,iBAExB7B,YAAa,KACbxX,SAAUoY,GAAkBD,GAC5BmB,cAAc,EACd7K,SAAU,KACV8K,kBAAmB,MAGzB,KAzCK,gCA4CX,C,gHCjGM,SAAUC,KACd,OACE,uBAAK/Y,UAAU,iCACb,uBAAKA,UAAU,sCACb,gBAACgZ,GAAA,EAAmC,OAEtC,2BACE,gBAAC,KAAwC,CAACC,iBAAe,KAE3D,2BACE,gBAACC,GAAA,EAAmB,CAACD,iBAAe,IACpC,gBAACE,GAAA,EAA0C,OAE7C,gBAACC,GAAA,EAAiD,CAACH,iBAAe,IAClE,2BACE,gBAACC,GAAA,EAAmB,CAACD,iBAAe,IACpC,gBAACE,GAAA,EAA0C,OAInD,C,gBCnBM,GAAY,mCAOZ,SAAUE,GAA0B1a,GACxC,MAAiDA,EAAzC2a,8BAAAA,OAA6B,IAAG,GAAI,EAE5C,OACE,uBAAKtZ,UAAU,2EACZrB,EAAMoY,YACH,4BAAOpY,EAAMoY,aACb,gBAAChV,EAAA,EAAI,CAACC,OAAO,cAAcd,UAAW,KAE1C,gBAACW,EAAA,EAAO,CACNC,QAAS,CACP7D,YAAa,aACbC,OAAQ,2BACRG,OAAQ,CACNkb,eAAgB3b,GAAA,gBAChB0b,gCAAiCA,IAGrCtZ,UAAU,wBAEV,gBAAC+B,EAAA,EAAI,CAACC,OAAO,eAAed,UAAW,MAI/C,CC1BA,IAAM,GAAY,mCACZ,GAAY0S,EAAA,mBAAiC,IAQ7C,SAAU,GAAwBjV,G,QAChCmW,EAAYnW,EAAMoW,UAAmD,YAApB,QAAnB,EAAW,QAAX,EAAApW,EAAM6B,aAAK,eAAEwU,cAAM,eAAEnM,eACrDoM,GAAA,sCACAA,GAAA,6BAEJ,OACE,gBAAC,aAAiC,CAACzJ,MAAO,IACxC,gBAAC0J,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACC,IAAKL,IAEvB,gBAACI,GAAA,UAAkB,KAChBvW,EAAM6B,MACH,gBAACuB,EAAA,EAAI,CAACC,OAAO,mBAAmBtG,QAAS,CAAE8E,MAAO7B,EAAM6B,SACxD,gBAACuB,EAAA,EAAI,CAACC,OAAO,yBAInB,gBAACkT,GAAA,OAAe,CAAClV,UAAU,YACzB,gBAAC+B,EAAA,EAAI,CAACC,OAAO,SACb,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAAS,CAAE7D,YAAa,aAAqBC,OAAQ,oCAErD,gBAAC6D,EAAA,EAAI,CAACC,OAAO,sBAKjBrD,EAAM6a,kBACN,gBAACH,GAAyB,CAACtC,YAAa,GAAU,sBAI1D,C,gBC1CM0C,GAA+C,CACnD7M,GAAA,uBACAA,GAAA,kBACAA,GAAA,kBACAA,GAAA,eACAA,GAAA,mBACAA,GAAA,iBACAA,GAAA,uBACAA,GAAA,8BACAA,GAAA,8BACAA,GAAA,wBACAA,GAAA,uBACAA,GAAA,wBAGF,SAAS8M,GAAche,G,MACfie,EAAiC,QAAnB,EAAAje,EAAQ+E,mBAAW,eAAG/E,EAAQf,KAElD,MAA2B,iBAAhBgf,EACFA,IAAgBje,EAAQ8P,QAG5B9J,MAAMC,QAAQgY,IAIZA,EAAYjO,SAAShQ,EAAQ8P,MACtC,CAgHO,IAAMoO,GAA4B,CACvCC,mBAAkB,SAAClN,EAAwBlM,GACzC,IAAMkZ,EAAclZ,aAAW,EAAXA,EAAqB,MAEzC,MAA2B,iBAAhBkZ,EACFA,EAAY9Q,gBAAkB8D,EAAS9D,gBAE3CnH,MAAMC,QAAQgY,IAGQ,IAAvBA,EAAYhgB,UAGPggB,EAAY3T,MAAK,SAAAmM,GAAC,OAAIA,EAAEtJ,gBAAkB8D,EAAS9D,aAAa,GAC3E,EAEAiR,uBAAsB,SACpBrZ,EACAxE,GAEA,IAAM8d,EA1HV,SAA0B9d,GACxB,GAAKA,GAAWA,EAAOtC,OAAvB,CAGA,IAAIqgB,EACJ,IACE,IAAMC,EAAwBC,KAAKC,MAAMle,GAEzC,IAAKge,EAAOhe,SAAWge,EAAO5B,aAC5B,OAEF,IAAKoB,GAA6B/N,SAASuO,EAAO5B,cAChD,OAEF2B,EAAUC,C,CACV,SACA,MACD,CAED,OAAOD,CAjBC,CAkBV,CAsG0BI,CAAiBne,GAOvC,OAAI8d,EACK,CAAC,CACNhgB,GAAIggB,EAAc1B,aAClBpc,OAAQ8d,EAAc9d,SA/F9B,SAAqCwE,GACnC,IAAMoL,EAA0B,GAE1BwO,EAlBR,SAA+B5Z,GAC7B,GAAKA,aAAW,EAAXA,EAAa6Z,MAGlB,MAAiC,iBAAtB7Z,EAAY6Z,MACdb,GAA6BzT,MAAK,SAAA+F,GAAC,OAAIA,IAAMtL,EAAY6Z,KAAK,IAGnE5Y,MAAMC,QAAQlB,EAAY6Z,QAAuC,IAA7B7Z,EAAY6Z,MAAM3gB,OACjD8f,GAA6BzT,MAAK,SAAA+F,GAAC,OAAIA,IAAMtL,EAAY6Z,MAAM,EAAE,SAD1E,CAKF,CAKwBC,CAAsB9Z,GAE5C,OAAI4Z,EACK,CAAEA,EAAezN,GAAA,eAGtB8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,oBAAkC/K,YAAAA,KACxEoL,EAAQ/Q,KAAK8R,GAAA,wBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,aAA2B/K,YAAAA,KACjEoL,EAAQ/Q,KAAK8R,GAAA,mBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,YAA0B/K,YAAAA,KAChEoL,EAAQ/Q,KAAK8R,GAAA,gBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,cAA4B/K,YAAAA,KAClEoL,EAAQ/Q,KAAK8R,GAAA,mBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,cAA4B/K,YAAAA,KAClEoL,EAAQ/Q,KAAK8R,GAAA,8BAA0CA,GAAA,wBAGrD8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,qBAAqC/K,YAAAA,KAC7EoL,EAAQ/Q,KAAK8R,GAAA,yBAGX8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,cAA8B/K,YAAAA,KACtEoL,EAAQ/Q,KAAK8R,GAAA,iBAA6BA,GAAA,wBAGxC8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,eAA+B/K,YAAAA,KACvEoL,EAAQ/Q,KAAK8R,GAAA,mBAA+BA,GAAA,wBAG1C8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,YAA4B/K,YAAAA,KACpEoL,EAAQ/Q,KAAK8R,GAAA,8BAA0CA,GAAA,gCAGrD8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,WAAyB/K,YAAAA,KAC7DiZ,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,UAAwB/K,YAAAA,KAC5DiZ,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,iBAA+B/K,YAAAA,MACrEoL,EAAQ/Q,KACN8R,GAAA,mBACAA,GAAA,uBACAA,GAAA,8BACAA,GAAA,iBACAA,GAAA,wBACAA,GAAA,wBAIAf,EAAQlS,QACVkS,EAAQ/Q,KAAK8R,GAAA,cAGR4N,GAAA,OAAiB3O,GAC1B,CAuCoC4O,CAA4Bha,GAE7CpH,KAAI,SAAA0S,GAAC,MAAK,CAAEhS,GAAIgS,EAAG,GACpC,EAEA2O,+BAA8B,SAACja,GAC7B,MAAgD,iBAArCA,aAAW,EAAXA,EAAaka,qBACf,CAAC,CAAE5gB,GAAI0G,EAAYka,oBAAqBvc,KAAMqC,EAAYka,sBAE/DjZ,MAAMC,QAAQlB,aAAW,EAAXA,EAAaka,qBACtBla,EAAYka,oBAAoBthB,KAAI,SAACuhB,GAAW,MAAM,CAC3D7gB,GAAI6gB,EACJxc,KAAMwc,EACP,IAEI,EACT,EAEAC,6BAA4B,SAACpa,EAAyB4X,GACpD,OAAIA,IAAiBzL,GAAA,aACZ,GAEFgN,GAA0Bc,+BAA+Bja,EAClE,G,YCjNI,SAAUqa,GAAkBC,GAChC,IAAMC,EAAa,WAAc,kBAAM,IAAI,KAAe,GAAE,IAuB5D,OArBA,aAAgB,WACTD,GAAoBA,EAAgBphB,QAGzCohB,EAAgBrgB,SAAQ,SAAAugB,GAAE,OAAID,EAAWE,QAAQD,EAAG,GACtD,GAAG,IAgBI,CACLngB,KAfF,SAAcmgB,GACPD,GAGLA,EAAWE,QAAQD,EACrB,EAWEE,QATF,SAAiBzf,GACf,GAAKsf,EAGL,OAAOA,EAAWI,OAAO1f,EAC3B,EAMF,C,42CCrBM,SAAU2f,GAAmB3f,GACjC,IAAQjC,EAASiC,EAATjC,KAER,IAAKA,EAAM,OAAOiC,EAQlB,IANA,IAAMhC,EAAQ,GAAID,GAEZ6hB,EAAiBd,GAAA,UAAoB9gB,EAAO,YAE5C6hB,EAAoC,GAE1C,MAA0BlQ,OAAOmQ,OAAOF,GAAe,eAAE,CAApD,IAI6B,EAH5BG,EAAwC,KACtC5P,EAA8B,GAAG,KAFnB,MAIY,IAAhC,IAAK,EAAL,qBAAkC,KAAvB6L,EAAM,QACV+D,EAUD/D,EAAOU,aAAeqD,EAAoBrD,WAM9CqD,EAAoB5D,QAAQpe,KAAO,GAAH,UAC1BgiB,EAAoB5D,QAAQpe,MAAQ,IAAE,GACvCie,EAAOG,QAAQpe,QAPlBoS,EAAQ/Q,KAAK2gB,GACbA,EAAsB/D,GAXtB+D,EAAsB/D,C,CAmBzB,+BAED7L,EAAQ/Q,KAAK2gB,GACbF,EAAczgB,KAAI,MAAlBygB,EAAsB1P,EACvB,CAED,OAAO,OAAP,wBACKnQ,GAAO,CACVjC,KAAM8hB,GAEV,C,uHC/CM,SAAUG,GACdhgB,GAEA,GAAIA,EAAQjC,KAAKkT,WAAaC,GAAA,uBAC5B,OAAOlR,EAET,SAASigB,EAAoB9J,EAAmBC,GAC9C,OAAOpC,GAAA,sBAAiCmC,EAAGC,EAAGpW,EAAQiM,uBACxD,CAOA,IAAMiU,EAAqBlgB,EAAQjC,KAAKoe,QAAQpe,KAAK0I,MAAM,EAAG,GACxD0Z,EAAsBngB,EAAQjC,KAAKoe,QAAQpe,KAAK0I,MAAM,GAEtD2Z,EAA2C,GAC3CC,EAA0C,GAEhDH,EAAmBlhB,SAAQ,SAAAshB,G,MACpBC,GAAA,mBAAkCD,MAGxB,QAAX,EAAAA,aAAK,EAALA,EAAO5d,YAAI,eAAEyK,iBAAkBnN,EAAQ8E,MAAMqI,cAKjDkT,EAAsBjhB,KAAKkhB,GAJzBF,EAAuBhhB,KAAKkhB,GAKhC,IAEAF,EAAuB9d,KAAK2d,GAC5BI,EAAsB/d,KAAK2d,GAE3B,I,EAAMO,EAAa,OAAH,wBACXxgB,EAAQjC,MAAI,CACfoe,QAAS,OAAF,wBACFnc,EAAQjC,KAAKoe,SAAO,CACvBpe,KAAM,GAAF,OACCqiB,EACAC,G,EACAF,E,4mBAUT,OALAngB,EAAU,OAAH,wBACFA,GAAO,CACVjC,KAAMyiB,GAIV,CCzDM,SAAUC,GAAoBzgB,GAClC,GAAIA,EAAQjC,KAAKkT,WAAaC,GAAA,aAC5B,OAAOlR,EAET,IAAM0gB,EAAqB1gB,EAAQjC,KAAKoe,QAAQpe,KAAKJ,KAAI,SAAAgjB,GAAC,OAAI,eAC5DtiB,GAAIsiB,EAAEje,MACHie,EAAC,IAWN,OARA3gB,EAAQjC,KAAO,OAAH,wBACPiC,EAAQjC,MAAI,CACfoe,QAAS,OAAF,wBACFnc,EAAQjC,KAAKoe,SAAO,CACvBpe,KAAM2iB,MAIH1gB,CACT,C,muBCeA,IACM,GAAYkY,EAAA,mBADA,gC,qsBCRL0I,GAA6B,CACxCC,wBAAuB,SACrB9b,GACyC,IAAzC+b,EAAA,uDAAuC,CAAC,EAExC,MAAO,CACLjS,eAAgB,SAAC,GACf,IAAM7O,EAAO,+BACR8gB,GAAc,CACjBjL,YAAa7B,GAAA,QAAmB,KAGlC,OAAO+M,GAAA,aAAuC,EAAgB/gB,EAChE,EAEAghB,UAAW,SAACpa,EAAmBQ,GAA4B,OACzD6Z,GAAA,aAA8Bra,EAAO,OAAF,wBAC9BQ,GAAI,CACP8Z,gBAAgB,IAChB,EAGJhY,OAAQiY,GAAA,mBAERrZ,SAAU,SAAC,GAAkB,MAAM,CACjCvF,YAAa,eACbC,OAAQ,wBACRC,KAAM,CAAE,EAASpE,GAAI+iB,GAAA,UAAmB,EAAS1e,OAClD,EAGDuM,QAAS,SAAC,GAAgB,MAAM,CAC9B1M,YAAa,mBACbC,OAAQ,mCACRC,KAAM,CAAE,EAAQpE,GAAI+iB,GAAA,UAAmB,EAAQ1e,OAChD,EAEDL,OAAQ,SAAC,EAAgB+E,GACvB,OAAKA,aAAI,EAAJA,EAAMhF,YAQJ,QAAiBgF,aAAI,EAAJA,EAAMhF,UAAW,EAAQ,MAPxC,CACLG,YAAa,eACbC,OAAQ,+BACRC,KAAM,CAAE,EAAOpE,GAAI+iB,GAAA,UAAmB,EAAO1e,OAKnD,EAEA6D,eAAgB,WAAF,MAAS,CACrBhE,YAAa,cACbC,OAAQ,8BACT,EAED6e,WAAY,SAACC,EAA2BthB,GACtC,IAAI2C,EAAM,iBAAoB2e,GAS9B,OAPKthB,aAAO,EAAPA,EAAS4N,WACZjL,EAAS,OAAH,wBACDoC,GACApC,IAIC,CACNJ,YAAa,YACbC,OAAQ,iBAIRC,KAAM,GACNE,OAAAA,EAEJ,EAEAuc,IAAK,SAAC,GACJ,IAAID,EACJf,GAA0Bc,+BAA+Bja,GAAapH,KAAI,SAAAgjB,GAAC,OAAIA,EAAEje,IAAI,IAQrF,OANIuc,EAAoBjP,SAAS,EAAItN,MACnCuc,EAAsBA,EAAoB7P,QAAO,SAAAuR,GAAC,OAAIA,IAAM,EAAIje,IAAI,IAEpEuc,EAAoB7f,KAAK,EAAIsD,MAGvB,CACNF,OAAQ,iBACRD,YAAa,YACbI,OAAQ,OAAF,wBACDoC,GAAW,CACdka,oBAAAA,IAGN,EAEJ,EAEAsC,kBAAiB,SAACvhB,G,MAChB,GAAoBA,EAAQgc,OArGdG,QAAQ5b,OAqGtB,CAtGJ,IAyGUihB,EAA4D,QAA3C,EAAAC,GAAA,EAAmBzhB,EAAQgc,OAAO/K,iBAAS,eAAEyQ,qBAEpE,GAAKF,IAAkBtD,GAA0BC,mBAAmBne,EAAQgc,OAAO/K,SAAUjR,EAAQ+E,eAQzE,IAAxB/E,EAAQjC,KAAKE,QAAgB+B,EAAQjC,KAAK,GAAGkT,WAAajR,EAAQgc,OAAO/K,UAG7E,OAAOuQ,EAAexhB,EAAQwE,SAftB,CAgBV,G,uGC7GK,IACD,GAAY0T,EAAA,mBADO,0BAOnB,SAAUyJ,GAAoB1e,G,QAClC,EAA6BA,EAArB8B,YAAAA,OAAW,IAAG,GAAC,EAAC,GAExB,EAAAsV,GAAA,GAAmBC,GAAA,sBAAsC,CACvDC,MAAwB,QAAjB,EAAAxV,EAAYD,aAAK,QAAI,GAC5B0V,cAAe,CACbC,cAAe,GACfC,YAAa,YACbC,kBAAmB,mBAErBC,eAAe,KAGjB,I,IAAOgH,G,GAAmB,QACxBC,GAAA,uBACAnQ,EACA,CAAEoQ,QAAS,uB,EACZ,E,s4BAJqB,GAMhBlI,GAAe,EAAAC,GAAA,GAAgB,CAAEzW,SAAU,iBACzC6D,GAAqB,EAAA6S,GAAA,GAAoB,CAC/CC,gBAAiB,oBACjBC,IAAKjV,EAAY8Q,cAFX5O,iBAIFwU,GAAa,EAAAsG,GAAA,KAKb9H,ErB0JF,SACJlV,G,gBAEMwD,EAAc,mBAAkC6J,GAAA,iBAChDiC,EAAc,oBAA2C,QAAhB,EAAA9L,EAAYxK,YAAI,eAAEM,KAAM+T,GAAA,OAAkB7J,EAAYxK,KAAKM,KACpGiW,EAAS,mBAA6BC,GAAA,YACtCC,EAAa,oBACD,QAAhB,EAAAjM,EAAYxK,YAAI,eAAEiV,kBAAmByB,GAAA,aAA4BlM,EAAYxK,KAAK2W,aAE9ErC,GAAW,UACXC,GAAW,EAAAC,EAAA,GAAY,MAE7B,EAMIJ,KALFqB,EAAqB,EAArBA,sBACAP,EAAS,EAATA,UACAK,EAAiB,EAAjBA,kBACAZ,EAAmB,EAAnBA,oBACAE,EAAyB,EAAzBA,0BAGF,GAEI,EAAArE,GAAA,KADFsF,EAAkB,EAAlBA,mBAAoB5H,EAAsB,EAAtBA,uBAAwB6H,EAAuB,EAAvBA,wBAAyBtF,EAAsB,EAAtBA,uBAGjEuF,EAAsBF,GAAsBC,IAC5Ca,EAAwBZ,aAAmB,EAAnBA,EAAqB1V,GAE7C0I,GAAY,EAAA+N,GAAA,KAEZC,EAAe7G,GAAqB6F,GACpCiB,EAAgD,QAA/B,EAAiB,QAAjB,EAAAD,EAAahX,YAAI,eAAEgX,oBAAY,eAAEpX,KAAI,SAAA+Q,GAAC,OAAIA,EAAErQ,EAAE,IAC/D4W,EAAkB,oBAAmCF,aAAY,EAAZA,EAAchX,OACvEmX,GAAA,sCAA2DF,IAEvDtB,EAAUD,KAEhB,GAAgD,EAAApF,GAAA,KAAxCrH,EAAc,EAAdA,eAAgBmO,EAAmB,EAAnBA,oBAElB/G,EAAYpH,EAAesH,GAAA,qBAC3B+G,EAAqBrO,EAAesH,GAAA,iBACpCgH,EAAiBtO,EAAesH,GAAA,gBAsBtC,MAAO,CACLvJ,YAAAA,EACAwD,YAAAA,EACA8L,YAAAA,EACAG,WAAAA,EACAnC,SAAAA,EACAC,SAAAA,EACAvL,UAAAA,EACAgO,aAAAA,EACAhB,oBAAAA,EACA9H,uBAAAA,EACAgJ,gBAAAA,EACAvB,QAAAA,EACAkD,sBA/BE,QAAyB,CAC3BC,WAAY,kBACZ9R,YAAAA,IAHA+R,UAiCAnC,sBAAAA,EACAvG,UAAAA,EACA6E,UAAAA,EACA8D,cA7BAhQ,EAAUvH,cACVgP,GACAjG,EAAY/I,iBACM,QAAhB,EAAA+I,EAAYxK,YAAI,eAAEiV,kBAAmBqB,EAAY7U,eACnDkU,EAAQlU,cACR8U,EAAO9U,cACPyM,MACkB,QAAhB,EAAA1D,EAAYxK,YAAI,eAAEiV,mBAAoBX,EAAS2E,qBAChD1E,EAAS2E,mBACVzD,EAqBAF,kBAAAA,EACAZ,oBAAAA,EACAE,0BAAAA,EACA5L,eAAAA,EACAmO,oBAAAA,EACAE,mBAAAA,EACAC,eAAAA,EAEJ,CqBlPqB0M,CAAqBjd,GAKlCmV,EAAgB,yBAAiCD,GAKjDlC,EFzCF,SAAgC/X,GACpC,IAAQ+E,EAAgD/E,EAAhD+E,YAAaoS,EAAmCnX,EAAnCmX,eAAgBC,EAAmBpX,EAAnBoX,eAE/BE,EAAQ,mBACRD,GAAS,UAET4K,EAA2B7C,GAA8C,CAC7EO,KAGIuC,EAAwB9C,GAAiD,CAC7EqB,GACAT,KAkCF,SAASxI,EAAiBjX,GACxB,GAAKP,EAAQ+W,gBAAkBI,aAAc,EAAdA,EAAgBlZ,QAA/C,CAEA,IAAMkkB,EACJjE,GAA0BE,uBAAuBrZ,EAAaxE,GAEhE,OAAO,YACLwE,EAAYD,MACZsS,EACA+K,EAR2D,CAU/D,CAEA,SAASxiB,EAAUY,GACjB,OAAO+W,EAAME,EAAiBjX,GAChC,CAkCA,IA7EgCxC,EA6E1Bga,GAAgB,QACpBP,EACA7X,GAlCF,SAAiBqY,EAAoBC,GACnC,GAAmB,IAAfD,EACF,OAAO,QAAgBC,GAEzBZ,EAAOzF,MAAM,GAAU,SACzB,IA+BE,SAAA7T,GAAI,OAAIA,EAAKoS,OAAO,IAxBtB,SAAmB7P,G,QACX8hB,EAAkB,GAAI9hB,EAAS6P,SAErC,GAAKiS,EAAgBnkB,OAArB,CAIA,IAAMokB,EAAavD,GAAA,OAAiBsD,GAEpC,GAAuB,QAAnB,EAAAC,aAAU,EAAVA,EAAYlG,eAAO,eAAE5b,OAAQ,CAC/B,IAAM8d,EAAgB,CACpB1B,aAAc0F,EAAWpR,SACzB1Q,OAA2B,QAAnB,EAAA8hB,aAAU,EAAVA,EAAYlG,eAAO,eAAE5b,QAE/B,OAAOie,KAAK8D,UAAUjE,EACvB,CAVA,CAaH,IAUMrgB,GArF0BD,EAqFKga,EAAc/Z,QApFnCD,EAAKE,OAGGgkB,EAAyBxC,QAAQ,CAAE1hB,KAAAA,IAEpCA,KAAKJ,KAAI,SAAAS,G,MACtBmkB,EAAqD,CACzDxkB,KAAMK,EACN6N,uBAAwBjM,EAAQiM,uBAChCnH,OAA0B,QAAnB,EAAA9E,EAAQ+E,mBAAW,eAAED,QAAS,IAKvC,OAFoBod,EAAsBzC,QAAQ8C,GAE/BxkB,IACrB,GAAG,IAdMA,EAqFLykB,EAnEAzK,EAAczZ,cAAeN,aAAK,EAALA,EAAOC,QAC/B,GAEFD,EAAME,QAAO,SAACukB,EAAOzG,GAC1B,OAAOA,EAAOG,QAAQpe,KAAKG,QAAO,SAACwkB,EAAO9b,GAAK,mBAAW8b,GAAK,CAAE9b,GAAK,GAAK6b,EAC7E,GAAG,IAiEL,OAFA,EAAAtK,GAAA,GAAcqK,GAEP,OAAP,wBACKzK,GAAa,CAChB/Z,MAAAA,EACA2B,UAAAA,GAEJ,CExEwBgjB,CAAsB,OAAD,wBAAMzI,GAAkBD,KC1E/D,SACJlC,EACAhT,GAEA,aAAgB,W,QACd,GAAKgT,EAAc9V,sBAAnB,CAGA,IAAM2gB,EAAuB7K,EAAc/Z,MAAMsM,MAAK,SAAA0R,GACpD,OAAOA,EAAO/K,WAAaC,GAAA,sBAC7B,IAEM2R,KAAiD,QAA7B,EAAAD,aAAoB,EAApBA,EAAsBzG,eAAO,eAAEzZ,UAAuC,QAA7B,EAAAkgB,aAAoB,EAApBA,EAAsBzG,eAAO,eAAEd,eAE9FtW,aAAW,EAAXA,EAAc,QAAkC8d,IAW/C9d,aAAW,EAAXA,EAAc,QAAiC8d,GAClD,eAA2B,OAAD,wBACrB,4BAAsC,CACzClgB,OAAQ,OAAF,wBACC,2BAAuCA,QAAU,CAAC,GAAiB,MACvE,MAA+B,MAEjC,CAAEiL,SAAS,IAjBd,eAA2B,OAAD,wBACrB,4BAAsC,CACzCjL,OAAQ,OAAF,wBACC,2BAAuCA,QAAU,CAAC,GAAiB,MACvE,UAA+B+O,MAEjC,CAAE9D,SAAS,GAfR,CA4BV,GAAG,CAACmK,EAAc9V,uBACpB,CD4CE6gB,CAAwB/K,EAAehT,GAKvC,IAAMmL,EAAU,gBAAwB,CACtCnS,KAAMkc,EACNG,oBAAqBF,aAAa,EAAbA,EAAeE,oBACpC2I,eAAe,IAMXlI,EACJZ,EAAWlD,eAAiB7G,EAMxB4K,EACJ/C,EAAc9V,yBACZiO,EAME6K,EACe,QAAnB,EAAAhD,EAAc/Z,aAAK,eAAEC,OAGjB+kB,GACFjL,EAAc9V,uBAAyB8V,EAAczZ,YACtDyc,KAAgBhD,EAAc/Z,MAAMsM,MAAK,SAAAlM,GAAI,OAAIA,EAAK6S,WAAaC,GAAA,YAAuB,IAGvF0L,EAAiBgE,GAA2BC,wBAChD9b,EACAke,GAAA,oBAAiCrB,IAKnC,OAFA5I,GAAc8B,GAETD,EAIH,uBAAKvW,UAAU,UACT2V,EAAWlT,UAAUhJ,QAAUkc,EAAWvG,QAAQ3V,QAAUkc,EAAWhF,gBAAgBlX,MACzF,gBAACid,EAAA,EAAa,CACZjW,YAAaA,EACbkW,YAAa/K,aAAO,EAAPA,EAAS+K,YACtBC,YAAahL,aAAO,EAAPA,EAASgL,YACtB/X,iBAAkB,CAChBG,OAAQ,mBACRF,SAAU,oBAEZgD,QAAS,CAAE7D,YAAa,YAAoBC,OAAQ,kBACpDwgB,YAAaA,EACbD,eAAa,IAIf,W,MACA,OAAKhL,EAAc9V,uBAAyB8V,EAAczZ,WACjD,gBAAC+e,GAAoB,MAGzBtC,EAWH,+BACE,gBAACK,GAAA,WAA4B,CAACtL,MAAO8J,GACnC,gBAACyC,GAAwB,CACvBte,KAAMga,EAAc/Z,MACpB4e,eAAgBA,EAChB7V,UAAWkT,EAAWlT,UAAUhJ,KAChCkO,uBAAwBgO,EAAWhO,uBACnC1D,YAAa0R,EAAW1R,YAAYxK,KACpC0d,WAAYA,EAEZqB,eAAgB,SAAAd,GAAM,OAAI4E,GAA2BW,kBAAkB,CACrEvF,OAAAA,EACAjX,YAAAA,EACAhH,KAAMga,EAAc/Z,MACpBwG,SAAUoY,GACV,EACF5V,eAAgBiT,EAAWjT,eAC3BmO,oBAAqB8E,EAAW9E,oBAChClO,iBAAkBA,EAClB8V,iBAAkB,SAACf,EAAQkH,EAAQlG,GAAM,MAAM,CAC7C/L,SAAU+K,EAAO/K,SACjBkS,WAAYnH,EAAOtZ,KACnBga,WAAYV,EAAOU,WACnBD,YAAayG,EACbte,UAAWoY,EACXnY,OAAQ,CACNC,MAAOC,EAAYD,OAAS,IAE/B,EACDoY,iBAAkB,SAAAlB,GAAM,OACtBkC,GAA0BiB,6BAA6Bpa,EAAaiX,EAAO,KAI5E/B,EAAW7L,YAAc2J,EAAczZ,aAAeyZ,EAAcpX,YACrE,gBAACgd,GAAyB,OAG1B5F,EAAcnX,SAAWmX,EAAczZ,aACvC,gBAACgd,GAAA,EAAoB,CACnBhd,WAAYyZ,EAAczZ,WAC1BqB,UAAWoY,EAAcpY,UACzBgB,WAAYoX,EAAcpX,WAC1B4a,eAAe,MApDrB,gBAAC,GAAuB,CACtBzW,MAAOC,EAAYD,MACnBuU,UAAqC,QAA3B,EAAAY,EAAW1R,YAAYxK,YAAI,eAAEqlB,iBAAkBC,GAAA,OACzDvF,iBAAkB7D,EAAW7L,WAuDrC,CAjEE,IAnBG,gCAuFX,CE7MM,SAAUkV,GAAsBrgB,GACpC,MAA6BA,EAArB8B,YAAAA,OAAW,IAAG,GAAC,EAAC,EAIxB,OAFyB,EAAAwN,EAAA,GAAY,MAA7BgR,aAGC,gBAAC5B,GAAmB,CAAC5c,YAAaA,IAGpC,gBAAC4U,GAAiB,CAAC5U,YAAaA,GACzC,C,kDCtBa4O,EAAiB,CAC5BD,QAAO,SAACE,GACN,MAAO,CACLjQ,IAAK,4BACLkN,UAAW,eAAqB,4BAA6B,CAAE+C,YAAAA,IAC/D3U,IAAK,UAEL8R,WAAY,SAAC2C,GACX,OAAOA,EAAQpR,MAAK,SAAC6T,EAAGC,GAAC,OAAKD,EAAErG,MAAQsG,EAAEtG,KAAK,GACjD,EAEJ,E,wECTWgF,EAA2B,WACtC,OAAwD,OAAgB,CAAE0O,iBAAiB,IAAnF3P,EAAkB,EAAlBA,mBAAoBC,EAAuB,EAAvBA,wBAEtB3F,EAAe0F,GAAsBC,IAO3C,OALkB,oBACd3F,GACF,0BAAuCA,EAAa9P,IAIxD,C,uECUM,SAAU8Z,EAAcqK,GAA+C,IAA/BxiB,EAAA,uDAA6B,CAAC,EACpEyjB,EAtBR,SAAyBjB,GACvB,OAAKA,EAGDxc,MAAMC,QAAQuc,GACTA,EAAQpT,QAAO,SAAAV,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEjF,SAAU8T,EACLA,EAAQzkB,KAAKqR,QAAO,SAAAV,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEnF,GARE,EASX,CAWmBgV,CAAgBlB,GAAS7kB,KAAI,SAAA+I,GAAC,OAAIA,EAAErI,EAAE,KAEvD,OAAqBolB,GAAU,SAAAE,GAAG,OAAI,qBAA+BA,EAAK3jB,EAAQ4jB,gBAAgB,GACpG,C","sources":["file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/views/feedback/enums/FeedbackOption.ts","file:///app/packages/projects/lite/src/apps/libraries/views/library-folder/LibraryFolderViewUtils.ts","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/series-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSchoolLevels.ts","file:///app/packages/libs/shared/src/apps/search/constants/SearchOGQL.ts","file:///app/packages/libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchTopics.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSearchData.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchCompanies.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGroupExchangeResults.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetTagsAndClassifications.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchMask.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/SearchResultsView.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/components/search-widget-tooltip/SearchWidgetTooltip.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/mixed-widget-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/partial-loading/PartialSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/search-results-request-video/SearchResultsRequestVideo.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/search-results-empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/utils/SearchResultsFilterHelper.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/useTransformer.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/results/mergeSearchResults.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/widget-item/transformSearchRelevantTopics.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/widget-item/transformSearchTags.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/useGetSearchResultsV2.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/utils/SearchResultsAppLinkHelper.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/SearchResultsViewV2.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/useCurriculumCodeSearch.ts","file:///app/packages/projects/lite/src/apps/search/views/lite-search-results-view/LiteSearchResultsView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/RatingRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","export enum FeedbackOption {\n SUGGEST_IMPROVEMENT = 'suggestImprovement',\n REPORT_BUG = 'reportBug',\n REQUEST_VIDEO = 'requestVideo',\n REQUEST_LIVESTREAM = 'requestLivestream',\n GIVE_PRAISE = 'givePraise',\n RAISE_ISSUE = 'raiseIssue',\n OTHER = 'other'\n}","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { Folder, Library } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getFolderAppLink(libraryId: string, folder: Folder, sort: string): Core.AppLink {\n if (!libraryId || !folder)\n return null;\n\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.FOLDER,\n args: [ libraryId, folder.id, TextHelper.slugify(folder.name) ],\n params: {\n sort\n }\n };\n}\n\nexport function getFolderBgColourClass(folder: Folder | Library): string {\n let charCode = 0;\n\n for (let i = 0; i < folder.name?.length ?? 0; i++) {\n charCode += folder.name.charCodeAt(i);\n }\n\n return BG_COLOUR_CLASS_NAMES[charCode % BG_COLOUR_CLASS_NAMES.length];\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"ZhLPS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { ExchangeVideoGroup } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroup>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"eEZEe\"};","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"UT8bc\"};","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './collection-thumbnail.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={(props.collection as Series).rating} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"overlayContainer\":\"MnBcv\",\"overlay\":\"AZSmh\"};","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[]\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Presentation, SchoolLevels } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentation: Presentation) {\n const { hasPermissions } = usePermissions();\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n\n const {\n availablePresentations,\n hasPresentationsLoaded\n } = usePresentation();\n\n function getPresentationIds() {\n if (isLearner)\n return presentation ? [presentation?.id] : null;\n\n return availablePresentations?.map(o => o.id);\n }\n\n const presentationIds = getPresentationIds();\n\n return Flight.useBasicFetch<SchoolLevels>(\n hasPresentationsLoaded &&\n presentationIds &&\n SearchRequests.schoolLevels(presentationIds)\n );\n}","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail'\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter, WidgetSearchResults } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\nexport const SharedSearchRequests = {\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n formatData: (response: WidgetSearchResults) => {\n const curriculumSearchWidget = response.widgets.find(w => w.widgetId === WidgetTypeId.SearchCurriculumCode);\n\n /**\n * When a curriculum search has been detected, we want to filter out all other\n * widgets.\n */\n if (curriculumSearchWidget) {\n return {\n widgets: [curriculumSearchWidget]\n };\n }\n\n return response;\n },\n key\n };\n },\n \n searchV4(\n query: string,\n indicesArr: SearchIndices[],\n filters: HashObject = {},\n allowSubstitute: boolean = true,\n cursor?: string,\n limit?: number\n ): Flight.PublicRequest {\n let key = `search:v4:${query}:${allowSubstitute}:${indicesArr}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indices = indicesArr.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n allowSubstitute: boolean = true,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { Classification, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\nconst TEACHER_FILTERS = [ 'filters.classification', 'filters.presentation' ];\nconst STUDENT_FILTERS = [ 'filters.classification', 'filters.presentation', 'isLearner' ];\n\ntype TopicSearchResults = SearchResults<SearchResultsObject<Classification>>;\n\nexport function useSearchTopics(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationId: string,\n availablePresentations: Presentation[],\n isStudent: boolean\n): Flight.Response<SearchResults> {\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n [presentationId],\n isStudent,\n []\n );\n\n const filters = ObjectHelper.pick(rawFilters, isStudent ? STUDENT_FILTERS : TEACHER_FILTERS);\n filters[`filters.classificationType`] = ClassificationType.Subject;\n filters[`filters.status`] = ClassificationStatus.Published;\n\n if (queryParams?.moviesAndTv)\n filters[`filters.curationTag`] = CurationTag.MOVIES_AND_TV;\n\n if (availablePresentations.length) {\n filters[`filters.presentation`] = availablePresentations.map(presentation => presentation.id);\n }\n\n const presentationMap = availablePresentations?.reduce((acc: HashObject, presentation) => {\n acc[presentation.id] = presentation;\n return acc;\n }, {}) ?? {};\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutTopics = !indices.includes('classification');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['classification'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n if (!availablePresentations || availablePresentations?.length < 2)\n return response;\n\n const results = [...response.data.results];\n\n /**\n * If the customer has more than 1 presentation, and they search for something that returns 2 topics\n * with the same score, then we want to order those topics based on the presentation's learning level.\n * This is achieved by checking the `value` on the presentation.\n */\n const sortedResults = results.sort((a, b) => {\n // If the scores are different, then keep the original ordering\n if (a._score !== b._score)\n return 0;\n\n const presentationA = presentationMap[a.presentationId];\n const presentationB = presentationMap[b.presentationId];\n\n if (!presentationA)\n return 1;\n\n if (!presentationB)\n return -1;\n\n // Order by presentation value\n return presentationA.value - presentationB.value;\n });\n\n return {\n ...response,\n data: {\n ...response.data,\n results: sortedResults\n }\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DomainMasterCollectionType, LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, Rating, User, YearGroup } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { RatingRequests } from 'shared/flight-requests/RatingRequests';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { useFetchSchoolLevels } from 'apps/search/hooks/useFetchSchoolLevels';\nimport { useSearchCompanies } from 'apps/search/hooks/useSearchCompanies';\nimport { useSearchTopics } from 'apps/search/hooks/useSearchTopics';\n\n/**\n * We need to fetch libraries in order to support the sources filter. \n * However we need to exclude the streamable library, and additionally we need to exclude\n * the exchange library if the user has decided they don't want to see exchange results.\n * \n * We then need to return both of these ids so that the FilterHelper.getBackendFilters()\n * can add them as excludeLibraryExclusive filters\n * \n * - Sha\n */\nfunction useGetLibraries() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const products = useProducts();\n const settings = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const showExchangeSearchResults = products.hasProduct(ProductId.Exchange) && settings.showExchangeSearchResults;\n\n const libraryTypes: DomainMasterCollectionType[] = [ 'sharedLibrary', 'customLibrary', 'workspace', 'hostedLibrary', 'exchange' ];\n const librariesRequest = Flight.useBasicFetch<Library[]>(\n currentUser.data?.isAuthenticated && LibraryRequests.domainLibraries(libraryTypes)\n );\n\n let libraries = librariesRequest.data ?? [];\n const exchangeLibraryIndex = libraries?.findIndex(l => l.type === MasterObjectTypes.Exchange);\n const exchangeLibraryId = libraries[exchangeLibraryIndex]?.id;\n\n if (!showExchangeSearchResults)\n libraries = [ ...libraries.slice(0, exchangeLibraryIndex), ...libraries.slice(exchangeLibraryIndex + 1) ];\n\n if (streamableLibraryId) {\n const streamableIndex = libraries?.findIndex(l => l.id.toString() === streamableLibraryId.toString());\n libraries = [ ...libraries.slice(0, streamableIndex), ...libraries.slice(streamableIndex + 1) ];\n }\n\n const hasLibrariesCompleted = (\n streamableLibrary.hasCompleted &&\n (!currentUser.data?.isAuthenticated || librariesRequest.hasCompleted)\n );\n\n return {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n };\n}\n\nfunction useGetRatings() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings(currentUser.data?.countryCode));\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n\n if (!hasPresentationsLoaded)\n return ratings;\n\n if (availablePresentations?.length > 1 || !currentPresentation)\n return ratings;\n\n const learningLevel = TopicsHelper.getMappedPresentationLevel(currentPresentation.learningLevel);\n if (learningLevel !== PresentationLearningLevel.Level_1)\n return ratings;\n\n return {\n ...ratings,\n data: ratings.data?.filter(rating => {\n // Primary schools shouldn't see ratings higher than PG\n return rating.code && rating.value < 64;\n })\n };\n}\n\n/**\n * This hook contains all the simple data fetching that normally sits in the view.\n * I've done this to help promote readability of of the SearchResultsView - Sha\n */\nexport function useFetchSearchData(\n queryParams: HashObject\n) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const curriculums = useCurriculums();\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const canUseSeriesActions = hasLocalPermissions(LocalPermissionName.UseSeriesActions);\n const hasCustomLibraries = hasPermissions(PermissionName.ViewLibraries);\n const hasMoviesAndTv = hasPermissions(PermissionName.ViewMoviesTv);\n\n const topics = useSearchTopics(\n queryParams,\n ratings.data,\n currentPresentationId,\n availablePresentations,\n isLearner\n );\n\n const companies = useSearchCompanies(\n queryParams,\n ratings.data,\n availablePresentations,\n hasMoviesAndTv\n );\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n config,\n yearGroups,\n products,\n settings,\n curriculums,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n topics,\n companies,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n canUseSeriesActions,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions,\n hasLocalPermissions,\n hasCustomLibraries,\n hasMoviesAndTv\n };\n}\n\nexport function useFetchSearchDataV2(\n queryParams: HashObject\n) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const hasCustomLibraries = hasPermissions(PermissionName.ViewLibraries);\n const hasMoviesAndTv = hasPermissions(PermissionName.ViewMoviesTv);\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n yearGroups,\n products,\n settings,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions,\n hasLocalPermissions,\n hasCustomLibraries,\n hasMoviesAndTv\n };\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Company, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n ratings: Rating[] = [],\n availablePresentations: Presentation[],\n hasMoviesAndTv: boolean\n): Flight.Response<SearchResults> {\n const availablePresentationIds = availablePresentations.map(p => p.id);\n\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n availablePresentationIds,\n false,\n []\n );\n \n const filters = rawFilters || {};\n\n /**\n * For other uses of FilterHelper.buildBackendFilterParams, the presentaiton ids will only be added for students,\n * but as a temporary fix for searching companies, we always filter by the current presentation - Sha\n */\n if (availablePresentationIds?.length)\n filters[`filters.presentation`] = availablePresentationIds;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutCompanies = !indices.includes('company');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['company'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutCompanies && hasMoviesAndTv;\n\n const response = Flight.useBasicFetch<CompanySearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n return {\n ...response,\n data: {\n ...response.data,\n results: [...response.data.results]\n }\n };\n}\n","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { UseProductsResponse } from 'libs/shared/hooks/UseProducts';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Video } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { ExchangeGroupingType, useGroupExchangeResults } from './useGroupExchangeResults';\n\nexport const namespace = 'search.utils';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n products: UseProductsResponse;\n settings: SettingsHash;\n hasDataLoaded: boolean;\n exchangeLibraryId: string;\n showExchangeSearchResults: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n const hasExchangeLibraryFilter = hasLibraryFilter(options.exchangeLibraryId?.toString());\n const fetchMixedExchangeResults = (\n options.hasDataLoaded &&\n appliedIndices?.length &&\n options.showExchangeSearchResults &&\n !hasExchangeLibraryFilter\n );\n const mixedExchangeSearchResults = Flight.useBasicFetch<SearchResults>(\n fetchMixedExchangeResults && getMixedExchangeSearchRequest()\n );\n\n function hasLibraryFilter(libraryId: string): boolean {\n if (!libraryId) return false;\n\n return options.backendFilters?.[`${FilterConstants.FILTER_PARAM_PREFIX}library`]\n ?.some?.((l: string) => l.toString() === libraryId);\n }\n\n function getMixedExchangeSearchRequest() {\n return SharedSearchRequests.searchV4(\n queryParams.query,\n appliedIndices,\n backendFilters,\n queryParams.allowSubstitute !== 'false',\n null,\n 10\n );\n }\n\n function getSearchRequest(cursor?: string) {\n if (!options.hasDataLoaded || !appliedIndices?.length) return;\n\n let backendFilters = { ...options.backendFilters };\n\n if (options.showExchangeSearchResults && !hasExchangeLibraryFilter) {\n const excludeLibraryFilter = `${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`;\n backendFilters = {\n ...backendFilters,\n [excludeLibraryFilter]: [ ...backendFilters[excludeLibraryFilter], options.exchangeLibraryId ]\n };\n }\n \n return SharedSearchRequests.searchV4(\n queryParams.query,\n appliedIndices,\n backendFilters,\n queryParams.allowSubstitute !== 'false',\n cursor\n );\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n function getExchangeGroupingType(): ExchangeGroupingType {\n if (!options.showExchangeSearchResults)\n return 'omit';\n\n return hasExchangeLibraryFilter ? 'untouched' : 'group';\n }\n\n const videos = searchResults.items?.filter(r => r._index === 'video' || r._index === 'clip');\n useVideoMixin(videos as Video[]);\n\n const items = useGroupExchangeResults({\n searchResults: searchResults.items,\n mixedExchangeSearchResults: mixedExchangeSearchResults.data?.results,\n searchResultsResponse: searchResultsResponse.data,\n groupingType: getExchangeGroupingType()\n });\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n items,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import React from 'react';\n\nimport { ExchangeVideoGroup, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport type ExchangeGroupingType =\n 'omit' | // Don't show exchange results at all\n 'group' | // Group exchange results into a component\n 'untouched'; // Leave exchange results untouched\n\ninterface UseGroupExchangeResults {\n searchResults: SearchResultObjectTypes[];\n mixedExchangeSearchResults: SearchResultObjectTypes[];\n searchResultsResponse: SearchResults;\n groupingType: ExchangeGroupingType;\n}\n\nexport function useGroupExchangeResults(options: UseGroupExchangeResults) {\n return React.useMemo(() => {\n if (!options.searchResults?.length || !options.mixedExchangeSearchResults?.length || options.groupingType === 'untouched')\n return options.searchResults;\n\n const mixedExchangeResults: SearchResultObjectTypes[] = [...options.searchResults];\n const exchangeResults: SearchResultsObject<Video>[] = [];\n let exchangeIndex: number;\n let exchangeShowCount: number;\n let consecutive = false;\n\n options.mixedExchangeSearchResults.forEach((item, index) => {\n if (exchangeResults.length === 3) return;\n\n const isExchangeVideo = VideoHelper.isVideo(item) &&\n item.libraries.data?.length === 1 &&\n item.libraries.data?.[0]?.typeId === MasterType.ExchangeCollection;\n\n if (isExchangeVideo) {\n if (exchangeIndex === undefined) {\n exchangeIndex = index;\n exchangeShowCount = 0;\n consecutive = true;\n }\n\n if (consecutive)\n exchangeShowCount++;\n\n exchangeResults.push(item);\n return;\n }\n\n consecutive = false;\n });\n\n const exchangeVideoGroup: SearchResultsObject<ExchangeVideoGroup> = {\n id: null,\n type: null,\n name: null,\n videos: exchangeResults,\n showCount: exchangeIndex === 0 ? 1 : exchangeShowCount,\n isExchangeVideoGroup: true,\n _index: null\n };\n \n if (options.groupingType === 'group' && exchangeResults.length)\n mixedExchangeResults.splice(exchangeIndex, 0, exchangeVideoGroup);\n\n return mixedExchangeResults;\n }, [\n options.searchResultsResponse,\n options.searchResults?.length,\n options.mixedExchangeSearchResults,\n options.groupingType\n ]);\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n\nconst invalidBackendFilters = [\n `${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`\n];\n\nfunction getCleanBackendFilters(backendFilters: HashObject) {\n return ObjectHelper.omit(backendFilters, invalidBackendFilters);\n}\n\nexport function useGetTagsAndClassificationsV2(options: UseGetTagsAndClassificationsOptions) {\n const backendFilters = getCleanBackendFilters(options.backendFilters);\n \n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n backendFilters\n ));\n}","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(ViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsEmptyState';\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.PRESENTATION_TOPICS }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\n\nimport { useFetchSearchData } from 'apps/search/hooks/useFetchSearchData';\nimport { useGetSearchResults } from 'apps/search/hooks/useGetSearchResults';\nimport { useGetTagsAndClassifications } from 'apps/search/hooks/useGetTagsAndClassifications';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function SearchResultsView(props: SearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: queryParams.moviesAndTv\n });\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const hasIndices = !!searchFilters?.appliedIndices.length;\n const tagsAndClassifications = useGetTagsAndClassifications(hasIndices && searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters({\n data: searchData,\n inaccessibleIndices: searchFilters?.inaccessibleIndices,\n tagsAndClassifications: hasIndices && tagsAndClassifications\n });\n \n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n (!searchData.topics || searchData.topics.hasCompleted) &&\n (!searchData.companies || searchData.companies.hasCompleted) &&\n (!hasIndices || tagsAndClassifications.hasCompleted) &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length ||\n searchData.topics?.data?.totalResults ||\n searchData.companies?.data?.totalResults\n );\n\n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv === 'true'\n )}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland')}\n />\n )\n }\n {/* XOR */}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </section>\n }\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'search.searchWidgetTooltip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchWidgetTooltipProps {\n widgetId: WidgetTypeId;\n isTertiary: boolean;\n}\n\nfunction getWidgetPhrase(widgetId: WidgetTypeId, isTertiary: boolean) {\n const widgetTooltipPhraseMap: {[key in WidgetTypeId]?: string} = {\n [WidgetTypeId.SearchRelevantTopics]: 'relevantTopicsTooltip',\n [WidgetTypeId.SearchCompanies]: 'studiosAndChannelsTooltip',\n [WidgetTypeId.SearchTopResults]: 'topResultsTooltip',\n [WidgetTypeId.SearchSeries]: 'seriesTooltip',\n [WidgetTypeId.SearchPlaylists]: 'playlistsTooltip',\n [WidgetTypeId.SearchMyVideosFolder]: 'myVideosFoldersTooltip',\n [WidgetTypeId.SearchMySchoolLibraryFolder]: isTertiary ? 'mySchoolFoldersTooltipTertiary' : 'mySchoolFoldersTooltip',\n [WidgetTypeId.SearchMyVideos]: 'myVideosTooltip',\n [WidgetTypeId.SearchMySchoolLibraryVideos]: isTertiary ? 'mySchoolVideosTooltipTertiary' : 'mySchoolVideosTooltip',\n [WidgetTypeId.SearchExchangeArchive]: 'exchangeArchiveTooltip',\n [WidgetTypeId.SearchRelatedResults]: 'relatedResultsTooltip'\n };\n\n return widgetTooltipPhraseMap[widgetId];\n}\n\nexport function SearchWidgetTooltip(props: SearchWidgetTooltipProps): JSX.Element {\n const phrase = getWidgetPhrase(props.widgetId, props.isTertiary);\n\n if (!phrase)\n return <></>;\n\n return (\n <SvgContainer\n className={`svg-container text-secondary`}\n svgName={cvSvgLibrary.Info}\n title={getPhrase(phrase)}\n tooltipPlacement='top'\n tooltipSpanHack\n tooltipSpanHackClassName='ms-2'\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"searchResultsWidgetsContainer\":\"Z5jXs\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport type { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllSearchWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { type HasLocalPermissionsFunc, type HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { type BaseObject, type CurrentUser, DashboardTargetType, type Presentation, type PresentationAudience, WidgetMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { SearchWidgetTooltip } from './components/search-widget-tooltip/SearchWidgetTooltip';\n\nimport styles from './mixed-widget-search-results.scss';\n\nconst namespace = 'search.mixedWidgetSearchResults';\n\nfunction getName(widget: WidgetSearchItem, isTertiary: boolean): string {\n if (widget.widgetId === WidgetTypeId.SearchMySchoolLibraryFolder)\n return isTertiary ? LanguageService.getPhrase(namespace, 'tertiaryFolderHeading') : widget.name;\n\n if (widget.widgetId === WidgetTypeId.SearchMySchoolLibraryVideos)\n return isTertiary ? LanguageService.getPhrase(namespace, 'tertiaryLibraryVideoHeading') : widget.name;\n\n return widget.name;\n}\n\nfunction getWidgetMetadata(widget: WidgetSearchItem): Partial<WidgetMetadata> {\n if (widget.widgetId === WidgetTypeId.SearchCurriculumCode) {\n return {\n curriculumLeafName: widget.content.name,\n curriculumLeafDescription: widget.content.description\n };\n }\n\n return {};\n}\n\nexport interface MixedWidgetSearchResultsProps {\n data: WidgetSearchItem[];\n widgetAppLinks: AllSearchWidgetTemplates['appLinks'];\n audiences: PresentationAudience[];\n availablePresentations: Presentation[];\n currentUser: CurrentUser;\n commonVideoProps: CommonVideoProps;\n isTertiary: boolean;\n\n getAnalyticsData?: (widget: WidgetSearchItem, yIndex: number, xIndex: number) => HashObject;\n \n getSeeMoreLink: (widget: WidgetSearchItem) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n getSelectedItems: (type: WidgetTypeId) => BaseObject[];\n}\n\nexport function MixedWidgetSearchResults(props: MixedWidgetSearchResultsProps): JSX.Element {\n if (!props.data || !props.data.length)\n return <></>;\n\n return (\n <div className={styles.searchResultsWidgetsContainer}>\n {props.data.map((widget, idx) => {\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Search}\n \n key={idx}\n widgetIndex={idx}\n id={idx.toString()}\n \n name={getName(widget, props.isTertiary)}\n content={widget.content.data}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n \n audiences={props.audiences}\n currentUser={props.currentUser}\n appLinks={props.widgetAppLinks}\n availablePresentations={props.availablePresentations}\n hasPermissions={props.hasPermissions}\n seeMoreLink={props.getSeeMoreLink(widget)}\n commonVideoProps={props.commonVideoProps}\n getAnalyticsData={xIndex => props.getAnalyticsData(widget, idx, xIndex)}\n badgeComponent={\n <SearchWidgetTooltip\n widgetId={widget.widgetId}\n isTertiary={props.isTertiary}\n />\n }\n getSelectedItems={props.getSelectedItems}\n \n description={null}\n metadata={getWidgetMetadata(widget)}\n isPreviewing={false}\n settings={null}\n onClickRemoveItem={null}\n />\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { PartialWidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/partial-loading/PartialWidgetHeader';\nimport { PartialTagSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/tag-sliding-list/partial-loading/PartialTagSlidingListWidgetTemplate';\nimport { PartialThumbnailFixedListMediaSmallWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-fixed-list-media-small/partial-loading/PartialThumbnailFixedListMediaSmallWidgetTemplate';\nimport { PartialThumbnailFixedSmallWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-fixed-list-small/partial-loading/PartialThumbnailFixedListSmallWidgetTemplate';\nimport { PartialThumbnailVerticalListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-vertical-list/partial-loading/PartialThumbnailVerticalListWidgetTemplate';\n\nexport function PartialSearchResults(): JSX.Element {\n return (\n <div className='d-flex flex-column gap-4 mb-3'>\n <div className='border-bottom border-gray-300 pb-3'>\n <PartialTagSlidingListWidgetTemplate />\n </div>\n <div>\n <PartialThumbnailFixedSmallWidgetTemplate hideDescription />\n </div>\n <div>\n <PartialWidgetHeader hideDescription />\n <PartialThumbnailVerticalListWidgetTemplate />\n </div>\n <PartialThumbnailFixedListMediaSmallWidgetTemplate hideDescription />\n <div>\n <PartialWidgetHeader hideDescription />\n <PartialThumbnailVerticalListWidgetTemplate />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FeedbackOption } from 'libs/shared/views/feedback/enums/FeedbackOption';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsRequestVideo';\n\ninterface SearchResultsRequestVideo {\n skipBeforeRequestingVideoStep?: boolean;\n description?: string;\n}\n\nexport function SearchResultsRequestVideo(props: SearchResultsRequestVideo): JSX.Element {\n const { skipBeforeRequestingVideoStep = true } = props;\n \n return (\n <div className='d-flex flex-column align-items-center justify-content-center gap-3 mb-3'>\n {props.description\n ? <span>{props.description}</span>\n : <Text phrase='description' namespace={namespace} />\n }\n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.GIVE_FEEDBACK,\n params: {\n selectedOption: FeedbackOption.REQUEST_VIDEO,\n skipBeforeRequestingVideoStep: !!skipBeforeRequestingVideoStep\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text phrase='requestVideo' namespace={namespace} />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SearchResultsRequestVideo } from '../search-results-request-video/SearchResultsRequestVideo';\n\nconst namespace = 'search.searchResultsEmptyStateV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n hideRequestVideo?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info className='w-50 m-0'>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.PRESENTATION_TOPICS }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n \n {!props.hideRequestVideo &&\n <SearchResultsRequestVideo description={getPhrase('requestVideoInfo')} />\n }\n </LanguageNamespaceContext.Provider>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SourceFilterOptions, TypeFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { BaseObject } from 'libs/shared/interfaces';\n\ninterface HasQueryParamOptions {\n queryParams: HashObject;\n key: string;\n value: string;\n}\n\nconst SupportedSearchWidgetTypeIds: WidgetTypeId[] = [\n WidgetTypeId.SearchRelevantTopics,\n WidgetTypeId.SearchCompanies,\n WidgetTypeId.SearchPlaylists,\n WidgetTypeId.SearchSeries,\n WidgetTypeId.SearchTopResults,\n WidgetTypeId.SearchMyVideos,\n WidgetTypeId.SearchMyVideosFolder,\n WidgetTypeId.SearchMySchoolLibraryVideos,\n WidgetTypeId.SearchMySchoolLibraryFolder,\n WidgetTypeId.SearchExchangeArchive,\n WidgetTypeId.SearchRelatedResults,\n WidgetTypeId.SearchCurriculumCode\n];\n\nfunction hasQueryParam(options: HasQueryParamOptions) {\n const targetParam = options.queryParams?.[options.key];\n \n if (typeof targetParam === 'string') {\n return targetParam === options.value;\n }\n\n if (!Array.isArray(targetParam)) {\n return false;\n }\n\n return targetParam.includes(options.value);\n}\n\nexport interface CursorContext {\n cursor: string;\n widgetTypeId: WidgetTypeId;\n}\n\n/**\n * The `cursor` param is a stringified object with `CursorContext` type\n */\nfunction getCursorContext(cursor: string): CursorContext {\n if (!cursor || !cursor.length)\n return;\n \n let context: CursorContext;\n try {\n const parsed: CursorContext = JSON.parse(cursor);\n\n if (!parsed.cursor || !parsed.widgetTypeId)\n return;\n\n if (!SupportedSearchWidgetTypeIds.includes(parsed.widgetTypeId))\n return;\n\n context = parsed;\n } catch {\n return;\n }\n\n return context;\n}\n\nfunction getValidFocusedWidget(queryParams: HashObject): WidgetTypeId {\n if (!queryParams?.focus)\n return;\n\n if (typeof queryParams.focus === 'string') {\n return SupportedSearchWidgetTypeIds.find(w => w === queryParams.focus);\n }\n\n if (Array.isArray(queryParams.focus) && queryParams.focus.length === 1) {\n return SupportedSearchWidgetTypeIds.find(w => w === queryParams.focus[0]);\n }\n\n return;\n}\n\nfunction getWidgetIdsFromQueryParams(queryParams: HashObject): WidgetTypeId[] {\n const widgets: WidgetTypeId[] = [];\n\n const focusedWidget = getValidFocusedWidget(queryParams);\n\n if (focusedWidget) {\n return [ focusedWidget, WidgetTypeId.SearchTags ];\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Classification, queryParams })) {\n widgets.push(WidgetTypeId.SearchRelevantTopics);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Company, queryParams })) {\n widgets.push(WidgetTypeId.SearchCompanies);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Series, queryParams })) {\n widgets.push(WidgetTypeId.SearchSeries);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Playlist, queryParams })) {\n widgets.push(WidgetTypeId.SearchPlaylists);\n }\n\n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Category, queryParams })) {\n widgets.push(WidgetTypeId.SearchMySchoolLibraryFolder, WidgetTypeId.SearchMyVideosFolder);\n }\n \n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.ExchangeArchive, queryParams })) {\n widgets.push(WidgetTypeId.SearchExchangeArchive);\n }\n \n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.MyVideos, queryParams })) {\n widgets.push(WidgetTypeId.SearchMyVideos, WidgetTypeId.SearchMyVideosFolder);\n }\n\n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.ClickView, queryParams })) {\n widgets.push(WidgetTypeId.SearchTopResults, WidgetTypeId.SearchRelatedResults);\n }\n\n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.School, queryParams })) {\n widgets.push(WidgetTypeId.SearchMySchoolLibraryVideos, WidgetTypeId.SearchMySchoolLibraryFolder);\n }\n\n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Video, queryParams }) ||\n hasQueryParam({ key: 'type', value: TypeFilterOptions.Clip, queryParams }) ||\n hasQueryParam({ key: 'type', value: TypeFilterOptions.Interactive, queryParams })) {\n widgets.push(\n WidgetTypeId.SearchTopResults,\n WidgetTypeId.SearchRelatedResults,\n WidgetTypeId.SearchMySchoolLibraryVideos,\n WidgetTypeId.SearchMyVideos,\n WidgetTypeId.SearchExchangeArchive,\n WidgetTypeId.SearchCurriculumCode\n );\n }\n\n if (widgets.length) {\n widgets.push(WidgetTypeId.SearchTags);\n }\n\n return ArrayHelper.uniq(widgets);\n}\n\nexport const SearchResultsFilterHelper = {\n isOnlyActiveWidget(widgetId: WidgetTypeId, queryParams: HashObject): boolean {\n const targetParam = queryParams?.['focus'];\n \n if (typeof targetParam === 'string')\n return targetParam.toLowerCase() === widgetId.toLowerCase();\n \n if (!Array.isArray(targetParam))\n return false;\n \n if (targetParam.length !== 1)\n return false;\n \n return !!targetParam.find(p => p.toLowerCase() === widgetId.toLowerCase());\n },\n\n getActiveWidgetFilters(\n queryParams: HashObject,\n cursor?: string\n ): WidgetFilter[] {\n const cursorContext = getCursorContext(cursor);\n\n /**\n * Having a cursor context means we will only fetch\n * the specified widget data - this is usually\n * the last widget's cursor from the search response\n */\n if (cursorContext) {\n return [{\n id: cursorContext.widgetTypeId,\n cursor: cursorContext.cursor\n }];\n }\n \n /**\n * We build widget filters based on query params\n */\n const widgets: WidgetTypeId[] = getWidgetIdsFromQueryParams(queryParams);\n \n return widgets.map(w => ({ id: w }));\n },\n\n getSelectedTagOrClassification(queryParams: HashObject): BaseObject[] {\n if (typeof queryParams?.tagOrClassification === 'string')\n return [{ id: queryParams.tagOrClassification, name: queryParams.tagOrClassification }];\n\n if (Array.isArray(queryParams?.tagOrClassification))\n return queryParams.tagOrClassification.map((tag: string) => ({\n id: tag,\n name: tag\n }));\n\n return [];\n },\n\n getSearchWidgetSelectedItems(queryParams: HashObject, widgetTypeId: WidgetTypeId): BaseObject[] {\n if (widgetTypeId !== WidgetTypeId.SearchTags)\n return [];\n\n return SearchResultsFilterHelper.getSelectedTagOrClassification(queryParams);\n }\n};","import React from 'react';\n\nimport { Middleware, type MiddlewareFunctionSync } from 'libs/common/backbone/core';\n\nexport function useTransformer<T>(transformations?: MiddlewareFunctionSync<T>[]) {\n const middleware = React.useMemo(() => new Middleware<T>(), []);\n\n React.useEffect(() => {\n if (!transformations || !transformations.length)\n return;\n\n transformations.forEach(fn => middleware.useSync(fn));\n }, []);\n\n function push(fn: MiddlewareFunctionSync<T>): void {\n if (!middleware)\n return;\n\n middleware.useSync(fn);\n }\n\n function execute(options: T): T {\n if (!middleware)\n return;\n \n return middleware.goSync(options);\n }\n \n return {\n push,\n execute\n };\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\n\nimport { SearchResultsTransformOptions } from '../../interfaces/SearchResultsTransformOptions';\n\n/**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n */\nexport function mergeSearchResults(options: SearchResultsTransformOptions): SearchResultsTransformOptions {\n const { data } = options;\n \n if (!data) return options;\n \n const items = [...data];\n\n const groupedWidgets = ArrayHelper.groupBy(items, 'widgetId');\n\n const mergedWidgets: WidgetSearchItem[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: WidgetSearchItem = null;\n const widgets: WidgetSearchItem[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n /**\n * Widgets of the same type may have different templates. When this occurs,\n * we want to make sure each widgetType + template combo is pushed\n * as a separate widget.\n */\n if (widget.templateId !== currentMergedWidget.templateId) {\n widgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n currentMergedWidget.content.data = [\n ...(currentMergedWidget.content.data || []),\n ...widget.content.data\n ];\n }\n\n widgets.push(currentMergedWidget);\n mergedWidgets.push(...widgets);\n }\n\n return {\n ...options,\n data: mergedWidgets\n };\n}","import { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Classification } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport type { WidgetSearchItemTransformOptions } from '../../interfaces/WidgetSearchItemTransformOptions';\n\n/**\n * Sort first six Relevant topics widget by Exact matches and then by presentation level \n */\nexport function transformSearchRelevantTopics(\n options: WidgetSearchItemTransformOptions\n): WidgetSearchItemTransformOptions {\n if (options.data.widgetId !== WidgetTypeId.SearchRelevantTopics)\n return options;\n\n function sortByLearningLevel(a: Classification, b: Classification) {\n return TopicsHelper.sortByLearningLevel(a, b, options.availablePresentations);\n }\n\n /**\n * We only want to sort the first 6 items.\n * Anything after that are items added\n * through pagination.\n */\n const relevantTopicsData = options.data.content.data.slice(0, 6);\n const remainingTopicsData = options.data.content.data.slice(6);\n \n const exactMatchSortedTopics: Classification[] = [];\n const remainingSortedTopics: Classification[] = [];\n \n relevantTopicsData.forEach(topic => {\n if (!MasterTypeHelper.isClassification(topic))\n return;\n \n if (topic?.name?.toLowerCase() === options.query.toLowerCase()) {\n exactMatchSortedTopics.push(topic);\n return;\n }\n \n remainingSortedTopics.push(topic);\n });\n \n exactMatchSortedTopics.sort(sortByLearningLevel);\n remainingSortedTopics.sort(sortByLearningLevel);\n \n const sortedItem = {\n ...options.data,\n content: {\n ...options.data.content,\n data: [\n ...exactMatchSortedTopics,\n ...remainingSortedTopics,\n ...remainingTopicsData\n ]\n }\n };\n \n options = {\n ...options,\n data: sortedItem\n };\n\n return options;\n}","import { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\n\nimport type { WidgetSearchItemTransformOptions } from '../../interfaces/WidgetSearchItemTransformOptions';\n\n/**\n * Transform search tag data so that its id is its name\n */\nexport function transformSearchTags(options: WidgetSearchItemTransformOptions): WidgetSearchItemTransformOptions {\n if (options.data.widgetId !== WidgetTypeId.SearchTags)\n return options;\n\n const normalizedItemData = options.data.content.data.map(x => ({\n id: x.name,\n ...x\n }));\n\n options.data = {\n ...options.data,\n content: {\n ...options.data.content,\n data: normalizedItemData\n }\n };\n\n return options;\n}","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { WidgetFilter, WidgetSearchItem, WidgetSearchResults } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { UseProductsResponse } from 'libs/shared/hooks/UseProducts';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { SearchResultsFilterHelper } from '../../utils/SearchResultsFilterHelper';\nimport { useTransformer } from '../useTransformer';\n\nimport { SearchResultsTransformOptions } from './interfaces/SearchResultsTransformOptions';\nimport { WidgetSearchItemTransformOptions } from './interfaces/WidgetSearchItemTransformOptions';\nimport { mergeSearchResults } from './transformations/results/mergeSearchResults';\nimport { transformSearchRelevantTopics } from './transformations/widget-item/transformSearchRelevantTopics';\nimport { transformSearchTags } from './transformations/widget-item/transformSearchTags';\n\ninterface UseGetSearchResultsOptionsV2 {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n products: UseProductsResponse;\n settings: SettingsHash;\n hasDataLoaded: boolean;\n exchangeLibraryId: string;\n showExchangeSearchResults: boolean;\n availablePresentations: Presentation[];\n}\n\nconst namespace = 'search.useGetSearchResultsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useGetSearchResultsV2(options: UseGetSearchResultsOptionsV2) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n const searchResultsTransformer = useTransformer<SearchResultsTransformOptions>([\n mergeSearchResults\n ]);\n \n const widgetItemTransformer = useTransformer<WidgetSearchItemTransformOptions>([\n transformSearchTags,\n transformSearchRelevantTopics\n ]);\n\n /**\n * Apply tranformations to the search response\n */\n function transformSearchResults(data: WidgetSearchItem[]): WidgetSearchItem[] {\n if (!data || !data.length)\n return data;\n\n const searchResults = searchResultsTransformer.execute({ data });\n \n return searchResults.data.map(item => {\n const transformOptions: WidgetSearchItemTransformOptions = {\n data: item,\n availablePresentations: options.availablePresentations,\n query: options.queryParams?.query || ''\n };\n\n const transformed = widgetItemTransformer.execute(transformOptions);\n\n return transformed.data;\n }, [] as WidgetSearchItem[]);\n }\n\n function getDataFromResponse() {\n if (searchResults.isFetching || !items?.length)\n return [];\n\n return items.reduce((outer, widget) => {\n return widget.content.data.reduce((inner, video) => ([ ...inner, video ]), outer);\n }, []);\n }\n\n function getSearchRequest(cursor?: string): Flight.Request {\n if (!options.hasDataLoaded || !appliedIndices?.length) return;\n\n const widgetsFilter: WidgetFilter[] =\n SearchResultsFilterHelper.getActiveWidgetFilters(queryParams, cursor);\n\n return SharedSearchRequests.searchV5(\n queryParams.query,\n backendFilters,\n widgetsFilter\n );\n }\n\n function fetchNext(cursor?: string) {\n return fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(getPhrase('error'));\n }\n\n /**\n * Gets the widget cursor and widgetTypeId.\n * The returned string is a stringified object of\n * those both.\n */\n function getCursor(response: WidgetSearchResults): string {\n const responseWidgets = [...response.widgets];\n\n if (!responseWidgets.length) {\n return;\n }\n\n const lastWidget = ArrayHelper.last(responseWidgets);\n\n if (lastWidget?.content?.cursor) {\n const cursorContext = {\n widgetTypeId: lastWidget.widgetId,\n cursor: lastWidget?.content?.cursor\n };\n return JSON.stringify(cursorContext);\n }\n\n return;\n }\n\n const searchResults = useInfiniteList<WidgetSearchItem, WidgetSearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.widgets,\n getCursor\n );\n\n const items = transformSearchResults(searchResults.items);\n \n const objects = getDataFromResponse();\n useVideoMixin(objects);\n\n return {\n ...searchResults,\n items,\n fetchNext\n };\n}","import { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { MixedWidgetSearchResultsProps } from 'libs/shared/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults';\nimport { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport type { AudienceFilterParams, BaseObject, Classification, Company, Folder, GetClassificationAppLinkOptions, Playlist, VideoTypes } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ClassificationAppLinkHelper } from 'shared/utils/ClassificationAppLinkHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { getFolderAppLink } from 'apps/libraries/views/library-folder/LibraryFolderViewUtils';\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { SearchResultsFilterHelper } from './SearchResultsFilterHelper';\n\ninterface GetSeeMoreAppLinkOptions {\n appLinks: MixedWidgetSearchResultsProps['widgetAppLinks'];\n widget: WidgetSearchItem;\n queryParams: HashObject;\n data: WidgetSearchItem[];\n}\n\nfunction hasMoreContent(widget: WidgetSearchItem): boolean {\n return !!widget.content.cursor;\n}\n\nexport const SearchResultsAppLinkHelper = {\n getSearchWidgetAppLinks(\n queryParams: HashObject,\n audienceParams: AudienceFilterParams = {}\n ): MixedWidgetSearchResultsProps['widgetAppLinks'] {\n return {\n classification: (classification?: Classification) => {\n const options: GetClassificationAppLinkOptions = {\n ...audienceParams,\n moviesAndTv: TopicsHelper.isMtv(classification)\n };\n\n return ClassificationAppLinkHelper.getAppLink(classification, options);\n },\n \n videoType: (video: VideoTypes, opts: GetVideoAppLinkOptions) => (\n VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n includeContext: false\n })\n ),\n \n series: SeriesAppLinkHelper.getSeriesAppLink,\n \n playlist: (playlist: Playlist) => ({\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ playlist.id, TextHelper.slugify(playlist.name) ]\n }),\n \n \n company: (company: Company) => ({\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.COMPANY_DASHBOARD,\n args: [ company.id, TextHelper.slugify(company.name) ]\n }),\n \n folder: (folder: Folder, opts?: {libraryId?: string}) => {\n if (!opts?.libraryId) {\n return {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ folder.id, TextHelper.slugify(folder.name) ]\n };\n }\n \n return getFolderAppLink(opts?.libraryId, folder, null);\n },\n \n searchSettings: () => ({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.SEARCH_SETTINGS\n }),\n \n searchHome: (filterParams?: HashObject, options?: {replace: boolean}) => {\n let params: HashObject = { ...filterParams };\n \n if (!options?.replace) {\n params = {\n ...queryParams,\n ...params\n };\n }\n \n return ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n // This empty args array needs to be here otherwise FixedWidget will try to\n // populate it with some junk that'll break the query params.\n // This is tech debt that needs to be cleaned up.\n args: [],\n params\n });\n },\n\n tag: (tag: BaseObject) => {\n let tagOrClassification: string[] =\n SearchResultsFilterHelper.getSelectedTagOrClassification(queryParams).map(x => x.name);\n \n if (tagOrClassification.includes(tag.name)) {\n tagOrClassification = tagOrClassification.filter(x => x !== tag.name);\n } else {\n tagOrClassification.push(tag.name);\n }\n\n return ({\n action: Actions.Search.HOME,\n application: AppChannels.SEARCH,\n params: {\n ...queryParams,\n tagOrClassification\n }\n });\n }\n };\n },\n \n getSeeMoreAppLink(options: GetSeeMoreAppLinkOptions): Core.AppLink {\n if (!hasMoreContent(options.widget))\n return;\n \n const getAppLinkFunc = WidgetTypeIdConfig[options.widget.widgetId]?.getCollectionAppLink;\n \n if (!getAppLinkFunc || SearchResultsFilterHelper.isOnlyActiveWidget(options.widget.widgetId, options.queryParams))\n return;\n \n /**\n * If its the only widget search result item rendered we infinitely\n * load the widget (if we can) therefore we need to hide 'See all' applink\n * - Nish\n */\n if (options.data.length === 1 && options.data[0].widgetId === options.widget.widgetId)\n return;\n \n return getAppLinkFunc(options.appLinks);\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedWidgetSearchResults } from 'libs/shared/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\n\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\nimport { useFetchSearchDataV2 } from 'apps/search/hooks/useFetchSearchData';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { PartialSearchResults } from './components/partial-loading/PartialSearchResults';\nimport { SearchResultsEmptyState } from './components/search-results-empty-state/SearchResultsEmptyState';\nimport { SearchResultsRequestVideo } from './components/search-results-request-video/SearchResultsRequestVideo';\nimport { useGetSearchResultsV2 } from './hooks/use-get-search-results/useGetSearchResultsV2';\nimport { useCurriculumCodeSearch } from './hooks/useCurriculumCodeSearch';\nimport { SearchResultsAppLinkHelper } from './utils/SearchResultsAppLinkHelper';\nimport { SearchResultsFilterHelper } from './utils/SearchResultsFilterHelper';\n\nexport const namespace = 'search.searchResultsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewV2Props {\n queryParams: HashObject\n}\n\nexport function SearchResultsViewV2(props: SearchResultsViewV2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n const [activeAudiences] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: queryParams.moviesAndTv\n });\n const isTertiary = useIsTertiary();\n\n /**\n * Data required for search view to render\n */\n const searchData = useFetchSearchDataV2(queryParams);\n\n /**\n * Filters to be applied globally or on indices\n */\n const searchFilters = SearchHelper.getBackendFiltersV2(searchData);\n\n /**\n * Actually fetch the search results with the filters\n */\n const searchResults = useGetSearchResultsV2({ ...searchFilters, ...searchData });\n\n /**\n * Update the search bar UI when we detect that a curriculum code has been searched for\n */\n useCurriculumCodeSearch(searchResults, queryParams);\n\n /**\n * State of the current filters\n */\n const filters = SearchHelper.getFilters({\n data: searchData,\n inaccessibleIndices: searchFilters?.inaccessibleIndices,\n _hasNewSearch: true\n });\n \n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n const hideDivider = (\n (!searchResults.hasFirstPageCompleted && searchResults.isFetching) ||\n (hasResults && !!searchResults.items.find(item => item.widgetId === WidgetTypeId.SearchTags))\n );\n\n const widgetAppLinks = SearchResultsAppLinkHelper.getSearchWidgetAppLinks(\n queryParams,\n AudienceHelper.getAudienceParams(activeAudiences)\n );\n \n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n hideDivider={hideDivider}\n _hasNewSearch\n />\n )}\n\n {(() => {\n if (!searchResults.hasFirstPageCompleted && searchResults.isFetching) {\n return <PartialSearchResults />;\n }\n\n if (!hasResults) {\n return (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={searchData.currentUser.data?.contentRegion === ContentRegion.SCOT}\n hideRequestVideo={searchData.isLearner}\n />\n );\n }\n\n return (\n <section>\n <VideoActionsContext.Provider value={videoActions}>\n <MixedWidgetSearchResults\n data={searchResults.items}\n widgetAppLinks={widgetAppLinks}\n audiences={searchData.audiences.data}\n availablePresentations={searchData.availablePresentations}\n currentUser={searchData.currentUser.data}\n isTertiary={isTertiary}\n \n getSeeMoreLink={widget => SearchResultsAppLinkHelper.getSeeMoreAppLink({\n widget,\n queryParams,\n data: searchResults.items,\n appLinks: widgetAppLinks\n })}\n hasPermissions={searchData.hasPermissions}\n hasLocalPermissions={searchData.hasLocalPermissions}\n commonVideoProps={commonVideoProps}\n getAnalyticsData={(widget, yIndex, xIndex) => ({\n widgetId: widget.widgetId,\n widgetName: widget.name,\n templateId: widget.templateId,\n widgetIndex: yIndex,\n itemIndex: xIndex,\n search: {\n query: queryParams.query || ''\n }\n })}\n getSelectedItems={widget =>\n SearchResultsFilterHelper.getSearchWidgetSelectedItems(queryParams, widget)\n }\n />\n \n {(!searchData.isLearner && !searchResults.isFetching && !searchResults.nextCursor) &&\n <SearchResultsRequestVideo />\n }\n \n {(searchResults.hasMore || searchResults.isFetching) &&\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll={true}\n />\n }\n </VideoActionsContext.Provider>\n </section>\n );\n })()}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\n\nimport { useGetSearchResultsV2 } from './use-get-search-results/useGetSearchResultsV2';\n\nexport function useCurriculumCodeSearch(\n searchResults: ReturnType<typeof useGetSearchResultsV2>,\n queryParams: HashObject\n) {\n React.useEffect(() => {\n if (!searchResults.hasFirstPageCompleted)\n return;\n \n const curriculumCodeWidget = searchResults.items.find(widget => {\n return widget.widgetId === WidgetTypeId.SearchCurriculumCode;\n });\n \n const hasSearchedCode = !!curriculumCodeWidget?.content?.name && !!curriculumCodeWidget?.content?.description;\n \n if (queryParams?.[SEARCH_CURRICULUM_CODE_PARAM] && !hasSearchedCode) {\n Core.AppLinkHelper.trigger({\n ...Core.AppLinkHelper.getCurrentAppLink(),\n params: {\n ...((Core.AppLinkHelper.getCurrentAppLink().params || {}) as HashObject),\n [SEARCH_CURRICULUM_CODE_PARAM]: undefined\n }\n }, { replace: true });\n return;\n }\n \n if (!queryParams?.[SEARCH_CURRICULUM_CODE_PARAM] && hasSearchedCode) {\n Core.AppLinkHelper.trigger({\n ...Core.AppLinkHelper.getCurrentAppLink(),\n params: {\n ...((Core.AppLinkHelper.getCurrentAppLink().params || {}) as HashObject),\n [SEARCH_CURRICULUM_CODE_PARAM]: true\n }\n }, { replace: true });\n }\n }, [searchResults.hasFirstPageCompleted]);\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { SearchResultsView } from '../search-results/SearchResultsView';\nimport { SearchResultsViewV2 } from '../search-results-v2/SearchResultsViewV2';\n\ninterface SearchResultsView2Props {\n queryParams: HashObject;\n}\n\n/**\n * Staging View until we migrate to new search results page completely\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function LiteSearchResultsView(props: SearchResultsView2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n const { hasNewSearch } = useSettings(null);\n\n if (hasNewSearch) {\n return <SearchResultsViewV2 queryParams={queryParams} />;\n }\n\n return <SearchResultsView queryParams={queryParams} />;\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { Rating } from 'libs/shared/interfaces';\n\nexport const RatingRequests = {\n ratings(countryCode?: string): Flight.PublicRequest {\n return {\n url: '/api/domain/v2/me/ratings',\n publicUrl: UrlHelper.urlBuilder('/api/domain/v2/me/ratings', { countryCode }),\n key: 'ratings',\n // v2/me/ratings doesn't support `query={orderby:value}`. Adding this due to time constraints\n formatData: (ratings: Rating[]) => {\n return ratings.sort((a, b) => a.value - b.value);\n }\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}"],"names":["CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","SCROLL_TOLERANCE","useInfiniteList","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","FeedbackOption","getFolderAppLink","libraryId","folder","sort","application","action","args","name","params","getFolderBgColourClass","charCode","i","charCodeAt","CompanyWidgetItem","props","analyticsData","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","coverBgColor","metadata","colour","CompanyResult","Col","as","sm","md","useLargeStyle","lg","className","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","v","VideoItem","video","getVideoAppLink","presentationAudiences","audiences","hasPermissions","commonVideoProps","FeaturedVideoResult","HeroVideo","opts","hideInteractiveBadge","showVideoGuidance","VideoHelper","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","imageCdnUrl","currentUser","showOwner","videoAnalyticsData","videoId","videoName","size","hideVideoGuidance","LargePlaylistResult","getPlaylistAppLink","preloadImage","SeriesWithVideos","series","seriesAnalyticsOption","seriesAnalyticsData","seriesAppLink","SeriesTallPoster","imageClass","LargeSeriesResult","getSeriesAppLink","CollectionVideoList","analyticsProps","hasSeasonEpisode","episodeNumber","season","collectionId","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","collection","firstVideoWithThumbnail","find","thumbnail","isSeries","collectionType","BaseImage","imageType","Mask","type","maskType","ImageFallback","imageFallbackType","isPlugin","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","highlightOnHover","showNewVideoIndicator","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","role","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","allowSubstitute","SearchSuggestions","suggestions","suggestion","defaultProps","useFetchSchoolLevels","presentation","isLearner","usePermissions","PermissionName","usePresentation","hasPresentationsLoaded","presentationIds","o","SearchRequests","SearchOGQL","classification","TagType","clip","interactive","company","category","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","stringifyObject","Object","entries","prev","value","stringifiedValue","includes","searchV5","filters","widgets","widgetData","w","filterData","FilterConstants","indicesFilter","genericFilters","indices","includeAllIndices","ogql","publicUrl","HttpVerbs","formatData","curriculumSearchWidget","widgetId","WidgetTypeId","searchV4","indicesArr","keys","filterName","join","excludeLibraryExclusive","searchType","undefined","success","error","assign","UrlHelper","tagsAndClassifications","normalize","TEACHER_FILTERS","STUDENT_FILTERS","useGetLibraries","UserRequests","products","settings","useSettings","streamableLibrary","LibraryRequests","streamableLibraryId","objectId","showExchangeSearchResults","hasProduct","ProductId","librariesRequest","isAuthenticated","libraries","exchangeLibraryIndex","findIndex","l","MasterObjectTypes","exchangeLibraryId","streamableIndex","hasLibrariesCompleted","useGetRatings","ratings","RatingRequests","countryCode","activePresentation","getFallbackPresentation","currentPresentation","TopicsHelper","learningLevel","PresentationLearningLevel","code","useFetchSearchData","userDetails","config","ConfigRequests","yearGroups","CustomerRequests","customerId","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","hasLocalPermissions","canUseSeriesActions","hasCustomLibraries","hasMoviesAndTv","presentationId","isStudent","rawFilters","FilterHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","hasFilteredOutTopics","shouldFetch","sortedResults","a","b","presentationA","presentationB","useSearchTopics","availablePresentationIds","p","hasFilteredOutCompanies","useSearchCompanies","moviesAndTvDashboard","targetType","dashboard","hasDataLoaded","isLoadingProducts","isLoadingSettings","useGetSearchResults","appliedIndices","backendFilters","alerts","fetch","searchResultsResponse","getSearchRequest","hasExchangeLibraryFilter","some","hasLibraryFilter","fetchMixedExchangeResults","mixedExchangeSearchResults","excludeLibraryFilter","searchResults","pageNumber","httpStatus","LanguageService","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","typeId","MasterType","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","useSearchMask","showMask","setShowMask","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","getPhrase","SearchResultsView","videoActions","useVideoActions","useCommonVideoProps","locationContext","mtv","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","InfiniteScrollFooter","fetchOnScroll","SearchWidgetTooltip","isTertiary","SvgContainer","svgName","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","getName","widget","getWidgetMetadata","curriculumLeafName","content","curriculumLeafDescription","MixedWidgetSearchResults","idx","WidgetContainerView","widgetCollection","widgetIndex","templateId","widgetTypeId","widgetAppLinks","seeMoreLink","getSeeMoreLink","getAnalyticsData","xIndex","badgeComponent","getSelectedItems","isPreviewing","onClickRemoveItem","PartialSearchResults","PartialTagSlidingListWidgetTemplate","hideDescription","PartialWidgetHeader","PartialThumbnailVerticalListWidgetTemplate","PartialThumbnailFixedListMediaSmallWidgetTemplate","SearchResultsRequestVideo","skipBeforeRequestingVideoStep","selectedOption","hideRequestVideo","SupportedSearchWidgetTypeIds","hasQueryParam","targetParam","SearchResultsFilterHelper","isOnlyActiveWidget","getActiveWidgetFilters","cursorContext","context","parsed","JSON","parse","getCursorContext","focusedWidget","focus","getValidFocusedWidget","ArrayHelper","getWidgetIdsFromQueryParams","getSelectedTagOrClassification","tagOrClassification","tag","getSearchWidgetSelectedItems","useTransformer","transformations","middleware","fn","useSync","execute","goSync","mergeSearchResults","groupedWidgets","mergedWidgets","values","currentMergedWidget","transformSearchRelevantTopics","sortByLearningLevel","relevantTopicsData","remainingTopicsData","exactMatchSortedTopics","remainingSortedTopics","topic","MasterTypeHelper","sortedItem","transformSearchTags","normalizedItemData","x","SearchResultsAppLinkHelper","getSearchWidgetAppLinks","audienceParams","ClassificationAppLinkHelper","videoType","VideoAppLinkHelper","includeContext","SeriesAppLinkHelper","TextHelper","searchHome","filterParams","getSeeMoreAppLink","getAppLinkFunc","WidgetTypeIdConfig","getCollectionAppLink","SearchResultsViewV2","activeAudiences","SharedViewModelKeys","storage","useIsTertiary","useFetchSearchDataV2","searchResultsTransformer","widgetItemTransformer","widgetsFilter","responseWidgets","lastWidget","stringify","transformOptions","objects","outer","inner","useGetSearchResultsV2","curriculumCodeWidget","hasSearchedCode","useCurriculumCodeSearch","_hasNewSearch","hideDivider","AudienceHelper","yIndex","widgetName","contentRegion","ContentRegion","LiteSearchResultsView","hasNewSearch","redirectOnError","videoIds","getValidObjects","ids","flightNamespace"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7601],{5798:(e,t,n)=>{n.d(t,{b:()=>l});var a=n(32735);const r={globalIdpButton:"tAlj0",globalIdpImage:"O94yo"};function i(e){var t=e.idp,n=e.onClick,i=e.backgroundColour,c=void 0===i?"F8981D":i,l=e.foregroundColour,o=void 0===l?"FFF":l,u=e.last,s=e.isGlobalIdp,d=u?"":"mb-3",m={backgroundColor:"#".concat(t.backgroundColour||c),color:"#".concat(t.foregroundColour||o)},p=s?"btn btn-lg btn-outline-dark w-100 ".concat(d," ").concat(r.globalIdpButton):"btn btn-lg w-100 ".concat(d),g=s?{}:m,b=s?"Continue with ".concat(t.name):t.name;return a.createElement("button",{className:p,style:g,onClick:function(){return n(t)}},s&&t.logoUrl&&a.createElement("img",{src:t.logoUrl,className:r.globalIdpImage,alt:"".concat(t.name," logo")}),b)}const c={divider:"FfyN0"};function l(e){if(!e.idps.length)return a.createElement(a.Fragment,null);function t(t){var n=window.location.pathname+window.location.search,a="/challenge?idp=".concat(t.id)+"&redirectUrl="+encodeURIComponent(n);"attribution"in e&&(a+="&attribution="+encodeURIComponent(e.attribution)),window.location.href=a}return a.createElement("div",{className:"".concat(e.className?e.className:"")},a.createElement("div",{className:"my-3 border-bottom position-relative ".concat(c.divider)}),e.idps.map((function(n,r){return a.createElement(i,{key:r,idp:n,onClick:"onClick"in e?e.onClick:t,attribution:"attribution"in e?e.attribution:null,isGlobalIdp:!0})})))}},53475:(e,t,n)=>{n.d(t,{N:()=>a});var a={globalIdps:function(e,t){return{url:"{gateway}/v1/auth/identity-providers?countryCode=".concat(e,"&product=").concat(t),key:"global:idps"}}}},48015:(e,t,n)=>{n.d(t,{M:()=>l});var a=n(39202),r=n(20354),i=n(39151),c={countryCode:"us",isFallback:!0};function l(){var e,t,n=r.a.useBasicFetch(i.L.geoLocation()),l=null===(t=null===(e=a.Ab.GetQuery())||void 0===e?void 0:e.countryCode)||void 0===t?void 0:t.toLowerCase();return l?{countryCode:l}:n.hasCompleted&&!n.data?c:n.data}},19623:(e,t,n)=>{n.d(t,{P:()=>g});var a=n(32735),r=n(81886),i=n(23481),c=n(5798),l=n(98027),o=n(15611),u=n(83345),s=n(14070),d=n(97291),m="launchpad.signInButtons",p=i.T.encloseNamespace(m);function g(e){a.useEffect((function(){e.skipPrompt&&r.Q.Ab.PageLoad(r.Q.C$.getHref(t))}),[]);var t=function(){var t=r.Q.Ab.GetQuery(),n={};if(e.customerId&&(n.customerId=e.customerId,delete t.customerId),e.skipPrompt&&delete t.skipPrompt,e.redirectUrl)n.redirectUrl=e.redirectUrl;else{var a=r.Q.Ab.SerializeQueryParams(t);n.redirectUrl=r.Q.Ab.GetCurrentPath()+(a?"?"+a:"")}return e.showSignUp&&(n.showSignUp=!0),{application:d.O.DEFAULT,action:s.e.Default.CHALLENGE,params:n}}();return a.createElement(a.Fragment,null,a.createElement(o.F,{className:"btn btn-lg btn-dark w-100 mt-4",appLink:t},a.createElement(u.x,{namespace:m,phrase:e.pageAppLinkString?"signInToWatch":"signIn"})),e.showJoinCode?a.createElement(o.F,{className:"btn btn-link info-link btn-lg w-100 mt-2",appLink:{application:d.O.LAUNCHPAD,action:s.e.Launchpad.JOIN_CLASSROOM_PROMPT}},p("enterCode")):a.createElement(a.Fragment,null,a.createElement(o.F,{className:"btn btn-lg btn-outline-dark w-100 mt-3",appLink:{application:d.O.LAUNCHPAD,action:s.e.SignUp.SIGN_UP,params:{pageAppLinkString:e.pageAppLinkString}}},p("signUp")),a.createElement(c.b,{idps:e.globalIdps,attribution:(0,l.w)()})))}},77601:(e,t,n)=>{n.r(t),n.d(t,{ShareLinkSignInView:()=>E});var a=n(32735),r=n(23481),i=n(20354),c=n(65858),l=n(64249),o=n(2786),u=n(26339),s=n(4594),d=n(12754),m=n(53475),p=n(48015),g=n(97027),b=n(7179),f=n(19623),h=n(75608),v=n(408);const y={logo:"Nbzoq",container:"hKyDn"};var C="launchpad.shareLinkSignIn";function E(e){var t=e.shareId,n=e.redirectUrl,E=e.customerId,I=(0,h.a)(t),k=(0,b.P)(function(e,t){return{id:null==t?void 0:t.id,app:(0,b.e)(null==t?void 0:t.typeId),shareId:e}}(t,I),c.LZ.Launchpad),U=k.deepLink,P=k.showDeepLink,L=k.onClickDeepLink,w=(0,v.B)().trialAppLinkString,N=(0,p.M)(),S=i.a.useBasicFetch((null==N?void 0:N.countryCode)&&m.N.globalIdps(N.countryCode,d.x.Primary));return I&&S.hasCompleted?a.createElement(g.Zf,{title:I.name,imageUrl:l.I.getImageUrl(I),objectType:I.typeId,links:[{text:r.T.getPhrase(C,"openInApp"),url:U,hide:!P,onClick:L}]},a.createElement("div",{className:"".concat(y.container," m-auto")},a.createElement("div",{className:"".concat(y.logo," mb-4 mx-auto")},a.createElement(o.$S,null)),!!I.name&&a.createElement("h1",{className:"h3"},I.typeId===s.E.Video&&a.createElement(u.$,{type:"series",video:I,analyticsOptions:{},size:"sm"}),I.name),"description"in I&&a.createElement("p",{className:"mb-0 clamp-3"},I.description),a.createElement(f.P,{globalIdps:S.data,customerId:E,redirectUrl:n,skipPrompt:!1,showJoinCode:!1,pageAppLinkString:w,showSignUp:!0}))):a.createElement(a.Fragment,null)}},75608:(e,t,n)=>{n.d(t,{a:()=>p});var a=n(20354),r=n(30439),i=n(4594),c=n(21750),l=n(43012),o=n(20768),u=n(5112),s=n(60011),d=n(31949),m=n(1575);function p(e){var t=a.a.useBasicFetch(d.N.currentUser()),n=a.a.useBasicFetch(r.o.getShareObject(e)),p=function(){if(!n.data||!t.data)return null;switch(n.data.objectTypeId){case i.E.Video:return m.R.publicVideo(n.data.objectId,e);case i.E.Clip:return l.e.publicClip(n.data.objectId,e);case i.E.Interactive:return o.b.publicInteractiveMetadata(n.data.objectId,e);case i.E.Playlist:return u.C.getSharedPlaylist(n.data.objectId,e);case i.E.Subject:return c.x.classification(n.data.objectId,t.data.id);case i.E.Series:return s.J.sharedSeries(n.data.objectId,e)}}();return a.a.useBasicFetch(p).data}},408:(e,t,n)=>{n.d(t,{B:()=>c});var a=n(2948),r=n(86702);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(){var e,t,n=(e=(0,a.D)(r.y.OPEN_IN_APP_DATA),t=1,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,c,l=[],o=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];return{trialAppLinkString:function(){if(n&&["videos","clips","series","playlists","topics","interactives"].includes(n.app)){var e=n.id;switch(n.app){case"videos":return"video:".concat(e);case"playlists":return"playlist:".concat(e);case"series":return"series:".concat(e);case"topics":return"topic:".concat(e);case"interactives":return"interactive:".concat(e);case"clips":return"clip:".concat(e)}}}()}}},97027:(e,t,n)=>{n.d(t,{Hq:()=>d,Zf:()=>g});var a=n(32735),r=n(54610),i=n(4594),c=n(67453),l=n(99742);const o={left:"vIypY",leftTextImage:"YViNj",right:"MkD4u",blur:"X6mCh",imageContainer:"bc7kz",imagePosition:"JOhEj",image:"Ef2QR",thumbnail:"Gdurb",tallposter:"fjVNK",cover:"o3j31",linksContainer:"AT9Dk"};function u(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,c,l=[],o=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var d=[{bgUrl:l.W.LaunchPad.BG_1},{bgUrl:l.W.LaunchPad.BG_2},{bgUrl:l.W.LaunchPad.BG_3},{bgUrl:l.W.LaunchPad.BG_4},{bgUrl:l.W.LaunchPad.BG_5}],m=[{bgUrl:l.W.LaunchPad.PRODUCT.BG_1},{bgUrl:l.W.LaunchPad.PRODUCT.BG_2},{bgUrl:l.W.LaunchPad.PRODUCT.BG_3},{bgUrl:l.W.LaunchPad.PRODUCT.BG_4},{bgUrl:l.W.LaunchPad.PRODUCT.BG_5},{bgUrl:l.W.LaunchPad.PRODUCT.BG_6},{bgUrl:l.W.LaunchPad.PRODUCT.BG_7},{bgUrl:l.W.LaunchPad.PRODUCT.BG_8},{bgUrl:l.W.LaunchPad.PRODUCT.BG_9}];function p(e){switch(e){case i.E.Video:case i.E.Interactive:case i.E.Clip:return o.thumbnail;case i.E.Subject:case i.E.Playlist:return o.cover;case i.E.Series:return o.tallposter;default:return""}}function g(e){var t,n=u(a.useState(!1),2),i=n[0],l=n[1],s=u(a.useState(""),2),d=s[0],g=s[1],b=c.j.createUrl(e.imageUrl,{size:r.h2.Large}),f=m;return a.useEffect((function(){if(!b&&f&&0!==f.length){var e,t=(e=f)[Math.floor(Math.random()*e.length)];t.bgUrl&&g(t.bgUrl)}}),[]),a.useEffect((function(){if(b){var e=new Image;return e.onload=function(){return l(!0)},e.src=b,function(){return e.onload=null}}}),[]),a.createElement("div",{className:"d-flex"},e.leftComponent?e.leftComponent():a.createElement("div",{className:"".concat(o.left," ").concat(d?"bg-blue d-flex align-items-center":"bg-light")},d?a.createElement("img",{className:"img-fluid",src:d,draggable:!1}):i&&a.createElement(a.Fragment,null,a.createElement("div",{className:o.blur,style:{backgroundImage:"url('".concat(b,"')")}}),a.createElement("div",{className:"".concat(o.imageContainer," ").concat(p(e.objectType))},a.createElement("div",{className:o.imagePosition},a.createElement("img",{className:o.image,src:b,alt:e.title}))))),a.createElement("div",{className:"".concat(o.right," bg-white d-flex flex-column")},a.createElement("div",{className:"position-absolute d-flex align-items-center ".concat(o.linksContainer)},null===(t=e.links)||void 0===t?void 0:t.map((function(e,t){return e.hide?a.createElement(a.Fragment,{key:t}):a.createElement("a",{key:t,href:e.url,className:"info-link fw-semibold",onClick:e.onClick},e.text)}))),e.children))}}}]);
|
|
2
|
-
//# sourceMappingURL=7601-b439c82e82-lite.chunk.js.map
|