{"version":3,"file":"screener.b396f09a.js","mappings":"8SASe,SAASA,EAAaC,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EACrE,MAAOG,EAAOC,GAAYC,EAAAA,SAAyB,IAEnDA,EAAAA,WAAgB,KACdD,EAASH,EAAOK,eAAe,GAC9B,CAACL,IAaJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,4BAA2BF,SAAA,EAC/CG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,YAAWF,SAAC,iCAGzCG,EAAAA,EAAAA,KAAA,QAAMG,GAAG,uBAAuBb,SAbhBc,IACpBA,EAAEC,iBACF,MAAMC,EAAU,IAAIf,EAAMgB,QAAQC,KAAWC,EAAAA,EAAAA,GAAqBD,MAElElB,EAASgB,EAAQ,EAS0CT,UACrDG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yBAAwBF,SACpCR,EAAOqB,QAAQC,KAAIC,IAAsB,IAArB,MAAEC,EAAK,MAAEL,GAAOI,EACnC,MAAME,EAAYvB,EAAMwB,SAASP,GACjC,OACER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,qBAAoBF,UACjCG,EAAAA,EAAAA,KAACgB,EAAAA,GAAQ,CACPC,KAAMT,EACNT,UAAU,gBACVmB,QAASJ,EACTK,SAAUA,IACR3B,EAASsB,EAAYvB,EAAMgB,QAAQa,GAAkBZ,IAAUY,IAAiB,IAAI7B,EAAOiB,IAC5FX,SAEAgB,KAToCL,EAWnC,YAMhBb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACvB,UAAU,UAAUwB,QAxCVC,KACtBhC,EAASH,EAAOqB,QAAQC,KAAIc,IAAA,IAAC,MAAEjB,GAAOiB,EAAA,OAAKjB,CAAK,IAAED,QAAQmB,GAAkB,eAATA,IAAuB,EAuCjC7B,SAAC,gBAGtDG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,uBAAuBC,MAAM,OAAMlC,SAAC,gBAMvE,C,gDCnDA,MAAMmC,EAAW,IAAIC,KAAK,cAEnB,SAASC,EAAS9C,GAAyD,IAAxD,KAAE+C,EAAI,GAAEC,EAAE,aAAEC,EAAY,WAAEC,GAA4BlD,EAC9E,OACEO,EAAAA,EAAAA,MAAA,OAAKI,UAAU,yCAAwCF,SAAA,EACrDG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iDAAgDF,UAC7DG,EAAAA,EAAAA,KAACuC,EAAAA,EAAU,CACTC,QAASR,EACTxB,MAAO2B,EAAO,IAAIF,KAAKE,QAAQM,EAC/BtB,SAAWuB,IACTL,GAAaM,EAAAA,EAAAA,IAAqBD,GAAS,EAC3C7C,UAEFG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJf,KAAK,QACLgB,UAAQ,EACRhC,MAAM,OACNiC,aACEX,GACEnC,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CACLvB,UAAU,eACVgC,MAAM,UACNgB,WAAW,SACXxB,QAASA,KACPc,OAAaI,EAAU,EACvB5C,UAEFG,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAK,QAAQgC,MAAO,YAE1BR,EAENjC,MAAO2B,QAAAA,EAAQ,UAIrBnC,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iDAAgDF,UAC7DG,EAAAA,EAAAA,KAACuC,EAAAA,EAAU,CACTC,QAASR,EACTxB,MAAO4B,EAAK,IAAIH,KAAKG,QAAMK,EAC3BtB,SAAW+B,IACTZ,GAAWK,EAAAA,EAAAA,IAAqBO,GAAO,EACvCrD,UAEFG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJf,KAAK,QACLgB,UAAQ,EACRhC,MAAM,KACNiC,aACEV,GACEpC,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CACLvB,UAAU,eACVgC,MAAM,UACNgB,WAAW,SACXxB,QAASA,KACPe,OAAWG,EAAU,EACrB5C,UAEFG,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAK,QAAQgC,MAAO,YAE1BR,EAENjC,MAAO4B,QAAAA,EAAM,WAMzB,CCvEe,SAASe,EAAiB/D,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EACzE,MAAOG,EAAOC,GAAYC,EAAAA,SAAyB,KAC5C2D,EAAWC,GAAgB5D,EAAAA,SAA+C,CAAC,GAElFA,EAAAA,WAAgB,KACd,MAAM6D,GAAcC,EAAAA,EAAAA,IAAiClE,EAAOK,gBAExD4D,GACFD,EAAa,CAAElB,KAAMmB,EAAY,GAAIlB,GAAIkB,EAAY,KAEvD9D,EAASH,EAAOK,eAAe,GAC9B,CAACL,IAcJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,SAAA,EAC5EG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,YAAWF,SAAC,iCAGzCF,EAAAA,EAAAA,MAAA,QAAMQ,GAAG,4BAA4Bb,SAdrBc,IACpBA,EAAEC,iBACF,MAAMmD,GAAeC,EAAAA,EAAAA,IAAwBL,GACvC9C,EAAU,IAAIf,EAAMgB,QAAQC,KAAWC,EAAAA,EAAAA,GAAqBD,KAASgD,GAE3ElE,EAASgB,EAAQ,EAS+CT,SAAA,EAC1DG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yBAAwBF,SACpCR,EAAOqB,QAAQC,KAAIC,IAAsB,IAArB,MAAEC,EAAK,MAAEL,GAAOI,EACnC,MAAME,EAAYvB,EAAMwB,SAASP,GACjC,OACER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,SAAQF,UACrBG,EAAAA,EAAAA,KAACgB,EAAAA,GAAQ,CACPC,KAAMT,EACNU,QAASJ,EACTK,SAAUA,IACR3B,EAASsB,EAAYvB,EAAMgB,QAAQa,GAAkBZ,IAAUY,IAAiB,IAAI7B,EAAOiB,IAC5FX,SAEAgB,KARwBL,EAUvB,OAIZb,EAAAA,EAAAA,MAAA,OAAKI,UAAU,qBAAoBF,SAAA,EACjCG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,OAAMF,SAAC,wBAGpCG,EAAAA,EAAAA,KAACkC,EAAS,CACRC,MAAMiB,aAAS,EAATA,EAAWjB,QAAQQ,EAAAA,EAAAA,IAAqB,IAAIV,KAAKmB,EAAUjB,OACjEC,IAAIgB,aAAS,EAATA,EAAWhB,MAAMO,EAAAA,EAAAA,IAAqB,IAAIV,KAAKmB,EAAUhB,KAC7DC,aAAeF,IACbkB,EAAa,IAAKD,EAAWjB,QAAO,EAEtCG,WAAaF,IACXiB,EAAa,IAAKD,EAAWhB,MAAK,cAM5CzC,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACvB,UAAU,UAAUwB,QAvDVC,KACtBhC,EAASH,EAAOqB,QAAQC,KAAIc,IAAA,IAAC,MAAEjB,GAAOiB,EAAA,OAAKjB,CAAK,IAAE,EAsDOX,SAAC,gBAGtDG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,4BAA4BC,MAAM,OAAMlC,SAAC,gBAM5E,CChFA,MAAM6D,EAAY,IACZC,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAEvB,SAASwB,EAAwBxE,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EAChF,MAAOyE,EAAeC,GAAoBrE,EAAAA,SAAekE,IAClDI,EAAcC,GAAmBvE,EAAAA,SAAekE,GAEvDlE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,CACV,MAAM0D,EAAQ1D,EAAO2D,MAAMR,GAE3B,GAAqB,IAAjBO,EAAME,OAAc,CACtB,MAAOC,EAAQ,GAAIC,EAAM,IAAMJ,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,IACzEI,EAAQ,GAAIC,EAAM,IAAMN,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,GAEhFJ,EAAiB,CAAE3B,KAAMiC,EAAOhC,GAAIiC,IACpCL,EAAgB,CAAE7B,KAAMmC,EAAOlC,GAAImC,GACrC,CACF,IACC,CAAClF,IAOJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,SAAA,EAC5EG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,YAAWF,SAAC,iCAGzCF,EAAAA,EAAAA,MAAA,QAAMQ,GAAG,+BAA+Bb,SAXxBc,IACpBA,EAAEC,iBACFf,EAAS,EAACkF,EAAAA,EAAAA,IAAe,CAACX,EAAeE,KAAgB,EASUlE,SAAA,EAC7DF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,OAAMF,SAAA,EACnBG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,8CAA6CF,UAC1DG,EAAAA,EAAAA,KAAA,KAAGD,UAAU,qCAAoCF,SAAC,oBAEpDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,8BAA6BF,SAAA,EAC1CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAOqD,EAAc1B,KACrBsC,KAAM,GACNtD,SAAWf,IACT0D,EAAiB,IAAKD,EAAe1B,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGvER,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOqD,EAAczB,GACrBqC,KAAM,GACNtD,SAAWf,IACT0D,EAAiB,IAAKD,EAAezB,GAAIhC,EAAEsE,cAAclE,OAAQ,WAMzEb,EAAAA,EAAAA,MAAA,OAAKI,UAAU,YAAWF,SAAA,EACxBG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,8CAA6CF,UAC1DG,EAAAA,EAAAA,KAAA,KAAGD,UAAU,8BAA6BF,SAAC,wBAE7CF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,8BAA6BF,SAAA,EAC1CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAOuD,EAAa5B,KACpBsC,KAAM,GACNtD,SAAWf,IACT4D,EAAgB,IAAKD,EAAc5B,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGrER,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOuD,EAAa3B,GACpBqC,KAAM,GACNtD,SAAWf,IACT4D,EAAgB,IAAKD,EAAc3B,GAAIhC,EAAEsE,cAAclE,OAAQ,iBAO3Eb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,+BAA+BC,MAAM,OAAMlC,SAAC,gBAM/E,CC/FA,MAAM6D,EAAY,IACZC,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAEvB,SAASuC,EAAWvF,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EACnE,MAAOwF,EAAaC,GAAkBpF,EAAAA,SAAekE,IAC9CmB,EAAUC,GAAetF,EAAAA,SAAekE,GAE/ClE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,KAAAyE,EACV,MAAMf,EAAQ1D,EAAO2D,MAAMR,IAEpBuB,EAAQ,GAAIC,EAAM,IAAMjB,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,IACzEiB,EAAQ,GAAIC,EAAM,IAAc,QAARJ,EAAAf,EAAM,UAAE,IAAAe,GAARA,EAAUjE,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,GAEjFW,EAAe,CAAE1C,KAAM8C,EAAO7C,GAAI8C,IAClCH,EAAY,CAAE5C,KAAMgD,EAAO/C,GAAIgD,GACjC,IACC,CAAC/F,IAOJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,SAAA,EAC5EG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,YAAWF,SAAC,iCAGzCF,EAAAA,EAAAA,MAAA,QAAMQ,GAAG,qBAAqBb,SAXdc,IACpBA,EAAEC,iBACFf,EAAS,EAACkF,EAAAA,EAAAA,IAAe,CAACI,EAAaE,KAAY,EASMjF,SAAA,EACnDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,8BAA6BF,SAAA,EAC1CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAOoE,EAAYzC,KACnBkD,IAAK,EACLZ,KAAM,IACNtD,SAAWf,IACTyE,EAAe,IAAKD,EAAazC,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGnER,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOoE,EAAYxC,GACnBiD,IAAK,EACLZ,KAAM,IACNtD,SAAWf,IACTyE,EAAe,IAAKD,EAAaxC,GAAIhC,EAAEsE,cAAclE,OAAQ,QAKnEb,EAAAA,EAAAA,MAAA,OAAKI,UAAU,mCAAkCF,SAAA,EAC/CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAOsE,EAAS3C,KAChBkD,IAAK,EACLZ,KAAM,IACNtD,SAAWf,IACT2E,EAAY,IAAKD,EAAU3C,KAAM/B,EAAEsE,cAAclE,OAAQ,KAG7DR,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOsE,EAAS1C,GAChBiD,IAAK,EACLZ,KAAM,IACNtD,SAAWf,IACT2E,EAAY,IAAKD,EAAU1C,GAAIhC,EAAEsE,cAAclE,OAAQ,cAMjEb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,qBAAqBC,MAAM,OAAMlC,SAAC,gBAMrE,C,eCtFA,MAAM6D,EAAY,IACZ4B,EAAqB,IACrB3B,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAChCmD,EAAgB,CACpB,CAAE/E,MAAO,IAAKK,MAAO,SACrB,CAAEL,MAAO,IAAKK,MAAO,UAEjB2E,EAAkB,CACtB,CAAEhF,MAAO,IAAKK,MAAO,QACrB,CAAEL,MAAO,IAAKK,MAAO,QAGjB4E,EAAaC,IACjB,GAAIA,EAAYC,QAAQL,GAAsB,EAAG,CAC/C,MAAMM,EAAkBF,EAAYxB,MAAMoB,GAC1C,GACgC,IAA9BM,EAAgB,GAAGzB,QACnBoB,EAAcM,MAAKzG,IAAA,IAAC,MAAEoB,GAAOpB,EAAA,OAAKoB,IAAUoF,EAAgB,GAAG,EAAE,KACjEJ,EAAgBK,MAAKpE,IAAA,IAAC,MAAEjB,GAAOiB,EAAA,OAAKjB,IAAUoF,EAAgB,GAAG,EAAE,IACnE,CACA,MAAOzD,EAAO,GAAIC,EAAK,IAAMwD,EAAgB,GAAG7E,SAAS,MAAQ6E,EAAgB,GAAG1B,MAAM,MAAQ,GAElG,MAAO,CAAC,CAAE/B,OAAMC,MAAMwD,EAAgB,GAAG,GAAIA,EAAgB,GAAG,GAClE,CACF,GAGa,SAASE,EAAalF,GAAoC,IAAnC,OAAEvB,EAAM,SAAEC,GAAuBsB,EACrE,MAAOmF,EAAQC,GAAavG,EAAAA,SAAe8F,EAAc,GAAG/E,QACrDyF,EAAQC,GAAazG,EAAAA,SAAe8F,EAAc,GAAG/E,QACrD2F,EAAUC,GAAe3G,EAAAA,SAAe+F,EAAgB,GAAGhF,QAC3D6F,EAAUC,GAAe7G,EAAAA,SAAe+F,EAAgB,GAAGhF,QAC3D+F,EAAQC,GAAa/G,EAAAA,SAAekE,IACpC8C,EAAQC,GAAajH,EAAAA,SAAekE,GAE3ClE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,CACV,MAAM0D,EAAQ1D,EAAO2D,MAAMR,GAC3B,GAAqB,IAAjBO,EAAME,OACR,OAIF,MAAMwC,EAAclB,EAAUxB,EAAM,IACpC,QAAoBxB,IAAhBkE,EAA2B,CAC7B,OAAO,KAAExE,EAAI,GAAEC,GAAMwE,EAAOC,GAAWF,EACvCH,EAAU,CAAErE,OAAMC,OAClB4D,EAAUY,GACVR,EAAYS,EACd,CAGA,MAAMC,EAAcrB,EAAUxB,EAAM,IACpC,QAAoBxB,IAAhBqE,EAA2B,CAC7B,OAAO,KAAE3E,EAAI,GAAEC,GAAMwE,EAAOC,GAAWC,EACvCJ,EAAU,CAAEvE,OAAMC,OAClB8D,EAAUU,GACVN,EAAYO,EACd,CACF,IACC,CAACxH,IAYJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,SAAA,EAC5EG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,YAAWF,SAAC,iCAGzCG,EAAAA,EAAAA,KAAA,QAAMG,GAAG,uBAAuBb,SAhBhBc,IACpBA,EAAEC,iBACFf,EAAS,EACPkF,EAAAA,EAAAA,IACE,CAAC+B,EAAQE,GACT,CAAC,GAADM,OAAIzB,GAAkByB,OAAGhB,GAAMgB,OAAGZ,GAAQ,GAAAY,OAAOzB,GAAkByB,OAAGd,GAAMc,OAAGV,MAEjF,EASyDxG,UACrDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,qCAAoCF,SAAA,EACjDG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAO+F,EAAOpE,KACdkD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACToG,EAAU,IAAKD,EAAQpE,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGzDR,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAO+F,EAAOnE,GACdiD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACToG,EAAU,IAAKD,EAAQnE,GAAIhC,EAAEsE,cAAclE,OAAQ,KAGvDR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iBAAgBF,UAC7BG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,qBACXjH,UAAU,SACVkH,MAAO1B,EACP/E,MAAOuF,EACP5E,SAAWO,IACTsE,EAAUtE,EAAKlB,MAAM,OAI3BR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iBAAgBF,UAC7BG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,kBACXjH,UAAU,SACVkH,MAAOzB,EACPhF,MAAO2F,EACPhF,SAAWO,IACT0E,EAAY1E,EAAKlB,MAAM,OAI7BR,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAOiG,EAAOtE,KACdkD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACTsG,EAAU,IAAKD,EAAQtE,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGzDR,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOiG,EAAOrE,GACdiD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACTsG,EAAU,IAAKD,EAAQrE,GAAIhC,EAAEsE,cAAclE,OAAQ,KAGvDR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iBAAgBF,UAC7BG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,qBACXjH,UAAU,SACVkH,MAAO1B,EACP/E,MAAOyF,EACP9E,SAAWO,IACTwE,EAAUxE,EAAKlB,MAAM,OAI3BR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iBAAgBF,UAC7BG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,kBACXjH,UAAU,SACVkH,MAAOzB,EACPhF,MAAO6F,EACPlF,SAAWO,IACT4E,EAAY5E,EAAKlB,MAAM,eAOnCb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,uBAAuBC,MAAM,OAAMlC,SAAC,gBAMvE,CCjLe,SAASqH,EAAa9H,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EACrE,MAAOgE,EAAWC,GAAgB5D,EAAAA,SAA+C,CAAC,GAElFA,EAAAA,WAAgB,KACd,MAAM6D,GAAcC,EAAAA,EAAAA,IAAiClE,EAAOK,gBACxD4D,GACFD,EAAa,CAAElB,KAAMmB,EAAY,GAAIlB,GAAIkB,EAAY,IACvD,GACC,CAACjE,IASJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACF,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,UAC5EG,EAAAA,EAAAA,KAAA,QAAMG,GAAG,uBAAuBb,SAVhBc,IACpBA,EAAEC,iBACF,MAAMmD,GAAeC,EAAAA,EAAAA,IAAwBL,GAE7C9D,EAAS,CAACkE,GAAc,EAMmC3D,UACrDG,EAAAA,EAAAA,KAACkC,EAAS,CACRC,MAAMiB,aAAS,EAATA,EAAWjB,QAAQQ,EAAAA,EAAAA,IAAqB,IAAIV,KAAKmB,EAAUjB,OACjEC,IAAIgB,aAAS,EAATA,EAAWhB,MAAMO,EAAAA,EAAAA,IAAqB,IAAIV,KAAKmB,EAAUhB,KAC7DC,aAAeF,IACbkB,EAAa,IAAKD,EAAWjB,QAAO,EAEtCG,WAAaF,IACXiB,EAAa,IAAKD,EAAWhB,MAAK,SAK1CzC,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,uBAAuBC,MAAM,OAAMlC,SAAC,gBAMvE,CC1CA,MAAMsH,EAAkB,IAClBC,EAAU,CACd,CAAE5G,MAAO,MAAOK,MAAO,OACvB,CAAEL,MAAO,MAAOK,MAAO,OACvB,CAAEL,MAAO,KAAMK,MAAO,OAGlBwG,EAAyC,CAC7C,eAAgB,cAChB,kBAAmB,iBACnB,kBAAmB,iBACnB,qBAAsB,qBAGT,SAASC,EAAalI,GAAoC,IAAnC,SAAEE,EAAQ,OAAED,GAAqBD,EACrE,MAAOmI,EAAYC,GAAiB/H,EAAAA,SAAe2H,EAAQ,GAAG5G,QACvDiH,EAAWC,GAAgBjI,EAAAA,SAAe2H,EAAQ,GAAG5G,QACrDmH,EAAqBC,GAA0BnI,EAAAA,SAAe2H,EAAQ,GAAG5G,QACzEqH,EAAQC,GAAarI,EAAAA,SAAe2H,EAAQ,GAAG5G,OAEhDuH,EAAYtI,EAAAA,aAAmBiC,IACnC,MAAMsG,EAAYxH,GAAmBA,EAAMO,SAAS,OAAS,KAAO,MACpE,OAAQW,GACN,IAAK,SACL,IAAK,YACH8F,EAAcQ,EAAStG,IACvB,MACF,IAAK,QACL,IAAK,WACHgG,EAAaM,EAAStG,IACtB,MACF,IAAK,sBACL,IAAK,yBACHkG,EAAuBI,EAAStG,IAChC,MACF,IAAK,SACL,IAAK,YACHoG,EAAUE,EAAStG,IACnB,MACF,IAAK,cACH8F,EAAc,OACdE,EAAa,OACb,MACF,IAAK,iBACHF,EAAc,OACdE,EAAa,MACb,MACF,IAAK,iBACHF,EAAc,MACdE,EAAa,OACb,MACF,IAAK,oBACHF,EAAc,MACdE,EAAa,MAEjB,GACC,IAEHjI,EAAAA,WAAgB,KACdJ,EAAOK,eAAeuI,SAASvG,IAC7BqG,EAAUrG,EAAK,GACf,GACD,CAACrC,EAAQ0I,IAiBZ,OACEpI,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACF,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,UAC5EG,EAAAA,EAAAA,KAAA,QAAMG,GAAG,kBAAkBb,SAlBXc,IAAwC,IAAA8H,EAC5D9H,EAAEC,iBACF,MAAM8H,EAAM,CACV,CAAEC,OAAQb,GACV,CAAEc,MAAOZ,GACT,CAAEE,oBAAqBA,GACvB,CAAEE,OAAQA,IAETtH,QAAQmB,GAAS4G,OAAOC,OAAO7G,GAAM8G,OAAOhI,GAAoB,QAAVA,MACtDG,KAAKe,GAAS4G,OAAOG,QAAQ/G,GAAMf,KAAIc,IAAA,IAAEiH,EAAKlI,GAAMiB,EAAA,SAAAsF,OAAkB,QAAVvG,EAAkB,GAAK,OAAKuG,OAAG2B,EAAG,MAC9FC,KAAKxB,GAER7H,EAAS,CAAiB,QAAjB4I,EAACb,EAAYc,UAAI,IAAAD,EAAAA,EAAIC,GAAK,EAMmBtI,UAChDG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,OAAMF,UACnBF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,gCAA+BF,SAAA,EAC5CG,EAAAA,EAAAA,KAAC4I,EAAAA,GAAK,CAACC,MAAM,aAAYhJ,UACvBG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,aACXC,MAAOG,EACP5G,MAAO+G,EACPpG,SAAWO,IACT8F,EAAc9F,EAAKlB,MAAM,OAI/BR,EAAAA,EAAAA,KAAC4I,EAAAA,GAAK,CAACC,MAAM,YAAWhJ,UACtBG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,YACXC,MAAOG,EACP5G,MAAOiH,EACPtG,SAAWO,IACTgG,EAAahG,EAAKlB,MAAM,OAI9BR,EAAAA,EAAAA,KAAC4I,EAAAA,GAAK,CAACC,MAAM,wBAAuBhJ,UAClCG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,wBACXC,MAAOG,EACP5G,MAAOmH,EACPxG,SAAWO,IACTkG,EAAuBlG,EAAKlB,MAAM,OAIxCR,EAAAA,EAAAA,KAAC4I,EAAAA,GAAK,CAACC,MAAM,SAAQhJ,UACnBG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,SACXC,MAAOG,EACP5G,MAAOqH,EACP1G,SAAWO,IACToG,EAAUpG,EAAKlB,MAAM,gBAQnCb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,kBAAkBC,MAAM,OAAMlC,SAAC,gBAMlE,CCvIA,MAAM8D,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAOvB,SAAS0G,EAAiB1J,GAKd,IALe,SACxCE,EAAQ,OACRD,EAAM,cACN0J,EAAa,mBACbC,GACuB5J,EACvB,MAAO6J,EAAgBC,GAAqBzJ,EAAAA,YACrC0J,EAAaC,GAAkB3J,EAAAA,SAAekE,GAErDlE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,CACV,MAAM8I,EAAiB9I,EAAO+I,YAAY,KACpCC,EAAShJ,EAAOiJ,UAAUH,EAAiB,GAC3CI,EAAQlJ,EAAOiJ,UAAU,EAAGH,GAElC,IAAKN,EAAclD,MAAKpE,IAAA,IAAC,MAAEjB,GAAOiB,EAAA,OAAKjB,IAAU+I,CAAM,IACrD,OAIF,GAFAL,EAAkBK,GAEdE,EAAO,CACT,MAAOtH,EAAMC,GAAMqH,EAAMvF,MAAM,MAC/BkF,EAAe,CAAEjH,OAAMC,MACzB,CACF,IACC,CAAC/C,EAAQ0J,IAOZ,OACEpJ,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACF,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,UAC5EG,EAAAA,EAAAA,KAAA,QAAMG,GAAE,GAAA4G,OAAK1H,EAAOkB,OAAM,SAASjB,SARnBc,IACpBA,EAAEC,iBACFf,EAAS,CAAC2J,GAAiBzE,EAAAA,EAAAA,IAAe,CAAC2E,GAAc,CAAC,IAADpC,OAAKkC,KAAqB,MAAM,EAM3BpJ,UACxDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,yCAAwCF,SAAA,EACrDG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iDAAgDF,UAC7DG,EAAAA,EAAAA,KAAC4I,EAAAA,GAAK,CAACC,MAAM,SAAQhJ,UACnBG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,SACXC,MAAO8B,EACPvI,MAAOyI,EACP9H,SAAWO,IACTwH,EAAkBxH,EAAKlB,MAAM,SAKrCR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iDAAgDF,UAC7DG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAOmI,EAAqB,OAAS,QACrCnH,KAAK,SACLrB,MAAO2I,EAAYhH,KACnBhB,SAAWf,IACTgJ,EAAe,IAAKD,EAAahH,KAAM/B,EAAEsE,cAAclE,OAAQ,OAIrER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iDAAgDF,UAC7DG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAOmI,EAAqB,QAAU,QACtCnH,KAAK,SACLrB,MAAO2I,EAAY/G,GACnBjB,SAAWf,IACTgJ,EAAe,IAAKD,EAAa/G,GAAIhC,EAAEsE,cAAclE,OAAQ,cAOzEb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAI,GAAAiF,OAAK1H,EAAOkB,OAAM,SAASwB,MAAM,OAAMlC,SAAC,gBAM1E,CCzFA,MAAM6D,EAAY,IACZC,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAChCgF,EAAU,CACd,CAAE5G,MAAO,IAAKK,MAAO,SACrB,CAAEL,MAAO,IAAKK,MAAO,UAGR,SAAS6I,EAAStK,GAAoC,IAAnC,SAAEE,EAAQ,OAAED,GAAqBD,EACjE,MAAOgJ,EAAQuB,GAAalK,EAAAA,SAAe2H,EAAQ,GAAG5G,QAC/CiJ,EAAOG,GAAYnK,EAAAA,SAAekE,GAEzClE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,CACV,MAAOsJ,EAAaC,GAAgBvJ,EAAO2D,MAAMR,GAEjD,IAAK0D,EAAQvB,MAAKpE,IAAA,IAAC,MAAEjB,GAAOiB,EAAA,OAAKjB,IAAUsJ,CAAY,IACrD,OAIF,GAFAH,EAAUG,GAEND,EAAa,CACf,MAAO1H,EAAMC,GAAMyH,EAAY3F,MAAM,MACrC0F,EAAS,CAAEzH,OAAMC,MACnB,CACF,IACC,CAAC/C,IAOJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACF,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,UAC5EG,EAAAA,EAAAA,KAAA,QAAMG,GAAG,kBAAkBb,SARXc,IACpBA,EAAEC,iBACFf,EAAS,EAACkF,EAAAA,EAAAA,IAAe,CAACiF,GAAQ,CAAC,GAAD1C,OAAIrD,GAASqD,OAAGqB,MAAY,EAMRvI,UAChDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,OAAMF,SAAA,EACnBF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,gCAA+BF,SAAA,EAC5CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACL4C,KAAM,GACNjE,MAAOiJ,EAAMtH,KACbhB,SAAWf,IACTwJ,EAAS,IAAKH,EAAOtH,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGvDR,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACL4C,KAAM,GACNjE,MAAOiJ,EAAMrH,GACbjB,SAAWf,IACTwJ,EAAS,IAAKH,EAAOrH,GAAIhC,EAAEsE,cAAclE,OAAQ,KAGrDR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,iBAAgBF,UAC7BG,EAAAA,EAAAA,KAACgH,EAAAA,GAAM,CACL,aAAW,qBACXjH,UAAU,SACVkH,MAAOG,EACP5G,MAAO4H,EACPjH,SAAWO,IACTiI,EAAUjI,EAAKlB,MAAM,UAK7BR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,qCAAoCF,UACjDG,EAAAA,EAAAA,KAAA,KAAGD,UAAU,YAAWF,SAAER,EAAOkB,OAAOiJ,UAAU,GAAGO,0BAK7DpK,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,kBAAkBC,MAAM,OAAMlC,SAAC,gBAMlE,CCnFA,MAAM6D,EAAY,IACZC,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAEvB,SAAS4H,EAAiB5K,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EACzE,MAAO6K,EAAYC,GAAiBzK,EAAAA,SAAekE,IAC5CwG,EAAYC,GAAiB3K,EAAAA,SAAekE,GAEnDlE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,CACV,MAAM0D,EAAQ1D,EAAO2D,MAAMR,GAE3B,GAAqB,IAAjBO,EAAME,OAAc,CACtB,MAAOc,EAAQ,GAAIC,EAAM,IAAMjB,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,IACzEiB,EAAQ,GAAIC,EAAM,IAAMnB,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,GAEhFgG,EAAc,CAAE/H,KAAM8C,EAAO7C,GAAI8C,IACjCkF,EAAc,CAAEjI,KAAMgD,EAAO/C,GAAIgD,GACnC,CACF,IACC,CAAC/F,IAOJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,SAAA,EAC5EG,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,YAAWF,SAAC,iCAGzCF,EAAAA,EAAAA,MAAA,QAAMQ,GAAG,2BAA2Bb,SAXpBc,IACpBA,EAAEC,iBACFf,EAAS,EAACkF,EAAAA,EAAAA,IAAe,CAACyF,EAAYE,KAAc,EASWtK,SAAA,EACzDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,OAAMF,SAAA,EACnBF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,8BAA6BF,SAAA,EAC1CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAOyJ,EAAW9H,KAClBkD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACT8J,EAAc,IAAKD,EAAY9H,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGjER,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOyJ,EAAW7H,GAClBiD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACT8J,EAAc,IAAKD,EAAY7H,GAAIhC,EAAEsE,cAAclE,OAAQ,QAIjER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,qCAAoCF,UACjDG,EAAAA,EAAAA,KAAA,KAAGD,UAAU,8BAA6BF,SAAC,sBAI/CF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,YAAWF,SAAA,EACxBF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,8BAA6BF,SAAA,EAC1CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,WACNgB,KAAK,SACLrB,MAAO2J,EAAWhI,KAClBkD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACTgK,EAAc,IAAKD,EAAYhI,KAAM/B,EAAEsE,cAAclE,OAAQ,KAGjER,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAO2J,EAAW/H,GAClBiD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACTgK,EAAc,IAAKD,EAAY/H,GAAIhC,EAAEsE,cAAclE,OAAQ,QAIjER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,qCAAoCF,UACjDG,EAAAA,EAAAA,KAAA,KAAGD,UAAU,8BAA6BF,SAAC,4BAKnDF,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,2BAA2BC,MAAM,OAAMlC,SAAC,gBAM3E,CCrGA,MAAMwK,EAAuB,IACvB1G,EAAgB,CAAExB,KAAM,GAAIC,GAAI,IAEvB,SAASkI,EAAgBlL,GAAoC,IAAnC,OAAEC,EAAM,SAAEC,GAAuBF,EACxE,MAAOmL,EAAWC,GAAgB/K,EAAAA,SAAekE,IAC1C8G,EAAYC,GAAiBjL,EAAAA,SAAekE,GAEnDlE,EAAAA,WAAgB,KACd,MAAMc,EAASlB,EAAOK,eAAe,GACrC,GAAIa,EAAQ,CACV,MAAM0D,EAAQ1D,EAAO2D,MAAMmG,GAE3B,GAAqB,IAAjBpG,EAAME,OAAc,CACtB,MAAOwG,EAAQ,GAAIC,EAAM,IAAM3G,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,IACzE2G,EAAQ,GAAIC,EAAM,IAAM7G,EAAM,GAAGlD,SAAS,MAAQkD,EAAM,GAAGC,MAAM,MAAQ,GAEhFsG,EAAa,CAAErI,KAAMwI,EAAOvI,GAAIwI,IAChCF,EAAc,CAAEvI,KAAM0I,EAAOzI,GAAI0I,GACnC,CACF,IACC,CAACzL,IAiBJ,OACEM,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACF,EAAAA,GAAU,CAACC,UAAU,yDAAwDF,UAC5EG,EAAAA,EAAAA,KAAA,QAAMG,GAAG,0BAA0Bb,SAlBnBc,IACpBA,EAAEC,iBACF,MAAQ8B,KAAM4I,EAAM3I,GAAI4I,GAAST,GACzBpI,KAAM8I,EAAM7I,GAAI8I,GAAST,EAC3BU,EAAeJ,GAAQC,EAAO,GAAHjE,OAAMgE,EAAI,MAAAhE,OAAKiE,GAAS,KACnDI,EAAgBH,GAAQC,EAAO,GAAHnE,OAAMkE,EAAI,MAAAlE,OAAKmE,GAAS,KAE1D,IAAIG,EAAmB,GACnBF,IAAcE,GAAoBF,IAClCA,GAAgBC,KAAeC,GAAoBhB,GACnDe,IAAeC,GAAoBD,GAEvC9L,EAAS,CAAC+L,GAAkB,EAMkCxL,UACxDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,qCAAoCF,SAAA,EACjDG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yCAAwCF,UACrDG,EAAAA,EAAAA,KAAA,KAAAH,SAAG,YAELG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBF,UACnCG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,OACNgB,KAAK,SACLrB,MAAO+J,EAAUpI,KACjBkD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACToK,EAAa,IAAKD,EAAWpI,KAAM/B,EAAEsE,cAAclE,OAAQ,OAIjER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBF,UACnCG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,QACNgB,KAAK,SACLrB,MAAO+J,EAAUnI,GACjBiD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACToK,EAAa,IAAKD,EAAWnI,GAAIhC,EAAEsE,cAAclE,OAAQ,OAK/DR,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yCAAwCF,UACrDG,EAAAA,EAAAA,KAAA,KAAAH,SAAG,aAELG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBF,UACnCG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,OACNgB,KAAK,SACLrB,MAAOiK,EAAWtI,KAClBkD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACTsK,EAAc,IAAKD,EAAYtI,KAAM/B,EAAEsE,cAAclE,OAAQ,OAInER,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBF,UACnCG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,QACNgB,KAAK,SACLrB,MAAOiK,EAAWrI,GAClBiD,IAAK,EACLZ,KAAM,GACNtD,SAAWf,IACTsK,EAAc,IAAKD,EAAYrI,GAAIhC,EAAEsE,cAAclE,OAAQ,cAOvEb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAIC,EAAAA,GAAc/B,SAAC,YAC3BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASC,KAAK,0BAA0BC,MAAM,OAAMlC,SAAC,gBAM1E,CCjGA,MAAMyL,EAAsB,CAC1B,CAAE9K,MAAO,KAAMK,MAAO,YACtB,CAAEL,MAAO,KAAMK,MAAO,aACtB,CAAEL,MAAO,KAAMK,MAAO,aACtB,CAAEL,MAAO,KAAMK,MAAO,aACtB,CAAEL,MAAO,MAAOK,MAAO,cACvB,CAAEL,MAAO,MAAOK,MAAO,cACvB,CAAEL,MAAO,MAAOK,MAAO,cACvB,CAAEL,MAAO,IAAKK,MAAO,UACrB,CAAEL,MAAO,KAAMK,MAAO,WACtB,CAAEL,MAAO,KAAMK,MAAO,WACtB,CAAEL,MAAO,IAAKK,MAAO,OACrB,CAAEL,MAAO,KAAMK,MAAO,QACtB,CAAEL,MAAO,KAAMK,MAAO,SACtB,CAAEL,MAAO,MAAOK,MAAO,WACvB,CAAEL,MAAO,MAAOK,MAAO,QACvB,CAAEL,MAAO,MAAOK,MAAO,QACvB,CAAEL,MAAO,MAAOK,MAAO,QAGnB0K,GAA2B,CAC/B,CAAE/K,MAAO,KAAMK,MAAO,WACtB,CAAEL,MAAO,KAAMK,MAAO,WACtB,CAAEL,MAAO,MAAOK,MAAO,OACvB,CAAEL,MAAO,KAAMK,MAAO,WAGlB2K,GAAwB,CAC5B,CAAEhL,MAAO,KAAMK,MAAO,UACtB,CAAEL,MAAO,KAAMK,MAAO,UACtB,CAAEL,MAAO,KAAMK,MAAO,UACtB,CAAEL,MAAO,MAAOK,MAAO,WACvB,CAAEL,MAAO,KAAMK,MAAO,oBASjB,SAAS4K,GAAYrM,GAA6C,IAA5C,OAAEC,EAAM,YAAEqM,GAAgCtM,EACrE,MAAMuM,EAAelM,EAAAA,aAClB8I,IACC,GAAIlJ,EAAQ,CACV,MAAM,OAAEkB,GAAWlB,EACbiB,EAAU,KACXsL,EAAAA,EAAAA,MACH,CAACrL,GAASgI,EAAOhI,QAAQC,KAAYA,KAEjCqL,GAAiBC,EAAAA,EAAAA,KACvBC,OAAOC,SAASC,KACd,kBAAmBC,EAAAA,EAAAA,GAAkB,IAAKL,EAAgBM,GAAGC,EAAAA,EAAAA,IAAyB9L,IAC1F,IAEF,CAACjB,IAGH,IAAKA,EAAQ,OAAO,KAqDpB,OACEM,EAAAA,EAAAA,MAAC0M,EAAAA,GAAM,CAAC,aAAYhN,EAAOwJ,MAAQ,UAAWtJ,MAAOmM,EAAY7L,SAAA,EAC/DG,EAAAA,EAAAA,KAACsM,EAAAA,GAAY,CAACvM,UAAU,UAASF,SAAER,EAAOwJ,QArDnB0D,MACzB,OAAQlN,EAAOkB,QACb,IAAK,UACH,OAAOP,EAAAA,EAAAA,KAACkH,EAAa,CAAC7H,OAAQA,EAAQC,SAAUqM,IAClD,IAAK,eACH,OAAO3L,EAAAA,EAAAA,KAACmD,EAAiB,CAAC9D,OAAQA,EAAQC,SAAUqM,IACtD,IAAK,UACL,IAAK,WACH,OAAO3L,EAAAA,EAAAA,KAAC8I,EAAiB,CAACC,cAAeuC,EAAqBjM,OAAQA,EAAQC,SAAUqM,IAC1F,IAAK,gBACH,OAAO3L,EAAAA,EAAAA,KAACsK,EAAgB,CAACjL,OAAQA,EAAQC,SAAUqM,IACrD,IAAK,cACH,OAAO3L,EAAAA,EAAAA,KAACgK,EAAiB,CAAC3K,OAAQA,EAAQC,SAAUqM,IACtD,IAAK,WACL,IAAK,WACL,IAAK,YACH,OAAO3L,EAAAA,EAAAA,KAAC0J,EAAS,CAACrK,OAAQA,EAAQC,SAAUqM,IAC9C,IAAK,gBACL,IAAK,gBACL,IAAK,gBACL,IAAK,aACH,OAAO3L,EAAAA,EAAAA,KAAC8F,EAAa,CAACzG,OAAQA,EAAQC,SAAUqM,IAClD,IAAK,WACH,OAAO3L,EAAAA,EAAAA,KAAC2E,EAAW,CAACtF,OAAQA,EAAQC,SAAUqM,IAChD,IAAK,gBACH,OACE3L,EAAAA,EAAAA,KAAC8I,EAAiB,CAChBC,cAAewC,GACflM,OAAQA,EACRC,SAAUqM,EACV3C,oBAAkB,IAGxB,IAAK,aACH,OACEhJ,EAAAA,EAAAA,KAAC8I,EAAiB,CAChBC,cAAeyC,GACfnM,OAAQA,EACRC,SAAUqM,EACV3C,oBAAkB,IAGxB,IAAK,SACH,OAAOhJ,EAAAA,EAAAA,KAACsH,EAAa,CAACjI,OAAQA,EAAQC,SAAUqM,IAClD,IAAK,YACH,OAAO3L,EAAAA,EAAAA,KAAC4D,EAAwB,CAACvE,OAAQA,EAAQC,SAAUqM,IAC7D,QACE,OAAO3L,EAAAA,EAAAA,KAACb,EAAa,CAACE,OAAQA,EAAQC,SAAUqM,IACpD,EAMGY,KAGP,CClIA,SAASC,GAAmBhM,GAC1B,OAAIA,GAAsB,MAAbA,EAAM,GACVA,EAAMiM,MAAM,GAEdjM,CACT,CAgCA,SAASkM,KACP,MAAMC,EAASC,SAASC,eAAe,MAASC,KAAqBC,aAAa,gBAChFlL,EAAO8K,EAAOnM,MACdwM,EAASC,MAAM9K,KAAK2K,KAAKI,WAAYA,WAAYA,WAAYC,iBAAiB,UAC9E5M,EAASoM,EAAOI,aAAa,eAC7BK,EAAQT,EAAOI,aAAa,YAC5BM,EAAkBV,EAAOI,aAAa,qBACtCO,EAAS,IAAIC,OAAOhN,EAAS,oBAC/B,IAAIiN,EAAIJ,EAER,GAAwB,KAApBJ,EAAO,GAAGxM,OAAoC,KAApBwM,EAAO,GAAGxM,MAAc,CACpD,IAzCJ,SAAgCqB,EAAc4L,EAA0BC,GACtE,MAAMC,EAAwB,UAAT9L,EAAmB,kBAAoB,2BACtD+L,EAAgBD,EAAaE,KAAKJ,EAAOjN,OACzCsN,EAAgBH,EAAaE,KAAKH,EAAOlN,OAE/C,OAAKoN,EAKAE,EAMDF,GAAiBG,KAAKC,IAAIC,OAAOR,EAAOjN,QAAUyN,OAAOC,kBAC3DC,MAAM,wBACNV,EAAOW,SACA,KAELN,GAAiBC,KAAKC,IAAIC,OAAOP,EAAOlN,QAAUyN,OAAOC,mBAC3DC,MAAM,wBACNT,EAAOU,QACA,KAbPD,MAAM,SAAoB,UAATtM,EAAmB,SAAW,IAAM,wBACrD6L,EAAOU,SACA,IAPPD,MAAM,SAAoB,UAATtM,EAAmB,SAAW,IAAM,wBACrD4L,EAAOW,SACA,EAoBX,CAaSC,CAAuBxM,EAAMmL,EAAO,GAAIA,EAAO,IAClD,OAEF,MAAMxM,EAAQD,EAAS,IAAMiM,GAAmBQ,EAAO,GAAGxM,OAAS,KAAOgM,GAAmBQ,EAAO,GAAGxM,OACvGgN,EAAIH,EAAgBiB,QAAQhB,EAAQiB,mBAAmB/N,GACzD,CAEAuL,OAAOC,SAASC,KAAO,iBAAmBuB,CAC5C,CCzDA,SAASgB,KAA8B,IAAAC,EACrC,MAAMlO,EAASuM,KAAKC,aAAa,eAE3B2B,EAAM9B,SAASC,eAAe,OAAStM,GACvCoO,EAAM/B,SAASC,eAAe,OAAStM,GAC7CmO,IAAQA,EAAIE,MAAMC,QAAU,QAC5BF,IAAQA,EAAIC,MAAMC,QAAU,QAE5B,MAAMlC,EAASC,SAASC,eAAe,MAAQtM,GAK/C,OAJAoM,EAAOnM,MAAQ,GACfmM,EAAOiC,MAAMC,QAAU,QACR,QAAfJ,EAAA9B,EAAOmC,gBAAQ,IAAAL,GAAfA,EAAAM,KAAApC,EAAkB,IAAIqC,MAAM,YAErB,CACT,C,yBCbA,SAASC,KACP,MAAMC,EAAapC,KAAKtM,MACtBD,EAASuM,KAAKC,aAAa,eAC3BK,EAAQN,KAAKC,aAAa,YAC1BM,EAAkBP,KAAKC,aAAa,qBACpCO,EAAS,IAAIC,OAAOhN,EAAS,oBAC/B,IAAIiN,EAAIJ,EAER,GAAmB,KAAf8B,EAAmB,CACrB,MAAMC,GAAmBC,EAAAA,GAAAA,GAAmBF,GAAY,GAExD,GAAyB,KAArBC,EAEF,YADAhB,MAAM,8DAIR,MAAM3N,EAAQD,EAAS,IAAM4O,EAAiBE,WAAW,IAAK,KAC9D7B,EAAIH,EAAgBiB,QAAQhB,EAAQiB,mBAAmB/N,GACzD,CAEAuL,OAAOC,SAASC,KAAO,iBAAmBuB,CAC5C,CCVO,SAAS8B,KHgDd7P,EAAAA,WAAgB,KACd,MAAMuN,EAASC,MAAM9K,KAAKyK,SAASO,iBAAiB,2BAC9CoC,EAAuB,GAC7B,IAAK,IAAIC,EAAI,EAAGA,EAAIxC,EAAO7I,OAAQqL,IAAK,CACtC,MAAMC,GAAaC,EAAAA,EAAAA,IAAsB1C,EAAOwC,GAAI,SAAU9C,IAC9D6C,EAAqBI,KAAKF,EAC5B,CAEA,MAAO,KACLF,EAAqBtH,SAASwH,IAC5BA,GAAY,GACZ,CACH,GACA,IEhDHhQ,EAAAA,WAAgB,KACd,MAAMuN,EAASC,MAAM9K,KAAKyK,SAASO,iBAAiB,sBAC9CoC,EAAuB,GAC7B,IAAK,IAAIC,EAAI,EAAGA,EAAIxC,EAAO7I,OAAQqL,IAAK,CACtC,MAAMC,GAAaC,EAAAA,EAAAA,IAAsB1C,EAAOwC,GAAI,SAAUP,IAC9DM,EAAqBI,KAAKF,EAC5B,CAEA,MAAO,KACLF,EAAqBtH,SAASwH,IAC5BA,GAAY,GACZ,CACH,GACA,IDrBHhQ,EAAAA,WAAgB,KACd,MAAMmQ,EAAS3C,MAAM9K,KAAKyK,SAASiD,uBAAuB,yBACpDN,EAAuB,GAC7B,IAAK,IAAIC,EAAI,EAAGA,EAAII,EAAOzL,OAAQqL,IAAK,CACtC,MAAMC,GAAaC,EAAAA,EAAAA,IAAsBE,EAAOJ,GAAI,QAAShB,IAC7De,EAAqBI,KAAKF,EAC5B,CAEA,MAAMK,EAAQ7C,MAAM9K,KAAKyK,SAASiD,uBAAuB,yBACzD,IAAK,IAAIL,EAAI,EAAGA,EAAIM,EAAM3L,OAAQqL,IAAK,CACrC,MAAMC,GAAaC,EAAAA,EAAAA,IAAsBI,EAAMN,GAAI,QAAShB,IAC5De,EAAqBI,KAAKF,EAC5B,CAEA,MAAO,KACLF,EAAqBtH,SAASwH,IAC5BA,GAAY,GACZ,CACH,GACA,IEpBH,MAAOM,EAAgBC,GAAqBvQ,EAAAA,WACtCwQ,EAAYxQ,EAAAA,QAAa,GACzBiM,GAAcwE,EAAAA,EAAAA,IAAe,CACjCC,OAAAA,CAAQC,GACDA,IACHJ,OAAkBvN,GAClB4N,IAEJ,IAGIhR,EAASI,EAAAA,SAAiC,KAAM,IAAA6Q,EACpD,IAAKP,EACH,OAAO,KAET,MAAM7C,EAAa6C,EAAe7C,WAC5B3M,EAASwP,EAAehD,aAAa,eACrClE,GAAQ0H,EAAAA,EAAAA,IAAYrD,EAAWsD,wBAC/B9Q,EAA+C,QAAjC4Q,GAAG1E,EAAAA,EAAAA,MAAuBrL,UAAO,IAAA+P,EAAAA,EAAI,GAUzD,MAAO,CACLG,eAVqBV,EAAevP,MAWpCD,SACAsI,QACAnI,QAZcuM,MAAM9K,KAAK4N,EAAerP,SACvCC,KAAKyH,IAAM,CAAQ5H,MAAO4H,EAAO5H,MAAOK,MAAOuH,EAAOsI,SACtDnQ,QAAQoQ,IACP,MAAMC,EAAUD,EAAInQ,MAAMO,SAAS,SAC7B8P,EAAwB,KAAdF,EAAInQ,MACpB,OAAQoQ,IAAYC,KAAYpQ,EAAAA,EAAAA,GAAqBkQ,EAAInQ,MAAM,IAQjEd,iBACD,GACA,CAACqQ,IAEEM,EAAe5Q,EAAAA,aAAkB,KACrC,MAAMqR,EAAmBlE,SAASC,eAAe,QAASxN,aAAM,EAANA,EAAQkB,SACsB,IAAAwQ,GAApFhB,GAAoBe,GAAuD,SAAnCA,EAAiBlC,MAAMC,UACjEkB,EAAevP,MAAQuP,EAAehD,aAAa,iBAC5B,QAAvBgE,EAAAhB,EAAejB,gBAAQ,IAAAiC,GAAvBA,EAAAhC,KAAAgB,EAA0B,IAAIf,MAAM,WACtC,GACC,CAACe,EAAgB1Q,IA4DpB,OA1DAI,EAAAA,WAAgB,KACd,SAASuR,EAAuBC,GAC9B,MAAM1Q,EAAS0Q,EAAKlE,aAAa,eAC/BK,EAAQ6D,EAAKlE,aAAa,YAC1BM,EAAkB4D,EAAKlE,aAAa,qBACpCmE,EAAKtE,SAASC,eAAe,MAAQtM,GACrCC,EAAQ0Q,EAAG1Q,MACb,IAAIgN,EAAIJ,EAER,GAAc,UAAV5M,GAA+B,WAAVA,EAKlB,GAAIA,EAAMO,SAAS,SACxBoQ,EAAkBpC,KAAKnC,SAASC,eAAe,MAAQtM,QADlD,CAGA,GAAIC,EAAM2D,OAAS,EAAG,CAC3B,MAAMmJ,EAAS,IAAIC,OAAOhN,EAAS,oBACnCiN,EAAIH,EAAiBiB,QAAQhB,EAAQ/M,EAAS,IAAMC,EACtD,CACAuL,OAAOC,SAASC,KAAO,iBAAmBuB,CAD1C,KAXA,CACE0D,EAAGtC,MAAMC,QAAU,OACCjC,SAASC,eAAe,OAAStM,GACzCqO,MAAMC,QAAU,OAQ9B,CAEF,CAEA,SAASsC,IACP,MAAM5Q,EAASuM,KAAKC,aAAa,eAC3BJ,EAASC,SAASC,eAAe,MAAQtM,GAC/CyP,EAAkBrD,GAClBjB,EAAY0F,MACd,CAEA,MAAMC,EAAQpE,MAAM9K,KAAKyK,SAASiD,uBAAuB,yBACnDN,EAAuB,GAC7B,IAAK,IAAIC,EAAI,EAAGA,EAAI6B,EAAMlN,OAAQqL,IAAK,CACrC,MAAMC,GAAaC,EAAAA,EAAAA,IAAsB2B,EAAM7B,GAAI,QAAS2B,GAC5D5B,EAAqBI,KAAKF,EAC5B,CAEA,IAAKQ,EAAUqB,QAAS,CACtBrB,EAAUqB,SAAU,EACpB,MAAMC,EAAUtE,MAAM9K,KAAKyK,SAASO,iBAAiB,4DACrD,IAAK,IAAIqC,EAAI,EAAGA,EAAI+B,EAAQpN,OAAQqL,IAAK,CACvC,MAAM7C,EAAS4E,EAAQ/B,GACF,UAAjB7C,EAAOnM,OAAsC,WAAjBmM,EAAOnM,MACrCwQ,EAAuBrE,GACG,UAAjBA,EAAOnM,QAChBgR,EAAAA,EAAAA,IAA0B7E,EAE9B,CAEAZ,OAAOiF,uBAAyBA,CAClC,CAEA,MAAO,KACLzB,EAAqBtH,SAASwH,GAAeA,KAAa,CAC3D,GACA,CAAC/D,KAEG1L,EAAAA,EAAAA,KAACyL,GAAY,CAACpM,OAAQA,EAAQqM,YAAaA,GACpD,C,gECjGO,SAAS+F,KACd,MAAMC,EAAYC,eAAeC,gBAC1BC,IAAgBC,EAAAA,EAAAA,OACjB,mBAAEC,EAAkB,wBAAEC,IAA4BC,EAAAA,GAAAA,IAAsBP,GACxEQ,EAAezS,EAAAA,SACnB,IAAM6I,OAAO6J,YAAYN,IACzB,CAACA,IAEGO,EAAe3S,EAAAA,OAA0BmN,SAASC,eAAe,6BACjE,kBAAEwF,EAAiB,kBAAEC,GAnB7B,SAA0CC,GAAuC,IAAAC,EAAAC,EAC/E,MAAMJ,EAA+B,QAAdG,EAAID,EAASG,SAAC,IAAAF,EAAAA,EAA2C,QAA3CC,EAAId,eAAegB,gCAAwB,IAAAF,OAAA,EAAvCA,EAAyCG,UAClF,IAAIN,EAAoBC,EAASM,GACM,IAAAC,EAIvC,OAJKR,GAAsBC,EAASG,IAClCJ,GAA2D,QAAvCQ,EAAAnB,eAAegB,gCAAwB,IAAAG,OAAA,EAAvCA,EAAyC1P,iBAAaX,GAGrE,CAAE4P,oBAAmBC,oBAC9B,CAWmDS,CAAiCb,GAElFzS,EAAAA,WAAgB,KACd2S,EAAad,QAAQ1C,MAAMoE,WAAa,OAAO,GAC9C,IAEH,MAAMC,GAA0BC,EAAAA,GAAAA,IAAmBxB,GAAW/Q,KAAKwS,IAA+B,CAChGtS,MAAOsS,EAAetS,MACtBuS,WAAYD,EAAeC,WAAWzS,KAAK0S,IAAS,IAC/CA,EACHpH,MAAMqH,EAAAA,GAAAA,IAAkC,CACtC5B,YACA6B,SAAUxH,OAAOC,SAASuH,SAC1BX,UAAWS,EAAU7S,MACrBgT,YAAa,2BACbC,kBAAmB,OAErBC,YAAY,UAIVC,GAA0BC,EAAAA,GAAAA,IAA2B,CACzDlC,UAAWC,eAAeC,eAC1BiC,YAAavB,EACbwB,mBAAmB,EACnBJ,YAAY,EACZK,WAAYC,GAAAA,EAAWC,MACvBC,aAAe9Q,IACbkQ,EAAAA,GAAAA,IAAkC,CAChC5B,YACA6B,SAAUxH,OAAOC,SAASuH,SAC1BX,UAAWxP,EAAUwP,UACrBxP,UAAWA,EAAU5C,MACrBgT,YAAa,4BACbC,kBAAmB,UAGnB,eAAEU,EAAc,2BAAEC,EAA0B,sBAAEC,IAA0BC,EAAAA,GAAAA,IAAyB,CACrGP,WAAYC,GAAAA,EAAWC,MACvBM,WAAY,IAAItS,KAChBuS,wBAAwB,EACxBC,cAAerV,IAAA,IAAC,UAAEgE,EAAS,UAAEwP,GAAWxT,EAAA,MAAM,CAC5CmU,SAAUxH,OAAOC,SAASuH,SAC1BmB,OAAQ,IAAIC,gBAAgB,IAAKzC,EAAcQ,EAAGE,EAAWC,GAAIzP,QAAAA,EAAa,KAAMwR,WACrF,IAGH,OACEjV,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAAC6U,GAAAA,GAAY,CACX9U,UAAU,4CACV+U,KAAK,QACLC,SAAUpD,eAAeqD,mBAAqB,UAAY,OAC1DC,gBAAiBhC,EACjBiC,gBAAiBvB,EACjBtB,kBAAmBA,EACnBC,kBAAmBA,QAAAA,EAAqB,KACxCP,mBAAoBA,EACpBoD,kBAAmBA,OACnBC,kBAAmBf,EACnBgB,0BAA2B5T,IAAe,IAAd,MAAEjB,GAAOiB,EACnCuQ,EAAwBxR,EAAmB,EAE7C8U,2BAA4B,EAC5BC,mBAAoB5D,eAAeC,eACnC4D,0BAA0B,EAC1BC,uBAAwBA,KAClB/D,GAAW0C,EAA2BhD,MAAM,KAGpDpR,EAAAA,EAAAA,KAAC0V,GAAAA,GAAe,CACdhK,YAAa0I,EACbhR,UAAWkP,EACXiC,WAAY,IAAItS,KAChBkS,eAAgBvT,IAAiD,IAAhD,UAAEwC,GAAyCxC,EAC1D,MAAMJ,EAAQ4C,QAAAA,EAAa,GACrBwP,GAAY+C,EAAAA,GAAAA,IAA0B,CAC1CvS,UAAW5C,EACXuT,WAAYC,GAAAA,EAAWC,MACvBM,WAAY,IAAItS,KAChByP,UAAWA,IAEb,OAAOyC,EAAe,CAAE3T,QAAOoS,UAAWA,GAAY,MAKhE,CCpHA,MAAMgD,GAAmC,+BAEnCC,GAA8BA,KAClC,MAAMC,EAAqBlJ,SAASC,eAAe+I,IAC/CE,GACFC,EAAAA,QACE/V,EAAAA,EAAAA,KAACgW,EAAAA,GAAa,CAAAnW,UACZG,EAAAA,EAAAA,KAACyR,GAAoB,MAEvBqE,EAEJ,GAQFG,EAAAA,EAAAA,IAAM,KACJ,MAAMC,EAAWtJ,SAASC,eAAe,kBACrCqJ,GAAYvE,eAAeC,gBAC7BmE,EAAAA,QAAgB/V,EAAAA,EAAAA,KAACsP,GAAe,IAAK4G,GAEvCL,IAA6B,IAG/B9J,OAAOoK,4BAA8BN,GACrC9J,OAAOqK,8BAd+BC,KACpC,MAAMP,EAAqBlJ,SAASC,eAAe+I,IAC/CE,GAAoBC,EAAAA,uBAAgCD,EAAmB,C,gPCvBtE,IAAKQ,EAAa,SAAbA,GAAa,OAAbA,EAAa,SAAbA,EAAa,WAAbA,EAAa,UAAbA,EAAa,YAAbA,EAAa,YAAbA,EAAa,eAAbA,EAAa,gBAAbA,CAAa,MAUbC,EAAc,SAAdA,GAAc,OAAdA,EAAc,gBAAdA,EAAc,YAAdA,EAAc,aAAdA,EAAc,eAAdA,EAAc,0BAAdA,CAAc,MAQdC,EAAsB,SAAtBA,GAAsB,OAAtBA,EAAsB,mBAAtBA,CAAsB,MAItBC,EAAY,SAAZA,GAAY,OAAZA,EAAAA,EAAY,wBAAZA,EAAAA,EAAY,gBAAZA,EAAAA,EAAY,sBAAZA,CAAY,MAMjB,SAAS/G,EAAsBwB,EAAiBwF,EAAmBC,GAGxE,OAFAzF,EAAG0F,iBAAiBF,EAAWC,GAExB,KACLzF,EAAG2F,oBAAoBH,EAAWC,EAAQ,CAE9C,CAEO,SAASpG,EAAYW,GAC1B,OAAOA,EAAGX,aAAeW,EAAG4F,SAC9B,CAoBO,SAAStF,EAA0B7E,GACxC,MAAMpM,EAASoM,EAAOI,aAAa,eAC7BgK,EAAgBnK,SAASC,eAAe,OAAStM,GACvD,GAAIwW,EAAe,CACjBpK,EAAOiC,MAAMC,QAAU,OACvBkI,EAAcnI,MAAMC,QAAU,QAC9B,MAAMmI,EAAQpK,SAASC,eAAe,QAAUtM,GAC1CG,EAzBH,SAAgCiM,GAA2B,IAAAsK,EAAAC,EAChE,MAAMxW,EAA0D,QAAnDuW,EAAuC,QAAvCC,EAAGvK,EAAOI,aAAa,wBAAgB,IAAAmK,OAAA,EAApCA,EAAsChT,MAAM,YAAI,IAAA+S,EAAAA,EAAI,GAClEE,EAAS,GACX,IAAK,IAAI3H,EAAI,EAAG4H,EAAM1W,EAAQyD,OAAQqL,EAAI4H,EAAK5H,IAE7C,IADA,IAAIpH,EAAS1H,EAAQ8O,GACZ6H,EAAI,EAAGA,EAAI1K,EAAO9M,SAASsE,OAAQkT,IAAK,CAC/C,IAAIC,EAAW3K,EAAO9M,SAASwX,GAC3BC,EAAS9W,QAAU4H,GACrB+O,EAAOxH,KAAK,CACVjH,IAAKN,EACL5H,MAAO+P,EAAY+G,IAGzB,CAEF,OAAOH,CACT,CASoBI,CAAuB5K,GACjC6K,EAAM,GACZ,IAAK,IAAIhI,EAAI,EAAG4H,EAAM1W,EAAQyD,OAAQqL,EAAI4H,EAAK5H,IAC7CgI,EAAI7H,KAAKjP,EAAQ8O,GAAGhP,OAEtBwW,EAAMxW,MAAQgX,EAAI7O,KAAK,KACzB,CACF,CAEA,MAAM8O,EAAa,kCAEZ,SAAShX,EAAqB2H,GACnC,IAAKA,EAAOrH,SAAS,KAAM,OAAO,EAElC,MAAOoB,EAAMC,GAAMgG,EAAOlE,MAAM,MACzBwT,EAAiBC,GAAiB,CAACxV,EAAMC,GAAIzB,KAAKH,KACnDiX,EAAW5J,KAAKrN,KACVyN,OAAO2J,MAAM,IAAI3V,KAAKzB,EAAM8N,QAAQ,KAAM,MAAMuJ,aAK5D,OAAOH,GAAmBC,CAC5B,CAEO,SAASpU,EAAiC7D,GAC/C,MAAM4D,EAAc5D,EAAeoY,KAAKrX,GAExC,GAAI6C,EACF,OAAOA,EAAYY,MAAM,KAAKvD,KAAKoX,GAAUN,EAAW5J,KAAKkK,GAAQA,EAAKzJ,QAAQ,KAAM,UAAO7L,GAEnG,CAEO,SAASgB,EAAuBrE,GAA+C,IAA9C,KAAE+C,EAAI,GAAEC,GAAoChD,EAClF,OAAO+C,GAAQC,EAAK,GAAA2E,OAAG5E,QAAAA,EAAQ,GAAE,KAAA4E,OAAI3E,QAAAA,EAAM,IAAKkM,QAAQ,MAAO,KAAO,IACxE,CAKO,SAAS0J,EAAgBC,GAAuF,IAAAC,EAAAC,EAAA,IAAlEC,EAAuBC,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,GAAIC,EAASD,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAGtM,OAAOC,SAAS0I,OAC7G,MAAMtH,EAAQ,IAAIuH,gBAAgB2D,GAC5BC,EAAY,IAAIH,KAAkB9P,OAAOC,OAAO+N,IAOzCrJ,MAAM9K,KAAKiL,EAAMoL,QAEzBvQ,SAASS,IACP6P,EAAUxX,SAAS2H,IACtB0E,EAAMqL,OAAO/P,EACf,IAGF,MAAO,CAAEgQ,EAAcC,EAAW,GAAwD,QAAtDT,EAAgC,QAAhCC,EAAG/K,EAAMwL,IAAItC,EAAcuC,aAAK,IAAAV,OAAA,EAA7BA,EAA+BW,MAAM,sBAAc,IAAAZ,EAAAA,EAAI,GAM9F,OAJID,QAAAA,EAAQS,IACVtL,EAAM2L,IAAIzC,EAAcuC,KAAM,GAAF9R,OAAKkR,QAAAA,EAAQS,GAAY3R,OAAG4R,IAGnDvL,CACT,CAKO,SAASxB,IAAyD,IAApC0M,EAASD,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAGtM,OAAOC,SAAS0I,OAC/D,MACMsE,EADQ,IAAIrE,gBAAgB2D,GACNM,IAAItC,EAAc2C,SAE9C,OAAKD,EAEE1Q,OAAO6J,YACZ6G,EAAc9U,MAAM,KAAKvD,KAAKwL,IAC5B,MAAM+M,EAAiB/M,EAAE7C,YAAY,KAGrC,MAAO,CAFK6C,EAAE3C,UAAU,EAAG0P,GACb/M,EAAE3C,UAAU0P,EAAiB,GACxBhV,MAAM,KAAK,KAPP,CAAC,CAU9B,CAKO,SAASkI,EAAyB9L,GACvC,OAAOgI,OAAOG,QAAQnI,GACnBC,QAAOkB,IAAA,IAAE,CAAEjB,GAAMiB,EAAA,OAAK0X,OAAO3Y,GAAO2D,OAAS,CAAC,IAC9CxD,KAAIC,IAAA,IAAE8H,EAAKlI,GAAMI,EAAA,SAAAmG,OAAQ2B,EAAG,KAAA3B,OAAIvG,EAAMmI,KAAK,KAAI,IAC/CA,KAAK,IACV,CAEO,SAASnE,EACdoL,EAIAwJ,GAGA,IAFAC,EAAShB,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,IACZiB,EAAcjB,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,KAEjB,OAAOzI,EAAO2J,QAAO,CAAChZ,EAAQkJ,EAAO+P,KAAU,IAAAC,EAC7C,MAAM,KAAEtX,EAAI,GAAEC,GAAOqH,EACfiQ,EAAWvX,GAAQC,EAAK,GAAH2E,OAAM5E,GAAI4E,OAAGuS,GAAcvS,OAAG3E,GAAE2E,OAAyB,QAAzB0S,EAAGL,aAAa,EAAbA,EAAgBI,UAAM,IAAAC,EAAAA,EAAI,IAAO,GAE/F,IAAIE,EAAgBpZ,EAEpB,OADIiZ,EAAQ,IAAGG,GAAiBN,GACzBM,EAAgBD,CAAQ,GAC9B,GACL,C,0DC/KA,SAASE,IACP,OAAO,IAAI3X,MAAO4X,SACpB,CAEA,SAASC,IACP,MAAoC,YAA7BlN,SAASmN,kBAAqD,IAApBnN,SAASoN,MAC5D,CAMO,SAASC,EAAyBC,GACvC,MAAMC,GAAsBC,EAAAA,EAAAA,IAAuB,IAAMF,EAASJ,OAIlE,OAFAlN,SAASgK,iBAAiB,mBAAoBuD,GAEvC,CACLD,SAAUC,EACVE,YAAaA,KACXzN,SAASiK,oBAAoB,mBAAoBsD,EAAoB,EAG3E,CAQO,SAASG,EACdC,EACAL,GAEA,MAAMM,EAAkC,mBAAbD,EAA0BA,EAAW,IAAMA,EACtE,IAAIE,EAA8C,KAC9CC,EAAcd,IAAuBY,IACrCG,EAAgC,KAEpCC,eAAeC,IACbH,EAAcd,IAAuBY,IAErCC,EAAiBP,UACXO,EACNA,EAAiB,KAGbX,MACFa,EAAiB5O,OAAO+O,WAAWD,EAAS9M,KAAKgN,IAAI,EAAGL,EAAcd,MAE1E,CAKA,SAASoB,IAGP,GAFIL,GAAgBM,aAAaN,GAE7Bb,KAA6C,OAAnBW,EAAyB,CACrD,MAAMS,EAAgBtB,IAElBc,GAAeQ,EACjBL,IAEAF,EAAiB5O,OAAO+O,WAAWD,EAASH,EAAcQ,EAE9D,CACF,CAQA,OANIpB,MACFa,EAAiB5O,OAAO+O,WAAWD,EAASL,MAG9C5N,SAASgK,iBAAiB,mBAAoBoE,GAEvC,KACDL,GAAgBM,aAAaN,GACjC/N,SAASiK,oBAAoB,mBAAoBmE,EAAuB,CAE5E,C,oGC7EO,IAAKG,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,iBAAVA,EAAAA,EAAU,eAAVA,CAAU,MA6Df,SAASC,EAAWhc,GAQN,IARO,UAC1BW,EAAS,SACTF,EAAQ,MACRkC,EAAQ,QAAO,WACfsZ,GAAa,EAAI,UACjBC,GAAY,EAAI,SAChBvG,EAAW,UAAS,eACpBwG,GACiBnc,EACjB,MAAMoc,EAAiBC,EAAAA,GAAe1G,GAChC2G,EAAajc,EAAAA,SAAc,IAzBnC,SAAuBsC,GACrB,OAAQA,IACDoZ,EAAWQ,KACP,CACLC,QAAS,8BACTC,QAAS,eAGJ,CACLD,QAAS,iEACTC,QAAS,+BAGjB,CAYyCC,CAAcX,EAAWpZ,KAAS,CAACA,IAC1E,OACE/B,EAAAA,EAAAA,KAAA,OACE+b,KAAK,QACLhc,UAAWic,IACT,2CACA,CAAEC,OAAQX,GACVI,EAAWE,QACXJ,EACAzb,GACAF,SAEDJ,EAAAA,SAAekB,IAAId,GAAU,CAACqc,EAAO1C,KAAU,IAAA2C,EAAAC,EAC9C,OAAK3c,EAAAA,eAAqByc,IAAW,CAAC5a,EAAAA,EAAQia,GAAgBhb,OAAO8b,SAAStb,SAASmb,EAAMra,OAK3FlC,EAAAA,EAAAA,MAACF,EAAAA,SAAc,CAAAI,SAAA,CACZwb,GAAc7B,EAAQ,IAAKxZ,EAAAA,EAAAA,KAAA,OAAKD,UAAWic,IAAW,WAAYN,EAAWG,WAC7Epc,EAAAA,aAAmByc,EAAkE,CACpFnH,SAA8B,QAAtBoH,EAAED,EAAMI,MAAMvH,gBAAQ,IAAAoH,EAAAA,EAAI,OAClCpa,MAAwB,QAAnBqa,EAAEF,EAAMI,MAAMva,aAAK,IAAAqa,EAAAA,EAAKjB,EAAWpZ,KAAWoZ,EAAWQ,KAAO,eAAiB,eAJrEnC,GAJd0C,CAUU,KAK3B,C,qGCpGO,IAAKK,EAAY,SAAZA,GAAY,OAAZA,EAAY,gBAAZA,EAAY,kBAAZA,EAAY,gBAAZA,EAAY,YAAZA,EAAY,YAAZA,EAAY,YAAZA,EAAY,gBAAZA,EAAY,cAAZA,EAAY,gBAAZA,EAAY,YAAZA,EAAY,UAAZA,EAAY,YAAZA,EAAY,kBAAZA,CAAY,MAgBZC,EAAY,SAAZA,GAAY,OAAZA,EAAY,QAAZA,EAAY,yBAAZA,EAAY,0BAAZA,CAAY,MA8BxB,SAASC,EAAiBrd,EASxBsd,GACA,IAAAC,EAAA,IATA,UACE5c,EAAS,MACTc,EAAK,KACLiU,EAAO,UAAS,MAChB8H,EAAQL,EAAaM,QAAO,SAC5Bhd,KACGyc,GAC8Bld,EAGnC,MAAM8B,EAAuB,QAAhByb,EAAGL,EAAMpb,eAAO,IAAAyb,EAAAA,EAAIL,EAAMQ,eAEvC,OACEnd,EAAAA,EAAAA,MAAA,SACEI,UAAWic,IAAWjc,EAAWyc,EAAa1H,GAAO,0BAA2B,CAC9E,mCAAoCwH,EAAMS,WACzCld,SAAA,EAEHF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,qBAAoBF,SAAA,EACjCG,EAAAA,EAAAA,KAAA,YACMsc,EACJI,IAAKA,EACL7a,KAAK,WACL9B,UAAWic,IACT,iHACA,iEACA,8BACA,0PAEA,CACE,sQACEY,IAAUL,EAAaS,OACzB,8QACEJ,IAAUL,EAAaU,QACzB,sQACEL,IAAUL,EAAaW,OACzB,sPACEN,IAAUL,EAAaY,KACzB,sPACEP,IAAUL,EAAaa,KACzB,sPACER,IAAUL,EAAac,KACzB,sQACET,IAAUL,EAAae,OACzB,8PACEV,IAAUL,EAAagB,MACzB,sQACEX,IAAUL,EAAaiB,OACzB,sPACEZ,IAAUL,EAAakB,KACzB,8OACEb,IAAUL,EAAamB,IACzB,sPACEd,IAAUL,EAAaoB,KACzB,iNACEf,IAAUL,EAAaM,YAI9B3b,IACClB,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CACH/B,KAAK,OACLlB,UAAWic,IAAW,4BAA6B,CACjD,eAAgBY,IAAUL,EAAaM,QACvC,gCAAiCD,IAAUL,EAAaM,UAE1D5Z,MAAO,QAIZpC,QAAAA,EAAShB,IAGhB,CAEO,MAAMmB,GAAW4c,EAAAA,EAAAA,YAAWnB,E,sJCpHnC,SAASoB,EAAMC,GAA+B,IAAlBzY,EAAGgT,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,EAAG0C,EAAG1C,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,EACzC,OAAOyF,EAAM/C,EAAMA,EAAM+C,EAAMzY,EAAMA,EAAMyY,CAC7C,CAKA,SAASC,EAAQC,GACf,MAAO,YAAaA,CACtB,CAKA,SAASC,EAAoBC,EAAsBF,GACjD,MAAMG,EAAOD,EAAKE,wBAGZC,EAAUN,EAAQC,GAASA,EAAMM,QAAQ,GAAMN,EAErD,MAAO,CACLO,KAAMV,GAAOQ,EAAQG,OAASL,EAAKI,KAAOxS,OAAO0S,cAAgBN,EAAKlb,OACtEyb,IAAKb,GAAOQ,EAAQM,OAASR,EAAKO,IAAM3S,OAAO6S,cAAgBT,EAAKU,QAExE,CAOA,SAASC,EAAmBd,IACzBD,EAAQC,IAAUA,EAAM3d,gBAC3B,CAOA,SAAS0e,EAAwB3f,GAKwB,IALvB,OAChC4f,EAAM,MACNC,EAAK,UACLlf,KACGuc,GACkDld,EACrD,MAAM8f,GAAYC,EAAAA,EAAAA,QAAuB,MACnCC,GAAaD,EAAAA,EAAAA,SAAO,IACnBE,EAAYC,IAAeC,EAAAA,EAAAA,WAAS,GAMrCC,GAAUL,EAAAA,EAAAA,SAAQnB,KAClBoB,EAAW9N,UAAYyM,EAAQC,MAC9BoB,EAAW9N,UAAS8N,EAAW9N,QAAUyM,EAAQC,KAC/C,KAGHyB,GAAaC,EAAAA,EAAAA,cAChB1B,IACCc,EAAmBd,IAOJD,EAAQC,GAASA,EAAMM,QAAQna,OAAS,EAAI6Z,EAAM2B,QAAU,IAE7DT,EAAU5N,QACtB0N,EAAOf,EAAoBiB,EAAU5N,QAAS0M,IAE9CsB,GAAY,EACd,GAEF,CAACN,IAGGY,GAAkBF,EAAAA,EAAAA,cACtBje,IAA0D,IAAzD,YAAEoe,GAAkDpe,EACnDqd,EAAmBe,GAEdL,EAAQlO,QAAQuO,KAIrBb,EAAOf,EAAoBiB,EAAU5N,QAAUuO,IAC/CP,GAAY,GAAK,GAEnB,CAACN,IAGGc,GAAgBJ,EAAAA,EAAAA,cACnB1B,IACC,MAAM+B,EAAU/B,EAAMgC,OAAShC,EAAM+B,QAGjCA,EAAU,IAAMA,EAAU,KAE9B/B,EAAM3d,iBAIN4e,EAAM,CACJV,KAAkB,KAAZwB,EAAiB,IAAmB,KAAZA,GAAkB,IAAO,EACvDrB,IAAiB,KAAZqB,EAAiB,IAAmB,KAAZA,GAAkB,IAAO,IACtD,GAEJ,CAACd,IAGGgB,GAAgBP,EAAAA,EAAAA,cAAY,IAAMJ,GAAY,IAAQ,IAEtDY,GAAuBR,EAAAA,EAAAA,cAC1BngB,IAEC,MAAM4gB,EAAc5gB,EAAQwM,OAAO6K,iBAAmB7K,OAAO8K,oBAC7DsJ,EAAYf,EAAW9N,QAAU,YAAc,YAAamO,GAC5DU,EAAYf,EAAW9N,QAAU,WAAa,UAAW2O,EAAc,GAEzE,CAACR,EAAYQ,IAUf,OAPAG,EAAAA,EAAAA,kBAAgB,KACdF,EAAqBb,GACd,KACLA,GAAca,GAAqB,EAAM,IAE1C,CAACb,EAAYa,KAGdlgB,EAAAA,EAAAA,KAAA,UACMsc,EACJI,IAAKwC,EACLnf,UAAWic,IAAWjc,EAAW,yBACjCsgB,aAAcT,EACdU,YAAaV,EACbW,UAAWT,EACXU,SAAU,GAGhB,CAEO,MAAMC,GAAkBC,EAAAA,EAAAA,MAAK3B,GCrJ7B,SAAS4B,EAAOvhB,GAA2C,IAA1C,MAAEwd,EAAK,KAAE2B,EAAI,IAAEG,EAAM,IAAmBtf,EAC9D,OACEY,EAAAA,EAAAA,KAAA,OACED,UAAU,oGACV6O,MAAO,CACL8P,IAAK,GAAF3X,OAAW,IAAN2X,EAAS,KACjBH,KAAM,GAAFxX,OAAY,IAAPwX,EAAU,MACnB1e,UAEFG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,mDAAmD6O,MAAO,CAAEgS,gBAAiBhE,MAGlG,C,yBCcO,SAASiE,EAAgBC,GAC9B,MAAMC,EAAWC,EAAiBF,GAClC,IAAIG,EAAqB,EACrBC,EAAqB,EACrBC,EAAqB,EACrBC,EAAqB,IAmBzB,OAhBwB,IAApBL,EAAS5c,QAAoC,IAApB4c,EAAS5c,QACpC8c,EAAI,KAAOF,EAAS,GAAKA,EAAS,GAClCG,EAAI,KAAOH,EAAS,GAAKA,EAAS,GAClCI,EAAI,KAAOJ,EAAS,GAAKA,EAAS,GAElCK,EAAwB,IAApBL,EAAS5c,OAAe,KAAO4c,EAAS,GAAKA,EAAS,GAAKK,GAGlC,IAApBL,EAAS5c,QAAoC,IAApB4c,EAAS5c,SAC3C8c,EAAI,KAAOF,EAAS,GAAKA,EAAS,GAClCG,EAAI,KAAOH,EAAS,GAAKA,EAAS,GAClCI,EAAI,KAAOJ,EAAS,GAAKA,EAAS,GAElCK,EAAwB,IAApBL,EAAS5c,OAAe,KAAO4c,EAAS,GAAKA,EAAS,GAAKK,GAG1D,CAAEH,EAAGhT,OAAOgT,GAAIC,EAAGjT,OAAOiT,GAAIC,EAAGlT,OAAOkT,GAAIC,EAAGrT,KAAK1I,IAAI0I,KAAKsT,MAAOpT,OAAOmT,GAAK,IAAO,KAAO,IAAK,GAC5G,CASO,SAASE,EAAgBR,GAC9B,OAAOS,EAAWV,EAAgBC,GACpC,CAoBO,SAASU,EAAWC,GACzB,OAAO1T,KAAKgN,IAAIhN,KAAK1I,IAAI0I,KAAKsT,MAAc,IAARI,GAAc,KAAM,GACrD7M,SAAS,IACT8M,SAAS,EAAG,IACjB,CASO,SAASC,EAAgB/E,GAA4B,IAAf6E,EAAKpJ,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,IAAAA,UAAA,GAChD,MAAM4I,EAAIrE,EAAMqE,EAAErM,SAAS,IACrBsM,EAAItE,EAAMsE,EAAEtM,SAAS,IACrBuM,EAAIvE,EAAMuE,EAAEvM,SAAS,IACrBkM,EAAY,IAAMG,EAAES,SAAS,EAAG,KAAOR,EAAEQ,SAAS,EAAG,KAAOP,EAAEO,SAAS,EAAG,KAEhF,OAAKD,GAAqB,IAAZ7E,EAAMwE,EAIb,GAAPra,OAAU+Z,GAAS/Z,OAAGya,EAAW5E,EAAMwE,IAH9BN,CAIX,CAWO,SAASc,EAAgBhF,GAA4B,IAAf6E,EAAKpJ,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,IAAAA,UAAA,GAGhD,OAAOsJ,EAFWE,EAAWjF,GAEK6E,EACpC,CAyBO,SAASF,EAAW3E,GACzB,MAAMqE,EAAIrE,EAAMqE,EAAI,IACdC,EAAItE,EAAMsE,EAAI,IACdC,EAAIvE,EAAMuE,EAAI,IAEdW,EAAI/T,KAAKgN,IAAIkG,EAAGC,EAAGC,GACnBY,EAAID,EAAI/T,KAAK1I,IAAI4b,EAAGC,EAAGC,GACvBa,EAAID,IAAMD,IAAMb,GAAKC,EAAIC,GAAKY,EAAID,IAAMZ,EAAI,GAAKC,EAAIF,GAAKc,EAAI,GAAKd,EAAIC,GAAKa,GAElF,MAAO,CACLC,EAAG,IAAMA,EAAI,EAAIA,EAAI,EAAIA,GACzBC,EAAGH,EAAIC,EAAID,EAAI,EACfA,EAAGA,EACHV,EAAGxE,EAAMwE,EAEb,CAoCO,SAASS,EAAWjF,GACzB,MAAMzQ,EAAI,SAAC+V,GAAS,IAAEC,EAAC9J,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,IAAI6J,EAAItF,EAAMoF,EAAI,IAAM,EAAC,OAAKpF,EAAMkF,EAAIlF,EAAMkF,EAAIlF,EAAMqF,EAAIlU,KAAKgN,IAAIhN,KAAK1I,IAAI8c,EAAG,EAAIA,EAAG,GAAI,EAAE,EAErH,MAAO,CACLlB,EAAGlT,KAAKsT,MAAa,IAAPlV,EAAE,IAChB+U,EAAGnT,KAAKsT,MAAa,IAAPlV,EAAE,IAChBgV,EAAGpT,KAAKsT,MAAa,IAAPlV,EAAE,IAChBiV,EAAGrT,KAAKsT,MAAgB,IAAVzE,EAAMwE,GAAW,IAEnC,CA6BO,SAASgB,EAAiBxF,GAC/B,MAAO,QAAP7V,OAAe6V,EAAMqE,EAAC,MAAAla,OAAK6V,EAAMsE,EAAC,MAAAna,OAAK6V,EAAMuE,EAAC,MAAApa,OAAK6V,EAAMwE,EAAC,IAC5D,CASO,SAASiB,EAAmBzF,GACjC,MAAM0F,EAAa,gFAAgFC,KAAK3F,IACjGc,EAAKH,EAAOE,EAAMgE,EAAQ,MAAOa,aAAU,EAAVA,EAAY7V,MAAM,KAAM,CAAC,EAAG,EAAG,EAAG,GAAG9L,IAAIwY,QACjF,MAAO,CACL8H,EAAGhT,OAAOuU,SAAS9E,GACnBwD,EAAGjT,OAAOuU,SAASjF,GACnB4D,EAAGlT,OAAOuU,SAAS/E,GACnB2D,EAAGnT,OAAOwU,WAAWhB,GAEzB,CAeO,SAAST,EAAiB0B,GAC/B,OAAOA,EAASpU,QAAQ,KAAM,GAChC,CAKO,SAASqU,EAAaD,GAC3B,MAAME,EAAQF,EAASG,WAAW,QAC5BZ,GAAI,IAAIa,QAASlU,MAIvB,OAFAqT,EAAErF,MAAQgG,EAAQF,EAAW,IAAH3b,OAAOia,EAAiB0B,IAE/B,KAAZT,EAAErF,KACX,CAKO,SAASmG,EAAkBL,GAGhC,OAFcM,EAASN,GAGdf,EAAgBU,EAAmBK,IAAW,GAGhDA,CACT,CAKO,SAASM,EAASN,GACvB,MAAMO,EAAU,CAAC,OAIjB,SALuD5K,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,KAAAA,UAAA,KAGrD4K,EAAQtT,KAAK,QAERsT,EAAQpd,MAAMgd,GAAeH,EAASG,WAAWA,IAC1D,CAKO,SAASK,EAAiBR,GAC/B,OAAIM,EAASN,GACJnB,EAAWc,EAAmBK,IAGhCpB,EAAgBoB,EACzB,CC3TO,SAASS,EAAK/jB,GAAsC,IAArC,MAAEwd,EAAK,SAAEzb,GAA0B/B,EACvD,MAAMgkB,GAAkB1D,EAAAA,EAAAA,cAAa2D,GAAqBliB,EAAS,IAAKyb,EAAOwE,EAAG,EAAIiC,EAAI9E,QAAS,CAACpd,EAAUyb,IAExG0G,GAAkBC,EAAAA,EAAAA,UAAQ,KAC9B,MAAMC,EAAe5B,EAAgB,IAAKhF,EAAOwE,EAAG,IAC9CqC,EAAa7B,EAAgB,IAAKhF,EAAOwE,EAAG,IAAK,GAEvD,MAAO,0BAAPra,OAAiCyc,EAAY,MAAAzc,OAAK0c,EAAU,OAG3D,CAAC7G,EAAMoF,EAAGpF,EAAMqF,EAAGrF,EAAMkF,IAE5B,OACEniB,EAAAA,EAAAA,MAAC8gB,EAAe,CAACzB,OAAQoE,EAAiBnE,MAAOmE,EAAiB,aAAW,QAAOvjB,SAAA,EAClFG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,wEAAuEF,UACpFG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,OAAO6O,MAAO,CAAE8U,gBAAiBJ,QAElDtjB,EAAAA,EAAAA,KAAC2gB,EAAO,CAACjC,IAAK,GAAKH,KAAM,EAAI3B,EAAMwE,EAAGxE,MAAOgF,EAAgBhF,GAAO,OAG1E,C,eC5BA,MAAM+G,EAAiB,CACrB,CAAE9a,MAAO,OAAQrI,MAAO,WACxB,CAAEqI,MAAO,OAAQrI,MAAO,WACxB,CAAEqI,MAAO,UAAWrI,MAAO,WAC3B,CAAEqI,MAAO,SAAUrI,MAAO,WAC1B,CAAEqI,MAAO,SAAUrI,MAAO,WAC1B,CAAEqI,MAAO,SAAUrI,MAAO,WAC1B,CAAEqI,MAAO,OAAQrI,MAAO,WACxB,CAAEqI,MAAO,aAAcrI,MAAO,WAC9B,CAAEqI,MAAO,OAAQrI,MAAO,WACxB,CAAEqI,MAAO,OAAQrI,MAAO,WACxB,CAAEqI,MAAO,UAAWrI,MAAO,WAC3B,CAAEqI,MAAO,QAASrI,MAAO,WACzB,CAAEqI,MAAO,OAAQrI,MAAO,WACxB,CAAEqI,MAAO,SAAUrI,MAAO,WAC1B,CAAEqI,MAAO,QAASrI,MAAO,WACzB,CAAEqI,MAAO,MAAOrI,MAAO,YAkClB,SAASojB,EAAYxkB,GAAkE,IAAjE,MAAEwd,EAAK,OAAEiH,EAASF,EAAc,SAAExiB,GAA6B/B,EAC1F,MAAM0kB,EAAiBlH,EAAMmH,cAE7B,OACE/jB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yBAAyB,cAAY,gBAAeF,SAChEgkB,EAAOljB,KAAKqjB,IACX,MAAMC,EAAaH,EAAejB,WAAWmB,EAASxjB,OACtD,OACER,EAAAA,EAAAA,KAAA,OAEED,UAAU,sDACV8I,MAAOmb,EAASnb,MAChB+F,MAAO,CAAEgS,gBAAiBoD,EAASxjB,OACnCe,QAASA,IAAMJ,EAAS6iB,EAASxjB,MAAO8gB,EAAgB0C,EAASxjB,QAAQX,SAExEokB,IAAcjkB,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAK,OAAOlB,UAAU,kBANtCikB,EAASxjB,MAOV,KAKhB,CCxDO,SAAS0jB,EAAa9kB,GAA0C,IAAzC,MAAEwd,EAAK,SAAEzb,GAA8B/B,EACnE,MAAM+kB,GAAWZ,EAAAA,EAAAA,UAAQ,IAR3B,SAA6B3G,GAC3B,MAAO,CACL2B,KAAM3B,EAAMoF,EAAI,IAChBtD,IAAK,EAAI9B,EAAMqF,EAEnB,CAGiCmC,CAAoBxH,IAAQ,CAACA,IAEtDyH,GAAed,EAAAA,EAAAA,UAAQ,IAAM3B,EAAgB,CAAEI,EAAGpF,EAAMoF,EAAGC,EAAGrF,EAAMqF,EAAGH,EAAG,EAAGV,EAAG,KAAM,CAACxE,EAAMoF,EAAGpF,EAAMqF,IAEtGqC,GAAmB5E,EAAAA,EAAAA,cACtB2D,GACCliB,EAAS,CACP6gB,EAAGjU,KAAKsT,MAAiB,IAAXgC,EAAI9E,MAClB0D,EAAG,EAAIoB,EAAI3E,IACXoD,EAAG,EACHV,EAAGxE,EAAMwE,KAEb,CAACxE,EAAMwE,EAAGjgB,IAGZ,OACExB,EAAAA,EAAAA,MAAC8gB,EAAe,CACdzB,OAAQsF,EACRrF,MAAOqF,EACP,aAAW,QACXvkB,UAAU,qBAAoBF,SAAA,EAE9BG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yEAAwEF,UACrFG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,sCAEjBC,EAAAA,EAAAA,KAAC2gB,EAAO,CAACjC,IAAKyF,EAASzF,IAAKH,KAAM4F,EAAS5F,KAAM3B,MAAOyH,MAG9D,CCpCO,SAASE,EAASnlB,GAAsC,IAArC,MAAEwd,EAAK,SAAEzb,GAA0B/B,EAC3D,MAAMgkB,GAAkB1D,EAAAA,EAAAA,cAAa2D,GAAqBliB,EAAS,IAAKyb,EAAOkF,EAAG,EAAIuB,EAAI9E,QAAS,CAACpd,EAAUyb,IAExGyH,GAAed,EAAAA,EAAAA,UACnB,IAAM3B,EAAgB,CAAEI,EAAGpF,EAAMoF,EAAGC,EAAGrF,EAAMqF,EAAGH,EAAGlF,EAAMkF,EAAGV,EAAG,KAC/D,CAACxE,EAAMoF,EAAGpF,EAAMqF,EAAGrF,EAAMkF,IAGrBwB,GAAkBC,EAAAA,EAAAA,UAAQ,KAC9B,MAAMC,EAAe5B,EAAgB,CAAEI,EAAGpF,EAAMoF,EAAGC,EAAGrF,EAAMqF,EAAGH,EAAG,EAAGV,EAAG,IAClEqC,EAAa7B,EAAgB,CAAEI,EAAGpF,EAAMoF,EAAGC,EAAGrF,EAAMqF,EAAGH,EAAG,EAAGV,EAAG,IAEtE,MAAO,0BAAPra,OAAiCyc,EAAY,MAAAzc,OAAK0c,EAAU,OAC3D,CAAC7G,EAAMoF,EAAGpF,EAAMqF,IAEnB,OACEtiB,EAAAA,EAAAA,MAAC8gB,EAAe,CAACzB,OAAQoE,EAAiBnE,MAAOmE,EAAiB,aAAW,YAAWvjB,SAAA,EACtFG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,sBAAsB6O,MAAO,CAAE8U,gBAAiBJ,MAC/DtjB,EAAAA,EAAAA,KAAC2gB,EAAO,CAACjC,IAAK,GAAKH,KAAM,EAAI3B,EAAMkF,EAAGlF,MAAOyH,MAGnD,C,eCTO,SAASG,EAAYplB,GAAgD,IAA/C,KAAEqlB,EAAI,MAAE7H,EAAK,UAAE7c,GAA8BX,EACxE,MAAMykB,EAAS5W,MAAMyX,QAAQ9H,GAASA,EAAQ,CAACA,GACzC+H,ELwUD,SAAyC/H,GAC9C,OARK,SAAyBA,GAC9B,MAAO,MAASA,EAAMqE,EAAI,MAASrE,EAAMsE,EAAI,MAAStE,EAAMuE,CAC9D,CAMSyD,CAAgBhI,IAAU,KAAOA,EAAMwE,EAAI,EACpD,CK1UqByD,CAAgChE,EAAgBgD,EAAO,KAC1E,OACElkB,EAAAA,EAAAA,MAAA,OACEI,UAAWic,IACT,mHACAjc,GACAF,SAAA,CAED4kB,IACCzkB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,gFAA+EF,UAC3FilB,EAAAA,EAAAA,IAAgBL,IACfzkB,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAMwjB,EAAM1kB,UAAU,WAAW6c,MAAO+H,EAAa,QAAU,QAAS1hB,MAAM,OAAO4b,OAAO,SAElG4F,IAILZ,EAAOljB,KAAI,CAACic,EAAOpD,KAElBxZ,EAAAA,EAAAA,KAAA,OAAiBD,UAAU,gBAAgB6O,MAAO,CAAEgS,gBAAiBhE,GAAQ/c,SAAC,KAApE2Z,OAMlB,CC/BO,MAAMuL,EAActlB,EAAAA,YACzB,CAAAL,EAEEsd,KACG,IAFH,MAAEE,EAAK,WAAEoI,EAAU,gBAAEC,GAAkB,EAAI,SAAE9jB,KAAamb,GAAyBld,EAGnF,MAAO8lB,EAAYC,IAAiB5F,EAAAA,EAAAA,UAAS6F,EAA2BxI,IAClEyI,EAASD,EAAmBF,IAElCI,EAAAA,EAAAA,YAAU,KACRH,EAAcC,EAA2BxI,GAAO,GAC/C,CAACA,IAEJ,MAAM2I,GAAyB7F,EAAAA,EAAAA,cAC5B1B,IACC,MAAMxd,EAAQ4kB,EAA2BpH,EAAMtZ,cAAclE,OACvD6kB,EAAS7kB,EAAMqiB,WAAW,QAC1B2C,EAAaH,EAAS7kB,EAAQ,IAAHuG,OAAOvG,GAExC2kB,EAAc3kB,IACTA,EAAM2D,QAAU,GAAMkhB,GAAU7kB,EAAM2D,QAAU,KAAQihB,EAAuBI,IAClFrkB,EAASqkB,EAAYJ,EAA0BI,GACjD,GAEF,CAACrkB,IAEH,OACEnB,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,IACA0Z,EACJI,IAAKA,EACLlc,MAAO0kB,EACPF,WAAYhJ,IACV,YACA,CACE,UAAWiJ,IAAoBI,EAC/B,QAASJ,GAAmBI,EAC5B,QAASJ,IAAoBI,EAC7B,OAAQJ,GAAmBI,GAE7BL,GAEFS,aACE9lB,EAAAA,EAAAA,MAAA,OAAKI,UAAWic,IAAW,oBAAqB,CAAE,YAAaiJ,IAAmBplB,SAAA,CAC/EolB,IACCjlB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,UAASF,UACtBG,EAAAA,EAAAA,KAACwkB,EAAY,CAAC5H,MAAOA,EAAO7c,UAAU,eAGxCslB,IAAUrlB,EAAAA,EAAAA,KAAA,QAAMD,UAAWic,IAAW,CAAE,OAAQiJ,IAAmBplB,SAAC,SAG1EsB,SAAUokB,GACV,ICjBD,SAASG,EAAWtmB,GAON,IAPO,MAC1Bwd,EAAK,gBACL+I,GAAkB,EAAI,eACtBC,GAAiB,EAAI,aACrBC,EAAe,MAAK,SACpB1kB,EAAQ,mBACR2kB,GACiB1mB,EACjB,MAAM2mB,GAAc5G,EAAAA,EAAAA,QAAOvC,IACpBoJ,EAAWC,IAAY1G,EAAAA,EAAAA,UAAS6F,EAA2BxI,KAKlE0I,EAAAA,EAAAA,YAAU,KACR,MAAMY,EAAed,EAA2BW,EAAYzU,SACtD6U,EAAWf,EAA2BxI,GAExCsJ,IAAiBC,GAAaf,EAAuBe,KAEzDJ,EAAYzU,QAAUsL,EACtBqJ,EAASb,EAA2BxI,IAAO,GAC1C,CAACA,IAQJ,MAAMwJ,GAAmB1G,EAAAA,EAAAA,cACtB9C,IACC,MAAMyJ,EPsPL,SAA4BzJ,EAAa0J,EAAwBV,GACtE,MACO,SADCU,EAEGlE,EAAiBP,EAAWjF,IAE5BgF,EAAgBhF,EAAOgJ,EAEpC,CO7P0BR,CAA6BxI,EAAOiJ,EAAcD,GACtEG,EAAYzU,QAAU+U,EACtBllB,EAASklB,EAAazJ,GACtBqJ,EAASrJ,EAAM,GAEjB,CAACzb,EAAUykB,EAAgBC,IAGvBU,GAAuB7G,EAAAA,EAAAA,cAAY,KAAM,IAAA8G,EAC7C,MAAMhmB,EAAoC,QAA/BgmB,EAAGC,OAAO,6BAAqB,IAAAD,OAAA,EAA5BA,EAA8BE,OAE5C,IAAKlmB,EAAO,OAIZ,IAFgB4kB,EAAuB5kB,GAGrC,OAAO2N,MAAM,iCAGfiY,EAAiBhB,EAA2B5kB,GAAO,GAClD,CAAC4lB,IAEJ,OACEzmB,EAAAA,EAAAA,MAAA,OAAKI,UAAU,qDAAoDF,SAAA,CAChE8lB,IACChmB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACG8mB,EAAAA,EAAAA,QACC3mB,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACC,QAASglB,EAAsBxmB,UAAU,gBAAgB6mB,aAAa,cAAa/mB,SAAC,sBAI9FG,EAAAA,EAAAA,KAACkkB,EAAa,CAACtH,MAAOoJ,EAAW7kB,SAAUilB,KAC3CpmB,EAAAA,EAAAA,KAACukB,EAAS,CAAC3H,MAAOoJ,EAAW7kB,SAAUilB,IAEtCR,IAAkB5lB,EAAAA,EAAAA,KAACmjB,EAAK,CAACvG,MAAOoJ,EAAW7kB,SAAUilB,QAI1DpmB,EAAAA,EAAAA,KAAA,OACED,UAAWic,IAAW,CACpB,wEAAyE2J,IACxE9lB,UAEHG,EAAAA,EAAAA,KAAC4jB,EAAY,CACXhH,MAAOA,EACPzb,SAAUA,CAAC0lB,EAAMC,KACfhB,SAAAA,IACAM,EAAiB,IAAKU,EAAc1F,EAAG4E,EAAU5E,GAAI,QAMjE,CAUO,SAAS2F,EAAgBtlB,GAAwE,IAAvE,MAAEZ,EAAK,gBAAEmmB,EAAe,SAAE7lB,KAAamb,GAA8B7a,EACpG,MAAMwlB,GAAeC,EAAAA,EAAAA,MACfvB,GAA4C,IAA1BrJ,EAAMqJ,gBACxBwB,GAAiBR,EAAAA,EAAAA,MAEvB,OACEhnB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAAConB,EAAAA,GAAc,CACb7nB,MAAO0nB,EACPtlB,GAAIojB,EACJlkB,MAAOA,EAEPgB,KAAMslB,IAAmBxB,EAAkB,SAAW,OACtD/I,MAAON,EAAMM,MACb,cAAaoK,EAEb7lB,SAAUA,EACVkmB,OAAQA,IAAMJ,EAAaK,UAE7BtnB,EAAAA,EAAAA,KAACunB,EAAAA,GAAO,CAAChoB,MAAO0nB,EAAc,aAAW,eAAeO,aAAa,EAAM3nB,UACzEG,EAAAA,EAAAA,KAAA,OACED,UAAWic,IACT,WACA2J,GAAmB,CACjB,OAAQwB,EACR,QAASA,IAEXtnB,UAEFG,EAAAA,EAAAA,KAAC0lB,EAAW,IACNpJ,EACJnb,SAAUA,EACV2kB,mBAAoBA,KACdH,GACJsB,EAAaK,MAAM,UAOjC,C,eCvKO,SAASG,EAAgBroB,GAKN,IALO,gBAC/BsoB,EAAe,SACfvmB,EAAQ,gBACRwkB,GAAkB,KACfrJ,GACmBld,EACtB,MAAM+nB,GAAiBR,EAAAA,EAAAA,MAEvB,OACEhnB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,CACG8lB,IAAoBwB,IACnBnnB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,WAAUF,UACvBG,EAAAA,EAAAA,KAAC+kB,EAAW,CACV,cAAY,qBACZlkB,MAAO6mB,EACP9K,MAAON,EAAMM,MACbqI,iBAAiB,EACjB9jB,SAAUA,OAIhBnB,EAAAA,EAAAA,KAAA,OACED,UAAWic,IACT,sBACA2J,GAAmB,CACjB,OAAQwB,EACR,QAASA,IAEXtnB,UAEFG,EAAAA,EAAAA,KAAC0lB,EAAW,IAAKpJ,EAAOqJ,gBAAiBA,EAAiBxkB,SAAUA,EAAU2kB,mBAAoBA,aAI1G,CASO,SAAS6B,EAAclmB,GAAqD,IAApD,MAAEmb,EAAK,SAAE/c,KAAayc,GAA4B7a,EAC/E,OACEzB,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CACLmkB,aAAazlB,EAAAA,EAAAA,KAACwkB,EAAY,CAAC5H,MAAOA,EAAO7c,UAAWic,IAAW,UAAWP,EAAAA,GAAemM,YACrFtL,EAAKzc,SAERA,GAGP,CAuEO,SAASgoB,EAAiBjnB,GAUK,IAVqC,KACzEkU,EAAI,KACJ2P,EAAI,OACJZ,EAAM,UACN9jB,EAAS,SACToB,EAAQ,uBACR2mB,EAAsB,mBACtBC,GAAqB,EAAI,eACzBC,KACG1L,GAC+B1b,EAClC,MAAMqmB,GAAeC,EAAAA,EAAAA,MACfe,IAAkB3L,EAAM2L,eAAiBpE,EAAO1f,OAAS,GACxD+jB,EAAkBC,GAAuB1oB,EAAAA,SAAe,GACzD2oB,EAAoB3oB,EAAAA,aACxB,CAACmd,EAAeyL,KACdlnB,EACE0iB,EAAOljB,KAAI,CAAC2nB,EAAa9O,IAAWA,IAAU0O,EAAmB,IAAKI,EAAa1L,SAAU0L,IAC7FD,EACD,GAEH,CAACH,EAAkBrE,EAAQ1iB,IAE7B,OACExB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CACL/B,MAAO0nB,EACPtlB,GAAIylB,EAAAA,GACJ,cAAaU,EACb/lB,MAAM,UACNhC,UAAWic,IAAW,QAASjc,GAC/BgV,SAAS,UACThS,WAAW,SACX+R,KAAMA,EACNyT,OAAQtB,EAAauB,QAAQ3oB,UAE7BG,EAAAA,EAAAA,KAACwkB,EAAY,CACXC,KAAMA,EACN7H,MAAOiH,EAAOljB,KAAI8nB,IAAA,IAAC,MAAE7L,GAAO6L,EAAA,OAAK7L,CAAK,IACtC7c,UAAWic,IAAW,gBAAiBP,EAAAA,GAAemM,YAG1DjoB,EAAAA,EAAAA,MAAC4nB,EAAAA,GAAO,CACNhoB,MAAO0nB,EACP,aAAW,eACXO,aAAa,EACbO,mBAAoBA,EACpBC,eAAgBA,EAAenoB,SAAA,CAE9BooB,IACCjoB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,+BAA8BF,UAC3CG,EAAAA,EAAAA,KAACob,EAAAA,EAAW,CAACG,eAAgBoM,EAAgBtM,YAAY,EAAMxb,SAC5DgkB,EAAOljB,KAAI,CAAA+nB,EAAmBlP,KAAK,IAAvB,MAAEoD,EAAK,MAAE/b,GAAO6nB,EAAA,OAC3B1oB,EAAAA,EAAAA,KAAC2nB,EAAc,CAEb/K,MAAOA,EACP2L,OAAQL,IAAqB1O,EAC7BjY,QAASA,IAAM4mB,EAAoB3O,GAAO3Z,SAEzCgB,GALI2Y,EAMU,SAKzBxZ,EAAAA,EAAAA,KAACynB,EAAgB,IAEXnL,EACJM,MAAOiH,EAAOqE,GAAkBtL,MAChCzb,SAAUinB,GAHLF,QAQf,C,gHC/MO,MAAMS,EAAmCvpB,IAAmD,IAAlD,UAAEW,EAAS,MAAEc,EAAK,KAAE6P,EAAI,kBAAEkY,GAAmBxpB,EAC5F,MAAOypB,EAAUC,GAAerpB,EAAAA,UAAe,GAEzCspB,EAAwBtpB,EAAAA,aAAkB,KAC9CqpB,GAAY,GACZE,IAAKtY,EAAK,GACT,CAACA,IAoBJ,OAlBAjR,EAAAA,WAAgB,KACd,IAAIwpB,EACJ,MAAMC,EAAaA,KACZD,GACLhO,aAAagO,EAAQ,EASvB,OAPIJ,IACFK,IACAD,EAAUld,OAAO+O,YAAW,KAC1BgO,GAAY,EAAM,GACjB,MAGE,KACLI,GAAY,CACb,GACA,CAACL,KAGFlpB,EAAAA,EAAAA,MAAA,OAAKI,UAAWA,EAAUF,SAAA,EACxBG,EAAAA,EAAAA,KAACmpB,EAAAA,GAAQ,CACPtoB,MAAOA,EACPgC,UAAQ,EACRtB,QAAUnB,GAAMA,EAAEsE,cAAciI,SAChCqY,WAAW,OACX,cAAY,6BACZxkB,MAAOkQ,KAET/Q,EAAAA,EAAAA,MAAA,OAAKI,UAAU,sBAAqBF,SAAA,CACjC+oB,IAAqB5oB,EAAAA,EAAAA,KAAA,OAAAH,SAAM+oB,KAC5B5oB,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CACLvB,UAAU,oBACVgC,MAAM,OACNR,QAASwnB,EACThM,SAAU8L,EACVpD,YAAaoD,EAAW,YAASpmB,EACjC,cAAY,gCAA+B5C,SAE1CgpB,EAAW,SAAW,cAGvB,C,0HCrDV,MAAMO,EAAsB3pB,EAAAA,MAAW,IAAM,kCAgBtC,SAAS4pB,EAAmBjqB,GAKkD,IALjD,MAClCG,EAAK,SACLM,EAAQ,OACRypB,KACGhN,GAC8Eld,EACjF,MAAM,cAAEmqB,IAAkBC,EAAAA,EAAAA,IAAuBjqB,GACjD,OACEI,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAAConB,EAAAA,GAAc,CAAC7nB,MAAOA,EAAMM,SACzB4pB,GACAhqB,EAAAA,SAAekB,IAAId,GAAWqc,IAC5B,GAAIzc,EAAAA,eAAqByc,GACvB,OAAOzc,EAAAA,aAAmByc,EAAO,IAAKuN,KAAkBvN,EAAMI,OAAgB,OAIpFiN,IACAvpB,EAAAA,EAAAA,KAAC0pB,EAAAA,GAAcC,SAAQ,CAACnpB,MAAO8oB,QAAAA,EAAU,WAAWzpB,UAClDG,EAAAA,EAAAA,KAACunB,EAAAA,GAAO,CAAChoB,MAAOA,EAAOioB,aAAa,EAAOzlB,MAAM,OAAO,aAAW,cAAalC,UAC9EG,EAAAA,EAAAA,KAACP,EAAAA,SAAc,CACbmqB,UACE5pB,EAAAA,EAAAA,KAAC6pB,EAAAA,GAAG,CAAC9U,SAAS,OAAOhV,UAAU,uDAAsDF,UACnFG,EAAAA,EAAAA,KAAC8pB,EAAAA,EAAO,CAAC7mB,MAAO,OAEnBpD,UAEDG,EAAAA,EAAAA,KAACopB,EAAmB,IACd9M,EACJyN,OAAO,QACPC,UAAU,OACV7oB,SAAUA,CAACX,EAAYypB,KAA4C,IAAAC,EACjE3qB,EAAM+nB,OACQ,QAAd4C,EAAA5N,EAAMnb,gBAAQ,IAAA+oB,GAAdA,EAAAnb,KAAAuN,EAAiB9b,EAAOypB,EAAG,YAS7C,CAEO,SAAS1nB,EAAW+Z,GACzB,MAAM6N,GAAUjD,EAAAA,EAAAA,MAEhB,OAAOlnB,EAAAA,EAAAA,KAACqpB,EAAmB,IAAK/M,EAAO/c,MAAO4qB,GAChD,C,+ECjCO,SAASC,EAAOhrB,GAON,IAPO,MACtBirB,EAAQ,IAAG,QACXpB,EAAU,EAAC,eACXqB,GAAiB,EAAK,eACtBC,EAAc,iBACdC,EAAgB,SAChB3qB,GACaT,EACb,MAAOopB,EAASiC,GAAchrB,EAAAA,UAAe,IACtCirB,EAAaC,GAAkBlrB,EAAAA,UAAe,GAmBrD,OAjBAA,EAAAA,WAAgB,KACd,MAAMmrB,EAAoB7e,OAAO+O,YAAW,IAAM2P,GAAW,IAAOJ,GAEpE,IAAIQ,EAQJ,OAPI5B,EAAU,IACZ4B,EAAgB9e,OAAO+O,YAAW,KAEhC,GADA6P,GAAe,GACXL,EAAgB,MAAM,IAAIQ,KAAO,GACpC7B,IAGE,KACLhO,aAAa2P,GACb3P,aAAa4P,EAAc,CAC5B,GACA,CAACR,EAAOpB,EAASqB,IAEf9B,EAEDkC,GACK1qB,EAAAA,EAAAA,KAAAJ,EAAAA,SAAA,CAAAC,SAAG2qB,KAGLxqB,EAAAA,EAAAA,KAAAJ,EAAAA,SAAA,CAAAC,SAAGA,KANWG,EAAAA,EAAAA,KAAAJ,EAAAA,SAAA,CAAAC,SAAG0qB,GAO1B,C,gMCnEO,MAAMQ,EAAkBtrB,EAAAA,cAGrB,MAEH,SAASurB,EAAiBrS,GAAoC,IAAAsS,EACnE,MAAMC,EAAUzrB,EAAAA,WAAiBsrB,GAEjC,OAAOI,EAAAA,EAAoB,IACtBxS,EACHyS,MAAM,EACNC,SAAUC,EAAAA,EACVC,kBAAkB,EAClBC,gBAA0C,QAA3BP,EAAEtS,aAAQ,EAARA,EAAU6S,uBAAe,IAAAP,EAAAA,EAAKC,SAAAA,EAASO,KAAO,EAAE,EAAG,GAAK,CAAC,EAAG,GAC7EC,OAAO,GAEX,C,eC6BA,SAASC,EAAiBvsB,EAYxBsd,GACA,IAZA,MACE7b,EAAK,aACL4oB,EAAY,MACZlqB,EACA,aAAcqsB,EAAS,SACvB/rB,EAAQ,SACRgsB,EAAQ,SACR9W,EAAQ,SACR+W,KACGxP,GACoCld,EAGzC,MAAMkqB,GAASyC,EAAAA,EAAAA,MACTb,EAAUzrB,EAAAA,WAAiBsrB,GAE3BiB,EAAgBzsB,GAChB,cAAEgqB,IAAkBC,EAAAA,EAAAA,IAAuBjqB,QAAAA,EAAS,CAAEipB,SAAS,EAAOyD,WAAW,IAEvF,IAAKJ,IAAaG,EAChB,MAAM,IAAIlB,MAAM,gEAGlB,MAAMoB,EAAmBzsB,EAAAA,OAAaosB,GAAYC,EAAWrsB,EAAAA,SAAiB0sB,EAAAA,GAAQ7a,QAEtF,OACE3R,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAACmrB,EAAAA,EAAiB,CAACzO,IAAKA,KAASsP,KAAmBvC,EAAY5pB,SAC5DusB,IAAW,IAAAC,EAAA,OACX5sB,EAAAA,aAAmBoB,EAAO,IACrBurB,KACAvrB,EAAMyb,MACTvH,WACAwT,OAA0B,QAApB8D,EAAExrB,EAAMyb,MAAMiM,cAAM,IAAA8D,EAAAA,EAAIL,EAAcxD,SAC5C,KAGJe,IACAvpB,EAAAA,EAAAA,KAACksB,EAAgB,CAAArsB,UACfG,EAAAA,EAAAA,KAACmrB,EAAAA,EAAW,IAAKa,EAAe,aAAYJ,EAAU/rB,SACnD4B,IAAA,IAAA6qB,EAAA,IAAC,gBAAEC,EAAe,eAAEC,KAAmBC,GAAYhrB,EAAA,OAClDzB,EAAAA,EAAAA,KAAA,UACMysB,EACJ1sB,UAAWic,IAAWsN,EAAQ,+BAC9B1a,MAAOkd,OAAWrpB,EAAYgqB,EAAW7d,MAAM/O,UAE/CG,EAAAA,EAAAA,KAAC+qB,EAAgBpB,SAAQ,CAACnpB,MAAO,CAAEksB,OAAQV,EAAeP,KAAmB,QAAfa,EAAEpB,aAAO,EAAPA,EAASO,YAAI,IAAAa,EAAAA,EAAIN,GAAgBnsB,UAC/FG,EAAAA,EAAAA,KAAC6pB,EAAAA,GAAG,IACEvN,EACJvH,SAAUA,EACVwX,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBR,EAAcW,UAC9B5sB,UAAWic,IAAWM,EAAMvc,UAAW,yBAA0B,CAC/D,uBAAsD,aAA9BisB,EAAcY,YACtC,aAA4C,eAA9BZ,EAAcY,cAC3B/sB,SAEFJ,EAAAA,SAAekB,IAAId,GAAWqc,GACxBzc,EAAAA,eAAqByc,GAEtBA,EAAMra,OAASgrB,GACV7sB,EAAAA,EAAAA,KAAC8sB,EAAqB,CAACC,YAAaf,EAAcnsB,SAAEqc,IAGtDzc,EAAAA,aAAmByc,EAAO,IAC5BA,EAAMI,MACTvH,aARuCmH,SAa3C,QAOpB,CAEO,MAAM2Q,EAAWptB,EAAAA,WAAiBksB,GAoBzC,SAASmB,EAAqBlsB,GAAwD,IAAvD,YAAEmsB,EAAW,SAAEltB,GAAsCe,EAClF,MAAMrB,EAAQyrB,IAEd,OACEhrB,EAAAA,EAAAA,KAACmrB,EAAAA,EAAe,IAAK4B,EAAWltB,SAC5BmtB,GAAcvtB,EAAAA,aAAmBI,EAAU,IAAKA,EAASyc,MAAOmN,aAAcuD,EAAWztB,WAGjG,C,0BC3IA,SAAS0tB,EAAqB7tB,EAW5Bsd,GACA,IAVE/a,GAAIurB,EAAW,MACf3tB,EAAK,SACL4tB,EAAQ,aACRC,GAAe,EAAI,SACnBvtB,EAAQ,SACRkV,EAAQ,KACRD,KACGwH,GACsCld,EAG3C,MAAM8rB,EAAUzrB,EAAAA,WAAiBsrB,GAEjC,OACE/qB,EAAAA,EAAAA,KAACmrB,EAAAA,EAAe,CAACzO,IAAKA,KAASwO,aAAO,EAAPA,EAASwB,UAAYpQ,EAAKzc,SACrDmtB,IACA,MAAMzE,EAASyE,EAAU,oBAAqB9B,SAAAA,EAASwB,OAAOT,WACxDoB,EAAahR,QAAQ2Q,EAAU,kBAE/BM,EAAY,CAChB,iBAAkB/E,EAClB,kCAAmCA,GAGrC,OACE5oB,EAAAA,EAAAA,MAAC2B,EAAAA,EAAM,IACA0rB,EACLrrB,GAAIurB,EACJ3tB,MAAOA,EACPwC,MAAOwmB,EAAS,WAAa,cAC7BA,OAAQA,EACRxT,SAAUA,QAAAA,EAAY,QACtBhV,UAAWic,IAAWM,EAAMvc,UAAW,CACrC,qBAAsBotB,EACtB,6BAA8B5E,IAEhC3B,aAAc5K,IAAWM,EAAMsK,aAAc,eAC7C9R,KAAMA,QAAAA,EAASqY,EAAW,OAAS,UACnCI,MAAM,OACN9H,aACEX,EAAAA,EAAAA,IAAgBxI,EAAMmJ,cACpBzlB,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CACH/B,KAAMqb,EAAMmJ,YACZ1lB,UAAWic,IAAWsR,EAAW,OAAQ,CAAE,mBAAoBH,MAGjE7Q,EAAMmJ,YAGV3iB,cACEgiB,EAAAA,EAAAA,IAAgBxI,EAAMxZ,eACpB9C,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAMqb,EAAMxZ,aAAc/C,UAAWic,IAAWsR,EAAW,UAEjEhR,EAAMxZ,aAGVvB,QAAU0oB,IAAyB,IAAAuD,EAE7BJ,IAAiBC,IACnBnC,SAAAA,EAASO,KAAKnE,QAGC,QAAjBkG,EAAAR,EAAUzrB,eAAO,IAAAisB,GAAjBA,EAAAze,KAAAie,EAAoB/C,EAAG,EACvBpqB,SAAA,CAEDA,EACAstB,IAAYntB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,kDAAiDF,SAAEstB,MACxE,GAKnB,CAMO,MAAMM,EAAehuB,EAAAA,WAAiBwtB,G,yBCnGtC,SAASS,EAAkBpR,GAChC,OACE3c,EAAAA,EAAAA,MAACwrB,EAAAA,EAAoB,IAAK7O,EAAO3a,GAAG,MAAM5B,UAAU,QAAOF,SAAA,EACzDG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,0EACduc,EAAMzc,WACLG,EAAAA,EAAAA,KAAC2tB,EAAAA,GAAS,CAAC7Y,KAAK,QAAQ/U,UAAU,qBAAoBF,SACnDyc,EAAMzc,aAKjB,C,66BCNA,MAAM+tB,EAAoC,CAAC,EAAG,GAqEvC,SAASC,EAAWzuB,GAA8D,IAA7D,IAAEsf,EAAG,KAAEH,EAAI,cAAEuP,EAAa,KAAExG,EAAI,MAAErgB,GAAyB7H,EACrF,MAAO2uB,EAAeC,GAAoBvuB,EAAAA,SAAe,MACnDwuB,EAAaxuB,EAAAA,SAAc,IArEnC,SAAuBif,EAAaH,GAClC,MAAO,CACLH,qBAAAA,GACE,MAAMD,EAAO,CACXO,IAAKA,EAAM3S,OAAOmiB,QAClBC,EAAGzP,EAAM3S,OAAOmiB,QAChB3P,KAAMA,EAAOxS,OAAOqiB,QACpBC,EAAG9P,EAAOxS,OAAOqiB,QACjBE,OAAQ5P,EACR6P,MAAOhQ,EACPtb,MAAO,EACP4b,OAAQ,GAGV,MAAO,IACFV,EACHqQ,OAAQA,IAAMrQ,EAElB,EAEJ,CAiDyCsQ,CAAc/P,EAAKH,IAAO,CAACA,EAAMG,IAClEsN,GAAgBhB,EAAAA,EAAAA,GAAiB,CAAE2B,UAAW,kBAC9C,cAAEpD,IAAkBC,EAAAA,EAAAA,IAAuBwC,GAC3C0C,EAAcjvB,EAAAA,QAAa,IAE3B,OAAEkvB,EAAM,WAAEC,IAAeC,EAAAA,EAAAA,GAAUZ,EAAYF,EAAe,CAClEpB,UAAW,WACXmC,UAAW,CACT,CACE7tB,KAAM,SACNP,QAAS,CACPquB,OAAQnB,OAyBhB,OAhBAnuB,EAAAA,WAAgB,KACV8pB,GAAiBmF,EAAYpd,SAASgW,GAAM,GAC/C,CAACiC,EAAejC,IAKnB7nB,EAAAA,WAAgB,KACdusB,EAAc5a,OACdsd,EAAYpd,SAAU,EAEf,IAAM0a,EAAc1E,SAG1B,KAGDtnB,EAAAA,EAAAA,KAAA,OAIE0c,IAAKsR,KACDY,EAAWI,OACfpgB,MAAO+f,EAAOK,OACdjvB,UAAU,+DACV,cAAY,2BAA0BF,UAEtCG,EAAAA,EAAAA,KAACivB,EAAmB,CAClBpuB,OAAOb,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACvB,UAAU,8BACzB+tB,cAAeA,EACfvuB,MAAOysB,EACP/kB,MAAOA,EACP6kB,UAAQ,KAIhB,CAUA,SAASoD,EAAgBztB,EAEvBib,GACA,IAFA,MAAE7b,EAAK,MAAEoG,EAAK,MAAE1H,EAAK,SAAEusB,EAAQ,cAAEgC,EAAgB7f,OAAOC,kBAAyCzM,EAGjG,MAAM0tB,GAAanE,EAAAA,EAAAA,GAAiB,CAAE2B,UAAW,gBAC3CyC,GAAiBC,EAAAA,EAAAA,GAAoB,CACzCC,eAAgBxB,EAChByB,wBAAwB,EACxBC,QAAS5B,EACTruB,UAGF,OACES,EAAAA,EAAAA,KAAC6sB,EAAAA,GAAQ,CACPnQ,IAAKA,EACL7b,MAAOA,EACPtB,MAAOA,EACP,aAAW,eACXusB,SAAUA,EACVld,MAAOwgB,EACPrvB,UAAU,kBAAiBF,SAE1BoH,EAAMtG,KAAI,CAACe,EAAM8X,IACE,YAAd9X,EAAKG,MACA7B,EAAAA,EAAAA,KAAC0tB,EAAAA,GAAiB,CAAA7tB,SAAc6B,EAAKb,OAAb2Y,QAGX/W,KAAlBf,aAAI,EAAJA,EAAMhB,UAENV,EAAAA,EAAAA,KAACivB,EAAmB,CAClB1vB,MAAO4vB,EACPtuB,OACEb,EAAAA,EAAAA,KAACytB,EAAAA,GAAY,CAAC3qB,aAAa,aAAa,+BAAAiE,OAA8BrF,EAAKvB,IAAKN,SAC7E6B,EAAKb,QAGVoG,MAAOvF,EAAKhB,WAMhBV,EAAAA,EAAAA,KAACytB,EAAAA,GAAY,CAEXlsB,QAASA,KAAM,IAAAkuB,EAAAC,EAAAC,EACD,QAAZF,EAAA/tB,EAAKH,eAAO,IAAAkuB,GAAZA,EAAA1gB,KAAArN,GACW,QAAXguB,GAAAC,EAAA5jB,QAAO6jB,YAAI,IAAAF,GAAXA,EAAA3gB,KAAA4gB,EAAc,QAAS,eAAgBrnB,OAAOunB,OAAO,CAAEC,YAAapuB,EAAKvB,IAAMuB,EAAKkuB,MAAM,EAE5F,+BAAA7oB,OAA8BrF,EAAKvB,IACnCJ,UAAU,WAAUF,SAEnB6B,EAAKb,OARD2Y,MAcjB,CAEA,MAAMyV,EAAsBxvB,EAAAA,WAAiByvB,G,mECtLtC,MAAMa,EAAgBtwB,EAAAA,YAC3B,CAAAL,EAA8Csd,KAAG,IAAhD,SAAE7c,EAAQ,SAAEmwB,EAAQ,UAAEjwB,KAAcuc,GAAOld,EAAA,OAC1CY,EAAAA,EAAAA,KAAA,UACMsc,EACJI,IAAKA,EACL3c,UAAWic,IAAWjc,EAAW,wCACjC6O,MAAO,CAAEohB,YAAWnwB,SAEnBA,GACG,IAWH,SAASowB,EAAUxuB,GAA4F,IAA3F,QAAEyuB,EAAU,EAAC,KAAEC,EAAO,EAAC,OAAElU,GAAS,EAAK,SAAEpc,EAAQ,UAAEE,KAAcuc,GAAwB7a,EAClH,OACEzB,EAAAA,EAAAA,KAAA,UACMsc,EACJvc,UAAWic,IAAWjc,EAAW,mBAAoB,CACnD,2EAA4Ekc,IAE9ErN,MAAO,CAAEwhB,oBAAqB,UAAFrpB,OAAYmpB,EAAO,UAAUG,iBAAkB,UAAFtpB,OAAYopB,EAAI,WAAWtwB,SAEnGA,GAGP,CAMO,MAAMywB,EAAuChU,IAAUtc,EAAAA,EAAAA,KAACiwB,EAAU,IAAK3T,I,eCzD9E,MAAMiU,EAAsDC,GAASA,EAqB9D,SAASC,EAAUrxB,GAUwB,IALhDuC,GAAIurB,EAAW,SACfwD,EAAW,QAAmB,UAC9BC,EAAY,WAAuB,cACnCC,EAAgBL,KACbjU,GAC2Cld,EAC9C,MAAQ,CAACsxB,GAAWlwB,EAAO,CAACmwB,GAAYxvB,GAAamb,GAC9C/c,EAAOC,GAAYC,EAAAA,SAAwDe,GAE5EqwB,EAAepxB,EAAAA,aACnB,WACED,EAASoxB,KAAcvY,YACvBlX,KAASkX,UACX,GACA,CAAClX,EAAUyvB,IAGb,OAAOnxB,EAAAA,cAAoBytB,EAAa,IACnC5Q,EACH,CAACoU,GAAWnxB,EACZ,CAACoxB,GAAYE,GAEjB,C,0DC/CO,IAAKC,EAAS,SAATA,GAAS,OAATA,EAAS,eAATA,EAAS,iBAATA,EAAS,gBAATA,EAAS,eAATA,CAAS,MA0Ed,SAASC,EAAW3xB,GAWN,IAXO,MAC1ByB,EAAK,KACLiU,EAAO,UAAS,YAChB2Q,EAAW,aACX3iB,EAAY,IACZuC,EAAM,EAAC,IACP0V,EAAM,IAAG,KACTtW,EAAO,EAAC,UACR1E,EAAS,eACTixB,KACG1U,GACcld,EACjB,MAAO6xB,EAAUC,IAAe3R,EAAAA,EAAAA,WAAS,GACnC4R,GAAWhS,EAAAA,EAAAA,QAAuB,MAClCiS,GAAWjS,EAAAA,EAAAA,QAAwB,OAEzCmG,EAAAA,EAAAA,YAAU,KACR4L,EAAY7U,QAAQ8U,EAAS7f,SAAW8f,EAAS9f,SAAS,GACzD,IAEH,MAAM+f,GAAY9N,EAAAA,EAAAA,UAAQ,KACxB,MAAM+N,EAAQH,EAAS7f,QACjBigB,EAAQH,EAAS9f,QACjBkgB,GAAgBlV,EAAM9b,MAAQ6E,IAAQ0V,EAAM1V,GAElD,IAAK4rB,IAAaK,IAAUC,EAAO,OAEnC,MAAME,EAAWH,EAAMlT,wBACjBsT,EAAWH,EAAMnT,wBAEvB,OAASoT,GAAgBC,EAASxuB,MAAQyuB,EAASzuB,OAAUwuB,EAASxuB,MAAS,GAAG,GACjF,CAACoC,EAAK0V,EAAKuB,EAAM9b,MAAOywB,IAE3B,OACEjxB,EAAAA,EAAAA,KAAC4I,EAAAA,GAAK,CAACC,MAAOhI,EAAOd,UAAWA,EAAUF,UACxCF,EAAAA,EAAAA,MAAA,OAAKI,UAAWic,IAAW8U,EAAUhc,GAAO,yCAAyCjV,SAAA,CAClF4lB,GAED9lB,EAAAA,EAAAA,MAAA,OAAK+c,IAAKyU,EAAUpxB,UAAU,gBAAeF,SAAA,EAC3CF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,eAAcF,SAAA,EAC3BG,EAAAA,EAAAA,KAAA,OACED,UAAWic,IAAW,6DAA8D,CAClF,aAAciV,IACbpxB,UAEHG,EAAAA,EAAAA,KAAA,OACED,UAAU,6DACV6O,MAAO,CAAE3L,MAAO,GAAF8D,OAAKsqB,EAAS,WAIhCrxB,EAAAA,EAAAA,KAAA,QACE0c,IAAK0U,EACLrxB,UAAWic,IACT,mNACA,CAAE,aAAciV,IAElBriB,MAAO,CAAE2P,KAAM,GAAFxX,OAAKsqB,EAAS,YAI/BrxB,EAAAA,EAAAA,KAAA,YACMsc,EACJza,KAAK,QACLwD,IAAKA,EACL0V,IAAKA,EACLtW,KAAMA,EACN1E,UAAWic,IAAWgV,EAAgB,8DAIzCluB,MAIT,C,gDCvJO,IAAK6uB,EAAY,SAAZA,GAAY,OAAZA,EAAAA,EAAY,qCAAZA,EAAAA,EAAY,6BAAZA,CAAY,MAKZC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAAA,EAAgB,uBAAhBA,EAAAA,EAAgB,2BAAhBA,CAAgB,M,kCCIrB,MAAMC,EAAiBpyB,EAAAA,cAAqC,CACjEqyB,UAAWF,EAAiBG,SAC5BhwB,MAAO4vB,EAAaK,gBACpBC,WAAW,EACXC,aAAa,EACbvL,UAAU,IAGL,SAASwL,IACd,OAAO1yB,EAAAA,WAAiBoyB,EAC1B,CCdA,MAAMO,EAAqBhzB,IAK6B,IAL5B,UAC1B0yB,EAAS,UACTG,EAAS,SACTtL,EAAQ,MACR5kB,GACgB3C,EAChB,OACO,IADC6yB,EAEG,CACLlyB,UAAWic,IAAW,kDAAmD,CACvE,iCAAkC8V,IAAcF,EAAiBG,SACjE,iGACEpgB,eAAeqD,sBAKd,CACLjV,UAAWic,IAAW,6DAA8D,CAClF,qBAAsB8V,IAAcF,EAAiBS,YAAc1gB,eAAeqD,mBAClF,8FACE8c,IAAcF,EAAiBG,SACjC,YAAaD,IAAcF,EAAiBG,WAAapL,EACzD,qCAAsC5kB,IAAU4vB,EAAaW,cAAgB3L,EAC7E,qDACEmL,IAAcF,EAAiBS,YAActwB,IAAU4vB,EAAaW,YACtE,oBAAqBvwB,IAAU4vB,EAAaW,YAC5C,uEAAwE3L,IAGhF,EA4BK,SAAS4L,EAAO9wB,GAMmB,IANlB,UACtBqwB,EAAY,WAAU,MACtB/vB,EAAQ,kBAAiB,SACzB4kB,GAAW,EAAK,SAChB9mB,EAAQ,UACRE,GACsC0B,EACtC,MAAM+wB,EAAa/yB,EAAAA,OAA6B,MAC1CgzB,EAAuBhzB,EAAAA,SAC3B,KAAM,CACJqyB,UAAWF,EAAiBE,GAC5B/vB,MAAO4vB,EAAa5vB,GACpBkwB,UACEL,EAAiBE,KAAeF,EAAiBG,UAAYJ,EAAa5vB,KAAW4vB,EAAaW,YACpGJ,YACEN,EAAiBE,KAAeF,EAAiBS,YAAcV,EAAa5vB,KAAW4vB,EAAaW,YACtG3L,cAEF,CAACmL,EAAW/vB,EAAO4kB,IAEf+L,EAAkBN,EAAmBK,GA2B3C,OAzBAhzB,EAAAA,iBAAsB,KAGpB,GAAIkyB,EAAa5vB,KAAW4vB,EAAaW,cAAeK,EAAAA,EAAAA,MAAmB,CACzE,MAAMC,EAAcC,KAAS,KAC3B,GAA2B,OAAvBL,EAAWlhB,QAAkB,CAC/B,MAAMwhB,EAAgBN,EAAWlhB,QAAQ1C,MAAM3L,MAC/CuvB,EAAWlhB,QAAQ1C,MAAM3L,MAAQ,IAEjCuvB,EAAWlhB,QAAQyhB,YACnBP,EAAWlhB,QAAQ1C,MAAM3L,MAAQ6vB,CACnC,IACC,KAKH,OAHAF,IACA7mB,OAAO6K,iBAAiB,SAAUgc,GAE3B,KACL7mB,OAAO8K,oBAAoB,SAAU+b,EAAY,CAErD,IACC,CAAC7wB,KAKF/B,EAAAA,EAAAA,KAAA,OAEEG,GAAG,UACH,cAAY,UACZJ,UAAWic,IAAW0W,EAAgB3yB,UAAWA,GACjD2c,IAAK8V,EAAW3yB,UAEhBG,EAAAA,EAAAA,KAAC6xB,EAAelI,SAAQ,CAACnpB,MAAOiyB,EAAqB5yB,SAAEA,KANlDiyB,EASX,CCzDO,SAASkB,EAAavxB,GAMiB,IAAAwxB,EAAAC,EAAAC,EAAA,IAN8B,KAC1EzxB,EAAI,gBACJ0xB,EACAC,WAAYC,EAAc,UAC1BC,KACGjX,GACuC7a,EAC1C,MAAM,MAAEM,EAAK,YAAEmwB,GAAgBC,IACzBkB,EAAaC,QAAsC7wB,IAApBf,EAAK8xB,WACpCC,EAjER,SAA+Br0B,GAUe,IAVd,MAC9B2C,EAAK,SACL2xB,EAAQ,YACRxB,EAAW,WACXmB,GAMDj0B,EACC,MAAMu0B,EAAkBhiB,eAAeqD,mBACvC,OAAQjT,IACD4vB,EAAaW,YACT,CACLvyB,UAAWic,IACT,CACE4X,KAAM1B,EACN,aAAcA,IAAgByB,EAC9B,gBAAiBN,IAGlBM,GAAmB,CAClB,yFAAyF,EACzF,+EAAgFD,EAChF,uCAAwCA,IAG5C3xB,MAAO4xB,EAAkB,kBAAoB,cAC7C5e,SAAU4e,OAAkBlxB,EAAY,OACxCqS,KAAMod,GAAeyB,OAAkBlxB,EAAY,QAG9C,CACL1C,UAAWic,IACT,+NACA,CACE,gBAAiBqX,EACjB,mJACGK,EACH,4EAA6EA,IAGjF3xB,MAAO,cACPgT,SAAU,QAGlB,CAkByB8e,CAAuB,CAC5C9xB,QACAmwB,cACAwB,SAAUpX,EAAMiM,OAChB8K,WAAYA,IAGRS,EAAcA,KAClB9zB,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAOqb,EAAMiM,QAAU7mB,EAAKqyB,YAAeryB,EAAK+iB,KAAMxhB,MAAO,GAAIlD,UAAU,cAGnF,OACEC,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,IACDmyB,KACCnX,EACLvZ,WAA4B,QAAlBkwB,EAAE3W,EAAMvZ,kBAAU,IAAAkwB,EAAAA,EAAI,SAChCpqB,MAAOyT,EAAMS,UAAYqW,EAAkBA,EAAmB9W,EAAMiM,QAAU7mB,EAAKsyB,aAAgBtyB,EAAKmH,MACxGiM,KACqB,QADjBoe,EACFO,EAAe3e,YAAI,IAAAoe,EAAAA,EAClBnxB,IAAU4vB,EAAaK,iBAAmBrgB,eAAeqD,mBAAqB,SAAW,QAC3FnV,SAEA0zB,GACCvzB,EAAAA,EAAAA,KAACoqB,EAAAA,EAAO,CAACC,MAAO,IAAKE,eAAgBuJ,IAAcj0B,UACjDG,EAAAA,EAAAA,KAAC8pB,EAAAA,EAAO,CAAC7mB,MAAO,QAGlBjD,EAAAA,EAAAA,KAAAJ,EAAAA,SAAA,CAAAC,SACiB,QADjBszB,EACG7W,EAAMzc,gBAAQ,IAAAszB,EAAAA,EACZE,GACCrzB,EAAAA,EAAAA,KAACoqB,EAAAA,EAAO,CAACC,MAAO,IAAKE,eAAgBuJ,IAAcj0B,UACjDG,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAMS,EAAK8xB,WAAYvwB,MAAO,GAAIlD,UAAU,eAGpD+zB,OAMd,C,0CCjDO,SAASG,EAAY70B,GAUN,IAAA80B,EAAA,IAVO,YAC3BC,EAAW,SACXT,EAAQ,UACRH,EAAS,WACTa,EAAU,WACVC,EAAU,SACVlzB,EAAQ,gBACRmzB,GAAkB3N,EAAAA,EAAAA,MAAU,SAC5B5J,EAAQ,gBACRqW,GACkBh0B,EAClB,MAAMm1B,GAAYC,EAAAA,EAAAA,IAAa,CAAEC,UAAW,QACtC,MAAE1yB,EAAK,YAAEmwB,GAAgBC,KACxBuC,EAAcC,GAAmBl1B,EAAAA,SAAe00B,GACjDS,EAAUP,aAAU,EAAVA,EAAY/lB,QAAQ,MAAO,KAAKumB,oBAC1CC,EAAqB/yB,IAAU4vB,EAAaW,YAC5CrL,GAAe8N,EAAAA,EAAAA,IAAgB,CACnCpI,UAAWmI,GAAsB5C,EAAc,SAAW,gBAEtDvlB,GAASqoB,EAAAA,EAAAA,IACb/N,EACAyN,EAAav0B,GAC4C,QAD1C+zB,EACfE,aAAU,EAAVA,EAAYzzB,KAAK6O,IAAC,CAAQhP,MAAOgP,EAAErP,GAAIU,MAAO2O,EAAE3G,iBAAS,IAAAqrB,EAAAA,EAAI,IAC5D9rB,IACCusB,EAAgBP,EAAYA,EAAYa,WAAWvzB,GAASA,EAAKvB,KAAOiI,EAAO5H,UAC/EW,EAASiH,EAAO5H,MAAO,SAAS,IAIpC,OACEb,EAAAA,EAAAA,MAAA,OACEI,UAAWic,IAAW,gBAAiB,CACrC4X,KAAMkB,GAAsB5C,EAC5B,YAAa4C,IAAuB5C,IAAgBvgB,eAAeqD,qBAClEnV,SAAA,EAEHF,EAAAA,EAAAA,MAACqzB,EAAa,CACZrxB,GAAIylB,EAAAA,GACJ7nB,MAAO0nB,EACPL,aAAa,WACb,+BAAA7f,OAA8B6tB,EAAO,WACrClzB,KAAMgzB,EACNnM,OAAQmL,EACR3W,SAAUA,EACVlU,MAAOwrB,EACPjB,gBAAiBA,EACjBG,UAAWA,EACXhyB,QAAU0oB,IACRA,EAAG5pB,iBACH4pB,EAAGiL,kBACH/zB,EAASuzB,EAAav0B,GAAI,QAAQ,EAClCN,SAAA,EAEFG,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAOyyB,GAAYgB,EAAaX,YAAeW,EAAajQ,KAAMxhB,MAAO,GAAIlD,UAAU,cAC7FC,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAK,aAAagC,MAAO,GAAIlD,UAAU,qBAG9Cu0B,GACCt0B,EAAAA,EAAAA,KAACm1B,EAAAA,EAAY,CACXluB,MAAOmtB,EAAWzzB,KAAKe,IAAI,CAAQlB,MAAOkB,EAAKvB,GAAIU,MAAOa,EAAKmH,UAC/D1H,SAAWiH,IACTusB,EAAgBP,EAAYA,EAAYa,WAAWvzB,GAASA,EAAKvB,KAAOiI,EAAO5H,UAC/EW,EAASiH,EAAO5H,MAAO,SAAS,EAElCe,QAASA,IAAMJ,EAASuzB,EAAav0B,GAAI,aAG3CH,EAAAA,EAAAA,KAACunB,EAAAA,GAAO,CACN6N,cAAe,CAAE9jB,QAAS1E,SAASyoB,MACnC91B,MAAO0nB,EACP,aAAYlK,GAAYqW,EAAkBA,EAAkBiB,EAC5DiB,aAAa,EAAMz1B,UAEnBG,EAAAA,EAAAA,KAACu1B,EAAAA,GAAI,CAACh2B,MAAOg1B,EAAWx0B,UAAU,WAAWoB,SAAUwL,EAAO6oB,aAAa31B,SACxEu0B,EAAWzzB,KAAKe,IACf1B,EAAAA,EAAAA,KAACy1B,EAAAA,GAAQ,CAEPhQ,aAAazlB,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAMS,EAAK+iB,KAAM1kB,UAAU,kBAAkBkD,MAAO,KACvE,+BAAA8D,OAA8B6tB,EAAO,KAAA7tB,OAAIrF,EAAKvB,IAAKN,SAElD6B,EAAKmH,OAJDnH,EAAKvB,YAY1B,CCvJO,SAASu1B,EAAWt2B,GAWoB,IAXnB,YAC1B+0B,EAAW,UACXZ,EAAS,SACTG,EAAQ,WACRL,EAAU,WACVe,EAAU,WACVC,EAAU,SACVlzB,EAAQ,gBACRmzB,EAAe,SACfvX,EAAQ,gBACRqW,GAC2Ch0B,EAC3C,MAAMu2B,EAAejC,IAAa3W,EAElC,OAAMqX,SAAAA,EAAYjwB,QAEdnE,EAAAA,EAAAA,KAACi0B,EAAY,CACXI,WAAYA,EACZD,WAAYA,EACZD,YAAaA,EACbpX,SAAUA,EACV2W,SAAUiC,EACVpC,UAAWA,EACXpyB,SAAUA,EACVmzB,gBAAiBA,EACjBlB,gBAAiBA,KAMrBpzB,EAAAA,EAAAA,KAACgzB,EAAa,CACZ,8BAAAjsB,OAA6BotB,EAAYh0B,IACzCuB,KAAMyyB,EACN5L,OAAQoN,EACRpC,UAAWA,EACXF,WAAYA,EACZtW,SAAUA,EACVqW,gBAAiBA,EACjB7xB,QAASA,KACPJ,EAASgzB,EAAYh0B,GAAI,SAAS,GAI1C,CCtCO,SAASy1B,GAAcx2B,GAAqC,IAApC,UAAEW,GAAgCX,EAC/D,MAAM,UAAE0yB,EAAS,MAAE/vB,GAAUowB,IAE7B,OACEnyB,EAAAA,EAAAA,KAAA,OACED,UAAWic,IACT,+BACA,CACE,gCAAiC8V,IAAcF,EAAiBG,SAChE,mBAAoBD,IAAcF,EAAiBS,WACnD,OAAQP,IAAcF,EAAiBG,UAAYhwB,IAAU4vB,EAAaW,YAC1E,SAAUR,IAAcF,EAAiBS,YAActwB,IAAU4vB,EAAaW,YAC9E,MAAOR,IAAcF,EAAiBS,YAActwB,IAAU4vB,EAAaW,aAE7EvyB,IAIR,C,6DCxBO,SAAS81B,GAAWz2B,GAA+B,IAA9B,KAAEqF,GAA0BrF,EACtD,OACEO,EAAAA,EAAAA,MAACkqB,GAAAA,GAAG,CAAC9pB,UAAU,iBAAgBF,SAAA,CAC5B4E,EAAKoE,QACJ7I,EAAAA,EAAAA,KAACC,EAAAA,GAAO,CAACC,MAAO,EAAGH,UAAU,OAAMF,SAChC4E,EAAKoE,QAGTpE,EAAK4wB,OAAQr1B,EAAAA,EAAAA,KAAC2tB,EAAAA,GAAS,CAAA9tB,SAAE4E,EAAK4wB,SAGrC,CCOA,IAAIS,GACGlb,eAAemb,GAAoBC,GACxC,GAAIF,GAAiB,OAAOA,GAE5B,IACEE,GAAW,GACX,MAAMC,QAAwB,gCAI9B,OAHAH,GAAkBG,EAAgBpZ,QAClCmZ,GAAW,GAEJF,EACT,CAAE,MAAO,CACX,CAKA,MAAMI,GAAgBla,IAAWma,EAAAA,GAAmBC,EAAAA,GAAqBC,EAAAA,GAAWC,QAAS7a,EAAAA,GAAe6a,SAC5G,SAASC,GAAeC,EAAqB/xB,EAAgB+U,EAAehC,GAAiB,IAAAif,EAAAC,EAC3F,MAAO,CACL,CACEC,OAAQH,EAAKI,SACbC,QAAS7a,IAAWka,GAAe,WAAWY,EAAAA,EAAAA,IAAeC,EAAAA,GAAYC,OAAOC,OAAQC,EAAAA,GAAcZ,SACtG5lB,KAAM,QAER8I,EAAQ,GAAK,CACXmd,OAAQH,EAAKW,KACbN,QAAS7a,IAAWka,IAAeY,EAAAA,EAAAA,IAAeC,EAAAA,GAAYC,OAAOC,OAAQC,EAAAA,GAAcZ,SAC3F5lB,KAAqB,QAAjB+lB,EAAEhyB,EAAK2yB,kBAAU,IAAAX,EAAAA,EAAI,QAE3B,CACEI,QAAS7a,IAAWka,IAAeY,EAAAA,EAAAA,IAAeC,EAAAA,GAAYtZ,MAAMwZ,OAAQC,EAAAA,GAAcZ,SAC1FK,OAAQH,EAAKa,KACb3mB,KAAqB,QAAjBgmB,EAAEjyB,EAAK6yB,kBAAU,IAAAZ,EAAAA,EAAKld,IAAUhC,EAAIrT,OAAS,EAAI,SAAW,SAElE5D,OAAO8b,QACX,CA6BO,SAASkb,KACd,MAAO,OAAPxwB,OAAcgF,OAAOC,SAASuH,SAASjF,QAAQ,QAAS,KAC1D,CAEO,SAASkpB,GAAgBC,GAAyB,IAAAC,EACvD,MAAMC,EAA+B,QAAfD,EAAGE,oBAAY,IAAAF,OAAA,EAAZA,EAAcG,QAAQN,MACzCO,EAAgBL,EAAMxC,WAAWuB,GAASA,EAAKr2B,KAAOw3B,IACtDI,EAAiBD,IAAkBL,EAAMtzB,OAAS,GAAKszB,EAAMhrB,MAAMqrB,EAAgB,GAAGtvB,OAAO9G,GAASA,EAAKs2B,OAC3GC,EAAcF,EAAiBN,EAAQA,EAAMhrB,MAAMqrB,EAAgB,GAazE,MAAO,CAAEI,aAAcH,EAAgBvB,KAZtByB,EAAY1e,QAC3B,CAAC4e,EAAK7mB,IACJA,EAAQ0mB,KACJG,EACA,IACKA,EACHh4B,GAAImR,EAAQnR,GACZi4B,MAAO,IAAID,EAAIC,SAAU9mB,EAAQ8mB,SAEzC,CAAEj4B,GAAI,OAAQi4B,MAAO,GAAIC,YAAaJ,EAAY,GAAG93B,KAIzD,CAEO,SAASm4B,GAAa5vB,GAAa,IAAA6vB,EAC5B,QAAZA,EAAAX,oBAAY,IAAAW,GAAZA,EAAcC,QAAQjB,KAAc7uB,EACtC,CC3GO,MAAM+vB,GAAkB,CAC7BC,WAAW,EACXC,iBAAiB,GAaZ,SAASC,GAAQl4B,GACtB,MAAO6yB,EAAWsF,GAAgBp5B,EAAAA,UAAe,IAC1Cq5B,EAAaC,GAAWt5B,EAAAA,SAAqC,MAM9Du5B,EAAav5B,EAAAA,OAAa,oBAAqBsM,OAAS,IAAIktB,qBAAoBx2B,GAChFy2B,EAAgBz5B,EAAAA,QAAcF,IAAmB,IAAA45B,EAC/B,QAAtBA,EAAIH,EAAW1nB,eAAO,IAAA6nB,GAAlBA,EAAoBC,OAAOC,SAE/BR,EAAat5B,EAAM,IAGrBE,EAAAA,WAAgB,IAAM,SAAA65B,EAAA,OAAwB,QAAxBA,EAAMN,EAAW1nB,eAAO,IAAAgoB,OAAA,EAAlBA,EAAoBC,OAAO,GAAE,IAEzD,MAAMC,EAAY/5B,EAAAA,aAChBmb,eAAO6e,GAAmD,IAAAC,EAAA,IAAvBC,IAAWthB,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,KAAAA,UAAA,GAC5C,MAAMyd,QAAwB8D,GAA8BV,EAAc5nB,SAE1E,GAAIwkB,IAAsC,QAAnB4D,EAACV,EAAW1nB,eAAO,IAAAooB,IAAlBA,EAAoBN,OAAOC,SAAS,KAAA3J,EAAAC,EAAAkK,EAC1D,MAAMrD,EAAOsC,QAAAA,EAAe,IAAIhD,EAAgBgE,KAAK,IAAKrB,MAAoB/3B,IAEzEo4B,GAAaC,EAAQvC,GAG1BvpB,MAAM9K,KAAKq0B,EAAK4B,OAAOnwB,SAASxD,GAAS+xB,EAAKuD,WAAWt1B,EAAKtE,MAE9D,MAAM65B,EDaP,SAAsBxD,EAAqB4B,GAChD,OAAOA,EAAMz3B,KAAI,CAAC8D,EAAM+U,KAAK,IAAAygB,EAAAC,EAAAC,EAAAC,EAAA,MAAM,CACjCC,SAAU,CAAEC,QAAS71B,EAAK81B,OAAQC,GAAkB,QAAhBP,EAAEx1B,EAAKkoB,iBAAS,IAAAsN,EAAAA,EAAI,QACxDpD,QAAS,WAET4D,cAAe,CACb3L,UAAW,CACT,CACE7tB,KAAM,SACNP,QAAS,CACPquB,OAAmB,QAAbmL,EAAEz1B,EAAKsqB,cAAM,IAAAmL,EAAAA,EAAI,CAAC,EAAG,QAMnCxpB,KAAMqF,GAAAA,eAAwBtW,EAAAA,cAAoBo2B,GAAa,CAAEpxB,UAEjEkb,QAAS4W,GAAeC,EAAM/xB,EAAM+U,EAAO4e,GAC3CsC,0BAA6C,QAApBP,EAAE11B,EAAKk2B,qBAAa,IAAAR,EAAAA,EAAI,EACjDS,2BAA+C,QAArBR,EAAE31B,EAAKo2B,sBAAc,IAAAT,EAAAA,EAAI,EACpD,GACH,CCnC+BR,CAAuBpD,EAAMiD,EAAWrB,OAU/D,OATA5B,EAAKsE,SAASd,GAEVL,GACFC,GAAuBH,EAAWt5B,IAGpCq2B,EAAKuE,QACM,QAAXrL,GAAAC,EAAA5jB,QAAO6jB,YAAI,IAAAF,GAAXA,EAAA3gB,KAAA4gB,EAAc,QAAS,aAAc,CAAEqL,YAAmC,QAAxBnB,EAAEJ,EAAWpB,mBAAW,IAAAwB,EAAAA,EAAIJ,EAAWt5B,KAElFq2B,CACT,CACF,GACA,CAACsC,EAAap4B,IAGhB,MAAO,CACL6yB,YACAuF,cACAU,YACAhC,gBAAiBoC,GACjBtB,aAAcsB,GAElB,C,4BClEA,MAAMqB,GAAcx7B,EAAAA,cAA2C,MAClDy7B,GAAiBA,IAAMz7B,EAAAA,WAAiBw7B,IAE9C,SAASE,GAAI/7B,GAA6D,IAA5D,SAAEuZ,EAAQ,SAAE9Y,GAA8CT,EAC7E,MAAMG,GAAQ67B,EAAAA,GAAAA,GAAYziB,GACpBnY,EAAQf,EAAAA,SAAc,IAAMF,GAAO,CAACA,IAE1C,OACES,EAAAA,EAAAA,KAACi7B,GAAYtR,SAAQ,CAACnpB,MAAOA,EAAMX,UACjCG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,mBAAkBF,SAAEA,KAGzC,CCVO,IAAKw7B,GAAU,SAAVA,GAAU,OAAVA,EAAU,sBAAVA,EAAU,mBAAVA,EAAU,mBAAVA,EAAU,oBAAVA,EAAU,sBAAVA,EAAU,mBAAVA,EAAU,kBAAVA,CAAU,MAmBf,SAASC,GAAGl8B,GAMwC,IAN4B,SACrF2V,EAAW,OAAM,MACjBhT,EAAQ,MAAK,KACb+S,EAAO,SAAQ,SACfjV,KACGyc,GACoDld,EACvD,MAAMG,EAAQ27B,KACRK,EAAUF,GAAWvmB,GAE3B,OACE9U,EAAAA,EAAAA,KAACmrB,GAAAA,EAAU,IAAK5rB,KAAW+c,EAAKzc,SAC5BmtB,IACA,MAAMzE,EAASlM,QAAQ2Q,EAAU,kBAC3BlqB,GAvBW04B,EAuBoBxO,EAAUlqB,aAvBmB4wB,EAuBLnL,GAtB/DzD,EAAAA,EAAAA,IAAgB0W,IAAiBx7B,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAMu6B,IACxC/7B,EAAAA,eAAqB+7B,GACrB/7B,EAAAA,aAAmB+7B,EAAoD,CAC5EjT,OAAQmL,IAEA8H,GANd,IAAyBA,EAAiD9H,EAyBlE,OACE/zB,EAAAA,EAAAA,MAAC2B,EAAAA,EAAM,IACD0rB,EACJzE,OAAQA,EACRxmB,MAAOA,EACP+S,KAAMA,EACNC,SAAUA,EACVjS,kBAAcL,EACd1C,UAAW07B,IAAW,cAAenf,EAAMvc,WAC3C6mB,aAAc6U,IAAWF,EAAS,OAAQjf,EAAMsK,cAAc/mB,SAAA,EAE9DG,EAAAA,EAAAA,KAAA,QAAAH,SAAOA,IACNiD,IACM,GAKnB,C,gBCnDO,SAAS44B,GAAOt8B,GAA0F,IAAvF,aAAcwsB,EAAS,UAAE7rB,EAAS,SAAEF,GAAiDT,EAC7G,MAAMG,EAAQ27B,KAEd,OACEl7B,EAAAA,EAAAA,KAACmrB,GAAAA,EAAc,IACT5rB,EACJ,aAAYqsB,EACZ7rB,UAAW07B,IAAW,oEAAqE17B,GAAWF,SAErGA,GAGP,C,gBClBO,SAAS87B,GAAQv8B,GAAsE,IAArE,SAAES,KAAayc,GAAoDld,EAC1F,MAAMG,EAAQ27B,KAEd,OACEl7B,EAAAA,EAAAA,KAACmrB,GAAAA,EAAe,IAAK5rB,KAAW+c,EAAKzc,SAClCA,GAGP,CCZyB,IAEpB+7B,GAAS,SAATA,GAAS,OAATA,EAAS,oBAATA,EAAS,qBAATA,CAAS,EAATA,IAAS,IAMTC,GAAY,SAAZA,GAAY,OAAZA,EAAY,sBAAZA,EAAY,uBAAZA,CAAY,EAAZA,IAAY,IAYV,SAASC,GAAK18B,GAA6F,IAA5F,KAAE0V,EAAO,SAAQ,QAAEinB,EAAUjnB,EAAI,OAAEyT,EAAM,SAAE1oB,GAA+CT,EAC9G,MAAM48B,EAAeH,GAAaE,GAC5BE,EAAYL,GAAU9mB,GAE5B,OACE9U,EAAAA,EAAAA,KAAA,QACED,UAAW07B,IACT,yEACAO,EACAC,EACA,CACE,2CAA4C1T,EAC5C,yKACGA,IAEL1oB,SAEDA,GAGP,C,qECrCO,IAAKq8B,EAAoB,SAApBA,GAAoB,OAApBA,EAAAA,EAAoB,qBAApBA,EAAAA,EAAoB,uBAApBA,EAAAA,EAAoB,2BAApBA,EAAAA,EAAoB,6BAApBA,CAAoB,MAYzB,MAAMC,EAAsB18B,EAAAA,cAGhC,CACD2R,KAAMA,OACNkW,KAAMA,SAGD,SAAS8U,IACd,OAAO38B,EAAAA,WAAiB08B,EAC1B,C,6LCdO,SAASE,EAAoB/f,GAClC,MAAOggB,EAAQC,GAAa98B,EAAAA,UAAe,IACpC+8B,EAAcC,GAAmBh9B,EAAAA,SAAyC,OAC3E,SAAEi9B,EAAQ,YAAEC,IAAgBC,EAAAA,EAAAA,GAAkB,CAAEC,UAAWL,IAE3DtR,EAAUzrB,EAAAA,OAAa,CAC3B2R,KAAM,SAACkpB,GAAqE,IAA/C55B,EAAqC2X,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpEskB,GAAY,KAAMG,EAAAA,EAAAA,GAAkB/wB,OAAOgxB,kBAC3CN,EAAgB,CAAEnC,UAAS55B,YAC3B67B,GAAU,EACZ,EACAjV,KAAMA,IAAMiV,GAAU,KAGlBS,EAAgBv9B,EAAAA,SAAc,KAAM,IAAAw9B,EACxC,MAAM,SAAE9Y,EAAW+X,EAAAA,GAAqBgB,YAAoC,QAAxBD,EAAGT,aAAY,EAAZA,EAAc97B,eAAO,IAAAu8B,EAAAA,EAAI,CAAC,EACjF,MAAO,CACL,4CAA6C,CAC3Cf,EAAAA,GAAqBiB,QACrBjB,EAAAA,GAAqBkB,UACrBr8B,SAASojB,GACX,kEAAmE,CACjE+X,EAAAA,GAAqBkB,SACrBlB,EAAAA,GAAqBmB,aACrBt8B,SAASojB,GACX,6CAA8C,CAC5C+X,EAAAA,GAAqBgB,WACrBhB,EAAAA,GAAqBmB,aACrBt8B,SAASojB,GACX,iEAAkE,CAChE+X,EAAAA,GAAqBiB,QACrBjB,EAAAA,GAAqBgB,YACrBn8B,SAASojB,GACZ,GACA,CAACqY,aAAY,EAAZA,EAAc97B,UAEZ48B,EAAmB79B,EAAAA,SACvB,IAAO+8B,SAAAA,EAAc97B,QAAQ68B,OAAS99B,EAAAA,SAAiB+9B,EAAAA,GACvD,CAAChB,aAAY,EAAZA,EAAc97B,QAAQ68B,SAGzB,OACE59B,EAAAA,EAAAA,MAACw8B,EAAAA,GAAoBxS,SAAQ,CAACnpB,MAAO0qB,EAAQ5Z,QAAQzR,SAAA,CAClDyc,EAAMzc,SACNy8B,IACCt8B,EAAAA,EAAAA,KAACs9B,EAAgB,CAAAz9B,UACfG,EAAAA,EAAAA,KAACw9B,EAAAA,GAAc,CACbzhB,KAAK,QACL,aAAW,eACXhc,UAAWic,IACTghB,EACA,4KAEFS,eAAa,EAEbrtB,KAAMksB,EACNoB,QAASxS,EAAQ5Z,QAAQgW,KAEzBoE,OAAO,EACPiS,UAAU,EAEVC,WAAW,EAEXC,cAAc,EACdC,uBAAuB,EACvBC,iBAAiB,EACjBC,iBAAiB,EAEjBpvB,MAAO,CACL3L,MAAOy5B,EAASz5B,MAChB4b,OAAQ6d,EAAS7d,OACjBof,UAAW,aAAFl3B,OAAe21B,EAASne,KAAI,QAAAxX,OAAO21B,EAAShe,IAAG,cAAA3X,OAAa21B,EAASwB,MAAK,KACnFC,WAAY,QACZt+B,SAED28B,aAAY,EAAZA,EAAclC,cAM3B,C,eCzFO,SAAS8D,EACdC,GACA,IAAAj/B,EAAAk/B,EACA,MAAMC,EAAmE,QAAxDn/B,EAA+B,QAA/Bk/B,EAAGD,EAAiBE,mBAAW,IAAAD,EAAAA,EAAID,EAAiBp9B,YAAI,IAAA7B,EAAAA,EAAI,YACvEo/B,EAA2BliB,IAC/B,MAAMkgB,GAAeJ,EAAAA,EAAAA,MACrB,OAAOp8B,EAAAA,EAAAA,KAACq+B,EAAgB,IAAM/hB,EAAamiB,oBAAqBjC,GAAgB,EAKlF,OAFAgC,EAAwBD,YAAc,2BAAHx3B,OAA8Bw3B,EAAW,KAErEC,CACT,C,iHCUO,SAASE,EAAYt/B,GAMmB,IANlB,UAC3BW,EAAS,UACT4+B,EAAY,QAAO,QACnBC,EAAO,YACPC,EAAW,SACXh/B,GAC2CT,EAC3C,MAAMo9B,GAAeJ,EAAAA,EAAAA,MAiBrB,OAfA38B,EAAAA,WAAgB,KACd,IAAIq/B,EAOJ,OANID,IACFC,EAAY/yB,OAAO+O,YAAW,KAC5B0hB,EAAalV,MAAM,GAClBuX,IAGE,KACDC,GACF7jB,aAAa6jB,EACf,CACD,GACA,CAACtC,EAAcqC,KAGhBl/B,EAAAA,EAAAA,MAAA,OACEI,UAAWic,IACTjc,EACA,0JACAF,SAAA,EAEFG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBF,SAAEA,KACvCG,EAAAA,EAAAA,KAAA,OAAAH,SACG++B,QAAAA,GACC5+B,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACK,GAAI67B,EAAAA,EAAuBz7B,MAAM,OAAMlC,SAC5C8+B,QAMb,C,kMC2BO,SAASpX,EAAOnoB,GAkBN,IAlBO,MACtBG,EAAK,SACLM,EAAQ,YACR2nB,GAAc,EAAI,YAClBuX,GAAc,EAAI,cAClB3J,EACA,aAAcxJ,EAAS,KACvBtE,EAAI,mBACJS,GAAqB,EAAI,SACzBiX,GAAW,EAAK,YAChB1J,GAAc,EAAI,eAClBtN,EAAc,oBACdiX,EAAmB,iBACnBC,EAAmBjxB,OAAOC,iBAAgB,MAC1CnM,EAAQ,QAAO,uBACfwtB,GAAyB,EAAK,oBAC9B4P,GAAsB,KACnB7iB,GACUld,EACb,MAAMkqB,GAASyC,EAAAA,EAAAA,OACT,cAAExC,IAAkBC,EAAAA,EAAAA,IAAuBjqB,IAC3C,YAAE6/B,IAAgBC,EAAAA,EAAAA,GAAc,CAAEC,YAAa/V,IAE/CgW,EAAgBhgC,EAAMigC,sBAAsBluB,QAC5C8d,GAAiBC,EAAAA,EAAAA,GAAoB,CACzCC,eAAgB4P,EAChB3P,yBACAC,QAASjwB,EAAMiwB,QACfjwB,UAyBF,OAtBAE,EAAAA,WAAgB,KACd,IAAK8/B,IAAkBhgC,EAAMipB,UAAa+G,IAA0B4P,EAAsB,OAE1F,MAAMM,EAAaF,EAAcnhB,wBAC3BshB,EAAYH,EAAcxyB,aAAa,iBACvC4yB,EAAiBD,EAAY9yB,SAASC,eAAe6yB,GAAa,KAGpEP,IACFQ,SAAAA,EAAgB/wB,MAAMgxB,YAAY,YAAa,GAAF74B,OAAK04B,EAAWx8B,MAAK,OACpE,GACC,CACD1D,EAAMipB,QACNjpB,EAAMiwB,QACN+P,EACAhQ,EACA4P,EACAC,EACA7/B,EAAMotB,UACNuS,IAGE3V,EAAsB,MAGxBvpB,EAAAA,EAAAA,KAACmsB,EAAAA,EAAM,CAAAtsB,UACLG,EAAAA,EAAAA,KAACmrB,EAAAA,EAAc,IACT5rB,EACJ+nB,KAAMA,QAAAA,EAAQ/nB,EAAM+nB,KACpBS,mBAAoBA,EACpB8X,yBAA0BrY,EAC1B,aAAYoE,EACZkU,yBAA0Bf,EAC1BgB,uBAAwB3K,EAAcv1B,SAErC4B,IAAA,IAAC,gBAAE8qB,EAAe,eAAEC,KAAmBC,GAAYhrB,EAAA,OAClD9B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAAA,OACED,UAAWic,IAAWsN,EAAQ,sCAAuC,CACnE,uBAAwBgM,IAE1B/zB,SAA4B,IAAnBymB,EAA2BV,QAAAA,EAAQ/nB,EAAM+nB,KAAOU,EACzD1H,YAActC,IAEZA,EAAM3d,gBAAgB,KAG1BL,EAAAA,EAAAA,KAAA,UACMysB,EACJ1sB,UAAWic,IAAWsN,EAAQ,mDAC9B1a,MAAO,IAAK6d,EAAW7d,SAAUqwB,GAAsBp/B,UAEvDF,EAAAA,EAAAA,MAACkqB,EAAAA,GAAG,CACF0C,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBjtB,EAAMotB,UACtB5qB,MAAOA,KACHua,EACJvc,UAAWic,IAAW,sBAAuBM,EAAMvc,WACnD6O,MAAO2gB,EAAyB,IAAKH,KAAmB9S,EAAM1N,OAAU0N,EAAM1N,MAAM/O,SAAA,CAEnFm/B,IACCh/B,EAAAA,EAAAA,KAACmrB,EAAAA,EAAmB,IAAK5rB,EAAOuV,KAAM,GAAGjV,UACvCG,EAAAA,EAAAA,KAACggC,EAAAA,EAAY,CACXrT,UAAWptB,EAAMotB,UACjB5sB,UAAWic,IAAW,CACpB,qEACEikB,EAAAA,GAASl+B,KAAWk+B,EAAAA,GAASjJ,MAC/B,gCAAiCiJ,EAAAA,GAASl+B,KAAWk+B,EAAAA,GAAStkB,WAKrE9b,SAGJ,KAKb,C,0BCvMA,MAAMqgC,EAAmC,CAAC,EAAG,GACvCC,EAAgB,IAEhB9/B,EAAkB4pB,IACtBA,EAAG5pB,gBAAgB,EAMd,SAAS6mB,EAAgBvO,GAAuC,IAAAsS,EAAAmV,EACrE,MAAM5Q,EAAoC,QAA7BvE,EAAItS,aAAQ,EAARA,EAAU6S,uBAAe,IAAAP,EAAAA,EAAIiV,EAS9C,MAAO,IARS/U,EAAAA,EAAuB,IAClCxS,EACHgU,UAA8B,QAArByT,EAAEznB,aAAQ,EAARA,EAAUgU,iBAAS,IAAAyT,EAAAA,EAAI,eAClC5U,gBAAiBgE,EACjBnE,SAAUC,EAAAA,EACVI,OAAO,IAGY8D,UACvB,CAEO,SAASuF,EAAgBpc,GAC9B,MAAMwR,EAAUjD,EAAgBvO,GAC1B0nB,EAAc5gC,EAAAA,OAA4B,MAC1C6gC,EAAc7gC,EAAAA,OAA4B,MAE1C8gC,EAAgB9gC,EAAAA,QAAa,KACL,OAAxB4gC,EAAY/uB,SACdvF,OAAOkP,aAAaolB,EAAY/uB,SAEN,OAAxBgvB,EAAYhvB,SACdvF,OAAOkP,aAAaqlB,EAAYhvB,QAClC,IAGIkvB,EAAc/gC,EAAAA,QAAa,KAC/B8gC,EAAcjvB,UACd+uB,EAAY/uB,QAAUvF,OAAO+O,YAAW,KACtCqP,EAAQ/Y,MAAM,GACb+uB,EAAc,IAGbM,EAAchhC,EAAAA,QAAa,KAC/B8gC,EAAcjvB,UACdgvB,EAAYhvB,QAAUvF,OAAO+O,YAAW,KACtCqP,EAAQ7C,MAAM,GACb6Y,EAAc,IAMnB,OAFA1gC,EAAAA,WAAgB,IAAM,IAAM8gC,EAAcjvB,WAAW,IAE9C,IACF6Y,EACH/Y,KAAMovB,EAAYlvB,QAClBgW,KAAMmZ,EAAYnvB,QAClBovB,YAAaF,EAAYlvB,QACzBqvB,WAAYF,EAAYnvB,QACxBgP,YAAajgB,EAEjB,C,eCxDO,MAAM+mB,EAAiB3nB,EAAAA,YAC5B,CAAAL,EAA0Csd,KAA+C,IAAAkkB,EAAA,IAAxF,MAAErhC,KAAU+c,GAA2Bld,EACtC,MAAMkqB,GAASyC,EAAAA,EAAAA,MAEf,OACE/rB,EAAAA,EAAAA,KAACmrB,EAAAA,EAAwB,CACvBzO,IAAKA,KACDJ,EACJ3a,GAAY,QAAVi/B,EAAEtkB,EAAM3a,UAAE,IAAAi/B,EAAAA,EAAI,YACZrhC,EACJQ,UAAWic,IAAWM,EAAMvc,UAAW,CACrC,CAACupB,GAAS/pB,EAAMipB,UACf3oB,SAEFyc,EAAMzc,UACkB,G,uJCjB1B,SAASs1B,EAAY/1B,GAKI,IAL8D,MAC5F6H,EAAK,SACL9F,EAAQ,YACR0/B,EAAc,kBACXvkB,GACyBld,EAC5B,MAAM0hC,GAAmC,IAAjBxkB,EAAM9b,MACxBugC,EAA2BthC,EAAAA,aAC9BW,IAA4C,IAAA4gC,EAAAC,EAC3C,MAAMC,EAAY9gC,EAAEm6B,OAAO4G,eAAiBL,GAAmB,EAAI,GAC7DpM,GAAe0M,EAAAA,EAAAA,IAAan6B,GAAOi6B,GAEzC,IAAKxM,EAAc,OAInB,GAFAvzB,SAAAA,EAAWuzB,IAENA,EAAazoB,OAASyoB,EAAa2M,eACtC,OAGF,GAAiC,iBAAtB3M,EAAazoB,KAEtB,YADAF,OAAOC,SAASC,KAAOyoB,EAAazoB,MAItC,MAAMq1B,EAAS,IAAIC,IAAI7M,EAAazoB,KAAKsH,SAAWxH,OAAOC,SAASC,MACpEq1B,EAAO5sB,OAAiC,QAA3BssB,EAAGtM,EAAazoB,KAAKyI,cAAM,IAAAssB,EAAAA,EAAI,GAC5CM,EAAOE,KAA6B,QAAzBP,EAAGvM,EAAazoB,KAAKu1B,YAAI,IAAAP,EAAAA,EAAI,GAExCl1B,OAAOC,SAASC,KAAOq1B,EAAO1sB,UAAU,GAE1C,CAAC3N,EAAO9F,EAAU2/B,IAGpB,OACEnhC,EAAAA,EAAAA,MAAA,aACM2c,EACJkE,UAAW,EACXzgB,UAAU,0EACVoB,SAAU4/B,EAAyBlhC,SAAA,CAElCihC,IAAmB9gC,EAAAA,EAAAA,KAAA,UAAQga,QAAM,EAAAna,SAAEghC,IACnC55B,EAAMtG,KAAI,CAACe,EAAMw/B,KACZO,EAAAA,EAAAA,GAAkB//B,IAElB1B,EAAAA,EAAAA,KAAA,YAA2Ba,MAAOa,EAAKb,MAAMhB,SAC1C6B,EAAKuF,MAAMtG,KAAI,CAACyH,EAAQs5B,KACvB1hC,EAAAA,EAAAA,KAAA,UAA0BQ,MAAK,GAAAuG,OAAKm6B,GAASn6B,OAAG26B,GAAc7hC,SAC3DuI,EAAOvH,OADG6gC,MAFFhgC,EAAKb,QAWtBb,EAAAA,EAAAA,KAAA,UAAwBQ,MAAO0gC,EAAUrhC,SACtC6B,EAAKb,OADKqgC,OAOvB,CAEO,SAASS,EACdrlB,GAEA,MAAMslB,GAAWC,EAAAA,EAAAA,MAEXC,EAAuBriC,EAAAA,aAC1BiC,IAA8B,IAAAwoB,EACf,QAAdA,EAAA5N,EAAMnb,gBAAQ,IAAA+oB,GAAdA,EAAAnb,KAAAuN,EAAiB5a,GAEbA,EAAKuK,MAAM21B,EAASlgC,EAAKuK,KAAK,GAIpC,CAAC21B,EAAUtlB,EAAMnb,SAAUmb,EAAMrV,QAGnC,OAAOjH,EAAAA,EAAAA,KAACm1B,EAAY,IAAK7Y,EAAOrV,MAAOqV,EAAMrV,MAAc9F,SAAU2gC,GACvE,C,uNClFO,MAAMC,EAAatiC,EAAAA,YAAiB,SAAmBL,EAE5Dsd,GACA,IAFA,MAAE7b,EAAK,SAAEhB,KAAayc,GAAiDld,EAGvE,OACEO,EAAAA,EAAAA,MAAC69B,EAAAA,EAAmB,IACdlhB,EACJI,IAAKA,EACL3c,UAAW07B,IACTnf,EAAMvc,UACN,uFACAF,SAAA,CAEDgB,IAASb,EAAAA,EAAAA,KAACw9B,EAAAA,EAAwB,CAACz9B,UAAU,8BAA6BF,SAAEgB,IAC5EhB,IAGP,I,+CCLA,SAASmiC,EAAgBC,GACvB,OAAOA,EAAY,WAAa,qBAClC,CAEA,MAAMC,EAAiBziC,EAAAA,YAAiB,SAAuBL,EAa7Dsd,GACA,IAAAylB,EAAAC,EAAA,IAXA,SACEjV,EAAQ,SACRttB,EACA,gBAAiBwiC,EACjB,mBAAoBC,EAAc,SAClCvtB,EAAW,QAAO,YAClBwtB,EAAc,OAAM,MACpBxgC,EAAQigC,KACL1lB,GACgEld,EAGrE,MAAM6kB,GAA8B,IAAjBoe,EACbJ,GAA+B,IAAnBK,EACZE,EAAgC,mBAAVzgC,EAAuBA,EAAMkgC,GAAalgC,EAEtE,OACEpC,EAAAA,EAAAA,MAAC2B,EAAAA,EACC,IACKgb,EACLI,IAAKA,EACL6Q,MAAM,OACNxtB,UAAW07B,IAAWnf,EAAMvc,UAAWm3B,EAAAA,GAAcZ,QAAS,cAAe,CAC3E,aAAcnJ,IAAa7Q,EAAMva,QAEnC6kB,aAAc6U,IAAWnf,EAAMsK,aAAc,eAC7C7R,SAAUA,EACVwT,OAAoB,QAAd4Z,EAAE7lB,EAAMiM,cAAM,IAAA4Z,EAAAA,EAAKF,IAAche,EACvCliB,MAAOkiB,EAAase,EAAcC,EAClC1tB,KAAgB,QAAZstB,EAAE9lB,EAAMxH,YAAI,IAAAstB,EAAAA,EAAKjV,EAAW,OAAS7Q,EAAMxH,KAC/C,gBAAeutB,EACf,mBAAkBC,EAAeziC,SAAA,CAEhCA,EACAstB,IACCntB,EAAAA,EAAAA,KAAA,OACED,UAAW07B,IAAW,0CAA2C,CAC/D,gBAAiBxX,IAChBpkB,SAEFstB,MAKX,IAMasV,EAAehjC,EAAAA,YAAiB,SAAqBgC,EAKhEib,GACA,IAFA,GAAE/a,KAAO2a,GAA8F7a,EAGvG,MACMihC,IADUlF,EAAAA,KACamF,SAE7B,OACE3iC,EAAAA,EAAAA,KAACw9B,EAAAA,EAAkB,CACjB9gB,IAAKA,KACDJ,EACJsmB,OAAQF,GAAa1iC,EAAAA,EAAAA,KAACw9B,EAAAA,EAAoB,CAACoF,QAAQ5iC,EAAAA,EAAAA,KAACkiC,EAAc,CAACvgC,GAAIA,OAAa3B,EAAAA,EAAAA,KAACkiC,EAAc,CAACvgC,GAAIA,KAG9G,I,eClFA,SAASkhC,EAAuBvmB,GAC9B,OACEtc,EAAAA,EAAAA,KAAC8iC,EAAAA,GAAc,CAAC3iC,GAAG,sBAAsB4iC,SAAUzmB,EAAM0mB,eAAYvgC,EAAY,GAAIwgC,SAAU,EAAEpjC,SAC9FT,IAA6D,IAA1DoB,MAAO0iC,EAAW,MAAE1pB,EAAK,MAAE3Y,KAAUsiC,GAAgB/jC,EACvD,OAAIgkC,EAAAA,EAAAA,IAAaF,GACR5mB,EAAM+mB,aAAaH,EAAa,CAAEx6B,IAAK8Q,KAAU2pB,KAIxDnjC,EAAAA,EAAAA,KAAC8iC,EAAAA,GAAc,IAETK,EAEJG,aAAcziC,EAAQ,GAAK,EAE3B0iC,WAAY,EAEZR,SAAU,GACVH,OAASY,IACPxjC,EAAAA,EAAAA,KAAC+hC,EAAU,IAAKyB,EAAe3iC,MAAOA,EAAMhB,SACzC2jC,EAAc3jC,WAEjBA,SAED4B,IAAA,IAAC,MAAEjB,EAAK,MAAEgZ,KAAUiqB,GAAmEhiC,EAAA,OACtF6a,EAAM+mB,aAAa7iC,EAAO,CAAEkI,IAAK8Q,KAAUiqB,GAAW,GAfnDjqB,EAiBU,GAK3B,CASO,SAASkqB,EAAW9iC,GAMgC,IANkC,MAC3FqG,EAAK,SACL8N,EAAQ,YACR4uB,EAAW,aACXC,EAAY,YACZC,GACuDjjC,EACvD,MAAMkjC,GAAoBC,EAAAA,EAAAA,MACpBC,EAAgBvkC,EAAAA,SAAc,KAAMwkC,EAAAA,EAAAA,IAAoBh9B,EAAO08B,IAAc,CAAC18B,EAAO08B,IAErF9L,EAAUp4B,EAAAA,aACd,CAACykC,EAAgCC,KAC/BnkC,EAAAA,EAAAA,KAACyiC,EAAY,IACP0B,EACJ3jC,MAAO0jC,EAEPnvB,SAAuB,SAAbA,EAAsB,YAAStS,EACzCgjB,YAAaye,EAAUzf,SAEnB2f,EAAAA,EAAAA,IAAmBF,EAAWJ,GAElC,cAAaF,EAAe,GAAH78B,OAAM68B,EAAY,KAAA78B,OAAIm9B,EAAU1jC,OAAK,iBAAAuG,OAAsBm9B,EAAU1jC,OAC9FT,UAAU,SACV6mB,aAAc6U,IAAW,CAAE4I,SAAUR,IAAehkC,SAEnDqkC,EAAUrjC,SAGf,CAACijC,EAAmBF,EAAc7uB,EAAU8uB,IAG9C,IAAKG,EAAc7/B,OACjB,OAAOnE,EAAAA,EAAAA,KAAA,OAAKD,UAAU,4BAA2BF,SAAC,sBAGpD,GAAIgkC,EAAa,CACf,MAAMb,GAAyC,KAA7BI,EAAAA,EAAAA,IAAan8B,aAAK,EAALA,EAAQ,IACvC,OAAOjH,EAAAA,EAAAA,KAAC6iC,EAAsB,CAACG,UAAWA,EAAWK,aAAcxL,GACrE,CAEA,OACE73B,EAAAA,EAAAA,KAAAJ,EAAAA,SAAA,CAAAC,SACGmkC,EAAcrjC,KAAI,CAACe,EAAM8X,KACpB4pB,EAAAA,EAAAA,IAAa1hC,GACRm2B,EAAQn2B,EAAM,CAAEgH,IAAK8Q,KAI5BxZ,EAAAA,EAAAA,KAAC+hC,EAAU,CAAalhC,MAAOa,EAAKb,MAAOd,UAAU,kBAAiBF,SACnE6B,EAAKuF,MAAMtG,KAAI,CAACe,EAAMw/B,IAAcrJ,EAAQn2B,EAAM,CAAEgH,IAAKw4B,OAD3C1nB,MAO3B,C,gDC1GK8qB,EAAY,SAAZA,GAAY,OAAZA,EAAY,QAAZA,EAAY,qBAAZA,CAAY,EAAZA,GAAY,IAKZC,EAAS,SAATA,GAAS,OAATA,EAAS,QAATA,EAAS,2CAATA,CAAS,EAATA,GAAS,IAKd,SAASC,EAAmBlK,GAG1B,OAFAA,SAAAA,EAASlsB,MAAM,CAAEq2B,eAAe,KAExBnK,CACV,CAEA,SAASoK,EAAgBza,GACvBA,EAAG5pB,gBACL,CAoDO,SAASskC,EAAUvlC,GAUmB,IAVlB,WACzBsjC,EAAU,SACV3tB,EAAW,UAAS,MACpBhT,EAAQ,UAAS,OACjB6iC,EAAS,EAAC,YACVhY,EAAc,WAAU,UACxB7sB,EAAS,cACT09B,GAAgB,EAAK,gBACrBoH,EAAe,SACfhlC,GACyCT,EACzC,MAAM0lC,EAAcrlC,EAAAA,SAClB,IAAOijC,EAAalF,EAAAA,EAAwBuH,IAAsB/kC,EAAAA,EAAAA,KAAA,UAAS+kC,KAC3E,CAACrC,IAGG/V,EADU6Q,EAAAA,KACUje,SAAS,oBAC7BylB,EAAcH,GAAmBplC,EAAAA,SAAewlC,MAAMplC,GAAY,EAExE,OACEF,EAAAA,EAAAA,MAAC69B,EAAAA,EAAqB,CAEpB9R,OAAK,EACLwZ,mBAAmB,EAEnBzH,cAAeA,EAEfmH,OAAQA,EAER5G,gBAAiBwG,EAGjB7G,UAAU39B,EAAAA,EAAAA,KAAA,OAAKsgB,YAAaokB,IAC5B3kC,UAAW07B,IACT17B,EACAukC,EAAavvB,GACbwvB,EAAUxiC,GACV,oHAEA,mEAEA,4FACA,CAGE,4CAA6C2gC,EAC7C,yBAA0B4B,EAAavvB,KAAcuvB,EAAaa,KAElE,uGACExY,EAAU9J,WAAW,UACvB,mGACE8J,EAAU9J,WAAW,SAEzBhjB,SAAA,CAED6iC,IACC/iC,EAAAA,EAAAA,MAAA,OAAKI,UAAU,oBAAmBF,SAAA,EAChCG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,eAAcF,UAC3BG,EAAAA,EAAAA,KAACw9B,EAAAA,EAAgB,CACf4H,YAAU,EACVvE,YAAY,UACZ+B,QACE5iC,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJmS,SAAuB,SAAbA,EAAsB,YAAStS,EAEzCuiB,WAAW,cAKnBhlB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yHAGnBC,EAAAA,EAAAA,KAAC8kC,EAAW,CACVtkB,UAAW,EACXzgB,UAAW07B,IACT,8FACA,CACE,WAA4B,aAAhB7O,EACZ,WAA4B,eAAhBA,EACZ,OAAQ8V,IAEV7iC,SAEDmlC,EAAcnlC,GAAWG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,4BAA2BF,SAAC,0BAI7E,C,uGC5JA,SAASwlC,EAAa/oB,GAAY,IAAAgpB,EAChC,MAAMC,EAAiB/H,EAAAA,KACjBgI,EAA+D,QAA/CF,EAAGC,aAAc,EAAdA,EAAgBhmB,SAAS,2BAAmB,IAAA+lB,EAAAA,EAAI,OAiBzE,OAXA7lC,EAAAA,WAAgB,KACd,MAAMgmC,GAAexrB,EAAAA,EAAAA,IAA0BuO,IACxCA,GAAS+c,SAAAA,EAAgBje,MAAM,IAEtC,MAAO,KACLme,EAAaprB,aAAa,CAC3B,GAGA,KAIDra,EAAAA,EAAAA,KAACmsB,EAAAA,EAAM,CAAAtsB,UACLG,EAAAA,EAAAA,KAACw9B,EAAAA,EAAe,CACd9R,OAAO,EACPkS,WAAW,EACXH,eAAa,EACb19B,UAAU,8CAA6CF,UAEvDF,EAAAA,EAAAA,MAAC+lC,EAAAA,EAAU,CAAC,iBAAgBF,EAAiB3lC,SAAA,EAC3CG,EAAAA,EAAAA,KAACw9B,EAAAA,EAAoB,CACnB1oB,KAAM,GACN8tB,QACE5iC,EAAAA,EAAAA,KAAA,OAAAH,UACEG,EAAAA,EAAAA,KAACggC,EAAAA,EAAY,CAACrT,UAAW6Y,QAI9BlpB,EAAMzc,eAKjB,CAEO,SAAS8lC,EAAoBvmC,GAA8E,IAA7E,QAAEo8B,EAAO,SAAE37B,GAAgET,EAC9G,MAAM8rB,EAAUsS,EAAAA,KACVoI,EAAgB1a,aAAO,EAAPA,EAAS3L,SAAS,QAClCsmB,EAAkBpmC,EAAAA,QAAa,GAMrC,OAJAA,EAAAA,WAAgB,KACVmmC,IAAeC,EAAgBv0B,SAAU,EAAI,GAChD,CAACs0B,IAECpK,GAGH77B,EAAAA,EAAAA,MAAC69B,EAAAA,EAAuB,CAAC7Q,UAAU,SAAQ9sB,SAAA,EACzCG,EAAAA,EAAAA,KAACw9B,EAAAA,EAAqB,CACpBoF,OAAQ/iC,EACRimC,eAAiB7b,IAEX4b,EAAgBv0B,SAAS2Y,EAAG5pB,iBAChCwlC,EAAgBv0B,SAAU,CAAK,KAGnCtR,EAAAA,EAAAA,KAACqlC,EAAY,CAAAxlC,SAAE27B,OAZE,IAevB,CC6DA,SAASuK,EAAkBrkC,EAA2B8X,GACpD,MAAO,CACLrZ,GAAI,QAAF4G,OAAUyS,EAAK,KAAAzS,OAAIoS,OAAOzX,EAAKlB,OAAO8N,QAAQ,MAAO,KACvDzN,MAAOa,EAAKb,MACZL,MAAOkB,EACP7B,SAAU6B,EAAKb,MAEnB,CAEO,SAASmlC,EAAa5mC,GAuB8C,IAAA6mC,EAAAC,EAAA,IAnBzE,KACAjlC,EAAI,MACJJ,EAAK,MACLL,EAAK,aACL2lC,EAAY,SACZhlC,EAAQ,MACR8F,EAAK,YACL48B,GAA4B,QAAdoC,EAACh/B,aAAK,EAALA,EAAO9C,cAAM,IAAA8hC,EAAAA,EAAI,GAAK,GAAE,QACvCG,EAAO,QACPC,EAAO,oBACPC,EAAmB,SACnBC,EAAQ,SACRC,EAAQ,SACR3mC,EAAQ,OACR+kC,EAAM,UACNjY,EAAY,eAAc,YAC1BC,EAAW,UACX6Z,KACGnqB,GACoEld,EAEvE,MAAOsnC,EAAgBC,GAAqBlnC,EAAAA,SAAe,IAGrDijC,IACF8D,IAAyB,IAAbD,GAA0C,iBAAbA,KAA2Bt/B,GAASA,EAAM9C,OAASoiC,EAC1FK,EAAgBlE,EAAalF,EAAAA,EAA2B/9B,EAAAA,SACxDslC,EAAetlC,EAAAA,SACnB,IACEijC,EAAa,CAAEmE,kBAAkB,EAAMC,qBAAqB,EAAOC,SAAUP,QAAAA,EAAYG,GAAsB,CAAC,GAClH,CAACjE,EAAY8D,IAITQ,EAAgBX,EAAUV,EAAuBlmC,EAAAA,SACjDwnC,EAAqBxnC,EAAAA,SAAc,IAAO4mC,EAAU,CAAE7K,QAAS6K,GAAY,CAAC,GAAI,CAACA,IAEnF3D,GAAgB7iC,IAAa2mC,GAC/BU,QAAQC,KACN,oLAIJ,MAAMC,EAAY3nC,EAAAA,SAChB,IACEwH,aAAK,EAALA,EAAOtG,KAAI,CAACe,EAAM8X,KAChB4pB,EAAAA,EAAAA,IAAa1hC,GAAQqkC,EAAkBrkC,EAAM8X,GAAS,IAAK9X,EAAMuF,MAAOvF,EAAKuF,MAAMtG,IAAIolC,OAE3F,CAAC9+B,IAGH,OACEjH,EAAAA,EAAAA,KAAC4mC,EAAa,IAAK7B,EAAYllC,UAE7BF,EAAAA,EAAAA,MAAC69B,EAAAA,EAAsB,CAErB6J,WAAS,EACTC,cAAY,EACZ9mC,MAAOA,EACP2lC,aAAcA,QAAAA,EAAgB,GAE9BY,SAAWrlC,GAASoZ,YAAW,IAAM3Z,aAAQ,EAARA,EAAWO,EAAaT,IAAQ,IACrEkP,QAASm2B,EACT3Z,UAAWA,EACXC,YAAaA,EACb2a,aAAcH,EAAUvnC,SAAA,CAEvBgB,IAASb,EAAAA,EAAAA,KAACw9B,EAAAA,EAAmB,CAAA39B,SAAEgB,KAEhCb,EAAAA,EAAAA,KAACgnC,EAAa,IAAKC,EAAkBpnC,UACnCG,EAAAA,EAAAA,KAACw9B,EAAAA,EAAc,CAACoF,OAAQwD,OAG1BpmC,EAAAA,EAAAA,KAAC2kC,EAAU,IACL8B,EACJ/D,WAAYA,EAEZ3tB,SAA6B,SAAnBuH,EAAMvH,SAAsB,YAAStS,EAC/CmiC,OAAQA,EACRnH,cAAuC,QAA1ByI,EAAEO,aAAS,EAATA,EAAWhJ,qBAAa,IAAAyI,EAAAA,EAAIrC,EAC3CgB,kBAAmB59B,EACnB2lB,YAAaA,EAAY/sB,SAGxBA,QAAAA,GACCG,EAAAA,EAAAA,KAAC0jC,EAAW,CACVz8B,MAAOA,EACP8N,SAA6B,SAAnBuH,EAAMvH,SAAsB,YAAStS,EAC/CkhC,YAAa+C,EACb9C,aAActnB,EAAM,eACpBunB,YAAaA,UAO3B,C,gDC1OA,MAAM2D,EAAqB,YAuBdC,GAAehoC,EAAAA,YAC1B,SAAqBL,EAUnBsd,GACA,IAAAgrB,EAAAvF,EAAA,IAVA,UACE5O,EAAS,YACTsN,EAAc,eAAc,SAC5BhhC,EAAQ,cACR8nC,EAAa,MACb5lC,EAAQ,UAAS,aACjBe,EAAe0kC,KACZlrB,GACJld,EAGD,MAAM8rB,EAAUsS,EAAAA,KACVoK,EAAe1c,aAAO,EAAPA,EAAS3L,SAAS,SACjC+c,EAASpR,aAAO,EAAPA,EAAS3L,SAAS,QAC3Bne,EAAgBumC,QAAAA,EAAiBC,EAEvC,IAAIC,EAAahH,GACbuC,EAAAA,EAAAA,IAAahiC,GAAgBymC,EAAgC,QAAtBH,EAAGtmC,EAAcP,aAAK,IAAA6mC,EAAAA,EAAItmC,EAAcZ,MACjD,iBAAlBY,GAA8BA,EAAc+C,OAAQ0jC,EAAazmC,EACxEA,IAAeymC,EAAa1uB,OAAO/X,IAE5C,MAAM0mC,GACJhjB,EAAAA,EAAAA,IAAgBhiB,KAAkC,IAAjBA,GAC/B9C,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CACH/B,MAAuB,IAAjB6B,EAAwB0kC,EAAqB1kC,EACnD/C,UAAW07B,IAAW,WAAY,CAChC,iMACY,YAAV15B,MAGJtC,EAAAA,eAAqBqD,GACvBA,OACEL,EAEN,OACEzC,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,IACDgb,EACJI,IAAKA,EACL7a,KAAK,SACLE,MAAOA,EACPwmB,OAAoB,QAAd4Z,EAAE7lB,EAAMiM,cAAM,IAAA4Z,EAAAA,EAAI7F,EACxBv8B,UAAW07B,IAAWnf,EAAMvc,UAAW,4BACvC6mB,aAAc6U,IAAWnf,EAAMsK,aAAc,WAAY,CACvD,cAAyB,YAAV7kB,IAEjBe,aACEywB,GACEvzB,EAAAA,EAAAA,KAACoqB,EAAAA,EAAO,CAACG,eAAgBud,EAAUjoC,UACjCG,EAAAA,EAAAA,KAAC8pB,EAAAA,EAAO,CAAC7mB,MAAOqZ,EAAMxH,MAAQuhB,EAAAA,GAAW/Z,EAAMxH,QAAUuhB,EAAAA,GAAW0R,QAAU,GAAK,OAGrFD,EAEHjoC,SAEAA,QAAAA,EAAYgoC,GAGnB,ICtFI1gB,IAAiBR,EAAAA,EAAAA,MAYhB,SAAS3f,GAAM5H,GAoB8C,IAAA4oC,EAAAC,EAAA,IApBE,KACpEhnC,EAAI,MACJJ,EACAL,MAAO0nC,EACP/B,aAAcgC,EAAoB,SAClChnC,EAAQ,MACR8F,EAAK,QACLm/B,EAAO,OACPxB,EAAM,YACNhY,EAAW,eACXwb,EAAc,cACdC,GAAgB,EAAI,oBACpB/B,EAAmB,aACnBgC,GAAe,EAAK,SACpB/B,EAAW,GAAE,SACbC,EACA,cAAe+B,EAAU,UACzB9B,EAAS,YACT5C,KACGvnB,GAC6Dld,EAEhE,MAAM0kC,GAAoBC,EAAAA,EAAAA,MAEpBvjC,EAA+C,QAA1CwnC,GAAGQ,EAAAA,EAAAA,IAAkBvhC,EAAOihC,UAAc,IAAAF,EAAAA,EAAIE,EACnD/B,EAA6D,QAAjD8B,GAAGO,EAAAA,EAAAA,IAAkBvhC,EAAOkhC,UAAqB,IAAAF,EAAAA,EAAIE,EAGjEM,EAAgBrC,QAAAA,GACpBpmC,EAAAA,EAAAA,KAACynC,GAAY,IACPnrB,EAEJqrB,eAAgC,IAAjBW,SAA0BrhC,GAAAA,EAAO9C,OAAU3D,OAAkCiC,EAC5F,cAAa8lC,EAAW1oC,SAEvBuoC,IAKL,IAAKC,EACH,OAAOI,EAIT,IAD4C,IAAjBH,GAA2C,WAAjBA,GAA6BnhB,GAC1D,CACtB,MAAMuhB,EAAwB5E,EAAoBnC,EAAAA,EAA8BxM,EAAAA,EAC1EgM,GAAgBwH,EAAAA,EAAAA,IAAkB1hC,EAAOihC,QAAAA,EAAiBC,GAEhE,OACExoC,EAAAA,EAAAA,MAAA,OAAKI,UAAU,kBAAiBF,SAAA,CAC7B4oC,GACDzoC,EAAAA,EAAAA,KAAC0oC,EACC,CAKAzhC,MAAQA,QAAAA,EAAS,GACjB9F,SAAWO,GAASP,aAAQ,EAARA,EAAWO,EAAaT,GAC5CT,MAAO2gC,EACPN,YAAavkB,EAAMukB,aAJdM,KAQb,CAEA,OACEnhC,EAAAA,EAAAA,KAACgmC,EAAa,IACR1pB,EACJrb,KAAMA,EACNJ,MAAOA,EACPL,MAAOA,EACP2lC,aAAcA,EACdhlC,SAAUA,EACV8F,MAAOA,EACPm/B,QAASqC,EACTlC,SAAUA,EACVC,SAAUA,EACVF,oBAAqBA,EACrB,cAAaiC,EACb3D,OAAQA,EACRhY,YAAaA,EACb6Z,UAAWA,EACX5C,YAAaA,GAGnB,C,4ICzGO,SAASO,EAAmB1iC,EAA2BknC,GAC5D,OAAIlnC,EAAKuK,KACH28B,EAAwB,CAAEjnC,GAAIknC,EAAAA,GAAMzmC,GAAIV,EAAKuK,KAAMo1B,eAAgB3/B,EAAK2/B,gBAChE,CAAE1/B,GAAI,IAAKsK,KAAMvK,EAAKuK,MAG7B,CAAC,CACV,CAEO,SAASm3B,EAAwB1hC,GACtC,QAAUA,UAAAA,EAAMonC,eAAe,UAArBpnC,MAAiCA,IAAAA,EAAMonC,eAAe,UAAcpnC,SAAAA,EAAMonC,eAAe,SACrG,CAEO,SAASrH,EAA6B//B,GAC3C,QAASA,UAAAA,EAAMonC,eAAe,SAChC,CAEA,SAASC,EAA6BrnC,EAA6BsnC,GACjE,MAAMC,EAAcD,EAAWjlB,cAE/B,MACyB,iBAAfriB,EAAKlB,OAAsBkB,EAAKlB,MAAMujB,cAAchjB,SAASkoC,IACrEvnC,EAAKb,MAAMkjB,cAAchjB,SAASkoC,EAEtC,CAEA,SAASC,EAAWC,EAAeC,GACjC,OAAIhG,EAAa+F,IAAS/F,EAAagG,GAAcD,EAAK3oC,QAAU4oC,EAAK5oC,MAChE4iC,EAAa+F,GAAcA,EAAK3oC,QAAU4oC,EAC5CD,IAASC,CAClB,CAKO,SAASnF,EACdh9B,EACA+hC,GAEA,MAAMK,EAA2B,GAWjC,OATApiC,SAAAA,EAAOgB,SAASvG,IACd,GAAI+/B,EAAkB//B,GAAO,CAC3B,MAAM4nC,EAAW5nC,EAAKuF,MAAM1G,QAAQ6H,GAAW2gC,EAAkB3gC,EAAQ4gC,KACrEM,EAASnlC,QAAQklC,EAAa15B,KAAK,IAAKjO,EAAMuF,MAAOqiC,GAC3D,MAAWP,EAAkBrnC,EAAMsnC,IACjCK,EAAa15B,KAAKjO,EACpB,IAGK2nC,CACT,CAKO,SAASb,IAGd,IAFAvhC,EAAiBoR,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,GACpB7X,EAAyC6X,UAAAlU,OAAA,EAAAkU,UAAA,QAAA5V,EAEzC,IAAK,MAAMf,KAAQuF,EACjB,GAAIw6B,EAAkB//B,GAAO,CAC3B,MAAM6nC,EAAY7nC,EAAKuF,MAAM6Q,MAAM1P,GAAW8gC,EAAW9gC,EAAQ5H,KACjE,GAAI+oC,EAAW,OAAOA,CACxB,MAAO,GAAIL,EAAWxnC,EAAMlB,GAC1B,OAAOkB,CAGb,CAKO,SAASinC,IAGd,IAFA1hC,EAAiBoR,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,GACpB7X,EAAyC6X,UAAAlU,OAAA,EAAAkU,UAAA,QAAA5V,EAEzC,IAAK,IAAI+W,EAAQ,EAAGA,EAAQvS,EAAM9C,OAAQqV,IAAS,CACjD,MAAM9X,EAAOuF,EAAMuS,GAEnB,GAAIioB,EAAkB//B,GAAO,CAC3B,MAAMw/B,EAAYx/B,EAAKuF,MAAMguB,WAAW7sB,GAAW8gC,EAAW9gC,EAAQ5H,KACtE,GAAI0gC,GAAa,EAAG,MAAO,GAAPn6B,OAAUyS,GAAKzS,OAAGm6B,EACxC,MAAO,GAAIgI,EAAWxnC,EAAMlB,GAC1B,OAAOgZ,CAEX,CAEA,OAAQ,CACV,CAEO,SAAS4nB,EAAuBn6B,GACrC,OAAOA,EAAMuiC,SAASC,GACpBhI,EAAkBgI,GAAgBA,EAAYxiC,MAAuBwiC,GAEzE,C,wRCzEA,MAAMC,EAAoB,QAEnB,SAASC,EAAevqC,GAQV,IARkD,KACrE0V,EAAI,WACJ80B,EAAU,gBACV10B,EAAe,kBACf5C,EAAiB,kBACjB8C,EAAiB,uBACjBK,EAAsB,SACtBV,GACiB3V,EACjB,MAAMyqC,EAAiBpqC,EAAAA,SAAc,IAAMyV,EAAgBs0B,SAAQ/nC,IAAA,IAAC,WAAEqoC,GAAYroC,EAAA,OAAKqoC,CAAU,KAAG,CAAC50B,IAErG,OACElV,EAAAA,EAAAA,KAACgH,EAAAA,EAAM,CACLq/B,QAASqD,EACT,aAAYA,EACZlpC,MAAO8R,EACPnR,SAAWX,IACT4U,EAAkBy0B,EAAe/xB,MAAMpW,GAASA,EAAKlB,QAAUA,IAAQ,EAEzEuU,SAAUA,EACVhS,WAAW,SACXhB,MAAM,OACN+S,KAAMA,EACNszB,gBAAgBpoC,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAK,aAC3B6B,cAAc,EACdylB,SAAQjW,QAA2B7P,EACnC,uBAAAsE,OAAsB6iC,EAAU,sBAAqB/pC,SAEpDqV,EAAgBs0B,SAAQ,CAAA5oC,EAAwB4Y,KAAK,IAA5B,MAAE3Y,EAAK,WAAEipC,GAAYlpC,EAAA,MAAY,EACzDZ,EAAAA,EAAAA,KAAC0tB,EAAAA,GAAiB,CAAA7tB,SAA4BgB,GAAK,GAAAkG,OAAxBlG,EAAK,KAAAkG,OAAIyS,OACjCswB,EAAWnpC,KAAI8nB,IAAmD,IAAlD,KAAExc,EAAI,MAAEzL,EAAK,MAAEK,EAAK,WAAE6S,EAAU,UAAEd,GAAW6V,EAC1DshB,EAAY,CAAC,EAQjB,OAPI99B,IACF89B,EAAY,CACVpoC,GAAIknC,EAAAA,GACJzmC,GAAI6J,EACJo1B,eAAgB3tB,QAAAA,GAAe/B,eAAeC,kBAIhDo4B,EAAAA,EAAAA,eAACvH,EAAAA,EAAY,IACPsH,EACJrhC,IAAKlI,EACL,uBAAAuG,OAAsB6iC,EAAU,uBAAA7iC,OAAsBvG,GACtDT,UAAU,WACVgV,SAAUA,EACVvU,MAAOA,EACPe,QAASA,KACFqR,GAAW6C,SAAAA,GAA0B,GAG3C5U,EACY,IAGpB,KAGP,C,0BC3EO,SAASopC,EAAuB7qC,GAA8B,IAA7B,MAAEyB,EAAK,UAAE0yB,GAAkBn0B,EACjE,OACEO,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAAA,QAAMD,UAAWic,IAAW,CAAEkuB,UAAW3W,IAAa1zB,SAAEgB,IACvD0yB,IACCvzB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,0EAAyEF,UACtFG,EAAAA,EAAAA,KAACoqB,EAAAA,EAAO,CAACG,gBAAgBvqB,EAAAA,EAAAA,KAAA,QAAAH,SAAOgB,IAAchB,UAC5CG,EAAAA,EAAAA,KAAC8pB,EAAAA,EAAO,CAAC7mB,MAAO,WAM5B,CCUA,MAAMknC,EAAoB,WAEnB,SAASC,EAAehrC,GAcV,IAdkD,KACrE0V,EAAI,WACJ80B,EAAU,gBACV30B,EAAe,kBACf5C,EAAiB,mBACjBN,EAAkB,UAClBwhB,GAAY,EAAK,cACjB8W,EAAa,cACbC,EAAa,kBACbn1B,EAAiB,0BACjBE,EAAyB,SACzBN,EAAQ,mBACRQ,EAAkB,MAClBxT,EAAQ,QACS3C,EACjB,MAAMmrC,EAAiB9qC,EAAAA,SAAc,IAAMwV,EAAgBu0B,SAAQ/nC,IAAA,IAAC,WAAE2R,GAAY3R,EAAA,OAAK2R,CAAU,KAAG,CAAC6B,IAE/Fu1B,EAA4B/qC,EAAAA,aAAkB,KAClD,GAAI4qC,EAAe,KAAAI,EACjB,MAAMC,EAAwBH,EAAezyB,MAAKlX,IAAA,IAAC,MAAEJ,GAAOI,EAAA,OAAKJ,IAAU6R,CAAiB,IAC5F,OAAwC,QAAxCo4B,EAAOC,aAAqB,EAArBA,EAAuBC,kBAAU,IAAAF,EAAAA,EAAIC,aAAqB,EAArBA,EAAuB7pC,KACrE,CACA,MAAO,EAAE,GACR,CAAC0pC,EAAgBF,EAAeh4B,IAEnC,OACErS,EAAAA,EAAAA,KAACgH,EAAAA,EAAM,CACLjH,UAAW07B,IAAW,CAAE,SAAoB,YAAV15B,IAClCA,MAAOA,EACP+S,KAAMA,EACNuxB,QAAS8D,EACT,aAAYA,EACZrnC,aAAwB,YAAVf,EACdgT,SAAUA,EACVwT,UAAQ8hB,GAAkBC,SAAuB7nC,EACjDM,WAAYsnC,OAAgB5nC,EAAY,SACxC2lC,eAAgBoC,IAChBhqC,MAAO+pC,EAAezyB,MAAMpW,GAASA,EAAKlB,QAAU6R,IACpDoT,aACEzlB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,mBAAkBF,UAC/BG,EAAAA,EAAAA,KAACiqC,EAAuB,CAACppC,OAAOb,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CAAC/B,KAAK,aAAesyB,UAAWA,GAAa8W,MAGtFlpC,SAAWO,GAASyT,EAAkBzT,GACtC,uBAAAqF,OAAsB6iC,EAAU,qBAAoB/pC,SAEnDoV,EAAgBu0B,SAAQ,CAAA/gB,EAAiBmiB,KAAU,IAA1B,WAAEx3B,GAAYqV,EAAA,MAAiB,EACvDzoB,EAAAA,EAAAA,KAAC0tB,EAAAA,GAAiB,gBAAA3mB,OAAmB6jC,EAAU,KAAA7jC,OAAIgL,EAAmB5N,YACnEiP,EAAWzS,KAAKe,IACjB,MAAMmpC,EAAqB94B,EAAmBhR,SAASW,EAAKlB,OAC5D,IAAIupC,EAAY,CAAC,EAQjB,OAPIroC,EAAKuK,OACP89B,EAAY,CACVpoC,GAAIknC,EAAAA,GACJzmC,GAAIV,EAAKuK,KACTo1B,iBAAkB3/B,EAAKgS,cAIzBs2B,EAAAA,EAAAA,eAACvH,EAAAA,EAAY,IACPsH,EACJvpC,MAAOkB,EACPqT,SAAUA,EACVrM,IAAG,GAAA3B,OAAKrF,EAAKlB,OAAKuG,OAAGgL,EAAmB5N,QACxC,uBAAA4C,OAAsB6iC,EAAU,sBAAA7iC,OAAqBrF,EAAKlB,OAC1DsC,aACEyS,GACE5V,EAAAA,EAAAA,MAAC2B,EAAAA,EAAM,CACLK,GAAG,MACHI,MAAM,cACNgB,WAAW,SACX,uBAAAgE,OAAsB6iC,EAAU,sBAAA7iC,OAAqBrF,EAAKlB,MAAK,oBAC/D8f,YAAc2J,IACZA,EAAGiL,kBACHjL,EAAG5pB,iBACHgV,EAA0B3T,EAAK,EAEjC3B,UAAW07B,IAAW,cAAe,CACnC,iBAAkBoP,EAClB,kBAAmBA,IAClBhrC,SAAA,EAEHG,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CACH/B,KAAK,OACLlB,UAAW07B,IAAW,CACpB,qBAAsBoP,EACtB,4BAA6BA,OAGjC7qC,EAAAA,EAAAA,KAACgD,EAAAA,GAAI,CACH/B,KAAK,eACLlB,UAAW07B,IAAW,CACpB,sBAAuBoP,EACvB,2BAA4BA,cAIhCpoC,GAGLf,EAAKb,MACO,IAGpB,KAGP,CC3GA,SAASiqC,EAAyB1rC,GAAuE,IAAtE,UAAEwT,EAAS,WAAEg3B,GAAuDxqC,EACrG,MAAO,GAAP2H,OAAU6iC,EAAU,KAAA7iC,OAAI6L,EAC1B,CAEA,SAASm4B,EAAiBj2B,GACxB,OAAQA,GACN,KAAKuhB,EAAAA,GAAW0R,QAChB,KAAK1R,EAAAA,GAAW2U,OAChB,KAAK3U,EAAAA,GAAWzO,MAChB,KAAKyO,EAAAA,GAAWC,QACd,MAAO,QACT,KAAKD,EAAAA,GAAW4U,OACd,MAAO,UACT,KAAK5U,EAAAA,GAAW6U,MACd,MAAO,SACT,KAAK7U,EAAAA,GAAW8O,KACd,MAAO,OAEb,CAEO,SAAStwB,EAAYpT,GAwBI,IAxB2E,UACzGiQ,EAAYC,eAAeC,eAAc,WACzCg4B,EAAa,EAAC,2BACdt0B,EAA6B,IAAG,gBAChCL,EAAe,gBACfC,EAAe,kBACf7C,EAAiB,kBACjBC,EAAiB,mBACjBP,EAAkB,iBAClBo5B,EAAgB,kBAChBh2B,EAAiB,kBACjBC,EAAiB,uBACjBK,EAAsB,0BACtBJ,EAAyB,KACzBP,EAAI,SACJC,EAAQ,qBACRq2B,GAAuB,EAAI,iBAC3BC,EAAgB,UAChBtrC,EAAS,mBACTwV,GAAqB,EAAI,wBACzB+1B,GAA0B,EAAI,yBAC9B91B,EAAwB,cACxB80B,GAAgB,EAAK,MACrBvoC,GAC4BN,EAC5B,MAAO8pC,EAAsBC,GAA2B/rC,EAAAA,SAAsC,OACvFgsC,EAAgCC,GAAqCjsC,EAAAA,SAAe,CACzFksC,cAAc,EACdC,eAAe,KAEX,cAAEC,EAAa,aAAEC,IAAiBC,EAAAA,EAAAA,GAAkBV,GACpDd,EAAiB9qC,EAAAA,SAAc,IAAMwV,EAAgBu0B,SAAQ5oC,IAAA,IAAC,WAAEwS,GAAYxS,EAAA,OAAKwS,CAAU,KAAG,CAAC6B,IAE/F+2B,EAA4BvsC,EAAAA,SAChC,IACE8V,EACIg1B,EAAehqC,QAAOkoB,IAAA,IAAC,MAAEjoB,GAAOioB,EAAA,OAAKjoB,IAAU6R,GAAqBN,EAAmBhR,SAASP,EAAM,IACtG+pC,GACN,CAACA,EAAgBl4B,EAAmBN,EAAoBwD,IAGpD80B,EACJC,GAAiBwB,EAAex2B,GAA8B02B,EAA0B7nC,QAAU,EAC9F8nC,EAAsCxsC,EAAAA,aAAkB,KAC5D,GAAI8rC,EAAsB,CACxB,MAAMI,EAAmD,IAApCJ,EAAqBW,WACpCN,EACJ79B,KAAKo+B,KAAKZ,EAAqBxY,YAAcwY,EAAqBW,aAClEX,EAAqBa,YAGrBX,EAA+BE,eAAiBA,GAChDF,EAA+BG,gBAAkBA,GAEjDF,EAAkC,CAAEC,eAAcC,iBAEtD,IACC,CAACH,EAAgCF,IAqBpC,OAnBA9rC,EAAAA,WAAgB,KACdwsC,GAAqC,GACpC,CAACA,EAAqCV,EAAsBO,IAE/DrsC,EAAAA,WAAgB,KACd,IAAK4qC,GAAiBiB,EAAyB,CAC7C,MAAMe,EAAmBz/B,SAASC,eAChCi+B,EAA0B,CAAElB,aAAYh3B,UAAWP,KAGrD,GAAIg6B,GAAoBd,EAAsB,CAC5C,MAAMe,EACJD,EAAiBE,WAAaF,EAAiBG,YAAc,EAAIjB,EAAqBiB,YAAc,EAEtGjB,EAAqBkB,SAAS1+B,KAAKgN,IAAI,EAAGhN,KAAK1I,IAAIinC,EAAYf,EAAqBa,cAAe,EACrG,CACF,IACC,CAAC/B,EAAeT,EAAYv3B,EAAmBy5B,EAAcR,EAAyBC,KAGvF5rC,EAAAA,EAAAA,MAAA,OACEI,UAAWic,IACT,oFACA,CACE,aAAcjc,GAEhBA,GAEF2c,IAAKmvB,EAAchsC,SAAA,EAEjB2V,QAAAA,EAA4BD,KAC5BvV,EAAAA,EAAAA,KAAA,OAAKD,UAAWic,IAAW,CAAE,aAAcsuB,EAAe,YAAaA,IAAiBzqC,UACtFG,EAAAA,EAAAA,KAACoqC,EAAe,CACdroC,MAAOA,EACP6nC,WAAYA,EACZ90B,KAAMA,EACNC,SAAUA,EACV1C,kBAAmBA,EACnB4C,gBAAiBA,EACjBlD,mBAAoBA,EACpBs4B,cAAeA,EACfC,cAAeA,EACf/W,YAAa4X,GAAoBd,EACjCh1B,0BAA2BA,EAC3BF,kBAAmBA,EACnBI,mBAAoBA,OAIxB80B,IACA1qC,EAAAA,EAAAA,MAAA,OAAKI,UAAU,kDAAiDF,SAAA,EAC9DG,EAAAA,EAAAA,KAAA,OACED,UAAWic,IACT,8IACA,CAAE,YAAayvB,EAA+BE,kBAGlD3rC,EAAAA,EAAAA,KAAA,OACE0c,IAAK8uB,EACLzrC,UAAU,6EACV2sC,SAAUT,EACVU,QAAU3uB,IAMR,MAAM4uB,EAAQ7+B,KAAKC,IAAIgQ,EAAM6uB,QACf9+B,KAAKC,IAAIgQ,EAAM8uB,QACjBF,IACV5uB,EAAMtZ,cAAcwnC,YAAcluB,EAAM8uB,OAC1C,EACAjtC,SAEDmsC,EAA0BrrC,KAAKiS,IAC9B,IAAIm3B,EAAY,CAAC,EACG,IAAAgD,EAAhBn6B,EAAU3G,KACZ89B,EAAY,CACVpoC,GAAIknC,EAAAA,GACJzmC,GAAIwQ,EAAU3G,KACdo1B,eAAoC,QAAtB0L,EAAEn6B,EAAUc,kBAAU,IAAAq5B,EAAAA,GAAKr7B,EACzCnQ,QAASA,IAAM4T,EAAkBvC,IAGnCm3B,EAAY,CACVxoC,QAAU0oB,IACRA,EAAG5pB,iBACH8U,EAAkBvC,EAAU,GAIlC,OACEo3B,EAAAA,EAAAA,eAAC1oC,EAAAA,EAAM,IACDyoC,EACJrhC,IAAKkK,EAAUpS,MACfL,GAAI2qC,EAA0B,CAAElB,aAAYh3B,UAAWA,EAAUpS,QACjET,UAAU,8BACV,uBAAAgH,OAAsB6iC,EAAU,wBAAA7iC,OAAuB6L,EAAUpS,OACjEuB,MAAM,kBACN+S,KAAMA,EACNinB,QAASgP,EAAiB1U,EAAAA,GAAWvhB,QAAAA,EAAQ,YAC7CyT,OAAQ3V,EAAUpS,QAAU6R,EAC5B0C,SAAUA,IAEV/U,EAAAA,EAAAA,KAACiqC,EAAuB,CACtBppC,MAAO+R,EAAU+3B,WACjBpX,UAAW4X,IAAqBv4B,EAAUpS,QAErC,OAIfR,EAAAA,EAAAA,KAAA,OACED,UAAWic,IACT,+IACA,CAAE,YAAayvB,EAA+BG,qBAKrDR,IACCprC,EAAAA,EAAAA,KAAA,OAAKD,UAAU,YAAWF,UACxBG,EAAAA,EAAAA,KAAC2pC,EAAe,CACdC,WAAYA,EACZ90B,KAAMA,EACNI,gBAAiBA,EACjB5C,kBAAmBA,EACnB8C,kBAAmBA,EACnBL,SAAUA,EACVU,uBAAwBA,QAMpC,C,gLC5NO,MAAMu3B,EAA0B,WAAyC,IAAxCt7B,IAAS2G,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,KAAAA,UAAA,GAC/C,MAAM40B,EAAuC,CAC3C,CACEpsC,MAAO,GACPuS,WAAY,CACV,CAAE5S,MAAO0sC,EAAAA,GAAUC,GAAItsC,MAAO,WAAY8pC,WAAY,MACtD,CAAEnqC,MAAO0sC,EAAAA,GAAUE,GAAIvsC,MAAO,YAAa8pC,WAAY,MACvD,CAAEnqC,MAAO0sC,EAAAA,GAAUG,GAAIxsC,MAAO,YAAa8pC,WAAY,MACvD,CAAEnqC,MAAO0sC,EAAAA,GAAUI,GAAIzsC,MAAO,YAAa8pC,WAAY,MACvD,CAAEnqC,MAAO0sC,EAAAA,GAAUK,IAAK1sC,MAAO,aAAc8pC,WAAY,OACzD,CAAEnqC,MAAO0sC,EAAAA,GAAUM,IAAK3sC,MAAO,aAAc8pC,WAAY,OACzD,CAAEnqC,MAAO0sC,EAAAA,GAAUO,IAAK5sC,MAAO,aAAc8pC,WAAY,SAG7D,CACE9pC,MAAO,GACPuS,WAAY,CACV,CAAE5S,MAAO0sC,EAAAA,GAAUlrB,EAAGnhB,MAAO,SAAU8pC,WAAY,KAAM+C,eAAgB,UACzE,CAAEltC,MAAO0sC,EAAAA,GAAUS,GAAI9sC,MAAO,UAAW8pC,WAAY,MACrD,CAAEnqC,MAAO0sC,EAAAA,GAAUU,GAAI/sC,MAAO,UAAW8pC,WAAY,QAGzD,CACE9pC,MAAO,GACPuS,WAAY,CACV,CAAE5S,MAAO0sC,EAAAA,GAAUW,EAAGhtC,MAAO,QAAS8pC,WAAY,IAAK+C,eAAgB,SACvE,CAAEltC,MAAO0sC,EAAAA,GAAUY,EAAGjtC,MAAO,SAAU8pC,WAAY,IAAK+C,eAAgB,UACxE,CAAEltC,MAAO0sC,EAAAA,GAAUa,EAAGltC,MAAO,UAAW8pC,WAAY,IAAK+C,eAAgB,cAKzEM,EAAiB,CACrB,CAEEntC,MAAO,GACPuS,WAAY,CAAC,CAAE5S,MAAO,WAAqBK,MAAO,WAAY8pC,WAAY,cAE5E,CACE9pC,MAAO,GACPuS,WAAY,CACV,CAAE5S,MAAO0sC,EAAAA,GAAUW,EAAGhtC,MAAO,QAAS8pC,WAAY,SAClD,CAAEnqC,MAAO0sC,EAAAA,GAAUY,EAAGjtC,MAAO,SAAU8pC,WAAY,UACnD,CAAEnqC,MAAO0sC,EAAAA,GAAUa,EAAGltC,MAAO,UAAW8pC,WAAY,cAK1D,OAAOj5B,EAAYu7B,EAAoBe,CACzC,EAEO,SAAS96B,EAAmBxB,GACjC,OAAOs7B,EAAwBt7B,EACjC,CAEO,MAAMu8B,EAA0B7uC,IAMlB,IANmB,UACtCsS,EAAS,WACTqC,GAID3U,EACC,MAAM8uC,EAAUn6B,IAAeC,EAAAA,EAAWC,MA6B1C,MA5ByE,CACvE,CACEpT,MAAO,OACPipC,WAAY,CACV,CAAEtpC,MAAO2tC,EAAAA,EAAcC,GAAIvtC,MAAO,QAAS+R,UAAWs7B,EAAUhB,EAAAA,GAAUC,GAAKD,EAAAA,GAAUI,IACzF,CAAE9sC,MAAO2tC,EAAAA,EAAcE,GAAIxtC,MAAO,SAAU+R,UAAWs7B,EAAUhB,EAAAA,GAAUI,GAAKJ,EAAAA,GAAUO,OAG9F,CACE5sC,MAAO,SACPipC,WAAY,CACV,CAAEtpC,MAAO2tC,EAAAA,EAAcG,GAAIztC,MAAO,UAAW+R,UAAWs6B,EAAAA,GAAUW,GAClE,CAAErtC,MAAO2tC,EAAAA,EAAcI,GAAI1tC,MAAO,WAAY+R,UAAWs6B,EAAAA,GAAUW,GACnE,CAAErtC,MAAO2tC,EAAAA,EAAcK,GAAI3tC,MAAO,WAAY+R,UAAWs6B,EAAAA,GAAUW,KAGvE,CACEhtC,MAAO,QACPipC,WAAY,CACV,CAAEtpC,MAAO2tC,EAAAA,EAAcM,IAAK5tC,MAAO,eAAgB+R,UAAWs6B,EAAAA,GAAUW,GACxE,CAAErtC,MAAO2tC,EAAAA,EAAcO,GAAI7tC,MAAO,SAAU+R,UAAWs6B,EAAAA,GAAUW,GACjE,CAAErtC,MAAO2tC,EAAAA,EAAcQ,GAAI9tC,MAAO,UAAW+R,UAAWs6B,EAAAA,GAAUY,GAClE,CAAEttC,MAAO2tC,EAAAA,EAAcS,GAAI/tC,MAAO,UAAW+R,UAAWlB,EAAYw7B,EAAAA,GAAUY,EAAIZ,EAAAA,GAAUa,GAC5F,CAAEvtC,MAAO2tC,EAAAA,EAAcpzB,IAAKla,MAAO,MAAO+R,UAAWs6B,EAAAA,GAAUa,KAKnD,EAGb,SAASc,EAAkBptC,GAU/B,IAVgC,UACjCiQ,EAAS,YACTmC,EAAW,kBACXC,GAAoB,EAAI,WACxBC,GAMDtS,EACC,MAAMqtC,EAAcb,EAAwB,CAAEv8B,YAAWqC,eAEzD,GAAIrC,IAAmC,IAAtBoC,EAA6B,KAAAi7B,EAC5C,MAAOC,GAAiE,QAAjDD,EAAGl7B,aAAW,EAAXA,EAAa3P,MAAM+qC,UAA2B,IAAAF,EAAAA,EAAI,GAC5ED,EAAYn/B,KAAK,CACfm6B,WAAY,CACV,CACEtpC,MACEqT,GAAevL,OAAOC,OAAe2mC,GAA2BnuC,SAASiuC,GACrEn7B,EACAs7B,EACNtuC,MAAO,YAIf,CAEA,OAAOiuC,CACT,CAEO,SAASl7B,EAA0BhT,GAcvC,IAdwC,UACzC8Q,EAAS,YACTmC,EAAW,aACXK,EAAY,WACZR,EAAU,kBACVI,EAAiB,WACjBC,GAQDnT,EACC,OAAOiuC,EAAmB,CACxBn9B,YACAoC,oBACAD,cACAE,eACCpT,KAAKyuC,IAA2B,CACjCvuC,MAAOuuC,EAAevuC,MACtBipC,WAAYsF,EAAetF,WAAWnpC,KAAKyC,IAAS,IAC/CA,EACH6I,MACGyF,GAAapJ,OAAOC,OAAO4lC,EAAAA,GAAeptC,SAASqC,EAAU5C,OAC1D0T,EAAa9Q,QACbX,EACNiR,WAAYA,QAAAA,GAAehC,SAGjC,CAEA,MAAM29B,EAAqB,CAAC,IAAK,IAAK,KAE/B,SAAS/7B,EAAiCmV,GAgB9C,IAhB+C,UAChD/W,EAAS,SACT6B,EAAQ,UACRX,EAAS,UACTxP,EAAS,YACToQ,EAAW,eACXw6B,EAAiBqB,EAAkB,kBACnC57B,EAAoB,KASrBgV,EACC,OAAI/W,GAAas8B,EAAejtC,SAAS6R,GAChC,CACLW,WACAmB,OAAQ,IAAF3N,QAAMmF,EAAAA,EAAAA,GAAkB,KACzBJ,EAAAA,EAAAA,KACH0D,OAAG/M,EACHiQ,EAAGE,EACH,CAACa,GAAoBrQ,QAAAA,OAAaX,MAKjC,CACL8Q,SAAU,cACVmB,OAAQ,IAAF3N,QAAMmF,EAAAA,EAAAA,GAAkB,CAC5BojC,WAAY,SACZC,WAAY,SACZC,aAAch8B,GAAezH,OAAOC,SAASuH,YAGnD,CAEO,MAAMk8B,EAAoE,CAC/E,CAACC,EAAAA,GAA2BC,WAAY,kBACxC,CAACD,EAAAA,GAA2BE,aAAc,oBAC1C,CAACF,EAAAA,GAA2BG,WAAY,kBACxC,CAACH,EAAAA,GAA2BI,YAAa,oBAG9BC,EAAoE,CAC/E,CAACL,EAAAA,GAA2BE,aAAc,8BAC1C,CAACF,EAAAA,GAA2BG,WAAY,4BACxC,CAACH,EAAAA,GAA2BI,YAAa,8BCnOpC,IAAKZ,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,cAAzBA,EAAyB,YAAzBA,CAAyB,MAK9B,MAAMC,EAAoB,SACpBF,EAA6B,IACpCe,EAA8B,IAC9BC,EAA8B,IAE7B,SAASC,EAAmB9sC,GAAoB,IAAA+sC,EACrD,OAAmD,QAAnDA,EAAO/sC,aAAS,EAATA,EAAWc,MAAM+qC,UAA2B,IAAAkB,EAAAA,EAAI,EACzD,CAEO,SAASC,EAA4BhxC,GAAqE,IAApE,UAAEgE,EAAS,WAAEmR,GAAqDnV,EAC7G,MAAO4vC,EAAiBqB,GAAkBH,EAAmB9sC,GAE7D,GAAI4rC,IAAoBE,EAA0BoB,MAAO,CACvD,MAAOC,EAAgBC,GAAgBH,EAAe/hC,QAAQ,KAAM,KAAKpK,MAAM8rC,GACzES,EAAWF,EAAiB,IAAItuC,KAAKsuC,GAAkB,KACvDG,EAASF,EAAe,IAAIvuC,KAAKuuC,GAAgB,KACvD,MAAO,CACLzV,MAAO0V,IAAaxiC,OAAO2J,MAAM64B,EAAS54B,WAAa44B,EAAW,KAClEE,IAAKD,IAAWziC,OAAO2J,MAAM84B,EAAO74B,WAAa+4B,EAAAA,EAAiBF,GAAU,KAEhF,CAEA,GAAI1B,IAAoBE,EAA0B2B,KAAM,CACtD,MAAOC,EAAOC,EAAQC,GAAQX,EAAensC,MAAM+rC,GAA6BtvC,IAAIsN,QAEpF,MAAI,CAAC6iC,EAAOC,EAAQC,GAAMnrC,KAAKoI,OAAO2J,OAC7B,CAAEmjB,MAAO,KAAM4V,IAAK,MAGtB,CACL5V,MAAO6V,EAAAA,EAAmBA,EAAAA,EAAYr8B,EAAY,CAAEu8B,QAAOC,SAAQC,KAAMA,EAAO,KAChFL,IAAKp8B,EAET,CAEA,MAAO,CAAEwmB,MAAO,KAAM4V,IAAKp8B,EAC7B,CAOA,MAAM08B,EAAe,IAoDd,SAASt7B,EAAyBu7B,GAUtC,IAVuC,UACxC9tC,EAAS,WACTmR,EAAU,WACVR,EAAU,UACVrC,GAMDw/B,EACC,MAAMC,EAxBD,SAAqC1oB,GAQzC,IAAA2oB,EAAAC,EAAA,IAR0C,UAC3CjuC,EAAS,UACTsO,GAAY,EAAI,WAChBqC,GAKD0U,EAEC,OAAqE,QAArE2oB,EAA0D,QAA1DC,EADmBpD,EAAwB,CAAEv8B,YAAWqC,eAAcy1B,SAAQ9gB,IAAA,IAAC,WAAEohB,GAAYphB,EAAA,OAAKohB,CAAU,IAC1FhyB,MAAKw5B,IAAA,IAAC,MAAE9wC,GAAO8wC,EAAA,OAAK9wC,IAAU4C,CAAS,WAAC,IAAAiuC,OAAA,EAAnDA,EAAqDz+B,iBAAS,IAAAw+B,EAAAA,EAAI,IAC3E,CAa6BG,CAA6B,CAAEnuC,YAAW2Q,eACrE,GAAIo9B,EACF,OAAOA,EAET,MAAM,MAAEpW,EAAK,IAAE4V,GAAQP,EAA6B,CAAEhtC,YAAWmR,eAC3Di9B,EAAczW,QAAAA,EAAS,IAAI94B,KAAK,GAChCwvC,EAAgCb,EAAAA,EAAiCr8B,EAAYi9B,GAAe,EAC5FE,EAAiBd,EAAAA,EAAiCD,QAAAA,EAAOp8B,EAAYi9B,GAAe,EAK1F,GAAIE,EAAiB,EAAIT,EACvB,OAAO/D,EAAAA,GAAUa,EAGnB,GAAI2D,EAAiB,EAAIT,EACvB,OAAOv/B,EAAYw7B,EAAAA,GAAUY,EAAIZ,EAAAA,GAAUa,EAG7C,GAAI2D,EAAiB,IAAMT,EACzB,OAAO/D,EAAAA,GAAUY,EAInB,GAAI/5B,IAAeC,EAAAA,EAAWC,MAAO,CACnC,GAAIy9B,GAAkB,GAAKD,GAAiC,GAC1D,OAAOvE,EAAAA,GAAUC,GAGnB,GAAIuE,GAAkB,GAAKD,GAAiC,GAC1D,OAAOvE,EAAAA,GAAUI,GAGnB,GAAIoE,GAAkB,GAAKD,GAAiC,IAC1D,OAAOvE,EAAAA,GAAUO,GAErB,KAAO,CACL,GAAIgE,GAAiC,EACnC,OAAOvE,EAAAA,GAAUI,GAEnB,GAAImE,GAAiC,EACnC,OAAOvE,EAAAA,GAAUO,GAErB,CAEA,OAAOP,EAAAA,GAAUW,CACnB,CCvJA,MACM8D,GAAuB,IAAI1vC,KAAK,SAAD8E,OADb,OAElB6qC,IAAkB,IAAI3vC,MAAO4vC,cAFX,KAIlBC,GAA0B,CAAEjwC,KAAM,SAAU9B,UAAW,SAAU6mB,aAAc,eAE9E,IAAKmrB,GAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,uBAAfA,EAAAA,EAAe,mBAAfA,CAAe,MA+B3B,MAAMC,GAAoC,CACxCC,KAAMF,GAAgBG,OACtBlB,KAAM,EACND,OAAQ,EACRD,MAAO,GAGHqB,GAAyC,CAC7CF,KAAMF,GAAgBK,SACtBrX,MAAO,KACP4V,IAAK,MAiDA,SAASj7B,GAAe+S,GAMR,IANS,YAC9B/c,EAAW,UACXtI,EAAS,WACTmR,EAAU,eACVJ,EAAc,WACdk+B,GACmB5pB,EACnB,MAAO6pB,EAAaC,GAAkB9yC,EAAAA,SA7CxC,SAA+B2D,GAC7B,GAAIA,EAAW,CACb,MAAO4rC,GAAmBkB,EAAmB9sC,GAC7C,GAAI4rC,IAAoBE,EAA0BoB,MAChD,OAAOyB,GAAgBK,SAEzB,GAAIpD,IAAoBE,EAA0B2B,KAChD,OAAOkB,GAAgBG,MAE3B,CACA,OAAOH,GAAgBK,QACzB,CAkCuDI,CAAsBpvC,KAEpE7D,EAAOC,GAAYC,EAAAA,SAlC5B,SAA+BmB,GAMP,IANQ,UAC9BwC,EAAS,WACTmR,GAID3T,EACC,GAAIwC,EAAW,CACb,MAAO4rC,GAAmBkB,EAAmB9sC,IACvC,MAAE23B,EAAK,IAAE4V,GAAQP,EAA6B,CAAEhtC,YAAWmR,eACjE,GAAIy6B,IAAoBE,EAA0BoB,MAChD,MAAO,CAAE2B,KAAMF,GAAgBK,SAAUrX,QAAO4V,OAElD,GAAI3B,IAAoBE,EAA0B2B,MAAQ9V,GAAS4V,EAAK,CACtE,MAAM,MAAEG,EAAK,OAAEC,EAAM,KAAEC,GAASJ,EAAAA,EAA2B,CACzD7V,MAAO6V,EAAAA,EAAY7V,EAAO,CAAEiW,KAAM,IAClCL,QAEF,MAAO,CAAEsB,KAAMF,GAAgBG,OAAQpB,QAAOC,SAAQC,OACxD,CACF,CAEA,OAAOmB,EACT,CAWgEM,CAAuB,CAAErvC,YAAWmR,iBAE1FjD,QAASnQ,GAAa1B,EAAAA,QAAa,CAACwyC,EAAuBS,KACjElzC,GAAUmzC,IACR,GAAIV,IAASF,GAAgBG,OAAQ,CAEnC,MAAO,KADUS,aAAS,EAATA,EAAWV,QAASF,GAAgBG,OAASS,EAAYX,MACjDU,EAC3B,CACA,GAAIT,IAASF,GAAgBK,SAAU,CACrC,MAEMQ,EAAW,KAFAD,aAAS,EAATA,EAAWV,QAASF,GAAgBK,SAAWO,EAAYR,MAEzCO,GACnC,GAAIE,EAAS7X,OAAS6X,EAASjC,KAAOiC,EAAS7X,MAAMljB,UAAY+6B,EAASjC,IAAI94B,UAAW,CACvF,MAAMg7B,EAAS,IAAI5wC,KAAK2wC,EAAS7X,MAAMljB,WACvC+6B,EAAS7X,MAAQ6X,EAASjC,IAC1BiC,EAASjC,IAAMkC,CACjB,CACA,OAAOD,CACT,CACA,OAAOD,CAAS,GAChB,IAqBEG,GAAavzC,aAAK,EAALA,EAAO0yC,QAASF,GAAgBK,SAC7CW,EAAWD,EAAavzC,EAAMw7B,MAAQoX,GAAwBpX,MAC9DiY,EAASF,EAAavzC,EAAMoxC,IAAMwB,GAAwBxB,IAE1DsC,EAAc,IACfjB,OACCzyC,aAAK,EAALA,EAAO0yC,QAASF,GAAgBG,OAAS3yC,EAAQ,CAAC,GAGxD,OACEI,EAAAA,EAAAA,MAAC0M,EAAAA,GAAM,CAACtM,UAAU,QAAQ,aAAW,eAAeR,MAAOmM,EAAY7L,SAAA,EACrEG,EAAAA,EAAAA,KAACsM,EAAAA,GAAY,CAACvM,UAAU,UAASF,SAAC,uBAClCF,EAAAA,EAAAA,MAAA,QAAML,SA9BY2qB,IACpBA,EAAG5pB,iBAEH,IAAI+C,EAAY,KAEhB,IAAI7D,aAAK,EAALA,EAAO0yC,QAASF,GAAgBK,UA/ExC,SAAkC3wC,GAAgC,IAA/B,MAAEs5B,EAAK,IAAE4V,GAAoBlvC,EAC9D,SAAUs5B,IAAS4V,EACrB,CA6EoDuC,CAA0B3zC,GACxE6D,ED3FC,SAA2C3B,GAA2D,IAA1D,MAAEs5B,EAAK,IAAE4V,GAA+ClvC,EACzG,MAAM0xC,EAAcpY,GAAQp4B,EAAAA,EAAAA,IAAqBo4B,GAAS,GACpDqY,EAAYzC,GAAMhuC,EAAAA,EAAAA,IAAqBguC,GAAO,GAUpD,MARoB,CAClBzB,EAA0BoB,MAC1BrB,EACAkE,EACAnD,EACAoD,GAGiBzqC,KAAK,IAAI2F,QAAQ,MAAO,IAC7C,CC8EkB+kC,CAAmC,CAAEtY,MAAOx7B,EAAMw7B,MAAO4V,IAAKpxC,EAAMoxC,WAC3E,IAAIpxC,aAAK,EAALA,EAAO0yC,QAASF,GAAgBG,QArF/C,SAAgC9yC,GAAmD,IAAlD,MAAE0xC,EAAQ,EAAC,OAAEC,EAAS,EAAC,KAAEC,EAAO,GAAgB5xC,EAC/E,OAAO0xC,EAAQC,EAASC,EAAO,CACjC,CAmFyDsC,CAAwB/zC,GAAQ,KAAAg0C,EAAAC,EAAAC,EACnFrwC,ED9EC,SAAuCxC,GAQ3C,IAR4C,MAC7CkwC,EAAK,OACLC,EAAM,KACNC,GAKDpwC,EAWC,MAVoB,CAClBsuC,EAA0B2B,KAC1B5B,EACA6B,EACAb,EACAc,EACAd,EACAe,GAGiBroC,KAAK,GAC1B,CC0DkB+qC,CAA+B,CACzC1C,KAAgB,QAAZuC,EAAEh0C,EAAMyxC,YAAI,IAAAuC,EAAAA,EAAI,EACpBxC,OAAoB,QAAdyC,EAAEj0C,EAAMwxC,cAAM,IAAAyC,EAAAA,EAAI,EACxB1C,MAAkB,QAAb2C,EAAEl0C,EAAMuxC,aAAK,IAAA2C,EAAAA,EAAI,GAE1B,CAEAt/B,EAAe,CAAE/Q,aAAY,EAeEvD,SAAA,EAC3BF,EAAAA,EAAAA,MAACG,EAAAA,GAAU,CAACC,UAAU,0BAAyBF,SAAA,EAC7CF,EAAAA,EAAAA,MAACyb,EAAAA,EAAW,CAACC,YAAY,EAAMxb,SAAA,EAC7BG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,IACDwwC,GACJvpB,OAAQ+pB,IAAgBP,GAAgBK,SACxC7wC,QAASA,IAAMgxC,EAAeR,GAAgBK,UAAUvyC,SACzD,iBAGDG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,IACDwwC,GACJvpB,OAAQ+pB,IAAgBP,GAAgBG,OACxC3wC,QAASA,IAAMgxC,EAAeR,GAAgBG,QAAQryC,SACvD,aAKFyyC,IAAgBP,GAAgBK,UAC/BzyC,EAAAA,EAAAA,MAAA,OAAKI,UAAU,mCAAkCF,SAAA,EAC/CG,EAAAA,EAAAA,KAACuC,EAAAA,EAAU,CACT/B,MAAOuyC,EACPvwC,QAASmvC,GACTxwC,SAAW45B,GAAgB55B,EAAS4wC,GAAgBK,SAAU,CAAErX,UAASl7B,UAEzEG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CAAC/B,MAAM,QAAQmkB,WAAW,YAAYxkB,MAAOuyC,GAAWpwC,EAAAA,EAAAA,IAAqBowC,GAAY,QAEjG/yC,EAAAA,EAAAA,KAACuC,EAAAA,EAAU,CACT/B,MAAOwyC,EACPxwC,QAASmvC,GACTxwC,SAAWwvC,GAAcxvC,EAAS4wC,GAAgBK,SAAU,CAAEzB,QAAO9wC,UAErEG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CAAC/B,MAAM,MAAMmkB,WAAW,YAAYxkB,MAAOwyC,GAASrwC,EAAAA,EAAAA,IAAqBqwC,GAAU,WAI7FrzC,EAAAA,EAAAA,MAAA,OAAKI,UAAU,mCAAkCF,SAAA,EAC/CG,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,QACNgB,KAAK,SACLrB,MAAOyyC,EAAYnC,MACnBzrC,IAAK,EACL0V,IAAK62B,GACLzwC,SAAW8oB,GACT9oB,EAAS4wC,GAAgBG,OAAQ,CAAEpB,MAAO7iC,OAAOuU,SAASyH,EAAGvlB,cAAclE,YAG/ER,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,SACNgB,KAAK,SACLrB,MAAOyyC,EAAYlC,OACnB1rC,IAAK,EACL0V,IAAK,GACL5Z,SAAW8oB,GACT9oB,EAAS4wC,GAAgBG,OAAQ,CAAEnB,OAAQ9iC,OAAOuU,SAASyH,EAAGvlB,cAAclE,YAGhFR,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,CACJ/B,MAAM,OACNgB,KAAK,SACLrB,MAAOyyC,EAAYjC,KACnB3rC,IAAK,EACL0V,IAAK,GACL5Z,SAAW8oB,GACT9oB,EAAS4wC,GAAgBG,OAAQ,CAAElB,KAAM/iC,OAAOuU,SAASyH,EAAGvlB,cAAclE,kBAMpFb,EAAAA,EAAAA,MAAC0B,EAAAA,GAAY,CAAAxB,SAAA,EACXG,EAAAA,EAAAA,KAAA,OAAKD,UAAU,OAAMF,UACnBG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CACLO,KAAK,SACLkb,SAAUs1B,EACV9wC,QAASA,IACP/B,EAASD,EAAM0yC,OAASF,GAAgBG,OAASF,GAAuBG,IACzEtyC,SACF,aAIHG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASkb,SAAUs1B,EAAY1wC,GAAIC,EAAAA,GAAc/B,SAAC,WAG/DG,EAAAA,EAAAA,KAACsB,EAAAA,EAAM,CAACO,KAAK,SAASE,MAAM,OAAOgb,SAAUs1B,EAAWxyC,UACtDF,EAAAA,EAAAA,MAAA,OAAKI,UAAU,8BAA6BF,SAAA,CACzCwyC,IACCryC,EAAAA,EAAAA,KAACoqB,EAAAA,EAAO,CAAAvqB,UACNG,EAAAA,EAAAA,KAAC8pB,EAAAA,EAAO,CAAC7mB,MAAO,OAEjB,KACHjD,EAAAA,EAAAA,KAAA,QAAAH,SAAM,yBAOpB,C,gBC7PO,SAASyU,GAAwBlV,GAKC,IALA,WACvCmV,EAAU,WACVR,EAAU,cACVU,EAAa,uBACbD,GAAyB,GACYpV,EACrC,MAAMwiC,GAAWC,EAAAA,GAAAA,MACXztB,GAA6BlE,EAAAA,EAAAA,MAE7BwB,EAAYC,eAAeC,eAE3ByC,EAAwB5U,EAAAA,aAC5B,CAAAgC,EAEEyY,KACG,IAFH,MAAE1Z,EAAK,UAAEoS,EAAS,KAAE3G,GAA2DxK,EAG/E,GAAKmR,EAAL,CAEA,IAAK3G,GAAQwI,EAAe,CAC1B,MAAMk/B,EAAOl/B,EAAc,CAAE7B,YAAWxP,UAAW5C,IAC/CgU,EACFzI,OAAOC,SAASC,KAAO,GAAHlF,OAAM4sC,EAAKpgC,SAAQ,KAAAxM,OAAI4sC,EAAKj/B,QAEhDktB,EAAS+R,EAEb,CAEAz5B,SAAAA,EAAW,CAAE1Z,QAAOoS,YAAW3G,QAXT,CAWgB,GAExC,CAAC21B,EAAUntB,EAAeD,IAGtBo/B,EAAwBn0C,EAAAA,aAC3B2D,GACMmR,GAAeR,GAAe3Q,EAE5B,CACL5C,MAAO4C,EACPwP,UAAW+C,EAA0B,CACnCvS,UAAWA,EACXmR,aACA7C,YACAqC,gBARiD,MAYvD,CAACQ,EAAYR,EAAYrC,IAgB3B,MAAO,CAAEyC,eAbc1U,EAAAA,aACrBmB,IAA4F,IAAzFJ,MAAO4C,EAAWwP,UAAWihC,GAAuDjzC,EACrFyT,EAAsB,CACpB7T,MAAO4C,EACPwP,UAAWihC,IAEbz/B,EAA2BkT,MAAM,GAInC,CAAClT,EAA2BkT,KAAMjT,IAGXD,6BAA4BC,wBAAuBu/B,wBAC9E,C,gBChFO,MAAME,GAA8B,CACzC,CAAC5G,EAAAA,GAAUC,KAAK,EAChB,CAACD,EAAAA,GAAUE,KAAK,EAChB,CAACF,EAAAA,GAAUG,KAAK,EAChB,CAACH,EAAAA,GAAUI,KAAK,EAChB,CAACJ,EAAAA,GAAUK,MAAM,EACjB,CAACL,EAAAA,GAAUM,MAAM,EACjB,CAACN,EAAAA,GAAUO,MAAM,EACjB,CAACP,EAAAA,GAAUlrB,IAAI,EACf,CAACkrB,EAAAA,GAAUS,KAAK,EAChB,CAACT,EAAAA,GAAUU,KAAK,EAChB,CAACV,EAAAA,GAAUW,IAAI,EACf,CAACX,EAAAA,GAAUY,IAAI,EACf,CAACZ,EAAAA,GAAUa,IAAI,GAGJgG,GAAmC,IAC3CD,GACHE,UAAU,GAGNC,GAAoB,wBAEnB,SAAShiC,KAAwC,IAAlBP,IAAS2G,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,KAAAA,UAAA,GAC7C,MAAM,MAAE9Y,EAAK,SAAEC,GCxBV,SAAwC00C,EAAoB/N,GACjE,MAAO5mC,EAAOC,GAAYC,EAAAA,SAA0B00C,GAAAA,SAAiBD,EAAY/N,IAejF,OAbA1mC,EAAAA,WAAgB,KACd,MAAMgmC,EAAe0O,GAAAA,mBAA2BD,EAAY/N,EAAc3mC,GAE1E,MAAO,KACLimC,EAAaprB,aAAa,CAC3B,GACA,CAAC65B,EAAY/N,IAOT,CACL5mC,QACAC,SAPeC,EAAAA,aACd20C,GAAiDD,GAAAA,SAAiBD,EAAYE,EAAajO,IAC5F,CAACA,EAAc+N,IAOnB,CDI8BG,CAC1BJ,GACAviC,EAAYoiC,GAA8BC,IAGtC/hC,EAA0BvS,EAAAA,aAC7BmT,IACCpT,GAAUmzC,IAAS,IACdA,EACH,CAAC//B,IAAa+/B,EAAU//B,MACvB,GAEL,CAACpT,IAGGuS,EAAqBtS,EAAAA,SACzB,IAAM6I,OAAOkQ,KAAKjZ,GAAOgB,QAAQmI,GAAQnJ,EAAMmJ,MAC/C,CAACnJ,IAGH,MAAO,CACLwS,mBAAoBL,EAAYK,EAAqBzJ,OAAOkQ,KAAKu7B,IACjE/hC,0BAEJ,C,8FEpCA,SAASsiC,EAAmBl1C,GAMC,IANA,SAC3BS,EAAQ,eACR00C,EAAc,aACdC,EAAY,gBACZC,EAAe,KACfxzC,GACyB7B,EACzB,MAAMinC,GAAUqO,EAAAA,EAAAA,IAAgB,CAAE/nB,UAAW,YAAa8nB,KACpD,cAAElrB,IAAkBC,EAAAA,EAAAA,IAAuB6c,GAEjD,OACE1mC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEG,EAAAA,EAAAA,KAAC20C,EAAAA,GAAc,CAACp1C,MAAO8mC,EAAS7lB,UAAW,EAAGo0B,sBAAoB,EAAA/0C,SAC/DA,IAEF00C,IAAmBhrB,IAClBvpB,EAAAA,EAAAA,KAAC60C,EAAAA,GAAO,CACN90C,UAAU,cACVI,GAAIc,EACJ1B,MAAO8mC,EACPzpB,MAAO43B,EACP,cAAavzC,SAAAA,EAAMkD,OAAS,GAAH4C,OAAM9F,EAAI,iBAAawB,EAAU5C,SAEzD00C,MAKX,CAEA,SAASO,EAAqBrzC,EAQ5Bib,GACA,IARA,eACE63B,EAAc,aACdC,EAAY,gBACZC,EAAe,cACfpM,GAAgB,KACb/rB,GAC4D7a,EAGjE,MAAMuV,GAAQhX,EAAAA,EAAAA,KAAC4C,EAAAA,GAAK,IAAK0Z,EAAOI,IAAKA,IAErC,OAAK2rB,GAKHroC,EAAAA,EAAAA,KAACs0C,EAAmB,CAClBrzC,KAAMqb,EAAMrb,KACZszC,eAAgBA,EAChBC,aAAcA,EACdC,gBAAiBA,EAAgB50C,SAEhCmX,IAVIA,CAaX,CAEO,MAAM+9B,EAAet1C,EAAAA,WAAiBq1C,E,oEChE7C,MAAME,EAAsB,uBACtBC,EAA6B,CACjCC,UAAW,YAAFnuC,OAAciuC,EAAmB,qCAMrC,SAAS3lB,EAAmBjwB,GAAoE,IAAnE,eAAEkwB,EAAc,uBAAEC,EAAsB,QAAEC,EAAO,MAAEjwB,GAAcH,EACnG,MAAM,YAAEggC,IAAgBC,EAAAA,EAAAA,GAAc,CAAEC,WAAY//B,EAAMipB,SAAWjpB,EAAM0sB,YACrEsT,EAAgBhgC,EAAMigC,sBAAsBluB,QA0BlD,OAxBA7R,EAAAA,WAAgB,KACd,IAAK8/B,IAAkBhgC,EAAMipB,UAAY+G,EAAwB,OAGjE,MAAMkQ,EAAaF,EAAcnhB,yBAC1B,CAAE+2B,GAAW3lB,EACpB,IAAI4lB,EAAmB,OACvB,GAAI71C,EAAMotB,UAAU9J,WAAW,UAAW,CACxC,IAAIhE,EAASugB,EAAcK,EAAWnR,OAAmB,EAAV6mB,EAG3C1V,EAAWnR,OAAS,IAAGzP,GAAU9S,OAAOmiB,SAC5CknB,EAAmB,GAAHruC,OAAMgH,KAAK1I,IAAIwZ,EAAQyQ,GAAe,KACxD,KAAO,CACL,MAAMzQ,EAAS4gB,EAAW/gB,IAAgB,EAAVy2B,EAChCC,EAAmB,GAAHruC,OAAMgH,KAAK1I,IAAIwZ,EAAQyQ,GAAe,KACxD,CAGA,MAAMoQ,EAAYH,EAAcxyB,aAAa,iBACvC4yB,EAAiBD,EAAY9yB,SAASC,eAAe6yB,GAAa,KACxEC,SAAAA,EAAgB/wB,MAAMgxB,YAAYoV,EAAqBI,EAAiB,GACvE,CAAC7V,EAAeH,EAAa9P,EAAgBC,EAAwBC,EAASjwB,EAAMotB,UAAWptB,EAAMipB,UAEjG+G,EAAyB0lB,OAA6BxyC,CAC/D,C,4EC1CO,SAAS48B,IAAyE,IAA3D,iBAAEgW,EAAmB,IAAG,WAAE/V,GAAa,GAAajnB,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpF,MAAOvD,EAAMwgC,GAAW71C,EAAAA,SAAe,CACrC81C,WAAYxpC,OAAOwpC,WACnBnW,YAAarzB,OAAOqzB,cAqBtB,OAlBA3/B,EAAAA,WAAgB,KACd,IAAK6/B,EAAY,OAEjB,MAAMkW,EAAe3iB,KAAS,KAC5ByiB,EAAQ,CACNC,WAAYxpC,OAAOwpC,WACnBnW,YAAarzB,OAAOqzB,aACpB,GACDiW,GAIH,OAFAtpC,OAAO6K,iBAAiB,SAAU4+B,GAE3B,KACLA,EAAaC,SACb1pC,OAAO8K,oBAAoB,SAAU2+B,EAAa,CACnD,GACA,CAACH,EAAkB/V,IAEfxqB,CACT,C,6IC9BA,IAAI4gC,EAMG,SAASC,EACdjtC,EACAy9B,EACAyP,GAEKF,IAASA,EAAU,IAAIG,EAAAA,cAE5B,MAAM10C,EAAYX,IAChB,MAAMkyC,EAAWlyC,QAAAA,EAASs1C,EAASptC,EAAKy9B,GACxCY,EAASr+B,EAAKgqC,EAAUvM,GAAc,GACtCyP,SAAAA,EAAiBlD,EAAS,EAGtBqD,EAAmB9rB,IACvB,GAAIA,EAAGvhB,MAAQA,EACb,IACE,MAAMlI,EAAQypB,EAAGyoB,SAAWsD,KAAKC,MAAMhsB,EAAGyoB,UAAY,KACtDvxC,EAASX,QAAAA,EAAS2lC,EACpB,CAAE,MACAhlC,EAASglC,EACX,CACF,EAMF,OAHAuP,EAAQQ,YAAYxtC,EAAKvH,GACzB4K,OAAO6K,iBAAiB,UAAWm/B,GAE5B,CACLL,UACAr7B,YAAaA,KAAM,IAAA87B,EACV,QAAPA,EAAAT,SAAO,IAAAS,GAAPA,EAASC,eAAe1tC,EAAKvH,GAC7B4K,OAAO8K,oBAAoB,UAAWk/B,EAAgB,EAG5D,CAKO,SAASD,EAAoBptC,EAAay9B,GAC/C,IACE,MAAM3lC,EAAQo3B,aAAaC,QAAQnvB,GAC7B2tC,EAAc71C,EAAQw1C,KAAKC,MAAMz1C,GAAS,KAChD,OAAO61C,QAAAA,EAAelQ,CACxB,CAAE,MACA,OAAOA,CACT,CACF,CAMO,SAASY,EACdr+B,EACA0rC,EACAjO,GAEA,IADAmQ,IAAIj+B,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,KAAAA,UAAA,GAEJ,IAAI,IAAAk+B,EACF,MAAMh3C,EAAQu2C,EAASptC,EAAKy9B,GACtBqQ,EAAepC,aAAuBqC,SAAWrC,EAAY70C,GAAS60C,EAE5Exc,aAAaY,QAAQ9vB,EAAKstC,KAAKU,UAAUF,IACrCF,IAAa,QAAPC,EAAAb,SAAO,IAAAa,GAAPA,EAASD,KAAK5tC,EAAK8tC,GAC/B,CAAE,MAAO,CACX,CAMO,SAASG,EAAYjuC,GAA0B,IAAb4tC,IAAIj+B,UAAAlU,OAAA,QAAA1B,IAAA4V,UAAA,KAAAA,UAAA,GAC3C,IAAI,IAAAu+B,EACFhf,aAAaif,WAAWnuC,GACpB4tC,IAAa,QAAPM,EAAAlB,SAAO,IAAAkB,GAAPA,EAASN,KAAK5tC,OAAKjG,GAC/B,CAAE,MAAO,CACX,CAKO,SAASq0C,EACdpuC,EAKAquC,EACA5Q,GAEA,IACE,MAAM6Q,EAAWlB,EAAgCptC,OAAKjG,GACtD,QAAwB,IAAbu0C,EAA0B,OAErCjQ,EAASr+B,EADaquC,aAA0BN,SAAWM,EAAeC,GAAYD,EACzD5Q,GAAc,EAC7C,CAAE,MAAO,CACX,C,kBCtGO,SAAS/rB,EAAuBF,GACrC,IAAI+8B,EAA+C,KAEnD,OAAOr8B,iBACmB,OAApBq8B,IAEJA,EAAkB/8B,UACZ+8B,EACNA,EAAkB,KACpB,CACF,C,kCCbA,IAAIC,EAAI,EAAQ,OACZnoC,EAAO,EAAQ,OACfooC,EAAc,EAAQ,OACtBC,EAAyB,EAAQ,OACjCC,EAAa,EAAQ,OACrBC,EAAoB,EAAQ,MAC5BC,EAAW,EAAQ,OACnB3iC,EAAW,EAAQ,OACnB4iC,EAAY,EAAQ,OACpBC,EAAiB,EAAQ,OACzBC,EAAkB,EAAQ,OAC1BC,EAAkB,EAAQ,OAC1BC,EAAU,EAAQ,OAElBC,EAAUF,EAAgB,WAC1BG,EAAaC,UACbpyC,EAAUwxC,EAAY,GAAGxxC,SACzB2I,EAAU6oC,EAAY,GAAG7oC,SACzB0pC,EAAcb,EAAY,GAAG1qC,OAC7BsO,EAAMhN,KAAKgN,IAIfm8B,EAAE,CAAE3c,OAAQ,SAAU0d,OAAO,GAAQ,CACnC5oC,WAAY,SAAoBs0B,EAAauU,GAC3C,IACIC,EAAYC,EAAOC,EAAUC,EAAQC,EAAcC,EAAmBC,EAAcC,EAAWC,EAD/FC,EAAIxB,EAAuBtqC,MAE3BqX,EAAW,EACX00B,EAAiB,EACjB1hC,EAAS,GACb,IAAKmgC,EAAkB3T,GAAc,CAEnC,IADAwU,EAAaZ,EAAS5T,MAEpByU,EAAQxjC,EAASwiC,EAAuBK,EAAe9T,OACjDh+B,EAAQyyC,EAAO,MAAM,MAAM,IAAIN,EAAW,mDAGlD,GADAO,EAAWb,EAAU7T,EAAakU,GAEhC,OAAO9oC,EAAKspC,EAAU1U,EAAaiV,EAAGV,GACjC,GAAIN,GAAWO,EACpB,OAAO7pC,EAAQsG,EAASgkC,GAAIjV,EAAauU,EAE7C,CAQA,IAPAI,EAAS1jC,EAASgkC,GAClBL,EAAe3jC,EAAS+uB,IACxB6U,EAAoBnB,EAAWa,MACPA,EAAetjC,EAASsjC,IAChDO,EAAeF,EAAap0C,OAC5Bu0C,EAAY39B,EAAI,EAAG09B,GACnBt0B,EAAWxe,EAAQ2yC,EAAQC,IACN,IAAdp0B,GACLw0B,EAAcH,EACV5jC,EAASsjC,EAAaK,EAAcp0B,EAAUm0B,IAC9CZ,EAAgBa,EAAcD,EAAQn0B,EAAU,QAAI1hB,EAAWy1C,GACnE/gC,GAAU6gC,EAAYM,EAAQO,EAAgB10B,GAAYw0B,EAC1DE,EAAiB10B,EAAWs0B,EAC5Bt0B,EAAWA,EAAWu0B,EAAYJ,EAAOn0C,QAAU,EAAIwB,EAAQ2yC,EAAQC,EAAcp0B,EAAWu0B,GAKlG,OAHIG,EAAiBP,EAAOn0C,SAC1BgT,GAAU6gC,EAAYM,EAAQO,IAEzB1hC,CACT,G","sources":["webpack://@finviz/website/./js/app/screener/filter-modal/default-filter.tsx","webpack://@finviz/website/./js/app/screener/date-range.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/earningsdate-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/epsrev-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/float-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/highlow-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/ipodate-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/options-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/period-range-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/sma-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/targetprice-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/volatility-filter.tsx","webpack://@finviz/website/./js/app/screener/filter-modal/filter-dialog.tsx","webpack://@finviz/website/./js/app/screener/use-custom-range-controller.tsx","webpack://@finviz/website/./js/app/screener/use-hide-custom-controller.tsx","webpack://@finviz/website/./js/app/screener/use-tickers-input-controller.tsx","webpack://@finviz/website/./js/app/screener/screener-premium.tsx","webpack://@finviz/website/./js/app/screener/screener-timeframe-bar.tsx","webpack://@finviz/website/./js/app/screener/index.tsx","webpack://@finviz/website/./js/app/screener/utils.ts","webpack://@finviz/website/./js/app/shared/documentVisibility.ts","webpack://@finviz/website/./js/main/components/button-group/button-group.tsx","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/date-picker/index.tsx","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-separator.tsx","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/tabs/tabs.tsx","webpack://@finviz/website/./js/main/components/tabs/tab.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-list.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-panel.tsx","webpack://@finviz/website/./js/main/components/badge.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/components/popover/popover.tsx","webpack://@finviz/website/./js/main/components/popover/hooks.ts","webpack://@finviz/website/./js/main/components/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/select/NativeSelect.tsx","webpack://@finviz/website/./js/main/components/select/ItemsGroup.tsx","webpack://@finviz/website/./js/main/components/select/SelectOption.tsx","webpack://@finviz/website/./js/main/components/select/SelectItems.tsx","webpack://@finviz/website/./js/main/components/select/SelectList.tsx","webpack://@finviz/website/./js/main/components/select/SelectTooltipWrapper.tsx","webpack://@finviz/website/./js/main/components/select/DesktopSelect.tsx","webpack://@finviz/website/./js/main/components/select/SelectButton.tsx","webpack://@finviz/website/./js/main/components/select/Select.tsx","webpack://@finviz/website/./js/main/components/select/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/daterange-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/label-with-delayed-spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-bar.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range-utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-custom-date-range-dialog.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-favorite-timeframes.tsx","webpack://@finviz/website/./js/main/hooks/use-sync-local-storage.ts","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/hooks/use-popover-maxHeight.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/services/local-storage.ts","webpack://@finviz/website/./js/main/services/wait-for-previous-promise.ts","webpack://@finviz/website/../node_modules/core-js/modules/es.string.replace-all.js"],"sourcesContent":["import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { Checkbox } from '../../../main/components/checkbox'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Heading } from '../../../main/components/typography'\r\nimport { getIsOptionDateRange } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nexport default function DefaultFilter({ config, onSubmit }: FilterProps) {\r\n const [state, setState] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n setState(config.selectedValues)\r\n }, [config])\r\n\r\n const handleSelectAll = () => {\r\n setState(config.options.map(({ value }) => value).filter((item) => item !== 'stocksonly'))\r\n }\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n const filters = [...state.filter((value) => !getIsOptionDateRange(value))]\r\n\r\n onSubmit(filters)\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n Match any of the following:\r\n \r\n
\r\n
\r\n {config.options.map(({ label, value }) => {\r\n const isChecked = state.includes(value)\r\n return (\r\n
\r\n \r\n setState(isChecked ? state.filter((selectedValue) => value !== selectedValue) : [...state, value])\r\n }\r\n >\r\n {label}\r\n \r\n
\r\n )\r\n })}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../main/components/button'\r\nimport { DatePicker } from '../../main/components/date-picker'\r\nimport { Icon } from '../../main/components/icon'\r\nimport { Input } from '../../main/components/input'\r\nimport { formatDateToStringUS } from '../shared/utils'\r\n\r\ninterface DateRangeProps {\r\n from?: string\r\n to?: string\r\n onChangeFrom: (from: string | undefined) => void\r\n onChangeTo: (to: string | undefined) => void\r\n}\r\n\r\nconst MIN_DATE = new Date('01/01/1900')\r\n\r\nexport function DateRange({ from, to, onChangeFrom, onChangeTo }: DateRangeProps) {\r\n return (\r\n
\r\n
\r\n {\r\n onChangeFrom(formatDateToStringUS(newFrom))\r\n }}\r\n >\r\n {\r\n onChangeFrom(undefined)\r\n }}\r\n >\r\n \r\n \r\n ) : undefined\r\n }\r\n value={from ?? ''}\r\n />\r\n \r\n
\r\n
\r\n {\r\n onChangeTo(formatDateToStringUS(newTo))\r\n }}\r\n >\r\n {\r\n onChangeTo(undefined)\r\n }}\r\n >\r\n \r\n \r\n ) : undefined\r\n }\r\n value={to ?? ''}\r\n />\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { Checkbox } from '../../../main/components/checkbox'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Heading } from '../../../main/components/typography'\r\nimport { formatDateToStringUS } from '../../shared/utils'\r\nimport { DateRange } from '../date-range'\r\nimport { dateRangeToFilterString, getInitialDateFromSelectedValues, getIsOptionDateRange } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nexport default function EarningDateFilter({ config, onSubmit }: FilterProps) {\r\n const [state, setState] = React.useState([])\r\n const [dateRange, setDateRange] = React.useState<{ from?: string; to?: string }>({})\r\n\r\n React.useEffect(() => {\r\n const initialDate = getInitialDateFromSelectedValues(config.selectedValues)\r\n\r\n if (initialDate) {\r\n setDateRange({ from: initialDate[0], to: initialDate[1] })\r\n }\r\n setState(config.selectedValues)\r\n }, [config])\r\n\r\n const handleSelectAll = () => {\r\n setState(config.options.map(({ value }) => value))\r\n }\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n const dateRangeStr = dateRangeToFilterString(dateRange)\r\n const filters = [...state.filter((value) => !getIsOptionDateRange(value)), dateRangeStr]\r\n\r\n onSubmit(filters)\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n Match any of the following:\r\n \r\n
\r\n
\r\n {config.options.map(({ label, value }) => {\r\n const isChecked = state.includes(value)\r\n return (\r\n
\r\n \r\n setState(isChecked ? state.filter((selectedValue) => value !== selectedValue) : [...state, value])\r\n }\r\n >\r\n {label}\r\n \r\n
\r\n )\r\n })}\r\n
\r\n
\r\n \r\n Custom date range:\r\n \r\n {\r\n setDateRange({ ...dateRange, from })\r\n }}\r\n onChangeTo={(to) => {\r\n setDateRange({ ...dateRange, to })\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { Heading } from '../../../main/components/typography'\r\nimport { rangesToFilter } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nconst DELIMITER = 'x'\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\n\r\nexport default function EarningsAndRevenueFilter({ config, onSubmit }: FilterProps) {\r\n const [earningsRange, setEarningsRange] = React.useState(DEFAULT_RANGE)\r\n const [revenueRange, setRevenueRange] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const parts = filter.split(DELIMITER)\r\n\r\n if (parts.length === 2) {\r\n const [eFrom = '', eTo = ''] = parts[0].includes('to') ? parts[0].split('to') : []\r\n const [rFrom = '', rTo = ''] = parts[1].includes('to') ? parts[1].split('to') : []\r\n\r\n setEarningsRange({ from: eFrom, to: eTo })\r\n setRevenueRange({ from: rFrom, to: rTo })\r\n }\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n onSubmit([rangesToFilter([earningsRange, revenueRange])])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n Match all of the following:\r\n \r\n
\r\n
\r\n
\r\n

EPS Surprise

\r\n
\r\n
\r\n {\r\n setEarningsRange({ ...earningsRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setEarningsRange({ ...earningsRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n\r\n
\r\n
\r\n

Revenue Surprise

\r\n
\r\n
\r\n {\r\n setRevenueRange({ ...revenueRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setRevenueRange({ ...revenueRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { Heading } from '../../../main/components/typography'\r\nimport { rangesToFilter } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nconst DELIMITER = 'x'\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\n\r\nexport default function FloatFilter({ config, onSubmit }: FilterProps) {\r\n const [sharesRange, setSharesRange] = React.useState(DEFAULT_RANGE)\r\n const [pctRange, setPctRange] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const parts = filter.split(DELIMITER)\r\n\r\n const [aFrom = '', aTo = ''] = parts[0].includes('to') ? parts[0].split('to') : []\r\n const [bFrom = '', bTo = ''] = parts[1]?.includes('to') ? parts[1].split('to') : []\r\n\r\n setSharesRange({ from: aFrom, to: aTo })\r\n setPctRange({ from: bFrom, to: bTo })\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n onSubmit([rangesToFilter([sharesRange, pctRange])])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n Match any of the following:\r\n \r\n
\r\n
\r\n {\r\n setSharesRange({ ...sharesRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setSharesRange({ ...sharesRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n\r\n
\r\n {\r\n setPctRange({ ...pctRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setPctRange({ ...pctRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Select } from '../../../main/components'\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { Heading } from '../../../main/components/typography'\r\nimport { rangesToFilter } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nconst DELIMITER = 'x'\r\nconst SETTINGS_DELIMITER = '-'\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\nconst PRICE_OPTIONS = [\r\n { value: 'a', label: 'Above' },\r\n { value: 'b', label: 'Below' },\r\n]\r\nconst EXTREMA_OPTIONS = [\r\n { value: 'h', label: 'High' },\r\n { value: 'l', label: 'Low' },\r\n]\r\n\r\nconst parseData = (filterValue: string): [{ from: string; to: string }, string, string] | undefined => {\r\n if (filterValue.indexOf(SETTINGS_DELIMITER) > 0) {\r\n const rangeAndOptions = filterValue.split(SETTINGS_DELIMITER)\r\n if (\r\n rangeAndOptions[1].length === 2 &&\r\n PRICE_OPTIONS.some(({ value }) => value === rangeAndOptions[1][0]) &&\r\n EXTREMA_OPTIONS.some(({ value }) => value === rangeAndOptions[1][1])\r\n ) {\r\n const [from = '', to = ''] = rangeAndOptions[0].includes('to') ? rangeAndOptions[0].split('to') : []\r\n\r\n return [{ from, to }, rangeAndOptions[1][0], rangeAndOptions[1][1]]\r\n }\r\n }\r\n}\r\n\r\nexport default function HighLowFilter({ config, onSubmit }: FilterProps) {\r\n const [price1, setPrice1] = React.useState(PRICE_OPTIONS[1].value)\r\n const [price2, setPrice2] = React.useState(PRICE_OPTIONS[0].value)\r\n const [extreme1, setExtreme1] = React.useState(EXTREMA_OPTIONS[0].value)\r\n const [extreme2, setExtreme2] = React.useState(EXTREMA_OPTIONS[1].value)\r\n const [range1, setRange1] = React.useState(DEFAULT_RANGE)\r\n const [range2, setRange2] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const parts = filter.split(DELIMITER)\r\n if (parts.length !== 2) {\r\n return\r\n }\r\n\r\n // Parse 1. part containing range, price and extreme\r\n const parsedData1 = parseData(parts[0])\r\n if (parsedData1 !== undefined) {\r\n const [{ from, to }, price, extreme] = parsedData1\r\n setRange1({ from, to })\r\n setPrice1(price)\r\n setExtreme1(extreme)\r\n }\r\n\r\n // Parse 2. part containing range, price and extreme\r\n const parsedData2 = parseData(parts[1])\r\n if (parsedData2 !== undefined) {\r\n const [{ from, to }, price, extreme] = parsedData2\r\n setRange2({ from, to })\r\n setPrice2(price)\r\n setExtreme2(extreme)\r\n }\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n onSubmit([\r\n rangesToFilter(\r\n [range1, range2],\r\n [`${SETTINGS_DELIMITER}${price1}${extreme1}`, `${SETTINGS_DELIMITER}${price2}${extreme2}`]\r\n ),\r\n ])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n Match any of the following:\r\n \r\n
\r\n
\r\n {\r\n setRange1({ ...range1, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setRange1({ ...range1, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n {\r\n setPrice1(item.value)\r\n }}\r\n />\r\n
\r\n
\r\n {\r\n setExtreme1(item.value)\r\n }}\r\n />\r\n
\r\n {\r\n setRange2({ ...range2, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setRange2({ ...range2, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n {\r\n setPrice2(item.value)\r\n }}\r\n />\r\n
\r\n
\r\n {\r\n setExtreme2(item.value)\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { formatDateToStringUS } from '../../shared/utils'\r\nimport { DateRange } from '../date-range'\r\nimport { dateRangeToFilterString, getInitialDateFromSelectedValues } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nexport default function IpoDateFilter({ config, onSubmit }: FilterProps) {\r\n const [dateRange, setDateRange] = React.useState<{ from?: string; to?: string }>({})\r\n\r\n React.useEffect(() => {\r\n const initialDate = getInitialDateFromSelectedValues(config.selectedValues)\r\n if (initialDate) {\r\n setDateRange({ from: initialDate[0], to: initialDate[1] })\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n const dateRangeStr = dateRangeToFilterString(dateRange)\r\n\r\n onSubmit([dateRangeStr])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n {\r\n setDateRange({ ...dateRange, from })\r\n }}\r\n onChangeTo={(to) => {\r\n setDateRange({ ...dateRange, to })\r\n }}\r\n />\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Select } from '../../../main/components'\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Label } from '../../../main/components/typography'\r\nimport { FilterProps } from './types'\r\n\r\nconst ARRAY_DELIMITER = '|'\r\nconst OPTIONS = [\r\n { value: 'any', label: 'Any' },\r\n { value: 'yes', label: 'Yes' },\r\n { value: 'no', label: 'No' },\r\n]\r\n\r\nconst PRESETS_MAP: { [key: string]: string } = {\r\n 'option|short': 'optionshort',\r\n 'option|notshort': 'optionnotshort',\r\n 'notoption|short': 'notoptionshort',\r\n 'notoption|notshort': 'notoptionnotshort',\r\n}\r\n\r\nexport default function OptionsFilter({ onSubmit, config }: FilterProps) {\r\n const [optionable, setOptionable] = React.useState(OPTIONS[0].value)\r\n const [shortable, setShortable] = React.useState(OPTIONS[0].value)\r\n const [shortsalerestricted, setShortSaleRestricted] = React.useState(OPTIONS[0].value)\r\n const [halted, setHalted] = React.useState(OPTIONS[0].value)\r\n\r\n const setValues = React.useCallback((item: string) => {\r\n const getYesNo = (value: string) => (value.includes('not') ? 'no' : 'yes')\r\n switch (item) {\r\n case 'option':\r\n case 'notoption':\r\n setOptionable(getYesNo(item))\r\n break\r\n case 'short':\r\n case 'notshort':\r\n setShortable(getYesNo(item))\r\n break\r\n case 'shortsalerestricted':\r\n case 'notshortsalerestricted':\r\n setShortSaleRestricted(getYesNo(item))\r\n break\r\n case 'halted':\r\n case 'nothalted':\r\n setHalted(getYesNo(item))\r\n break\r\n case 'optionshort':\r\n setOptionable('yes')\r\n setShortable('yes')\r\n break\r\n case 'optionnotshort':\r\n setOptionable('yes')\r\n setShortable('no')\r\n break\r\n case 'notoptionshort':\r\n setOptionable('no')\r\n setShortable('yes')\r\n break\r\n case 'notoptionnotshort':\r\n setOptionable('no')\r\n setShortable('no')\r\n break\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n config.selectedValues.forEach((item) => {\r\n setValues(item)\r\n })\r\n }, [config, setValues])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n const str = [\r\n { option: optionable },\r\n { short: shortable },\r\n { shortsalerestricted: shortsalerestricted },\r\n { halted: halted },\r\n ]\r\n .filter((item) => Object.values(item).every((value) => value !== 'any'))\r\n .map((item) => Object.entries(item).map(([key, value]) => `${value === 'yes' ? '' : 'not'}${key}`))\r\n .join(ARRAY_DELIMITER)\r\n\r\n onSubmit([PRESETS_MAP[str] ?? str])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Select } from '../../../main/components'\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { Label } from '../../../main/components/typography'\r\nimport { rangesToFilter } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\n\r\ntype PeriodRangeFilterProps = {\r\n periodOptions: { value: string; label: string }[]\r\n useOverUnderLabels?: boolean\r\n} & FilterProps\r\n\r\nexport default function PeriodRangeFilter({\r\n onSubmit,\r\n config,\r\n periodOptions,\r\n useOverUnderLabels,\r\n}: PeriodRangeFilterProps) {\r\n const [selectedPeriod, setSelectedPeriod] = React.useState()\r\n const [periodRange, setPeriodRange] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const delimiterIndex = filter.lastIndexOf('-')\r\n const period = filter.substring(delimiterIndex + 1)\r\n const range = filter.substring(0, delimiterIndex)\r\n\r\n if (!periodOptions.some(({ value }) => value === period)) {\r\n return\r\n }\r\n setSelectedPeriod(period)\r\n\r\n if (range) {\r\n const [from, to] = range.split('to')\r\n setPeriodRange({ from, to })\r\n }\r\n }\r\n }, [config, periodOptions])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n onSubmit([selectedPeriod ? rangesToFilter([periodRange], [`-${selectedPeriod}`]) : null])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {\r\n setPeriodRange({ ...periodRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n {\r\n setPeriodRange({ ...periodRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Select } from '../../../main/components'\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { rangesToFilter } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nconst DELIMITER = '-'\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\nconst OPTIONS = [\r\n { value: 'a', label: 'Above' },\r\n { value: 'b', label: 'Below' },\r\n]\r\n\r\nexport default function SMAFilter({ onSubmit, config }: FilterProps) {\r\n const [option, setOption] = React.useState(OPTIONS[0].value)\r\n const [range, setRange] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const [filterRange, filterOption] = filter.split(DELIMITER)\r\n\r\n if (!OPTIONS.some(({ value }) => value === filterOption)) {\r\n return\r\n }\r\n setOption(filterOption)\r\n\r\n if (filterRange) {\r\n const [from, to] = filterRange.split('to')\r\n setRange({ from, to })\r\n }\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n onSubmit([rangesToFilter([range], [`${DELIMITER}${option}`])])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n {\r\n setRange({ ...range, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setRange({ ...range, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n {\r\n setOption(item.value)\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n

{config.filter.substring(3).toUpperCase()}

\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { Heading } from '../../../main/components/typography'\r\nimport { rangesToFilter } from '../utils'\r\nimport { FilterProps } from './types'\r\n\r\nconst DELIMITER = 'x'\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\n\r\nexport default function TargetPriceFilter({ config, onSubmit }: FilterProps) {\r\n const [aboveRange, setAboveRange] = React.useState(DEFAULT_RANGE)\r\n const [belowRange, setBelowRange] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const parts = filter.split(DELIMITER)\r\n\r\n if (parts.length === 2) {\r\n const [aFrom = '', aTo = ''] = parts[0].includes('to') ? parts[0].split('to') : []\r\n const [bFrom = '', bTo = ''] = parts[1].includes('to') ? parts[1].split('to') : []\r\n\r\n setAboveRange({ from: aFrom, to: aTo })\r\n setBelowRange({ from: bFrom, to: bTo })\r\n }\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n onSubmit([rangesToFilter([aboveRange, belowRange])])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n Match any of the following:\r\n \r\n
\r\n
\r\n
\r\n {\r\n setAboveRange({ ...aboveRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setAboveRange({ ...aboveRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n

Above Price

\r\n
\r\n
\r\n\r\n
\r\n
\r\n {\r\n setBelowRange({ ...belowRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n {\r\n setBelowRange({ ...belowRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n

Below Price

\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogDismiss, DialogFooter } from '../../../main/components/dialog'\r\nimport { Input } from '../../../main/components/input'\r\nimport { FilterProps } from './types'\r\n\r\nconst WEEK_MONTH_DELIMITER = 'x'\r\nconst DEFAULT_RANGE = { from: '', to: '' }\r\n\r\nexport default function VolatilityFilter({ config, onSubmit }: FilterProps) {\r\n const [weekRange, setWeekRange] = React.useState(DEFAULT_RANGE)\r\n const [monthRange, setMonthRange] = React.useState(DEFAULT_RANGE)\r\n\r\n React.useEffect(() => {\r\n const filter = config.selectedValues[0]\r\n if (filter) {\r\n const parts = filter.split(WEEK_MONTH_DELIMITER)\r\n\r\n if (parts.length === 2) {\r\n const [wFrom = '', wTo = ''] = parts[0].includes('to') ? parts[0].split('to') : []\r\n const [mFrom = '', mTo = ''] = parts[1].includes('to') ? parts[1].split('to') : []\r\n\r\n setWeekRange({ from: wFrom, to: wTo })\r\n setMonthRange({ from: mFrom, to: mTo })\r\n }\r\n }\r\n }, [config])\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault()\r\n const { from: wMin, to: wMax } = weekRange\r\n const { from: mMin, to: mMax } = monthRange\r\n const weekRangeStr = wMin || wMax ? `${wMin}to${wMax}` : null\r\n const monthRangeStr = mMin || mMax ? `${mMin}to${mMax}` : null\r\n\r\n let volatilityFilter = ''\r\n if (weekRangeStr) volatilityFilter += weekRangeStr\r\n if (weekRangeStr || monthRangeStr) volatilityFilter += WEEK_MONTH_DELIMITER\r\n if (monthRangeStr) volatilityFilter += monthRangeStr\r\n\r\n onSubmit([volatilityFilter])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n

Week

\r\n
\r\n
\r\n {\r\n setWeekRange({ ...weekRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n {\r\n setWeekRange({ ...weekRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n\r\n
\r\n

Month

\r\n
\r\n
\r\n {\r\n setMonthRange({ ...monthRange, from: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n {\r\n setMonthRange({ ...monthRange, to: e.currentTarget.value })\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Dialog, DialogHeader, DialogProps } from '../../../main/components/dialog'\r\nimport { decodeQueryString, encodeQueryString } from '../../queryString'\r\nimport { parseScreenerFilters, stringifyScreenerFilters } from '../utils'\r\nimport DefaultFilter from './default-filter'\r\nimport EarningDateFilter from './earningsdate-filter'\r\nimport EarningsAndRevenueFilter from './epsrev-filter'\r\nimport FloatFilter from './float-filter'\r\nimport HighLowFilter from './highlow-filter'\r\nimport IpoDateFilter from './ipodate-filter'\r\nimport OptionsFilter from './options-filter'\r\nimport PeriodRangeFilter from './period-range-filter'\r\nimport SMAFilter from './sma-filter'\r\nimport TargetPriceFilter from './targetprice-filter'\r\nimport { ConfigType } from './types'\r\nimport VolatilityFilter from './volatility-filter'\r\n\r\nconst PERFORMANCE_OPTIONS = [\r\n { value: 'i1', label: '1 Minute' },\r\n { value: 'i2', label: '2 Minutes' },\r\n { value: 'i3', label: '3 Minutes' },\r\n { value: 'i5', label: '5 Minutes' },\r\n { value: 'i10', label: '10 Minutes' },\r\n { value: 'i15', label: '15 Minutes' },\r\n { value: 'i30', label: '30 Minutes' },\r\n { value: 'h', label: '1 Hour' },\r\n { value: 'h2', label: '2 Hours' },\r\n { value: 'h4', label: '4 Hours' },\r\n { value: 'd', label: 'Day' },\r\n { value: '1w', label: 'Week' },\r\n { value: '4w', label: 'Month' },\r\n { value: '13w', label: 'Quarter' },\r\n { value: '26w', label: 'Half' },\r\n { value: '52w', label: 'Year' },\r\n { value: 'ytd', label: 'YTD' },\r\n]\r\n\r\nconst NET_FLOWS_FILTER_OPTIONS = [\r\n { value: '1m', label: '1 Month' },\r\n { value: '3m', label: '3 Month' },\r\n { value: 'ytd', label: 'YTD' },\r\n { value: '1y', label: '1 Year' },\r\n]\r\n\r\nconst RETURN_FILTER_OPTIONS = [\r\n { value: '1y', label: '1 Year' },\r\n { value: '3y', label: '3 Year' },\r\n { value: '5y', label: '5 Year' },\r\n { value: '10y', label: '10 Year' },\r\n { value: 'si', label: 'Since Inception' },\r\n]\r\n\r\ninterface FilterDialogProps {\r\n config: ConfigType | null\r\n dialogState: DialogProps['state']\r\n dialogBodyClassName?: string\r\n}\r\n\r\nexport function FilterDialog({ config, dialogState }: FilterDialogProps) {\r\n const handleSubmit = React.useCallback(\r\n (values: (string | null)[]) => {\r\n if (config) {\r\n const { filter } = config\r\n const filters = {\r\n ...parseScreenerFilters(),\r\n [filter]: values.filter((value) => !!value) as string[],\r\n }\r\n const urlQueryObject = decodeQueryString()\r\n window.location.href =\r\n 'screener.ashx?' + encodeQueryString({ ...urlQueryObject, f: stringifyScreenerFilters(filters) })\r\n }\r\n },\r\n [config]\r\n )\r\n\r\n if (!config) return null\r\n\r\n const getDialogComponent = () => {\r\n switch (config.filter) {\r\n case 'ipodate':\r\n return \r\n case 'earningsdate':\r\n return \r\n case 'ta_perf':\r\n case 'ta_perf2':\r\n return \r\n case 'ta_volatility':\r\n return \r\n case 'targetprice':\r\n return \r\n case 'ta_sma20':\r\n case 'ta_sma50':\r\n case 'ta_sma200':\r\n return \r\n case 'ta_highlow20d':\r\n case 'ta_highlow50d':\r\n case 'ta_highlow52w':\r\n case 'ta_alltime':\r\n return \r\n case 'sh_float':\r\n return \r\n case 'etf_fundflows':\r\n return (\r\n \r\n )\r\n case 'etf_return':\r\n return (\r\n \r\n )\r\n case 'sh_opt':\r\n return \r\n case 'fa_epsrev':\r\n return \r\n default:\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n {config.title}\r\n {getDialogComponent()}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { eventListenerRegister } from './utils'\r\n\r\n// Don't break on number with plus in front (+5 -> 5)\r\nfunction ScreenerRemovePlus(value: string) {\r\n if (value && value[0] === '+') {\r\n return value.slice(1)\r\n }\r\n return value\r\n}\r\n\r\nfunction ScreenerValidateInputs(type: string, input1: HTMLInputElement, input2: HTMLInputElement) {\r\n const numberRegexp = type === 'range' ? /^([-+]?[0-9]*)$/ : /^([-+]?[0-9]*\\.?[0-9]*)$/\r\n const isMatchInput1 = numberRegexp.test(input1.value)\r\n const isMatchInput2 = numberRegexp.test(input2.value)\r\n\r\n if (!isMatchInput1) {\r\n alert('Only ' + (type === 'range' ? 'whole ' : '') + 'numbers are allowed.')\r\n input1.focus()\r\n return false\r\n }\r\n if (!isMatchInput2) {\r\n alert('Only ' + (type === 'range' ? 'whole ' : '') + 'numbers are allowed.')\r\n input2.focus()\r\n return false\r\n }\r\n\r\n if (isMatchInput1 && Math.abs(Number(input1.value)) > Number.MAX_SAFE_INTEGER) {\r\n alert('Number is too large.')\r\n input1.focus()\r\n return false\r\n }\r\n if (isMatchInput2 && Math.abs(Number(input2.value)) > Number.MAX_SAFE_INTEGER) {\r\n alert('Number is too large.')\r\n input2.focus()\r\n return false\r\n }\r\n\r\n return true\r\n}\r\n\r\nfunction ScreenerCustomRangeOnChange(this: HTMLElement) {\r\n const select = document.getElementById('fs_' + (this as HTMLElement).getAttribute('data-filter')) as HTMLInputElement,\r\n type = select.value,\r\n inputs = Array.from(this.parentNode!.parentNode!.parentNode!.querySelectorAll('input')),\r\n filter = select.getAttribute('data-filter'),\r\n query = select.getAttribute('data-url'),\r\n queryWithFilter = select.getAttribute('data-url-selected')!,\r\n regexp = new RegExp(filter + '_selected_filter')\r\n let q = query\r\n\r\n if (inputs[0].value !== '' || inputs[1].value !== '') {\r\n if (!ScreenerValidateInputs(type, inputs[0], inputs[1])) {\r\n return\r\n }\r\n const value = filter + '_' + ScreenerRemovePlus(inputs[0].value) + 'to' + ScreenerRemovePlus(inputs[1].value)\r\n q = queryWithFilter.replace(regexp, encodeURIComponent(value))\r\n }\r\n\r\n window.location.href = 'screener.ashx?' + q\r\n}\r\n\r\nexport function useCustomRangeController() {\r\n React.useEffect(() => {\r\n const inputs = Array.from(document.querySelectorAll('.js-custom-range input')) as HTMLElement[]\r\n const unregisterEventFuncs = [] as Array<() => void>\r\n for (let i = 0; i < inputs.length; i++) {\r\n const unregister = eventListenerRegister(inputs[i], 'change', ScreenerCustomRangeOnChange)\r\n unregisterEventFuncs.push(unregister)\r\n }\r\n\r\n return () => {\r\n unregisterEventFuncs.forEach((unregister) => {\r\n unregister()\r\n })\r\n }\r\n }, [])\r\n\r\n return null\r\n}\r\n","import React from 'react'\r\n\r\nimport { eventListenerRegister } from './utils'\r\n\r\nfunction HideCustom(this: HTMLElement) {\r\n const filter = this.getAttribute('data-filter')\r\n\r\n const el1 = document.getElementById('fsr_' + filter)\r\n const el2 = document.getElementById('fsm_' + filter)\r\n el1 && (el1.style.display = 'none')\r\n el2 && (el2.style.display = 'none')\r\n\r\n const select = document.getElementById('fs_' + filter) as HTMLSelectElement\r\n select.value = ''\r\n select.style.display = 'block'\r\n select.onchange?.(new Event('change'))\r\n\r\n return false\r\n}\r\n\r\nexport function useHideCustomControll() {\r\n React.useEffect(() => {\r\n const ranges = Array.from(document.getElementsByClassName('js-hide-custom-range')) as HTMLElement[]\r\n const unregisterEventFuncs = [] as Array<() => void>\r\n for (let i = 0; i < ranges.length; i++) {\r\n const unregister = eventListenerRegister(ranges[i], 'click', HideCustom)\r\n unregisterEventFuncs.push(unregister)\r\n }\r\n\r\n const hides = Array.from(document.getElementsByClassName('js-custom-modal-hide')) as HTMLElement[]\r\n for (let i = 0; i < hides.length; i++) {\r\n const unregister = eventListenerRegister(hides[i], 'click', HideCustom)\r\n unregisterEventFuncs.push(unregister)\r\n }\r\n\r\n return () => {\r\n unregisterEventFuncs.forEach((unregister) => {\r\n unregister()\r\n })\r\n }\r\n }, [])\r\n\r\n return null\r\n}\r\n","import { getSanitizedTicker } from 'finviz-charts/app/utils'\r\nimport React from 'react'\r\n\r\nimport { eventListenerRegister } from './utils'\r\n\r\nfunction ScreenerTickersInputOnChange(this: HTMLInputElement) {\r\n const inputValue = this.value,\r\n filter = this.getAttribute('data-filter'),\r\n query = this.getAttribute('data-url'),\r\n queryWithFilter = this.getAttribute('data-url-selected')!,\r\n regexp = new RegExp(filter + '_SELECTED-FILTER')\r\n let q = query\r\n\r\n if (inputValue !== '') {\r\n const sanitizedTickers = getSanitizedTicker(inputValue, true)\r\n\r\n if (sanitizedTickers === '') {\r\n alert('Separate multiple tickers by a comma, e.g.: SPY, QQQ, DIA.')\r\n return\r\n }\r\n\r\n const value = filter + '_' + sanitizedTickers.replaceAll(',', '|')\r\n q = queryWithFilter.replace(regexp, encodeURIComponent(value))\r\n }\r\n\r\n window.location.href = 'screener.ashx?' + q\r\n}\r\n\r\nexport function useTickersInputController() {\r\n React.useEffect(() => {\r\n const inputs = Array.from(document.querySelectorAll('.js-tickers-input')) as HTMLElement[]\r\n const unregisterEventFuncs = [] as Array<() => void>\r\n for (let i = 0; i < inputs.length; i++) {\r\n const unregister = eventListenerRegister(inputs[i], 'change', ScreenerTickersInputOnChange)\r\n unregisterEventFuncs.push(unregister)\r\n }\r\n\r\n return () => {\r\n unregisterEventFuncs.forEach((unregister) => {\r\n unregister()\r\n })\r\n }\r\n }, [])\r\n\r\n return null\r\n}\r\n","import React from 'react'\r\n\r\nimport { useDialogState } from '../../main/components/dialog'\r\nimport { FilterDialog } from './filter-modal/filter-dialog'\r\nimport { ConfigType } from './filter-modal/types'\r\nimport { useCustomRangeController } from './use-custom-range-controller'\r\nimport { useHideCustomControll } from './use-hide-custom-controller'\r\nimport { useTickersInputController } from './use-tickers-input-controller'\r\nimport {\r\n ScreenerRenderCustomModal,\r\n eventListenerRegister,\r\n getIsOptionDateRange,\r\n parseScreenerFilters,\r\n textContent,\r\n} from './utils'\r\n\r\nexport function ScreenerPremium() {\r\n useCustomRangeController()\r\n useTickersInputController()\r\n useHideCustomControll()\r\n const [activeSelectEl, setActiveSelectEl] = React.useState()\r\n const isInitRef = React.useRef(false)\r\n const dialogState = useDialogState({\r\n setOpen(open) {\r\n if (!open) {\r\n setActiveSelectEl(undefined)\r\n handleCancel()\r\n }\r\n },\r\n })\r\n\r\n const config = React.useMemo(() => {\r\n if (!activeSelectEl) {\r\n return null\r\n }\r\n const parentNode = activeSelectEl.parentNode! as HTMLElement\r\n const filter = activeSelectEl.getAttribute('data-filter')!\r\n const title = textContent(parentNode.previousElementSibling as HTMLElement)\r\n const selectedValues = parseScreenerFilters()[filter] ?? []\r\n const selectedOption = activeSelectEl.value\r\n const options = Array.from(activeSelectEl.options)\r\n .map((option) => ({ value: option.value, label: option.text }))\r\n .filter((opt) => {\r\n const isModal = opt.value.includes('modal')\r\n const isEmpty = opt.value === ''\r\n return !isModal && !isEmpty && !getIsOptionDateRange(opt.value)\r\n })\r\n\r\n return {\r\n selectedOption,\r\n filter,\r\n title,\r\n options,\r\n selectedValues,\r\n }\r\n }, [activeSelectEl])\r\n\r\n const handleCancel = React.useCallback(() => {\r\n const hiddenFsmElement = document.getElementById('fsm_' + config?.filter)\r\n if (activeSelectEl && (!hiddenFsmElement || hiddenFsmElement.style.display === 'none')) {\r\n activeSelectEl.value = activeSelectEl.getAttribute('data-selected')!\r\n activeSelectEl.onchange?.(new Event('change'))\r\n }\r\n }, [activeSelectEl, config])\r\n\r\n React.useEffect(() => {\r\n function ScreenerSelectOnChange(that: HTMLElement) {\r\n const filter = that.getAttribute('data-filter'),\r\n query = that.getAttribute('data-url'),\r\n queryWithFilter = that.getAttribute('data-url-selected'),\r\n el = document.getElementById('fs_' + filter) as HTMLInputElement,\r\n value = el.value\r\n let q = query\r\n\r\n if (value === 'range' || value === 'frange') {\r\n el.style.display = 'none'\r\n const customRange = document.getElementById('fsr_' + filter) as HTMLElement\r\n customRange.style.display = 'block'\r\n return\r\n } else if (value.includes('modal')) {\r\n ScreenerShowModal.call(document.getElementById('fs_' + filter))\r\n return\r\n } else if (value.length > 0) {\r\n const regexp = new RegExp(filter + '_selected_filter')\r\n q = queryWithFilter!.replace(regexp, filter + '_' + value)\r\n }\r\n window.location.href = 'screener.ashx?' + q\r\n }\r\n\r\n function ScreenerShowModal(this: any) {\r\n const filter = this.getAttribute('data-filter')\r\n const select = document.getElementById('fs_' + filter) as HTMLSelectElement\r\n setActiveSelectEl(select)\r\n dialogState.show()\r\n }\r\n\r\n const edits = Array.from(document.getElementsByClassName('js-custom-modal-edit')) as HTMLElement[]\r\n const unregisterEventFuncs = [] as Array<() => void>\r\n for (let i = 0; i < edits.length; i++) {\r\n const unregister = eventListenerRegister(edits[i], 'click', ScreenerShowModal)\r\n unregisterEventFuncs.push(unregister)\r\n }\r\n\r\n if (!isInitRef.current) {\r\n isInitRef.current = true\r\n const selects = Array.from(document.querySelectorAll('.filters-cells select, .screener-combo-text.is-selected'))\r\n for (let i = 0; i < selects.length; i++) {\r\n const select = selects[i] as HTMLSelectElement\r\n if (select.value === 'range' || select.value === 'frange') {\r\n ScreenerSelectOnChange(select)\r\n } else if (select.value === 'modal') {\r\n ScreenerRenderCustomModal(select)\r\n }\r\n }\r\n\r\n window.ScreenerSelectOnChange = ScreenerSelectOnChange\r\n }\r\n\r\n return () => {\r\n unregisterEventFuncs.forEach((unregister) => unregister())\r\n }\r\n }, [dialogState])\r\n\r\n return \r\n}\r\n","import React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport {\r\n CustomDateRange,\r\n ITimeframeGroup,\r\n TimeframeBar,\r\n generatePathForTimeframeDateRange,\r\n getDateRangeGroupsWithHref,\r\n getTimeframeFromDateRange,\r\n getTimeframeGroups,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n} from '../../main/components/timeframe-bar'\r\nimport { TIMEFRAME } from '../../main/constants'\r\nimport { Instrument } from '../../main/types'\r\n\r\nfunction getSelectedTimeframeAndDateRange(urlQuery: { p?: string; dr?: string }) {\r\n const selectedTimeframe = (urlQuery.p ?? FinvizSettings.screenerCurrentTimeframe?.timeframe) as TIMEFRAME\r\n let selectedDateRange = urlQuery.dr\r\n if (!selectedDateRange && !urlQuery.p) {\r\n selectedDateRange = FinvizSettings.screenerCurrentTimeframe?.dateRange || undefined\r\n }\r\n\r\n return { selectedTimeframe, selectedDateRange }\r\n}\r\n\r\nexport function ScreenerTimeframeBar() {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n const [searchParams] = useSearchParams()\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\r\n const currentQuery = React.useMemo(\r\n () => Object.fromEntries(searchParams) as { p?: string; dr?: string },\r\n [searchParams]\r\n )\r\n const containerRef = React.useRef(document.getElementById('screener-fullview-links')!)\r\n const { selectedTimeframe, selectedDateRange } = getSelectedTimeframeAndDateRange(currentQuery)\r\n\r\n React.useEffect(() => {\r\n containerRef.current.style.visibility = 'unset'\r\n }, [])\r\n\r\n const timeFrameGroupsWithHref = getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\r\n label: timeFrameGroup.label,\r\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\r\n ...timeFrame,\r\n href: generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname: window.location.pathname,\r\n timeframe: timeFrame.value,\r\n utmCampaign: 'screener-charts-intraday',\r\n dateRangeQueryKey: 'dr',\r\n }),\r\n withReload: true,\r\n })),\r\n }))\r\n\r\n const dateRangeGroupsWithHref = getDateRangeGroupsWithHref({\r\n isPremium: FinvizSettings.hasUserPremium,\r\n customRange: selectedDateRange,\r\n isCustomAvailable: true,\r\n withReload: true,\r\n instrument: Instrument.Stock,\r\n generatePath: (dateRange) =>\r\n generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname: window.location.pathname,\r\n timeframe: dateRange.timeframe!,\r\n dateRange: dateRange.value,\r\n utmCampaign: 'screener-charts-daterange',\r\n dateRangeQueryKey: 'dr',\r\n }),\r\n })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect } = useCustomDateRangeDialog({\r\n instrument: Instrument.Stock,\r\n anchorDate: new Date(),\r\n shouldReloadOnNavigate: true,\r\n pathGenerator: ({ dateRange, timeframe }) => ({\r\n pathname: window.location.pathname,\r\n search: new URLSearchParams({ ...currentQuery, p: timeframe, dr: dateRange ?? '' }).toString(),\r\n }),\r\n })\r\n\r\n return (\r\n <>\r\n {}}\r\n onDateRangeSelect={handleDateRangeSelect}\r\n onFavoriteTimeframeToggle={({ value }) => {\r\n toggleFavoriteTimeframe(value as TIMEFRAME)\r\n }}\r\n compactViewMaxBreakpointPx={0}\r\n isFavoritesEnabled={FinvizSettings.hasUserPremium}\r\n isTimeframeSelectEnabled={true}\r\n onCustomDateRangeClick={() => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n }}\r\n />\r\n {\r\n const value = dateRange ?? ''\r\n const timeframe = getTimeframeFromDateRange({\r\n dateRange: value,\r\n instrument: Instrument.Stock,\r\n anchorDate: new Date(),\r\n isPremium: isPremium,\r\n })\r\n return onDialogSubmit({ value, timeframe: timeframe })\r\n }}\r\n />\r\n \r\n )\r\n}\r\n","import ReactDOM from 'react-dom'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { ready } from '../shared/ready'\r\nimport { ScreenerPremium } from './screener-premium'\r\nimport { ScreenerTimeframeBar } from './screener-timeframe-bar'\r\n\r\nconst SCREENER_TIMEFRAME_REACT_ROOT_ID = 'screener-timeframe-container'\r\n\r\nconst screenerTimeframeReactMount = () => {\r\n const timeframeContainer = document.getElementById(SCREENER_TIMEFRAME_REACT_ROOT_ID)\r\n if (timeframeContainer) {\r\n ReactDOM.render(\r\n \r\n \r\n ,\r\n timeframeContainer\r\n )\r\n }\r\n}\r\n\r\nconst screenerTimeframeReactUnmount = () => {\r\n const timeframeContainer = document.getElementById(SCREENER_TIMEFRAME_REACT_ROOT_ID)\r\n if (timeframeContainer) ReactDOM.unmountComponentAtNode(timeframeContainer)\r\n}\r\n\r\nready(() => {\r\n const screener = document.getElementById('screener-react')\r\n if (screener && FinvizSettings.hasUserPremium) {\r\n ReactDOM.render(, screener)\r\n }\r\n screenerTimeframeReactMount()\r\n})\r\n\r\nwindow.ScreenerTimeframeReactMount = screenerTimeframeReactMount\r\nwindow.ScreenerTimeframeReactUnmount = screenerTimeframeReactUnmount\r\n","export enum ScreenerQuery {\r\n View = 'v',\r\n Signal = 's',\r\n Order = 'o',\r\n Tickers = 't',\r\n Filters = 'f',\r\n FilterTab = 'ft',\r\n MapSubtype = 'st',\r\n}\r\n\r\nexport enum ScreenerFilter {\r\n MarketCap = 'cap',\r\n Index = 'idx',\r\n Sector = 'sec',\r\n Industry = 'ind',\r\n AverageVolume = 'sh_avgvol',\r\n}\r\n\r\nexport enum ScreenerAddtionalQuery {\r\n ShowEtf = 'show_etf',\r\n}\r\n\r\nexport enum ScreenerView {\r\n Overview = 11,\r\n Maps = 71,\r\n Bubbles = 72,\r\n}\r\n\r\nexport function eventListenerRegister(el: HTMLElement, eventName: string, handler: (...args: any[]) => any) {\r\n el.addEventListener(eventName, handler)\r\n\r\n return () => {\r\n el.removeEventListener(eventName, handler)\r\n }\r\n}\r\n\r\nexport function textContent(el: HTMLElement) {\r\n return el.textContent || el.innerText\r\n}\r\n\r\nexport function ScreenerGetOptionsList(select: HTMLSelectElement) {\r\n const options = select.getAttribute('data-selected')?.split('|') ?? [],\r\n result = []\r\n for (var i = 0, len = options.length; i < len; i++) {\r\n var option = options[i]\r\n for (var j = 0; j < select.children.length; j++) {\r\n var optionEl = select.children[j] as HTMLOptionElement\r\n if (optionEl.value === option) {\r\n result.push({\r\n key: option,\r\n value: textContent(optionEl),\r\n })\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\nexport function ScreenerRenderCustomModal(select: any) {\r\n const filter = select.getAttribute('data-filter')\r\n const customWrapper = document.getElementById('fsm_' + filter) as HTMLElement\r\n if (customWrapper) {\r\n select.style.display = 'none'\r\n customWrapper.style.display = 'block'\r\n const input = document.getElementById('fsmi_' + filter) as HTMLInputElement\r\n const options = ScreenerGetOptionsList(select)\r\n const arr = []\r\n for (let i = 0, len = options.length; i < len; i++) {\r\n arr.push(options[i].value)\r\n }\r\n input.value = arr.join(', ')\r\n }\r\n}\r\n\r\nconst DATE_REGEX = /^[0-9]{2}[-][0-9]{2}[-][0-9]{4}/\r\n\r\nexport function getIsOptionDateRange(option: string) {\r\n if (!option.includes('x')) return false\r\n\r\n const [from, to] = option.split('x')\r\n const [isValidFromDate, isValidToDate] = [from, to].map((value) => {\r\n if (DATE_REGEX.test(value)) {\r\n return !Number.isNaN(new Date(value.replace(/-/g, '/')).getTime())\r\n }\r\n return false\r\n })\r\n\r\n return isValidFromDate || isValidToDate\r\n}\r\n\r\nexport function getInitialDateFromSelectedValues(selectedValues: string[]) {\r\n const initialDate = selectedValues.find(getIsOptionDateRange)\r\n\r\n if (initialDate) {\r\n return initialDate.split('x').map((date) => (DATE_REGEX.test(date) ? date.replace(/-/g, '/') : undefined))\r\n }\r\n}\r\n\r\nexport function dateRangeToFilterString({ from, to }: { from?: string; to?: string }) {\r\n return from || to ? `${from ?? ''}x${to ?? ''}`.replace(/\\//g, '-') : null\r\n}\r\n\r\n/**\r\n * Creates link for given view & subview and ignores any additional query params\r\n */\r\nexport function getQueryForView(view?: ScreenerView, allowedParams: string[] = [], baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const allowList = [...allowedParams, ...Object.values(ScreenerQuery)]\r\n\r\n /**\r\n * Seems like `query` is a live property, so we can’t use `query.forEach` to delete,\r\n * so we need to copy keys before looping.\r\n * https://stackoverflow.com/questions/60522437\r\n */\r\n const keys = Array.from(query.keys())\r\n\r\n keys.forEach((key) => {\r\n if (!allowList.includes(key)) {\r\n query.delete(key)\r\n }\r\n })\r\n\r\n const [, originalView, settings = 0] = query.get(ScreenerQuery.View)?.match(/(\\d{2})(\\d)/) ?? []\r\n\r\n if (view ?? originalView) {\r\n query.set(ScreenerQuery.View, `${view ?? originalView}${settings}`)\r\n }\r\n\r\n return query\r\n}\r\n\r\n/**\r\n * Parse screener `f` query param to object\r\n */\r\nexport function parseScreenerFilters(baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const filtersString = query.get(ScreenerQuery.Filters)\r\n\r\n if (!filtersString) return {}\r\n\r\n return Object.fromEntries(\r\n filtersString.split(',').map((f) => {\r\n const lastUnderscore = f.lastIndexOf('_')\r\n const key = f.substring(0, lastUnderscore)\r\n const value = f.substring(lastUnderscore + 1)\r\n return [key, value.split('|')]\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Stringify screener `f` query param\r\n */\r\nexport function stringifyScreenerFilters(filters: Record) {\r\n return Object.entries(filters)\r\n .filter(([, value]) => String(value).length > 0)\r\n .map(([key, value]) => `${key}_${value.join('|')}`)\r\n .join(',')\r\n}\r\n\r\nexport function rangesToFilter(\r\n ranges: {\r\n from: string\r\n to: string\r\n }[],\r\n rangeSuffixes?: string[],\r\n delimiter = 'x',\r\n rangeDelimiter = 'to'\r\n) {\r\n return ranges.reduce((filter, range, index) => {\r\n const { from, to } = range\r\n const rangeStr = from || to ? `${from}${rangeDelimiter}${to}${rangeSuffixes?.[index] ?? ''}` : ''\r\n\r\n let currentFilter = filter\r\n if (index > 0) currentFilter += delimiter\r\n return currentFilter + rangeStr\r\n }, '')\r\n}\r\n","import { waitForPreviousPromise } from '../../main/services/wait-for-previous-promise'\r\n\r\nfunction getCurrentDateInMs() {\r\n return new Date().valueOf()\r\n}\r\n\r\nfunction getIsDocumentVisible() {\r\n return document.visibilityState === 'visible' || document.hidden === false\r\n}\r\n\r\n/**\r\n * Invoke a callback when page visibility changes. Turns the callback into a promise\r\n * and waits for the previous promise to finish before invoking it again\r\n */\r\nexport function notifyOnVisibilityChange(callback: (visible: boolean) => void | Promise) {\r\n const promisifiedCallback = waitForPreviousPromise(() => callback(getIsDocumentVisible()))\r\n\r\n document.addEventListener('visibilitychange', promisifiedCallback)\r\n\r\n return {\r\n callback: promisifiedCallback,\r\n unsubscribe: () => {\r\n document.removeEventListener('visibilitychange', promisifiedCallback)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Calls callback based on interval and document visibility. Returns unsubscribe function.\r\n * How it works:\r\n * - document is hidden: interval cleared\r\n * - document visible: interval set-up with remaining time from last interval. Call immediately if interval elapsed\r\n */\r\nexport function intervalCallbackOnWindowVisible(\r\n interval: number | (() => number),\r\n callback: () => void | Promise\r\n) {\r\n const getInterval = typeof interval === 'function' ? interval : () => interval\r\n let refreshPromise: Promise | void | null = null\r\n let nextRefresh = getCurrentDateInMs() + getInterval()\r\n let refreshTimeout: number | null = null\r\n\r\n async function refresh() {\r\n nextRefresh = getCurrentDateInMs() + getInterval()\r\n // Call callback asynchronously\r\n refreshPromise = callback()\r\n await refreshPromise\r\n refreshPromise = null\r\n\r\n // Queue next refresh\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = window.setTimeout(refresh, Math.max(0, nextRefresh - getCurrentDateInMs()))\r\n }\r\n }\r\n\r\n /**\r\n * Handle the visibility change event, compute callback remaining time or call immediately\r\n */\r\n function handleVisibilityChange() {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n\r\n if (getIsDocumentVisible() && refreshPromise === null) {\r\n const currentDateMs = getCurrentDateInMs()\r\n // Refresh if the document is stale, otherwise set a timeout to refresh later\r\n if (nextRefresh <= currentDateMs) {\r\n refresh()\r\n } else {\r\n refreshTimeout = window.setTimeout(refresh, nextRefresh - currentDateMs)\r\n }\r\n }\r\n }\r\n\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = window.setTimeout(refresh, getInterval())\r\n }\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange)\r\n\r\n return () => {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n document.removeEventListener('visibilitychange', handleVisibilityChange)\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRounding, ButtonRoundingType } from '../button'\r\n\r\nexport enum GroupTheme {\r\n light,\r\n dark,\r\n}\r\n\r\nexport interface ButtonGroupProps {\r\n children: React.ReactNode\r\n\r\n /**\r\n * Border radius of entire group wrapper\r\n *\r\n * @default \"regular\"\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n className?: string\r\n\r\n /**\r\n * If a pipe divider between buttons should be rendered\r\n *\r\n * @default true\r\n */\r\n hasDivider?: boolean\r\n\r\n /**\r\n * If group wrapper has a border\r\n *\r\n * @default true\r\n */\r\n hasBorder?: boolean\r\n\r\n /**\r\n * Group color theme\r\n *\r\n * @default \"light\"\r\n */\r\n theme?: keyof typeof GroupTheme\r\n\r\n /**\r\n * Custom button component which extends Button\r\n *\r\n * @default undefined\r\n */\r\n childComponent?: string | React.JSXElementConstructor\r\n}\r\n\r\nfunction getGroupTheme(theme: GroupTheme) {\r\n switch (theme) {\r\n case GroupTheme.dark:\r\n return {\r\n wrapper: 'bg-gray-800 border-gray-600',\r\n divider: 'bg-gray-600',\r\n }\r\n default:\r\n return {\r\n wrapper: 'bg-white dark:bg-gray-800 border-gray-100 dark:border-gray-600',\r\n divider: 'bg-gray-100 dark:bg-gray-600',\r\n }\r\n }\r\n}\r\n\r\nexport function ButtonGroup({\r\n className,\r\n children,\r\n theme = 'light',\r\n hasDivider = true,\r\n hasBorder = true,\r\n rounding = 'regular',\r\n childComponent,\r\n}: ButtonGroupProps) {\r\n const buttonRounding = ButtonRounding[rounding]\r\n const groupTheme = React.useMemo(() => getGroupTheme(GroupTheme[theme]), [theme])\r\n return (\r\n \r\n {React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child) || ![Button, childComponent].filter(Boolean).includes(child.type)) {\r\n return child\r\n }\r\n\r\n return (\r\n \r\n {hasDivider && index > 0 &&
}\r\n {React.cloneElement(child as React.ReactElement>, {\r\n rounding: child.props.rounding ?? 'none',\r\n theme: child.props.theme ?? (GroupTheme[theme] === GroupTheme.dark ? 'menuItemDark' : 'menuItem'),\r\n })}\r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\nexport enum ColorVariant {\r\n violet = 'violet',\r\n emerald = 'emerald',\r\n orange = 'orange',\r\n teal = 'teal',\r\n pink = 'pink',\r\n lime = 'lime',\r\n purple = 'purple',\r\n green = 'green',\r\n yellow = 'yellow',\r\n blue = 'blue',\r\n red = 'red',\r\n gray = 'gray',\r\n default = 'default',\r\n}\r\n\r\nexport enum CheckboxSize {\r\n none = '', // Do not set fixed size\r\n small = 'min-h-6 text-2xs', // 24px\r\n regular = 'min-h-7 text-sm', // 28px\r\n}\r\nexport type CheckboxSizeType = keyof typeof CheckboxSize\r\n\r\ninterface CheckboxProps extends Omit, 'label' | 'size'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n\r\n /**\r\n * Size of the checkbox\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: CheckboxSizeType\r\n\r\n /**\r\n * Color of the checkbox\r\n *\r\n * @default \"default\"\r\n */\r\n color?: ColorVariant\r\n}\r\n\r\nfunction CheckboxComponent(\r\n {\r\n className,\r\n label,\r\n size = 'regular',\r\n color = ColorVariant.default,\r\n children,\r\n ...props\r\n }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && (\r\n \r\n )}\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\r\n )\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n popoverState.hide()}\r\n />\r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverProps, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Hides color picker when clicked outside of popover,\r\n * works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside: PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Popover overlay click callback, if nothing's provided it calls hide when clicked outside of popover on its overlay\r\n * If false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n hideOnClickOutside = true,\r\n onOverlayClick,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: number\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = window.setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { CalendarProps } from 'react-calendar'\r\n\r\nimport { Box } from '../box'\r\nimport { ZIndexContext, getExtendedDialogState } from '../dialog'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nconst DatePickerComponent = React.lazy(() => import('./picker'))\r\n\r\ntype RangePickerCallback = (value: [Date, Date], ev: React.ChangeEvent) => void\r\ntype PickerCallback = (value: Date, ev: React.ChangeEvent) => void\r\n\r\ninterface DatePickerProps extends Omit {\r\n /**\r\n * Trigger element for the picker\r\n */\r\n children: JSX.Element\r\n\r\n onChange: PickerCallback | RangePickerCallback\r\n\r\n zIndex?: string\r\n}\r\n\r\nexport function StatelessDatePicker({\r\n state,\r\n children,\r\n zIndex,\r\n ...props\r\n}: DatePickerProps & { state: ReturnType; zIndex?: string }) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n return (\r\n <>\r\n \r\n {(triggerProps: React.HTMLProps) =>\r\n React.Children.map(children, (child) => {\r\n if (React.isValidElement(child))\r\n return React.cloneElement(child, { ...triggerProps, ...(child.props as any) })\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n ) => {\r\n state.hide()\r\n props.onChange?.(value, ev)\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DatePicker(props: DatePickerProps) {\r\n const popover = usePopoverState()\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type DropdownStateReturn = ReturnType\r\n\r\nexport const DropdownContext = React.createContext<{\r\n parent: Reakit.MenuStateReturn\r\n root: Reakit.MenuStateReturn\r\n} | null>(null)\r\n\r\nexport function useDropdownState(settings?: Reakit.MenuInitialState) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return Reakit.useMenuState({\r\n ...settings,\r\n loop: true,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n unstable_virtual: true,\r\n unstable_offset: settings?.unstable_offset ?? (context?.root ? [-5, 4] : [0, 5]),\r\n modal: false,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps, BoxRounding } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { DropdownContext, useDropdownState } from './hooks'\r\n\r\ninterface DropdownBaseProps extends Omit {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n label: JSX.Element\r\n\r\n /**\r\n * @private\r\n * Any additional props to the trigger button. Used by nested dropdown wrapper\r\n */\r\n triggerProps?: Reakit.MenuButtonHTMLProps\r\n\r\n /**\r\n * Rounding of all trigger button, dropdown wrapper and dropdown items\r\n */\r\n rounding?: keyof typeof BoxRounding\r\n}\r\n\r\ninterface RootDropdownProps {\r\n /**\r\n * The returned object from `useDropdownState`. For nested dropdowns use the `isNested` prop\r\n */\r\n state: Reakit.MenuStateReturn\r\n isNested?: never\r\n /**\r\n * When set to true the dropdown will not render in Portal and will not use position absolute + transform.\r\n */\r\n isStatic?: boolean\r\n}\r\n\r\ninterface NestedDropdownProps {\r\n state?: never\r\n /**\r\n * When set to true the dropdown will compute its own state. Only usable with\r\n * nested dropdowns\r\n */\r\n isNested: true\r\n\r\n isStatic?: never\r\n}\r\n\r\ntype DropdownProps = DropdownBaseProps & (RootDropdownProps | NestedDropdownProps)\r\n\r\nfunction DropdownComponent(\r\n {\r\n label,\r\n triggerProps,\r\n state,\r\n 'aria-label': ariaLabel,\r\n children,\r\n isNested,\r\n rounding,\r\n isStatic,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const zIndex = useZIndex()\r\n const context = React.useContext(DropdownContext)\r\n // Required due to the way conditional props work\r\n const dropdownState = state!\r\n const { isFullyClosed } = getExtendedDialogState(state ?? { visible: false, animating: false })\r\n\r\n if (!isNested && !dropdownState) {\r\n throw new Error('Dropdowns require either `state` or `isNested` prop defined!')\r\n }\r\n\r\n const ContainerElement = React.useRef(isNested || isStatic ? React.Fragment : Portal).current\r\n\r\n return (\r\n <>\r\n \r\n {(buttonProps) =>\r\n React.cloneElement(label, {\r\n ...buttonProps,\r\n ...label.props,\r\n rounding,\r\n active: label.props.active ?? dropdownState.visible,\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === Dropdown) {\r\n return {child}\r\n }\r\n\r\n return React.cloneElement(child, {\r\n ...child.props,\r\n rounding,\r\n })\r\n })}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(DropdownComponent)\r\n\r\ninterface NestedDropdownWrapperProps {\r\n /**\r\n * State of parrent dropdown to be passed to MenuItem for correct navigation\r\n * handling\r\n */\r\n parentState: Reakit.MenuStateReturn\r\n\r\n /**\r\n * Nested dropdown element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\n/**\r\n * The `useDropdownState` requires parent context to be defined in order to work\r\n * with nested Dropdowns. So we need to create a wrapper to be able to get to the\r\n * parent context\r\n */\r\nfunction NestedDropdownWrapper({ parentState, children }: NestedDropdownWrapperProps) {\r\n const state = useDropdownState()\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(children, { ...children.props, triggerProps: itemProps, state })}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { Icon, isValidIconName } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { DropdownContext } from './hooks'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\ninterface DropdownItemProps extends ButtonProps {\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n closeOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n {\r\n as: asComponent,\r\n state,\r\n subtitle,\r\n closeOnClick = true,\r\n children,\r\n rounding,\r\n size,\r\n ...props\r\n }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return (\r\n \r\n {(itemProps) => {\r\n const active = itemProps['aria-selected'] && !context?.parent.animating\r\n const hasSubmenu = Boolean(itemProps['aria-haspopup'])\r\n\r\n const iconTheme = {\r\n 'text-gray-300': !active,\r\n 'text-gray-white dark:text-white': active,\r\n }\r\n\r\n return (\r\n \r\n ) : (\r\n props.leftContent\r\n )\r\n }\r\n rightContent={\r\n isValidIconName(props.rightContent) ? (\r\n \r\n ) : (\r\n props.rightContent\r\n )\r\n }\r\n onClick={(ev: React.MouseEvent) => {\r\n // Close if we clicked on an item which doesn’t have a submenu\r\n if (closeOnClick && !hasSubmenu) {\r\n context?.root.hide()\r\n }\r\n\r\n itemProps.onClick?.(ev)\r\n }}\r\n >\r\n {children}\r\n {subtitle &&
{subtitle}
}\r\n \r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Reakit from 'reakit/Menu'\r\n\r\nimport { Paragraph } from '../typography'\r\n\r\nexport function DropdownSeparator(props: Partial) {\r\n return (\r\n \r\n
\r\n {props.children && (\r\n \r\n {props.children}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n
\r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n items={item.options}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\nconst DEFAULT_VALUE_KEY = 'value'\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center p-1.5 bg-white dark:bg-gray-800', {\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\r\n >\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { List, ListItem, useListState } from '../list'\r\nimport { useList } from '../list/hooks'\r\nimport { Popover, PopoverTrigger, useHoverPopover } from '../popover'\r\nimport { NativeSelect } from '../select/NativeSelect'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n}\r\n\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const listState = useListState({ currentId: null })\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useList(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\r\n ({ value: item.id, label: item.title }))}\r\n onChange={(option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n ) : (\r\n \r\n \r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage?.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage?.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { TabInitialState, TabStateReturn, useTabState } from 'reakit/Tab'\r\n\r\ntype TabsProps = {\r\n settings?: TabInitialState\r\n}\r\n\r\nconst TabsContext = React.createContext(null)\r\nexport const useTabsContext = () => React.useContext(TabsContext)\r\n\r\nexport function Tabs({ settings, children }: React.PropsWithChildren) {\r\n const state = useTabState(settings)\r\n const value = React.useMemo(() => state, [state])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport * as Reakit from 'reakit/Tab'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps } from '../button'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { useTabsContext } from './tabs'\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum TabSpacing {\r\n xxsmall = 'space-x-0.5', // 2px spacing\r\n xsmall = 'space-x-1', // 4px spacing\r\n none = 'space-x-1.5', // 6px spacing\r\n small = 'space-x-1.5', // 6px spacing\r\n regular = 'space-x-1.5', // 6px spacing\r\n medium = 'space-x-2', // 8px spacing\r\n large = 'space-x-2', // 8px spacing\r\n}\r\n\r\nfunction getRightContent(content: JSX.Element | IconNameType | undefined, isActive: boolean) {\r\n if (isValidIconName(content)) return \r\n else if (React.isValidElement(content))\r\n return React.cloneElement(content as React.ReactElement<{ active: boolean }>, {\r\n active: isActive,\r\n })\r\n else return content\r\n}\r\n\r\nexport function Tab({\r\n rounding = 'none',\r\n theme = 'tab',\r\n size = 'medium',\r\n children,\r\n ...props\r\n}: React.PropsWithChildren>) {\r\n const state = useTabsContext()\r\n const spacing = TabSpacing[size]\r\n\r\n return (\r\n \r\n {(itemProps: ButtonComponentProps) => {\r\n const active = Boolean(itemProps['aria-selected'])\r\n const rightContent = getRightContent(itemProps.rightContent, active)\r\n\r\n return (\r\n \r\n {children}\r\n {rightContent}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport * as Reakit from 'reakit/Tab'\r\n\r\nimport { useTabsContext } from './tabs'\r\n\r\ntype TabListProps = {\r\n 'aria-label': string\r\n className?: string\r\n}\r\n\r\nexport function TabList({ 'aria-label': ariaLabel, className, children }: React.PropsWithChildren) {\r\n const state = useTabsContext()\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport * as Reakit from 'reakit/Tab'\r\n\r\nimport { useTabsContext } from './tabs'\r\n\r\nexport function TabPanel({ children, ...props }: Omit, 'as'>) {\r\n const state = useTabsContext()\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum BadgeSize {\r\n small = 'h-4 min-w-4', // 16px height\r\n medium = 'h-5 min-w-5', // 20px height\r\n}\r\ntype BadgeSizeType = keyof typeof BadgeSize\r\n\r\nenum BadgePadding {\r\n small = 'px-[5px] py-0', // 16px height\r\n medium = 'px-1.5 py-0.5', // 20px height\r\n}\r\ntype BadgePaddingType = keyof typeof BadgePadding\r\n\r\ntype BadgeProps = {\r\n size?: BadgeSizeType\r\n padding?: BadgePaddingType\r\n active?: boolean\r\n}\r\n\r\nexport function Badge({ size = 'medium', padding = size, active, children }: React.PropsWithChildren) {\r\n const badgePadding = BadgePadding[padding]\r\n const badgeSize = BadgeSize[size]\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { useWindowSize } from '../../hooks/use-window-size'\r\nimport { Box, BoxProps, BoxTheme } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { TooltipArrow } from '../tooltip/tooltip-arrow'\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport interface PopoverProps extends BoxProps, Pick {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * Focus the popover when it opens\r\n *\r\n * @default true\r\n */\r\n focusOnShow?: Reakit.PopoverProps['unstable_autoFocusOnShow']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default true\r\n */\r\n focusOnHide?: Reakit.PopoverProps['unstable_autoFocusOnHide']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default undefined\r\n */\r\n finalFocusRef?: Reakit.PopoverProps['unstable_finalFocusRef']\r\n\r\n /**\r\n * Hides when clicked outside of popover, works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside?: Reakit.PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Overlay click callback or if false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Popover wrapper css style object\r\n *\r\n * @default undefined\r\n */\r\n popoverWrapperStyle?: React.CSSProperties\r\n\r\n /**\r\n * Show popover arrow\r\n *\r\n * @default false\r\n */\r\n hasArrow?: boolean\r\n\r\n /**\r\n * Enable or disable backdrop click events\r\n *\r\n * @default true\r\n */\r\n hasBackdrop?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Can be used together with `hasViewportHeightLimit` to limit the height of the popover\r\n *\r\n * @default undefined\r\n */\r\n popoverMaxHeight?: number\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n children,\r\n focusOnShow = true,\r\n focusOnHide = true,\r\n finalFocusRef,\r\n 'aria-label': ariaLabel,\r\n hide,\r\n hideOnClickOutside = true,\r\n hasArrow = false,\r\n hasBackdrop = true,\r\n onOverlayClick,\r\n popoverWrapperStyle,\r\n popoverMaxHeight = Number.MAX_SAFE_INTEGER,\r\n theme = 'light',\r\n hasViewportHeightLimit = false,\r\n hasButtonWidthLimit = false,\r\n ...props\r\n}: PopoverProps) {\r\n const zIndex = useZIndex()\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const { innerHeight } = useWindowSize({ isWatching: !isFullyClosed })\r\n\r\n const buttonElement = state.unstable_referenceRef.current\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: popoverMaxHeight,\r\n hasViewportHeightLimit,\r\n offsets: state.offsets,\r\n state,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !(hasViewportHeightLimit || hasButtonWidthLimit)) return\r\n\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n\r\n // Limit popover max-width to be width of the trigger button\r\n if (hasButtonWidthLimit) {\r\n popoverWrapper?.style.setProperty('max-width', `${buttonRect.width}px`)\r\n }\r\n }, [\r\n state.visible,\r\n state.offsets,\r\n buttonElement,\r\n hasViewportHeightLimit,\r\n hasButtonWidthLimit,\r\n innerHeight,\r\n state.placement,\r\n popoverMaxHeight,\r\n ])\r\n\r\n if (isFullyClosed) return null\r\n\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n <>\r\n {\r\n // prevents from page scroll when clicked outside of popover\r\n event.preventDefault()\r\n }}\r\n />\r\n \r\n \r\n {hasArrow && (\r\n \r\n \r\n \r\n )}\r\n {children}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\nconst DEFAULT_OFFSET: [number, number] = [0, 5]\r\nconst HOVER_TIMEOUT = 150\r\n\r\nconst preventDefault = (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n}\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState(settings?: Reakit.PopoverInitialState) {\r\n const offsets = (settings?.unstable_offset ?? DEFAULT_OFFSET) as [number, number]\r\n const popover = Reakit.usePopoverState({\r\n ...settings,\r\n placement: settings?.placement ?? 'bottom-start',\r\n unstable_offset: offsets,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n })\r\n\r\n return { ...popover, offsets }\r\n}\r\n\r\nexport function useHoverPopover(settings?: Reakit.PopoverInitialState) {\r\n const popover = usePopoverState(settings)\r\n const showTimeout = React.useRef(null)\r\n const hideTimeout = React.useRef(null)\r\n\r\n const clearTimeouts = React.useRef(() => {\r\n if (showTimeout.current !== null) {\r\n window.clearTimeout(showTimeout.current)\r\n }\r\n if (hideTimeout.current !== null) {\r\n window.clearTimeout(hideTimeout.current)\r\n }\r\n })\r\n\r\n const showPopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n showTimeout.current = window.setTimeout(() => {\r\n popover.show()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n const hidePopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n hideTimeout.current = window.setTimeout(() => {\r\n popover.hide()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n // Unmount cleanup\r\n React.useEffect(() => () => clearTimeouts.current(), [])\r\n\r\n return {\r\n ...popover,\r\n show: showPopover.current,\r\n hide: hidePopover.current,\r\n onMouseOver: showPopover.current,\r\n onMouseOut: hidePopover.current,\r\n onMouseDown: preventDefault,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { useZIndex } from '../dialog'\r\n\r\ninterface PopoverButtonProps extends Reakit.PopoverDisclosureHTMLProps {\r\n state: Reakit.PopoverStateReturn\r\n as?: React.ElementType\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverButtonProps, ref: React.ForwardedRef) => {\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SelectItem, SelectItemGroup } from './types'\r\nimport { flattenItems, isSelectItemGroup } from './utils'\r\n\r\ninterface NativeSelectProps extends Omit, 'onChange'> {\r\n items: ItemType[]\r\n onChange?: (item: ItemType) => void\r\n}\r\n\r\nexport function NativeSelect | SelectItem>({\r\n items,\r\n onChange,\r\n placeholder = 'Select value',\r\n ...props\r\n}: NativeSelectProps) {\r\n const showPlaceholder = props.value === -1\r\n const handleNativeSelectChange = React.useCallback(\r\n (e: React.ChangeEvent) => {\r\n const itemIndex = e.target.selectedIndex + (showPlaceholder ? -1 : 0)\r\n const selectedItem = flattenItems(items)[itemIndex] as SelectItem\r\n\r\n if (!selectedItem) return\r\n\r\n onChange?.(selectedItem as any)\r\n\r\n if (!selectedItem.href || !selectedItem.reloadDocument) {\r\n return\r\n }\r\n\r\n if (typeof selectedItem.href === 'string') {\r\n window.location.href = selectedItem.href\r\n return\r\n }\r\n\r\n const newUrl = new URL(selectedItem.href.pathname!, window.location.href)\r\n newUrl.search = selectedItem.href.search ?? ''\r\n newUrl.hash = selectedItem.href.hash ?? ''\r\n\r\n window.location.href = newUrl.toString()\r\n },\r\n [items, onChange, showPlaceholder]\r\n )\r\n\r\n return (\r\n \r\n {showPlaceholder && }\r\n {items.map((item, itemIndex) => {\r\n if (isSelectItemGroup(item)) {\r\n return (\r\n \r\n {item.items.map((option, optionIndex) => (\r\n \r\n ))}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport function NativeSelectInRouterContext | SelectItem>(\r\n props: NativeSelectProps\r\n) {\r\n const navigate = useNavigate()\r\n\r\n const onChangeWithNavigate = React.useCallback(\r\n (item: SelectItem) => {\r\n props.onChange?.(item as any)\r\n\r\n if (item.href) navigate(item.href)\r\n },\r\n // We don’t need the whole props here, just onChange and items\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [navigate, props.onChange, props.items]\r\n )\r\n\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface ItemsGroupProps extends Omit, 'ref' | 'label'> {\r\n /**\r\n * Group label\r\n */\r\n label?: string\r\n}\r\n\r\nexport const ItemsGroup = React.forwardRef(function ItemsGroup(\r\n { label, children, ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {label && {label}}\r\n {children}\r\n \r\n )\r\n})\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonPadding, ButtonThemeType } from '../button'\r\n\r\ninterface InternalOptionProps {\r\n /**\r\n * Description for the option\r\n */\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Set the button theme when it is selected\r\n */\r\n activeTheme?: ButtonThemeType\r\n\r\n /**\r\n * Set the base button theme when not selected\r\n */\r\n theme?: ButtonThemeType | ((isHovered: boolean) => ButtonThemeType)\r\n}\r\n\r\nfunction getDefaultTheme(isHovered: boolean) {\r\n return isHovered ? 'menuItem' : 'menuItemTransparent'\r\n}\r\n\r\nconst InternalOption = React.forwardRef(function InternalOption<\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n {\r\n subtitle,\r\n children,\r\n 'aria-selected': ariaSelected,\r\n 'data-active-item': dataActiveItem,\r\n rounding = 'small',\r\n activeTheme = 'blue',\r\n theme = getDefaultTheme,\r\n ...props\r\n }: Omit, 'theme'> & InternalOptionProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSelected = ariaSelected === true\r\n const isHovered = dataActiveItem === true\r\n const defaultTheme = typeof theme === 'function' ? theme(isHovered) : theme\r\n\r\n return (\r\n )}\r\n ref={ref}\r\n align=\"left\"\r\n className={classNames(props.className, ButtonPadding.regular, 'select-none', {\r\n 'text-2xs': !!subtitle && !props.theme,\r\n })}\r\n contentClass={classNames(props.contentClass, 'font-normal')}\r\n rounding={rounding}\r\n active={props.active ?? (isHovered && !isSelected)}\r\n theme={isSelected ? activeTheme : defaultTheme}\r\n size={props.size ?? (subtitle ? 'none' : props.size)}\r\n aria-selected={ariaSelected}\r\n data-active-item={dataActiveItem}\r\n >\r\n {children}\r\n {subtitle && (\r\n \r\n {subtitle}\r\n \r\n )}\r\n \r\n )\r\n})\r\n\r\ninterface SelectOptionProps extends InternalOptionProps {\r\n value: ValueType\r\n}\r\n\r\nexport const SelectOption = React.forwardRef(function SelectOption<\r\n ValueType,\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n { as, ...props }: Omit, 'value' | 'theme'> & SelectOptionProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = Ariakit.useSelectContext()!\r\n const isComboBox = !!context.combobox\r\n\r\n return (\r\n } /> : }\r\n />\r\n )\r\n})\r\n","import { SelectRenderer, SelectRendererItemProps } from '@ariakit/react-core/select/select-renderer'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ButtonRoundingType } from '../button'\r\nimport { ItemsGroup } from './ItemsGroup'\r\nimport { SelectOption } from './SelectOption'\r\nimport { SelectItem, SelectItemGroup } from './types'\r\nimport { filterSelectOptions, getSelectItemProps, isSelectItem } from './utils'\r\n\r\ninterface SelectItemsVirtualizedProps {\r\n hasGroups: boolean\r\n itemRenderer: (item: SelectItem, providedProps?: any) => React.ReactNode\r\n}\r\n\r\nfunction SelectItemsVirtualized(props: SelectItemsVirtualizedProps) {\r\n return (\r\n \r\n {({ value: groupOritem, index, label, ...restProps }: any) => {\r\n if (isSelectItem(groupOritem)) {\r\n return props.itemRenderer(groupOritem, { key: index, ...restProps })\r\n }\r\n\r\n return (\r\n (\r\n \r\n {rendererProps.children}\r\n \r\n )}\r\n >\r\n {({ value, index, ...restItem }: SelectRendererItemProps<{ value: SelectItem }>) =>\r\n props.itemRenderer(value, { key: index, ...restItem })\r\n }\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\ninterface SelectItemsProps {\r\n searchValue: string\r\n items?: ItemType[]\r\n rounding?: ButtonRoundingType\r\n parentTestId?: string\r\n}\r\n\r\nexport function SelectItems | SelectItemGroup>({\r\n items,\r\n rounding,\r\n searchValue,\r\n parentTestId,\r\n virtualized,\r\n}: SelectItemsProps & { virtualized?: boolean }) {\r\n const isInRouterContext = useInRouterContext()\r\n const filteredItems = React.useMemo(() => filterSelectOptions(items, searchValue), [items, searchValue])\r\n\r\n const getItem = React.useCallback(\r\n (innerItem: SelectItem, providedProps?: any) => (\r\n \r\n {innerItem.label}\r\n \r\n ),\r\n [isInRouterContext, parentTestId, rounding, virtualized]\r\n )\r\n\r\n if (!filteredItems.length) {\r\n return
Nothing to select
\r\n }\r\n\r\n if (virtualized) {\r\n const hasGroups = isSelectItem(items?.[0]) === false\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n {filteredItems.map((item, index) => {\r\n if (isSelectItem(item)) {\r\n return getItem(item, { key: index })\r\n }\r\n\r\n return (\r\n \r\n {item.items.map((item, itemIndex) => getItem(item, { key: itemIndex }))}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Input } from '../input'\r\n\r\nenum ListRounding {\r\n none = '',\r\n regular = 'rounded-lg',\r\n}\r\n\r\nenum ListTheme {\r\n none = '',\r\n default = 'border border-primary bg-primary',\r\n}\r\n\r\nfunction focusWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\nfunction onBackdropClick(ev: React.MouseEvent) {\r\n ev.preventDefault()\r\n}\r\n\r\nexport interface SelectListProps {\r\n /**\r\n * Internal prop which enables input at the top of the popover list\r\n */\r\n isComboBox?: boolean\r\n\r\n /**\r\n * Set rounding for the popover list\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof ListRounding\r\n\r\n /**\r\n * Popover theme\r\n */\r\n theme?: keyof typeof ListTheme\r\n\r\n /**\r\n * The amount of space between button and its popover\r\n *\r\n * @default 4\r\n */\r\n gutter?: number\r\n\r\n /**\r\n * Change how the items are laid out\r\n *\r\n * @default vertical\r\n */\r\n orientation?: 'vertical' | 'horizontal'\r\n\r\n /**\r\n * Custom popover class\r\n */\r\n className?: string\r\n\r\n /**\r\n * Internal prop used to display no results when automatic `item` filtering doesn’t return any items\r\n */\r\n hasItemChildren?: boolean\r\n\r\n /**\r\n * Do not render the items when the popover is not visible\r\n *\r\n * @default false\r\n */\r\n unmountOnHide?: boolean\r\n}\r\n\r\nexport function SelectList({\r\n isComboBox,\r\n rounding = 'regular',\r\n theme = 'default',\r\n gutter = 4,\r\n orientation = 'vertical',\r\n className,\r\n unmountOnHide = false,\r\n hasItemChildren,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const ListElement = React.useMemo(\r\n () => (isComboBox ? Ariakit.ComboboxList : (wrapperProps: any) =>
),\r\n [isComboBox]\r\n )\r\n const context = Ariakit.useSelectContext()!\r\n const placement = context.useState('currentPlacement')\r\n const hasChildren = hasItemChildren || React.Children.count(children) > 0\r\n\r\n return (\r\n }\r\n className={classNames(\r\n className,\r\n ListRounding[rounding],\r\n ListTheme[theme],\r\n 'custom-scrollbar absolute z-dialog flex flex-col overflow-hidden shadow-modal outline-none dark:shadow-modal-dark',\r\n // These are set by popper, we just need to make sure we don’t encroach on the safe insets\r\n 'min-w-[--popover-anchor-width] max-w-[--popover-available-width]',\r\n // Animations\r\n 'opacity-0 transition duration-[250ms] data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n {\r\n // When in combobox mode, the padding is smaller so we can render a gradient under the combobox input.\r\n // Change the custom scrollbar offset so the top of the first item fits the top of our scrollbar\r\n '[--scrollbar-offset-top:theme(spacing.1)]': isComboBox,\r\n '[--scrollbar-radius:0]': ListRounding[rounding] === ListRounding.none,\r\n // Direction based styles\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-bottom))] motion-safe:-translate-y-1':\r\n placement.startsWith('bottom'),\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-top))] motion-safe:translate-y-1':\r\n placement.startsWith('top'),\r\n }\r\n )}\r\n >\r\n {isComboBox && (\r\n
\r\n
\r\n \r\n }\r\n />\r\n
\r\n
\r\n
\r\n )}\r\n \r\n {hasChildren ? children :
Nothing to select
}\r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\nimport { Portal } from 'reakit'\r\n\r\nimport { notifyOnVisibilityChange } from '../../../app/shared/documentVisibility'\r\nimport { TooltipArrow } from '../tooltip/tooltip-arrow'\r\nimport { TooltipBox } from '../tooltip/tooltip-box'\r\n\r\nfunction TooltipInner(props: any) {\r\n const tooltipContext = Ariakit.useTooltipContext()\r\n const currentPlacement = tooltipContext?.useState('currentPlacement') ?? 'auto'\r\n\r\n /**\r\n * Ignore focus re-trigger (do not show tooltip) when page visibility/focus state changes\r\n * - some browsers re-trigger focus on `activeElement` when document becomes visible\r\n */\r\n React.useEffect(() => {\r\n const subscription = notifyOnVisibilityChange((visible) => {\r\n if (!visible) tooltipContext?.hide()\r\n })\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n // Changing this to `tooltip` dependency will run this effect on every render\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n // Temporary fix for modal reakit dialogs\r\n \r\n \r\n \r\n \r\n \r\n
\r\n }\r\n />\r\n {props.children}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport function SelectTooltipWrapper({ content, children }: { content?: React.ReactNode; children: JSX.Element }) {\r\n const context = Ariakit.useSelectContext()\r\n const isPopoverOpen = context?.useState('open')\r\n const hasShownTooltip = React.useRef(false)\r\n\r\n React.useEffect(() => {\r\n if (isPopoverOpen) hasShownTooltip.current = true\r\n }, [isPopoverOpen])\r\n\r\n if (!content) return null\r\n\r\n return (\r\n \r\n {\r\n // Do not open again unless user focuses the button again (or presses another ESC)\r\n if (hasShownTooltip.current) ev.preventDefault()\r\n hasShownTooltip.current = false\r\n }}\r\n />\r\n {content}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport { Placement } from '@popperjs/core'\r\nimport * as React from 'react'\r\n\r\nimport { SelectButtonProps } from './SelectButton'\r\nimport { SelectItems } from './SelectItems'\r\nimport { SelectList, SelectListProps } from './SelectList'\r\nimport { SelectTooltipWrapper } from './SelectTooltipWrapper'\r\nimport { SelectItem, SelectItemGroup } from './types'\r\nimport { isSelectItem } from './utils'\r\n\r\nexport interface DesktopSelectProps\r\n extends Omit<\r\n SelectButtonProps,\r\n // Fix clash with `button` element html props\r\n 'value' | 'defaultValue' | 'onChange' | 'label' | 'name' | 'valueOverride'\r\n >,\r\n Pick {\r\n /**\r\n * Name of the select which coudl be used to distinguish onChange events.\r\n * Passed as 2nd argument to `onChange`\r\n */\r\n name?: Name\r\n\r\n /**\r\n * Set value for the select\r\n */\r\n value?: ValueType\r\n\r\n /**\r\n * Set default value for an uncontrolled select\r\n */\r\n defaultValue?: ValueType\r\n\r\n /**\r\n * Label to display above the select\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Callback when item changes. Called for both controlled and uncontrolled selects\r\n */\r\n onChange?: (\r\n item: ItemType extends SelectItemGroup\r\n ? ValueType extends SelectItem\r\n ? ValueType\r\n : SelectItem\r\n : ItemType,\r\n name: Name\r\n ) => void\r\n\r\n /**\r\n * Options to select from. When defined, the options are constructed automatically\r\n * so you don’t have to pass children to the select.\r\n *\r\n * When `nativeSelect` is set to \"mobile\", children take precedence on desktop\r\n */\r\n items?: ItemType[]\r\n\r\n /**\r\n * Enable virtualization of select items to improve performance of long lists\r\n *\r\n * @default items.length > 50\r\n */\r\n virtualized?: boolean\r\n\r\n /**\r\n * Custom button renderer for the select\r\n */\r\n trigger?: JSX.Element\r\n\r\n /**\r\n * Text for the button (usually the selected value). Falls back to placeholder if not set\r\n */\r\n triggerContent?: React.ReactNode\r\n\r\n /**\r\n * Show tooltip on the select\r\n */\r\n tooltip?: React.ReactNode\r\n\r\n /**\r\n * Popover placement\r\n *\r\n * @default \"bottom-start\"\r\n */\r\n placement?: Placement\r\n\r\n /**\r\n * Change the direction of the items placement in popover\r\n *\r\n * @default vertical\r\n */\r\n orientation?: 'vertical' | 'horizontal'\r\n\r\n /**\r\n * Set whether or not the Select is interactive to save resources. If not interactive,\r\n * the select only renders a placeholder button\r\n *\r\n * @default true\r\n */\r\n isInteractive?: boolean\r\n\r\n /**\r\n * Callback when the select opens or closes\r\n */\r\n onInteractionChange?: (open: boolean) => void\r\n\r\n /**\r\n * ### Only applicable for desktop selects without `children`, when passing `items`.\r\n * ### If you want to pass `children`, use the `onSearch` prop instead.\r\n *\r\n * Specifies whether or not to show a search input inside of the popover. Number\r\n * specifies the >= number of items after which search will be visible.\r\n * Search is made for both value and label props\r\n *\r\n * @default 10\r\n */\r\n comboBox?: boolean | number\r\n\r\n /**\r\n * ### Only applicable for desktop selects with `children`.\r\n * ### Use `comboBox` if you have `items` prop\r\n * When defined, the select is considered being a combobox and will display\r\n * input for filtering items. The filtering is up to the user.\r\n */\r\n onSearch?: (value: string) => void\r\n\r\n /**\r\n * When combined with `items` the children will automatically have testid assigned.\r\n * Otherwise just passed to the trigger button\r\n */\r\n 'data-testid'?: string\r\n\r\n listProps?: SelectListProps\r\n}\r\n\r\nfunction getCollectionItem(item: SelectItem, index: number) {\r\n return {\r\n id: `item-${index}-${String(item.value).replace(/\\W/g, '')}`,\r\n label: item.label,\r\n value: item,\r\n children: item.label,\r\n }\r\n}\r\n\r\nexport function DesktopSelect<\r\n ValueType,\r\n ItemType extends SelectItem | SelectItemGroup,\r\n Name = never,\r\n>({\r\n name,\r\n label,\r\n value,\r\n defaultValue,\r\n onChange,\r\n items,\r\n virtualized = (items?.length ?? 0) > 50,\r\n trigger,\r\n tooltip,\r\n onInteractionChange,\r\n comboBox,\r\n onSearch,\r\n children,\r\n gutter,\r\n placement = 'bottom-start',\r\n orientation,\r\n listProps,\r\n ...props\r\n}: React.PropsWithChildren>) {\r\n // Used when `items` are passed to construct a desktop select with comboBox\r\n const [internalSearch, setInternalSearch] = React.useState('')\r\n\r\n // Setup combobox if enabled\r\n const isComboBox =\r\n !!onSearch || comboBox === true || (typeof comboBox === 'number' && !!items && items.length > comboBox)\r\n const SelectWrapper = isComboBox ? Ariakit.ComboboxProvider : React.Fragment\r\n const wrapperProps = React.useMemo(\r\n () =>\r\n isComboBox ? { resetValueOnHide: true, includesBaseElement: false, setValue: onSearch ?? setInternalSearch } : {},\r\n [isComboBox, onSearch]\r\n )\r\n\r\n // Handle tooltip prop\r\n const ButtonWrapper = tooltip ? SelectTooltipWrapper : React.Fragment\r\n const buttonWrapperProps = React.useMemo(() => (tooltip ? { content: tooltip } : {}), [tooltip])\r\n\r\n if (isComboBox && !!children && !onSearch) {\r\n console.warn(\r\n 'ComboBoxes with children options require `onSearch` prop, otherwise searching will not work. \\n Either provide `onSearch` or disable this behavior by passing `comboBox={false}`'\r\n )\r\n }\r\n\r\n const listItems = React.useMemo(\r\n () =>\r\n items?.map((item, index) =>\r\n isSelectItem(item) ? getCollectionItem(item, index) : { ...item, items: item.items.map(getCollectionItem) }\r\n ) as ItemType[],\r\n [items]\r\n )\r\n\r\n return (\r\n \r\n {/* @ts-expect-error - The types are wrong here, the select allows any values, not just strings or ints */}\r\n \r\n // Loop to the first item after pressing arrow down on last item\r\n focusLoop\r\n virtualFocus\r\n value={value}\r\n defaultValue={defaultValue ?? ''}\r\n // Item will always be of ItemType\r\n setValue={(item) => setTimeout(() => onChange?.(item as any, name!), 50)}\r\n setOpen={onInteractionChange}\r\n placement={placement}\r\n orientation={orientation}\r\n defaultItems={listItems}\r\n >\r\n {label && {label}}\r\n\r\n \r\n \r\n \r\n\r\n \r\n {/* Either construct options from children or provided items prop */}\r\n {children ?? (\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps, ButtonSize } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { SelectItem } from './types'\r\nimport { isSelectItem } from './utils'\r\n\r\ntype ValueType = SelectItem | string\r\n\r\nconst DEFAULT_RIGHT_ICON = 'caretDown'\r\n\r\nexport interface SelectButtonProps extends Omit, Omit {\r\n /**\r\n * Show a spinner in place of the button caret. The spinner is wrapped in Delayed\r\n * and uses the default timeout\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Placeholder when no value is selected\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Override for the select value from context. Used to provide value for native\r\n * select trigger\r\n */\r\n valueOverride?: ValueType\r\n\r\n rightContent?: boolean | IconNameType | JSX.Element\r\n}\r\n\r\nexport const SelectButton = React.forwardRef>(\r\n function SelectButton(\r\n {\r\n isLoading,\r\n placeholder = 'Select value',\r\n children,\r\n valueOverride,\r\n theme = 'outline',\r\n rightContent = DEFAULT_RIGHT_ICON,\r\n ...props\r\n },\r\n ref\r\n ) {\r\n const context = Ariakit.useSelectContext()\r\n const contextValue = context?.useState('value') as ValueType\r\n const isOpen = context?.useState('open')\r\n const selectedValue = valueOverride ?? contextValue\r\n\r\n let buttonText = placeholder\r\n if (isSelectItem(selectedValue)) buttonText = selectedValue.label ?? selectedValue.value\r\n else if (typeof selectedValue === 'string' && selectedValue.length) buttonText = selectedValue\r\n else if (selectedValue) buttonText = String(selectedValue)\r\n\r\n const rightIcon =\r\n isValidIconName(rightContent) || rightContent === true ? (\r\n \r\n ) : React.isValidElement(rightContent) ? (\r\n rightContent\r\n ) : undefined\r\n\r\n return (\r\n \r\n \r\n \r\n ) : (\r\n rightIcon\r\n )\r\n }\r\n >\r\n {children ?? buttonText}\r\n \r\n )\r\n }\r\n)\r\n","import * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { DesktopSelect, DesktopSelectProps } from './DesktopSelect'\r\nimport { NativeSelect, NativeSelectInRouterContext } from './NativeSelect'\r\nimport { SelectButton } from './SelectButton'\r\nimport { SelectItem } from './types'\r\nimport { findSelectedIndex, findSelectedValue } from './utils'\r\n\r\nconst isMobileDevice = isMobile()\r\n\r\nexport interface SelectProps extends DesktopSelectProps {\r\n /**\r\n * Whether or not to show a native select when clicking the button.\r\n * When rendering native select, you must provide `items`, `value` and `onChange`\r\n *\r\n * @default false\r\n */\r\n nativeSelect?: boolean | 'mobile'\r\n}\r\n\r\nexport function Select({\r\n name,\r\n label,\r\n value: providedValue,\r\n defaultValue: providedDefaultValue,\r\n onChange,\r\n items,\r\n trigger,\r\n gutter,\r\n orientation,\r\n triggerContent,\r\n isInteractive = true,\r\n onInteractionChange,\r\n nativeSelect = false,\r\n comboBox = 10,\r\n onSearch,\r\n 'data-testid': dataTestid,\r\n listProps,\r\n virtualized,\r\n ...props\r\n}: React.PropsWithChildren>) {\r\n // Used by native select to handle navigation for link items\r\n const isInRouterContext = useInRouterContext()\r\n // Let users either provide the selected item or its value. Items can also be grouped so we need to find the correct value\r\n const value = findSelectedValue(items, providedValue) ?? providedValue\r\n const defaultValue = findSelectedValue(items, providedDefaultValue) ?? providedDefaultValue\r\n\r\n // Extracted trigger to a variable because it is used in every branch\r\n const selectTrigger = trigger ?? (\r\n ) : undefined}\r\n data-testid={dataTestid}\r\n >\r\n {triggerContent}\r\n \r\n )\r\n\r\n // Save some resources by rendering the trigger only\r\n if (!isInteractive) {\r\n return selectTrigger\r\n }\r\n\r\n const renderNativeSelect = nativeSelect === true || (nativeSelect === 'mobile' && isMobileDevice)\r\n if (renderNativeSelect) {\r\n const NativeSelectComponent = isInRouterContext ? NativeSelectInRouterContext : NativeSelect\r\n const selectedIndex = findSelectedIndex(items, providedValue ?? providedDefaultValue)\r\n\r\n return (\r\n
\r\n {selectTrigger}\r\n
\r\n )\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Link } from 'react-router-dom'\r\n\r\nimport { SelectItem, SelectItemGroup } from './types'\r\n\r\nexport function getSelectItemProps(item: SelectItem, inRouterContext?: boolean) {\r\n if (item.href) {\r\n if (inRouterContext) return { as: Link, to: item.href, reloadDocument: item.reloadDocument }\r\n else return { as: 'a', href: item.href }\r\n }\r\n\r\n return {}\r\n}\r\n\r\nexport function isSelectItem(item: unknown): item is SelectItem {\r\n return !!(item?.hasOwnProperty('label') && item?.hasOwnProperty('value')) && !item?.hasOwnProperty('items')\r\n}\r\n\r\nexport function isSelectItemGroup(item: unknown): item is SelectItemGroup {\r\n return !!item?.hasOwnProperty('items')\r\n}\r\n\r\nfunction matchesSearchTerm(item: SelectItem, searchTerm: string) {\r\n const lowerSearch = searchTerm.toLowerCase()\r\n\r\n return (\r\n (typeof item.value === 'string' && item.value.toLowerCase().includes(lowerSearch)) ||\r\n item.label.toLowerCase().includes(lowerSearch)\r\n )\r\n}\r\n\r\nfunction isSameItem(obj1: unknown, obj2?: unknown) {\r\n if (isSelectItem(obj1) && isSelectItem(obj2)) return obj1.value === obj2.value\r\n else if (isSelectItem(obj1)) return obj1.value === obj2\r\n return obj1 === obj2\r\n}\r\n\r\n/**\r\n * Used in combobox to find matching items\r\n */\r\nexport function filterSelectOptions | SelectItemGroup>(\r\n items: ItemType[] | undefined,\r\n searchTerm: string\r\n) {\r\n const finalResults: ItemType[] = []\r\n\r\n items?.forEach((item) => {\r\n if (isSelectItemGroup(item)) {\r\n const filtered = item.items.filter((option) => matchesSearchTerm(option, searchTerm))\r\n if (filtered.length) finalResults.push({ ...item, items: filtered })\r\n } else if (matchesSearchTerm(item, searchTerm)) {\r\n finalResults.push(item)\r\n }\r\n })\r\n\r\n return finalResults\r\n}\r\n\r\n/**\r\n * Used in select to allow users to pass any kind of valid value\r\n */\r\nexport function findSelectedValue(\r\n items: ItemType[] = [],\r\n value?: ValueType | SelectItem\r\n) {\r\n for (const item of items) {\r\n if (isSelectItemGroup(item)) {\r\n const foundItem = item.items.find((option) => isSameItem(option, value)) as SelectItem\r\n if (foundItem) return foundItem\r\n } else if (isSameItem(item, value)) {\r\n return item as SelectItem\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Used for native selects to match against user provided value\r\n */\r\nexport function findSelectedIndex(\r\n items: ItemType[] = [],\r\n value?: ValueType | SelectItem\r\n) {\r\n for (let index = 0; index < items.length; index++) {\r\n const item = items[index]\r\n\r\n if (isSelectItemGroup(item)) {\r\n const itemIndex = item.items.findIndex((option) => isSameItem(option, value))\r\n if (itemIndex > -1) return `${index}${itemIndex}`\r\n } else if (isSameItem(item, value)) {\r\n return index\r\n }\r\n }\r\n\r\n return -1\r\n}\r\n\r\nexport function flattenItems(items: ItemType[]) {\r\n return items.flatMap((itemOrGroup) =>\r\n isSelectItemGroup(itemOrGroup) ? (itemOrGroup.items as ItemType[]) : itemOrGroup\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Link, To } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { ButtonRoundingType, ButtonSizeType } from '../button'\r\nimport { DropdownSeparator } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { Select, SelectOption } from '../select'\r\nimport { SelectItem } from '../select/types'\r\n\r\nexport interface DateRangeBaseOption extends SelectItem {\r\n timeframe?: TIMEFRAME\r\n href?: To\r\n withReload?: boolean\r\n}\r\n\r\ninterface Props {\r\n chartIndex: number\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedDateRange: string | null\r\n onDateRangeSelect: (value: DateRange) => void\r\n onCustomDateRangeClick?: () => void\r\n rounding?: ButtonRoundingType\r\n size?: ButtonSizeType\r\n}\r\n\r\nconst DATERANGE_TOOLTIP = 'Range'\r\n\r\nexport function DateRangeSelect({\r\n size,\r\n chartIndex,\r\n dateRangeGroups,\r\n selectedDateRange,\r\n onDateRangeSelect,\r\n onCustomDateRangeClick,\r\n rounding,\r\n}: Props) {\r\n const flatDateRanges = React.useMemo(() => dateRangeGroups.flatMap(({ dateRanges }) => dateRanges), [dateRangeGroups])\r\n\r\n return (\r\n {\r\n onDateRangeSelect(flatDateRanges.find((item) => item.value === value)!)\r\n }}\r\n rounding={rounding}\r\n appearance=\"square\"\r\n theme=\"chip\"\r\n size={size}\r\n triggerContent={}\r\n rightContent={false}\r\n active={selectedDateRange ? true : undefined}\r\n data-testid={`chart-${chartIndex}-date-range-select`}\r\n >\r\n {dateRangeGroups.flatMap(({ label, dateRanges }, index) => [\r\n {label},\r\n ...dateRanges.map(({ href, value, label, withReload, timeframe }) => {\r\n let linkProps = {}\r\n if (href) {\r\n linkProps = {\r\n as: Link,\r\n to: href,\r\n reloadDocument: withReload ?? !FinvizSettings.hasUserPremium,\r\n }\r\n }\r\n return (\r\n {\r\n if (!timeframe) onCustomDateRangeClick?.()\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Delayed } from '../delayed'\r\nimport { Spinner } from '../spinner'\r\n\r\ninterface Props {\r\n label: React.ReactNode\r\n isLoading: boolean\r\n}\r\n\r\nexport function LabelWithDelayedSpinner({ label, isLoading }: Props) {\r\n return (\r\n <>\r\n {label}\r\n {isLoading && (\r\n
\r\n {label}}>\r\n \r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link, To } from 'react-router-dom'\r\n\r\nimport { Button, ButtonProps, ButtonRoundingType, ButtonSizeType } from '../button'\r\nimport { DropdownSeparator } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { SelectItem } from '../select'\r\nimport { Select, SelectOption } from '../select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\n\r\nexport type TimeframeBaseOption = SelectItem & {\r\n labelShort?: string\r\n labelPageTitle?: string\r\n href?: To\r\n withReload?: boolean\r\n}\r\n\r\ninterface Props {\r\n chartIndex: number\r\n isCompactView: boolean\r\n isCompactOnly: boolean\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n selectedTimeframe: string\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n rounding?: ButtonRoundingType\r\n size?: ButtonSizeType\r\n isLoading?: boolean\r\n isFavoritesEnabled: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nconst TIMEFRAME_TOOLTIP = 'Interval'\r\n\r\nexport function TimeframeSelect({\r\n size,\r\n chartIndex,\r\n timeFrameGroups,\r\n selectedTimeframe,\r\n favoriteTimeframes,\r\n isLoading = false,\r\n isCompactView,\r\n isCompactOnly,\r\n onTimeframeSelect,\r\n onFavoriteTimeframeToggle,\r\n rounding,\r\n isFavoritesEnabled,\r\n theme = 'chip',\r\n}: Props) {\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const getSelectedTimeframeLabel = React.useCallback(() => {\r\n if (isCompactView) {\r\n const selectedTimeframeItem = flatTimeframes.find(({ value }) => value === selectedTimeframe)\r\n return selectedTimeframeItem?.labelShort ?? selectedTimeframeItem?.label\r\n }\r\n return ''\r\n }, [flatTimeframes, isCompactView, selectedTimeframe])\r\n\r\n return (\r\n item.value === selectedTimeframe)}\r\n leftContent={\r\n
\r\n } isLoading={isLoading && isCompactView} />\r\n
\r\n }\r\n onChange={(item) => onTimeframeSelect(item as TimeFrame)}\r\n data-testid={`chart-${chartIndex}-timeframe-select`}\r\n >\r\n {timeFrameGroups.flatMap(({ timeframes }, groupIndex) => [\r\n ,\r\n ...timeframes.map((item) => {\r\n const isIconButtonActive = favoriteTimeframes.includes(item.value)\r\n let linkProps = {}\r\n if (item.href) {\r\n linkProps = {\r\n as: Link,\r\n to: item.href,\r\n reloadDocument: !!item.withReload,\r\n }\r\n }\r\n return (\r\n ) => {\r\n ev.stopPropagation()\r\n ev.preventDefault()\r\n onFavoriteTimeframeToggle(item)\r\n }}\r\n className={classNames('group -mr-2', {\r\n 'text-gray-300': !isIconButtonActive,\r\n 'text-yellow-200': isIconButtonActive,\r\n })}\r\n >\r\n \r\n \r\n \r\n ) : undefined\r\n }\r\n >\r\n {item.label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { Button, ButtonPadding, ButtonProps, ButtonRoundingType, ButtonSize, ButtonSizeType } from '../button'\r\nimport { DateRangeBaseOption, DateRangeSelect } from './daterange-select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\nimport { TimeframeBaseOption, TimeframeSelect } from './timeframe-select'\r\n\r\ninterface Props {\r\n isPremium?: boolean\r\n chartIndex?: number\r\n compactViewMaxBreakpointPx?: number\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedTimeframe: string\r\n selectedDateRange: string | null\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n onDateRangeSelect: (value: DateRange) => void\r\n onCustomDateRangeClick?: () => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n size?: ButtonSizeType\r\n loadingTimeframe?: string\r\n rounding?: ButtonRoundingType\r\n isDateRangeAvailable?: boolean\r\n containerElement?: HTMLElement\r\n className?: string\r\n isFavoritesEnabled?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n isTimeframeSelectEnabled?: boolean\r\n isCompactOnly?: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nfunction getTimeframeChipElementId({ timeframe, chartIndex }: { timeframe: string; chartIndex: number }) {\r\n return `${chartIndex}-${timeframe}`\r\n}\r\n\r\nfunction getButtonPadding(size: ButtonSize): keyof typeof ButtonPadding {\r\n switch (size) {\r\n case ButtonSize.xxsmall:\r\n case ButtonSize.xsmall:\r\n case ButtonSize.small:\r\n case ButtonSize.regular:\r\n return 'small'\r\n case ButtonSize.medium:\r\n return 'regular'\r\n case ButtonSize.large:\r\n return 'medium'\r\n case ButtonSize.none:\r\n return 'none'\r\n }\r\n}\r\n\r\nexport function TimeframeBar({\r\n isPremium = FinvizSettings.hasUserPremium,\r\n chartIndex = 0,\r\n compactViewMaxBreakpointPx = 400,\r\n timeFrameGroups,\r\n dateRangeGroups,\r\n selectedTimeframe,\r\n selectedDateRange,\r\n favoriteTimeframes,\r\n loadingTimeframe,\r\n onTimeframeSelect,\r\n onDateRangeSelect,\r\n onCustomDateRangeClick,\r\n onFavoriteTimeframeToggle,\r\n size,\r\n rounding,\r\n isDateRangeAvailable = true,\r\n containerElement,\r\n className,\r\n isFavoritesEnabled = true,\r\n isScrollIntoViewEnabled = true,\r\n isTimeframeSelectEnabled,\r\n isCompactOnly = false,\r\n theme,\r\n}: Props) {\r\n const [scrollWrapperElement, setScrollWrapperElement] = React.useState(null)\r\n const [timeframeButtonsScrollLocation, setTimeframeButtonsScrollLocation] = React.useState({\r\n isOnLeftEdge: true,\r\n isOnRightEdge: true,\r\n })\r\n const { setElementRef, elementWidth } = useElementMeasure(containerElement)\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const timeframesInExpandedPanel = React.useMemo(\r\n () =>\r\n isFavoritesEnabled\r\n ? flatTimeframes.filter(({ value }) => value === selectedTimeframe || favoriteTimeframes.includes(value))\r\n : flatTimeframes,\r\n [flatTimeframes, selectedTimeframe, favoriteTimeframes, isFavoritesEnabled]\r\n )\r\n\r\n const isCompactView =\r\n isCompactOnly || elementWidth < compactViewMaxBreakpointPx || timeframesInExpandedPanel.length <= 1\r\n const checkTimeframeWrapperScrollPosition = React.useCallback(() => {\r\n if (scrollWrapperElement) {\r\n const isOnLeftEdge = scrollWrapperElement.scrollLeft === 0\r\n const isOnRightEdge =\r\n Math.ceil(scrollWrapperElement.offsetWidth + scrollWrapperElement.scrollLeft) >=\r\n scrollWrapperElement.scrollWidth\r\n\r\n if (\r\n timeframeButtonsScrollLocation.isOnLeftEdge !== isOnLeftEdge ||\r\n timeframeButtonsScrollLocation.isOnRightEdge !== isOnRightEdge\r\n ) {\r\n setTimeframeButtonsScrollLocation({ isOnLeftEdge, isOnRightEdge })\r\n }\r\n }\r\n }, [timeframeButtonsScrollLocation, scrollWrapperElement])\r\n\r\n React.useEffect(() => {\r\n checkTimeframeWrapperScrollPosition()\r\n }, [checkTimeframeWrapperScrollPosition, scrollWrapperElement, elementWidth])\r\n\r\n React.useEffect(() => {\r\n if (!isCompactView && isScrollIntoViewEnabled) {\r\n const timeframeElement = document.getElementById(\r\n getTimeframeChipElementId({ chartIndex, timeframe: selectedTimeframe })\r\n )\r\n\r\n if (timeframeElement && scrollWrapperElement) {\r\n const leftOffset =\r\n timeframeElement.offsetLeft + timeframeElement.clientWidth / 2 - scrollWrapperElement.clientWidth / 2\r\n\r\n scrollWrapperElement.scrollTo(Math.max(0, Math.min(leftOffset, scrollWrapperElement.scrollWidth)), 0)\r\n }\r\n }\r\n }, [isCompactView, chartIndex, selectedTimeframe, elementWidth, isScrollIntoViewEnabled, scrollWrapperElement])\r\n\r\n return (\r\n \r\n {(isTimeframeSelectEnabled ?? isFavoritesEnabled) && (\r\n
\r\n \r\n
\r\n )}\r\n {!isCompactView && (\r\n
\r\n \r\n {\r\n /*\r\n * Vertical scrolling doesn't scroll horizontally by default (it's possible when holding shift)\r\n * When using touchpad we may get values in both delatX and deltaY, so if someone's scrolling horizontally we don't want to do anything\r\n * but if they are scrolling vertically (deltaY > deltaX) we want to scroll horizontally the value they would nativally scroll in vertical direction\r\n * */\r\n const absDx = Math.abs(event.deltaX)\r\n const absDy = Math.abs(event.deltaY)\r\n if (absDy > absDx) {\r\n event.currentTarget.scrollLeft += event.deltaY\r\n }\r\n }}\r\n >\r\n {timeframesInExpandedPanel.map((timeframe) => {\r\n let linkProps = {}\r\n if (timeframe.href) {\r\n linkProps = {\r\n as: Link,\r\n to: timeframe.href,\r\n reloadDocument: timeframe.withReload ?? !isPremium,\r\n onClick: () => onTimeframeSelect(timeframe),\r\n }\r\n } else {\r\n linkProps = {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n onTimeframeSelect(timeframe)\r\n },\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n
\r\n \r\n
\r\n )}\r\n {isDateRangeAvailable && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { type To } from 'react-router-dom'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../../app/queryString'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../constants'\r\nimport { DateRangeType, Instrument } from '../../types'\r\nimport { CUSTOM_DATE_RANGE, CustomDateRangePrefixEnum, DATE_RANGE_PREFIX_DELMITER } from './custom-date-range-utils'\r\n\r\ninterface ITimeFrame {\r\n value: TIMEFRAME | 'intraday'\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\nexport interface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\ninterface IDateRange {\r\n value: string\r\n label: string\r\n timeframe?: TIMEFRAME\r\n}\r\n\r\nexport interface IRangeGroup {\r\n label?: string\r\n dateRanges: IDateRange[]\r\n}\r\n\r\nexport const generateTimeframeGroups = (isPremium = true): ITimeframeGroup[] => {\r\n const premiumTimeframes: ITimeframeGroup[] = [\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.i1, label: '1 Minute', labelShort: '1M' },\r\n { value: TIMEFRAME.i2, label: '2 Minutes', labelShort: '2M' },\r\n { value: TIMEFRAME.i3, label: '3 Minutes', labelShort: '3M' },\r\n { value: TIMEFRAME.i5, label: '5 Minutes', labelShort: '5M' },\r\n { value: TIMEFRAME.i10, label: '10 Minutes', labelShort: '10M' },\r\n { value: TIMEFRAME.i15, label: '15 Minutes', labelShort: '15M' },\r\n { value: TIMEFRAME.i30, label: '30 Minutes', labelShort: '30M' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.h, label: '1 Hour', labelShort: '1H', labelPageTitle: 'Hourly' },\r\n { value: TIMEFRAME.h2, label: '2 Hours', labelShort: '2H' },\r\n { value: TIMEFRAME.h4, label: '4 Hours', labelShort: '4H' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'D', labelPageTitle: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'W', labelPageTitle: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'M', labelPageTitle: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n const freeTimeframes = [\r\n {\r\n // intradayTimeframe is only for non premium users used as redirect to elite subscription\r\n label: '',\r\n timeframes: [{ value: 'intraday' as const, label: 'Intraday', labelShort: 'Intraday' }],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n return isPremium ? premiumTimeframes : freeTimeframes\r\n}\r\n\r\nexport function getTimeframeGroups(isPremium: boolean) {\r\n return generateTimeframeGroups(isPremium)\r\n}\r\n\r\nexport const generateDateRangeGroups = ({\r\n isPremium,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n instrument: Instrument\r\n}): IRangeGroup[] => {\r\n const isStock = instrument === Instrument.Stock\r\n const rangeGroups: Array<{ label?: string; dateRanges: IDateRange[] }> = [\r\n {\r\n label: 'Days',\r\n dateRanges: [\r\n { value: DateRangeType.d1, label: '1 Day', timeframe: isStock ? TIMEFRAME.i1 : TIMEFRAME.i5 },\r\n { value: DateRangeType.d5, label: '5 Days', timeframe: isStock ? TIMEFRAME.i5 : TIMEFRAME.i30 },\r\n ],\r\n },\r\n {\r\n label: 'Months',\r\n dateRanges: [\r\n { value: DateRangeType.m1, label: '1 Month', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m3, label: '3 Months', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m6, label: '6 Months', timeframe: TIMEFRAME.d },\r\n ],\r\n },\r\n {\r\n label: 'Years',\r\n dateRanges: [\r\n { value: DateRangeType.ytd, label: 'Year to Date', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y1, label: '1 Year', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y2, label: '2 Years', timeframe: TIMEFRAME.w },\r\n { value: DateRangeType.y5, label: '5 Years', timeframe: isPremium ? TIMEFRAME.w : TIMEFRAME.m },\r\n { value: DateRangeType.max, label: 'Max', timeframe: TIMEFRAME.m },\r\n ],\r\n },\r\n ]\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroups({\r\n isPremium,\r\n customRange,\r\n isCustomAvailable = true,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n customRange?: string\r\n isCustomAvailable?: boolean\r\n instrument: Instrument\r\n}) {\r\n const rangeGroups = generateDateRangeGroups({ isPremium, instrument })\r\n\r\n if (isPremium && isCustomAvailable !== false) {\r\n const [dateRangePrefix] = customRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n rangeGroups.push({\r\n dateRanges: [\r\n {\r\n value:\r\n customRange && Object.values(CustomDateRangePrefixEnum).includes(dateRangePrefix)\r\n ? customRange\r\n : CUSTOM_DATE_RANGE,\r\n label: 'Custom',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n generatePath,\r\n withReload,\r\n isCustomAvailable,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n isCustomAvailable?: boolean\r\n customRange?: string\r\n withReload?: boolean\r\n instrument: Instrument\r\n generatePath: (dateRange: IDateRange) => To\r\n}) {\r\n return getDateRangeGroups({\r\n isPremium,\r\n isCustomAvailable,\r\n customRange,\r\n instrument,\r\n }).map((dateRangeGroup: IRangeGroup) => ({\r\n label: dateRangeGroup.label,\r\n dateRanges: dateRangeGroup.dateRanges.map((dateRange) => ({\r\n ...dateRange,\r\n href:\r\n !isPremium || Object.values(DateRangeType).includes(dateRange.value as DateRangeType)\r\n ? generatePath(dateRange)\r\n : undefined,\r\n withReload: withReload ?? !isPremium,\r\n })),\r\n }))\r\n}\r\n\r\nconst FREE_PERIODS_STOCK = ['d', 'w', 'm']\r\n\r\nexport function generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname,\r\n timeframe,\r\n dateRange,\r\n utmCampaign,\r\n freeTimeframes = FREE_PERIODS_STOCK,\r\n dateRangeQueryKey = 'r',\r\n}: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n utmCampaign?: string\r\n freeTimeframes?: string[]\r\n dateRangeQueryKey?: string\r\n}) {\r\n if (isPremium || freeTimeframes.includes(timeframe)) {\r\n return {\r\n pathname,\r\n search: `?${encodeQueryString({\r\n ...decodeQueryString(),\r\n i: undefined,\r\n p: timeframe,\r\n [dateRangeQueryKey]: dateRange ?? undefined,\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n pathname: '/elite.ashx',\r\n search: `?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign || window.location.pathname,\r\n })}`,\r\n }\r\n}\r\n\r\nexport const timeframeUtm: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-timeframe',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe',\r\n}\r\n\r\nexport const daterangeUtm: Partial> = {\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe-daterange',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe-daterange',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe-daterange',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { generateDateRangeGroups } from './utils'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// charts: app/utils/chart-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange?: string) {\r\n return dateRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nconst DAYS_IN_YEAR = 365\r\n\r\nexport function getCustomStartEndDateRangeUrlParam({ start, end }: { start: Date | null; end: Date | null }) {\r\n const startString = start ? formatDateToStringUS(start) : ''\r\n const endString = end ? formatDateToStringUS(end) : ''\r\n\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Range,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n startString,\r\n CUSTOM_DATE_RANGE_DELIMITER,\r\n endString,\r\n ]\r\n\r\n return stringParts.join('').replace(/\\//g, '-')\r\n}\r\n\r\nexport function getPrevPeriodDateRangeUrlParam({\r\n years,\r\n months,\r\n days,\r\n}: {\r\n years: number\r\n months: number\r\n days: number\r\n}) {\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Prev,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n years,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n months,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n days,\r\n ]\r\n\r\n return stringParts.join('')\r\n}\r\n\r\nexport function getTimeframeForDateRangeType({\r\n dateRange,\r\n isPremium = true,\r\n instrument,\r\n}: {\r\n dateRange: string\r\n isPremium?: boolean\r\n instrument: Instrument\r\n}) {\r\n const dateRanges = generateDateRangeGroups({ isPremium, instrument }).flatMap(({ dateRanges }) => dateRanges)\r\n return dateRanges.find(({ value }) => value === dateRange)?.timeframe ?? null\r\n}\r\n\r\nexport function getTimeframeFromDateRange({\r\n dateRange,\r\n anchorDate,\r\n instrument,\r\n isPremium,\r\n}: {\r\n dateRange: string\r\n anchorDate: Date\r\n instrument: Instrument\r\n isPremium: boolean\r\n}) {\r\n const dateRangeTimeframe = getTimeframeForDateRangeType({ dateRange, instrument })\r\n if (dateRangeTimeframe) {\r\n return dateRangeTimeframe\r\n }\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n const startNyTime = start ?? new Date(0)\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, startNyTime) + 1\r\n const rangeNumOfDays = dateFns.differenceInCalendarDays(end ?? anchorDate, startNyTime) + 1\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n if (rangeNumOfDays > 6 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 4 * DAYS_IN_YEAR) {\r\n return isPremium ? TIMEFRAME.w : TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 1.5 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.w\r\n }\r\n\r\n // Keep these values in sync with values in FetchQuoteIntraday in quote.cs\r\n if (instrument === Instrument.Stock) {\r\n if (rangeNumOfDays <= 1 && startToReferenceDateNumOfDays <= 11) {\r\n return TIMEFRAME.i1\r\n }\r\n\r\n if (rangeNumOfDays <= 5 && startToReferenceDateNumOfDays <= 16) {\r\n return TIMEFRAME.i5\r\n }\r\n\r\n if (rangeNumOfDays <= 7 && startToReferenceDateNumOfDays <= 200) {\r\n return TIMEFRAME.i30\r\n }\r\n } else {\r\n if (startToReferenceDateNumOfDays <= 2) {\r\n return TIMEFRAME.i5\r\n }\r\n if (startToReferenceDateNumOfDays <= 7) {\r\n return TIMEFRAME.i30\r\n }\r\n }\r\n\r\n return TIMEFRAME.d\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { Button } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { DatePicker } from '../date-picker'\r\nimport { Delayed } from '../delayed'\r\nimport { Dialog, DialogBody, DialogDismiss, DialogFooter, DialogHeader } from '../dialog'\r\nimport { Input } from '../input'\r\nimport { Spinner } from '../spinner'\r\nimport {\r\n CustomDateRangePrefixEnum,\r\n getCustomStartEndDateRangeUrlParam,\r\n getParsedDateRange,\r\n getPrevPeriodDateRangeUrlParam,\r\n parseCustomDateRangeUrlParam,\r\n} from './custom-date-range-utils'\r\n\r\nconst DATA_YEAR_START = 1980\r\nconst DATE_PICKER_MIN_DATE = new Date(`01/01/${DATA_YEAR_START}`)\r\nconst YEARS_MAX_VALUE = new Date().getFullYear() - DATA_YEAR_START\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' } as const\r\n\r\nexport enum CustomRangeType {\r\n StartEnd,\r\n Manual,\r\n}\r\n\r\ninterface StartEndRange {\r\n kind: CustomRangeType.StartEnd\r\n start: Date | null\r\n end: Date | null\r\n}\r\n\r\ninterface ManualRange {\r\n kind: CustomRangeType.Manual\r\n days?: number\r\n months?: number\r\n years?: number\r\n}\r\n\r\nexport type CustomDateRangeType = StartEndRange | ManualRange\r\n\r\ninterface DialogContentProps {\r\n /**\r\n * Dialog state\r\n */\r\n dialogState: any\r\n dateRange?: string\r\n anchorDate: Date\r\n onDialogSubmit: (args: { dateRange: string | null }) => void\r\n isFetching?: boolean\r\n}\r\n\r\nconst DEFAULT_MANUAL_RANGE: ManualRange = {\r\n kind: CustomRangeType.Manual,\r\n days: 0,\r\n months: 0,\r\n years: 0,\r\n}\r\n\r\nconst DEFAULT_START_END_RANGE: StartEndRange = {\r\n kind: CustomRangeType.StartEnd,\r\n start: null,\r\n end: null,\r\n}\r\n\r\nfunction isValidManualRangeState({ years = 0, months = 0, days = 0 }: ManualRange) {\r\n return years + months + days > 0\r\n}\r\n\r\nfunction isValidStartEndRangeState({ start, end }: StartEndRange) {\r\n return !!(start || end)\r\n}\r\n\r\nfunction getDefaultSelectedTab(dateRange?: string) {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return CustomRangeType.StartEnd\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n return CustomRangeType.Manual\r\n }\r\n }\r\n return CustomRangeType.StartEnd\r\n}\r\n\r\nfunction getDefaultSelectedDate({\r\n dateRange,\r\n anchorDate,\r\n}: {\r\n dateRange?: string\r\n anchorDate: Date\r\n}): CustomDateRangeType {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return { kind: CustomRangeType.StartEnd, start, end }\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev && start && end) {\r\n const { years, months, days } = dateFns.intervalToDuration({\r\n start: dateFns.sub(start, { days: 1 }),\r\n end,\r\n })\r\n return { kind: CustomRangeType.Manual, years, months, days }\r\n }\r\n }\r\n\r\n return DEFAULT_START_END_RANGE\r\n}\r\n\r\nexport function CustomDateRange({\r\n dialogState,\r\n dateRange,\r\n anchorDate,\r\n onDialogSubmit,\r\n isFetching,\r\n}: DialogContentProps) {\r\n const [selectedTab, setSelectedTab] = React.useState(getDefaultSelectedTab(dateRange))\r\n\r\n const [state, setState] = React.useState(getDefaultSelectedDate({ dateRange, anchorDate }))\r\n\r\n const { current: onChange } = React.useRef((kind: CustomRangeType, newValue: Partial) => {\r\n setState((prevState) => {\r\n if (kind === CustomRangeType.Manual) {\r\n const defaults = prevState?.kind === CustomRangeType.Manual ? prevState : DEFAULT_MANUAL_RANGE\r\n return { ...defaults, ...newValue } as ManualRange\r\n }\r\n if (kind === CustomRangeType.StartEnd) {\r\n const defaults = prevState?.kind === CustomRangeType.StartEnd ? prevState : DEFAULT_START_END_RANGE\r\n\r\n const newState = { ...defaults, ...newValue }\r\n if (newState.start && newState.end && newState.start.getTime() > newState.end.getTime()) {\r\n const newEnd = new Date(newState.start.getTime())\r\n newState.start = newState.end\r\n newState.end = newEnd\r\n }\r\n return newState\r\n }\r\n return prevState\r\n })\r\n })\r\n\r\n const handleSubmit = (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n\r\n let dateRange = null\r\n\r\n if (state?.kind === CustomRangeType.StartEnd && isValidStartEndRangeState(state)) {\r\n dateRange = getCustomStartEndDateRangeUrlParam({ start: state.start, end: state.end })\r\n } else if (state?.kind === CustomRangeType.Manual && isValidManualRangeState(state)) {\r\n dateRange = getPrevPeriodDateRangeUrlParam({\r\n days: state.days ?? 0,\r\n months: state.months ?? 0,\r\n years: state.years ?? 0,\r\n })\r\n }\r\n\r\n onDialogSubmit({ dateRange })\r\n }\r\n\r\n const isAbsolute = state?.kind === CustomRangeType.StartEnd\r\n const fromDate = isAbsolute ? state.start : DEFAULT_START_END_RANGE.start\r\n const toDate = isAbsolute ? state.end : DEFAULT_START_END_RANGE.end\r\n\r\n const manualRange = {\r\n ...DEFAULT_MANUAL_RANGE,\r\n ...(state?.kind === CustomRangeType.Manual ? state : {}),\r\n }\r\n\r\n return (\r\n \r\n Custom Date Range\r\n
\r\n \r\n \r\n setSelectedTab(CustomRangeType.StartEnd)}\r\n >\r\n Start / End\r\n \r\n setSelectedTab(CustomRangeType.Manual)}\r\n >\r\n Range\r\n \r\n \r\n\r\n {selectedTab === CustomRangeType.StartEnd ? (\r\n
\r\n onChange(CustomRangeType.StartEnd, { start })}\r\n >\r\n \r\n \r\n onChange(CustomRangeType.StartEnd, { end })}\r\n >\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n ) =>\r\n onChange(CustomRangeType.Manual, { years: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { months: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { days: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n setState(state.kind === CustomRangeType.Manual ? DEFAULT_MANUAL_RANGE : DEFAULT_START_END_RANGE)\r\n }\r\n >\r\n Reset\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { To, useNavigate } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { useDialogState } from '../dialog'\r\nimport { getTimeframeFromDateRange } from './custom-date-range-utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\ninterface IUseCustomDateRangeDialogSubmitProps {\r\n anchorDate?: Date\r\n instrument?: Instrument\r\n shouldReloadOnNavigate?: boolean\r\n pathGenerator?: ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n pathname: string\r\n search: string\r\n }\r\n}\r\n\r\nexport function useCustomDateRangeDialog({\r\n anchorDate,\r\n instrument,\r\n pathGenerator,\r\n shouldReloadOnNavigate = false,\r\n}: IUseCustomDateRangeDialogSubmitProps) {\r\n const navigate = useNavigate()\r\n const customDateRangeDialogState = useDialogState()\r\n\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n const handleDateRangeSelect = React.useCallback(\r\n (\r\n { value, timeframe, href }: { value: string; timeframe?: TIMEFRAME; href?: To },\r\n callback?: ({ value, timeframe, href }: { value: string; timeframe: TIMEFRAME; href?: To }) => void\r\n ) => {\r\n if (!timeframe) return\r\n\r\n if (!href && pathGenerator) {\r\n const path = pathGenerator({ timeframe, dateRange: value })\r\n if (shouldReloadOnNavigate) {\r\n window.location.href = `${path.pathname}?${path.search}`\r\n } else {\r\n navigate(path)\r\n }\r\n }\r\n\r\n callback?.({ value, timeframe, href })\r\n },\r\n [navigate, pathGenerator, shouldReloadOnNavigate]\r\n )\r\n\r\n const getDateRangeTimeframe = React.useCallback(\r\n (dateRange: string | null) => {\r\n if (!anchorDate || !instrument || !dateRange) return null\r\n\r\n return {\r\n value: dateRange,\r\n timeframe: getTimeframeFromDateRange({\r\n dateRange: dateRange!,\r\n anchorDate,\r\n isPremium,\r\n instrument,\r\n }),\r\n }\r\n },\r\n [anchorDate, instrument, isPremium]\r\n )\r\n\r\n const onDialogSubmit = React.useCallback(\r\n ({ value: dateRange, timeframe: newTimeframe }: { value: string; timeframe: TIMEFRAME }) => {\r\n handleDateRangeSelect({\r\n value: dateRange,\r\n timeframe: newTimeframe,\r\n })\r\n customDateRangeDialogState.hide()\r\n },\r\n // We only want `customDateRangeDialogState.hide`, not the whole dialog\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [customDateRangeDialogState.hide, handleDateRangeSelect]\r\n )\r\n\r\n return { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { useSyncLocalStorage } from '../../hooks/use-sync-local-storage'\r\n\r\ntype FavoriteTimeframesMap = { [K in TIMEFRAME | 'intraday']?: boolean }\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS = {\r\n [TIMEFRAME.i1]: true,\r\n [TIMEFRAME.i2]: false,\r\n [TIMEFRAME.i3]: true,\r\n [TIMEFRAME.i5]: true,\r\n [TIMEFRAME.i10]: false,\r\n [TIMEFRAME.i15]: true,\r\n [TIMEFRAME.i30]: true,\r\n [TIMEFRAME.h]: true,\r\n [TIMEFRAME.h2]: false,\r\n [TIMEFRAME.h4]: false,\r\n [TIMEFRAME.d]: true,\r\n [TIMEFRAME.w]: true,\r\n [TIMEFRAME.m]: true,\r\n}\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS_FREE = {\r\n ...TIMEFRAME_FAVORITE_DEFAULTS,\r\n intraday: true,\r\n}\r\n\r\nconst LOCAL_STORAGE_KEY = 'favoriteTimeframesMap'\r\n\r\nexport function useFavoriteTimeframes(isPremium = true) {\r\n const { state, setState } = useSyncLocalStorage(\r\n LOCAL_STORAGE_KEY,\r\n isPremium ? TIMEFRAME_FAVORITE_DEFAULTS : TIMEFRAME_FAVORITE_DEFAULTS_FREE\r\n )\r\n\r\n const toggleFavoriteTimeframe = React.useCallback(\r\n (timeframe: TIMEFRAME | 'intraday') => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n [timeframe]: !prevState[timeframe],\r\n }))\r\n },\r\n [setState]\r\n )\r\n\r\n const favoriteTimeframes = React.useMemo(\r\n () => Object.keys(state).filter((key) => state[key as keyof FavoriteTimeframesMap]),\r\n [state]\r\n )\r\n\r\n return {\r\n favoriteTimeframes: isPremium ? favoriteTimeframes : Object.keys(TIMEFRAME_FAVORITE_DEFAULTS_FREE),\r\n toggleFavoriteTimeframe,\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as storage from '../services/local-storage'\r\n\r\n/**\r\n * Hook to synchronize localStorage.setItem across all components on the page on all open tabs\r\n */\r\nexport function useSyncLocalStorage(storageKey: string, defaultValue: ValueType) {\r\n const [state, setState] = React.useState(storage.getValue(storageKey, defaultValue))\r\n\r\n React.useEffect(() => {\r\n const subscription = storage.subscribeToChanges(storageKey, defaultValue, setState)\r\n\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n }, [storageKey, defaultValue])\r\n\r\n const setValue = React.useCallback(\r\n (valueGetter: React.SetStateAction) => storage.setValue(storageKey, valueGetter, defaultValue),\r\n [defaultValue, storageKey]\r\n )\r\n\r\n return {\r\n state,\r\n setState: setValue,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { getExtendedDialogState } from './dialog'\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Tooltip text content\r\n */\r\n tooltipContent?: React.ReactNode\r\n tooltipColor?: keyof typeof TooltipColor\r\n tooltipSettings?: Reakit.TooltipInitialState\r\n}\r\n\r\nfunction TooltipInputWrapper({\r\n children,\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n name,\r\n}: TooltipInputWrapperProps) {\r\n const tooltip = useTooltipState({ placement: 'bottom', ...tooltipSettings })\r\n const { isFullyClosed } = getExtendedDialogState(tooltip)\r\n\r\n return (\r\n <>\r\n \r\n {children}\r\n \r\n {tooltipContent && !isFullyClosed && (\r\n \r\n {tooltipContent}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n {\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n isInteractive = true,\r\n ...props\r\n }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/popover'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: PopoverStateReturn | DropdownStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import { EventEmitter } from 'events'\r\nimport * as React from 'react'\r\n\r\nlet emitter: EventEmitter | undefined\r\n\r\n/**\r\n * Get the emitter which is used to sync components across the page, subscibe to\r\n * changes and attach event which handles changes across windows\r\n */\r\nexport function subscribeToChanges(\r\n key: string,\r\n defaultValue: ValueType,\r\n changeCallback?: (value: React.SetStateAction) => void\r\n) {\r\n if (!emitter) emitter = new EventEmitter()\r\n\r\n const onChange = (value: React.SetStateAction) => {\r\n const newValue = value ?? getValue(key, defaultValue)\r\n setValue(key, newValue, defaultValue, false)\r\n changeCallback?.(newValue)\r\n }\r\n\r\n const onStorageChange = (ev: StorageEvent) => {\r\n if (ev.key === key) {\r\n try {\r\n const value = ev.newValue ? JSON.parse(ev.newValue) : null\r\n onChange(value ?? defaultValue)\r\n } catch {\r\n onChange(defaultValue)\r\n }\r\n }\r\n }\r\n\r\n emitter.addListener(key, onChange)\r\n window.addEventListener('storage', onStorageChange)\r\n\r\n return {\r\n emitter,\r\n unsubscribe: () => {\r\n emitter?.removeListener(key, onChange)\r\n window.removeEventListener('storage', onStorageChange)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Get value from local storage or fall back to `defaultValue`\r\n */\r\nexport function getValue(key: string, defaultValue: ValueType): ValueType {\r\n try {\r\n const value = localStorage.getItem(key)\r\n const parsedValue = value ? JSON.parse(value) : null\r\n return parsedValue ?? defaultValue\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Set value to local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function setValue(\r\n key: string,\r\n valueGetter: React.SetStateAction,\r\n defaultValue: ValueType,\r\n emit = true\r\n) {\r\n try {\r\n const state = getValue(key, defaultValue)\r\n const valueToStore = valueGetter instanceof Function ? valueGetter(state) : valueGetter\r\n\r\n localStorage.setItem(key, JSON.stringify(valueToStore))\r\n if (emit) emitter?.emit(key, valueToStore)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Removes value from local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function removeValue(key: string, emit = true) {\r\n try {\r\n localStorage.removeItem(key)\r\n if (emit) emitter?.emit(key, undefined)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Helper function to migrate old value type to new one (eg. boolean to object)\r\n */\r\nexport function migrateValue(\r\n key: string,\r\n /**\r\n * The migrate function might get called multiple times on the page, so `oldValue` in the callback\r\n * can actually be the already migrated value. Make sure to add a condition to only migrate once.\r\n */\r\n transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue),\r\n defaultValue: NewValue\r\n) {\r\n try {\r\n const oldValue = getValue(key, undefined)\r\n if (typeof oldValue === 'undefined') return\r\n const migratedValue = transformValue instanceof Function ? transformValue(oldValue) : transformValue\r\n setValue(key, migratedValue, defaultValue, false) // don’t emit to other components\r\n } catch {}\r\n}\r\n","/**\r\n * Ignore any subsequent callback calls until the previous callback has finished\r\n */\r\n\r\nexport function waitForPreviousPromise(callback: () => void | Promise) {\r\n let callbackPromise: Promise | void | null = null\r\n\r\n return async function () {\r\n if (callbackPromise !== null) return\r\n\r\n callbackPromise = callback()\r\n await callbackPromise\r\n callbackPromise = null\r\n }\r\n}\r\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getSubstitution = require('../internals/get-substitution');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar $TypeError = TypeError;\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\nvar max = Math.max;\n\n// `String.prototype.replaceAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.replaceall\n$({ target: 'String', proto: true }, {\n replaceAll: function replaceAll(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var IS_REG_EXP, flags, replacer, string, searchString, functionalReplace, searchLength, advanceBy, replacement;\n var position = 0;\n var endOfLastMatch = 0;\n var result = '';\n if (!isNullOrUndefined(searchValue)) {\n IS_REG_EXP = isRegExp(searchValue);\n if (IS_REG_EXP) {\n flags = toString(requireObjectCoercible(getRegExpFlags(searchValue)));\n if (!~indexOf(flags, 'g')) throw new $TypeError('`.replaceAll` does not allow non-global regexes');\n }\n replacer = getMethod(searchValue, REPLACE);\n if (replacer) {\n return call(replacer, searchValue, O, replaceValue);\n } else if (IS_PURE && IS_REG_EXP) {\n return replace(toString(O), searchValue, replaceValue);\n }\n }\n string = toString(O);\n searchString = toString(searchValue);\n functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n searchLength = searchString.length;\n advanceBy = max(1, searchLength);\n position = indexOf(string, searchString);\n while (position !== -1) {\n replacement = functionalReplace\n ? toString(replaceValue(searchString, position, string))\n : getSubstitution(searchString, string, position, [], undefined, replaceValue);\n result += stringSlice(string, endOfLastMatch, position) + replacement;\n endOfLastMatch = position + searchLength;\n position = position + advanceBy > string.length ? -1 : indexOf(string, searchString, position + advanceBy);\n }\n if (endOfLastMatch < string.length) {\n result += stringSlice(string, endOfLastMatch);\n }\n return result;\n }\n});\n"],"names":["DefaultFilter","_ref","config","onSubmit","state","setState","React","selectedValues","_jsxs","_Fragment","children","DialogBody","className","_jsx","Heading","level","id","e","preventDefault","filters","filter","value","getIsOptionDateRange","options","map","_ref3","label","isChecked","includes","Checkbox","name","checked","onChange","selectedValue","DialogFooter","Button","onClick","handleSelectAll","_ref2","item","as","DialogDismiss","type","form","theme","MIN_DATE","Date","DateRange","from","to","onChangeFrom","onChangeTo","DatePicker","minDate","undefined","newFrom","formatDateToStringUS","Input","readOnly","rightContent","appearance","Icon","width","newTo","EarningDateFilter","dateRange","setDateRange","initialDate","getInitialDateFromSelectedValues","dateRangeStr","dateRangeToFilterString","DELIMITER","DEFAULT_RANGE","EarningsAndRevenueFilter","earningsRange","setEarningsRange","revenueRange","setRevenueRange","parts","split","length","eFrom","eTo","rFrom","rTo","rangesToFilter","step","currentTarget","FloatFilter","sharesRange","setSharesRange","pctRange","setPctRange","_parts$","aFrom","aTo","bFrom","bTo","min","SETTINGS_DELIMITER","PRICE_OPTIONS","EXTREMA_OPTIONS","parseData","filterValue","indexOf","rangeAndOptions","some","HighLowFilter","price1","setPrice1","price2","setPrice2","extreme1","setExtreme1","extreme2","setExtreme2","range1","setRange1","range2","setRange2","parsedData1","price","extreme","parsedData2","concat","Select","items","IpoDateFilter","ARRAY_DELIMITER","OPTIONS","PRESETS_MAP","OptionsFilter","optionable","setOptionable","shortable","setShortable","shortsalerestricted","setShortSaleRestricted","halted","setHalted","setValues","getYesNo","forEach","_PRESETS_MAP$str","str","option","short","Object","values","every","entries","key","join","Label","title","PeriodRangeFilter","periodOptions","useOverUnderLabels","selectedPeriod","setSelectedPeriod","periodRange","setPeriodRange","delimiterIndex","lastIndexOf","period","substring","range","SMAFilter","setOption","setRange","filterRange","filterOption","toUpperCase","TargetPriceFilter","aboveRange","setAboveRange","belowRange","setBelowRange","WEEK_MONTH_DELIMITER","VolatilityFilter","weekRange","setWeekRange","monthRange","setMonthRange","wFrom","wTo","mFrom","mTo","wMin","wMax","mMin","mMax","weekRangeStr","monthRangeStr","volatilityFilter","PERFORMANCE_OPTIONS","NET_FLOWS_FILTER_OPTIONS","RETURN_FILTER_OPTIONS","FilterDialog","dialogState","handleSubmit","parseScreenerFilters","urlQueryObject","decodeQueryString","window","location","href","encodeQueryString","f","stringifyScreenerFilters","Dialog","DialogHeader","getDialogComponent","ScreenerRemovePlus","slice","ScreenerCustomRangeOnChange","select","document","getElementById","this","getAttribute","inputs","Array","parentNode","querySelectorAll","query","queryWithFilter","regexp","RegExp","q","input1","input2","numberRegexp","isMatchInput1","test","isMatchInput2","Math","abs","Number","MAX_SAFE_INTEGER","alert","focus","ScreenerValidateInputs","replace","encodeURIComponent","HideCustom","_select$onchange","el1","el2","style","display","onchange","call","Event","ScreenerTickersInputOnChange","inputValue","sanitizedTickers","getSanitizedTicker","replaceAll","ScreenerPremium","unregisterEventFuncs","i","unregister","eventListenerRegister","push","ranges","getElementsByClassName","hides","activeSelectEl","setActiveSelectEl","isInitRef","useDialogState","setOpen","open","handleCancel","_parseScreenerFilters","textContent","previousElementSibling","selectedOption","text","opt","isModal","isEmpty","hiddenFsmElement","_activeSelectEl$oncha","ScreenerSelectOnChange","that","el","ScreenerShowModal","show","edits","current","selects","ScreenerRenderCustomModal","ScreenerTimeframeBar","isPremium","FinvizSettings","hasUserPremium","searchParams","useSearchParams","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","currentQuery","fromEntries","containerRef","selectedTimeframe","selectedDateRange","urlQuery","_urlQuery$p","_FinvizSettings$scree","p","screenerCurrentTimeframe","timeframe","dr","_FinvizSettings$scree2","getSelectedTimeframeAndDateRange","visibility","timeFrameGroupsWithHref","getTimeframeGroups","timeFrameGroup","timeframes","timeFrame","generatePathForTimeframeDateRange","pathname","utmCampaign","dateRangeQueryKey","withReload","dateRangeGroupsWithHref","getDateRangeGroupsWithHref","customRange","isCustomAvailable","instrument","Instrument","Stock","generatePath","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","useCustomDateRangeDialog","anchorDate","shouldReloadOnNavigate","pathGenerator","search","URLSearchParams","toString","TimeframeBar","size","rounding","hasRedesignEnabled","timeFrameGroups","dateRangeGroups","onTimeframeSelect","onDateRangeSelect","onFavoriteTimeframeToggle","compactViewMaxBreakpointPx","isFavoritesEnabled","isTimeframeSelectEnabled","onCustomDateRangeClick","CustomDateRange","getTimeframeFromDateRange","SCREENER_TIMEFRAME_REACT_ROOT_ID","screenerTimeframeReactMount","timeframeContainer","ReactDOM","BrowserRouter","ready","screener","ScreenerTimeframeReactMount","ScreenerTimeframeReactUnmount","screenerTimeframeReactUnmount","ScreenerQuery","ScreenerFilter","ScreenerAddtionalQuery","ScreenerView","eventName","handler","addEventListener","removeEventListener","innerText","customWrapper","input","_select$getAttribute$","_select$getAttribute","result","len","j","optionEl","ScreenerGetOptionsList","arr","DATE_REGEX","isValidFromDate","isValidToDate","isNaN","getTime","find","date","getQueryForView","view","_query$get$match","_query$get","allowedParams","arguments","baseQuery","allowList","keys","delete","originalView","settings","get","View","match","set","filtersString","Filters","lastUnderscore","String","rangeSuffixes","delimiter","rangeDelimiter","reduce","index","_rangeSuffixes$index","rangeStr","currentFilter","getCurrentDateInMs","valueOf","getIsDocumentVisible","visibilityState","hidden","notifyOnVisibilityChange","callback","promisifiedCallback","waitForPreviousPromise","unsubscribe","intervalCallbackOnWindowVisible","interval","getInterval","refreshPromise","nextRefresh","refreshTimeout","async","refresh","setTimeout","max","handleVisibilityChange","clearTimeout","currentDateMs","GroupTheme","ButtonGroup","hasDivider","hasBorder","childComponent","buttonRounding","ButtonRounding","groupTheme","dark","wrapper","divider","getGroupTheme","role","classnames","border","child","_child$props$rounding","_child$props$theme","Boolean","props","ColorVariant","CheckboxSize","CheckboxComponent","ref","_props$checked","color","default","defaultChecked","disabled","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","forwardRef","clamp","num","isTouch","event","getRelativePosition","node","rect","getBoundingClientRect","pointer","touches","left","pageX","pageXOffset","top","pageY","pageYOffset","height","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","isValid","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","r","g","b","a","round","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","v","c","h","s","n","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","parseInt","parseFloat","strColor","isValidColor","isRgb","startsWith","Option","convertColorToHEX","getIsRgb","rgbKeys","getHSVAFromColor","Alpha","changeLightness","pos","gradientPreview","useMemo","gradientFrom","gradientTo","backgroundImage","DEFAULT_COLORS","ColorPalette","colors","lowerCaseColor","toLowerCase","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","icon","isArray","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","colorValue","leftContent","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","trim","isMobile","contentClass","_hex","orignalColor","InputColorPicker","inputDataTestId","popoverState","usePopoverState","isMobileDevice","PopoverTrigger","onBlur","hide","Popover","focusOnShow","MultiColorPicker","colorInputLabel","ColorTabButton","small","ButtonColorPicker","buttonPickerDataTestId","hideOnClickOutside","onOverlayClick","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","active","visible","_ref4","_ref5","CopyToClipboard","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","Textarea","DatePickerComponent","StatelessDatePicker","zIndex","isFullyClosed","getExtendedDialogState","triggerProps","ZIndexContext","Provider","fallback","Box","Spinner","locale","minDetail","ev","_props$onChange","popover","Delayed","delay","throwOnTimeout","delayComponent","timeoutComponent","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","failedTimeout","Error","DropdownContext","useDropdownState","_settings$unstable_of","context","Reakit","loop","animated","COMPONENT_ANIMATION_DURATION","unstable_virtual","unstable_offset","root","modal","DropdownComponent","ariaLabel","isNested","isStatic","useZIndex","dropdownState","animating","ContainerElement","Portal","buttonProps","_label$props$active","_context$root","onTransitionEnd","onAnimationEnd","innerProps","parent","placement","orientation","Dropdown","NestedDropdownWrapper","parentState","itemProps","DropdownItemComponent","asComponent","subtitle","closeOnClick","hasSubmenu","iconTheme","align","_itemProps$onClick","DropdownItem","DropdownSeparator","Paragraph","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","popperElement","setPopperElement","virtualRef","scrollY","x","scrollX","y","bottom","right","toJSON","getVirtualRef","hasBeenOpen","styles","attributes","usePopper","modifiers","offset","popper","ContextMenuDropdown","ContextMenuInner","innerState","maxHeightStyle","usePopoverMaxHeight","maxHeightLimit","hasViewportHeightLimit","offsets","_item$onClick","_window$gtag","_window","gtag","assign","menu_option","ChartGridCell","gridArea","GridLayout","columns","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","data","InnerState","valueKey","changeKey","valueAccessor","handleChange","RangeSize","RangeSlider","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","ToolbarTheme","ToolbarDirection","ToolbarContext","direction","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","horizontal","alternative","Toolbar","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","throttle","originalWidth","offsetWidth","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","isLoading","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","titleActive","ToolbarGroup","_groupItems$map","defaultItem","groupItems","groupTitle","useNativeSelect","listState","useListState","currentId","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","useHoverPopover","useList","findIndex","stopPropagation","NativeSelect","finalFocusRef","body","hasBackdrop","List","onItemChange","ListItem","ToolbarItem","isItemActive","ToolbarDivider","StepContent","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","tour","_step$backButton","_step$nextButton","action","complete","classes","getButtonTheme","ButtonTheme","light","button","ButtonPadding","back","backButton","next","nextButton","getTourKey","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","skip","toursToView","hasNewTours","acc","steps","initialTour","completeTour","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","signal","aborted","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","element","target","on","popperOptions","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","event_label","TabsContext","useTabsContext","Tabs","useTabState","TabSpacing","Tab","spacing","content","classNames","TabList","TabPanel","BadgeSize","BadgePadding","Badge","padding","badgePadding","badgeSize","NotificationPosition","NotificationContext","useNotification","NotificationWrapper","isOpen","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","getVisualViewport","visualViewport","positionClass","_notification$options","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","Ariakit","unmountOnHide","onClose","backdrop","focusable","hideOnEscape","hideOnInteractOutside","autoFocusOnShow","autoFocusOnHide","transform","scale","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","Notification","closeText","actions","timeoutInMs","timeoutId","focusOnHide","hasArrow","popoverWrapperStyle","popoverMaxHeight","hasButtonWidthLimit","innerHeight","useWindowSize","isWatching","buttonElement","unstable_referenceRef","buttonRect","popoverId","popoverWrapper","setProperty","unstable_autoFocusOnShow","unstable_autoFocusOnHide","unstable_finalFocusRef","TooltipArrow","BoxTheme","DEFAULT_OFFSET","HOVER_TIMEOUT","_settings$placement","showTimeout","hideTimeout","clearTimeouts","showPopover","hidePopover","onMouseOver","onMouseOut","_props$as","placeholder","showPlaceholder","handleNativeSelectChange","_selectedItem$href$se","_selectedItem$href$ha","itemIndex","selectedIndex","flattenItems","reloadDocument","newUrl","URL","hash","isSelectItemGroup","optionIndex","NativeSelectInRouterContext","navigate","useNavigate","onChangeWithNavigate","ItemsGroup","getDefaultTheme","isHovered","InternalOption","_props$active","_props$size","ariaSelected","dataActiveItem","activeTheme","defaultTheme","SelectOption","isComboBox","combobox","render","SelectItemsVirtualized","SelectRenderer","itemSize","hasGroups","overscan","groupOritem","restProps","isSelectItem","itemRenderer","paddingStart","paddingEnd","rendererProps","restItem","SelectItems","searchValue","parentTestId","virtualized","isInRouterContext","useInRouterContext","filteredItems","filterSelectOptions","innerItem","providedProps","getSelectItemProps","truncate","ListRounding","ListTheme","focusWithoutScroll","preventScroll","onBackdropClick","SelectList","gutter","hasItemChildren","ListElement","wrapperProps","hasChildren","count","preventBodyScroll","none","autoSelect","TooltipInner","_tooltipContext$useSt","tooltipContext","currentPlacement","subscription","TooltipBox","SelectTooltipWrapper","isPopoverOpen","hasShownTooltip","onFocusVisible","getCollectionItem","DesktopSelect","_items$length","_listProps$unmountOnH","defaultValue","trigger","tooltip","onInteractionChange","comboBox","onSearch","listProps","internalSearch","setInternalSearch","SelectWrapper","resetValueOnHide","includesBaseElement","setValue","ButtonWrapper","buttonWrapperProps","console","warn","listItems","focusLoop","virtualFocus","defaultItems","DEFAULT_RIGHT_ICON","SelectButton","_selectedValue$label","valueOverride","contextValue","buttonText","rightIcon","xxsmall","_findSelectedValue","_findSelectedValue2","providedValue","providedDefaultValue","triggerContent","isInteractive","nativeSelect","dataTestid","findSelectedValue","selectTrigger","NativeSelectComponent","findSelectedIndex","inRouterContext","Link","hasOwnProperty","matchesSearchTerm","searchTerm","lowerSearch","isSameItem","obj1","obj2","finalResults","filtered","foundItem","flatMap","itemOrGroup","DATERANGE_TOOLTIP","DateRangeSelect","chartIndex","flatDateRanges","dateRanges","linkProps","_createElement","LabelWithDelayedSpinner","invisible","TIMEFRAME_TOOLTIP","TimeframeSelect","isCompactView","isCompactOnly","flatTimeframes","getSelectedTimeframeLabel","_selectedTimeframeIte","selectedTimeframeItem","labelShort","groupIndex","isIconButtonActive","getTimeframeChipElementId","getButtonPadding","xsmall","medium","large","loadingTimeframe","isDateRangeAvailable","containerElement","isScrollIntoViewEnabled","scrollWrapperElement","setScrollWrapperElement","timeframeButtonsScrollLocation","setTimeframeButtonsScrollLocation","isOnLeftEdge","isOnRightEdge","setElementRef","elementWidth","useElementMeasure","timeframesInExpandedPanel","checkTimeframeWrapperScrollPosition","scrollLeft","ceil","scrollWidth","timeframeElement","leftOffset","offsetLeft","clientWidth","scrollTo","onScroll","onWheel","absDx","deltaX","deltaY","_timeframe$withReload","generateTimeframeGroups","premiumTimeframes","TIMEFRAME","i1","i2","i3","i5","i10","i15","i30","labelPageTitle","h2","h4","d","w","m","freeTimeframes","generateDateRangeGroups","isStock","DateRangeType","d1","d5","m1","m3","m6","ytd","y1","y2","y5","getDateRangeGroups","rangeGroups","_customRange$split","dateRangePrefix","DATE_RANGE_PREFIX_DELMITER","CustomDateRangePrefixEnum","CUSTOM_DATE_RANGE","dateRangeGroup","FREE_PERIODS_STOCK","utm_source","utm_medium","utm_campaign","timeframeUtm","SpecificChartFunctionality","quotePage","futuresPage","forexPage","cryptoPage","daterangeUtm","CUSTOM_DATE_RANGE_DELIMITER","CUSTOM_PREV_RANGE_DELIMITER","getParsedDateRange","_dateRange$split","parseCustomDateRangeUrlParam","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","end","dateFns","Prev","years","months","days","DAYS_IN_YEAR","_ref7","dateRangeTimeframe","_dateRanges$find$time","_dateRanges$find","_ref6","getTimeframeForDateRangeType","startNyTime","startToReferenceDateNumOfDays","rangeNumOfDays","DATE_PICKER_MIN_DATE","YEARS_MAX_VALUE","getFullYear","TAB_BUTTON_COMMON_PROPS","CustomRangeType","DEFAULT_MANUAL_RANGE","kind","Manual","DEFAULT_START_END_RANGE","StartEnd","isFetching","selectedTab","setSelectedTab","getDefaultSelectedTab","getDefaultSelectedDate","newValue","prevState","newState","newEnd","isAbsolute","fromDate","toDate","manualRange","isValidStartEndRangeState","startString","endString","getCustomStartEndDateRangeUrlParam","isValidManualRangeState","_state$days","_state$months","_state$years","getPrevPeriodDateRangeUrlParam","path","getDateRangeTimeframe","newTimeframe","TIMEFRAME_FAVORITE_DEFAULTS","TIMEFRAME_FAVORITE_DEFAULTS_FREE","intraday","LOCAL_STORAGE_KEY","storageKey","storage","valueGetter","useSyncLocalStorage","TooltipInputWrapper","tooltipContent","tooltipColor","tooltipSettings","useTooltipState","TooltipTrigger","isHideOnClickOutside","Tooltip","TooltipInputComponent","TooltipInput","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","offsetY","elementMaxHeight","throttleWaitInMs","setSize","innerWidth","handleResize","cancel","emitter","subscribeToChanges","changeCallback","EventEmitter","getValue","onStorageChange","JSON","parse","addListener","_emitter","removeListener","parsedValue","emit","_emitter2","valueToStore","Function","stringify","removeValue","_emitter3","removeItem","migrateValue","transformValue","oldValue","callbackPromise","$","uncurryThis","requireObjectCoercible","isCallable","isNullOrUndefined","isRegExp","getMethod","getRegExpFlags","getSubstitution","wellKnownSymbol","IS_PURE","REPLACE","$TypeError","TypeError","stringSlice","proto","replaceValue","IS_REG_EXP","flags","replacer","string","searchString","functionalReplace","searchLength","advanceBy","replacement","O","endOfLastMatch"],"sourceRoot":""}