{"version":3,"file":"js/294-b48b81c7f5a54114fb7c.js","mappings":"mKAAO,MAAMA,EAA2B,CACtC,mBACA,kBACA,uBACA,eACA,mBACA,mBAGWC,EAAyBA,CAACC,EAAMC,KAC3C,IAAIC,EAAOF,EAAKG,YAAcH,EAAKE,KACnC,IAAKD,EACH,MAAQ,IAAGC,IAKb,OAFED,EAASG,SAAWN,EAAyBO,SAASL,EAAKM,kBAAoBL,EAASG,QAAW,IAAGF,GAEvF,EAINK,EAAgCC,IAC3C,GAAIA,EAAIC,mBACN,MAAQ,WAAUD,EAAIC,qBAGxB,MAAMP,EAAOM,EAAIR,KAAKU,aAAeF,EAAIR,KAAKE,KAS9C,OANEM,EAAIJ,SAAWN,EAAyBO,SAASG,EAAIG,mBACjDH,EAAIJ,QAAQQ,WAAW,QACrBJ,EAAIJ,QACH,WAAUI,EAAIJ,UAChB,IAAGF,GAEO,C,iICPZ,MAAMW,EAAkBA,EAAGC,WAAUC,YAAWC,SAAQC,YAAWC,wBAAuBC,MAC/F,MAAMC,EAAML,EAAY,MAAQ,SAEhC,OACEM,EAAAA,cAACD,EAAGE,OAAAC,OAAA,CACFN,WAAWO,EAAAA,EAAAA,GACT,2IACAR,EAAS,4EAA8E,WACvFD,EAAY,cAAgB,iBAC5BE,IAEEE,GACHJ,GAAaM,EAAAA,cAACI,EAAAA,EAAoB,CAACR,UAAU,0BAA0BF,GACvED,EACAC,GACCM,EAAAA,cAAA,UAAQK,QAASR,GACfG,EAAAA,cAACM,EAAAA,EAAS,CAACV,UAAU,uBAGrB,EAIGW,EAAaA,EAAGd,WAAUY,UAASR,wBAC9CG,EAAAA,cAAA,OACEJ,UAAU,wGACVS,QAASA,GACRZ,EACDO,EAAAA,cAAA,UAAQK,QAASR,GACfG,EAAAA,cAACM,EAAAA,EAAS,CAACV,UAAU,uB,2MCrD3B,MAAMY,EAAYA,EAChBC,QACAC,gBACAC,mBACAC,SACAC,cAAa,EACbC,gBACAC,iBAAgB,MAEhB,MAAOC,EAAeC,IAAoBC,EAAAA,EAAAA,UAAST,IAC5CU,EAAeC,IAAoBF,EAAAA,EAAAA,WAAS,IAC5CG,EAAaC,IAAkBJ,EAAAA,EAAAA,UAAS,IACzCK,EAAoBP,EAAcQ,OAAS,EAEjD,OACExB,EAAAA,cAAAA,EAAAA,SAAA,KACGa,GACCb,EAAAA,cAACyB,EAAAA,GAAW,CACVC,KAAK,SACLC,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,EACZC,UAAW,IACXC,mBAAmB,SACnBC,mBAAoBnB,EACpBoB,MAAOb,EACPc,SAAWC,IACT,MAAMC,EAAW5B,EAAM6B,QAAQC,GAASA,EAAKC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBACvFvB,EAAiBoB,GACjBf,EAAec,EAAMK,OAAOP,MAAM,IAIxClC,EAAAA,cAAA,MAAIJ,UAAU,8BACXoB,EACEsB,QAAQC,GAAS3B,KAAYA,EAAO2B,KACpCG,MAAM,EAAGvB,GAAiBJ,EAAgBC,EAAcQ,OAAS,GACjEmB,KAAKJ,GACJvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,sBAAqBP,IAC1B3C,UAAU,OACVmD,QAASrC,EAAc1B,SAASuD,GAChCJ,SAAUA,KACRxB,GAAkBqC,GACZA,EAAUhE,SAASuD,GACdS,EAAUV,QAAQW,GAAaA,IAAaV,IAE5C,IAAIS,EAAWT,IAExB,EAEJW,MAAOtC,EAAU,GAAE2B,MAAS3B,EAAO2B,IAAS,KAAOA,QAK5DhB,IAAsBR,GACrBf,EAAAA,cAAA,UAAQK,QAASA,IAAMe,GAAkBD,GAAgBvB,UAAU,8BAChEuB,EAAgB,WAAa,WAGjC,EAIP,OAAegC,EAAAA,EAAAA,MAAK3C,G,wCCvEb,MAiCM4C,EAAgBA,EAAGC,WAAUC,YAAWC,uBAChC,qBAAXC,SAA2BH,KAChCC,IACAD,IACAE,EAAkBvE,SAAS,SAAWuE,EAAkBvE,SAAS,WAA0C,IAA7BuE,EAAkB/B,QAExFiC,EAAgBA,EAAGF,uBAC9BA,EAAkBvE,SAAS,YAA2C,IAA7BuE,EAAkB/B,OAiFhDkC,EAAgBA,EAEzBC,cACAC,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,eACAC,cACAC,cACAC,UACAC,gBACAd,YACAD,WACAgB,QACAC,eACAC,oBACAC,kBACAC,eAEFC,UAEoBC,IAAhBF,IAA2BA,EAAcpB,EAAW,EAAI,IAE5D,MAAMuB,EAlJqBC,GAC3BjB,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,mBAEA,IAAIc,EAAyBlB,GACzBjB,KAAKoC,GAAa,cAAaA,EAAQC,QAAQ,aAAc,UAC7DC,KAAK,QACTH,EAAyBA,EAA0B,IAAGA,KAA4B,KAClF,IAAII,EAA6BrB,GAC7BlB,KAAKwC,GAAe,kBAAiBA,QACrCF,KAAK,SACTC,EAA6BA,EAA8B,IAAGA,KAAgC,KAC9F,IAAIE,EAA0B7B,GAAmBZ,KAAK0C,GAAc,mBAAkBA,QAAcJ,KAAK,QACzGG,EAA0BA,EAA2B,IAAGA,KAA6B,KACrF,MAAME,EAAoBxB,EAAoB,oBAAsB,KAC9DyB,EAA2BxB,GAAmBpB,KAAK6C,GAAc,cAAaA,QAAcP,KAAK,QACjGQ,EAA6BzB,GAAcrB,KAAK+C,GAAS,mBAAkBA,QAAST,KAAK,QAC/F,MAAO,CACLH,EACAI,EACAE,EACAE,EACAC,EACAE,GAECnD,OAAOqD,SACPV,KAAK,QAAQ,EAoHAJ,CAAc,CAC5BjB,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,iBAGI4B,EAjHwBC,GAC9BjB,UACAV,cACAE,gBACAd,YACAD,WACAE,oBACAU,kBAEA,MAAM6B,EAAU,CACdC,KAAM9B,EACNW,UACAoB,OAAQ,CAAC,gBAAiB,YAAa,mBAGnCC,EAAcxC,EAAc,CAAEF,sBAGpC,GAFgBH,EAAc,CAAEC,WAAUC,YAAWC,uBAEtCW,EACb4B,EAAQI,kBAAoB,CAAChC,QACxB,GAAIb,GAAYC,EACjBc,IACF0B,EAAQK,aAA+B,KAAhB/B,EACvB0B,EAAQM,gBAAkB,MAE5BN,EAAQO,aAAe,CAAC/C,EAAUgD,IAAKhD,EAAUiD,KAAKtB,KAAK,UACtD,IAAIgB,GAAgB5C,EAGzB,OAAO,KAGT,OAAOyC,CAAO,EAiFQD,CAAiB,CACrC5B,cACAW,UACAV,cACAC,UACAC,gBACAd,YACAD,WACAE,sBAGgB,OAAdD,GAAwC,OAAlBsC,IAI1BA,EAAcnB,YAAcA,EAExBH,IACFsB,EAActB,aAAeD,GAG3BE,IACEqB,EAAchB,QAChBgB,EAAchB,QAAW,GAAEA,SAAeL,IAE1CqB,EAAchB,QAAUL,GAIxBC,WACKoB,EAAcS,oBACdT,EAAcO,cAGvBP,EAAcY,sBAAwB,GAEtC7C,EAAY8C,OAAOpC,EAAOuB,GAAec,MAAMC,IAC7CjC,EAAUiC,EAAe,IACzB,EAGSC,EAAwBA,CAACtD,EAAWY,KAC/C,IAAKZ,IAAcY,EAAa,OAAO,KAEvC,MAAM2C,GAAU3C,EAAY,GAAKA,EAAY,IAAM,EAC7C4C,GAAU5C,EAAY,GAAKA,EAAY,IAAM,EAE7C6C,EAAa,CAACzD,EAAUgD,IAAe,EAATO,EAAYvD,EAAUiD,IAAe,EAATO,GAC1DE,EAAiB,CAAC1D,EAAUgD,IAAe,EAATO,EAAYvD,EAAUiD,IAAe,EAATO,GAEpE,OAAOC,EAAWE,OAAOD,EAAe,ECrMpCE,GAAoBC,EAAAA,EAAAA,iBAEpBC,EAAeC,IACnBC,aACAA,oCAGIC,EAAY,sBACZC,EAAcJ,EAAaK,UAAUF,GACrC5D,EAAcyD,EAAaK,UAAUF,GAE9BG,EAAqBA,EAChCjI,WACAkI,oBACAC,eACAC,gBACAC,YACAC,OACAC,SACAC,aAEA,MAAM,MAAEC,IAAUC,EAAAA,EAAAA,MACXC,EAAUC,IAAenH,EAAAA,EAAAA,UAAS8G,IAClC3E,EAAUiF,IAAepH,EAAAA,EAAAA,UAAS+G,IAEzCM,EAAAA,EAAAA,YAAU,KACJL,IACFG,EAAYH,EAAQA,EAAQ,IAAME,GAClCE,EAAYJ,EAAQA,EAAQ,KAAO7E,GACrC,GACC,CAAC6E,IAEJ,MAAOM,IAAatH,EAAAA,EAAAA,UACA,qBAAXsC,OAAyB,IAAIiF,gBAAgBjF,OAAO6B,SAASoB,QAAU,IAAIgC,iBAE9EC,EAAeF,EAAUG,IAAI,UAAY,GACzCC,EAAgBvF,EAAWwF,SAASL,EAAUG,IAAI,YAAc,GAAK,KAErEG,EAAiBN,EAAUG,IAAI,aAC/BI,EAASD,GAAgBE,MAAM,KAAKrG,KAAKsG,GAAUC,WAAWD,KAC9DE,EAAmBJ,EACrB,CAAEzC,IAAKyC,EAAO,GAAIxC,IAAKwC,EAAO,IACN,qBAAjBK,aACPC,KAAKC,MAAMF,aAAaG,QAAQ,cAChC,KACEC,EAAmBhB,EAAUG,IAAI,cAAcK,MAAM,MAAQ,GAC7DS,EAAsBjB,EAAUG,IAAI,iBAAiBK,MAAM,MAAQ,GACnEU,EAAmBlB,EAAUG,IAAI,cAAcK,MAAM,MAAQ,CAAC,SAAU,OAAQ,WAChFW,EAA4D,SAAjCnB,EAAUG,IAAI,eACzCiB,EAAmBpB,EAAUG,IAAI,cAAcK,MAAM,MAAQ,GAC7Da,EAAcrB,EAAUG,IAAI,SAASK,MAAM,MAAQ,GACnDc,EAAiBtB,EAAUG,IAAI,WAAaO,WAAWV,EAAUG,IAAI,YAAc,GACnFoB,EAAqBvB,EACxBG,IAAI,gBACHK,MAAM,KACPrG,KAAKsG,GAAUC,WAAWD,MAGtB5E,EAAO2F,IAAY9I,EAAAA,EAAAA,UAASwH,GAAgB,KAC5CtE,EAAe6F,IAAoB/I,EAAAA,EAAAA,UAAS0H,IAC5CtF,EAAW4G,IAAgBhJ,EAAAA,EAAAA,UAASiI,IACpCjF,EAAaiG,IAAkBjJ,EAAAA,EAAAA,UAAS6I,IACxCnG,EAAmBwG,IAAwBlJ,EAAAA,EAAAA,UAASsI,IACpD3F,EAAsBwG,IAA2BnJ,EAAAA,EAAAA,UAASuI,IAC1DlG,EAAmB+G,IAAwBpJ,EAAAA,EAAAA,UAASwI,IACpD5F,EAAmByG,IAAwBrJ,EAAAA,EAAAA,UAASyI,IACpD5F,EAAmByG,KAAwBtJ,EAAAA,EAAAA,UAAS0I,IACpD5F,GAAcyG,KAAmBvJ,EAAAA,EAAAA,UAAS2I,IAC1Ca,GAASC,KAAczJ,EAAAA,EAAAA,UAAS4I,IAEhCc,GAAgBC,KAAqB3J,EAAAA,EAAAA,UAAS,CAAC,IAC/C4J,GAAmBC,KAAwB7J,EAAAA,EAAAA,UAAS,OACpD8J,GAAgBC,KAAqB/J,EAAAA,EAAAA,UAAS,OAC9CgK,GAAWC,KAAgBjK,EAAAA,EAAAA,UAAS,OACpCkK,GAAMC,KAAWnK,EAAAA,EAAAA,UAAS,OAC1BoK,GAAQC,KAAarK,EAAAA,EAAAA,UAAS,IAC9BsK,GAAYC,KAAiBvK,EAAAA,EAAAA,WAAS,IACtC+C,GAAayH,KAAkBxK,EAAAA,EAAAA,UAAS,IACxCyK,GAAoBC,KAAyB1K,EAAAA,EAAAA,WAAS,IACtD2K,GAASC,KAAc5K,EAAAA,EAAAA,WAAS,IAChC6K,GAAcC,KAAmB9K,EAAAA,EAAAA,WAAS,IAC1C+K,GAAgBC,KAAqBhL,EAAAA,EAAAA,UAAS,OAC9CiL,GAAoBC,KAAyBlL,EAAAA,EAAAA,WAAS,IACtDmL,GAAmBC,KAAwBpL,EAAAA,EAAAA,WAAS,IACpDqL,GAA2BC,KAAgCtL,EAAAA,EAAAA,WAAS,IACpEuL,GAASC,KAAcxL,EAAAA,EAAAA,YACxBiD,GAAUf,EAAc,CAAEC,WAAUC,YAAWC,sBAC/C0C,GAAcxC,EAAc,CAAEF,uBAG7BoJ,GAA2BC,KAAgC1L,EAAAA,EAAAA,UAAS,CAAEkK,KAAM,GAAIE,OAAQ,KACxFuB,GAAqBC,KAA0B5L,EAAAA,EAAAA,UAAS,CAAEkK,KAAM,GAAIE,OAAQ,KAC5EyB,GAAsBC,KAA2B9L,EAAAA,EAAAA,UAAS,CAAEkK,KAAM,GAAIE,OAAQ,KAErF/C,EAAAA,EAAAA,YAAU,KACR,MAAM0E,EAAaA,KACjB,MAAMzE,EAAY,IAAIC,gBAAgBjF,OAAO6B,SAASoB,QACtD2D,EAAqB5B,EAAUG,IAAI,cAAcK,MAAM,MAAQ,IAC/DqB,EAAwB7B,EAAUG,IAAI,iBAAiBK,MAAM,MAAQ,IACrEsB,EAAqB9B,EAAUG,IAAI,cAAcK,MAAM,MAAQ,CAAC,SAAU,OAAQ,YAClFuB,EAAsD,SAAjC/B,EAAUG,IAAI,gBACnC6B,GAAqBhC,EAAUG,IAAI,cAAcK,MAAM,MAAQ,IAC/DyB,GAAgBjC,EAAUG,IAAI,SAASK,MAAM,MAAQ,IACrDgB,EAASxB,EAAUG,IAAI,UAAY,IACnCsB,EAAiB7B,EAAWI,EAAUG,IAAI,WAAa,GAAK,MAE5D,MAAMG,EAAiBN,EAAUG,IAAI,aACrC,GAAIG,EAAgB,CAClB,MAAMC,EAASD,EAAeE,MAAM,KAAKrG,KAAKsG,GAAUC,WAAWD,KACnEiB,EAAa9B,EAAW,CAAE9B,IAAKyC,EAAO,GAAIxC,IAAKwC,EAAO,IAAO,KAC/D,CACAoB,EACE3B,EACGG,IAAI,gBACHK,MAAM,KACPrG,KAAKsG,GAAUC,WAAWD,MAG/B+C,IAAgB,EAAK,EAGjBkB,EAAkBC,IACtBjD,EAAaiD,EAAEC,QACfzC,GAAW,IACX2B,IAAqB,GACrBlD,aAAaiE,QAAQ,YAAahE,KAAKiE,UAAUH,EAAEC,QAAQ,EA0B7D,OAvBA5J,OAAO+J,iBAAiB,WAAYN,GACpCO,SAASD,iBAAiB,eAAgBL,GAE1CO,uBACQjK,OAAOkK,OAAOC,KAAKC,cAAc,UACvCxB,IAAsB,GACtBoB,SAASK,cAAc,IAAIC,YAAY,sBACzC,CAEAC,GAEK3F,GAAa/E,GAChB2K,MAAM,iCACHtH,MAAMuH,IACLA,EAASC,OAAOxH,MAAMyH,IACpBzB,GAAWyB,EAAK,GAChB,IAEHC,OAAOC,IACNC,QAAQD,MAAM,0BAA2BA,EAAM,IAI9C,KACL7K,OAAO+K,oBAAoB,WAAYtB,GACvCO,SAASe,oBAAoB,eAAgBrB,EAAe,CAC7D,GACA,KAEH3E,EAAAA,EAAAA,YAAU,KACR,MAAMiG,EAAe,CACnB7K,cACAC,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,gBACAC,eACAC,cACAC,WACAC,gBACAd,YACAD,WACAgB,SAGFX,EAAc8K,GAAe7H,IAC3B,MAAM,KAAEyE,EAAI,OAAEE,EAAM,OAAEtF,EAAM,QAAEyI,EAAO,KAAE1I,GAASY,EAE1C+H,EACJ9K,EACAC,EACAN,EACAO,EACAC,EACAC,GACAV,EAAUgD,IACVhD,EAAUiD,IACVnC,EACAF,EACAG,EAEF,IAAIsK,GAAY,EA8BhB,GA7BID,IAAiBzC,KACnB0C,GAAY,EACZjD,GAAe,GACfQ,GAAkBwC,GAClBrD,GAAQ,IACRS,IAAW,GACXc,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,IACjDwB,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,IAC3C0B,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,KAG1CtF,GAAQ4I,eAAe7D,GAAqB/E,EAAO4I,eACnD5I,GAAQ8B,WAAWmD,GAAkBjF,EAAO8B,WAC5C9B,GAAQ6I,gBAAgB1D,GAAanF,EAAO6I,gBAEhDtD,GAAUD,GAERD,GADEsD,GAAsB,IAAT5I,EACPqF,EAEC0D,GAAa,IAAIA,KAAa1D,IAEzCwB,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,IACjDwB,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,IAC3C0B,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,IAC5CkB,IAA6B,GAC7Bf,GAAc1F,EAAO,GAAK0I,GAC1B7C,IAAsB,GACtBE,IAAW,GAEP0C,EAAarK,SAAWkI,GAAmB,CAC7C,IAAI0C,EAMJ,GALIzD,GAAU,GAAKZ,GAAU,EAC3BqE,EAAUrE,GAAU,EACXY,EAAS,IAAMZ,GAAU,KAClCqE,EAAUrE,GAAU,QAEN/F,IAAZoK,EAAuB,CACzBpE,GAAWoE,GACX,MAAM3M,EAAQ,IAAI0L,YAAY,aAAc,CAAEV,OAAQ2B,IACtDvB,SAASK,cAAczL,EACzB,CACF,CAEAkK,IAAqB,GACR,IAATvG,GAAYvC,OAAOwL,SAAS,EAAG,GDvKhBC,GACvB5K,QACAD,gBACAd,YACAoH,UACA9G,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,eACAoE,WACA2D,eACAC,kBACA9H,kBAEA,MAAMgL,EAAc,IAAIzG,gBACpBpE,GAAO6K,EAAYC,IAAI,QAAS9K,GAChCD,GAAiBgE,GAAU8G,EAAYC,IAAI,SAAU/K,GACrDd,GAAW4L,EAAYC,IAAI,YAAa,CAAC7L,EAAUgD,IAAKhD,EAAUiD,KAAKtB,KAAK,MAC5ErB,EAAkBpC,QAAQ0N,EAAYC,IAAI,YAAavL,EAAkBqB,KAAK,MAC9EpB,EAAqBrC,QAAQ0N,EAAYC,IAAI,eAAgBtL,EAAqBoB,KAAK,MACvF1B,EAAkB/B,QAAQ0N,EAAYC,IAAI,YAAa5L,EAAkB0B,KAAK,MAC9EnB,GAAmBoL,EAAYC,IAAI,cAAerL,GAClDC,EAAkBvC,QAAQ0N,EAAYC,IAAI,YAAapL,EAAkBkB,KAAK,MAC9EjB,EAAaxC,QAAQ0N,EAAYC,IAAI,OAAQnL,EAAaiB,KAAK,MAC/DyF,GAASwE,EAAYC,IAAI,UAAWzE,GACpCxG,GAAagL,EAAYC,IAAI,cAAejL,EAAYe,KAAK,MAE3C,IAAIwD,gBAAgBjF,OAAO6B,SAASoB,QACxC2I,IAAI,UAAUF,EAAYC,IAAI,QAAS,QAErDpD,EACFC,GAAgB,GAIlBxI,OAAO6L,QAAQC,UACb,CAAEC,YAAaL,EAAYM,YAC3B,GACC,wBAAuBN,EAAYM,aACrC,ECgIGP,CAAU,CACR5K,QACAD,gBACAd,YACAY,cACAwG,WACA9G,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,gBACAoE,WACA2D,gBACAC,oBACA,GACF,GACD,CACD3H,EACAH,EACAE,EACAR,EACAC,EACAN,EACAQ,EACAC,GACAV,EACAa,GACAL,EACAG,MAGFsE,EAAAA,EAAAA,YAAU,KACR,MAAMkH,EAAqB,CACzB7K,QAAS,+CACTH,YAAa,KAGf,GAAIP,EACFuL,EAAmBvJ,kBAAoB,CAAChC,OACnC,KAAIZ,IAAac,EAItB,OAHAqL,EAAmBpJ,aAAgB,GAAE/C,EAAUgD,OAAOhD,EAAUiD,MAChEkJ,EAAmBtJ,aAA+B,KAAhB/B,CAGpC,CAEAoD,EAAYf,OAAO,GAAIgJ,GAAoB/I,MAAK,EAAG0E,WACjD,MAAMxK,EAASwK,EAAKsE,QAAO,CAACC,EAAKxQ,KAC/BA,EAAIyQ,WAAWC,SAAS9K,IACtB4K,EAAI5K,GAAW4K,EAAI5K,GAAW4K,EAAI5K,GAAW,EAAI,CAAC,IAE7C4K,IACN,CAAC,GACJ9E,GAAkBjK,EAAO,GACzB,GACD,CAACsD,KAEJqE,EAAAA,EAAAA,YAAU,KACR,IAAgB,IAAZsD,GAAmB,CACrB,MAAMiE,EAAUC,YAAW,KACzB,MAAMC,EAAsBC,eAAe1G,QAAQ,mBAAqB,EACxE0G,eAAeC,WAAW,kBAC1B1M,OAAOwL,SAAS,EAAGnG,SAASmH,EAAqB,IAAI,GACpD,KAEH,MAAO,IAAMG,aAAaL,EAC5B,IACC,CAACjE,KAEJ,MAMMuE,IAAeC,EAAAA,EAAAA,cAAY,KAC/BrG,EAAS,IACTI,EAAqB,IACrBC,EAAwB,IACxBC,EAAqB,CAAC,SAAU,OAAQ,YACxCC,GAAqB,GACrBC,GAAqB,IACrBC,GAAgB,IAChBmC,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,IACjDwB,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,IAC3C0B,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,IAC5CkC,SAASK,cAAc,IAAIC,YAAY,qBACvCtK,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAEGR,GAAe,CACnB7K,cACAC,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,gBACAC,eACAC,cACAC,WACAC,gBACAd,YACAD,WACAgB,SA4DF,OACErE,EAAAA,cAACkH,EAAkBoJ,SAAQ,CACzBpO,MAAO,CACLkC,gBACA6F,mBACA7B,WACA/E,WACAsE,oBACAC,eACAE,YACAC,OACA1D,QACA2F,WACApG,oBACAwG,uBACAvG,uBACAwG,0BACA9G,oBACA+G,uBACAvG,oBACAyG,wBACAxG,gBACAyG,mBACA8F,gBAlVkB,CAAC,SAAU,OAAQ,WAmVrCpM,WACA8B,eACA3C,YACA4G,eACAQ,WACAC,cACAzG,cACAiG,iBACAS,kBACAE,qBACAE,kBACAE,aACAE,QACAE,UACAzD,gBACA/D,oBACAyG,uBACAiB,cACAK,WACA2E,SA1IWA,KACX7E,KACJD,IAAgB+E,GAASA,EAAO,IAChC7E,IAAsB,GAAK,EAwIvBwE,gBACAjE,sBACAQ,6BACAC,gCACAC,uBACAC,0BACAC,wBACAC,2BACA0D,2BA7G6BA,KACjC,MAAMC,EAAkB,IAAKnC,GAAclK,cAAc,EAAMG,YAAa,GAAIR,YAAa,GAC7F2I,IAA8BgE,IAAK,IAAWA,EAAOC,UAAU,MAC/DnN,EAAciN,GAAkB1C,IAC9B,GAAIA,EAAS3C,OAAS,EAAG,CACvB,MAAMwF,EAAUC,IAAa9C,EAAS7C,KAAMA,GAAM,YAClDwB,GAA6B,CAAExB,KAAM0F,EAASxF,OAAQwF,EAAQtP,OAAQqP,UAAU,EAAOG,gBAAgB,GACzG,MACEpE,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,EAAGuF,UAAU,EAAOG,gBAAgB,GACvF,GACA,EAoGEC,qBAjGuBA,KAC3B,MAAMN,EAAkB,IACnBnC,GACHtK,YAAa0C,EAAsB4H,GAAalL,UAAWkL,GAAatK,aACxEE,cAA4C,EAA7BoK,GAAapK,cAC5BK,YAAa,GACbR,YAAa,GAEf6I,IAAwB8D,IAAK,IAAWA,EAAOC,UAAU,MACzDnN,EAAciN,GAAkB1C,IAC9B,GAAIA,EAAS3C,OAAS,EAAG,CACvB,MAAMwF,EAAUC,IAAa9C,EAAS7C,KAAMA,GAAM,YAClD0B,GAAuB,CAAE1B,KAAM0F,EAASxF,OAAQwF,EAAQtP,OAAQqP,UAAU,EAAOG,gBAAgB,GACnG,MACElE,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,EAAGuF,UAAU,EAAOG,gBAAgB,GACjF,GACA,EAkFEE,sBA/EwBA,KAC5B,MAAM3M,EAAoBoD,EACvBrF,QAAQyC,GAAYA,EAAQoM,eAC5BxO,KAAKoC,GAAa,kBAAiBA,EAAQqM,UAC3CnM,KAAK,SACFoM,EAAsB,IACvB7C,GACHjL,kBAAmB,CAAC,WACpBgB,oBACAC,iBAAiB,EACjBC,YAAa,GACbR,YAAa,GAGf+I,IAAyB4D,IAAK,IAAWA,EAAOC,UAAU,MAC1DnN,EAAc2N,GAAsBpD,IAClC,GAAIA,EAAS3C,OAAS,EAAG,CACvB,MAAMwF,EAAUC,IAAa9C,EAAS7C,KAAMA,GAAM,YAClD4B,GAAwB,CAAE5B,KAAM0F,EAASxF,OAAQwF,EAAQtP,OAAQqP,UAAU,EAAOG,gBAAgB,GACpG,MACEhE,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,EAAGuF,UAAU,EAAOG,gBAAgB,GAClF,GACA,EA0DEzE,6BACAC,gCACAC,aAEDhN,EAC0B,EAIpB6R,EAAuBA,KAAMC,EAAAA,EAAAA,YAAWrK,GCrd/CsK,EAAwBA,KAC5B,MAAM,aAAE5J,EAAY,wBAAEyC,EAAuB,qBAAExG,EAAoB,kBAAEiH,GAAsBwG,KACpFtQ,EAAeC,IAAoBC,EAAAA,EAAAA,UAAS0G,IAC5C6J,EAAUC,IAAexQ,EAAAA,EAAAA,UAAS,IAClCG,EAAaC,IAAkBJ,EAAAA,EAAAA,UAAS,IACzCK,EAAoBP,EAAcQ,OAAS,EAE3CmQ,EAAoB3Q,EACvBsB,QAAQC,GAA0B,KAAhBlB,IAAsByJ,GAAoBA,EAAkBvI,GAAQ,IACtFqP,MAAK,CAACC,EAAGC,KACR,MAAMC,EAAYlO,EAAqB7E,SAAS6S,GAAK,EAAI,EACnDG,EAAYnO,EAAqB7E,SAAS8S,GAAK,EAAI,EAEzD,OAAIC,IAAcC,EAAkBA,EAAYD,EAE5CjH,GACMA,EAAkBgH,IAAM,IAAMhH,EAAkB+G,IAAM,GAEvDA,EAAEI,cAAcH,EACzB,IAGJ,OACE9R,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACyB,EAAAA,GAAW,CACVC,KAAK,SACLC,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,EACZC,UAAW,IACXC,mBAAmB,SACnBC,mBAAmB,yDACnBC,MAAOb,EACPc,SAAWC,IACT,MAAMC,EAAWuF,EAAatF,QAAQC,GAASA,EAAKC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBAC9FvB,EAAiBoB,GACjBf,EAAec,EAAMK,OAAOP,MAAM,IAGtClC,EAAAA,cAAA,MAAIJ,UAAU,8BACX+R,EAAkBjP,MAAM,EAAG+O,GAAU9O,KAAKJ,GACzCvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,gBAAeP,IACpB3C,UAAU,OACVmD,QAASc,EAAqB7E,SAASuD,GACvCJ,SAAUA,KACRkI,GAAyBrH,GACnBA,EAAUhE,SAASuD,GACdS,EAAUV,QAAQW,GAAaA,IAAaV,IAE5C,IAAIS,EAAWT,IAExB,EAEJW,MACE4H,GAAqBA,EAAkBvI,GAAQ,EAC1C,GAAEA,MAASuI,EAAkBvI,GAAQ,GAAK,MAAQuI,EAAkBvI,MACrEA,QAMbhB,GACCvB,EAAAA,cAAA,UACEK,QAASA,IAAOoR,EAAWE,EAAkBnQ,OAASkQ,EAAYD,EAAW,IAAMC,EAAY,GAC/F9R,UAAU,8BACT6R,EAAWE,EAAkBnQ,OAAS,eAAiB,YAG3D,EAIP,OAAe2B,EAAAA,EAAAA,MAAKqO,GCrCpB,MA7BwBU,KACtB,MAAM,gBAAE3B,EAAe,kBAAEhN,EAAiB,qBAAE+G,GAAyBgH,IAErE,OACEtR,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,MAAIJ,UAAU,4BACX2Q,EAAgB5N,KAAKJ,IACpBvC,SAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPjD,UAAU,OACVmD,QAASQ,EAAkBvE,SAASuD,GACpCJ,SAAUA,KACRmI,GAAsB6H,GAChBA,EAAUnT,SAASuD,GACd4P,EAAU7P,QAAQ+C,GAAaA,IAAa9C,IAE5C,IAAI4P,EAAW5P,IAExB,EAEJW,OA9BQmC,EA8BY9C,EA7Bf,WAAb8C,EACK,gBACe,SAAbA,EACF,aACe,YAAbA,EACF,eADF,MALaA,KAiCb,KAEF,E,WCtBP,MAhBwB+M,EAAGC,QAAO5S,WAAU6S,YAAW,MACrD,MAAOC,EAAYC,IAAiBtR,EAAAA,EAAAA,UAASoR,GAE7C,OACEtS,EAAAA,cAAA,OAAKJ,UAAU,QACbI,EAAAA,cAAA,UACEK,QAASA,IAAMmS,GAAeD,GAC9B3S,UAAU,2DACVI,EAAAA,cAAA,YAAOqS,GACPrS,EAAAA,cAAA,YAAOuS,EAAavS,EAAAA,cAACyS,EAAAA,EAAa,CAAC7S,UAAU,YAAeI,EAAAA,cAAC0S,EAAAA,EAAe,CAAC9S,UAAU,cAEzFI,EAAAA,cAAA,OAAKJ,UAAW2S,EAAa,GAAK,UAAW9S,GACzC,E,iCC+KV,MApLyBkT,KACvB,MAAM,kBAAEhL,EAAiB,kBAAE/D,EAAiB,qBAAEwG,EAAoB,qBAAEE,EAAoB,eAAEM,GACxF0G,IAEIsB,EAAoBjL,EAAkBhF,KAAKoC,GAAYA,EAAQqM,QAC9DyB,EAA2BC,IAAgC5R,EAAAA,EAAAA,UAAS0R,IACpEG,EAA2BC,IAAgC9R,EAAAA,EAAAA,UARnC,GASzB+R,EAA4BL,EAAkBpR,OATrB,EAWzB0R,EAAmBvL,EAAkBrF,QAAQyC,IAAaA,EAAQoM,eAAcxO,KAAKoC,GAAYA,EAAQqM,QACxG+B,EAA0BC,IAA+BlS,EAAAA,EAAAA,UAASgS,IAClEG,EAA0BC,IAA+BpS,EAAAA,EAAAA,UAbjC,GAczBqS,EAA2BL,EAAiB1R,OAdnB,GAgBxBH,EAAaC,IAAkBJ,EAAAA,EAAAA,UAAS,IAEzCsS,EAAgB7L,EAAkB+H,QAAO,CAACC,EAAK5K,KACnD4K,EAAI5K,EAAQqM,MAAQrM,EAAQ0O,MACrB9D,IACN,CAAC,GAEE+D,EAAyBb,EAC5BvQ,QAAQC,KAAWqI,EAAerI,IAASqB,EAAkB5E,SAASuD,EAAO,iBAAmC,KAAhBlB,IAChGuQ,MAAK,CAACC,EAAGC,KACR,MAAMC,EAAYnO,EAAkB5E,SAAS6S,EAAI,gBAAkB,EAAI,EACjEG,EAAYpO,EAAkB5E,SAAS8S,EAAI,gBAAkB,EAAI,EAEvE,OAAIC,IAAcC,EAAkBA,EAAYD,GAExCnH,EAAekH,IAAM,IAAMlH,EAAeiH,IAAM,EAAE,IAGxD8B,EAAwBR,EAC3B7Q,QAAQC,KAAWiR,EAAcjR,KACjCqP,MAAK,CAACC,EAAGC,KACR,MAAMC,EAAYnO,EAAkB5E,SAAS6S,EAAI,cAAgB,EAAI,EAC/DG,EAAYpO,EAAkB5E,SAAS8S,EAAI,cAAgB,EAAI,EAErE,OAAIC,IAAcC,EAAkBA,EAAYD,GAExCyB,EAAc1B,IAAM,IAAM0B,EAAc3B,IAAM,EAAE,IAEzDnP,MAAM,EAAG2Q,GAEZ,OACErT,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACyB,EAAAA,GAAW,CACVC,KAAK,SACLC,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,EACZC,UAAW,IACXC,mBAAmB,SACnBC,mBAAmB,sDACnBC,MAAOb,EACPc,SAAWC,IACTd,EAAec,EAAMK,OAAOP,OAC5B,MAAM0R,EAAsBV,EAAiB5Q,QAAQyC,GACnDA,EAAQvC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBAEpD4Q,EAA4BQ,GAE5B,MAAMC,EAAuBjB,EAAkBtQ,QAAQyC,GACrDA,EAAQvC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBAEpDsQ,EAA6Be,EAAqB,IAGtD7T,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,iBAAiBC,GAAG,KAAKpU,UAAU,gCAA+B,YAEpFI,EAAAA,cAACiU,EAAAA,EAAU,CAACrU,UAAU,aAExBI,EAAAA,cAAA,MAAIJ,UAAU,8BACX8T,EAAuBhR,MAAM,EAAGqQ,GAA2BpQ,KAAKJ,IAC/D,MAAMkR,EAAQ7I,EAAerI,IAAS,EAChC2R,EAAiB3R,EAAO,eAE9B,OACEvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,sBAAqBP,IAC1B3C,UAAU,OACVmD,QAASa,EAAkB5E,SAASkV,GACpC/R,SAAUA,KACR,GAAIyB,EAAkB5E,SAASkV,GAAiB,CAC9C,MAAMC,EAAoBvQ,EAAkBtB,QAAQyC,GAAYA,IAAYmP,IACU,IAAlFC,EAAkB7R,QAAQyC,GAAYA,EAAQ/F,SAAS,iBAAgBwC,QACzE8I,EAAqB,CAAC,SAAU,OAAQ,YAE1CF,EAAqB+J,EACvB,KAAO,CACL7J,EAAqB,CAAC,SAAU,SAChC,MAAM8J,EAAe,IAAIxQ,EAAmBsQ,GACxCtQ,EAAkBtB,QAAQyC,GAAYA,EAAQ/F,SAAS,eAAcwC,OAAS,EAChF4I,EAAqBgK,EAAa9R,QAAQyC,IAAaA,EAAQ/F,SAAS,gBAExEoL,EAAqBgK,EAEzB,GAEFlR,MAAQ,GAAEX,MAASkR,EAAQ,GAAK,MAAQA,OAEvC,IAG0B,IAAlCC,EAAuBlS,QAAgBxB,EAAAA,cAAA,UAAI,wBAE7CiT,GAA6BS,EAAuBlS,OAAS,GAC5DxB,EAAAA,cAAA,UACEK,QAASA,KACP2S,EACED,EAA4BW,EAAuBlS,OAC/CuR,EAA4B,GApHf,EAsHlB,EAEHnT,UAAU,8BACTmT,EAA4BW,EAAuBlS,OAAS,eAAiB,aAIpFxB,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,iBAAiBC,GAAG,KAAKpU,UAAU,gCAA+B,UAEpFI,EAAAA,cAACqU,EAAAA,EAAe,CAACzU,UAAU,aAE7BI,EAAAA,cAAA,MAAIJ,UAAU,8BACX+T,EAAsBhR,KAAKJ,IAC1B,MAAM2R,EAAiB3R,EAAO,aAE9B,OACEvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,oBAAmBP,IACxB3C,UAAU,OACVmD,QAASa,EAAkB5E,SAASkV,GACpC/R,SAAUA,KACR,GAAIyB,EAAkB5E,SAASkV,GAAiB,CAC9C,MAAMC,EAAoBvQ,EAAkBtB,QAAQyC,GAAYA,IAAYmP,IACQ,IAAhFC,EAAkB7R,QAAQyC,GAAYA,EAAQ/F,SAAS,eAAcwC,QACvE8I,EAAqB,CAAC,SAAU,OAAQ,YAE1CF,EAAqB+J,EACvB,KAAO,CACL7J,EAAqB,CAAC,YACtB,MAAM8J,EAAe,IAAIxQ,EAAmBsQ,GACxCtQ,EAAkBtB,QAAQyC,GAAYA,EAAQ/F,SAAS,iBAAgBwC,OAAS,EAClF4I,EAAqBgK,EAAa9R,QAAQyC,IAAaA,EAAQ/F,SAAS,kBAExEoL,EAAqBgK,EAEzB,GAEFlR,MACEX,GAAQiR,EAAcjR,GAAS,KAAIiR,EAAcjR,GAAQ,GAAK,MAAQiR,EAAcjR,MAAW,UAGhG,IAGyB,IAAjCoR,EAAsBnS,QAAgBxB,EAAAA,cAAA,UAAI,wBAE5CuT,GAA4BI,EAAsBnS,OAAS,GAC1DxB,EAAAA,cAAA,UACEK,QAASA,KACPiT,EACED,EAA2BF,EAAyB3R,OAChD6R,EAA2B,GA1KZ,EA4KpB,EAEHzT,UAAU,8BACTyT,EAA2BF,EAAyB3R,OAAS,eAAiB,YAGlF,EC7KP,MAAM8S,EAAgB,CACpB,CAAEpS,MAAO,EAAGgB,MAAO,OACnB,CAAEhB,MAAO,EAAGgB,MAAO,OACnB,CAAEhB,MAAO,GAAIgB,MAAO,QACpB,CAAEhB,MAAO,GAAIgB,MAAO,QACpB,CAAEhB,MAAO,GAAIgB,MAAO,QACpB,CAAEhB,MAAO,IAAKgB,MAAO,UA8FvB,MA3FuBqR,KACrB,MAAM,cACJnQ,EAAa,iBACb6F,EAAgB,SAChB5G,EAAQ,kBACRS,EAAiB,qBACjByG,EAAoB,kBACpB3G,EAAiB,qBACjBC,EAAoB,UACpBiE,EAAS,kBACT/D,EAAiB,qBACjByG,EAAoB,eACpBQ,EAAc,KACdjD,EAAI,aACJ/D,EAAY,gBACZyG,EAAe,UACfS,EAAS,aACTkF,GACEkB,IAEEkD,GACH1Q,GAC4B,IAA7BF,EAAkBpC,QACc,IAAhCqC,EAAqBrC,QACG,IAAxBwC,EAAaxC,QACgB,IAA7BuC,EAAkBvC,OAEpB,OACExB,EAAAA,cAAAA,EAAAA,SAAA,MACIwU,GACAxU,EAAAA,cAACyU,EAAAA,GAAM,CAAC/S,KAAK,WAAW9B,UAAU,wBAAwBS,QAAS+P,GAAc,iBAInFpQ,EAAAA,cAAA,OAAKJ,UAAU,yDACbI,EAAAA,cAAC0U,EAAAA,GAAK,CAAC9U,UAAU,YAAY+U,QAAQ,uBAAsB,uBAG3D3U,EAAAA,cAAC4U,EAAAA,GAAM,CACL9R,GAAG,sBACHC,QAASe,EACT3B,SAAUA,IAAMoI,GAAsBzG,MAG1C9D,EAAAA,cAACoS,EAAe,CAACC,MAAM,qBACrBrS,EAAAA,cAAC2S,EAAgB,OAEnB3S,EAAAA,cAACoS,EAAe,CAACC,MAAM,0BACrBrS,EAAAA,cAACwR,EAAqB,OAExBxR,EAAAA,cAACoS,EAAe,CAACC,MAAM,uBACrBrS,EAAAA,cAACkS,EAAe,OAEjB7O,GACCrD,EAAAA,cAACoS,EAAe,CAACC,MAAM,6BACrBrS,EAAAA,cAAA,OAAKJ,UAAU,4BACZ0U,EAAc3R,KAAKkS,GAClB7U,EAAAA,cAAC8U,EAAAA,EAAc,CACbhS,GAAK,kBAAiB+R,EAAK3S,QAC3BU,IAAM,kBAAiBiS,EAAK3S,QAC5BA,MAAO2S,EAAK3S,MACZkP,KAAK,SACLlO,MAAO2R,EAAK3R,MACZH,QAASqB,IAAkByQ,EAAK3S,MAChCC,SAAUA,IAAM8H,EAAiB4K,EAAK3S,aAMhDlC,EAAAA,cAACoS,EAAe,CAACC,MAAM,mBAAmBC,SAAUvO,EAAkBvC,OAAS,GAC7ExB,EAAAA,cAACQ,EAAS,CACRC,MAAOqH,EACPnH,iBAAkB6J,EAClB9J,cAAeqD,EACfnD,OAAQoK,KAGZhL,EAAAA,cAACoS,EAAe,CAACC,MAAM,gBAAgBC,SAAUtO,EAAaxC,OAAS,GACrExB,EAAAA,cAACQ,EAAS,CACRC,MAAOsH,EACPpH,iBAAkB8J,EAClB/J,cAAesD,EACfpD,OAAQsK,EACRnK,eAAe,KAGlB,E,WC3FP,MAZyBgU,EAAGC,eAC1BhV,EAAAA,cAAA,OAAKJ,UAAU,0EACbI,EAAAA,cAACiV,EAAAA,GAAW,CAACrV,UAAU,iCAAiCS,QAAS2U,IACjEhV,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,KAAKC,GAAG,MAAK,0EAGjChU,EAAAA,cAACkV,EAAAA,GAAU,CAACtV,UAAU,OAAOuV,KAAK,QAAO,c,+BCyH7C,MA9HoBC,KAClB,MAAM,UAAE9R,EAAS,aAAE4G,EAAY,eAAEC,EAAc,QAAEO,EAAO,WAAEC,EAAU,YAAEzG,EAAW,QAAEuI,GAAY6E,KACxF3O,EAAK0S,IAAUnU,EAAAA,EAAAA,UAAS,MAyH/B,OAvHAqH,EAAAA,EAAAA,YAAU,MACRkF,iBACE,MAAM,IAAE6H,SAAc9R,OAAOkK,OAAOC,KAAKC,cAAc,QACjDjL,EAAM,IAAI2S,EAAI9H,SAAS+H,eAAe,OAAQ,CAClDC,OAAQlS,EACRmS,KAAM/K,EACNgL,kBAAkB,EAClBC,aAAa,EACbC,MAAO,qBAGT,IAAIC,GAAc,EAElBrS,OAAOkK,OAAOC,KAAKvL,MAAM0T,gBAAgBnT,EAAK,eAAe,WAC3DA,EAAIoT,QAAQrL,GACZ/H,EAAIqT,YACF,OACAC,KAAS,KACP,MAAMC,EAAYvT,EAAIwT,YAAYC,eAC5BC,EAAY1T,EAAIwT,YAAYG,eAC5BC,EAAiB,CAACL,EAAU5P,MAAO4P,EAAU3P,MAAO8P,EAAU/P,MAAO+P,EAAU9P,OACjF8C,KAAKiE,UAAUiJ,KAAoBlN,KAAKiE,UAAUpJ,IACpDiG,EAAeoM,GAGjB,MAAMC,EAAY7T,EAAI8T,YACtB,GAAID,EAAUlQ,QAAUhD,EAAUgD,KAAOkQ,EAAUjQ,QAAUjD,EAAUiD,SAEhE,CACL,MAAMmQ,EAAkB,CAAEpQ,IAAKkQ,EAAUlQ,MAAOC,IAAKiQ,EAAUjQ,OAC/D6C,aAAaiE,QAAQ,YAAahE,KAAKiE,UAAUoJ,IACjDxM,EAAawM,EACf,CAEA/L,EAAWhI,EAAIgU,WACXd,KACFe,EAAAA,EAAAA,IAAyB,CAACJ,EAAUlQ,MAAOkQ,EAAUjQ,QACrDsP,GAAc,EAChB,GACC,KAEP,IAEAR,EAAO1S,GACP6K,SAASK,cAAc,IAAIC,YAAY,sBACzC,CAEA+I,EAAS,GACR,KAEHtO,EAAAA,EAAAA,YAAU,KACR,IAAK5F,EAAK,OAEV,MAAMuK,EAAkBC,IACtBmB,QAAQwI,IAAI,qBAAsB3J,EAAEC,QACpCzK,EAAIoU,UAAU5J,EAAEC,QAChBzK,EAAIoT,QAAQ,IAEZ,MAAMG,EAAYvT,EAAIwT,YAAYC,eAC5BC,EAAY1T,EAAIwT,YAAYG,eAC5BC,EAAiB,CAACL,EAAU5P,MAAO4P,EAAU3P,MAAO8P,EAAU/P,MAAO+P,EAAU9P,OACrF4D,EAAeoM,EAAe,EAG1BS,EAAgB7J,IACpBmB,QAAQwI,IAAI,mBAAoB3J,EAAEC,QAClCzK,EAAIoT,QAAQ5I,EAAEC,QAEd,MAAM8I,EAAYvT,EAAIwT,YAAYC,eAC5BC,EAAY1T,EAAIwT,YAAYG,eAC5BC,EAAiB,CAACL,EAAU5P,MAAO4P,EAAU3P,MAAO8P,EAAU/P,MAAO+P,EAAU9P,OACjF8C,KAAKiE,UAAUiJ,KAAoBlN,KAAKiE,UAAUpJ,IACpDiG,EAAeoM,EACjB,EAMF,OAHA/I,SAASD,iBAAiB,eAAgBL,GAC1CM,SAASD,iBAAiB,aAAcyJ,GAEjC,KACLxJ,SAASe,oBAAoB,eAAgBrB,GAC7CM,SAASe,oBAAoB,aAAcyI,EAAa,CACzD,GACA,CAACrU,KAEJ4F,EAAAA,EAAAA,YAAU,KA6BJ/E,OAAOkK,QAAU/K,GAAO8J,GA5B5BgB,iBACE,MAAM,sBAAEwJ,EAAqB,WAAEC,SAAqB1T,OAAOkK,OAAOC,KAAKC,cAAc,UAErF3N,OAAOkX,QAAQ1K,GAASoD,SAAStN,IAC/B,MAAM6U,EAAM7U,EAAK,GACX8U,EAAgB,IAAIH,EAAW,CACnCI,WAAY,UACZC,YAAa,UACbC,WAAY,8BAERC,EAAS,IAAIR,EAAsB,CACvCS,SAAU,CAAEpR,IAAK8Q,EAAI9Q,IAAKC,IAAK6Q,EAAI7Q,KACnCoR,QAASN,EAAcO,QACvBvF,MAAO+E,EAAIhG,KACXtO,GAAK,UAASsU,EAAIvY,OAClB8D,QAEF8U,EAAOzB,YAAY,SAAU7I,IAC3BA,EAAE0K,SAASC,iBACX,MAAMC,EAAavK,SAAS+H,eAAe6B,EAAIvY,MAC/CkZ,GAAYC,eAAe,CAAEC,SAAU,WACvCF,GAAYG,OAAO,IAErBd,EAAIC,cAAgBA,EACpBD,EAAIK,OAASA,CAAM,GAEvB,CAGEU,EACF,GACC,CAACxV,EAAK8J,IAEFzM,EAAAA,cAAA,OAAK8C,GAAG,MAAMlD,UAAU,iBAAkB,EC/GnD,MAbyBwY,EAAGpD,eAC1BhV,EAAAA,cAAA,OAAKJ,UAAU,iEACbI,EAAAA,cAACiV,EAAAA,GAAW,CAACrV,UAAU,iCAAiCS,QAAS2U,IACjEhV,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,KAAKC,GAAG,MAAK,wFAGjChU,EAAAA,cAAA,OAAKJ,UAAU,QAAO,2EACtBI,EAAAA,cAACkV,EAAAA,GAAU,CAACtV,UAAU,OAAOuV,KAAK,gBAAe,iB,sBCFrD,MAaMkD,EAAgBA,EAAGlZ,SACvBa,EAAAA,cAAA,OAAKJ,UAAU,gCACbI,EAAAA,cAACsY,EAAAA,EAAQ,CAAC1Y,UAAU,wBACpBI,EAAAA,cAAA,QAAMJ,UAAU,aAAqC,IAAxBT,EAAIoZ,gBAAwB,MAAQpZ,EAAIoZ,iBACrEvY,EAAAA,cAAA,QAAMJ,UAAU,sCAAsCT,EAAIqZ,cAAc,sBAItEC,GAAkBA,EAAGC,cACzB1Y,EAAAA,cAAA,OAAKJ,UAAU,uBACZ8Y,EAAS/V,KAAKgW,GACb3Y,EAAAA,cAAA,OAAK4C,IAAK+V,EAAQ7V,IAChB9C,EAAAA,cAAA,OAAKJ,UAAU,aACbI,EAAAA,cAAA,OAAKJ,UAAU,eAAegZ,wBAAyB,CAAEC,OAAQF,EAAQvH,SAE3EpR,EAAAA,cAAA,OAAKJ,UAAU,WACbI,EAAAA,cAAA,YA7BY8Y,KACpB,GAAc,IAAVA,EACF,MAAO,OACF,CACL,MAAMC,EAAUD,EAAQ,IACxB,OAAIA,EAAQ,MAAQ,EACV,IAAGC,EAAQC,QAAQ,KAEnB,IAAGD,EAAQC,QAAQ,IAE/B,GAmBeC,CAAaN,EAAQO,eAAqB,IAAClZ,EAAAA,cAAA,QAAMJ,UAAU,aAAY,UAAS,IACvFI,EAAAA,cAAA,YAAO2Y,EAAQnX,OAAO,aAO1B2X,GAAgBA,EAAGha,UACvB,MAAM,qBAAE0E,GAAyByN,IAC3B8H,EAASja,EAAIia,OAAO9W,QAAQ+W,GAAUxV,EAAqB7E,SAASqa,EAAMjI,OAASiI,EAAM5F,MAAQ,IAEvG,OAAsB,IAAlB2F,EAAO5X,OAAqB,KAG9BxB,EAAAA,cAAA,OAAKJ,UAAU,0CACZwZ,EAAO1W,MAAM,EAAG,GAAGC,KAAK0W,GACvBrZ,EAAAA,cAAA,OAAK4C,IAAM,GAAEzD,EAAIma,kBAAkBD,EAAMjI,OAAQxR,UAAU,6CACzDI,EAAAA,cAAA,OACEJ,UAAY,kEACM,IAAhByZ,EAAM5F,MAAc,aAAe,IAErCmF,wBAAyB,CAAEC,OAAQQ,EAAMjI,QAE1CiI,EAAM5F,MAAQ,GACbzT,EAAAA,cAAA,OAAKJ,UAAU,qEAAqEyZ,EAAM5F,UAI5F,EAwIV,OApImB8F,EAAGpa,MAAKqa,gCAA+B,MACxD,MAAM,UAAElW,EAAS,YAAE2C,EAAW,SAAEmC,EAAQ,QAAEqE,GAAY6E,IAChDoH,EAAWvZ,EAAIuZ,SAAS9G,MAAK,CAACC,EAAGC,IAAMD,EAAE6F,SAAW5F,EAAE4F,WAAUhV,MAAM,EAAG,GACzE+W,EAAcrR,EAAW,YAAc,YAEvCsR,EAAWva,EAAIR,KAAKgb,gBAAgBC,OAAOC,KAC5C,2CAA0CJ,KAAeta,EAAIR,KAAKgb,gBAAgBC,OAAOC,OAC1F1a,EAAIR,KAAKmb,MAEPC,EACJ9T,GAA+B,OAAhB9G,EAAI6a,QACf,KACAR,GAAiCra,EAAI8a,eAAejb,SAAS,YAA4C,IAA9BG,EAAI8a,eAAezY,OAC9F,UACC,IAAE0Y,EAAAA,EAAAA,IAAgB5W,EAAUgD,IAAKhD,EAAUiD,IAAKpH,EAAI6a,QAAQ1T,IAAKnH,EAAI6a,QAAQzT,KAAKyS,QAAQ,QAE3FmB,GAAajb,EAAAA,EAAAA,IAA6BC,GAEhD,OACEa,EAAAA,cAAA,KACEK,QAASA,IAAMmD,OAAOyM,eAAe5C,QAAQ,iBAAkB7J,OAAO4W,SACtEtX,GAAI3D,EAAIR,KAAKE,KACbsW,KAAMgF,EACNE,aAAcA,KACZ,MAAM5C,EAAShL,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAY7B,OACnDJ,EAAgB5K,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAYjC,cAE3DI,GAAWJ,IAChBI,EAAO8C,OAAS,EAChBlD,EAAcC,WAAa,2BAC3BD,EAAcE,YAAc,2BAA0B,EAExDiD,aAAcA,KACZ,MAAM/C,EAAShL,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAY7B,OACnDJ,EAAgB5K,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAYjC,cAE3DI,GAAWJ,IAChBI,EAAO8C,OAAS,EAChBlD,EAAcC,WAAa,UAC3BD,EAAcE,YAAc,UAAS,EAEvC3X,UAAU,6PACVI,EAAAA,cAAA,OAAKJ,UAAU,oCACZ4D,OAAO6B,SAASoB,OAAOzH,SAAS,UAC/BgB,EAAAA,cAAA,OAAKJ,UAAU,0GACbI,EAAAA,cAAA,WAAK,UAAQb,EAAIsb,eACjBza,EAAAA,cAAA,WAAMb,EAAIqZ,cAAc,YACvBrZ,EAAIub,OAAS1a,EAAAA,cAAA,WAAK,iBAAsBb,EAAIwb,SAAW3a,EAAAA,cAAA,WAAK,mBAAwB,MAGzFA,EAAAA,cAAA,OAAKJ,UAAU,uBACXqG,GAAe3C,GAAanE,EAAI6a,SAChCha,EAAAA,cAAA,OAAKJ,UAAU,8HACZma,GAGL/Z,EAAAA,cAAA,OAAKJ,UAAU,yGACbI,EAAAA,cAAA,OACE4a,IAAKlB,EACLmB,IAAK1b,EAAIR,KAAKyS,KACdxR,UAAU,iGACViM,QAAQ,WAGVzD,GACApI,EAAAA,cAAA,OAAKJ,UAAU,6BACZT,EAAI2b,eAAepY,MAAM,EAAG,GAAGC,KAAKoY,GACnC/a,EAAAA,cAAA,OACE4C,IAAKmY,EAAMjY,GACX8X,IAAM,oDAAmDG,EAAMC,iBAAiBC,QAAQpB,OACxFgB,IAAK1b,EAAIR,KAAKyS,KACdxR,UAAU,sDACViM,QAAQ,aAMlB7L,EAAAA,cAAA,OAAKJ,UAAU,mBACbI,EAAAA,cAAA,MAAIJ,UAAU,2BACZI,EAAAA,cAAA,OACEJ,UAAU,4CACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIR,KAAKyS,QAE9CpR,EAAAA,cAAA,OAAKJ,UAAU,oBAAoBgb,IAAI,6BAA6BC,IAAI,cAE1E7a,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,KAAKC,GAAG,MAC1BhU,EAAAA,cAAA,OACEJ,UAAU,4CACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIR,KAAK0T,UAGhDrS,EAAAA,cAAA,OAAKJ,UAAU,aACbI,EAAAA,cAACqY,EAAa,CAAClZ,IAAKA,IACpBa,EAAAA,cAAA,OAAKJ,UAAU,kBAAkBT,EAAI+b,YACrClb,EAAAA,cAACmb,EAAAA,GAAO,MACRnb,EAAAA,cAACyY,GAAe,CAACC,SAAUA,IAC3B1Y,EAAAA,cAACmZ,GAAa,CAACha,IAAKA,IACpBa,EAAAA,cAAA,OACEJ,UAAU,mCACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIic,kBAAoBjc,EAAIkc,eAKvErb,EAAAA,cAAA,OAAKJ,UAAU,mBACbI,EAAAA,cAACqY,EAAa,CAAClZ,IAAKA,IACpBa,EAAAA,cAAA,OAAKJ,UAAU,qCACbI,EAAAA,cAAA,WAAMb,EAAI+b,aACRjV,GAAe3C,GAAanE,EAAI6a,SAChCha,EAAAA,cAAA,OAAKJ,UAAU,uFACZma,IAIP/Z,EAAAA,cAACyY,GAAe,CAACC,SAAUA,IAC3B1Y,EAAAA,cAACmZ,GAAa,CAACha,IAAKA,IACpBa,EAAAA,cAAA,OACEJ,UAAU,mCACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIic,kBAAoBjc,EAAIkc,aAGnErb,EAAAA,cAACyU,EAAAA,GAAM,CACL/S,KAAK,YACL9B,UAAU,wGACVuV,KAAMgF,GAAY,gBAGlB,EC3LR,OAVoBmB,EAAG5a,gBAAeC,mBAAkB4a,aACtDvb,EAAAA,cAAAA,EAAAA,SAAA,KACGU,EAAciC,KAAKJ,GAClBvC,EAAAA,cAACO,EAAAA,GAAU,CAACqC,IAAKL,EAAM1C,mBAAoBA,IAAMc,EAAiBD,EAAc4B,QAAQkZ,GAAMA,IAAMjZ,MACjGgZ,GAAWA,EAAQhZ,GAAQgZ,EAAQhZ,GAAQA,EAAKyC,QAAQ,aAAc,QCc/E,MAEMyW,GAAkBA,EAAGpJ,QAAOjH,OAAMsQ,YAAWC,cAAanC,gCAA+B,MAC7F,MAAM,SAAEpR,GAAakJ,IAErB,OACEtR,EAAAA,cAAAA,EAAAA,SAAA,MACIoI,GAAYuT,GAAe3b,EAAAA,cAACmb,EAAAA,GAAO,CAACvb,UAAU,iBAChDI,EAAAA,cAAA,MAAIJ,UAAU,yCAAyCyS,GACvDrS,EAAAA,cAAA,UACGoL,EAAKzI,KAAKxD,GACTa,EAAAA,cAAA,MAAI4C,IAAK8Y,EAAY,IAAMvc,EAAIma,UAC7BtZ,EAAAA,cAACuZ,GAAU,CAACpa,IAAKA,EAAKqa,6BAA8BA,QAIzD,EAIDoC,GAAaA,EAAGC,oBACpB,MAAM,SACJzT,EAAQ,MACR/D,EAAK,SACL2F,EAAQ,cACR5F,EAAa,iBACb6F,EAAgB,kBAChBrG,EAAiB,qBACjBwG,EAAoB,qBACpBvG,EAAoB,wBACpBwG,EAAuB,kBACvB9G,EAAiB,qBACjB+G,EAAoB,kBACpBvG,EAAiB,aACjBC,EAAY,QACZG,EAAO,aACP+F,EAAY,KACZkB,EAAI,OACJE,EAAM,cACNzD,EAAa,WACb2D,EAAU,SACVgF,EAAQ,QACR3E,EAAO,UACPvI,EAAS,mBACT6I,EAAkB,0BAClBQ,EAAyB,oBACzBE,EAAmB,qBACnBE,EAAoB,aACpBqD,EAAY,2BACZM,EAA0B,qBAC1BO,EAAoB,sBACpBC,EAAqB,0BACrB3E,EAAyB,6BACzBC,GACE8E,KAEGwK,EAAoBC,IAAyB7a,EAAAA,EAAAA,WAAS,IACtD8a,EAA2BC,IAAgC/a,EAAAA,EAAAA,WAAS,IACpEgb,EAA2BC,KAAgCjb,EAAAA,EAAAA,WAAS,GACrEkb,IAAcC,EAAAA,EAAAA,QAAO,MACrBC,IAAmBD,EAAAA,EAAAA,QAAO,MAC1BE,IAAmBF,EAAAA,EAAAA,QAAO,MAC1BG,IAAeH,EAAAA,EAAAA,QAAO,OACtB,MAAEnU,KAAUC,EAAAA,EAAAA,KAEZsU,GACJ7Y,EAAkBpC,OAASqC,EAAqBrC,OAASuC,EAAkBvC,OAASwC,EAAaxC,QAEnG+G,EAAAA,EAAAA,YAAU,KACR,GAA4B,OAAxB6T,GAAYM,QAAkB,CAChC,MAAMC,EAAW,IAAIC,sBAAsBzF,IACzCA,EAAQtH,SAASgN,IACXA,EAAMC,iBACHtR,EAEOe,IACVC,GAA6B,GACzBnI,IAAUsI,EAA0BqE,gBAAgBN,IACrB,IAA7BnN,EAAkB/B,QAAgB+B,EAAkBvE,SAAS,aAC5D6N,EAAoBmE,gBAAgBC,IACpClE,EAAqBiE,gBAAgBE,MAN5CV,IASJ,GACA,IAKJ,OAFAmM,EAASI,QAAQX,GAAYM,SAEtB,KACLC,EAASK,YAAY,CAEzB,IACC,CAACxR,EAAYgF,KAEhBjI,EAAAA,EAAAA,YAAU,KACR,MAAM0U,EAAuB9P,GAAMnD,EAASmD,EAAEC,OAAOgE,MAErD5D,SAASD,iBAAiB,oBAAqB0P,GAE7B,OAAd3Z,GACF4G,EAAarC,IACb+O,EAAAA,EAAAA,IAAyB,CAAC/O,EAAcvB,IAAKuB,EAActB,OAClDjD,IACTsT,EAAAA,EAAAA,IAAyB,CAACtT,EAAUgD,IAAKhD,EAAUiD,MAGrD,MAAM2W,EAAWA,KACXX,GAAiBG,SAAWF,GAAaE,UACvClZ,OAAO4W,SAAW,IACpBmC,GAAiBG,QAAQS,MAAMC,IAAM,EACrCb,GAAiBG,QAAQS,MAAME,KAAO,EACtCd,GAAiBG,QAAQS,MAAMG,MAAQ,EACvCf,GAAiBG,QAAQS,MAAMI,YAAc,OAC7ChB,GAAiBG,QAAQS,MAAMK,aAAe,OAC9CjB,GAAiBG,QAAQS,MAAMM,cAAgB,OAC/ClB,GAAiBG,QAAQS,MAAMzF,SAAW,QAC1C6E,GAAiBG,QAAQS,MAAMO,aAAe,yCAC1CtV,IACFoU,GAAaE,QAAQS,MAAMQ,WAAa,WAG1CpB,GAAiBG,QAAQS,MAAMzF,SAAW,SAC1C6E,GAAiBG,QAAQS,MAAMO,aAAe,OAC9CnB,GAAiBG,QAAQS,MAAMI,YAAc,EAC7ChB,GAAiBG,QAAQS,MAAMK,aAAe,EAC9ChB,GAAaE,QAAQS,MAAMQ,WAAa,GAE5C,EAKF,OAFAna,OAAO+J,iBAAiB,SAAU2P,GAE3B,KACL1P,SAASe,oBAAoB,oBAAqB0O,GAClDzZ,OAAO+K,oBAAoB,SAAU2O,EAAS,CAC/C,GACA,KAEH3U,EAAAA,EAAAA,YAAU,KACJL,GAAQ,GAAKA,GAAQ,KACvBsF,SAASoQ,KAAKC,UAAUC,OAAO,wBAC/BtQ,SAASuQ,cAAc,OAAOF,UAAUC,OAAO,WAE/CtQ,SAASoQ,KAAKC,UAAUG,IAAI,wBAC5BxQ,SAASuQ,cAAc,OAAOF,UAAUG,IAAI,SAC9C,GACC,CAAC9V,MAEJK,EAAAA,EAAAA,YAAU,KACa,IAAjB6C,GAAM5J,QAAiB+K,IACzBC,GAA6B,GACzBnI,IAAUsI,EAA0BqE,gBAAgBN,IACrB,IAA7BnN,EAAkB/B,QAAgB+B,EAAkBvE,SAAS,aAC5D6N,EAAoBmE,gBAAgBC,IACpClE,EAAqBiE,gBAAgBE,KAE9C,GACC,CAAC9F,IAEJ,IAAI6S,GACF3S,EAASqB,EAA0BrB,OAASuB,EAAoBvB,OAASyB,EAAqBzB,OAGhG,OAFI2S,GAAkB,KAAIA,GAAkB,OAG1Cje,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,OAAKke,IAAK1B,IACRxc,EAAAA,cAAA,OACEJ,UAAU,4GACVud,MAAO,CAAEjV,MAzKS,MA0KlBlI,EAAAA,cAACuU,EAAc,OAEjBvU,EAAAA,cAAA,OACEke,IAAK5B,GACL1c,UAAY,6FACVuE,EAAU,wEAA0E,IAEtFgZ,MAAO,CACLgB,WAAY/V,EAAW,EAlLP,IAmLhBF,MAAO/D,EAAU,KAAO,oBAE1BnE,EAAAA,cAAA,OAAKJ,UAAU,8DACbI,EAAAA,cAAA,OAAKJ,UAAU,qBAAqBse,IAAK3B,IACvCvc,EAAAA,cAAA,OAAKJ,UAAU,gDACbI,EAAAA,cAAA,OAAKJ,UAAU,UACZuM,EAAqBnM,EAAAA,cAACoe,EAAAA,EAAiB,MAAMpe,EAAAA,cAACqe,EAAAA,EAAQ,CAACze,UAAU,gBAEpEI,EAAAA,cAACyU,EAAAA,GAAM,CACL/S,KAAM+a,GAAe,EAAI,YAAc,WACvCpc,QAASA,IAAM0b,GAAsB,GACrCnc,UAAU,0CACVI,EAAAA,cAACse,EAAAA,EAAyB,CAAC1e,UAAU,YACrCI,EAAAA,cAAA,YAAQ,WAASyc,GAAe,EAAK,KAAIA,MAAkB,OAG/Dzc,EAAAA,cAAA,OAAKJ,UAAU,oCACZ,CAAC,WAAY,gBAAiB,YAAa,YAAa,eAAe+C,KAAKL,GAC3EtC,EAAAA,cAACyU,EAAAA,GAAM,CACL/S,KAAK,WACLkB,IAAKN,EACLjC,QAASA,IAAM0b,GAAsB,GACrCnc,UAAU,0CACVI,EAAAA,cAAA,YAAOsC,GACPtC,EAAAA,cAAC0S,EAAAA,EAAe,CAAC9S,UAAU,kBAMrCI,EAAAA,cAAA,WACEA,EAAAA,cAAA,OAAKJ,UAAU,qCACbI,EAAAA,cAAA,OAAKJ,UAAU,2DACZyE,GACCrE,EAAAA,cAACO,EAAAA,GAAU,CACTV,mBAAoBA,KAClBmK,EAAS,IACTwD,SAASK,cAAc,IAAIC,YAAY,oBAAoB,GAC1D,IACIzJ,EAAM,KAGjBrE,EAAAA,cAACsb,GAAW,CACV5a,cAAe6C,EACf5C,iBAAkB2J,EAClBiR,QAAS,CACPgD,QAAS,UACTC,OAAQ,gBACRC,KAAM,gBAGTra,GACCpE,EAAAA,cAACO,EAAAA,GAAU,CAACV,mBAAoBA,IAAMoK,EAAiB,OAAO,UACpD7F,EAAc,UAG1BpE,EAAAA,cAACsb,GAAW,CAAC5a,cAAekD,EAAmBjD,iBAAkByJ,IACjEpK,EAAAA,cAACsb,GAAW,CAAC5a,cAAemD,EAAsBlD,iBAAkB0J,MAGxErK,EAAAA,cAAA,UACGoL,GAAMzI,KAAI,CAACxD,EAAKuf,IACf1e,EAAAA,cAACA,EAAAA,SAAc,CAAC4C,IAAKzD,EAAIma,UAChB,IAANoF,IAAY7C,IAAkBG,GAC7Bhc,EAAAA,cAAA,MAAIJ,UAAU,iEACZI,EAAAA,cAAC+U,EAAgB,CAACC,UAAWA,IAAMiH,GAA6B,MAG7D,KAANyC,IAAa7C,IAAkBK,GAC9Blc,EAAAA,cAAA,MAAIJ,UAAU,iEACZI,EAAAA,cAACoY,EAAgB,CAACpD,UAAWA,IAAMmH,IAA6B,MAGpEnc,EAAAA,cAAA,UACEA,EAAAA,cAACuZ,GAAU,CAACpa,IAAKA,QAItBiM,GAAM5J,OAAS,GAAKxB,EAAAA,cAAA,MAAIke,IAAK9B,GAAa,cAAY,UAExDzP,EAA0BrB,OAAS,GAClCtL,EAAAA,cAACyb,GAAe,CACdpJ,MAAQ,GAAE/G,EAAS,EAAI,qBAAuB,gDAAgDjH,IAC9F+G,KAAMuB,EAA0BvB,KAChCsQ,UAAU,eACVC,YAAarQ,EAAS,IAGzBuB,EAAoBvB,OAAS,GAC5BtL,EAAAA,cAACyb,GAAe,CACdpJ,OACiC,IAA/BxF,EAAoBvB,OAAe,wBAA0B,sBADvD,gBAGRF,KAAMyB,EAAoBzB,KAC1BsQ,UAAU,iBACVC,YAAarQ,EAAS,GAAKqB,EAA0BrB,OAAS,IAGjEyB,EAAqBzB,OAAS,GAC7BtL,EAAAA,cAACyb,GAAe,CACdpJ,OACE/G,EAAS,GAAKqB,EAA0BrB,OAAS,GAAKuB,EAAoBvB,OAAS,EAC/E,qBACA,iBAHE,6BAKRF,KAAM2B,EAAqB3B,KAC3BsQ,UAAU,kBACVC,YAAarQ,EAAS,GAAKqB,EAA0BrB,OAAS,GAAKuB,EAAoBvB,OAAS,EAChGkO,8BAA8B,IAGjC3N,GACDc,EAA0BkE,UAC1BhE,EAAoBgE,UACpB9D,EAAqB8D,SACnB7Q,EAAAA,cAAC2e,EAAAA,EAAc,CAAC/e,UAAU,SACb,IAAX0L,GACmC,IAArCqB,EAA0BrB,QACK,IAA/BuB,EAAoBvB,QACY,IAAhCyB,EAAqBzB,OACrBtL,EAAAA,cAAA,OAAKJ,UAAU,iCAAgC,wBACvByE,EAAQrE,EAAAA,cAAA,YAAM,IAAOqE,EAAM,KAAgB,cAAc,0DAG/E,OAGPF,GACCnE,EAAAA,cAAA,OACEJ,UAAU,wFACVud,MAAO,CAAEyB,SAAU,wBAClBza,EAAUnE,EAAAA,cAACoV,EAAW,MAAMpV,EAAAA,cAAA,OAAK8C,GAAG,MAAMlD,UAAU,mBAGxDwI,GACCpI,EAAAA,cAAC6e,EAAAA,GAAqB,CACpBC,UAAWA,KACT/C,GAAsB,GACtBhM,YAAW,KACTvM,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAAI,EAET+P,QAASjD,EACTkD,OAAO,UACPC,YAAY,EACZC,SAAS,EACTC,iBAAmB,QAAOlB,aAC1BmB,OAAQA,KACNrD,GAAsB,GACtBhM,YAAW,KACTvM,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAAI,EAETqQ,iBAAiB,QACjBC,SAAUA,KACRlP,IACA2L,GAAsB,GACtBhM,YAAW,KACTvM,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAAI,EAETuQ,SAAS,GACTvf,EAAAA,cAACuU,EAAc,QAIpB,EAIQ,SAASiL,IAAK,OAC3BzW,EAAM,kBACNpB,EAAiB,aACjBC,EAAY,UACZE,EAAS,KACTC,EAAI,cACJ8T,EAAa,aACbrN,EAAY,SACZpG,EAAQ,SACR/E,IAEA,OACErD,EAAAA,cAAC0H,EAAkB,CACjBM,OAAQI,EACRH,OAAQ5E,GAAY+E,EACpBT,kBAAmBA,EACnBC,aAAcA,EACdC,cAAekB,EACfjB,UAAWA,EACXC,KAAMA,EACNyG,aAAcA,GACdxO,EAAAA,cAAC4b,GAAU,CAACC,cAAeA,IAGjC,C,mJCtTA,IAzE0BuC,KACxB,MAAM,MAAElW,IAAUC,EAAAA,EAAAA,KACZC,EAAWF,GAAS,KACnBuX,EAAWC,IAAgBxe,EAAAA,EAAAA,UAAS,KAErC,cAAEye,EAAa,iBAAEC,EAAgB,oBAAEC,EAAmB,0BAAEC,IAA8BC,EAAAA,EAAAA,GAAiB,CAC3G9J,SAAU,IACVnQ,QAAS,CACPka,MAAO,CAAC,WAAY,8BAA+B,kBAavD,OATAzX,EAAAA,EAAAA,YAAU,KACR,MAAM0X,EAAuB9S,GAAMuS,EAAavS,EAAEC,QAGlD,OAFAI,SAASD,iBAAiB,oBAAqB0S,GAExC,KACLzS,SAASe,oBAAoB,oBAAqB0R,EAAoB,CACvE,GACA,IAGDjgB,EAAAA,cAACkgB,EAAAA,GAAQ,CACPlM,GAAG,MACHpU,UAAU,YACVsC,MAAOud,EACPtd,SAAWI,IACLA,GACFod,EAAcQ,WAAW,CAAEC,QAAS7d,EAAK8d,WAAaC,IACpD,MAAMC,EAAe,CAAEja,IAAKga,EAAME,SAASnb,SAASiB,MAAOC,IAAK+Z,EAAME,SAASnb,SAASkB,OAClFnE,EAAQ,IAAI0L,YAAY,eAAgB,CAAEV,OAAQmT,IACxD/S,SAASK,cAAczL,GACvBsd,GAAae,EAAAA,EAAAA,IAAmBle,EAAKme,aAAa,GAEtD,GAEF1gB,EAAAA,cAAA,OAAKJ,UAAU,YACbI,EAAAA,cAACkgB,EAAAA,GAASS,MAAK,CACbxe,SAAWye,IACTlB,EAAakB,EAAIne,OAAOP,OACxB2d,EAAoB,CAAEgB,MAAOD,EAAIne,OAAOP,OAAQ,EAElDtC,WAAWO,EAAAA,EAAAA,GAAQ2gB,EAAAA,GAAuB,sDAC1CC,YAAY,aAEbjB,EACC9f,EAAAA,cAAC2e,EAAAA,EAAc,CAAC/e,UAAU,8BAA8BohB,iBAAiB,YAEzEhhB,EAAAA,cAACiU,EAAAA,EAAU,CAACrU,UAAU,mFAGzBggB,GAAkBpe,OAAS,IAAMse,GAChC9f,EAAAA,cAACkgB,EAAAA,GAASe,QAAO,CACfrhB,WAAWO,EAAAA,EAAAA,GAAQ+gB,EAAAA,GAAqB,0CACxC/D,MAAO,CAAEyB,SAAUxW,EAAW,IAAM,MACnCwX,EAAiBjd,KAAKJ,GACrBvC,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CAACve,IAAKL,EAAKme,YAAa9gB,UAAWwhB,EAAAA,GAA4Blf,MAAOK,GACpFvC,EAAAA,cAAA,OACE4Y,wBAAyB,CACvBC,QAAQ4H,EAAAA,EAAAA,IAAmBle,EAAKme,aAAa1b,QAC3C,IAAIqc,OAAO5B,EAAW,KACrB,mCAAkC6B,IAAW7B,oBAQnD,C,0MCnEf,MAAMrY,EAAeC,IACnBC,aACAA,oCAGIia,EAAaC,IACjB,MAAM,OAAEC,IAAWC,EAAAA,EAAAA,KAEbhZ,EADY,IAAID,gBAAgBjF,OAAO6B,SAASoB,QACvBkC,IAAI,UAAY,IACxCgZ,EAAYC,IAAiB1gB,EAAAA,EAAAA,UAASwH,IACtCyD,EAAoBC,IAAyBlL,EAAAA,EAAAA,WAAS,GAEvD8I,EAAY6X,IAChBD,EAAcC,GACdJ,EAAOI,EAAS,EAelB,OAZAtZ,EAAAA,EAAAA,YAAU,KACR,MAAMuZ,EAAqBA,IAAMF,EAAc,IACzCG,EAAuBA,IAAM3V,GAAsB,GAIzD,OAHAoB,SAASD,iBAAiB,mBAAoBuU,GAC9CtU,SAASD,iBAAiB,qBAAsBwU,GAEzC,KACLvU,SAASe,oBAAoB,mBAAoBuT,GACjDtU,SAASe,oBAAoB,qBAAsBwT,EAAqB,CACzE,GACA,IAGD/hB,EAAAA,cAAA,OAAKJ,UAAU,wBACbI,EAAAA,cAACkgB,EAAAA,GAAQ,CACPhe,MAAOyf,EACPxf,SAAWhD,IACT,GAAIA,EAAIR,KACN6E,OAAO6B,SAAS8P,MAAOjW,EAAAA,EAAAA,IAA6BC,OAC/C,CACLyiB,EAAcziB,GACd,MAAMiD,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQjO,IAC7DqO,SAASK,cAAczL,EACzB,IAEFpC,EAAAA,cAAA,OAAKJ,UAAU,YACbI,EAAAA,cAACkgB,EAAAA,GAASS,MAAK1gB,OAAAC,OAAA,CACb6gB,YAAY,oDACRS,EAAK,CACTrf,SAAWC,GAAU4H,EAAS5H,EAAMK,OAAOP,OAC3C8f,aAAe7iB,GAAQA,EAAIiS,MAAQuQ,GAAc,GACjD/hB,WAAWO,EAAAA,EAAAA,GAAQ2gB,EAAAA,GAAuB,+BAE5B,KAAfa,GACC3hB,EAAAA,cAACiV,EAAAA,GAAW,CACV5U,QAASA,KACP2J,EAAS,IACT,MAAM5H,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQ,CAAEgE,KAAM,MACrE5D,SAASK,cAAczL,EAAM,EAE/BxC,UAAU,kDAIhBI,EAAAA,cAACkgB,EAAAA,GAASe,QAAO,CAACrhB,WAAWO,EAAAA,EAAAA,GAAQ+gB,EAAAA,GAAqB,4CAExC,KAAfS,GACC3hB,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CAACjf,MAAO,CAAEY,GAAI,KAAMsO,KAAMuQ,GAAc/hB,UAAU,UAC/D+hB,GAGL3hB,EAAAA,cAACiiB,EAAAA,EAAK,CAAC1a,UAAU,aACfvH,EAAAA,cAACkiB,EAAAA,EAAS,CAACzd,YAAa,IACxBzE,EAAAA,cAACmiB,EAAsB,OAEzBniB,EAAAA,cAACiiB,EAAAA,EAAK,CAAC1a,UAAU,uBACfvH,EAAAA,cAACkiB,EAAAA,EAAS,CAACzd,YAAa,IACxBzE,EAAAA,cAACoiB,EAAyB,SAI/BjW,GAAsBnM,EAAAA,cAACoe,EAAAA,EAAiB,MACrC,EAIJ+D,EAAyBA,KAC7B,MAAM,KAAE/W,IAASiX,EAAAA,EAAAA,KACXzS,EAAYxE,EAAK9I,QAAQnD,GAA6B,IAArBA,EAAImjB,eACrCC,EAAmBnX,EAAK9I,QAAQnD,GAA6B,IAArBA,EAAImjB,eAElD,OACEtiB,EAAAA,cAAA,WACG4P,EAAUpO,OAAS,GAClBxB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAAClU,UAAU,YAAYmU,QAAQ,kBAAiB,aAG1DnE,EAAUjN,KAAKxD,GACda,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CACdve,IAAKzD,EAAIma,SACTpX,MAAO/C,EACPS,UAAWA,EAAGD,SAAQ6iB,eACpBriB,EAAAA,EAAAA,GAAQ,qCAAsCqiB,EAAW,UAAY7iB,EAAS,qBAAuB,KAEvGK,EAAAA,cAAA,UACE4Y,wBAAyB,CACvBC,OAAQ1Z,EAAIsjB,iBAAiBrR,KAAKlP,MAAM8C,QACtC,SACA,2EAGJ3E,QAASA,KACP,MAAM+B,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQjO,IAC7DqO,SAASK,cAAczL,EAAM,QAOxCmgB,EAAiB/gB,OAAS,GACzBxB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAAClU,UAAU,YAAYmU,QAAQ,kBAAiB,qBAG1DwO,EAAiB5f,KAAKxD,GACrBa,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CACdve,IAAKzD,EAAIma,SACTpX,MAAO/C,EACPS,UAAWA,EAAGD,SAAQ6iB,eACpBriB,EAAAA,EAAAA,GAAQ,qCAAsCqiB,EAAW,UAAY7iB,EAAS,qBAAuB,KAEvGK,EAAAA,cAAA,UACE4Y,wBAAyB,CACvBC,OAAQ1Z,EAAIsjB,iBAAiBrR,KAAKlP,MAAM8C,QACtC,SACA,2EAGJ3E,QAASA,KACP,MAAM+B,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQjO,IAC7DqO,SAASK,cAAczL,EAAM,QAOrC,EAIJggB,EAA4BA,KAChC,MAAM,KAAEhX,IAASiX,EAAAA,EAAAA,KAEXK,EAAevjB,GACFA,EAAIR,KAAKgb,gBAAgBgJ,OAAO9I,KAC5C,oCAAmC1a,EAAIR,KAAKgb,gBAAgBgJ,OAAO9I,OACpE1a,EAAIR,KAAKmb,MAKf,OACE9Z,EAAAA,cAAA,WACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAAClU,UAAU,YAAYmU,QAAQ,kBAAiB,iBAG1D3I,EAAKzI,KAAKxD,GACTa,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CAACve,IAAKzD,EAAIma,SAAUpX,MAAO/C,EAAKS,UAAWwhB,EAAAA,IACzDphB,EAAAA,cAAA,KAAGJ,UAAU,0BAA0BuV,MAAMjW,EAAAA,EAAAA,IAA6BC,IACxEa,EAAAA,cAAA,OAAKJ,UAAU,yBAAyBgb,IAAK8H,EAAYvjB,GAAM0b,IAAK1b,EAAIR,KAAKyS,OAC7EpR,EAAAA,cAAA,WACEA,EAAAA,cAAA,OACEJ,UAAU,YACVgZ,wBAAyB,CACvBC,OAAQ1Z,EAAIsjB,iBAAiB9jB,KAAKyS,KAAKlP,MAAM8C,QAC3C,SACA,6EAINhF,EAAAA,cAAA,OAAKJ,UAAU,qCACbI,EAAAA,cAACsY,EAAAA,EAAQ,CAAC1Y,UAAU,wBACpBI,EAAAA,cAAA,YAA+B,IAAxBb,EAAIoZ,gBAAwB,MAAQnN,EAAKmN,iBAChDvY,EAAAA,cAAA,QAAMJ,UAAU,aAAaT,EAAIqZ,cAAc,kBAMrD,EAUV,IANwBoK,IACtB5iB,EAAAA,cAAC6iB,EAAAA,EAAa,CAACzb,aAAcA,EAAcG,UAAU,aACnDvH,EAAAA,cAACuhB,EAAS,M","sources":["webpack://daocloud/./app/javascript/@core/practitioner/practitioner.utils.js","webpack://daocloud/./app/javascript/components/shared/Pill.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/FacetList.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/searchUtils.js","webpack://daocloud/./app/javascript/pages/SearchPage/SearchPageContext.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/HealthIssuesFacetList.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/LocationFilters.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/RefinementPanel.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/TherapiesFilters.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/FiltersSection.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/JoinInterstitial.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/MapWithPins.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/QuizInterstitial.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/SearchCard.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/SearchPills.jsx","webpack://daocloud/./app/javascript/pages/SearchPage.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/LocationSearchBox.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/TopNavSearchBox.jsx"],"sourcesContent":["export const websiteSubscriptionTypes = [\n  \"Annual - Website\",\n  \"Lifer - Website\",\n  \"Lifer - Professional\",\n  \"Professional\",\n  \"Website - Annual\",\n  \"Website - Lifer\"\n]\n\nexport const practitionerWebsiteUrl = (user, practice) => {\n  let slug = user.vanitySlug || user.slug\n  if (!practice) {\n    return `/${slug}`\n  }\n  const websiteUrl =\n    practice.website && websiteSubscriptionTypes.includes(user.subscriptionType) ? practice.website : `/${slug}`\n\n  return websiteUrl\n}\n\n// Hit is the practitioner object from Algolia and is snake_case\nexport const searchPractitionerWebsiteUrl = (hit) => {\n  if (hit.custom_domain_host) {\n    return `https://${hit.custom_domain_host}`\n  }\n\n  const slug = hit.user.vanity_slug || hit.user.slug\n\n  const websiteUrl =\n    hit.website && websiteSubscriptionTypes.includes(hit.subscription_type)\n      ? hit.website.startsWith(\"http\")\n        ? hit.website\n        : `https://${hit.website}`\n      : `/${slug}`\n\n  return websiteUrl\n}\n","import { EllipsisVerticalIcon, XMarkIcon } from \"@heroicons/react/24/outline\"\nimport clsx from \"clsx\"\nimport PropTypes from \"prop-types\"\nimport React from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nconst Pill = ({ children, onClick, type = \"primary\" }) => (\n  <div\n    className={clsx(\n      \"flex h-8 min-w-fit max-w-fit items-center whitespace-nowrap border border-gray px-4 py-1 text-center hover:cursor-pointer hover:border-black\",\n      { \"bg-white\": type === \"primary\" },\n      { \"border-none bg-offwhite\": type === \"secondary\" },\n      { \"border-teal bg-teal text-white\": type === \"tertiary\" }\n    )}\n    style={{ borderRadius: \"50px\" }}\n    onClick={onClick}>\n    {children}\n  </div>\n)\n\nPill.propTypes = {\n  type: PropTypes.oneOf([\"primary\", \"secondary\", \"tertiary\"]),\n  children: PropTypes.node,\n  onClick: PropTypes.func\n}\n\nexport default Pill\n\nexport const EndorsementPill = ({ children, draggable, active, className, onCloseButtonClick, ...rest }) => {\n  const Tag = draggable ? \"div\" : \"button\"\n\n  return (\n    <Tag\n      className={twMerge(\n        \"flex items-center justify-center rounded border border-gray px-3 py-1 hover:border-black focus:outline-none focus:ring-2 focus:ring-blue\",\n        active ? \"border-gray-dark bg-gray-dark font-bold text-white hover:border-gray-dark\" : \"bg-white\",\n        draggable ? \"cursor-grab\" : \"cursor-pointer\",\n        className\n      )}\n      {...rest}>\n      {draggable && <EllipsisVerticalIcon className=\"-ml-2 h-5 w-5 stroke-2\">{draggable}</EllipsisVerticalIcon>}\n      {children}\n      {draggable && (\n        <button onClick={onCloseButtonClick}>\n          <XMarkIcon className=\"z-10 ml-2 h-5 w-5\" />\n        </button>\n      )}\n    </Tag>\n  )\n}\n\nexport const SearchPill = ({ children, onClick, onCloseButtonClick }) => (\n  <div\n    className=\"flex h-8 items-center justify-center rounded bg-gray-dark px-3 py-1 font-bold text-white sm:flex-none\"\n    onClick={onClick}>\n    {children}\n    <button onClick={onCloseButtonClick}>\n      <XMarkIcon className=\"z-10 ml-2 h-5 w-5\" />\n    </button>\n  </div>\n)\n","import React, { useState, memo } from \"react\"\n\nimport { CheckBox, SearchInput } from \"../../components/shared/Inputs\"\n\nconst FacetList = ({\n  items,\n  selectedItems,\n  setSelectedItems,\n  counts,\n  searchable = false,\n  searchSubtext,\n  alwaysShowAll = false\n}) => {\n  const [filteredItems, setFilteredItems] = useState(items)\n  const [isShowingMore, setIsShowingMore] = useState(false)\n  const [searchValue, setSearchValue] = useState(\"\")\n  const canToggleShowMore = filteredItems.length > 4\n\n  return (\n    <>\n      {searchable && (\n        <SearchInput\n          type=\"search\"\n          autoComplete=\"off\"\n          autoCorrect=\"off\"\n          autoCapitalize=\"off\"\n          spellCheck={false}\n          maxLength={512}\n          containerClassName=\"w-full\"\n          explanatorySubtext={searchSubtext}\n          value={searchValue}\n          onChange={(event) => {\n            const newItems = items.filter((item) => item.toLowerCase().includes(event.target.value.toLowerCase()))\n            setFilteredItems(newItems)\n            setSearchValue(event.target.value)\n          }}\n        />\n      )}\n      <ul className=\"mt-4 flex flex-col gap-1.5\">\n        {filteredItems\n          .filter((item) => counts && !!counts[item])\n          .slice(0, isShowingMore || alwaysShowAll ? filteredItems.length : 4)\n          .map((item) => (\n            <li key={item}>\n              <CheckBox\n                id={`in-person-checkbox-${item}`}\n                className=\"mb-0\"\n                checked={selectedItems.includes(item)}\n                onChange={() => {\n                  setSelectedItems((prevItems) => {\n                    if (prevItems.includes(item)) {\n                      return prevItems.filter((prevItem) => prevItem !== item)\n                    } else {\n                      return [...prevItems, item]\n                    }\n                  })\n                }}\n                label={counts ? `${item} (${counts[item] || 0})` : item}\n              />\n            </li>\n          ))}\n      </ul>\n      {canToggleShowMore && !alwaysShowAll && (\n        <button onClick={() => setIsShowingMore(!isShowingMore)} className=\"mt-1.5 font-bold text-teal\">\n          {isShowingMore ? \"See less\" : \"See all\"}\n        </button>\n      )}\n    </>\n  )\n}\n\nexport default memo(FacetList)\n","export const filtersString = ({\n  selectedTherapies,\n  selectedHealthIssues,\n  selectedLocations,\n  offersFreeConsult,\n  selectedLanguages,\n  selectedAges\n}) => {\n  let selectedTherapyFilters = selectedTherapies\n    ?.map((therapy) => `therapies:\"${therapy.replace(/\\s*\\(.*\\)$/, \"\")}\"`)\n    ?.join(\" OR \")\n  selectedTherapyFilters = selectedTherapyFilters ? `(${selectedTherapyFilters})` : null\n  let selectedHealthIssueFilters = selectedHealthIssues\n    ?.map((condition) => `health_issues:\"${condition}\"`)\n    ?.join(\" AND \")\n  selectedHealthIssueFilters = selectedHealthIssueFilters ? `(${selectedHealthIssueFilters})` : null\n  let selectedLocationFilters = selectedLocations?.map((location) => `location_types:\"${location}\"`)?.join(\" OR \")\n  selectedLocationFilters = selectedLocationFilters ? `(${selectedLocationFilters})` : null\n  const freeConsultFilter = offersFreeConsult ? \"free_consult:true\" : null\n  const selectedLanguagesFilters = selectedLanguages?.map((language) => `languages:\"${language}\"`)?.join(\" OR \")\n  const selectedAgeWorkWithFilters = selectedAges?.map((age) => `age_work_withs:\"${age}\"`)?.join(\" OR \")\n  return [\n    selectedTherapyFilters,\n    selectedHealthIssueFilters,\n    selectedLocationFilters,\n    freeConsultFilter,\n    selectedLanguagesFilters,\n    selectedAgeWorkWithFilters\n  ]\n    .filter(Boolean)\n    .join(\" AND \")\n}\n\nexport const shouldShowMap = ({ isTablet, mapCenter, selectedLocations }) =>\n  (typeof window === \"undefined\" && !isTablet) ||\n  (!!mapCenter &&\n    !isTablet &&\n    (selectedLocations.includes(\"home\") || selectedLocations.includes(\"office\") || selectedLocations.length === 0))\n\nexport const isVirtualView = ({ selectedLocations }) =>\n  selectedLocations.includes(\"virtual\") && selectedLocations.length === 1\n\nexport const getSearchOptions = ({\n  filters,\n  boundingBox,\n  radiusInMiles,\n  mapCenter,\n  isTablet,\n  selectedLocations,\n  currentPage\n}) => {\n  const options = {\n    page: currentPage,\n    filters,\n    facets: [\"health_issues\", \"languages\", \"age_work_withs\"]\n  }\n\n  const virtualView = isVirtualView({ selectedLocations })\n  const showMap = shouldShowMap({ isTablet, mapCenter, selectedLocations })\n\n  if (showMap && boundingBox) {\n    options.insideBoundingBox = [boundingBox]\n  } else if (isTablet && mapCenter) {\n    if (radiusInMiles) {\n      options.aroundRadius = radiusInMiles * 1609\n      options.aroundPrecision = 5 * 1609\n    }\n    options.aroundLatLng = [mapCenter.lat, mapCenter.lng].join(\",\")\n  } else if (virtualView && !isTablet) {\n    // no early return or additional options for virtual web view\n  } else {\n    return null\n  }\n\n  return options\n}\n\nexport const updateUrl = ({\n  query,\n  radiusInMiles,\n  mapCenter,\n  mapZoom,\n  selectedTherapies,\n  selectedHealthIssues,\n  selectedLocations,\n  offersFreeConsult,\n  selectedLanguages,\n  selectedAges,\n  isMobile,\n  poppingState,\n  setPoppingState,\n  boundingBox\n}) => {\n  const queryParams = new URLSearchParams()\n  if (query) queryParams.set(\"query\", query)\n  if (radiusInMiles && isMobile) queryParams.set(\"radius\", radiusInMiles)\n  if (mapCenter) queryParams.set(\"mapCenter\", [mapCenter.lat, mapCenter.lng].join(\",\"))\n  if (selectedTherapies.length) queryParams.set(\"therapies\", selectedTherapies.join(\",\"))\n  if (selectedHealthIssues.length) queryParams.set(\"healthIssues\", selectedHealthIssues.join(\",\"))\n  if (selectedLocations.length) queryParams.set(\"locations\", selectedLocations.join(\",\"))\n  if (offersFreeConsult) queryParams.set(\"freeConsult\", offersFreeConsult)\n  if (selectedLanguages.length) queryParams.set(\"languages\", selectedLanguages.join(\",\"))\n  if (selectedAges.length) queryParams.set(\"ages\", selectedAges.join(\",\"))\n  if (mapZoom) queryParams.set(\"mapZoom\", mapZoom)\n  if (boundingBox) queryParams.set(\"boundingBox\", boundingBox.join(\",\"))\n\n  const currentParams = new URLSearchParams(window.location.search)\n  if (currentParams.has(\"debug\")) queryParams.set(\"debug\", \"true\")\n\n  if (poppingState) {\n    setPoppingState(false)\n    return\n  }\n\n  window.history.pushState(\n    { queryString: queryParams.toString() },\n    \"\",\n    `/practitioner-search?${queryParams.toString()}`\n  )\n}\n\nexport const performSearch = (\n  {\n    searchIndex,\n    selectedTherapies,\n    selectedHealthIssues,\n    selectedLocations,\n    offersFreeConsult,\n    selectedLanguages,\n    selectedAges,\n    currentPage,\n    boundingBox,\n    showMap,\n    radiusInMiles,\n    mapCenter,\n    isTablet,\n    query,\n    similarQuery,\n    additionalFilters,\n    virtualFallback,\n    hitsPerPage\n  },\n  onSuccess\n) => {\n  if (hitsPerPage === undefined) hitsPerPage = isTablet ? 3 : 25\n\n  const filters = filtersString({\n    selectedTherapies,\n    selectedHealthIssues,\n    selectedLocations,\n    offersFreeConsult,\n    selectedLanguages,\n    selectedAges\n  })\n\n  const searchOptions = getSearchOptions({\n    currentPage,\n    filters,\n    boundingBox,\n    showMap,\n    radiusInMiles,\n    mapCenter,\n    isTablet,\n    selectedLocations\n  })\n\n  if (mapCenter === null || searchOptions === null) {\n    return // don't trigger a search if the search options state isn't fully initialized\n  }\n\n  searchOptions.hitsPerPage = hitsPerPage\n\n  if (similarQuery) {\n    searchOptions.similarQuery = query\n  }\n\n  if (additionalFilters) {\n    if (searchOptions.filters) {\n      searchOptions.filters = `${filters} AND ${additionalFilters}`\n    } else {\n      searchOptions.filters = additionalFilters\n    }\n  }\n\n  if (virtualFallback) {\n    delete searchOptions.aroundLatLng\n    delete searchOptions.aroundRadius\n  }\n\n  searchOptions.attributesToHighlight = []\n\n  searchIndex.search(query, searchOptions).then((searchResponse) => {\n    onSuccess(searchResponse)\n  })\n}\n\nexport const doubleBoundingBoxSize = (mapCenter, boundingBox) => {\n  if (!mapCenter || !boundingBox) return null\n\n  const deltaX = (boundingBox[2] - boundingBox[0]) / 2\n  const deltaY = (boundingBox[1] - boundingBox[3]) / 2\n\n  const newTopLeft = [mapCenter.lat - deltaX * 2, mapCenter.lng + deltaY * 2]\n  const newBottomRight = [mapCenter.lat + deltaX * 2, mapCenter.lng - deltaY * 2]\n\n  return newTopLeft.concat(newBottomRight)\n}\n","import algoliasearch from \"algoliasearch/lite\"\nimport differenceBy from \"lodash/differenceBy\"\nimport React, { createContext, useCallback, useContext, useEffect, useState } from \"react\"\n\nimport useWindowSize from \"../../hooks/useWindowSize\"\n\nimport { doubleBoundingBoxSize, isVirtualView, performSearch, shouldShowMap, updateUrl } from \"./searchUtils\"\n\nconst SearchPageContext = createContext()\n\nconst searchClient = algoliasearch(\n  process?.env?.ALGOLIA_HEALME_SEARCH_APPLICATION_ID,\n  process?.env?.ALGOLIA_HEALME_SEARCH_CLIENT_API_KEY\n)\n\nconst indexName = \"Practice_production\"\nconst countsIndex = searchClient.initIndex(indexName)\nconst searchIndex = searchClient.initIndex(indexName)\n\nexport const SearchPageProvider = ({\n  children,\n  therapyCategories,\n  healthIssues,\n  defaultLatLng,\n  languages,\n  ages,\n  mobile,\n  tablet\n}) => {\n  const { width } = useWindowSize()\n  const [isMobile, setIsMobile] = useState(mobile)\n  const [isTablet, setIsTablet] = useState(tablet)\n\n  useEffect(() => {\n    if (width) {\n      setIsMobile(width ? width < 768 : isMobile)\n      setIsTablet(width ? width < 1150 : isTablet)\n    }\n  }, [width])\n\n  const [urlParams] = useState(\n    typeof window !== \"undefined\" ? new URLSearchParams(window.location.search) : new URLSearchParams()\n  )\n  const defaultQuery = urlParams.get(\"query\") || \"\"\n  const defaultRadius = isTablet ? parseInt(urlParams.get(\"radius\")) || 25 : null\n\n  const mapCenterParam = urlParams.get(\"mapCenter\")\n  const latLng = mapCenterParam?.split(\",\").map((coord) => parseFloat(coord))\n  const defaultMapCenter = latLng\n    ? { lat: latLng[0], lng: latLng[1] }\n    : typeof localStorage !== \"undefined\"\n    ? JSON.parse(localStorage.getItem(\"mapCenter\"))\n    : null\n  const defaultTherapies = urlParams.get(\"therapies\")?.split(\",\") || []\n  const defaultHealthIssues = urlParams.get(\"healthIssues\")?.split(\",\") || []\n  const defaultLocations = urlParams.get(\"locations\")?.split(\",\") || [\"office\", \"home\", \"virtual\"]\n  const defaultOffersFreeConsult = urlParams.get(\"freeConsult\") === \"true\"\n  const defaultLanguages = urlParams.get(\"languages\")?.split(\",\") || []\n  const defaultAges = urlParams.get(\"ages\")?.split(\",\") || []\n  const defaultMapZoom = urlParams.get(\"mapZoom\") ? parseFloat(urlParams.get(\"mapZoom\")) : 12\n  const defaultBoundingBox = urlParams\n    .get(\"boundingBox\")\n    ?.split(\",\")\n    .map((coord) => parseFloat(coord))\n\n  // search state\n  const [query, setQuery] = useState(defaultQuery || \"\")\n  const [radiusInMiles, setRadiusInMiles] = useState(defaultRadius)\n  const [mapCenter, setMapCenter] = useState(defaultMapCenter)\n  const [boundingBox, setBoundingBox] = useState(defaultBoundingBox)\n  const [selectedTherapies, setSelectedTherapies] = useState(defaultTherapies)\n  const [selectedHealthIssues, setSelectedHealthIssues] = useState(defaultHealthIssues)\n  const [selectedLocations, setSelectedLocations] = useState(defaultLocations)\n  const [offersFreeConsult, setOffersFreeConsult] = useState(defaultOffersFreeConsult)\n  const [selectedLanguages, setSelectedLanguages] = useState(defaultLanguages)\n  const [selectedAges, setSelectedAges] = useState(defaultAges)\n  const [mapZoom, setMapZoom] = useState(defaultMapZoom)\n\n  const [inPersonCounts, setInPersonCounts] = useState({})\n  const [healthIssueCounts, setHealthIssueCounts] = useState(null)\n  const [languageCounts, setLanguageCounts] = useState(null)\n  const [ageCounts, setAgeCounts] = useState(null)\n  const [hits, setHits] = useState(null)\n  const [nbHits, setNbHits] = useState(0)\n  const [isLastPage, setIsLastPage] = useState(true)\n  const [currentPage, setCurrentPage] = useState(0)\n  const [isFetchingNextPage, setIsFetchingNextPage] = useState(false)\n  const [loading, setLoading] = useState(true)\n  const [poppingState, setPoppingState] = useState(false)\n  const [previousSearch, setPreviousSearch] = useState(null)\n  const [googlePlacesLoaded, setGooglePlacesLoaded] = useState(false)\n  const [shouldDynamicZoom, setShouldDynamicZoom] = useState(true)\n  const [performedFallbackSearches, setPerformedFallbackSearches] = useState(false)\n  const [mapPins, setMapPins] = useState()\n  const showMap = shouldShowMap({ isTablet, mapCenter, selectedLocations })\n  const virtualView = isVirtualView({ selectedLocations })\n  const locationOptions = [\"office\", \"home\", \"virtual\"]\n\n  const [similarQueryFallbackState, setSimilarQueryFallbackState] = useState({ hits: [], nbHits: 0 })\n  const [nearbyFallbackState, setNearbyFallbackState] = useState({ hits: [], nbHits: 0 })\n  const [virtualFallbackState, setVirtualFallbackState] = useState({ hits: [], nbHits: 0 })\n\n  useEffect(() => {\n    const onPopState = () => {\n      const urlParams = new URLSearchParams(window.location.search)\n      setSelectedTherapies(urlParams.get(\"therapies\")?.split(\",\") || [])\n      setSelectedHealthIssues(urlParams.get(\"healthIssues\")?.split(\",\") || [])\n      setSelectedLocations(urlParams.get(\"locations\")?.split(\",\") || [\"office\", \"home\", \"virtual\"])\n      setOffersFreeConsult(urlParams.get(\"freeConsult\") === \"true\")\n      setSelectedLanguages(urlParams.get(\"languages\")?.split(\",\") || [])\n      setSelectedAges(urlParams.get(\"ages\")?.split(\",\") || [])\n      setQuery(urlParams.get(\"query\") || \"\")\n      setRadiusInMiles(isMobile ? urlParams.get(\"radius\") || 25 : null)\n\n      const mapCenterParam = urlParams.get(\"mapCenter\")\n      if (mapCenterParam) {\n        const latLng = mapCenterParam.split(\",\").map((coord) => parseFloat(coord))\n        setMapCenter(isMobile ? { lat: latLng[0], lng: latLng[1] } : null)\n      }\n      setBoundingBox(\n        urlParams\n          .get(\"boundingBox\")\n          ?.split(\",\")\n          .map((coord) => parseFloat(coord))\n      )\n\n      setPoppingState(true)\n    }\n\n    const onNewMapCenter = (e) => {\n      setMapCenter(e.detail)\n      setMapZoom(12)\n      setShouldDynamicZoom(true)\n      localStorage.setItem(\"mapCenter\", JSON.stringify(e.detail))\n    }\n\n    window.addEventListener(\"popstate\", onPopState)\n    document.addEventListener(\"newMapCenter\", onNewMapCenter)\n\n    async function initPlaces() {\n      await window.google.maps.importLibrary(\"places\")\n      setGooglePlacesLoaded(true)\n      document.dispatchEvent(new CustomEvent(\"googlePlacesLoaded\"))\n    }\n\n    initPlaces()\n\n    if (!isMobile && !isTablet) {\n      fetch(\"/practitioner-search/map_pins\")\n        .then((response) => {\n          response.json().then((data) => {\n            setMapPins(data)\n          })\n        })\n        .catch((error) => {\n          console.error(\"Error fetching map pins\", error)\n        })\n    }\n\n    return () => {\n      window.removeEventListener(\"popstate\", onPopState)\n      document.removeEventListener(\"newMapCenter\", onNewMapCenter)\n    }\n  }, [])\n\n  useEffect(() => {\n    const searchParams = {\n      searchIndex,\n      selectedTherapies,\n      selectedHealthIssues,\n      selectedLocations,\n      offersFreeConsult,\n      selectedLanguages,\n      selectedAges,\n      currentPage,\n      boundingBox,\n      showMap,\n      radiusInMiles,\n      mapCenter,\n      isTablet,\n      query\n    }\n\n    performSearch(searchParams, (searchResponse) => {\n      const { hits, nbHits, facets, nbPages, page } = searchResponse\n\n      const searchString =\n        selectedTherapies +\n        selectedHealthIssues +\n        selectedLocations +\n        offersFreeConsult +\n        selectedLanguages +\n        selectedAges +\n        mapCenter.lat +\n        mapCenter.lng +\n        radiusInMiles +\n        boundingBox +\n        query\n\n      let newSearch = false\n      if (searchString !== previousSearch) {\n        newSearch = true\n        setCurrentPage(0)\n        setPreviousSearch(searchString)\n        setHits([])\n        setLoading(true)\n        setSimilarQueryFallbackState({ hits: [], nbHits: 0 })\n        setNearbyFallbackState({ hits: [], nbHits: 0 })\n        setVirtualFallbackState({ hits: [], nbHits: 0 })\n      }\n\n      if (facets?.health_issues) setHealthIssueCounts(facets.health_issues)\n      if (facets?.languages) setLanguageCounts(facets.languages)\n      if (facets?.age_work_withs) setAgeCounts(facets.age_work_withs)\n\n      setNbHits(nbHits)\n      if (newSearch || page === 0) {\n        setHits(hits)\n      } else {\n        setHits((prevHits) => [...prevHits, ...hits])\n      }\n      setSimilarQueryFallbackState({ hits: [], nbHits: 0 })\n      setNearbyFallbackState({ hits: [], nbHits: 0 })\n      setVirtualFallbackState({ hits: [], nbHits: 0 })\n      setPerformedFallbackSearches(false)\n      setIsLastPage(page + 1 >= nbPages)\n      setIsFetchingNextPage(false)\n      setLoading(false)\n\n      if (searchParams.showMap && shouldDynamicZoom) {\n        let newZoom\n        if (nbHits <= 5 && mapZoom > 9) {\n          newZoom = mapZoom - 1\n        } else if (nbHits > 50 && mapZoom < 13) {\n          newZoom = mapZoom + 1\n        }\n        if (newZoom !== undefined) {\n          setMapZoom(newZoom)\n          const event = new CustomEvent(\"newMapZoom\", { detail: newZoom })\n          document.dispatchEvent(event)\n        }\n      }\n\n      setShouldDynamicZoom(false)\n      if (page === 0) window.scrollTo(0, 0)\n\n      updateUrl({\n        query,\n        radiusInMiles,\n        mapCenter,\n        boundingBox,\n        mapZoom,\n        selectedTherapies,\n        selectedHealthIssues,\n        selectedLocations,\n        offersFreeConsult,\n        selectedLanguages,\n        selectedAges,\n        isMobile,\n        poppingState,\n        setPoppingState\n      })\n    })\n  }, [\n    query,\n    boundingBox,\n    radiusInMiles,\n    selectedTherapies,\n    selectedHealthIssues,\n    selectedLocations,\n    selectedLanguages,\n    selectedAges,\n    mapCenter,\n    showMap,\n    offersFreeConsult,\n    currentPage\n  ])\n\n  useEffect(() => {\n    const countsSearchParams = {\n      filters: \"location_types:office OR location_types:home\",\n      hitsPerPage: 100\n    }\n\n    if (boundingBox) {\n      countsSearchParams.insideBoundingBox = [boundingBox]\n    } else if (mapCenter && radiusInMiles) {\n      countsSearchParams.aroundLatLng = `${mapCenter.lat},${mapCenter.lng}`\n      countsSearchParams.aroundRadius = radiusInMiles * 1609\n    } else {\n      return\n    }\n\n    countsIndex.search(\"\", countsSearchParams).then(({ hits }) => {\n      const counts = hits.reduce((acc, hit) => {\n        hit.therapies?.forEach((therapy) => {\n          acc[therapy] = acc[therapy] ? acc[therapy] + 1 : 1\n        })\n        return acc\n      }, {})\n      setInPersonCounts(counts)\n    })\n  }, [boundingBox])\n\n  useEffect(() => {\n    if (loading === false) {\n      const timeout = setTimeout(() => {\n        const savedScrollPosition = sessionStorage.getItem(\"scrollPosition\") || 0\n        sessionStorage.removeItem(\"scrollPosition\")\n        window.scrollTo(0, parseInt(savedScrollPosition, 10))\n      }, 300)\n\n      return () => clearTimeout(timeout)\n    }\n  }, [loading])\n\n  const showMore = () => {\n    if (isFetchingNextPage) return\n    setCurrentPage((prev) => prev + 1)\n    setIsFetchingNextPage(true)\n  }\n\n  const resetFilters = useCallback(() => {\n    setQuery(\"\")\n    setSelectedTherapies([])\n    setSelectedHealthIssues([])\n    setSelectedLocations([\"office\", \"home\", \"virtual\"])\n    setOffersFreeConsult(false)\n    setSelectedLanguages([])\n    setSelectedAges([])\n    setSimilarQueryFallbackState({ hits: [], nbHits: 0 })\n    setNearbyFallbackState({ hits: [], nbHits: 0 })\n    setVirtualFallbackState({ hits: [], nbHits: 0 })\n    document.dispatchEvent(new CustomEvent(\"resetSearchField\"))\n    window.scrollTo(0, 0)\n  }, [])\n\n  const searchParams = {\n    searchIndex,\n    selectedTherapies,\n    selectedHealthIssues,\n    selectedLocations,\n    offersFreeConsult,\n    selectedLanguages,\n    selectedAges,\n    currentPage,\n    boundingBox,\n    showMap,\n    radiusInMiles,\n    mapCenter,\n    isTablet,\n    query\n  }\n\n  const similarQueryFallbackSearch = () => {\n    const newSearchParams = { ...searchParams, similarQuery: true, hitsPerPage: 25, currentPage: 0 }\n    setSimilarQueryFallbackState((state) => ({ ...state, fetching: true }))\n    performSearch(newSearchParams, (response) => {\n      if (response.nbHits > 0) {\n        const newHits = differenceBy(response.hits, hits, \"objectID\")\n        setSimilarQueryFallbackState({ hits: newHits, nbHits: newHits.length, fetching: false, queryCompleted: true })\n      } else {\n        setSimilarQueryFallbackState({ hits: [], nbHits: 0, fetching: false, queryCompleted: true })\n      }\n    })\n  }\n\n  const nearbyFallbackSearch = () => {\n    const newSearchParams = {\n      ...searchParams,\n      boundingBox: doubleBoundingBoxSize(searchParams.mapCenter, searchParams.boundingBox),\n      radiusInMiles: searchParams.radiusInMiles * 2,\n      hitsPerPage: 25,\n      currentPage: 0\n    }\n    setNearbyFallbackState((state) => ({ ...state, fetching: true }))\n    performSearch(newSearchParams, (response) => {\n      if (response.nbHits > 0) {\n        const newHits = differenceBy(response.hits, hits, \"objectID\")\n        setNearbyFallbackState({ hits: newHits, nbHits: newHits.length, fetching: false, queryCompleted: true })\n      } else {\n        setNearbyFallbackState({ hits: [], nbHits: 0, fetching: false, queryCompleted: true })\n      }\n    })\n  }\n\n  const virtualFallbackSearch = () => {\n    const additionalFilters = therapyCategories\n      .filter((therapy) => therapy.inPersonOnly)\n      .map((therapy) => `NOT therapies:\"${therapy.name}\"`)\n      .join(\" AND \")\n    const virtualSearchParams = {\n      ...searchParams,\n      selectedLocations: [\"virtual\"],\n      additionalFilters,\n      virtualFallback: true,\n      hitsPerPage: 25,\n      currentPage: 0\n    }\n\n    setVirtualFallbackState((state) => ({ ...state, fetching: true }))\n    performSearch(virtualSearchParams, (response) => {\n      if (response.nbHits > 0) {\n        const newHits = differenceBy(response.hits, hits, \"objectID\")\n        setVirtualFallbackState({ hits: newHits, nbHits: newHits.length, fetching: false, queryCompleted: true })\n      } else {\n        setVirtualFallbackState({ hits: [], nbHits: 0, fetching: false, queryCompleted: true })\n      }\n    })\n  }\n\n  return (\n    <SearchPageContext.Provider\n      value={{\n        radiusInMiles,\n        setRadiusInMiles,\n        isMobile,\n        isTablet,\n        therapyCategories,\n        healthIssues,\n        languages,\n        ages,\n        query,\n        setQuery,\n        selectedTherapies,\n        setSelectedTherapies,\n        selectedHealthIssues,\n        setSelectedHealthIssues,\n        selectedLocations,\n        setSelectedLocations,\n        selectedLanguages,\n        setSelectedLanguages,\n        selectedAges,\n        setSelectedAges,\n        locationOptions,\n        showMap,\n        virtualView,\n        mapCenter,\n        setMapCenter,\n        mapZoom,\n        setMapZoom,\n        boundingBox,\n        setBoundingBox,\n        inPersonCounts,\n        healthIssueCounts,\n        languageCounts,\n        ageCounts,\n        hits,\n        nbHits,\n        defaultLatLng,\n        offersFreeConsult,\n        setOffersFreeConsult,\n        isLastPage,\n        loading,\n        showMore,\n        resetFilters,\n        googlePlacesLoaded,\n        similarQueryFallbackState,\n        setSimilarQueryFallbackState,\n        nearbyFallbackState,\n        setNearbyFallbackState,\n        virtualFallbackState,\n        setVirtualFallbackState,\n        similarQueryFallbackSearch,\n        nearbyFallbackSearch,\n        virtualFallbackSearch,\n        performedFallbackSearches,\n        setPerformedFallbackSearches,\n        mapPins\n      }}>\n      {children}\n    </SearchPageContext.Provider>\n  )\n}\n\nexport const useSearchPageContext = () => useContext(SearchPageContext)\n","import React, { useState, memo } from \"react\"\n\nimport { CheckBox, SearchInput } from \"../../components/shared/Inputs\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst HealthIssuesFacetList = () => {\n  const { healthIssues, setSelectedHealthIssues, selectedHealthIssues, healthIssueCounts } = useSearchPageContext()\n  const [filteredItems, setFilteredItems] = useState(healthIssues)\n  const [numShown, setNumShown] = useState(4)\n  const [searchValue, setSearchValue] = useState(\"\")\n  const canToggleShowMore = filteredItems.length > 4\n\n  const shownHealthIssues = filteredItems\n    .filter((item) => (searchValue === \"\" && healthIssueCounts ? healthIssueCounts[item] > 0 : true))\n    .sort((a, b) => {\n      const aSelected = selectedHealthIssues.includes(a) ? 1 : 0\n      const bSelected = selectedHealthIssues.includes(b) ? 1 : 0\n\n      if (aSelected !== bSelected) return bSelected - aSelected\n\n      if (healthIssueCounts) {\n        return (healthIssueCounts[b] || 0) - (healthIssueCounts[a] || 0)\n      } else {\n        return a.localeCompare(b)\n      }\n    })\n\n  return (\n    <>\n      <SearchInput\n        type=\"search\"\n        autoComplete=\"off\"\n        autoCorrect=\"off\"\n        autoCapitalize=\"off\"\n        spellCheck={false}\n        maxLength={512}\n        containerClassName=\"w-full\"\n        explanatorySubtext=\"Ex “Low back pain” or “Joint pain”\"\n        value={searchValue}\n        onChange={(event) => {\n          const newItems = healthIssues.filter((item) => item.toLowerCase().includes(event.target.value.toLowerCase()))\n          setFilteredItems(newItems)\n          setSearchValue(event.target.value)\n        }}\n      />\n      <ul className=\"mt-4 flex flex-col gap-1.5\">\n        {shownHealthIssues.slice(0, numShown).map((item) => (\n          <li key={item}>\n            <CheckBox\n              id={`health-issue-${item}`}\n              className=\"mb-0\"\n              checked={selectedHealthIssues.includes(item)}\n              onChange={() => {\n                setSelectedHealthIssues((prevItems) => {\n                  if (prevItems.includes(item)) {\n                    return prevItems.filter((prevItem) => prevItem !== item)\n                  } else {\n                    return [...prevItems, item]\n                  }\n                })\n              }}\n              label={\n                healthIssueCounts && healthIssueCounts[item] > 0\n                  ? `${item} (${healthIssueCounts[item] > 99 ? \"99+\" : healthIssueCounts[item]})`\n                  : item\n              }\n            />\n          </li>\n        ))}\n      </ul>\n      {canToggleShowMore && (\n        <button\n          onClick={() => (numShown < shownHealthIssues.length ? setNumShown(numShown + 10) : setNumShown(4))}\n          className=\"mt-1.5 font-bold text-teal\">\n          {numShown < shownHealthIssues.length ? \"Load 10 more\" : \"See less\"}\n        </button>\n      )}\n    </>\n  )\n}\n\nexport default memo(HealthIssuesFacetList)\n","import React from \"react\"\n\nimport { CheckBox } from \"../../components/shared/Inputs\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst locationName = (location) => {\n  if (location === \"office\") {\n    return \"At a practice\"\n  } else if (location === \"home\") {\n    return \"At my home\"\n  } else if (location === \"virtual\") {\n    return \"Virtual\"\n  }\n}\n\nconst LocationFilters = () => {\n  const { locationOptions, selectedLocations, setSelectedLocations } = useSearchPageContext()\n\n  return (\n    <>\n      <ul className=\"mt-3 flex flex-col gap-1\">\n        {locationOptions.map((item) => (\n          <li key={item}>\n            <CheckBox\n              className=\"mb-0\"\n              checked={selectedLocations.includes(item)}\n              onChange={() => {\n                setSelectedLocations((locations) => {\n                  if (locations.includes(item)) {\n                    return locations.filter((location) => location !== item)\n                  } else {\n                    return [...locations, item]\n                  }\n                })\n              }}\n              label={locationName(item)}\n            />\n          </li>\n        ))}\n      </ul>\n    </>\n  )\n}\n\nexport default LocationFilters\n","import { ChevronUpIcon, ChevronDownIcon } from \"@heroicons/react/24/outline\"\nimport React, { useState } from \"react\"\n\nconst RefinementPanel = ({ title, children, expanded = true }) => {\n  const [isExpanded, setIsExpanded] = useState(expanded)\n\n  return (\n    <div className=\"pb-8\">\n      <button\n        onClick={() => setIsExpanded(!isExpanded)}\n        className=\"mb-1 flex w-full items-center justify-between font-bold\">\n        <span>{title}</span>\n        <span>{isExpanded ? <ChevronUpIcon className=\"h-5 w-5\" /> : <ChevronDownIcon className=\"h-5 w-5\" />}</span>\n      </button>\n      <div className={isExpanded ? \"\" : \"hidden\"}>{children}</div>\n    </div>\n  )\n}\n\nexport default RefinementPanel\n","import { MapPinIcon, VideoCameraIcon } from \"@heroicons/react/24/outline\"\nimport React, { useState } from \"react\"\n\nimport { CheckBox, SearchInput } from \"../../components/shared/Inputs\"\nimport Typography from \"../../components/shared/Typography\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst defaultNumTherapiesShown = 4\n\nconst TherapiesFilters = () => {\n  const { therapyCategories, selectedTherapies, setSelectedTherapies, setSelectedLocations, inPersonCounts } =\n    useSearchPageContext()\n\n  const inPersonTherapies = therapyCategories.map((therapy) => therapy.name)\n  const [filteredInPersonTherapies, setFilteredInPersonTherapies] = useState(inPersonTherapies)\n  const [numInPersonTherapiesShown, setNumInPersonTherapiesShown] = useState(defaultNumTherapiesShown)\n  const canToggleShowMoreInPerson = inPersonTherapies.length > defaultNumTherapiesShown\n\n  const virtualTherapies = therapyCategories.filter((therapy) => !therapy.inPersonOnly).map((therapy) => therapy.name)\n  const [filteredVirtualTherapies, setFilteredVirtualTherapies] = useState(virtualTherapies)\n  const [numVirtualTherapiesShown, setNumVirtualTherapiesShown] = useState(defaultNumTherapiesShown)\n  const canToggleShowMoreVirtual = virtualTherapies.length > defaultNumTherapiesShown\n\n  const [searchValue, setSearchValue] = useState(\"\")\n\n  const virtualCounts = therapyCategories.reduce((acc, therapy) => {\n    acc[therapy.name] = therapy.count\n    return acc\n  }, {})\n\n  const inPersonTherapiesShown = filteredInPersonTherapies\n    .filter((item) => !!inPersonCounts[item] || selectedTherapies.includes(item + \" (in person)\") || searchValue !== \"\")\n    .sort((a, b) => {\n      const aSelected = selectedTherapies.includes(a + \" (in person)\") ? 1 : 0\n      const bSelected = selectedTherapies.includes(b + \" (in person)\") ? 1 : 0\n\n      if (aSelected !== bSelected) return bSelected - aSelected\n\n      return (inPersonCounts[b] || 0) - (inPersonCounts[a] || 0)\n    })\n\n  const virtualTherapiesShown = filteredVirtualTherapies\n    .filter((item) => !!virtualCounts[item])\n    .sort((a, b) => {\n      const aSelected = selectedTherapies.includes(a + \" (virtual)\") ? 1 : 0\n      const bSelected = selectedTherapies.includes(b + \" (virtual)\") ? 1 : 0\n\n      if (aSelected !== bSelected) return bSelected - aSelected\n\n      return (virtualCounts[b] || 0) - (virtualCounts[a] || 0)\n    })\n    .slice(0, numVirtualTherapiesShown)\n\n  return (\n    <>\n      <SearchInput\n        type=\"search\"\n        autoComplete=\"off\"\n        autoCorrect=\"off\"\n        autoCapitalize=\"off\"\n        spellCheck={false}\n        maxLength={512}\n        containerClassName=\"w-full\"\n        explanatorySubtext=\"Ex “Massage Therapy” or “Reiki”\"\n        value={searchValue}\n        onChange={(event) => {\n          setSearchValue(event.target.value)\n          const newVirtualTherapies = virtualTherapies.filter((therapy) =>\n            therapy.toLowerCase().includes(event.target.value.toLowerCase())\n          )\n          setFilteredVirtualTherapies(newVirtualTherapies)\n\n          const newInPersonTherapies = inPersonTherapies.filter((therapy) =>\n            therapy.toLowerCase().includes(event.target.value.toLowerCase())\n          )\n          setFilteredInPersonTherapies(newInPersonTherapies)\n        }}\n      />\n      <>\n        <Typography variant=\"capitalHeading\" as=\"h3\" className=\"mt-4 flex items-center gap-1\">\n          In-person\n          <MapPinIcon className=\"h-5 w-5\" />\n        </Typography>\n        <ul className=\"mt-3 flex flex-col gap-1.5\">\n          {inPersonTherapiesShown.slice(0, numInPersonTherapiesShown).map((item) => {\n            const count = inPersonCounts[item] || 0\n            const itemWithParens = item + \" (in person)\"\n\n            return (\n              <li key={item}>\n                <CheckBox\n                  id={`in-person-checkbox-${item}`}\n                  className=\"mb-0\"\n                  checked={selectedTherapies.includes(itemWithParens)}\n                  onChange={() => {\n                    if (selectedTherapies.includes(itemWithParens)) {\n                      const filteredTherapies = selectedTherapies.filter((therapy) => therapy !== itemWithParens)\n                      if (filteredTherapies.filter((therapy) => therapy.includes(\"(in person)\")).length === 0) {\n                        setSelectedLocations([\"office\", \"home\", \"virtual\"])\n                      }\n                      setSelectedTherapies(filteredTherapies)\n                    } else {\n                      setSelectedLocations([\"office\", \"home\"])\n                      const newTherapies = [...selectedTherapies, itemWithParens]\n                      if (selectedTherapies.filter((therapy) => therapy.includes(\"(virtual)\")).length > 0) {\n                        setSelectedTherapies(newTherapies.filter((therapy) => !therapy.includes(\"(virtual)\")))\n                      } else {\n                        setSelectedTherapies(newTherapies)\n                      }\n                    }\n                  }}\n                  label={`${item} (${count > 99 ? \"99+\" : count})`}\n                />\n              </li>\n            )\n          })}\n          {inPersonTherapiesShown.length === 0 && <li>No options matching</li>}\n        </ul>\n        {canToggleShowMoreInPerson && inPersonTherapiesShown.length > 0 && (\n          <button\n            onClick={() => {\n              setNumInPersonTherapiesShown(\n                numInPersonTherapiesShown < inPersonTherapiesShown.length\n                  ? numInPersonTherapiesShown + 10\n                  : defaultNumTherapiesShown\n              )\n            }}\n            className=\"mt-1.5 font-bold text-teal\">\n            {numInPersonTherapiesShown < inPersonTherapiesShown.length ? \"Load 10 more\" : \"See less\"}\n          </button>\n        )}\n      </>\n      <Typography variant=\"capitalHeading\" as=\"h3\" className=\"mt-4 flex items-center gap-1\">\n        Virtual\n        <VideoCameraIcon className=\"h-5 w-5\" />\n      </Typography>\n      <ul className=\"mt-3 flex flex-col gap-1.5\">\n        {virtualTherapiesShown.map((item) => {\n          const itemWithParens = item + \" (virtual)\"\n\n          return (\n            <li key={item}>\n              <CheckBox\n                id={`virtual-checkbox-${item}`}\n                className=\"mb-0\"\n                checked={selectedTherapies.includes(itemWithParens)}\n                onChange={() => {\n                  if (selectedTherapies.includes(itemWithParens)) {\n                    const filteredTherapies = selectedTherapies.filter((therapy) => therapy !== itemWithParens)\n                    if (filteredTherapies.filter((therapy) => therapy.includes(\"(virtual)\")).length === 0) {\n                      setSelectedLocations([\"office\", \"home\", \"virtual\"])\n                    }\n                    setSelectedTherapies(filteredTherapies)\n                  } else {\n                    setSelectedLocations([\"virtual\"])\n                    const newTherapies = [...selectedTherapies, itemWithParens]\n                    if (selectedTherapies.filter((therapy) => therapy.includes(\"(in person)\")).length > 0) {\n                      setSelectedTherapies(newTherapies.filter((therapy) => !therapy.includes(\"(in person)\")))\n                    } else {\n                      setSelectedTherapies(newTherapies)\n                    }\n                  }\n                }}\n                label={\n                  item + (virtualCounts[item] ? ` (${virtualCounts[item] > 99 ? \"99+\" : virtualCounts[item]})` : \" (0)\")\n                }\n              />\n            </li>\n          )\n        })}\n        {virtualTherapiesShown.length === 0 && <li>No options matching</li>}\n      </ul>\n      {canToggleShowMoreVirtual && virtualTherapiesShown.length > 0 && (\n        <button\n          onClick={() => {\n            setNumVirtualTherapiesShown(\n              numVirtualTherapiesShown < filteredVirtualTherapies.length\n                ? numVirtualTherapiesShown + 10\n                : defaultNumTherapiesShown\n            )\n          }}\n          className=\"mt-1.5 font-bold text-teal\">\n          {numVirtualTherapiesShown < filteredVirtualTherapies.length ? \"Load 10 more\" : \"See less\"}\n        </button>\n      )}\n    </>\n  )\n}\n\nexport default TherapiesFilters\n","import React from \"react\"\n\nimport { Button } from \"../../components/shared/Buttons\"\nimport { Label, Toggle } from \"../../components/shared/Inputs\"\nimport { RadioWithLabel } from \"../../components/shared/RadioButtons\"\n\nimport FacetList from \"./FacetList\"\nimport HealthIssuesFacetList from \"./HealthIssuesFacetList\"\nimport LocationFilters from \"./LocationFilters\"\nimport RefinementPanel from \"./RefinementPanel\"\nimport { useSearchPageContext } from \"./SearchPageContext\"\nimport TherapiesFilters from \"./TherapiesFilters\"\n\nconst distanceMarks = [\n  { value: 2, label: \"2mi\" },\n  { value: 5, label: \"5mi\" },\n  { value: 10, label: \"10mi\" },\n  { value: 25, label: \"25mi\" },\n  { value: 50, label: \"50mi\" },\n  { value: 100, label: \"100mi\" }\n]\n\nconst FiltersSection = () => {\n  const {\n    radiusInMiles,\n    setRadiusInMiles,\n    isTablet,\n    offersFreeConsult,\n    setOffersFreeConsult,\n    selectedTherapies,\n    selectedHealthIssues,\n    languages,\n    selectedLanguages,\n    setSelectedLanguages,\n    languageCounts,\n    ages,\n    selectedAges,\n    setSelectedAges,\n    ageCounts,\n    resetFilters\n  } = useSearchPageContext()\n\n  const defaultFilterState =\n    !offersFreeConsult &&\n    selectedTherapies.length === 0 &&\n    selectedHealthIssues.length === 0 &&\n    selectedAges.length === 0 &&\n    selectedLanguages.length === 0\n\n  return (\n    <>\n      {!defaultFilterState && (\n        <Button type=\"tertiary\" className=\"mb-6 w-full sm:hidden\" onClick={resetFilters}>\n          Reset filters\n        </Button>\n      )}\n      <div className=\"mb-8 flex cursor-pointer items-center justify-between\">\n        <Label className=\"text-base\" htmlFor=\"toggle-free-consult\">\n          Offers free consult\n        </Label>\n        <Toggle\n          id=\"toggle-free-consult\"\n          checked={offersFreeConsult}\n          onChange={() => setOffersFreeConsult(!offersFreeConsult)}\n        />\n      </div>\n      <RefinementPanel title=\"Filter by therapy\">\n        <TherapiesFilters />\n      </RefinementPanel>\n      <RefinementPanel title=\"Filter by health issue\">\n        <HealthIssuesFacetList />\n      </RefinementPanel>\n      <RefinementPanel title=\"Location of service\">\n        <LocationFilters />\n      </RefinementPanel>\n      {isTablet && (\n        <RefinementPanel title=\"Show practitioners within\">\n          <div className=\"mt-2 flex flex-col gap-2\">\n            {distanceMarks.map((mark) => (\n              <RadioWithLabel\n                id={`distance-radio-${mark.value}`}\n                key={`distance-radio-${mark.value}`}\n                value={mark.value}\n                name=\"radius\"\n                label={mark.label}\n                checked={radiusInMiles === mark.value}\n                onChange={() => setRadiusInMiles(mark.value)}\n              />\n            ))}\n          </div>\n        </RefinementPanel>\n      )}\n      <RefinementPanel title=\"Languages spoken\" expanded={selectedLanguages.length > 0}>\n        <FacetList\n          items={languages}\n          setSelectedItems={setSelectedLanguages}\n          selectedItems={selectedLanguages}\n          counts={languageCounts}\n        />\n      </RefinementPanel>\n      <RefinementPanel title=\"Client age(s)\" expanded={selectedAges.length > 0}>\n        <FacetList\n          items={ages}\n          setSelectedItems={setSelectedAges}\n          selectedItems={selectedAges}\n          counts={ageCounts}\n          alwaysShowAll={true}\n        />\n      </RefinementPanel>\n    </>\n  )\n}\n\nexport default FiltersSection\n","import React from \"react\"\n\nimport { CloseButton } from \"../../components/shared/Buttons\"\nimport { ButtonLink } from \"../../components/shared/Links\"\nimport Typography from \"../../components/shared/Typography\"\n\nconst JoinInterstitial = ({ onDismiss }) => (\n  <div className=\"relative max-w-5xl rounded-lg border border-orange bg-orange-light p-8\">\n    <CloseButton className=\"absolute right-4 top-4 h-6 w-6\" onClick={onDismiss} />\n    <Typography variant=\"h3\" as=\"h2\">\n      Are you a holistic practitioner? Apply today to feature your practice.\n    </Typography>\n    <ButtonLink className=\"mt-4\" href=\"/pro\">\n      Apply now\n    </ButtonLink>\n  </div>\n)\n\nexport default JoinInterstitial\n","import debounce from \"lodash/debounce\"\nimport React, { useEffect, useState } from \"react\"\n\nimport { updateLocationSearchText } from \"../../utils/utils\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst MapWithPins = () => {\n  const { mapCenter, setMapCenter, setBoundingBox, mapZoom, setMapZoom, boundingBox, mapPins } = useSearchPageContext()\n  const [map, setMap] = useState(null)\n\n  useEffect(() => {\n    async function initMap() {\n      const { Map } = await window.google.maps.importLibrary(\"maps\")\n      const map = new Map(document.getElementById(\"map\"), {\n        center: mapCenter,\n        zoom: mapZoom,\n        disableDefaultUI: true,\n        zoomControl: true,\n        mapId: \"cfedcf9606fee63d\"\n      })\n\n      let initialLoad = true\n\n      window.google.maps.event.addListenerOnce(map, \"tilesloaded\", function () {\n        map.setZoom(mapZoom)\n        map.addListener(\n          \"idle\",\n          debounce(() => {\n            const northEast = map.getBounds().getNorthEast()\n            const southWest = map.getBounds().getSouthWest()\n            const newBoundingBox = [northEast.lat(), northEast.lng(), southWest.lat(), southWest.lng()]\n            if (JSON.stringify(newBoundingBox) !== JSON.stringify(boundingBox)) {\n              setBoundingBox(newBoundingBox)\n            }\n\n            const newCenter = map.getCenter()\n            if (newCenter.lat() === mapCenter.lat && newCenter.lng() === mapCenter.lng) {\n              // do nothing\n            } else {\n              const newCenterObject = { lat: newCenter.lat(), lng: newCenter.lng() }\n              localStorage.setItem(\"mapCenter\", JSON.stringify(newCenterObject))\n              setMapCenter(newCenterObject)\n            }\n\n            setMapZoom(map.getZoom())\n            if (initialLoad) {\n              updateLocationSearchText([newCenter.lat(), newCenter.lng()])\n              initialLoad = false\n            }\n          }, 250)\n        )\n      })\n\n      setMap(map)\n      document.dispatchEvent(new CustomEvent(\"googlePlacesLoaded\"))\n    }\n\n    initMap()\n  }, [])\n\n  useEffect(() => {\n    if (!map) return\n\n    const onNewMapCenter = (e) => {\n      console.log(\"newMapCenter event\", e.detail)\n      map.setCenter(e.detail)\n      map.setZoom(12)\n\n      const northEast = map.getBounds().getNorthEast()\n      const southWest = map.getBounds().getSouthWest()\n      const newBoundingBox = [northEast.lat(), northEast.lng(), southWest.lat(), southWest.lng()]\n      setBoundingBox(newBoundingBox)\n    }\n\n    const onNewMapZoom = (e) => {\n      console.log(\"newMapZoom event\", e.detail)\n      map.setZoom(e.detail)\n\n      const northEast = map.getBounds().getNorthEast()\n      const southWest = map.getBounds().getSouthWest()\n      const newBoundingBox = [northEast.lat(), northEast.lng(), southWest.lat(), southWest.lng()]\n      if (JSON.stringify(newBoundingBox) !== JSON.stringify(boundingBox)) {\n        setBoundingBox(newBoundingBox)\n      }\n    }\n\n    document.addEventListener(\"newMapCenter\", onNewMapCenter)\n    document.addEventListener(\"newMapZoom\", onNewMapZoom)\n\n    return () => {\n      document.removeEventListener(\"newMapCenter\", onNewMapCenter)\n      document.removeEventListener(\"newMapZoom\", onNewMapZoom)\n    }\n  }, [map])\n\n  useEffect(() => {\n    async function renderMarkers() {\n      const { AdvancedMarkerElement, PinElement } = await window.google.maps.importLibrary(\"marker\")\n\n      Object.entries(mapPins).forEach((item) => {\n        const pin = item[1]\n        const pinBackground = new PinElement({\n          background: \"#0B3954\",\n          borderColor: \"#0B3954\",\n          glyphColor: \"rgba(255, 255, 255, 0.64)\"\n        })\n        const marker = new AdvancedMarkerElement({\n          position: { lat: pin.lat, lng: pin.lng },\n          content: pinBackground.element,\n          title: pin.name,\n          id: `marker-${pin.slug}`,\n          map\n        })\n        marker.addListener(\"click\", (e) => {\n          e.domEvent.preventDefault()\n          const searchCard = document.getElementById(pin.slug)\n          searchCard?.scrollIntoView({ behavior: \"smooth\" })\n          searchCard?.focus()\n        })\n        pin.pinBackground = pinBackground\n        pin.marker = marker\n      })\n    }\n\n    if (window.google && map && mapPins) {\n      renderMarkers()\n    }\n  }, [map, mapPins])\n\n  return <div id=\"map\" className=\"h-full w-full\" />\n}\n\nexport default MapWithPins\n","import React from \"react\"\n\nimport { CloseButton } from \"../../components/shared/Buttons\"\nimport { ButtonLink } from \"../../components/shared/Links\"\nimport Typography from \"../../components/shared/Typography\"\n\nconst QuizInterstitial = ({ onDismiss }) => (\n  <div className=\"relative max-w-5xl rounded-lg border border-teal bg-white p-8\">\n    <CloseButton className=\"absolute right-4 top-4 h-6 w-6\" onClick={onDismiss} />\n    <Typography variant=\"h3\" as=\"h2\">\n      Get matched with the right practitioner now. It’s free and only takes 1 minute.\n    </Typography>\n    <div className=\"mt-4\">Answer a few questions to help us find you the best fit for your needs.</div>\n    <ButtonLink className=\"mt-4\" href=\"/quizzes/new\">\n      Match me now\n    </ButtonLink>\n  </div>\n)\n\nexport default QuizInterstitial\n","import { StarIcon } from \"@heroicons/react/24/solid\"\nimport React from \"react\"\n\nimport { searchPractitionerWebsiteUrl } from \"../../@core/practitioner/practitioner.utils\"\nimport { Button } from \"../../components/shared/Buttons\"\nimport { Divider } from \"../../components/shared/Layout\"\nimport Typography from \"../../components/shared/Typography\"\nimport { distanceInMiles } from \"../../utils/utils\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst formatAmount = (cents) => {\n  if (cents === 0) {\n    return \"Free\"\n  } else {\n    const dollars = cents / 100\n    if (cents % 100 === 0) {\n      return `$${dollars.toFixed(0)}`\n    } else {\n      return `$${dollars.toFixed(2)}`\n    }\n  }\n}\n\nconst ReviewSection = ({ hit }) => (\n  <div className=\"mt-2 flex items-center gap-1\">\n    <StarIcon className=\"h-5 w-5 text-orange\" />\n    <span className=\"font-bold\">{hit.reviews_average === 5 ? \"5.0\" : hit.reviews_average}</span>\n    <span className=\"ml-1 font-bold text-teal underline\">{hit.reviews_count} verified reviews</span>\n  </div>\n)\n\nconst ServicesSection = ({ services }) => (\n  <div className=\"flex flex-col gap-2\">\n    {services.map((service) => (\n      <div key={service.id}>\n        <div className=\"font-bold\">\n          <div className=\"line-clamp-2\" dangerouslySetInnerHTML={{ __html: service.name }} />\n        </div>\n        <div className=\"text-sm\">\n          <span>{formatAmount(service.amount_cents)}</span> <span className=\"text-gray\">•</span>{\" \"}\n          <span>{service.length} min</span>\n        </div>\n      </div>\n    ))}\n  </div>\n)\n\nconst SkillsSection = ({ hit }) => {\n  const { selectedHealthIssues } = useSearchPageContext()\n  const skills = hit.skills.filter((skill) => selectedHealthIssues.includes(skill.name) && skill.count > 0)\n\n  if (skills.length === 0) return null\n\n  return (\n    <div className=\"mt-4 flex flex-wrap items-center gap-2\">\n      {skills.slice(0, 2).map((skill) => (\n        <div key={`${hit.objectID}-skill-${skill.name}`} className=\"flex items-stretch justify-center text-sm\">\n          <div\n            className={`rounded-l-lg border border-gray-light bg-gray-light px-3 py-1 ${\n              skill.count === 0 ? \"rounded-lg\" : \"\"\n            }`}\n            dangerouslySetInnerHTML={{ __html: skill.name }}\n          />\n          {skill.count > 0 && (\n            <div className=\"flex items-center rounded-r-lg border border-gray-light px-3 py-1\">{skill.count}</div>\n          )}\n        </div>\n      ))}\n    </div>\n  )\n}\n\nconst SearchCard = ({ hit, showVirtualInsteadOfDistance = false }) => {\n  const { mapCenter, virtualView, isMobile, mapPins } = useSearchPageContext()\n  const services = hit.services.sort((a, b) => a.position - b.position).slice(0, 2)\n  const widthResize = isMobile ? \"width:104\" : \"width:234\"\n\n  const photoUrl = hit.user.profile_photos?.large?.webp\n    ? `https://cdn.filestackcontent.com/resize=${widthResize}/${hit.user.profile_photos?.large?.webp}`\n    : hit.user.photo\n\n  const distance =\n    virtualView || hit._geoloc === null\n      ? null\n      : showVirtualInsteadOfDistance || (hit.location_types.includes(\"virtual\") && hit.location_types.length === 1)\n      ? \"Virtual\"\n      : `${distanceInMiles(mapCenter.lat, mapCenter.lng, hit._geoloc.lat, hit._geoloc.lng).toFixed(1)} mi`\n\n  const websiteUrl = searchPractitionerWebsiteUrl(hit)\n\n  return (\n    <a\n      onClick={() => window.sessionStorage.setItem(\"scrollPosition\", window.scrollY)}\n      id={hit.user.slug}\n      href={websiteUrl}\n      onMouseEnter={() => {\n        const marker = mapPins && mapPins[Number(hit.objectID)]?.marker\n        const pinBackground = mapPins && mapPins[Number(hit.objectID)]?.pinBackground\n\n        if (!marker || !pinBackground) return\n        marker.zIndex = 1\n        pinBackground.background = \"rgb(var(--color-orange))\"\n        pinBackground.borderColor = \"rgb(var(--color-orange))\"\n      }}\n      onMouseLeave={() => {\n        const marker = mapPins && mapPins[Number(hit.objectID)]?.marker\n        const pinBackground = mapPins && mapPins[Number(hit.objectID)]?.pinBackground\n\n        if (!marker || !pinBackground) return\n        marker.zIndex = 0\n        pinBackground.background = \"#0B3954\"\n        pinBackground.borderColor = \"#0B3954\"\n      }}\n      className=\"group mb-8 block w-full max-w-5xl rounded-lg border-gray-light bg-white p-8 focus:outline-none focus:ring-2 focus:ring-blue min_md:hover:border-gray min_md:hover:shadow sm:-ml-6 sm:mb-0 sm:box-content sm:rounded-none sm:border-b sm:p-6 min_sm:border\">\n      <div className=\"relative flex items-center gap-8\">\n        {window.location.search.includes(\"debug\") && (\n          <div className=\"absolute -right-8 -top-8 rounded-lg border border-gray bg-red-light px-2 py-0.5 text-xs font-extrabold\">\n            <div>Score: {hit.ranking_score}</div>\n            <div>{hit.reviews_count} reviews</div>\n            {hit.doctor ? <div>x3 for doctor</div> : hit.licensed ? <div>x2 for licensed</div> : null}\n          </div>\n        )}\n        <div className=\"relative flex-none\">\n          {!virtualView && mapCenter && hit._geoloc && (\n            <div className=\"absolute -left-2 -top-2 z-10 rounded-lg border border-gray bg-gray-ultralight px-2 py-0.5 text-xs font-extrabold sm:hidden\">\n              {distance}\n            </div>\n          )}\n          <div className=\"h-[232px] w-[200px] flex-none overflow-hidden rounded-lg bg-gray-ultralight sm:h-[104px] sm:w-[104px]\">\n            <img\n              src={photoUrl}\n              alt={hit.user.name}\n              className=\"h-full w-full rounded-lg object-cover transition-all duration-500 min_md:group-hover:scale-110\"\n              loading=\"lazy\"\n            />\n          </div>\n          {!isMobile && (\n            <div className=\"mt-4 flex gap-4 sm:hidden\">\n              {hit.gallery_images.slice(0, 2).map((image) => (\n                <img\n                  key={image.id}\n                  src={`https://cdn.filestackcontent.com/resize=width:92/${image.filestack_photo?.square?.webp}`}\n                  alt={hit.user.name}\n                  className=\"h-[92px] w-[92px] flex-none rounded-lg object-cover\"\n                  loading=\"lazy\"\n                />\n              ))}\n            </div>\n          )}\n        </div>\n        <div className=\"overflow-hidden\">\n          <h2 className=\"flex items-center gap-2\">\n            <div\n              className=\"line-clamp-1 min_md:group-hover:underline\"\n              dangerouslySetInnerHTML={{ __html: hit.user.name }}\n            />\n            <img className=\"h-6 w-6 text-teal\" src=\"/images/icons/verified.svg\" alt=\"Verified\" />\n          </h2>\n          <Typography variant=\"h5\" as=\"h2\">\n            <div\n              className=\"line-clamp-2 min_md:group-hover:underline\"\n              dangerouslySetInnerHTML={{ __html: hit.user.title }}\n            />\n          </Typography>\n          <div className=\"sm:hidden\">\n            <ReviewSection hit={hit} />\n            <div className=\"text-gray-dark\">{hit.city_state}</div>\n            <Divider />\n            <ServicesSection services={services} />\n            <SkillsSection hit={hit} />\n            <div\n              className=\"mt-4 line-clamp-2 text-gray-dark\"\n              dangerouslySetInnerHTML={{ __html: hit.website_headline || hit.headline }}\n            />\n          </div>\n        </div>\n      </div>\n      <div className=\"hidden sm:block\">\n        <ReviewSection hit={hit} />\n        <div className=\"mb-4 mt-2 flex items-center gap-2\">\n          <div>{hit.city_state}</div>\n          {!virtualView && mapCenter && hit._geoloc && (\n            <div className=\"rounded-lg border border-gray bg-gray-ultralight px-2 py-0.5 text-xs font-extrabold\">\n              {distance}\n            </div>\n          )}\n        </div>\n        <ServicesSection services={services} />\n        <SkillsSection hit={hit} />\n        <div\n          className=\"mt-4 line-clamp-2 text-gray-dark\"\n          dangerouslySetInnerHTML={{ __html: hit.website_headline || hit.headline }}\n        />\n      </div>\n      <Button\n        type=\"secondary\"\n        className=\"mt-4 h-10 w-full transition-all duration-500 min_md:group-hover:bg-teal min_md:group-hover:text-white\"\n        href={websiteUrl}>\n        View website\n      </Button>\n    </a>\n  )\n}\n\nexport default SearchCard\n","import React from \"react\"\n\nimport { SearchPill } from \"../../components/shared/Pill\"\n\nconst SearchPills = ({ selectedItems, setSelectedItems, mapping }) => (\n  <>\n    {selectedItems.map((item) => (\n      <SearchPill key={item} onCloseButtonClick={() => setSelectedItems(selectedItems.filter((t) => t !== item))}>\n        {mapping && mapping[item] ? mapping[item] : item.replace(/\\s*\\(.*\\)$/, \"\")}\n      </SearchPill>\n    ))}\n  </>\n)\n\nexport default SearchPills\n","import { ChevronDownIcon } from \"@heroicons/react/24/outline\"\nimport { AdjustmentsHorizontalIcon } from \"@heroicons/react/24/solid\"\nimport React, { useEffect, useRef, useState } from \"react\"\nimport Skeleton from \"react-loading-skeleton\"\n\nimport { Button } from \"../components/shared/Buttons\"\nimport { Divider } from \"../components/shared/Layout\"\nimport LoadingSpinner from \"../components/shared/LoadingSpinner\"\nimport { MobileFullScreenModal } from \"../components/shared/Modal\"\nimport { SearchPill } from \"../components/shared/Pill\"\nimport useWindowSize from \"../hooks/useWindowSize\"\nimport { updateLocationSearchText } from \"../utils/utils\"\n\nimport FiltersSection from \"./SearchPage/FiltersSection\"\nimport JoinInterstitial from \"./SearchPage/JoinInterstitial\"\nimport LocationSearchBox from \"./SearchPage/LocationSearchBox\"\nimport MapWithPins from \"./SearchPage/MapWithPins\"\nimport QuizInterstitial from \"./SearchPage/QuizInterstitial\"\nimport SearchCard from \"./SearchPage/SearchCard\"\nimport { useSearchPageContext, SearchPageProvider } from \"./SearchPage/SearchPageContext\"\nimport SearchPills from \"./SearchPage/SearchPills\"\n\nconst filtersSectionWidth = 312\n\nconst FallbackSection = ({ title, hits, keyPrefix, showDivider, showVirtualInsteadOfDistance = false }) => {\n  const { isMobile } = useSearchPageContext()\n\n  return (\n    <>\n      {!isMobile && showDivider && <Divider className=\"h-0.5 shadow\" />}\n      <h3 className=\"mb-6 font-bold text-gray-dark sm:my-4\">{title}</h3>\n      <ul>\n        {hits.map((hit) => (\n          <li key={keyPrefix + \"-\" + hit.objectID}>\n            <SearchCard hit={hit} showVirtualInsteadOfDistance={showVirtualInsteadOfDistance} />\n          </li>\n        ))}\n      </ul>\n    </>\n  )\n}\n\nconst SearchPage = ({ loggedInAsPro }) => {\n  const {\n    isMobile,\n    query,\n    setQuery,\n    radiusInMiles,\n    setRadiusInMiles,\n    selectedTherapies,\n    setSelectedTherapies,\n    selectedHealthIssues,\n    setSelectedHealthIssues,\n    selectedLocations,\n    setSelectedLocations,\n    selectedLanguages,\n    selectedAges,\n    showMap,\n    setMapCenter,\n    hits,\n    nbHits,\n    defaultLatLng,\n    isLastPage,\n    showMore,\n    loading,\n    mapCenter,\n    googlePlacesLoaded,\n    similarQueryFallbackState,\n    nearbyFallbackState,\n    virtualFallbackState,\n    resetFilters,\n    similarQueryFallbackSearch,\n    nearbyFallbackSearch,\n    virtualFallbackSearch,\n    performedFallbackSearches,\n    setPerformedFallbackSearches\n  } = useSearchPageContext()\n\n  const [mobileFiltersShown, setMobileFiltersShown] = useState(false)\n  const [joinInterstitialDismissed, setJoinInterstitialDismissed] = useState(false)\n  const [quizInterstitialDismissed, setQuizInterstitialDismissed] = useState(false)\n  const sentinelRef = useRef(null)\n  const searchResultsRef = useRef(null)\n  const mobileFiltersRef = useRef(null)\n  const containerRef = useRef(null)\n  const { width } = useWindowSize()\n\n  const filtersCount =\n    selectedTherapies.length + selectedHealthIssues.length + selectedLanguages.length + selectedAges.length\n\n  useEffect(() => {\n    if (sentinelRef.current !== null) {\n      const observer = new IntersectionObserver((entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            if (!isLastPage) {\n              showMore()\n            } else if (!performedFallbackSearches) {\n              setPerformedFallbackSearches(true)\n              if (query && !similarQueryFallbackState.queryCompleted) similarQueryFallbackSearch()\n              if (!(selectedLocations.length === 1 && selectedLocations.includes(\"virtual\"))) {\n                if (!nearbyFallbackState.queryCompleted) nearbyFallbackSearch()\n                if (!virtualFallbackState.queryCompleted) virtualFallbackSearch()\n              }\n            }\n          }\n        })\n      })\n\n      observer.observe(sentinelRef.current)\n\n      return () => {\n        observer.disconnect()\n      }\n    }\n  }, [isLastPage, showMore])\n\n  useEffect(() => {\n    const onRefinementChanged = (e) => setQuery(e.detail.name)\n\n    document.addEventListener(\"refinementChanged\", onRefinementChanged)\n\n    if (mapCenter === null) {\n      setMapCenter(defaultLatLng)\n      updateLocationSearchText([defaultLatLng.lat, defaultLatLng.lng])\n    } else if (mapCenter) {\n      updateLocationSearchText([mapCenter.lat, mapCenter.lng])\n    }\n\n    const onScroll = () => {\n      if (mobileFiltersRef.current && containerRef.current) {\n        if (window.scrollY >= 64) {\n          mobileFiltersRef.current.style.top = 0\n          mobileFiltersRef.current.style.left = 0\n          mobileFiltersRef.current.style.right = 0\n          mobileFiltersRef.current.style.paddingLeft = \"24px\"\n          mobileFiltersRef.current.style.paddingRight = \"24px\"\n          mobileFiltersRef.current.style.paddingBottom = \"16px\"\n          mobileFiltersRef.current.style.position = \"fixed\"\n          mobileFiltersRef.current.style.borderBottom = \"1px solid rgb(var(--color-light-gray))\"\n          if (isMobile) {\n            containerRef.current.style.paddingTop = \"128px\"\n          }\n        } else {\n          mobileFiltersRef.current.style.position = \"static\"\n          mobileFiltersRef.current.style.borderBottom = \"none\"\n          mobileFiltersRef.current.style.paddingLeft = 0\n          mobileFiltersRef.current.style.paddingRight = 0\n          containerRef.current.style.paddingTop = 0\n        }\n      }\n    }\n\n    window.addEventListener(\"scroll\", onScroll)\n\n    return () => {\n      document.removeEventListener(\"refinementChanged\", onRefinementChanged)\n      window.removeEventListener(\"scroll\", onScroll)\n    }\n  }, [])\n\n  useEffect(() => {\n    if (width > 0 && width < 640) {\n      document.body.classList.remove(\"has-navbar-fixed-top\")\n      document.querySelector(\"nav\").classList.remove(\"fixed\")\n    } else {\n      document.body.classList.add(\"has-navbar-fixed-top\")\n      document.querySelector(\"nav\").classList.add(\"fixed\")\n    }\n  }, [width])\n\n  useEffect(() => {\n    if (hits?.length === 0 && !performedFallbackSearches) {\n      setPerformedFallbackSearches(true)\n      if (query && !similarQueryFallbackState.queryCompleted) similarQueryFallbackSearch()\n      if (!(selectedLocations.length === 1 && selectedLocations.includes(\"virtual\"))) {\n        if (!nearbyFallbackState.queryCompleted) nearbyFallbackSearch()\n        if (!virtualFallbackState.queryCompleted) virtualFallbackSearch()\n      }\n    }\n  }, [hits])\n\n  let numberOfResults =\n    nbHits + similarQueryFallbackState.nbHits + nearbyFallbackState.nbHits + virtualFallbackState.nbHits\n  if (numberOfResults > 99) numberOfResults = \"99+\"\n\n  return (\n    <>\n      <div ref={containerRef}>\n        <div\n          className=\"fixed z-30 h-screen min-h-100 overflow-y-auto border-r border-gray-light bg-white p-8 pb-[80px] md:hidden\"\n          style={{ width: filtersSectionWidth }}>\n          <FiltersSection />\n        </div>\n        <div\n          ref={searchResultsRef}\n          className={`min-h-screen overflow-y-auto bg-gray-ultralight p-8 sm:w-full sm:bg-white sm:p-6 sm:pt-0 ${\n            showMap ? \"min_search_tablet:w-[calc(50%-156px)] min_search_tablet:min-w-[650px]\" : \"\"\n          }`}\n          style={{\n            marginLeft: isMobile ? 0 : filtersSectionWidth,\n            width: showMap ? null : \"100% !important\"\n          }}>\n          <div className=\"-mx-6 mb-6 hidden border-b border-gray-light px-6 sm:block\">\n            <div className=\"z-10 bg-white pb-4\" ref={mobileFiltersRef}>\n              <div className=\"flex items-center justify-between gap-4 py-4\">\n                <div className=\"w-full\">\n                  {googlePlacesLoaded ? <LocationSearchBox /> : <Skeleton className=\"h-8 w-full\" />}\n                </div>\n                <Button\n                  type={filtersCount > 0 ? \"secondary\" : \"tertiary\"}\n                  onClick={() => setMobileFiltersShown(true)}\n                  className=\"flex h-10 flex-none items-center gap-2\">\n                  <AdjustmentsHorizontalIcon className=\"h-5 w-5\" />\n                  <span>{`Filters${filtersCount > 0 ? ` (${filtersCount})` : \"\"}`}</span>\n                </Button>\n              </div>\n              <div className=\"-mr-6 flex gap-4 overflow-x-auto\">\n                {[\"Services\", \"Health issues\", \"Locations\", \"Languages\", \"Client ages\"].map((filter) => (\n                  <Button\n                    type=\"tertiary\"\n                    key={filter}\n                    onClick={() => setMobileFiltersShown(true)}\n                    className=\"flex h-10 flex-none items-center gap-2\">\n                    <span>{filter}</span>\n                    <ChevronDownIcon className=\"h-5 w-5\" />\n                  </Button>\n                ))}\n              </div>\n            </div>\n          </div>\n          <div>\n            <div className=\"mb-4 flex justify-between sm:mb-6\">\n              <div className=\"flex gap-2 sm:-mr-6 sm:overflow-x-auto min_sm:flex-wrap\">\n                {query && (\n                  <SearchPill\n                    onCloseButtonClick={() => {\n                      setQuery(\"\")\n                      document.dispatchEvent(new CustomEvent(\"resetSearchField\"))\n                    }}>\n                    &quot;{query}&quot;\n                  </SearchPill>\n                )}\n                <SearchPills\n                  selectedItems={selectedLocations}\n                  setSelectedItems={setSelectedLocations}\n                  mapping={{\n                    virtual: \"Virtual\",\n                    office: \"At a practice\",\n                    home: \"At my home\"\n                  }}\n                />\n                {radiusInMiles && (\n                  <SearchPill onCloseButtonClick={() => setRadiusInMiles(null)}>\n                    Within {radiusInMiles} miles\n                  </SearchPill>\n                )}\n                <SearchPills selectedItems={selectedTherapies} setSelectedItems={setSelectedTherapies} />\n                <SearchPills selectedItems={selectedHealthIssues} setSelectedItems={setSelectedHealthIssues} />\n              </div>\n            </div>\n            <ul>\n              {hits?.map((hit, i) => (\n                <React.Fragment key={hit.objectID}>\n                  {i === 5 && !loggedInAsPro && !joinInterstitialDismissed && (\n                    <li className=\"mb-8 sm:-mx-6 sm:mb-0 sm:border-b sm:border-gray-light sm:p-6\">\n                      <JoinInterstitial onDismiss={() => setJoinInterstitialDismissed(true)} />\n                    </li>\n                  )}\n                  {i === 10 && !loggedInAsPro && !quizInterstitialDismissed && (\n                    <li className=\"mb-8 sm:-mx-6 sm:mb-0 sm:border-b sm:border-gray-light sm:p-6\">\n                      <QuizInterstitial onDismiss={() => setQuizInterstitialDismissed(true)} />\n                    </li>\n                  )}\n                  <li>\n                    <SearchCard hit={hit} />\n                  </li>\n                </React.Fragment>\n              ))}\n              {hits?.length > 0 && <li ref={sentinelRef} aria-hidden=\"true\" />}\n            </ul>\n            {similarQueryFallbackState.nbHits > 0 && (\n              <FallbackSection\n                title={`${nbHits > 0 ? \"More practitioners\" : \"Practitioners\"} offering services similar to ${query}`}\n                hits={similarQueryFallbackState.hits}\n                keyPrefix=\"similarQuery\"\n                showDivider={nbHits > 0}\n              />\n            )}\n            {nearbyFallbackState.nbHits > 0 && (\n              <FallbackSection\n                title={`${\n                  nearbyFallbackState.nbHits === 1 ? \"One more practitioner\" : \"More practitioners\"\n                } found nearby`}\n                hits={nearbyFallbackState.hits}\n                keyPrefix=\"nearbyFallback\"\n                showDivider={nbHits > 0 || similarQueryFallbackState.nbHits > 0}\n              />\n            )}\n            {virtualFallbackState.nbHits > 0 && (\n              <FallbackSection\n                title={`${\n                  nbHits > 0 || similarQueryFallbackState.nbHits > 0 || nearbyFallbackState.nbHits > 0\n                    ? \"More practitioners\"\n                    : \"Practitioners\"\n                } offering virtual services`}\n                hits={virtualFallbackState.hits}\n                keyPrefix=\"virtualFallback\"\n                showDivider={nbHits > 0 || similarQueryFallbackState.nbHits > 0 || nearbyFallbackState.nbHits > 0}\n                showVirtualInsteadOfDistance={true}\n              />\n            )}\n            {loading ||\n            similarQueryFallbackState.fetching ||\n            nearbyFallbackState.fetching ||\n            virtualFallbackState.fetching ? (\n              <LoadingSpinner className=\"py-0\" />\n            ) : nbHits === 0 &&\n              similarQueryFallbackState.nbHits === 0 &&\n              nearbyFallbackState.nbHits === 0 &&\n              virtualFallbackState.nbHits === 0 ? (\n              <div className=\"mt-8 font-bold text-gray-dark\">\n                No results found for {query ? <span>&quot;{query}&quot;</span> : \"your search\"}. Try removing some\n                filters or try a different search.\n              </div>\n            ) : null}\n          </div>\n        </div>\n        {showMap && (\n          <div\n            className=\"fixed bottom-0 right-0 top-[80px] z-30 w-[calc(50%-156px)] border-l border-gray-light\"\n            style={{ maxWidth: \"calc(100vw - 962px)\" }}>\n            {showMap ? <MapWithPins /> : <div id=\"map\" className=\"h-full w-full\" />}\n          </div>\n        )}\n        {isMobile && (\n          <MobileFullScreenModal\n            hideModal={() => {\n              setMobileFiltersShown(false)\n              setTimeout(() => {\n                window.scrollTo(0, 0)\n              }, 100)\n            }}\n            visible={mobileFiltersShown}\n            header=\"Filters\"\n            showFooter={true}\n            animate={false}\n            actionButtonCopy={`Show ${numberOfResults} results`}\n            onSave={() => {\n              setMobileFiltersShown(false)\n              setTimeout(() => {\n                window.scrollTo(0, 0)\n              }, 100)\n            }}\n            cancelButtonCopy=\"Reset\"\n            onCancel={() => {\n              resetFilters()\n              setMobileFiltersShown(false)\n              setTimeout(() => {\n                window.scrollTo(0, 0)\n              }, 100)\n            }}\n            unmount={false}>\n            <FiltersSection />\n          </MobileFullScreenModal>\n        )}\n      </div>\n    </>\n  )\n}\n\nexport default function Page({\n  latLng,\n  therapyCategories,\n  healthIssues,\n  languages,\n  ages,\n  loggedInAsPro,\n  searchParams,\n  isMobile,\n  isTablet\n}) {\n  return (\n    <SearchPageProvider\n      mobile={isMobile}\n      tablet={isTablet || isMobile}\n      therapyCategories={therapyCategories}\n      healthIssues={healthIssues}\n      defaultLatLng={latLng}\n      languages={languages}\n      ages={ages}\n      searchParams={searchParams}>\n      <SearchPage loggedInAsPro={loggedInAsPro} />\n    </SearchPageProvider>\n  )\n}\n","import { Combobox } from \"@headlessui/react\"\nimport { MapPinIcon } from \"@heroicons/react/24/solid\"\nimport capitalize from \"lodash/capitalize\"\nimport React, { useEffect, useState } from \"react\"\nimport usePlacesService from \"react-google-autocomplete/lib/usePlacesAutocompleteService\"\nimport { twMerge } from \"tailwind-merge\"\n\nimport { BASE_INPUT_CLASSNAMES, DROPDOWN_CLASSNAMES, DROPDOWN_OPTION_CLASSNAMES } from \"../../components/shared/Inputs\"\nimport LoadingSpinner from \"../../components/shared/LoadingSpinner\"\nimport useWindowSize from \"../../hooks/useWindowSize\"\nimport { stripUSAFromString } from \"../../utils/utils\"\n\nconst LocationSearchBox = () => {\n  const { width } = useWindowSize()\n  const isMobile = width <= 768\n  const [inputText, setInputText] = useState(\"\")\n\n  const { placesService, placePredictions, getPlacePredictions, isPlacePredictionsLoading } = usePlacesService({\n    debounce: 100,\n    options: {\n      types: [\"locality\", \"administrative_area_level_3\", \"postal_code\"]\n    }\n  })\n\n  useEffect(() => {\n    const onNewLocationChosen = (e) => setInputText(e.detail)\n    document.addEventListener(\"newLocationChosen\", onNewLocationChosen)\n\n    return () => {\n      document.removeEventListener(\"newLocationChosen\", onNewLocationChosen)\n    }\n  }, [])\n\n  return (\n    <Combobox\n      as=\"div\"\n      className=\"sm:flex-1\"\n      value={inputText}\n      onChange={(item) => {\n        if (item) {\n          placesService.getDetails({ placeId: item.place_id }, (place) => {\n            const newMapCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng() }\n            const event = new CustomEvent(\"newMapCenter\", { detail: newMapCenter })\n            document.dispatchEvent(event)\n            setInputText(stripUSAFromString(item.description))\n          })\n        }\n      }}>\n      <div className=\"relative\">\n        <Combobox.Input\n          onChange={(evt) => {\n            setInputText(evt.target.value)\n            getPlacePredictions({ input: evt.target.value })\n          }}\n          className={twMerge(BASE_INPUT_CLASSNAMES, \"sm:py-[7px] min_sm:w-[260px] min_sm:rounded-l-none\")}\n          placeholder=\"Location\"\n        />\n        {isPlacePredictionsLoading ? (\n          <LoadingSpinner className=\"absolute right-2 top-2 py-0\" spinnerClassName=\"h-5 w-5\" />\n        ) : (\n          <MapPinIcon className=\"absolute right-1.5 top-1.5 h-6 w-6 text-gray-dark opacity-[0.64] sm:top-[7px]\" />\n        )}\n      </div>\n      {placePredictions?.length > 0 && !isPlacePredictionsLoading && (\n        <Combobox.Options\n          className={twMerge(DROPDOWN_CLASSNAMES, \"fixed w-[260px] sm:w-[calc(100%-48px)]\")}\n          style={{ maxWidth: isMobile ? 300 : 260 }}>\n          {placePredictions.map((item) => (\n            <Combobox.Option key={item.description} className={DROPDOWN_OPTION_CLASSNAMES} value={item}>\n              <div\n                dangerouslySetInnerHTML={{\n                  __html: stripUSAFromString(item.description).replace(\n                    new RegExp(inputText, \"i\"),\n                    `<mark style='font-weight: bold'>${capitalize(inputText)}</mark>`\n                  )\n                }}\n              />\n            </Combobox.Option>\n          ))}\n        </Combobox.Options>\n      )}\n    </Combobox>\n  )\n}\n\nexport default LocationSearchBox\n","import { Combobox } from \"@headlessui/react\"\nimport { StarIcon } from \"@heroicons/react/24/solid\"\nimport algoliasearch from \"algoliasearch/lite\"\nimport React, { useEffect, useState } from \"react\"\nimport { Configure, Index, InstantSearch, useHits, useSearchBox } from \"react-instantsearch\"\nimport { twMerge } from \"tailwind-merge\"\n\nimport { searchPractitionerWebsiteUrl } from \"../../@core/practitioner/practitioner.utils\"\nimport { CloseButton } from \"../../components/shared/Buttons\"\nimport { BASE_INPUT_CLASSNAMES, DROPDOWN_CLASSNAMES, DROPDOWN_OPTION_CLASSNAMES } from \"../../components/shared/Inputs\"\nimport Typography from \"../../components/shared/Typography\"\n\nimport LocationSearchBox from \"./LocationSearchBox\"\n\nconst searchClient = algoliasearch(\n  process.env.ALGOLIA_HEALME_SEARCH_APPLICATION_ID,\n  process.env.ALGOLIA_HEALME_SEARCH_CLIENT_API_KEY\n)\n\nconst SearchBox = (props) => {\n  const { refine } = useSearchBox()\n  const urlParams = new URLSearchParams(window.location.search)\n  const defaultQuery = urlParams.get(\"query\") || \"\"\n  const [inputValue, setInputValue] = useState(defaultQuery)\n  const [googlePlacesLoaded, setGooglePlacesLoaded] = useState(false)\n\n  const setQuery = (newQuery) => {\n    setInputValue(newQuery)\n    refine(newQuery)\n  }\n\n  useEffect(() => {\n    const onSearchFieldReset = () => setInputValue(\"\")\n    const onGooglePlacesLoaded = () => setGooglePlacesLoaded(true)\n    document.addEventListener(\"resetSearchField\", onSearchFieldReset)\n    document.addEventListener(\"googlePlacesLoaded\", onGooglePlacesLoaded)\n\n    return () => {\n      document.removeEventListener(\"resetSearchField\", onSearchFieldReset)\n      document.removeEventListener(\"googlePlacesLoaded\", onGooglePlacesLoaded)\n    }\n  }, [])\n\n  return (\n    <div className=\"ml-12 flex sm:hidden\">\n      <Combobox\n        value={inputValue}\n        onChange={(hit) => {\n          if (hit.user) {\n            window.location.href = searchPractitionerWebsiteUrl(hit)\n          } else {\n            setInputValue(hit)\n            const event = new CustomEvent(\"refinementChanged\", { detail: hit })\n            document.dispatchEvent(event)\n          }\n        }}>\n        <div className=\"relative\">\n          <Combobox.Input\n            placeholder=\"Try “Massage” or “Back pain”\"\n            {...props}\n            onChange={(event) => setQuery(event.target.value)}\n            displayValue={(hit) => hit.name || inputValue || \"\"}\n            className={twMerge(BASE_INPUT_CLASSNAMES, \"w-[260px] rounded-r-none\")}\n          />\n          {inputValue !== \"\" && (\n            <CloseButton\n              onClick={() => {\n                setQuery(\"\")\n                const event = new CustomEvent(\"refinementChanged\", { detail: { name: \"\" } })\n                document.dispatchEvent(event)\n              }}\n              className=\"absolute right-0 top-0 mr-2 mt-[9px] h-5 w-5\"\n            />\n          )}\n        </div>\n        <Combobox.Options className={twMerge(DROPDOWN_CLASSNAMES, \"fixed mt-[42px] max-h-[700px] w-[520px]\")}>\n          {/* this is needed so you can search a custom string and not just an option from the dropdown */}\n          {inputValue !== \"\" && (\n            <Combobox.Option value={{ id: null, name: inputValue }} className=\"hidden\">\n              {inputValue}\n            </Combobox.Option>\n          )}\n          <Index indexName=\"Specialty\">\n            <Configure hitsPerPage={6} />\n            <SpecialtySearchResults />\n          </Index>\n          <Index indexName=\"Practice_production\">\n            <Configure hitsPerPage={3} />\n            <PractitionerSearchResults />\n          </Index>\n        </Combobox.Options>\n      </Combobox>\n      {googlePlacesLoaded && <LocationSearchBox />}\n    </div>\n  )\n}\n\nconst SpecialtySearchResults = () => {\n  const { hits } = useHits()\n  const therapies = hits.filter((hit) => hit.ordered_kind === 1)\n  const healthConditions = hits.filter((hit) => hit.ordered_kind !== 1)\n\n  return (\n    <div>\n      {therapies.length > 0 && (\n        <>\n          <Typography className=\"px-3 py-2\" variant=\"capitalHeading\">\n            Therapies\n          </Typography>\n          {therapies.map((hit) => (\n            <Combobox.Option\n              key={hit.objectID}\n              value={hit}\n              className={({ active, selected }) =>\n                twMerge(\"cursor-pointer px-3 py-2 font-bold\", selected ? \"bg-gray\" : active ? \"bg-gray-ultralight\" : \"\")\n              }>\n              <button\n                dangerouslySetInnerHTML={{\n                  __html: hit._highlightResult.name.value.replace(\n                    \"<mark>\",\n                    \"<mark style='font-weight: normal; color: rgb(var(--color-dark-gray))'>\"\n                  )\n                }}\n                onClick={() => {\n                  const event = new CustomEvent(\"refinementChanged\", { detail: hit })\n                  document.dispatchEvent(event)\n                }}\n              />\n            </Combobox.Option>\n          ))}\n        </>\n      )}\n      {healthConditions.length > 0 && (\n        <>\n          <Typography className=\"px-3 py-2\" variant=\"capitalHeading\">\n            Health Conditions\n          </Typography>\n          {healthConditions.map((hit) => (\n            <Combobox.Option\n              key={hit.objectID}\n              value={hit}\n              className={({ active, selected }) =>\n                twMerge(\"cursor-pointer px-3 py-2 font-bold\", selected ? \"bg-gray\" : active ? \"bg-gray-ultralight\" : \"\")\n              }>\n              <button\n                dangerouslySetInnerHTML={{\n                  __html: hit._highlightResult.name.value.replace(\n                    \"<mark>\",\n                    \"<mark style='font-weight: normal; color: rgb(var(--color-dark-gray))'>\"\n                  )\n                }}\n                onClick={() => {\n                  const event = new CustomEvent(\"refinementChanged\", { detail: hit })\n                  document.dispatchEvent(event)\n                }}\n              />\n            </Combobox.Option>\n          ))}\n        </>\n      )}\n    </div>\n  )\n}\n\nconst PractitionerSearchResults = () => {\n  const { hits } = useHits()\n\n  const getPhotoUrl = (hit) => {\n    const photoUrl = hit.user.profile_photos?.small?.webp\n      ? `https://cdn.filestackcontent.com/${hit.user.profile_photos?.small?.webp}`\n      : hit.user.photo\n\n    return photoUrl\n  }\n\n  return (\n    <div>\n      <Typography className=\"px-3 py-2\" variant=\"capitalHeading\">\n        Practitioners\n      </Typography>\n      {hits.map((hit) => (\n        <Combobox.Option key={hit.objectID} value={hit} className={DROPDOWN_OPTION_CLASSNAMES}>\n          <a className=\"flex items-center gap-2\" href={searchPractitionerWebsiteUrl(hit)}>\n            <img className=\"h-10 w-10 rounded-full\" src={getPhotoUrl(hit)} alt={hit.user.name} />\n            <div>\n              <div\n                className=\"font-bold\"\n                dangerouslySetInnerHTML={{\n                  __html: hit._highlightResult.user.name.value.replace(\n                    \"<mark>\",\n                    \"<mark style='font-weight: normal; color: rgb(var(--color-dark-gray))'>\"\n                  )\n                }}\n              />\n              <div className=\"flex items-center gap-1 font-bold\">\n                <StarIcon className=\"h-5 w-5 text-orange\" />\n                <span>{hit.reviews_average === 5 ? \"5.0\" : hits.reviews_average}</span>\n                <span className=\"text-teal\">{hit.reviews_count} reviews</span>\n              </div>\n            </div>\n          </a>\n        </Combobox.Option>\n      ))}\n    </div>\n  )\n}\n\nconst TopNavSearchBox = () => (\n  <InstantSearch searchClient={searchClient} indexName=\"Specialty\">\n    <SearchBox />\n  </InstantSearch>\n)\n\nexport default TopNavSearchBox\n"],"names":["websiteSubscriptionTypes","practitionerWebsiteUrl","user","practice","slug","vanitySlug","website","includes","subscriptionType","searchPractitionerWebsiteUrl","hit","custom_domain_host","vanity_slug","subscription_type","startsWith","EndorsementPill","children","draggable","active","className","onCloseButtonClick","rest","Tag","React","Object","assign","twMerge","EllipsisVerticalIcon","onClick","XMarkIcon","SearchPill","FacetList","items","selectedItems","setSelectedItems","counts","searchable","searchSubtext","alwaysShowAll","filteredItems","setFilteredItems","useState","isShowingMore","setIsShowingMore","searchValue","setSearchValue","canToggleShowMore","length","SearchInput","type","autoComplete","autoCorrect","autoCapitalize","spellCheck","maxLength","containerClassName","explanatorySubtext","value","onChange","event","newItems","filter","item","toLowerCase","target","slice","map","key","CheckBox","id","checked","prevItems","prevItem","label","memo","shouldShowMap","isTablet","mapCenter","selectedLocations","window","isVirtualView","performSearch","searchIndex","selectedTherapies","selectedHealthIssues","offersFreeConsult","selectedLanguages","selectedAges","currentPage","boundingBox","showMap","radiusInMiles","query","similarQuery","additionalFilters","virtualFallback","hitsPerPage","onSuccess","undefined","filters","filtersString","selectedTherapyFilters","therapy","replace","join","selectedHealthIssueFilters","condition","selectedLocationFilters","location","freeConsultFilter","selectedLanguagesFilters","language","selectedAgeWorkWithFilters","age","Boolean","searchOptions","getSearchOptions","options","page","facets","virtualView","insideBoundingBox","aroundRadius","aroundPrecision","aroundLatLng","lat","lng","attributesToHighlight","search","then","searchResponse","doubleBoundingBoxSize","deltaX","deltaY","newTopLeft","newBottomRight","concat","SearchPageContext","createContext","searchClient","algoliasearch","process","indexName","countsIndex","initIndex","SearchPageProvider","therapyCategories","healthIssues","defaultLatLng","languages","ages","mobile","tablet","width","useWindowSize","isMobile","setIsMobile","setIsTablet","useEffect","urlParams","URLSearchParams","defaultQuery","get","defaultRadius","parseInt","mapCenterParam","latLng","split","coord","parseFloat","defaultMapCenter","localStorage","JSON","parse","getItem","defaultTherapies","defaultHealthIssues","defaultLocations","defaultOffersFreeConsult","defaultLanguages","defaultAges","defaultMapZoom","defaultBoundingBox","setQuery","setRadiusInMiles","setMapCenter","setBoundingBox","setSelectedTherapies","setSelectedHealthIssues","setSelectedLocations","setOffersFreeConsult","setSelectedLanguages","setSelectedAges","mapZoom","setMapZoom","inPersonCounts","setInPersonCounts","healthIssueCounts","setHealthIssueCounts","languageCounts","setLanguageCounts","ageCounts","setAgeCounts","hits","setHits","nbHits","setNbHits","isLastPage","setIsLastPage","setCurrentPage","isFetchingNextPage","setIsFetchingNextPage","loading","setLoading","poppingState","setPoppingState","previousSearch","setPreviousSearch","googlePlacesLoaded","setGooglePlacesLoaded","shouldDynamicZoom","setShouldDynamicZoom","performedFallbackSearches","setPerformedFallbackSearches","mapPins","setMapPins","similarQueryFallbackState","setSimilarQueryFallbackState","nearbyFallbackState","setNearbyFallbackState","virtualFallbackState","setVirtualFallbackState","onPopState","onNewMapCenter","e","detail","setItem","stringify","addEventListener","document","async","google","maps","importLibrary","dispatchEvent","CustomEvent","initPlaces","fetch","response","json","data","catch","error","console","removeEventListener","searchParams","nbPages","searchString","newSearch","health_issues","age_work_withs","prevHits","newZoom","scrollTo","updateUrl","queryParams","set","has","history","pushState","queryString","toString","countsSearchParams","reduce","acc","therapies","forEach","timeout","setTimeout","savedScrollPosition","sessionStorage","removeItem","clearTimeout","resetFilters","useCallback","Provider","locationOptions","showMore","prev","similarQueryFallbackSearch","newSearchParams","state","fetching","newHits","differenceBy","queryCompleted","nearbyFallbackSearch","virtualFallbackSearch","inPersonOnly","name","virtualSearchParams","useSearchPageContext","useContext","HealthIssuesFacetList","numShown","setNumShown","shownHealthIssues","sort","a","b","aSelected","bSelected","localeCompare","LocationFilters","locations","RefinementPanel","title","expanded","isExpanded","setIsExpanded","ChevronUpIcon","ChevronDownIcon","TherapiesFilters","inPersonTherapies","filteredInPersonTherapies","setFilteredInPersonTherapies","numInPersonTherapiesShown","setNumInPersonTherapiesShown","canToggleShowMoreInPerson","virtualTherapies","filteredVirtualTherapies","setFilteredVirtualTherapies","numVirtualTherapiesShown","setNumVirtualTherapiesShown","canToggleShowMoreVirtual","virtualCounts","count","inPersonTherapiesShown","virtualTherapiesShown","newVirtualTherapies","newInPersonTherapies","Typography","variant","as","MapPinIcon","itemWithParens","filteredTherapies","newTherapies","VideoCameraIcon","distanceMarks","FiltersSection","defaultFilterState","Button","Label","htmlFor","Toggle","mark","RadioWithLabel","JoinInterstitial","onDismiss","CloseButton","ButtonLink","href","MapWithPins","setMap","Map","getElementById","center","zoom","disableDefaultUI","zoomControl","mapId","initialLoad","addListenerOnce","setZoom","addListener","debounce","northEast","getBounds","getNorthEast","southWest","getSouthWest","newBoundingBox","newCenter","getCenter","newCenterObject","getZoom","updateLocationSearchText","initMap","log","setCenter","onNewMapZoom","AdvancedMarkerElement","PinElement","entries","pin","pinBackground","background","borderColor","glyphColor","marker","position","content","element","domEvent","preventDefault","searchCard","scrollIntoView","behavior","focus","renderMarkers","QuizInterstitial","ReviewSection","StarIcon","reviews_average","reviews_count","ServicesSection","services","service","dangerouslySetInnerHTML","__html","cents","dollars","toFixed","formatAmount","amount_cents","SkillsSection","skills","skill","objectID","SearchCard","showVirtualInsteadOfDistance","widthResize","photoUrl","profile_photos","large","webp","photo","distance","_geoloc","location_types","distanceInMiles","websiteUrl","scrollY","onMouseEnter","Number","zIndex","onMouseLeave","ranking_score","doctor","licensed","src","alt","gallery_images","image","filestack_photo","square","city_state","Divider","website_headline","headline","SearchPills","mapping","t","FallbackSection","keyPrefix","showDivider","SearchPage","loggedInAsPro","mobileFiltersShown","setMobileFiltersShown","joinInterstitialDismissed","setJoinInterstitialDismissed","quizInterstitialDismissed","setQuizInterstitialDismissed","sentinelRef","useRef","searchResultsRef","mobileFiltersRef","containerRef","filtersCount","current","observer","IntersectionObserver","entry","isIntersecting","observe","disconnect","onRefinementChanged","onScroll","style","top","left","right","paddingLeft","paddingRight","paddingBottom","borderBottom","paddingTop","body","classList","remove","querySelector","add","numberOfResults","ref","marginLeft","LocationSearchBox","Skeleton","AdjustmentsHorizontalIcon","virtual","office","home","i","LoadingSpinner","maxWidth","MobileFullScreenModal","hideModal","visible","header","showFooter","animate","actionButtonCopy","onSave","cancelButtonCopy","onCancel","unmount","Page","inputText","setInputText","placesService","placePredictions","getPlacePredictions","isPlacePredictionsLoading","usePlacesService","types","onNewLocationChosen","Combobox","getDetails","placeId","place_id","place","newMapCenter","geometry","stripUSAFromString","description","Input","evt","input","BASE_INPUT_CLASSNAMES","placeholder","spinnerClassName","Options","DROPDOWN_CLASSNAMES","Option","DROPDOWN_OPTION_CLASSNAMES","RegExp","capitalize","SearchBox","props","refine","useSearchBox","inputValue","setInputValue","newQuery","onSearchFieldReset","onGooglePlacesLoaded","displayValue","Index","Configure","SpecialtySearchResults","PractitionerSearchResults","useHits","ordered_kind","healthConditions","selected","_highlightResult","getPhotoUrl","small","TopNavSearchBox","InstantSearch"],"sourceRoot":""}