{"version":3,"file":"8552.c52e6a65.js","mappings":"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T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,KACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,IACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,KACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,EACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACLvO,EAAG,MACHC,EAAG,IACH7S,EAAG,KACH1F,EAAG,IACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,KACH4T,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,KACH9F,EAAG,KACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,KACHjc,EAAG,IACHC,EAAG,MACHic,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,IACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,IACHC,EAAG,OACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,KACHua,EAAG,MACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,IACHC,EAAG,OAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,IACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,KACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,OACL,IAAK,MACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,OACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,OACL,IAAK,KACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,OACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,KACHC,EAAG,OACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,KACLvO,EAAG,MACHC,EAAG,MACH7S,EAAG,MACH1F,EAAG,MACH4J,EAAG,MACHua,EAAG,MACHC,EAAG,MACHC,EAAG,OACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,OACHC,EAAG,MACHC,EAAG,OACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,QAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,IACLvO,EAAG,MACHC,EAAG,KACH7S,EAAG,KACH1F,EAAG,KACH4J,EAAG,MACHua,EAAG,KACHC,EAAG,MACHC,EAAG,MACH3T,EAAG,KACH4T,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACH9F,EAAG,KACH+F,EAAG,MACHC,EAAG,MACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,MACHic,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,IACLvO,EAAG,OACHC,EAAG,MACH7S,EAAG,OACH1F,EAAG,MACH4J,EAAG,OACHua,EAAG,MACHC,EAAG,MACHC,EAAG,OACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACH9F,EAAG,MACH+F,EAAG,OACHC,EAAG,OACHC,EAAG,OACHjc,EAAG,MACHC,EAAG,OACHic,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,GACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,QAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,KACLvO,EAAG,OACHC,EAAG,KACH7S,EAAG,MACH1F,EAAG,KACH4J,EAAG,OACHua,EAAG,OACHC,EAAG,OACHC,EAAG,OACH3T,EAAG,KACH4T,EAAG,KACHC,EAAG,OACHC,EAAG,KACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACH9F,EAAG,MACH+F,EAAG,OACHC,EAAG,OACHC,EAAG,MACHjc,EAAG,KACHC,EAAG,OACHic,EAAG,OACHC,EAAG,KACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OAEL,GAAI,CACF,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,OACL,IAAK,IACLvO,EAAG,OACHC,EAAG,MACH7S,EAAG,OACH1F,EAAG,MACH4J,EAAG,OACHua,EAAG,OACHC,EAAG,MACHC,EAAG,OACH3T,EAAG,MACH4T,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACH9F,EAAG,OACH+F,EAAG,OACHC,EAAG,OACHC,EAAG,OACHjc,EAAG,MACHC,EAAG,OACHic,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,SAIMC,EAA8C,CACzD,EAAG,EACH,EAAG,EACH,EAAG,GACH,EAAG,GACH,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,I,4eCj9BC,MAAM3K,EAQXnW,WAAAA,CAAY+gB,EAAwBra,GAAsBvG,EAAA,mBAP5C8H,SAASC,cAAc,WAAS/H,EAAA,qBAC9B6gB,EAAAA,IAAoC1gB,KAAK2gB,cAAY9gB,EAAA,wBAAAA,EAAA,+BAAAA,EAAA,0BAAAA,EAAA,yBAoBjD4gB,IAClBzgB,KAAK4gB,gBAAkB,CAACH,EAAWzhB,MAAOyhB,EAAWxhB,QACrDe,KAAK6gB,SAASC,OAAO,CAAC,CAAC,EAAG,GAAI9gB,KAAK4gB,kBAAkBA,gBAAgB,CAAC,CAAC,EAAG,GAAI5gB,KAAK4gB,iBAAiB,IACrG/gB,EAAA,qBAEc,IAAM6gB,EAAAA,GAAiB1gB,KAAK2gB,eAAY9gB,EAAA,cAE/C,CAACkhB,EAAkBC,IACF,iBAAZD,GAAwBrV,OAAOC,SAASoV,IAC7CC,EACFhhB,KAAKihB,cAAc5c,KAAKrE,KAAK6gB,SAASK,QAASH,EAAS,CAACC,EAAUre,EAAGqe,EAAUpe,IAEhF5C,KAAKihB,cAAc5c,KAAKrE,KAAK6gB,SAASK,QAASH,GAE1CA,GAGF/gB,KAAKmhB,eAAelD,IAC5Bpe,EAAA,kBAEYuhB,IACX,MAAM1e,EAAQ1C,KAAK0C,QAEnB,GAAI2e,MAAMC,QAAQF,IAAS1V,OAAOC,SAASyV,EAAK,KAAO1V,OAAOC,SAASyV,EAAK,IAE1E,OADAphB,KAAKihB,cAAc5c,KAAKrE,KAAK6gB,SAASU,aAAeH,EAAK,GAAK1e,GAAU0e,EAAK,GAAK1e,GAC5E,CAAC0e,EAAK,GAAIA,EAAK,IAExB,IAAIzI,EAAI3Y,KAAKmhB,eACb,MAAO,CAACxI,EAAEhW,EAAGgW,EAAE/V,EAAE,IAClB/C,EAAA,qBAEcgO,IAAoC,IAAlClL,EAAGC,GAA0BiL,EAC5C,MAAMnL,EAAQ1C,KAAK0C,QACnB1C,KAAKihB,cAAc5c,KAAKrE,KAAK6gB,SAASW,aAAe7e,EAAID,GAAUE,EAAIF,EAAQ,CAAC,EAAG,GAAG,IA9CtF1C,KAAK4gB,gBAAkB,CAACH,EAAWzhB,MAAOyhB,EAAWxhB,QACrDe,KAAKoG,WAAaA,EAElBpG,KAAK6gB,SAAWH,EAAAA,MAEbI,OAAO,CAAC,CAAC,EAAG,GAAI9gB,KAAK4gB,kBACrBa,YAAY,CAACzhB,KAAKoG,WAAW,GAAIpG,KAAKoG,WAAWpG,KAAKoG,WAAW5I,OAAS,KAC1EojB,gBAAgB,CAAC,CAAC,EAAG,GAAI5gB,KAAK4gB,kBAC9B9Z,GAAG,OAAQ,MAEd9G,KAAKihB,cAAc5c,KAAKrE,KAAK6gB,SAC/B,CAsCA9d,cAAAA,GAAmD,IAApCkF,EAAmBW,UAAApL,OAAA,QAAAS,IAAA2K,UAAA,GAAAA,UAAA,GAAG5I,KAAK0C,QACpCI,EAAc9C,KAAKoG,WAAW,GAClC,IAAK,IAAIgE,EAAI,EAAGsX,EAAM1hB,KAAKoG,WAAW5I,OAAQ4M,EAAIsX,EAAKtX,IAAK,CAC1D,MAAM7B,EAAQvI,KAAKoG,WAAWgE,GAC9B,GAAI7B,GAASN,EAAa,CACxBnF,EAAcyF,EACd,KACF,CACF,CAEA,OAAOzF,CACT,E,6bClDF,MAAM6e,GAAaC,EAAAA,EAAAA,KAokBnB,QAlkBA,MAqBEliB,WAAAA,CAAWmO,GAwBR,IAAAgU,EAAA,IAxBS,kBACV/S,GAAoB,EAAK,gBACzBC,GAAkB,EAAK,QACvBf,EAAU8K,EAAAA,GAAaC,QAAO,QAC9Brb,GAAU,EAAK,WACf0I,EAAakI,EAAAA,KAA+B,iBAC5CL,GAAmB,KAChBhU,GAiBJ4T,EAAAhO,EAAA,qBAAAA,EAAA,sBAAAA,EAAA,uBAAAA,EAAA,qBAAAA,EAAA,iCAAAA,EAAA,+BAAAA,EAAA,aAtCsB,IAAEA,EAAA,eACE,IAAEA,EAAA,kBACG,IAAEA,EAAA,oBAAAA,EAAA,0BAAAA,EAAA,wBAAAA,EAAA,oBAAAA,EAAA,uBAAAA,EAAA,uBAAAA,EAAA,0BAAAA,EAAA,wBAAAA,EAAA,yBAAAA,EAAA,gCAqChCG,KAAKhB,MAAQ/E,EAAM+E,MACnBgB,KAAKf,OAAShF,EAAMgF,OACpBe,KAAKyX,QAAUxd,EAAMwd,QACrBzX,KAAK8I,SAAW7O,EAAM6O,SACtB9I,KAAK/C,KAAOhD,EAAMgD,KAClB+C,KAAK0C,MAAQzI,EAAMyI,MACnB1C,KAAKqL,MAAQpR,EAAM4E,KAAKwM,MACxBrL,KAAKmL,QAAUlR,EAAM4E,KAAKsM,QAC1BnL,KAAKoL,WAAanR,EAAM4E,KAAKuM,WAC7BpL,KAAKgO,QAAUA,EACfhO,KAAKoG,WAAaA,EAClBpG,KAAKtC,QAAUA,EACfsC,KAAK8O,kBAAoBA,EACzB9O,KAAK+O,gBAAkBA,EACvB/O,KAAKiO,iBAAmBA,EACxBjO,KAAK5D,UAA2B,QAAlBylB,EAAG5nB,EAAMmC,iBAAS,IAAAylB,EAAAA,GAAIC,EAAAA,EAAAA,MACpC9hB,KAAKxF,SAAWP,EAAMO,SAEtBwF,KAAKF,KAAO,IAAI+V,EAAkB,CAAE7W,MAAOgB,KAAKhB,MAAOC,OAAQe,KAAKf,QAAUe,KAAKoG,YAEnFpG,KAAKhC,WAAagC,KAAK+hB,gBAEnB/hB,KAAK8O,mBACP9O,KAAKgiB,sBAEHhiB,KAAK+O,iBACP/O,KAAKiiB,mBAET,CAEA/a,UAAAA,GACE,OAAOlH,KAAKtC,OACd,CAEAie,UAAAA,CAAW1hB,GACT+F,KAAKhB,MAAQ/E,EAAM+E,MACnBgB,KAAKf,OAAShF,EAAMgF,OACpBe,KAAKqL,MAAQpR,EAAM4E,KAAKwM,MACxBrL,KAAKmL,QAAUlR,EAAM4E,KAAKsM,QAC1BnL,KAAKoL,WAAanR,EAAM4E,KAAKuM,WAC7BpL,KAAK0C,MAAQzI,EAAMyI,MACnB1C,KAAKxF,SAAWP,EAAMO,SAElBwF,KAAK8O,mBACP9O,KAAKgiB,sBAEHhiB,KAAK+O,iBACP/O,KAAKiiB,oBAGPjiB,KAAKhC,WAAagC,KAAK+hB,eACzB,CAEA5V,cAAAA,GACE,OAAQnM,KAAK0C,MAAMrE,IACjB,KAAK6jB,EAAAA,GAAQC,aACb,KAAKD,EAAAA,GAAQE,aACX,GAA0B,IAAtBpiB,KAAKqL,MAAM7N,OAAc,MAAO,CAAC,EAAG,GAExC,MAAM6kB,EAAe9V,KAAK+V,IAAI5B,EAAAA,IAAO1gB,KAAKqL,OAAQ3O,IAAiB,IAAA6lB,EAAAC,EAAA,OAAwB,QAAxBD,EAAc,QAAdC,EAAK9lB,EAAKmC,YAAI,IAAA2jB,OAAA,EAATA,EAAWC,gBAAQ,IAAAF,EAAAA,EAAI,CAAC,KAC1FG,EAAenW,KAAK+V,IAAI5B,EAAAA,IAAO1gB,KAAKqL,OAAQ3O,IAAiB,IAAAimB,EAAAC,EAAA,OAAwB,QAAxBD,EAAc,QAAdC,EAAKlmB,EAAKmC,YAAI,IAAA+jB,OAAA,EAATA,EAAWH,gBAAQ,IAAAE,EAAAA,EAAI,CAAC,KAC1FE,EAAUtW,KAAKuW,IAAIT,EAAcK,GAEjCK,EAAexW,KAAK+V,IAAI5B,EAAAA,IAAO1gB,KAAKqL,OAAQ3O,GAAsBA,EAAK7C,QACvEmpB,EAAezW,KAAK+V,IAAI5B,EAAAA,IAAO1gB,KAAKqL,OAAQ3O,GAAsBA,EAAK7C,QACvEopB,EAAW1W,KAAKuW,IAAIC,EAAcC,GAElCE,EAAaljB,KAAK0C,MAAMrE,KAAO6jB,EAAAA,GAAQC,aAAec,EAAWJ,EAAUI,GAAY,EAAIJ,EAAU,KAE3G,GAAInX,OAAOyX,MAAMD,GAAa,MAAO,CAAC,EAAG,GACzC,MAAME,EAAiB7W,KAAKuW,IAAIvW,KAAK8W,MAAM9W,KAAK+W,MAAM/W,KAAK+V,IAAIY,KAAe,GAAK,EAC7EK,EAAehX,KAAKiX,KAAKN,EAAaE,GAAkBA,EAE9D,MAAO,EAAEG,EAAcA,GACzB,QACE,OAAOE,EAAAA,GAAYzjB,KAAK0C,MAAMrE,IAEpC,CAEA0jB,aAAAA,GACE,MAAO2B,EAAWC,GAAa3jB,KAAKmM,iBACpC,IAAIyX,EAAWC,EAAAA,GAAU7jB,KAAK0C,MAAMrE,IAChC2B,KAAKkH,cAAgBlH,KAAK0C,MAAMrE,KAAO6jB,EAAAA,GAAQnJ,UACjD6K,EAAWE,EAAAA,IAEb,MAAMC,EAAcrD,EAAAA,MAEjBsD,OAAO,CAACN,EAAWC,IACnBM,MAAM,CAAC,EAAGL,EAASM,OAAO1mB,OAAS,IACtC,OAAQ9D,IACN,QAAiB,IAANA,IAAsBgS,OAAOC,SAASjS,GAC/C,OAAOkqB,EAASO,UAElB,MAAMC,EAAM7X,KAAK6X,IAAIV,EAAWC,GAC1Bb,EAAMvW,KAAKuW,IAAIY,EAAWC,GAC1BhW,EAAQpB,KAAKuW,IAAIvW,KAAK6X,IAAI1qB,EAAGopB,GAAMsB,GAEnCha,EAAImC,KAAKC,MAAMuX,EAAYpW,IAEjC,OAAOiW,EAASM,OAAO9Z,EAAE,CAE7B,CAEAia,eAAAA,CAAgB3nB,GACd,OAAIA,EAAKoB,QAAYpB,EAAKoB,OAAOA,OAAekC,KAAKqkB,gBAAgB3nB,EAAKoB,QAEnEpB,EAAKH,IACd,CAQAuf,UAAAA,CAAWjd,GACTmB,KAAKxF,SAAWqE,EAAKylB,KAErB,IAAK,IAAIla,EAAI,EAAGA,EAAIpK,KAAKqL,MAAM7N,OAAQ4M,IAAK,CAC1C,MAAMma,EAAWvkB,KAAKqL,MAAMjB,GAAG7N,KAE/B,GAAI8kB,MAAMC,QAAQziB,EAAKwM,OAAQ,CAC7B,MAAMmZ,EAAexkB,KAAKqkB,gBAAgBrkB,KAAKqL,MAAMjB,IAC/Cqa,EAAc5lB,EAAKwM,MAAMqN,MAAMhc,IAAI,IAAAgoB,EAAA,OAAKhoB,EAAKH,OAASgoB,IAAqB,QAATG,EAAAhoB,EAAKmC,YAAI,IAAA6lB,OAAA,EAATA,EAAWngB,UAAWigB,CAAY,IAE1G,IAAKC,EAAa,SAElBzkB,KAAKqL,MAAMjB,GAAGvQ,KAAO4qB,EAAY5qB,KACjCmG,KAAKqL,MAAMjB,GAAGxQ,WAAa6qB,EAAY7qB,UACzC,MACEoG,KAAKqL,MAAMjB,GAAGvQ,KAAOgF,EAAKwM,MAAMkZ,GAChCvkB,KAAKqL,MAAMjB,GAAGxQ,WAAaiF,EAAKjF,WAAW2qB,EAE/C,CAEIvkB,KAAK8O,kBACP9O,KAAKgiB,sBAELhiB,KAAK2kB,qBAGH3kB,KAAK+O,iBACP/O,KAAKiiB,oBAGPjiB,KAAKhC,WAAagC,KAAK+hB,eACzB,CAEA4C,kBAAAA,GACE,IAAK,IAAIva,EAAI,EAAGA,EAAIpK,KAAKoL,WAAW5N,OAAQ4M,IAC1CpK,KAAKoL,WAAWhB,GAAGvQ,UAAOoE,CAE9B,CAEA+jB,mBAAAA,GAEE,IADA,IAAI1d,EAAUsgB,EAAkBC,EAAchT,EAAOiT,EAAWC,EACvD3a,EAAI,EAAGA,EAAIpK,KAAKoL,WAAW5N,OAAQ4M,IAAK,CAC/C9F,EAAWtE,KAAKoL,WAAWhB,GAC3Bwa,EAAmB,EACnBC,EAAe,EACfE,GAAsB,EACtB,IAAK,IAAI/G,EAAI,EAAGA,EAAI1Z,EAAS5F,SAASlB,OAAQwgB,IAE5C8G,GADAjT,EAAQvN,EAAS5F,SAASsf,IACR/T,GAAK4H,EAAM3H,QACH,IAAf2H,EAAMhY,MAAuC,OAAfgY,EAAMhY,OAC7C+qB,GAAoB/S,EAAMhY,KAAOirB,EACjCC,GAAsB,GAExBF,GAAgBC,EAEbC,IACHzgB,EAASzK,KAAwB,IAAjBgrB,EAAqBD,EAAmBC,EAAe,EAE3E,CACF,CAEA5C,iBAAAA,GAEE,IADA,IAAI1d,EAAQD,EAAUsgB,EAAkBC,EAAchT,EAAOiT,EACpDrG,EAAI,EAAGA,EAAIze,KAAKmL,QAAQ3N,OAAQihB,IAAK,CAC5Cla,EAASvE,KAAKmL,QAAQsT,GACtBmG,EAAmB,EACnBC,EAAe,EACf,IAAK,IAAIza,EAAI,EAAGA,EAAI7F,EAAO7F,SAASlB,OAAQ4M,IAAK,CAC/C9F,EAAWC,EAAO7F,SAAS0L,GAC3B,IAAK,IAAI4T,EAAI,EAAGA,EAAI1Z,EAAS5F,SAASlB,OAAQwgB,IAE5C8G,GADAjT,EAAQvN,EAAS5F,SAASsf,IACR/T,GAAK4H,EAAM3H,QACH,IAAf2H,EAAMhY,MAAuC,OAAfgY,EAAMhY,OAC7C+qB,GAAoB/S,EAAMhY,KAAOirB,GAEnCD,GAAgBC,CAEpB,CACAvgB,EAAO1K,KAAwB,IAAjBgrB,EAAqBD,EAAmBC,EAAe,CACvE,CACF,CAEAG,iBAAAA,CAAkBtoB,GAChB,IAAKsD,KAAKtC,SAAWsC,KAAK/C,OAASW,EAAAA,GAAUC,MAAO,OAAO,EAE3D,MAAMonB,EAAgBjlB,KAAKtC,SAAWsC,KAAK/C,OAASW,EAAAA,GAAU+L,OAE9D,IAAI7L,EAAqBpB,EAAKoB,OAC1BonB,EAAcllB,KAAK8I,SAASxE,SAASkF,QAAQ2b,KAC7CC,EAAaplB,KAAK8I,SAASxE,SAASkF,QAAQC,IAAMzJ,KAAK8I,SAASxE,SAASsF,OAAO3K,OAEhFgmB,IAEFnnB,EAASpB,EAAKoB,OAAOA,OACrBonB,EAAcllB,KAAK8I,SAASvE,OAAOiF,QAAQ2b,KAC3CC,EAAaplB,KAAK8I,SAASvE,OAAOiF,QAAQC,IAAMzJ,KAAK8I,SAASvE,OAAOqF,OAAO3K,QAG9E,MAAMomB,EACJ9Y,KAAK8W,MAAMvlB,EAAO6E,EAAIuiB,KAAiBxoB,EAAKiG,GAAK4J,KAAK8W,MAAMvlB,EAAO8E,EAAIwiB,KAAgB1oB,EAAKkG,EACxFqG,EAAqBC,EAAAA,EAAgBC,oBAAoBrL,EAAQkC,KAAK8I,UAE5E,OAAOuc,GAAyBpc,EAAqB,EAAI,CAC3D,CAEAqc,WAAAA,CAAY5oB,GAAmB,IAAA6oB,EAAAC,EAAAC,EAC7B,IAAIlpB,EAAOG,EAAKH,KAChB,MAAMmG,EAAQ1C,KAAKF,KAAKiD,iBAClB2iB,EAAY1lB,KAAK8I,SAAS6c,eAAejjB,GACzCkjB,EAAgB5lB,KAAKglB,kBAAkBtoB,GACvCmpB,EAAanpB,EAAKwN,GAAK0b,EAE7B,IAAIE,EAAmB9lB,KAAK+lB,uBAAuBrpB,EAAKH,KAAMG,EAAKuN,GAAI4b,EAAYH,GACnF,IAAKI,GAAoB9lB,KAAKiO,iBAC5B6X,EAAmBJ,EAAUA,EAAUloB,OAAS,GAChDjB,EAAOyD,KAAKgmB,eACVzpB,EACAupB,EACAvZ,KAAKuW,IAAI,EAAGpmB,EAAKuN,GAAuD,EAAlDjK,KAAK8I,SAASmd,gBAAgBH,UAEjD,IAAKA,EAAkB,OAAO,KAErC,MAAMI,EAAqB1F,EAAoBsF,GACzCK,EAAavZ,EAAAA,GAAgB5M,KAAK0C,MAAMrE,IACxCsO,EAAwB,QAAfwZ,EAAwBzpB,EAAKuN,GAAK,GAAKkc,EAAa,KAAQA,EAE3E,IAAIC,GAAWC,EAAAA,EAAAA,IAAc3pB,EAAKH,QAAU+pB,EAAAA,GAAoBC,KAAO,GAAqB,QAAnBhB,EAAI7oB,EAAK9C,kBAAU,IAAA2rB,EAAAA,EAAI,GACxE,IAApBa,EAAS5oB,aAA8BS,IAAdvB,EAAK7C,MAAsB6R,OAAOC,SAASjP,EAAK7C,QAC3EusB,EAAWpmB,KAAKlG,YAAY4C,EAAK7C,KAAKE,QAAQ,GAAI0pB,EAAAA,GAAYzjB,KAAK0C,MAAMrE,IAAKsO,IAGhF,MAAM6Z,EACmG,QAD1FhB,EACgC,QADhCC,EACbzlB,KAAK8I,SAAS2d,cAAcX,UAAiB,IAAAL,OAAA,EAA7CA,EAA+ChpB,QAAQiqB,GAAgBhB,EAAU7oB,SAAS6pB,YAAa,IAAAlB,EAAAA,EAAI,GAE7G,IAAImB,EACAC,EAAiB,EACjBJ,EAAUhpB,SACZmpB,EACEH,GAAaxmB,KAAK+lB,uBAAuBK,EAAU1pB,EAAKuN,GAAI4b,EAAaK,EAAoBM,GAC/FI,EAAiBD,EAAenG,EAAoBmG,GAAgB,GAGtE,MAAME,EAAaX,EAAqBU,EAExC,MAAO,CACLE,UAAWpqB,EAAKwN,GAAK2c,GAAcjB,EAAgBA,EAAgB,EACnEmB,SAAUjB,EACVM,WACAO,eACApqB,OAEJ,CAEAwpB,sBAAAA,CAAuBiB,EAAchoB,EAAeC,EAAgBymB,GAClE,GAAKsB,EAAKxpB,OAEV,OAAOkoB,EAAUhN,MACdqO,GACC/mB,KAAKgmB,eAAegB,EAAMD,EAAUxa,KAAKuW,IAAI,EAAG9jB,EAAkD,EAA1CgB,KAAK8I,SAASmd,gBAAgBc,OACpFC,GAAQxG,EAAoBuG,GAAY9nB,GAEhD,CAEA+mB,cAAAA,CAAegB,EAAcD,EAAkBE,GAC7C,GAAiB,IAAbA,EAAgB,MAAO,GAC3B,MAAMC,EAAStJ,EAAgBmJ,GAC/B,IAAI3c,EAAI,EACJpL,EAAQ,EAEZ,KAAOoL,EAAI4c,EAAKxpB,QAAQ,KAAA2pB,EAEtB,GADAnoB,GAAwB,QAAnBmoB,EAAID,EAAOF,EAAK5c,WAAG,IAAA+c,EAAAA,EAAID,EAAU,EAClCloB,EAAQioB,EAAU,MACtB7c,GACF,CAEA,OAAO4c,EAAKI,UAAU,EAAGhd,EAC3B,CAEA/D,aAAAA,GACE,OAAOrG,KAAKoG,UACd,CAEAmV,gBAAAA,GACE,IAAI8L,EAAkBrnB,KAAKF,KAAK4C,QAChC,GAAI1C,KAAKoG,WAAWpG,KAAKoG,WAAW5I,OAAS,KAAO6pB,EAClD,OAAOA,EAET,IAAK,IAAIjd,EAAI,EAAGA,EAAIpK,KAAKoG,WAAW5I,OAAQ4M,IAC1C,GAAIpK,KAAKoG,WAAWgE,GAAKid,EACvB,OAAOrnB,KAAKoG,WAAWgE,GAI3B,OAAOpK,KAAKoG,WAAW,EACzB,CAEAsV,oBAAAA,GACE,IAAI2L,EAAkBrnB,KAAKF,KAAK4C,QAChC,GAAI1C,KAAKoG,WAAW,KAAOihB,EACzB,OAAOA,EAET,IAAK,IAAIjd,EAAIpK,KAAKoG,WAAW5I,OAAQ4M,GAAK,EAAGA,IAC3C,GAAIpK,KAAKoG,WAAWgE,GAAKid,EACvB,OAAOrnB,KAAKoG,WAAWgE,GAI3B,OAAOpK,KAAKoG,WAAW,EACzB,CAEA0M,gBAAAA,GACE,OAAO9S,KAAKoG,WAAWpG,KAAKoG,WAAW5I,OAAS,EAClD,CAEA1D,WAAAA,CACE6T,GAGA,IAAA2Z,EAAAC,EAAA,IAFCnD,EAAKtB,GAAgCla,UAAApL,OAAA,QAAAS,IAAA2K,UAAA,GAAAA,UAAA,GAAG6a,EAAAA,GAAYzjB,KAAK0C,MAAMrE,IAChEsO,EAAc/D,UAAApL,OAAA,QAAAS,IAAA2K,UAAA,GAAAA,UAAA,GAAGgE,EAAAA,GAAgB5M,KAAK0C,MAAMrE,IAExC8nB,EAAaxZ,EAKjB,GAJsB,iBAAXA,IACTwZ,EAAaxZ,EAAOgB,KAGjBwY,EAAY,OAAOxY,EAExB,MAAM6Z,EAAaC,WAAW9Z,GACxB+Z,EAAW/Z,EAAM+L,QAAQ,KAAM,IAC/BiO,EAAsBpb,KAAK6X,IAAIA,EAAKtB,IAAQ,GAAKvW,KAAKuW,IAAIsB,EAAKtB,IAAQ,EAC7E,IAAI8E,EAA8C,QAAtCN,EAAa,QAAbC,EAAGpB,SAAU,IAAAoB,OAAA,EAAVA,EAAY7N,QAAQ,KAAMgO,UAAS,IAAAJ,EAAAA,EAAII,EAGtD,OAAKvB,GAAeA,EAAWtpB,SAAS,MAEpC2qB,EAAa,IAAMG,EAA4B,IAAIC,IAEnDJ,EAAa,EAAU,IAAII,IAExBA,EAN+CA,CAOxD,CAEAtc,eAAAA,CAAgB5O,EAAmB3B,GAEjCA,EAAQ+P,UAAY9K,KAAKhC,WAAWtB,EAAK7C,MACzCkB,EAAQgQ,SAASrO,EAAKiG,EAAGjG,EAAKkG,EAAGlG,EAAKuN,GAAK,EAAGvN,EAAKwN,GAAK,GAExD,MAAM2d,EAAW7nB,KAAKslB,YAAY5oB,GAElC,IAAKmrB,EAAU,OAEf9sB,EAAQkI,OAGRlI,EAAQ+sB,aAAe,SACvB/sB,EAAQgtB,UAAY,SACpBhtB,EAAQ+P,UAAY,qBAEpB,MAAMkd,EAAQtrB,EAAKkG,EAAIilB,EAASf,UAC1BmB,EAASvrB,EAAKwN,GAAK2d,EAASf,UAC5BoB,EAAQxrB,EAAKiG,EAAIjG,EAAKuN,GAAK,EACjC,IAAIke,EAAQH,EAAQC,EAAS,EACzBG,EAAYD,EAAQN,EAASd,SAAW,EAC5C,MAAMjnB,EAAOE,KAAKF,KAAK4C,QACjBnH,EAASuE,EAAO,EAAK,EAAIA,EAAQ,IAAM,EACzC+nB,EAASlB,eACXyB,EAAYD,EAAQN,EAASd,SAAW,EACxCoB,GAASN,EAASlB,aAAe,EACjC5rB,EAAQstB,KAAO,QAAUR,EAASlB,aAAe,MAAQhF,EACzD5mB,EAAQutB,SAAST,EAASzB,SAAU8B,EAAQ3sB,EAAQ6sB,EAAY7sB,IAGlER,EAAQstB,KAAO,QAAUR,EAASd,SAAW,MAAQpF,EACrD5mB,EAAQutB,SAAST,EAAStrB,KAAM2rB,EAAQ3sB,EAAQ4sB,EAAQ5sB,GAExDR,EAAQ+P,UAAY,yBAEhB+c,EAASlB,eACX5rB,EAAQstB,KAAO,QAAUR,EAASlB,aAAe,MAAQhF,EACzD5mB,EAAQutB,SAAST,EAASzB,SAAU8B,EAAOE,IAG7CrtB,EAAQstB,KAAO,QAAUR,EAASd,SAAW,MAAQpF,EACrD5mB,EAAQutB,SAAST,EAAStrB,KAAM2rB,EAAOC,GACvCptB,EAAQqI,SACV,CAEAmlB,sBAAAA,CAAuBC,GAAyE,IAAAC,EAAAC,EAAAC,EAAAC,EAC9F,MAAO,CACLnf,IAAiB,QAAdgf,EAAED,aAAO,EAAPA,EAAS/e,WAAG,IAAAgf,EAAAA,EAAI,EACrBI,MAAqB,QAAhBH,EAAEF,aAAO,EAAPA,EAASK,aAAK,IAAAH,EAAAA,EAAI,EACzBI,OAAuB,QAAjBH,EAAEH,aAAO,EAAPA,EAASM,cAAM,IAAAH,EAAAA,EAAI,EAC3BxD,KAAmB,QAAfyD,EAAEJ,aAAO,EAAPA,EAASrD,YAAI,IAAAyD,EAAAA,EAAI,EAE3B,CAEAne,oBAAAA,CAAoBse,GAYjB,IAAAC,EAAAC,EAAA,IAZkB,KACnBvsB,EAAI,QACJ3B,EAAO,OACP2P,EAAM,KACNC,EAAI,OACJ7M,GAODirB,EACC,MAAMG,EAAiBlpB,KAAKuoB,uBAAuBzqB,aAAM,EAANA,EAAQ0L,SACrD2f,EAASnpB,KAAKuoB,uBAAuB7d,aAAM,EAANA,EAAQye,QAC7CxmB,EAAIjG,EAAKiG,EAAIumB,EAAe/D,KAAOgE,EAAOhE,KAC1CviB,EAAIlG,EAAKkG,EAAIsmB,EAAezf,IAAM0f,EAAO1f,IACzCzK,EAAQtC,EAAKuN,GAAKif,EAAe/D,KAAOgE,EAAOhE,KAAO+D,EAAeL,MAAQM,EAAON,MACpF5pB,EAAS2D,GAAmB,QAAlBomB,EAAIte,aAAM,EAANA,EAAQzL,cAAM,IAAA+pB,EAAAA,EAAI,GAEtCjuB,EAAQ+P,UAAYH,EACpB5P,EAAQ8O,YAA4B,QAAjBof,EAAGve,aAAM,EAANA,EAAQZ,cAAM,IAAAmf,EAAAA,EAAIjpB,KAAK8I,SAAS8B,WACtD7P,EAAQoP,YACRpP,EAAQsP,OAAO1H,EAAGC,GAClB7H,EAAQuP,OAAO3H,EAAG1D,GAElBlE,EAAQuP,OAAO5N,EAAKiG,EAAI,EAAG1D,GAC3BlE,EAAQuP,OAAO5N,EAAKiG,EAAI,GAAI1D,EAAS,GACrClE,EAAQuP,OAAO5N,EAAKiG,EAAI,GAAI1D,GAE5BlE,EAAQuP,OAAO3H,EAAI3D,EAAOC,GAC1BlE,EAAQuP,OAAO3H,EAAI3D,EAAO4D,GAC1B7H,EAAQuP,OAAO3H,EAAI,GAAKC,GACxB7H,EAAQ4P,OACR5P,EAAQyP,QACV,CAEAK,cAAAA,CAAcue,GAUX,IAVY,KACb1sB,EAAI,QACJ3B,EAAO,OACP2P,EAAM,OACN5M,GAMDsrB,EACC,IAAK1e,EAAQ,OAEb,MAAMwe,EAAiBlpB,KAAKuoB,uBAAuBzqB,aAAM,EAANA,EAAQ0L,SACrDA,EAAUxJ,KAAKuoB,uBAAuB7d,aAAM,EAANA,EAAQlB,SAEpDzO,EAAQ+sB,aAAe,aACvB/sB,EAAQgtB,UAAY,OACpBhtB,EAAQ+P,UAAYJ,EAAOlL,MAC3BzE,EAAQstB,KAAO,GAAG3d,EAAO2e,cAAc3e,EAAOqc,cAAcpF,IAE5D,MAAMqF,EAAOhnB,KAAKgmB,eAChBtpB,EAAKH,KAAKuV,cACVpH,EAAOqc,SACPrqB,EAAKuN,GAAKif,EAAe/D,KAAO3b,EAAQ2b,KAAO+D,EAAeL,MAAQrf,EAAQqf,OAEhF9tB,EAAQutB,SACNtB,EACAtqB,EAAKiG,EAAIumB,EAAe/D,KAAO3b,EAAQ2b,KACvCzoB,EAAKkG,EAAIsmB,EAAezf,IAAMD,EAAQC,IAAMiB,EAAOqc,SAEvD,CAEApjB,iBAAAA,CAAkBhB,EAAWC,GAG3B,IAFA,IAAIF,EAAQ1C,KAAKF,KAAK4C,SACjB0Y,EAAIX,GAAMza,KAAKF,KAAK+C,YAChBuH,EAAI,EAAGsX,EAAM1hB,KAAKqL,MAAM7N,OAAQ4M,EAAIsX,EAAKtX,IAAK,CACrD,IAAI1Q,EAAIsG,KAAKqL,MAAMjB,GACnB,GACE1Q,EAAEiJ,EAAID,EAAQ0Y,EAAKzY,GACnBA,GAAKjJ,EAAEiJ,EAAIjJ,EAAEuQ,GAAK,GAAKvH,EAAQ0Y,GAC/B1hB,EAAEkJ,EAAIF,EAAQ+X,EAAK7X,GACnBA,GAAKlJ,EAAEkJ,EAAIlJ,EAAEwQ,GAAK,GAAKxH,EAAQ+X,GAC/B/gB,EAAEoE,OAEF,OAAOpE,CAEX,CACF,CAEAyK,mBAAAA,CAAoBxB,EAAWC,GAG7B,IAFA,IAAIF,EAAQ1C,KAAKF,KAAK4C,SACjB0Y,EAAIX,GAAMza,KAAKF,KAAK+C,YAChBuH,EAAI,EAAGsX,EAAM1hB,KAAKmL,QAAQ3N,OAAQ4M,EAAIsX,EAAKtX,IAAK,CACvD,IAAI1Q,EAAIsG,KAAKmL,QAAQf,GACrB,GACE1Q,EAAEiJ,EAAID,EAAQ0Y,EAAKzY,GACnBA,GAAKjJ,EAAEiJ,EAAIjJ,EAAEuQ,GAAK,GAAKvH,EAAQ0Y,GAC/B1hB,EAAEkJ,EAAIF,EAAQ+X,EAAK7X,GACnBA,GAAKlJ,EAAEkJ,EAAIlJ,EAAEwQ,GAAK,GAAKxH,EAAQ+X,GAC/B/gB,EAAEoE,OAEF,OAAOpE,CAEX,CACF,CAEAmK,qBAAAA,CAAsBlB,EAAWC,GAG/B,IAFA,IAAIF,EAAQ1C,KAAKF,KAAK4C,SACjB0Y,EAAIX,GAAMza,KAAKF,KAAK+C,YAChBuH,EAAI,EAAGsX,EAAM1hB,KAAKoL,WAAW5N,OAAQ4M,EAAIsX,EAAKtX,IAAK,CAC1D,IAAI1Q,EAAIsG,KAAKoL,WAAWhB,GACxB,GACE1Q,EAAEiJ,EAAID,EAAQ0Y,EAAKzY,GACnBA,GAAKjJ,EAAEiJ,EAAIjJ,EAAEuQ,GAAK,GAAKvH,EAAQ0Y,GAC/B1hB,EAAEkJ,EAAIF,EAAQ+X,EAAK7X,GACnBA,GAAKlJ,EAAEkJ,EAAIlJ,EAAEwQ,GAAK,GAAKxH,EAAQ+X,GAC/B/gB,EAAEoE,OAEF,OAAOpE,CAEX,CACF,E,sHC/jBK,SAAS8a,EAA0Cva,GACxD,MAAMqvB,GAAcC,EAAAA,EAAAA,MAEpB,OACErrB,EAAAA,EAAAA,MAAAU,EAAAA,SAAA,CAAAF,SAAA,EACEC,EAAAA,EAAAA,KAAC2U,EAAAA,GAAM,CACLJ,YAAY,QACZ3C,MAAM,cACNjS,UAAWrE,EAAMqE,UACjB+U,QAASA,KACPpZ,EAAM6a,eACNwU,EAAYE,MAAM,EAClB9qB,SACH,eAIDR,EAAAA,EAAAA,MAACurB,EAAAA,GAAM,CAAC/oB,MAAO4oB,EAAa,aAAW,YAAW5qB,SAAA,EAChDC,EAAAA,EAAAA,KAAC+qB,EAAAA,GAAY,CAACprB,UAAU,UAASI,SAAC,eAClCC,EAAAA,EAAAA,KAACgrB,EAAAA,GAAU,CAACrrB,UAAU,iCAAgCI,UACpDC,EAAAA,EAAAA,KAACirB,EAAe,CACdC,QAAS5vB,EAAMyG,MAAMmpB,QACrBC,UAAW7vB,EAAMyG,MAAMopB,UACvBjrB,KAAM5E,EAAMyG,MAAM7B,KAClB2W,gBAAiBvb,EAAMub,qBAG3B7W,EAAAA,EAAAA,KAACorB,EAAAA,GAAY,CAAArrB,UACXC,EAAAA,EAAAA,KAAC2U,EAAAA,GAAM,CAAC0W,GAAIC,EAAAA,GAAcvrB,SAAC,iBAKrC,CASA,SAASkrB,EAAoD3vB,GAC3D,OAAIA,EAAM6vB,WAENnrB,EAAAA,EAAAA,KAAA,OAAKL,UAAU,yCAAwCI,UACrDC,EAAAA,EAAAA,KAACkR,EAAAA,EAAO,MAKV5V,EAAM4vB,UAAY5vB,EAAM4E,MAExBF,EAAAA,EAAAA,KAAA,OAAKL,UAAU,QAAOI,UACpBC,EAAAA,EAAAA,KAACurB,EAAAA,GAAS,CACRC,aAAa,EACbxsB,MAAM,mBACNysB,SACElsB,EAAAA,EAAAA,MAAAU,EAAAA,SAAA,CAAAF,SAAA,CAAE,0CAEAC,EAAAA,EAAAA,KAAA,SAAM,gGAUhBT,EAAAA,EAAAA,MAAAU,EAAAA,SAAA,CAAAF,SAAA,EACEC,EAAAA,EAAAA,KAAA,OAAK+C,IAAKiG,SAAShK,MAAO0sB,IAAKpwB,EAAM4E,KAAKyrB,OAAQhsB,UAAU,YAC5DK,EAAAA,EAAAA,KAAA,OAAKL,UAAU,OAAMI,UACnBC,EAAAA,EAAAA,KAAC4rB,EAAAA,EAAW,CACVC,SAAUvwB,EAAM4E,KAAK2rB,SACrB7sB,MAAOgK,SAAShK,MAChB8sB,mBAAoBxwB,EAAM4E,KAAKyrB,OAC/BI,0BAA2BzwB,EAAMub,sBAK3C,C,2IClGA,MAAMzW,UAAkB4rB,EAAAA,UAOtBC,qBAAAA,CAAsBC,GAEpB,OAAOA,EAAUhsB,MAAQmB,KAAK/F,MAAM4E,IACtC,CAEA4C,MAAAA,GACE,IAAI5C,EAAOmB,KAAK/F,MAAM4E,KAClB8D,EAAI+d,EAAAA,MAAiBuD,MAAM,CAAC,EAAGjkB,KAAK/F,MAAM+E,QAAQglB,OAAO,CAAC,EAAGnlB,EAAKrB,SAElEoF,EAAI8d,EAAAA,MAELuD,MAAM,CAACjkB,KAAK/F,MAAMgF,OAAS,EAAG,IAC9B+kB,OAAOtD,EAAAA,IAAU7hB,GAAOnF,GAAMA,KAE7BoxB,EAAOpK,EAAAA,MAERqK,MAAMrK,EAAAA,KACN/d,GAAE,CAACjJ,EAAG0Q,IAAMzH,EAAEyH,KACdxH,GAAGlJ,GAAMkJ,EAAElJ,KAEd,OACEiF,EAAAA,EAAAA,KAAA,OACEL,UAAWC,IAAW,YAAayB,KAAK/F,MAAMqE,WAC9CU,MAAOgB,KAAK/F,MAAM+E,MAClBC,OAAQe,KAAK/F,MAAMgF,OAAOP,UAE1BC,EAAAA,EAAAA,KAAA,KAAGqsB,UAAU,kBAAiBtsB,UAC5BC,EAAAA,EAAAA,KAAA,QAAMjF,EAAGoxB,EAAKjsB,QAItB,E,EAtCIE,E,EAAS,Y,EACM,CACjBC,MAAOisB,IAAAA,OAAiBC,WACxBjsB,OAAQgsB,IAAAA,OAAiBC,WACzBrsB,KAAMosB,IAAAA,QAAkBA,IAAAA,QAAkBC,a,kaAqC9C,S,2GC/COnW,eAAeG,EAAaiW,EAA6BnE,GAC9D,MAAMrF,GAAaC,EAAAA,EAAAA,KAEbwJ,GAAQC,EAAAA,EAAAA,KACRrsB,EAAQmsB,EAASnsB,MAAQosB,EACzBnsB,EAASksB,EAASlsB,OAASmsB,EAE3BjoB,EAASwE,SAASC,cAAc,UAChC7M,EAAUoI,EAAO2C,WAAW,MAAMC,EAAAA,EAAAA,MAAqB,CAAEC,oBAAoB,QAAS/H,GAC5FkF,EAAOnE,MAAQA,EACfmE,EAAOlE,OAASA,EAAS,GAGzBlE,EAAQ+P,UAAY,OACpB/P,EAAQgQ,SAAS,EAAG,EAAG/L,EAAOC,GAG9B,MAAMqsB,QAAahkB,EAAAA,EAAAA,GAAUikB,GAC7BxwB,EAAQmI,UAAUooB,EAAM,EAAG,GAG3B,MAAMzc,EAAQmY,EAAKpqB,KAAK+b,GAAMA,EAAE7G,gBAChC,IAAInP,EAAI3D,EAGRjE,EAAQ+sB,aAAe,SACvB/sB,EAAQgtB,UAAY,QACpBhtB,EAAQstB,KAAO,OAAS1G,EACxB,IAAK,IAAIvX,EAAIyE,EAAMrR,OAAS,EAAG4M,GAAK,EAAGA,IAAK,CAC1C,MAAM4c,EAAOnY,EAAMzE,GACnB,IAAIohB,EAAYzwB,EAAQ0wB,YAAYzE,GAAMhoB,MAK1C,GAHAjE,EAAQ+P,UAAY,UACpB/P,EAAQutB,SAAStB,EAAMrkB,EAVf,IAYJyH,EAAI,EAAG,CACT,MAAMshB,EAAU,QAChB3wB,EAAQ+P,UAAY,UACpB/P,EAAQutB,SAASoD,EAAS/oB,EAAI6oB,EAfxB,IAgBNA,GAAwBzwB,EAAQ0wB,YAAYC,GAAS1sB,KACvD,CAEA2D,GAAQ6oB,CACV,CAIA,OAFAzwB,EAAQmI,UAAUioB,EAAU,EAAG,EAAGnsB,EAAQosB,EAAOnsB,EAASmsB,EAAO,EAAG,GAAIpsB,EAAOC,GAExEkE,EAAOwoB,WAChB,C,+BCtDO,SAAS/J,IACd,MAAO,MACT,C,2GCKA,MAoBagK,EAAmB,CAC9B1H,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,WAEP0H,EAAmB,CAAE3H,OAAQ0H,EAAiB1H,OAAOhS,QAAQ4Z,UAAW3H,UAAWyH,EAAiBzH,WACpG4H,EAAc,CAAE7H,OAAQ0H,EAAiB1H,OAAOhS,MAAM,EAAG,IAAI4Z,UAAW3H,UAAWyH,EAAiBzH,WACpG6H,EAAgB,CAAE9H,OAAQ0H,EAAiB1H,OAAOhS,MAAM,IAAKiS,UAAWyH,EAAiBzH,WA49DzF8H,EAA0B,CAC9B/H,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,QAg/BAN,EAAiD,CAC5D,CAAC3B,EAAAA,GAAQgK,iBAAkBN,EAC3B,CAAC1J,EAAAA,GAAQnJ,SAAU6S,EACnBO,GAAIP,EACJQ,IAAKR,EACLS,IAAKT,EACLU,IAAKV,EACLW,IAAKX,EACLY,QA97HmB,CACnBtI,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,WAo9FXsI,IAAKZ,EACLa,KAAMb,EACNc,KAAMd,EACNe,IAAKf,EACLgB,IAAKhB,EACLiB,KAAMd,EACNe,OAAQnB,EACRoB,OAAQjB,EACRkB,KAAMrB,EACNsB,UA39FuB,CACvBhJ,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,WAi/DXgJ,cAAevB,EACfwB,cAAexB,EACfyB,gBAAiBzB,GAGN0B,EAAuD,CAClE,CAACpL,EAAAA,GAAQgK,iBAAkBD,EAC3B,CAAC/J,EAAAA,GAAQnJ,SAAUkT,EACnBE,GAAIF,EACJG,IAAKH,EACLI,IAAKJ,EACLK,IAAKL,EACLM,IAAKN,EACLO,QA9gC0B,CAC1BtI,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,U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","sources":["webpack://@finviz/website/./js/app/maps/components/CanvasHover.tsx","webpack://@finviz/website/./js/app/maps/components/Canvas.tsx","webpack://@finviz/website/./js/app/maps/components/Legend.tsx","webpack://@finviz/website/./js/app/maps/components/Map.tsx","webpack://@finviz/website/./js/app/maps/components/MapContext.tsx","webpack://@finviz/website/./js/app/maps/components/MapSelect.tsx","webpack://@finviz/website/./js/app/maps/components/Search.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Expand.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Share.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Zoom.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Topbar.tsx","webpack://@finviz/website/./js/app/maps/hooks/use-map-data.ts","webpack://@finviz/website/./js/app/maps/hooks/use-map-type.ts","webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/maps/constants/font.ts","webpack://@finviz/website/./js/app/maps/zoom.ts","webpack://@finviz/website/./js/app/maps/treemap.ts","webpack://@finviz/website/./js/app/shared/components/Share.tsx","webpack://@finviz/website/./js/app/shared/components/Sparkline.tsx","webpack://@finviz/website/./js/app/shared/drawShareMap.ts","webpack://@finviz/website/./js/app/shared/getTextFontFamily.ts","webpack://@finviz/website/./js/app/shared/gradients.ts","webpack://@finviz/website/./js/app/shared/loadImage.ts","webpack://@finviz/website/./js/app/shared/retinafy.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/button-switch/button-switch.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/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/icon/svg.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/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/tabs/tabs.tsx","webpack://@finviz/website/./js/main/components/badge.tsx","webpack://@finviz/website/./js/main/components/tag.tsx","webpack://@finviz/website/./js/main/components/loading.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/social-share/DownloadImageButton.tsx","webpack://@finviz/website/./js/main/components/social-share/SocialShare.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/../node_modules/prop-types/factoryWithThrowingShims.js","webpack://@finviz/website/../node_modules/prop-types/index.js","webpack://@finviz/website/../node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://@finviz/website/../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","webpack://@finviz/website/../node_modules/@floating-ui/react/dist/floating-ui.react.mjs","webpack://@finviz/website/../node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs"],"sourcesContent":["import { flip, offset, shift, useClientPoint, useFloating, useInteractions } from '@floating-ui/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport '../../../../styles/map-hover.css'\r\nimport Sparkline from '../../shared/components/Sparkline'\r\nimport MapActions from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataNode, MapTypeId } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\n\r\ninterface CanvasHoverProps {\r\n  treemap: Treemap\r\n}\r\n\r\ninterface CanvasHoverState {\r\n  hoveredNode?: MapDataNode | null\r\n  visibleNodes: MapDataNode[]\r\n  sparklineData: Record<string, number[]>\r\n}\r\n\r\nconst formatPerf = (d: MapDataNode, treemap: Treemap) => {\r\n  if (typeof d.additional !== 'undefined' && d.additional !== null) {\r\n    return d.additional\r\n  } else if (typeof d.perf !== 'undefined' && d.perf !== null) {\r\n    return treemap.formatValue(d.perf.toFixed(2))\r\n  } else {\r\n    return 'N/A'\r\n  }\r\n}\r\n\r\nexport default function CanvasHover(props: CanvasHoverProps) {\r\n  const prevDataHash = React.useRef(props.treemap.dataHash)\r\n  const [{ hoveredNode, visibleNodes, sparklineData }, setState] = React.useState<CanvasHoverState>({\r\n    hoveredNode: null,\r\n    visibleNodes: [],\r\n    sparklineData: {},\r\n  })\r\n\r\n  /**\r\n   * Compute position using floating ui\r\n   */\r\n  const { refs, floatingStyles, context, isPositioned, update } = useFloating({\r\n    open: !!hoveredNode,\r\n    strategy: 'fixed',\r\n    placement: 'right-start',\r\n    middleware: [offset({ mainAxis: 100 }), flip({ crossAxis: false }), shift()],\r\n  })\r\n  const clientPoint = useClientPoint(context)\r\n  const { getFloatingProps } = useInteractions([clientPoint])\r\n\r\n  /**\r\n   * Update state when store changes\r\n   */\r\n  React.useEffect(() => {\r\n    const handleMapStoreChange = () => {\r\n      const storeHoveredNode = MapStore.getHoveredNode(props.treemap.mapNodeId)\r\n      const sparklineData = MapStore.getSparklines()\r\n      const visibleNodes = getVisibleTooltipNodes(storeHoveredNode)\r\n\r\n      if (storeHoveredNode && storeHoveredNode.name !== hoveredNode?.name) {\r\n        const tickersToLoad = visibleNodes\r\n          .filter((node) => (props.treemap.dataHash !== prevDataHash.current ? true : !sparklineData[node.name]))\r\n          .map((node) => node!.name)\r\n        if (\r\n          storeHoveredNode &&\r\n          !sparklineData[storeHoveredNode.name] &&\r\n          !tickersToLoad.includes(storeHoveredNode?.name)\r\n        ) {\r\n          tickersToLoad.push(storeHoveredNode.name)\r\n        }\r\n\r\n        prevDataHash.current = props.treemap.dataHash\r\n        MapActions.loadSparklineData(tickersToLoad, props.treemap.type)\r\n      }\r\n\r\n      setState((prevState) => ({ ...prevState, hoveredNode: storeHoveredNode, visibleNodes, sparklineData }))\r\n    }\r\n\r\n    MapStore.addChangeListener(handleMapStoreChange)\r\n\r\n    return () => {\r\n      MapStore.removeChangeListener(handleMapStoreChange)\r\n      MapActions.loadSparklinesCancel()\r\n    }\r\n  }, [hoveredNode?.name, props.treemap.mapNodeId, props.treemap.type, props.treemap.dataHash, update])\r\n\r\n  const hoveredSparkline = hoveredNode ? sparklineData[hoveredNode.name] : []\r\n  const hasSparkline = hoveredSparkline?.length > 0\r\n  const price = hoveredSparkline?.[hoveredSparkline.length - 1]?.toFixed(2) ?? ''\r\n  const isSmall = visibleNodes.length > 15\r\n  const title =\r\n    (props.treemap.type !== MapTypeId.World ? hoveredNode?.parent.parent.name + ' - ' : '') + hoveredNode?.parent.name\r\n  const backgroundColor = hoveredNode ? props.treemap.colorScale(hoveredNode.perf) : undefined\r\n\r\n  return (\r\n    <div\r\n      ref={refs.setFloating}\r\n      id=\"hover\"\r\n      className={classnames('pointer-events-none absolute left-0 top-0', { invisible: !hoveredNode || !isPositioned })}\r\n      style={floatingStyles}\r\n      {...getFloatingProps()}\r\n    >\r\n      <h3 className=\"text-left\">{title}</h3>\r\n      <table className={isSmall ? 'is-small' : ''}>\r\n        <tbody>\r\n          {hoveredNode && (\r\n            <>\r\n              <tr className=\"hovered\" style={{ backgroundColor }}>\r\n                <td className=\"ticker\">{hoveredNode.data?.data?.nameOverride ?? hoveredNode.name}</td>\r\n                <td>\r\n                  {hasSparkline && (\r\n                    <Sparkline className=\"white\" width={65} height={25} data={sparklineData[hoveredNode.name]} />\r\n                  )}\r\n                </td>\r\n                <td className=\"price\">{price}</td>\r\n                <td className=\"change\">{formatPerf(hoveredNode, props.treemap)}</td>\r\n              </tr>\r\n              <tr\r\n                className={classnames('hovered is-description', { 'is-empty': !hoveredNode.description })}\r\n                style={{ backgroundColor }}\r\n              >\r\n                <td colSpan={4} className={classnames({ description: hoveredNode.description })}>\r\n                  {hoveredNode.description}\r\n                </td>\r\n              </tr>\r\n            </>\r\n          )}\r\n\r\n          {visibleNodes.length > 1 &&\r\n            visibleNodes.map((c) => {\r\n              const hasSparkline = sparklineData?.[c.name]?.length > 0\r\n              const data = hasSparkline ? sparklineData[c.name] : []\r\n              return (\r\n                <tr key={c.name}>\r\n                  <td className=\"ticker text-gray-900\">{c.data?.data?.nameOverride ?? c.name}</td>\r\n                  <td>\r\n                    {hasSparkline && <Sparkline width={65} height={isSmall ? 20 : 25} data={sparklineData[c.name]} />}\r\n                  </td>\r\n                  <td className=\"price text-gray-900\">{hasSparkline ? data[data.length - 1].toFixed(2) : ''}</td>\r\n                  <td className=\"change\" style={{ color: props.treemap.colorScale(c.perf) }}>\r\n                    {formatPerf(c, props.treemap)}\r\n                  </td>\r\n                </tr>\r\n              )\r\n            })}\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n  )\r\n}\r\n","import classNames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport * as React from 'react'\r\n\r\nimport { isFirefoxDesktop } from '../../shared/isMobile'\r\nimport { loadImage } from '../../shared/loadImage'\r\nimport { retinafy } from '../../shared/retinafy'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataIndustry, MapDataNode, MapDataSector, MapTypeId, NodeDepth } from '../types'\r\nimport { getOffset } from '../utils'\r\nimport CanvasHover from './CanvasHover'\r\nimport Legend from './Legend'\r\n\r\ninterface CanvasProps {\r\n  alt?: string\r\n  treemap: Treemap\r\n  zoom?: boolean\r\n  legend?: boolean\r\n  zoomOnWheel?: boolean\r\n  hover?: boolean\r\n  onNodeClick?: (props: {\r\n    event: React.MouseEvent<HTMLCanvasElement>\r\n    treemap: Treemap\r\n    node?: MapDataNode\r\n    industry?: MapDataIndustry\r\n    sector?: MapDataSector\r\n  }) => void\r\n}\r\n\r\ninterface CanvasState {\r\n  zoom: number\r\n  initialized: boolean\r\n  type: MapTypeId\r\n  dataHash: string\r\n  width: number\r\n  height: number\r\n}\r\n\r\n// TODO presunt w, h, zoom, translate do stavu\r\nclass Canvas extends React.Component<CanvasProps, CanvasState> {\r\n  static defaultProps = {\r\n    zoom: true,\r\n    legend: true,\r\n    hover: true,\r\n    zoomOnWheel: true,\r\n  }\r\n\r\n  state: CanvasState = {\r\n    zoom: 1,\r\n    initialized: false,\r\n    type: this.props.treemap.type,\r\n    dataHash: this.props.treemap.dataHash,\r\n    width: this.props.treemap.width,\r\n    height: this.props.treemap.height,\r\n  }\r\n\r\n  _canvas = React.createRef<HTMLCanvasElement>()\r\n  _hoverCanvas = React.createRef<HTMLCanvasElement>()\r\n\r\n  // @ts-ignore\r\n  _canvasContext: CanvasRenderingContext2D\r\n  // @ts-ignore\r\n  _hoverContext: CanvasRenderingContext2D\r\n\r\n  _cache: Record<string, { canvas: HTMLCanvasElement; context: CanvasRenderingContext2D }> = {}\r\n  mouseDown: boolean = false\r\n  lastPanX: number = 0\r\n  lastPanY: number = 0\r\n\r\n  animationFrameId: number | null = null\r\n\r\n  // @ts-ignore\r\n  worldBackground: HTMLImageElement\r\n\r\n  constructor(props: CanvasProps) {\r\n    super(props)\r\n\r\n    this._cache = {}\r\n\r\n    for (var event of [\r\n      '_onChange',\r\n      '_onMouseDown',\r\n      '_onMouseMove',\r\n      '_onMouseUp',\r\n      '_onMouseLeave',\r\n      '_onDoubleClick',\r\n      '_onWheel',\r\n      '_onPanStart',\r\n      '_onPanMove',\r\n      '_onPinch',\r\n      '_getPublishCanvas',\r\n    ]) {\r\n      // @ts-ignore\r\n      this[event] = this[event].bind(this)\r\n    }\r\n  }\r\n\r\n  componentDidMount() {\r\n    MapStore.addChangeListener(this._onChange)\r\n    mapActionCreators._setOnPublish(this._getPublishCanvas)\r\n\r\n    void this._initialize()\r\n  }\r\n\r\n  componentDidUpdate() {\r\n    if (!this.state.initialized) return\r\n\r\n    const { treemap } = this.props\r\n    const { dataHash, type } = this.state\r\n\r\n    // Nothing changed from outside, so we just render the current view\r\n    if (\r\n      // Data update\r\n      treemap.dataHash === dataHash &&\r\n      // Type update\r\n      type === treemap.type &&\r\n      // Window Resize\r\n      treemap.width === this.state.width &&\r\n      treemap.height === this.state.height\r\n    ) {\r\n      this.renderFromCache(this._canvasContext)\r\n      this.renderHover(this._hoverContext)\r\n      return\r\n    }\r\n\r\n    this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n    if (!this.worldBackground && treemap.type === MapTypeId.World) {\r\n      void this._loadTreemapGeoBackground().then(() => this._updateCanvasCaches(treemap))\r\n    } else {\r\n      this._updateCanvasCaches(treemap)\r\n    }\r\n  }\r\n\r\n  componentWillUnmount() {\r\n    // TODO remove hammer listener\r\n    MapStore.removeChangeListener(this._onChange)\r\n    this._hoverCanvas.current?.removeEventListener('wheel', this._onWheel)\r\n  }\r\n\r\n  render() {\r\n    const { initialized } = this.state\r\n    const { alt, treemap, legend, hover, zoom } = this.props\r\n\r\n    return (\r\n      <div id=\"canvas-wrapper\">\r\n        <canvas ref={this._canvas} className={classNames('chart', { initialized })}>\r\n          {alt}\r\n        </canvas>\r\n        {(hover || zoom) && (\r\n          <canvas\r\n            ref={this._hoverCanvas}\r\n            className=\"hover-canvas absolute left-0 top-0\"\r\n            onMouseDown={this._onMouseDown}\r\n            onMouseMove={this._onMouseMove}\r\n            onMouseUp={this._onMouseUp}\r\n            onMouseLeave={this._onMouseLeave}\r\n            onDoubleClick={this._onDoubleClick}\r\n          />\r\n        )}\r\n        {legend && <Legend key={treemap.scale.id} treemap={treemap} className=\"pt-4\" />}\r\n        {hover && <CanvasHover treemap={treemap} />}\r\n      </div>\r\n    )\r\n  }\r\n\r\n  renderFromCache(context: CanvasRenderingContext2D) {\r\n    const { treemap } = this.props\r\n    const { zoom } = this.state\r\n    const [x, y] = treemap.zoom.translate()\r\n    const nearestSize = treemap.zoom.getNearestSize(zoom)\r\n\r\n    // Last resort if the cache doesn’t exist\r\n    if (!this._cache[nearestSize]) this._createCache(nearestSize)\r\n\r\n    context.save()\r\n    context.drawImage(this._cache[nearestSize].canvas, ~~x, ~~y, ~~(treemap.width * zoom), ~~(treemap.height * zoom))\r\n    context.restore()\r\n  }\r\n\r\n  _onChange() {\r\n    const { treemap } = this.props\r\n\r\n    this.setState({ zoom: treemap.zoom.scale() })\r\n  }\r\n\r\n  _onMouseDown() {\r\n    this.mouseDown = true\r\n  }\r\n\r\n  _onMouseMove(e: React.MouseEvent<HTMLCanvasElement>) {\r\n    if (this.mouseDown || !this.props.hover) return\r\n\r\n    const { treemap } = this.props\r\n    var { offsetX, offsetY } = getOffset(e)\r\n    let nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n\r\n    if (!nodeAtPosition) {\r\n      const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n      nodeAtPosition = industryAtPosition?.children[0]\r\n    }\r\n\r\n    MapActionCreators.setHoveredNode(treemap.mapNodeId, nodeAtPosition)\r\n  }\r\n\r\n  _onMouseUp() {\r\n    this.mouseDown = false\r\n  }\r\n\r\n  _onMouseLeave() {\r\n    MapActionCreators.setHoveredNode(this.props.treemap.mapNodeId, undefined)\r\n  }\r\n\r\n  _onDoubleClick(e: React.MouseEvent<HTMLCanvasElement>) {\r\n    const { treemap } = this.props\r\n    const { offsetX, offsetY } = getOffset(e)\r\n    const nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n    const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n    const sectorAtPosition = treemap.getSectorAtPosition(offsetX, offsetY)\r\n    this.props.onNodeClick?.({\r\n      event: e,\r\n      treemap,\r\n      node: nodeAtPosition,\r\n      industry: industryAtPosition,\r\n      sector: sectorAtPosition,\r\n    })\r\n  }\r\n\r\n  _onWheel(e: MouseEvent) {\r\n    if (!this.props.zoom) return\r\n\r\n    e.preventDefault()\r\n\r\n    if (!this.state.initialized) {\r\n      return\r\n    }\r\n\r\n    var { offsetX, offsetY } = getOffset(e)\r\n    // @ts-ignore\r\n    MapActionCreators.zoom(this.props.treemap, -e.deltaY, offsetX, offsetY)\r\n  }\r\n\r\n  _onPanStart(e: any) {\r\n    if (!this.state.initialized) {\r\n      return\r\n    }\r\n\r\n    this.lastPanX = e.pointers[0].clientX\r\n    this.lastPanY = e.pointers[0].clientY\r\n  }\r\n\r\n  _onPanMove(e: any) {\r\n    if (!this.state.initialized) {\r\n      return\r\n    }\r\n\r\n    var movementX = this.lastPanX - e.pointers[0].clientX\r\n    var movementY = this.lastPanY - e.pointers[0].clientY\r\n    this.lastPanX = e.pointers[0].clientX\r\n    this.lastPanY = e.pointers[0].clientY\r\n    const { treemap } = this.props\r\n    MapActionCreators.changeTranslate(treemap, movementX, movementY)\r\n  }\r\n\r\n  _onPinch(e: any) {\r\n    if (!this.state.initialized || !this.props.zoom || e.pointers.length < 2) {\r\n      return\r\n    }\r\n\r\n    var offsetX1 = e.pointers[0].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft, // TODO fix scrolled\r\n      offsetY1 = e.pointers[0].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n      offsetX2 = e.pointers[1].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft,\r\n      offsetY2 = e.pointers[1].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n      offsetX = (offsetX1 + offsetX2) / 2,\r\n      offsetY = (offsetY1 + offsetY2) / 2\r\n    var direction = e.scale >= 1 ? 1 : -1\r\n    MapActionCreators.zoom(this.props.treemap, direction, offsetX, offsetY)\r\n  }\r\n\r\n  _setCanvasContexts() {\r\n    const canvas = this._canvas.current!\r\n    const canvasContext = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n    this._canvasContext = canvasContext\r\n\r\n    if (this.props.hover || this.props.zoom) {\r\n      const hoverCanvas = this._hoverCanvas.current!\r\n      const hoverContext = hoverCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n\r\n      this._hoverContext = hoverContext\r\n    }\r\n  }\r\n\r\n  _setCanvasSize(width: number, height: number) {\r\n    retinafy(this._canvas.current, this._canvasContext, width, height)\r\n\r\n    if (this.props.hover || this.props.zoom) {\r\n      retinafy(this._hoverCanvas.current, this._hoverContext, width, height)\r\n    }\r\n  }\r\n\r\n  async _initialize() {\r\n    const { treemap, zoomOnWheel } = this.props\r\n\r\n    this._setCanvasContexts()\r\n    this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n    const zoomLevels = treemap.getZoomLevels()\r\n    var render = () => {\r\n      this._createCacheWithPriority(zoomLevels, zoomLevels[0], () => {\r\n        this.setState({ initialized: true })\r\n\r\n        const hoverCanvas = this._hoverCanvas.current\r\n\r\n        if (!hoverCanvas) return\r\n\r\n        var hammertime = new Hammer(hoverCanvas)\r\n        hammertime.get('pinch').set({ enable: true, threshold: 0.1 })\r\n        hammertime.on('panstart', this._onPanStart)\r\n        hammertime.on('panmove', this._onPanMove)\r\n        hammertime.on('pinch', this._onPinch)\r\n\r\n        if (zoomOnWheel) {\r\n          hoverCanvas.addEventListener('wheel', this._onWheel, { passive: false })\r\n        }\r\n      })\r\n    }\r\n\r\n    if (treemap.type === MapTypeId.World) {\r\n      await this._loadTreemapGeoBackground()\r\n      render()\r\n    } else {\r\n      render()\r\n    }\r\n  }\r\n\r\n  async _getTreemapGeoBackground() {\r\n    if (this.props.treemap.getIsSmall()) {\r\n      return FinvizSettings.hasDarkTheme\r\n        ? import('../assets/map_geo_small_dark@2x.png')\r\n        : import('../assets/map_geo_small@2x.png')\r\n    }\r\n\r\n    return import('../assets/map_geo.png')\r\n  }\r\n\r\n  async _loadTreemapGeoBackground() {\r\n    try {\r\n      const image = await this._getTreemapGeoBackground()\r\n      this.worldBackground = await loadImage(image.default)\r\n    } catch {}\r\n  }\r\n\r\n  _createCache(scale: number) {\r\n    const { treemap } = this.props\r\n\r\n    const oldScale = treemap.zoom.scale()\r\n    const oldTranslate = treemap.zoom.translate()\r\n    const width = ~~(treemap.width * scale)\r\n    const height = ~~(treemap.height * scale)\r\n\r\n    if (!this._cache[scale]) {\r\n      const cacheCanvas = document.createElement('canvas')\r\n      const cacheContext = cacheCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n\r\n      this._cache[scale] = { canvas: cacheCanvas, context: cacheContext }\r\n    }\r\n\r\n    retinafy(this._cache[scale].canvas, this._cache[scale].context, width, height)\r\n\r\n    treemap.zoom.scale(scale)\r\n    treemap.zoom.translateAbs([0, 0])\r\n    this.renderCanvas(this._cache[scale].context, treemap)\r\n    treemap.zoom.scale(oldScale)\r\n    treemap.zoom.translateAbs(oldTranslate)\r\n  }\r\n\r\n  _updateCanvasCaches(treemap: Treemap) {\r\n    this._createCacheWithPriority(treemap.getZoomLevels(), treemap.zoom.getNearestSize(), () => {\r\n      this.setState((prevState) => ({\r\n        dataHash: treemap.dataHash,\r\n        width: treemap.width,\r\n        height: treemap.height,\r\n        type: treemap.type,\r\n        zoom: treemap.type !== prevState.type ? 1 : prevState.zoom,\r\n      }))\r\n\r\n      // Reset zoom if we’re changing map type\r\n      if (this.state.type !== treemap.type) {\r\n        mapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n        mapActionCreators.resetSparklineData()\r\n      }\r\n\r\n      this.renderFromCache(this._canvasContext)\r\n    })\r\n  }\r\n\r\n  _createCacheWithPriority(zoomLevels: number[], currentZoom: number, callback?: () => void) {\r\n    if (this.animationFrameId) window.cancelAnimationFrame(this.animationFrameId)\r\n\r\n    const remainingLevels = zoomLevels.filter((level) => level !== currentZoom)\r\n    this.animationFrameId = requestAnimationFrame(() => {\r\n      this._createCache(currentZoom)\r\n      callback?.()\r\n      this._queueUpdateCache(remainingLevels)\r\n    })\r\n  }\r\n\r\n  _queueUpdateCache(scales: number[], currentScale = 0) {\r\n    if (!scales[currentScale]) return\r\n\r\n    this.animationFrameId = requestAnimationFrame(() => {\r\n      this._createCache(scales[currentScale])\r\n      this._queueUpdateCache(scales, currentScale + 1)\r\n    })\r\n  }\r\n\r\n  renderHover(context: CanvasRenderingContext2D) {\r\n    if (!this.props.hover) return\r\n\r\n    const { treemap } = this.props\r\n    const { hover } = treemap.settings.industry\r\n    const hoveredNode = MapStore.getHoveredNode(treemap.mapNodeId)\r\n    const industry = hoveredNode?.parent\r\n\r\n    context.save()\r\n\r\n    context.clearRect(0, 0, treemap.width, treemap.height)\r\n    context.translate.apply(context, treemap.zoom.translate())\r\n    context.scale(treemap.zoom.scale(), treemap.zoom.scale())\r\n\r\n    if (!industry) {\r\n      context.restore()\r\n      return\r\n    }\r\n\r\n    const showIndustryHeader =\r\n      LayoutGenerator.isNodeHeaderVisible(industry, treemap.settings) && industry.depth === NodeDepth.Industry\r\n    let industryOffset =\r\n      treemap.getIsSmall() || showIndustryHeader\r\n        ? treemap.settings.industry.padding.top\r\n        : LayoutGenerator.smallIndustryPadding.top\r\n\r\n    if (industry.depth === NodeDepth.Sector) industryOffset = treemap.settings.sector.header.height\r\n\r\n    if (showIndustryHeader && !treemap.getIsSmall()) {\r\n      industryOffset += 1.5\r\n    }\r\n\r\n    // Outter border\r\n    context.strokeStyle = hover?.border ?? 'transparent'\r\n    context.lineWidth = 3\r\n    context.strokeRect(industry.x - 0.5, industry.y - 0.5 + industryOffset, industry.dx, industry.dy - industryOffset)\r\n\r\n    // Inner borders\r\n    context.translate(0.5, 0.5)\r\n    context.lineWidth = 1\r\n    context.beginPath()\r\n    for (let i = 0; i < industry.children.length; i++) {\r\n      const node = industry.children[i]\r\n      context.moveTo(node.x - 1, node.y - 1)\r\n      context.lineTo(node.x + node.dx - 1, node.y - 1)\r\n      context.lineTo(node.x + node.dx - 1, node.y + node.dy - 1)\r\n      context.lineTo(node.x - 1, node.y + node.dy - 1)\r\n      context.lineTo(node.x - 1, node.y - 1.5)\r\n    }\r\n    context.stroke()\r\n\r\n    // Header and text\r\n    if (!treemap.getIsSmall() && showIndustryHeader) {\r\n      context.translate(-0.5, -0.5)\r\n      treemap.renderIndustryHeader({\r\n        node: industry,\r\n        context,\r\n        config: hover,\r\n        parent: treemap.settings.industry,\r\n        fill: hover?.background ?? treemap.settings.background,\r\n      })\r\n      treemap.renderNodeText({ node: industry, context, config: hover, parent: treemap.settings.industry })\r\n    }\r\n\r\n    context.restore()\r\n  }\r\n\r\n  renderCanvas(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n    context.save()\r\n\r\n    const scale = treemap.zoom.getNearestSize()\r\n\r\n    context.fillStyle = treemap.settings.background\r\n    context.fillRect(0, 0, treemap.width * scale, treemap.height * scale)\r\n\r\n    context.translate.apply(context, treemap.zoom.translate())\r\n    context.scale(scale, scale)\r\n\r\n    /* BACKGROUND */\r\n    if (treemap.type === MapTypeId.World && this.worldBackground) {\r\n      if (treemap.getIsSmall()) context.translate(0, 20)\r\n\r\n      context.drawImage(\r\n        this.worldBackground,\r\n        0,\r\n        0,\r\n        this.worldBackground.naturalWidth,\r\n        this.worldBackground.naturalHeight,\r\n        0,\r\n        20,\r\n        treemap.width,\r\n        treemap.width / (this.worldBackground.naturalWidth / this.worldBackground.naturalHeight)\r\n      )\r\n    }\r\n\r\n    if (treemap.settings.sector.background) {\r\n      context.fillStyle = treemap.settings.sector.background\r\n      for (let index = 0; index < treemap.sectors.length; index++) {\r\n        const node = treemap.sectors[index]\r\n        context.fillRect(node.x, node.y, node.dx, node.dy)\r\n      }\r\n    }\r\n\r\n    if (treemap.settings.industry.background) {\r\n      context.fillStyle = treemap.settings.industry.background\r\n      for (let index = 0; index < treemap.industries.length; index++) {\r\n        const node = treemap.industries[index]\r\n        context.fillRect(node.x, node.y + 3, node.dx - 1, node.dy - 4)\r\n      }\r\n    }\r\n\r\n    /* STOCKS */\r\n    for (let index = 0; index < treemap.nodes.length; index++) {\r\n      const node = treemap.nodes[index]\r\n      if (!node.parent) continue // Skip on root node\r\n      treemap.renderStockNode(treemap.nodes[index], context)\r\n    }\r\n\r\n    /* INDUSTRIES */\r\n    for (let index = 0; index < treemap.industries.length; index++) {\r\n      const node = treemap.industries[index]\r\n      const isLargeNode = LayoutGenerator.isNodeHeaderVisible(node, treemap.settings)\r\n      const isGeoMap = treemap.type === MapTypeId.World\r\n      const renderBackground = treemap.getIsSmall() ? isGeoMap : !isGeoMap\r\n\r\n      if (!isLargeNode || (treemap.getIsSmall() && !isGeoMap)) continue\r\n\r\n      if (Number.isFinite(node.perf) && renderBackground) {\r\n        treemap.renderIndustryHeader({\r\n          node,\r\n          context,\r\n          config: treemap.settings.industry.header,\r\n          parent: treemap.settings.industry,\r\n          fill: treemap.colorScale(node.perf),\r\n        })\r\n      }\r\n\r\n      treemap.renderNodeText({\r\n        node,\r\n        context,\r\n        config: treemap.settings.industry.header,\r\n        parent: treemap.settings.industry,\r\n      })\r\n    }\r\n\r\n    /* SECTORS */\r\n    if (treemap.type !== MapTypeId.World) {\r\n      for (let index = 0; index < treemap.sectors.length; index++) {\r\n        const node = treemap.sectors[index]\r\n\r\n        if (treemap.getIsSmall()) {\r\n          treemap.renderIndustryHeader({\r\n            node,\r\n            context,\r\n            config: treemap.settings.sector.header,\r\n            parent: treemap.settings.sector,\r\n            fill: treemap.settings.sector.header.background ?? treemap.colorScale(node.perf),\r\n          })\r\n        }\r\n\r\n        treemap.renderNodeText({\r\n          node,\r\n          context,\r\n          config: treemap.settings.sector.header,\r\n          parent: treemap.settings.sector,\r\n        })\r\n      }\r\n    }\r\n\r\n    context.restore()\r\n\r\n    if (treemap.settings.sector.border) {\r\n      this.renderSectorBorders(context, treemap)\r\n    }\r\n  }\r\n\r\n  renderSectorBorders(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n    const scale = treemap.zoom.scale()\r\n    context.lineWidth = 2 * scale\r\n    context.strokeStyle = treemap.settings.sector.border ?? 'transparent'\r\n\r\n    context.beginPath()\r\n\r\n    // Outside border\r\n    context.moveTo(0, 0)\r\n    context.lineTo(treemap.width * scale, 0)\r\n    context.lineTo(treemap.width * scale, treemap.height * scale)\r\n    context.lineTo(0, treemap.height * scale)\r\n    context.lineTo(0, -1)\r\n\r\n    for (let index = 0; index < treemap.sectors.length; index++) {\r\n      const sector = treemap.sectors[index]\r\n\r\n      context.strokeRect(sector.x * scale, sector.y * scale, sector.dx * scale, sector.dy * scale)\r\n    }\r\n\r\n    context.stroke()\r\n  }\r\n\r\n  _getPublishCanvas() {\r\n    return this._cache[1].canvas\r\n  }\r\n}\r\n\r\nexport default Canvas\r\n","import classnames from 'classnames'\r\n\r\nimport { scaleStepFormat } from '../constants/settings'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapTypeId } from '../types'\r\n\r\ninterface LegendProps {\r\n  treemap: Treemap\r\n  className?: string\r\n}\r\n\r\nfunction Legend(props: LegendProps) {\r\n  const colorScale = props.treemap.colorScale\r\n\r\n  if (!colorScale) {\r\n    return null\r\n  }\r\n\r\n  var boxover =\r\n    'cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[' +\r\n    props.treemap.scale.name +\r\n    \"] body=[<table width=300><tr><td class='tooltip_tab'>\" +\r\n    props.treemap.scale.tooltip +\r\n    '</td></tr></table>] offsety=[-70] delay=[500]'\r\n\r\n  const [scaleMin, scaleMax] = props.treemap.getScaleMinMax()\r\n  var steps = [scaleMin]\r\n  var diff = scaleMax - scaleMin\r\n  if (diff > 0) {\r\n    var step = diff / 6\r\n    for (var i = 1; i < 7; i++) {\r\n      steps.push(Math.round((scaleMin + step * i) * 10) / 10)\r\n    }\r\n  }\r\n\r\n  if (props.treemap.scale.id === '_rec') {\r\n    steps = [5, 4, 3, 2, 1]\r\n  } else if (props.treemap.scale.id === '_earndate') {\r\n    steps = [-30, -15, -1, 1, 15, 30]\r\n  }\r\n\r\n  // TODO some widths\r\n  var stepWidth = ['_rec', '_earndate'].indexOf(props.treemap.scale.id) !== -1 ? 100 : 50\r\n  var format = scaleStepFormat[props.treemap.scale.id]\r\n  return (\r\n    <div className={classnames('flex justify-between', props.className)}>\r\n      {![MapTypeId.Portfolio, MapTypeId.ETFHoldings, MapTypeId.ManagersAndFunds].includes(props.treemap.type) && (\r\n        <div className=\"info w-full\">\r\n          Use mouse wheel to zoom in and out. Drag zoomed map to pan it.\r\n          <br />\r\n          Double&#x2011;click a ticker to display detailed information in a new window.\r\n          <br />\r\n          {!MapStore.isWidget() &&\r\n            'Hover mouse cursor over a ticker to see its main competitors in a stacked view with a 3-month history graph.'}\r\n        </div>\r\n      )}\r\n      <div className=\"ml-auto mr-0 flex space-x-px whitespace-nowrap\" data-boxover={boxover}>\r\n        {steps.map((step, index) => (\r\n          <div\r\n            key={`${step}-${index}`}\r\n            className=\"flex h-6 items-center justify-center px-2 text-2xs text-white font-normal\"\r\n            style={{\r\n              background: colorScale(step),\r\n              minWidth: stepWidth,\r\n              textShadow: '0 1px 0 rgba(0, 0, 0, 0.25)',\r\n            }}\r\n          >\r\n            {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\r\n          </div>\r\n        ))}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default Legend\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { ISettings } from '../constants/settings'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport Treemap from '../treemap'\r\nimport { MapDataRoot, MapSubtype, MapType } from '../types'\r\nimport * as mapUtils from '../utils'\r\nimport Canvas from './Canvas'\r\n\r\nconst MapContext = React.createContext<{\r\n  treemap?: Treemap\r\n  setTreemap: React.Dispatch<React.SetStateAction<Treemap | undefined>>\r\n  generator?: LayoutGenerator\r\n  setGenerator: React.Dispatch<React.SetStateAction<LayoutGenerator | undefined>>\r\n}>({ setTreemap: () => {}, setGenerator: () => {} })\r\n\r\nexport function useMapContext() {\r\n  return React.useContext(MapContext)\r\n}\r\n\r\nexport function MapContextProvider(props: React.PropsWithChildren) {\r\n  const [treemap, setTreemap] = React.useState<Treemap>()\r\n  const [generator, setGenerator] = React.useState<LayoutGenerator>()\r\n\r\n  return (\r\n    <MapContext.Provider value={{ treemap, setTreemap, generator, setGenerator }}>{props.children}</MapContext.Provider>\r\n  )\r\n}\r\n\r\ninterface MapProps {\r\n  className?: string\r\n  isLoadingData?: boolean\r\n  isFetchingPerf?: boolean\r\n  type: MapType\r\n  subtype: MapSubtype\r\n  data?: MapDataRoot\r\n  settings?: ISettings\r\n  onNodeClick?: React.ComponentProps<typeof Canvas>['onNodeClick']\r\n  zoom?: boolean\r\n  zoomOnWheel?: boolean\r\n  legend?: boolean\r\n  hover?: boolean\r\n  truncateNodeName?: boolean\r\n  dataHash?: string\r\n}\r\n\r\nexport function Map({\r\n  className,\r\n  isLoadingData,\r\n  isFetchingPerf = isLoadingData,\r\n  type,\r\n  subtype,\r\n  data,\r\n  settings,\r\n  onNodeClick,\r\n  zoom,\r\n  zoomOnWheel,\r\n  legend,\r\n  hover,\r\n  truncateNodeName,\r\n  dataHash,\r\n}: MapProps) {\r\n  const { setGenerator, treemap: prevTreemap, setTreemap } = useMapContext()\r\n  const containerRef = React.useRef<HTMLDivElement>(null)\r\n\r\n  /**\r\n   * We can’t `useEffect` for generator/treemap, because we’d have to deal with stale references in\r\n   * other effects. In order to ensure we always get the current values, we need to either `useRef`\r\n   * them (and update props for both state and ref) or `useMemo` and wait for first render to happen.\r\n   */\r\n  const [hasRendered, setHasRendered] = React.useState(false)\r\n\r\n  /**\r\n   * Generator makes the layout, it should only change when the map type or settings change.\r\n   */\r\n  const generator = React.useMemo(() => {\r\n    if (!hasRendered || !containerRef.current) return\r\n\r\n    const isSmall = mapUtils.getIsSmall()\r\n    const size = mapUtils.getSize(containerRef.current, type.type, isSmall)\r\n    const mapSettings = settings ?? mapUtils.getSettingsForMapType(type.type, isSmall)\r\n    const generator = new LayoutGenerator(size.width, size.height, type.type, mapSettings, isSmall)\r\n\r\n    // This is used for updating the map base data using map-generator\r\n    window.MAP_EXPORT = generator\r\n\r\n    return generator\r\n  }, [hasRendered, type.type, settings])\r\n\r\n  /**\r\n   * Treemap object is the logical representation of the map (whereas Canvas is graphical)\r\n   * We want to hold to it for as long as we can and reuse it. That’s why we’re comparing\r\n   * `prevTreemap` and returning the prev value if it equals.\r\n   */\r\n  const treemap = React.useMemo(() => {\r\n    if (!generator || !data || !dataHash || prevTreemap?.type === type.type) return prevTreemap\r\n\r\n    return new Treemap({\r\n      data: generator.getLayout(data),\r\n      width: generator.width,\r\n      height: generator.height,\r\n      settings: generator.settings,\r\n      isSmall: generator.isSmall,\r\n      scale: { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip },\r\n      countIndustryPerf: subtype.countIndustryPerf,\r\n      countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n      type: type.type,\r\n      subtype: subtype.value,\r\n      truncateNodeName,\r\n      mapNodeId: prevTreemap?.mapNodeId,\r\n      dataHash,\r\n      zoomLevels: zoom === false ? [1] : undefined,\r\n    })\r\n    // Can’t add `prevTreemap` because we’d end up in a loop\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [generator, data, type.type, subtype])\r\n\r\n  /**\r\n   * Update context values\r\n   */\r\n  React.useEffect(() => {\r\n    setHasRendered(true)\r\n    setGenerator(generator)\r\n    setTreemap(treemap)\r\n  }, [generator, setGenerator, setTreemap, treemap])\r\n\r\n  /**\r\n   * Handle data updates\r\n   */\r\n  const updateTimeoutRef = React.useRef<number>()\r\n  React.useEffect(() => {\r\n    if (!treemap || !generator || !data || isFetchingPerf) return\r\n\r\n    updateTimeoutRef.current = window.setTimeout(() => {\r\n      if (!dataHash || treemap.dataHash === dataHash) return\r\n\r\n      const layout = generator.getLayout(data)\r\n      mapActionCreators.updateLayout(treemap, {\r\n        width: generator.width,\r\n        height: generator.height,\r\n        data: layout,\r\n        scale: { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip },\r\n        dataHash,\r\n      })\r\n    }, 100)\r\n\r\n    return () => {\r\n      if (updateTimeoutRef.current) window.clearTimeout(updateTimeoutRef.current)\r\n    }\r\n  }, [generator, treemap, data, isFetchingPerf, subtype, dataHash])\r\n\r\n  /**\r\n   * Recalculate layout when the window size changes\r\n   */\r\n  React.useEffect(() => {\r\n    const containerElement = containerRef.current\r\n\r\n    if (!generator || !containerElement || !treemap || !data) return\r\n\r\n    const resize = throttle(() => {\r\n      const size = mapUtils.getSize(containerElement, generator.type, generator.isSmall)\r\n\r\n      if (size.width === treemap.width && size.height === treemap.height) return\r\n\r\n      treemap.zoom.scale(1)\r\n      generator.width = size.width\r\n      generator.height = size.height\r\n      const layout = generator.getLayout(data)\r\n      mapActionCreators.updateLayout(treemap, {\r\n        width: generator.width,\r\n        height: generator.height,\r\n        data: layout,\r\n        scale: treemap.scale,\r\n        dataHash: treemap.dataHash,\r\n      })\r\n    }, 100)\r\n\r\n    window.addEventListener('resize', resize)\r\n\r\n    return () => {\r\n      window.removeEventListener('resize', resize)\r\n    }\r\n  }, [generator, treemap, data])\r\n\r\n  return (\r\n    <div id=\"map\" className={className}>\r\n      <div\r\n        ref={containerRef}\r\n        id=\"body\"\r\n        className={classnames('relative h-full w-full', { 'pointer-events-none': !treemap })}\r\n      >\r\n        {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\r\n          <Delayed delayComponent={<div className=\"h-full w-full\" />}>\r\n            <div className=\"flex h-full items-center justify-center\">\r\n              <Spinner />\r\n            </div>\r\n          </Delayed>\r\n        ) : (\r\n          <Canvas\r\n            alt={document.title}\r\n            treemap={treemap}\r\n            onNodeClick={onNodeClick}\r\n            zoom={zoom}\r\n            zoomOnWheel={zoomOnWheel}\r\n            legend={legend}\r\n            hover={hover}\r\n          />\r\n        )}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","import * as React from 'react'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { Loading } from '../../../main/components/loading'\r\nimport { QueryClientContext } from '../../shared/components/QueryClientContext'\r\nimport { MapContextProvider } from './Map'\r\n\r\nexport function MapContext(props: React.PropsWithChildren<any>) {\r\n  return (\r\n    <MapContextProvider>\r\n      <QueryClientContext>\r\n        <React.Suspense\r\n          fallback={\r\n            <div className=\"flex h-110 items-center justify-center\">\r\n              <Loading />\r\n            </div>\r\n          }\r\n        >\r\n          <BrowserRouter>{props.children}</BrowserRouter>\r\n        </React.Suspense>\r\n      </QueryClientContext>\r\n    </MapContextProvider>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Select, SelectListProps, SelectProps } from '../../../main/components'\r\nimport { ButtonHTMLProps, ButtonProps } from '../../../main/components/button'\r\nimport { Icon } from '../../../main/components/icon'\r\nimport { isSelectItemGroup } from '../../../main/components/select/utils'\r\n\r\nexport enum MapSelectTheme {\r\n  light,\r\n  dark,\r\n}\r\n\r\ninterface MapSelectThemeReturn {\r\n  label: React.HTMLProps<HTMLHeadingElement>\r\n  button: ButtonProps & ButtonHTMLProps\r\n  popover: SelectListProps\r\n}\r\n\r\nconst hasRedesign = FinvizSettings.hasRedesignEnabled\r\n\r\nfunction getMapSelectTheme(theme: MapSelectTheme): MapSelectThemeReturn | undefined {\r\n  switch (theme) {\r\n    case MapSelectTheme.dark:\r\n      return {\r\n        label: {\r\n          className: 'text-gray-400',\r\n        },\r\n        button: {\r\n          theme: 'transparent',\r\n          rounding: 'none',\r\n          className: 'w-full border border-[#585f72] bg-[#4a505f] hover:border-[#707990] hover:bg-[#535a6b]',\r\n          rightContent: <Icon name=\"caretDown\" />,\r\n        },\r\n        popover: {\r\n          rounding: 'none',\r\n          theme: 'none',\r\n          className:\r\n            'border border-[#585f72] bg-[#4a505f] [--bg-primary:74_80_95] [--border-primary:103,111,133] [--scrollbar-radius:0] dark:[--thumb-bg-hover:#262931] dark:[--thumb-bg:#363a46] dark:[--track-bg-hover:transparent] dark:[--track-bg:transparent]',\r\n        },\r\n      }\r\n\r\n    case MapSelectTheme.light:\r\n      return {\r\n        label: { className: 'text-gray-500' },\r\n        button: {\r\n          rounding: 'none',\r\n          className: 'w-full bg-primary',\r\n        },\r\n        popover: {\r\n          rounding: 'none',\r\n          className: classnames('overflow-y-auto max-h-80', {\r\n            '[--scrollbar-radius:0]': !hasRedesign,\r\n          }),\r\n        },\r\n      }\r\n  }\r\n}\r\n\r\ninterface MapSelectProps<ValueType, ItemType, Name> extends Omit<SelectProps<ValueType, ItemType, Name>, 'theme'> {\r\n  /**\r\n   * Theme for the map select\r\n   *\r\n   * @default dark\r\n   */\r\n  theme?: keyof typeof MapSelectTheme\r\n}\r\n\r\nexport function MapSelect<ValueType, ItemType, Name>({\r\n  label,\r\n  'aria-label': ariaLabel,\r\n  theme = 'dark',\r\n  items,\r\n  onChange,\r\n  ...props\r\n}: MapSelectProps<ValueType, ItemType, Name>) {\r\n  const selectTheme = React.useMemo(() => getMapSelectTheme(MapSelectTheme[theme]), [theme])\r\n  const itemOptions = React.useMemo(\r\n    () =>\r\n      items?.map((item) => {\r\n        if (isSelectItemGroup(item)) {\r\n          return {\r\n            ...item,\r\n            hasBorder: false,\r\n            className: 'border-t border-gray-100 dark:border-gray-700',\r\n          }\r\n        }\r\n\r\n        return item\r\n      }),\r\n    [items]\r\n  )\r\n\r\n  return (\r\n    <div>\r\n      {label && (\r\n        <h3 className={classnames(selectTheme?.label.className, 'm-0 mb-1 text-3xs uppercase font-bold')}>{label}</h3>\r\n      )}\r\n      <Select\r\n        {...props}\r\n        {...selectTheme?.button}\r\n        value={props.value}\r\n        rounding={props.rounding ?? selectTheme?.button.rounding}\r\n        size={props.size ?? 'medium'}\r\n        aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\r\n        placeholder=\"Any\"\r\n        name={props.name}\r\n        onChange={onChange}\r\n        defaultValue={undefined}\r\n        items={itemOptions}\r\n        listProps={{\r\n          ...selectTheme?.popover,\r\n          ...props.listProps,\r\n          className: classNames(selectTheme?.popover.className, props.listProps?.className),\r\n        }}\r\n      />\r\n    </div>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../../../main/components/button'\r\nimport { Input, InputHTMLProps, InputProps } from '../../../main/components/input'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport { MapDataNode } from '../types'\r\nimport { useMapContext } from './Map'\r\n\r\nfunction filterItems(stocks: MapDataNode[] = [], input: string) {\r\n  return stocks\r\n    .filter(function (stock) {\r\n      return stock.name.indexOf(input) === 0 || (stock.description || '').toUpperCase().indexOf(input) === 0\r\n    })\r\n    .sort(function (a, b) {\r\n      if (a.name === b.name) {\r\n        return 0\r\n      }\r\n      return a.name < b.name ? -1 : 1\r\n    })\r\n    .slice(0, 10)\r\n}\r\n\r\nexport function useSearch() {\r\n  const { treemap } = useMapContext()\r\n  const [value, setValue] = React.useState('')\r\n  const [results, setResults] = React.useState(filterItems(treemap?.nodes, ''))\r\n\r\n  React.useEffect(() => {\r\n    if (treemap) {\r\n      setResults(filterItems(treemap.nodes, ''))\r\n      setValue('')\r\n    }\r\n  }, [treemap])\r\n\r\n  const onInputChange = React.useCallback(\r\n    (event: React.ChangeEvent<HTMLInputElement>) => {\r\n      const input = event.target.value.toUpperCase()\r\n      setValue(input)\r\n      setResults(filterItems(treemap?.nodes, input))\r\n    },\r\n    [treemap]\r\n  )\r\n\r\n  const onItemClick = React.useCallback(\r\n    (node: MapDataNode) => {\r\n      if (!treemap) return\r\n\r\n      const cx = (node.x + node.x + node.dx) / 2,\r\n        cy = (node.y + node.y + node.dy) / 2,\r\n        diffX = cx - treemap.width / 2,\r\n        diffY = cy - treemap.height / 2\r\n\r\n      MapActionCreators.zoomAndTranslate(treemap, treemap.getLastZoomLevel(), cx + diffX, cy + diffY)\r\n      MapActionCreators.setHoveredNode(treemap.mapNodeId, node)\r\n    },\r\n    [treemap]\r\n  )\r\n\r\n  const onResultMouseLeave = React.useCallback(() => {\r\n    if (!treemap) return\r\n    MapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n  }, [treemap])\r\n\r\n  return {\r\n    value,\r\n    results,\r\n    onInputChange,\r\n    onItemClick,\r\n    onResultMouseLeave,\r\n  }\r\n}\r\n\r\nexport function SearchInput(props: InputProps & Omit<InputHTMLProps, 'ref'>) {\r\n  return (\r\n    <Input\r\n      theme=\"none\"\r\n      rounding=\"none\"\r\n      placeholder=\"Quick search ticker\"\r\n      leftContent=\"search\"\r\n      onChange={props.onChange}\r\n      value={props.value}\r\n      {...props}\r\n    />\r\n  )\r\n}\r\n\r\ninterface SearchResultProps extends ButtonProps, Omit<ButtonHTMLProps, 'onClick' | 'onMouseLeave'> {\r\n  result: MapDataNode\r\n  onClick: (node: MapDataNode) => void\r\n  onMouseLeave: (e: React.MouseEvent) => void\r\n}\r\n\r\nexport function SearchResult({ result, onClick, onMouseLeave, ...props }: Omit<SearchResultProps, 'as' | 'ref'>) {\r\n  return (\r\n    <li onMouseLeave={onMouseLeave}>\r\n      <Button\r\n        {...props}\r\n        theme=\"transparent\"\r\n        size=\"none\"\r\n        className={classnames(props.className, 'h-5 w-full')}\r\n        contentClass={classnames(props.className, 'flex overflow-hidden text-3xs')}\r\n        onClick={() => onClick(result)}\r\n      >\r\n        <span className=\"w-11 shrink-0 font-bold\">{result.name}</span>\r\n        <span className=\"truncate\">{result.description}</span>\r\n      </Button>\r\n    </li>\r\n  )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { isIpad, isMobile } from '../../../shared/isMobile'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from '../../constants/constants'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { MapDataRoot } from '../../types'\r\nimport * as mapUtils from '../../utils'\r\nimport { useMapContext } from '../Map'\r\n\r\ninterface ExpandProps {\r\n  data?: MapDataRoot\r\n  className?: string\r\n}\r\n\r\nexport function Expand(props: ExpandProps) {\r\n  const { treemap, generator } = useMapContext()\r\n\r\n  const onExpand = React.useCallback(() => {\r\n    if (!treemap || !generator || !props.data) return\r\n\r\n    if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n      document.body.classList.remove(EXPANDED_MAP_BODY_CLASSS)\r\n    } else {\r\n      window.gtag?.('event', 'map-expand', { event_category: 'maps' })\r\n      document.body.classList.add(EXPANDED_MAP_BODY_CLASSS)\r\n    }\r\n\r\n    const containerElement = document.getElementById('body')\r\n    const size = mapUtils.getSize(containerElement, treemap.type, treemap.isSmall)\r\n\r\n    if (size.width === treemap.width && size.height === treemap.height) return\r\n\r\n    treemap.zoom.scale(1)\r\n    generator.width = size.width\r\n    generator.height = size.height\r\n    const layout = generator.getLayout(props.data)\r\n    mapActionCreators.updateLayout(treemap, {\r\n      width: generator.width,\r\n      height: generator.height,\r\n      data: layout,\r\n      scale: treemap.scale,\r\n      dataHash: treemap.dataHash,\r\n    })\r\n\r\n    window.scrollTo(0, 0)\r\n  }, [treemap, generator, props.data])\r\n\r\n  if (isMobile() && !isIpad()) return null\r\n\r\n  return (\r\n    <Button className={props.className} theme=\"transparent\" leftContent=\"fullscreen\" onClick={onExpand}>\r\n      Fullscreen\r\n    </Button>\r\n  )\r\n}\r\n","import { useMutation } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { getFormattedDateString } from '../../../header/utils'\r\nimport { Share as ShareDialog } from '../../../shared/components/Share'\r\nimport { drawShareMap } from '../../../shared/drawShareMap'\r\nimport * as api from '../../services/api'\r\nimport mapStore from '../../store/mapStore'\r\nimport { MapSubtype, MapType } from '../../types'\r\nimport { useMapContext } from '../Map'\r\n\r\ninterface ShareMapProps {\r\n  mapType: MapType\r\n  subtype: MapSubtype\r\n  className?: string\r\n}\r\n\r\nexport function Share(props: ShareMapProps) {\r\n  const { treemap } = useMapContext()\r\n  const uploadImage = useMutation(api.uploadMap)\r\n  const [imageData, setImageData] = React.useState<string | null>(null)\r\n\r\n  const onShareClick = React.useCallback(async () => {\r\n    if (!treemap) return\r\n    const canvas = mapStore.getPublishCanvas()\r\n    const data = await drawShareMap(canvas, [props.mapType.name, props.subtype.label, getFormattedDateString()])\r\n\r\n    if (data) {\r\n      setImageData(data)\r\n      uploadImage.mutate({ type: treemap.type, subtype: treemap.subtype, data })\r\n    }\r\n  }, [props.mapType, props.subtype, treemap, uploadImage])\r\n\r\n  return (\r\n    <ShareDialog\r\n      className={props.className}\r\n      onShareClick={onShareClick}\r\n      state={uploadImage}\r\n      disabled={!treemap}\r\n      base64ImageData={imageData}\r\n    />\r\n  )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { SVG } from '../../../../main/components/icon/svg'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { useMapContext } from '../Map'\r\n\r\nexport function useZoomButtons() {\r\n  const { treemap } = useMapContext()\r\n  const zoomOut = React.useCallback(\r\n    (ev: React.MouseEvent) => {\r\n      if (!treemap) return\r\n      ev.preventDefault()\r\n      mapActionCreators.zoom(treemap, -1, treemap.width / 2, treemap.height / 2)\r\n    },\r\n    [treemap]\r\n  )\r\n  const zoomIn = React.useCallback(\r\n    (ev: React.MouseEvent) => {\r\n      if (!treemap) return\r\n      ev.preventDefault()\r\n      mapActionCreators.zoom(treemap, 1, treemap.width / 2, treemap.height / 2)\r\n    },\r\n    [treemap]\r\n  )\r\n\r\n  return { zoomIn, zoomOut }\r\n}\r\n\r\nexport function Zoom() {\r\n  const handlers = useZoomButtons()\r\n\r\n  return (\r\n    <>\r\n      <Button\r\n        theme=\"transparent\"\r\n        rounding=\"none\"\r\n        className=\"group h-10 w-12 border-l border-inherit\"\r\n        onClick={handlers.zoomOut}\r\n      >\r\n        <SVG width=\"24\" height=\"24\" className=\"m-auto opacity-50 group-hover:opacity-100\">\r\n          <rect x=\"4\" y=\"10\" width=\"16\" height=\"4\" />\r\n        </SVG>\r\n      </Button>\r\n      <Button\r\n        theme=\"transparent\"\r\n        rounding=\"none\"\r\n        className=\"group h-10 w-12 border-l border-inherit\"\r\n        onClick={handlers.zoomIn}\r\n      >\r\n        <SVG width=\"24\" height=\"24\" className=\"m-auto opacity-50 group-hover:opacity-100\">\r\n          <rect x=\"4\" y=\"10\" width=\"16\" height=\"4\" />\r\n          <rect x=\"10\" y=\"4\" width=\"4\" height=\"16\" />\r\n        </SVG>\r\n      </Button>\r\n    </>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TopbarProps {\r\n  className?: string\r\n  navContent?: React.ReactNode\r\n  contentClass?: string\r\n  mapControls?: React.ReactNode\r\n}\r\n\r\nexport function Topbar(props: React.PropsWithChildren<TopbarProps>) {\r\n  return (\r\n    <div className={classnames(props.className, 'mb-0.5 flex h-10 items-center')}>\r\n      {props.navContent && (\r\n        <div\r\n          className={classnames(\r\n            props.contentClass,\r\n            'map-view-switch flex w-50 shrink-0 items-center self-stretch px-4'\r\n          )}\r\n        >\r\n          {props.navContent}\r\n        </div>\r\n      )}\r\n      <div className=\"flex min-h-full grow items-center border-l border-inherit pl-5\">{props.children}</div>\r\n      {props.mapControls}\r\n    </div>\r\n  )\r\n}\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { FALLBACK_PERF_RESPONSE } from '../constants/constants'\r\nimport * as api from '../services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\nimport * as mapUtils from '../utils'\r\nimport { getMapBaseData } from '../utils'\r\n\r\nexport type MapDataHookReturn = ReturnType<typeof useMapData>\r\n\r\n/**\r\n * Hook which fetches map data and perf data from the api\r\n */\r\nexport function useMapData(\r\n  type: MapTypeId,\r\n  subtype: MapSubtypeId,\r\n  mapBaseData?: MapDataRoot,\r\n  initialPerf?: PerfData,\r\n  fetchPerfData = api.mapPerf\r\n) {\r\n  const queryClient = useQueryClient()\r\n  const dataVersion = React.useRef<number>()\r\n  const prevType = React.useRef<MapTypeId>()\r\n\r\n  React.useEffect(() => {\r\n    if (mapBaseData) {\r\n      const perfData = mapUtils.parseInitDataAsPerf(mapBaseData)\r\n      queryClient.setQueryData(['mapPerf', type, subtype], perfData)\r\n      prevType.current = type\r\n    } else if (initialPerf) {\r\n      queryClient.setQueryData(['mapPerf', type, subtype], initialPerf)\r\n      prevType.current = type\r\n    }\r\n    // This effect only needs to run on mount, otherwise we’d be overriding the data\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [])\r\n\r\n  const baseDataQuery = useQuery({\r\n    queryKey: ['mapBaseData', type],\r\n    queryFn: async () => getMapBaseData(type) as unknown as Promise<MapDataRoot>,\r\n    initialData: !prevType.current ? mapBaseData : undefined,\r\n    cacheTime: Infinity,\r\n    staleTime: Infinity,\r\n  })\r\n\r\n  const perfDataQuery = useQuery({\r\n    queryKey: ['mapPerf', type, subtype],\r\n    queryFn: async () => {\r\n      const data = await fetchPerfData(type, subtype)\r\n\r\n      return (\r\n        data ??\r\n        queryClient.getQueryData<PerfData>(['mapPerf', type, subtype]) ?? {\r\n          ...FALLBACK_PERF_RESPONSE,\r\n          version: dataVersion.current,\r\n        }\r\n      )\r\n    },\r\n    // Keep previous data if the map type hasn’t changed\r\n    keepPreviousData: prevType.current === type,\r\n    refetchInterval: () => mapUtils.getMapsRefreshInterval(),\r\n    staleTime: 1000,\r\n    onSuccess(data) {\r\n      if (!dataVersion.current && data) {\r\n        dataVersion.current = data.version\r\n      }\r\n\r\n      if (dataVersion.current !== data?.version) {\r\n        window.location.reload()\r\n        return\r\n      }\r\n\r\n      prevType.current = type\r\n    },\r\n  })\r\n\r\n  const data = React.useMemo(() => {\r\n    if (!perfDataQuery.data || !baseDataQuery.data) return undefined\r\n\r\n    const [restoredData] = mapUtils.restoreDataKeys([baseDataQuery.data], perfDataQuery.data)\r\n\r\n    return restoredData\r\n  }, [baseDataQuery, perfDataQuery.data])\r\n\r\n  return {\r\n    data,\r\n    baseDataQuery,\r\n    perfDataQuery,\r\n  }\r\n}\r\n","import { useLocation } from 'react-router-dom'\r\n\r\nimport { MAP_TYPES } from '../constants/constants'\r\nimport { MapSubtypeId } from '../types'\r\n\r\n/**\r\n * Hook which gets the current map type and subtype from the URL\r\n */\r\nexport function useMapType() {\r\n  const query = new URLSearchParams(useLocation().search)\r\n  const typeFromQuery = query.get('t')\r\n  const subtypeFromQuery = query.get('st')\r\n\r\n  const type = MAP_TYPES.find((t) => t.type === typeFromQuery) ?? MAP_TYPES[0]\r\n  const subtypes = type.subtypes.flatMap((type) => type.items)\r\n  const subtype =\r\n    subtypes.find((subtype) => subtype.value === subtypeFromQuery) ??\r\n    subtypes.find((subtype) => subtype.value === MapSubtypeId.DayPerf) ??\r\n    subtypes[0]\r\n\r\n  return { type, subtype }\r\n}\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n  return apiRequest<PerfData>(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n  return apiRequest<PerfData>(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n  imgUrl: string\r\n  shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n  return apiRequest<UploadMapResponse>(`/publish_map_submit.ashx`, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': ContentType.FormUrlEncoded,\r\n    },\r\n    body: new URLSearchParams({\r\n      file: data.replace('data:image/png;base64,', ''),\r\n      type,\r\n      subtype,\r\n    }),\r\n  })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n  _targetScale = scale\r\n  animate()\r\n  function animate() {\r\n    treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n    if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n      requestAnimationFrame(animate)\r\n    }\r\n  }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n  _targetScale = scale\r\n  animate()\r\n  function animate() {\r\n    treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n    if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n      requestAnimationFrame(animate)\r\n    }\r\n  }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n  const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n  const visibleNodes = getVisibleTooltipNodes(hoveredNode)\r\n\r\n  if (!visibleNodes.length) return\r\n\r\n  const tickersToLoad = visibleNodes.map((node) => node!.name)\r\n  if (hoveredNode && !tickersToLoad.includes(hoveredNode?.name)) {\r\n    tickersToLoad.push(hoveredNode.name)\r\n  }\r\n\r\n  void debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise<any> | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n  AppDispatcher.handleViewAction({\r\n    type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n  })\r\n  _lastSparklinesRequest?.cancel?.()\r\n  _lastSparklinesRequest = apiRequest(\r\n    '/api/map_sparklines.ashx',\r\n    { query: { t: tickers.join(','), ty: mapType } },\r\n    true\r\n  )\r\n\r\n  try {\r\n    const data = await _lastSparklinesRequest\r\n    AppDispatcher.handleServerAction({\r\n      type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n      data: data,\r\n    })\r\n  } catch (error) {\r\n    // This just means we canceled the previous request\r\n    if (_lastSparklinesRequest.aborted) return\r\n\r\n    AppDispatcher.handleServerAction({\r\n      type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n      error,\r\n    })\r\n  }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n  setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_HOVERED_NODE,\r\n      node,\r\n      mapNodeId,\r\n    })\r\n  },\r\n\r\n  loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n    if (tickers.length > 0) {\r\n      void debouncedLoadSparklines(tickers, mapType)\r\n    }\r\n  },\r\n\r\n  loadSparklinesCancel() {\r\n    _lastSparklinesRequest?.cancel?.()\r\n  },\r\n\r\n  resetSparklineData() {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.RESET_SPARKLINE_DATA,\r\n    })\r\n  },\r\n\r\n  changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n    treemap.zoom.translate([tx, ty])\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.CHANGE_TRANSLATE,\r\n    })\r\n  },\r\n\r\n  zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n    if (direction > 0) {\r\n      const zoomLevel = treemap.getNextZoomLevel()\r\n      if (zoomLevel !== treemap.zoom.scale()) {\r\n        zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n      }\r\n    } else {\r\n      const zoomLevel = treemap.getPreviousZoomLevel()\r\n      if (zoomLevel !== treemap.zoom.scale()) {\r\n        zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n      }\r\n    }\r\n  },\r\n\r\n  render() {\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n  },\r\n\r\n  zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n    treemap.zoom.scale(1, { x: tx, y: ty })\r\n    treemap.zoom.scale(scale, { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n  },\r\n\r\n  updateLayout(\r\n    treemap: Treemap,\r\n    props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n  ) {\r\n    treemap.updateData(props)\r\n    treemap.zoom.updateDimensions(props)\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n    // Update hovered node if any\r\n    const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n    if (hoveredNode) {\r\n      AppDispatcher.handleViewAction({\r\n        type: ActionTypes.SET_HOVERED_NODE,\r\n        node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n        mapNodeId: treemap.mapNodeId,\r\n      })\r\n      updateVisibleSparklines(treemap)\r\n    }\r\n  },\r\n\r\n  updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n    if (!treemap || !data) return\r\n\r\n    treemap.updatePerf(data)\r\n    AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n    updateVisibleSparklines(treemap)\r\n  },\r\n\r\n  _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_PUBLISH_CANVAS,\r\n      getPublishCanvas,\r\n    })\r\n  },\r\n\r\n  setupWidget() {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_WIDGET,\r\n      isWidget: true,\r\n    })\r\n  },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher<any> {\r\n  handleServerAction(action: any) {\r\n    var payload = {\r\n      source: PayloadSources.SERVER_ACTION,\r\n      action: action,\r\n    }\r\n    //console.log(action, payload);\r\n    this.dispatch(payload)\r\n  }\r\n\r\n  handleViewAction(action: any) {\r\n    var payload = {\r\n      source: PayloadSources.VIEW_ACTION,\r\n      action: action,\r\n    }\r\n    //console.log(action, payload);\r\n    this.dispatch(payload)\r\n  }\r\n}\r\n\r\nconst dispatcher = new AppDispatcher()\r\nexport default dispatcher\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n  RENDER_TREEMAP: null,\r\n  CHANGE_TRANSLATE: null,\r\n  SET_HOVERED_NODE: null,\r\n\r\n  LOAD_SPARKLINES_STARTED: null,\r\n  LOAD_SPARKLINES_COMPLETED: null,\r\n  LOAD_SPARKLINES_FAILED: null,\r\n  RESET_SPARKLINE_DATA: null,\r\n\r\n  INIT_STARTED: null,\r\n  INIT_FAILED: null,\r\n\r\n  UPDATE_DATA: null,\r\n\r\n  SET_PUBLISH_CANVAS: null,\r\n\r\n  SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n  SERVER_ACTION: null,\r\n  VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n  static CHANGE_EVENT = 'change'\r\n\r\n  emitChange() {\r\n    this.emit(Store.CHANGE_EVENT)\r\n  }\r\n\r\n  addChangeListener(callback: (...args: any[]) => void) {\r\n    this.on(Store.CHANGE_EVENT, callback)\r\n  }\r\n\r\n  removeChangeListener(callback: (...args: any[]) => void) {\r\n    this.removeListener(Store.CHANGE_EVENT, callback)\r\n  }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record<string, number[]> = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n  getHoveredNode(mapNodeId: string) {\r\n    if (mapNodeId === _mapNodeId) return _hoveredNode\r\n    return undefined\r\n  }\r\n\r\n  getSparklines() {\r\n    return _sparklinesData\r\n  }\r\n\r\n  getDataVersion() {\r\n    return _dataVersion\r\n  }\r\n\r\n  isWidget() {\r\n    return _isWidget\r\n  }\r\n\r\n  getPublishCanvas() {\r\n    return _getPublishCanvas()\r\n  }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n  var action = payload.action\r\n\r\n  switch (action.type) {\r\n    case ActionTypes.RENDER_TREEMAP:\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_HOVERED_NODE:\r\n      if (action.node !== _hoveredNode) {\r\n        _hoveredNode = action.node\r\n        _mapNodeId = action.mapNodeId\r\n        mapStore.emitChange()\r\n      }\r\n      break\r\n\r\n    case ActionTypes.CHANGE_TRANSLATE:\r\n      // @ts-ignore\r\n      _hoveredNode = undefined\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n      _sparklinesData = { ..._sparklinesData, ...action.data }\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.RESET_SPARKLINE_DATA:\r\n    case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n      _sparklinesData = {}\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.UPDATE_DATA:\r\n      _dataVersion = action.version\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_PUBLISH_CANVAS:\r\n      _getPublishCanvas = action.getPublishCanvas\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_WIDGET:\r\n      _isWidget = action.isWidget\r\n      mapStore.emitChange()\r\n      break\r\n  }\r\n})\r\n\r\nexport default mapStore\r\n","// Based on Lato font with bold weight\r\nexport const fontSizesWidths: Record<number, Record<string | number, number>> = {\r\n  4: {\r\n    0: 2.32,\r\n    1: 2.32,\r\n    2: 2.32,\r\n    3: 2.32,\r\n    4: 2.32,\r\n    5: 2.32,\r\n    6: 2.32,\r\n    7: 2.32,\r\n    8: 2.32,\r\n    9: 2.32,\r\n    ' ': 0.772,\r\n    '+': 2.32,\r\n    '-': 1.436,\r\n    '%': 3.212,\r\n    '.': 0.9,\r\n    a: 2.094,\r\n    b: 2.28,\r\n    c: 1.908,\r\n    d: 2.28,\r\n    e: 2.138,\r\n    f: 1.402,\r\n    g: 2.07,\r\n    h: 2.274,\r\n    i: 1.084,\r\n    j: 1.076,\r\n    k: 2.206,\r\n    l: 1.084,\r\n    m: 3.368,\r\n    n: 2.274,\r\n    o: 2.274,\r\n    p: 2.262,\r\n    q: 2.28,\r\n    r: 1.634,\r\n    s: 1.748,\r\n    t: 1.548,\r\n    u: 2.274,\r\n    v: 2.134,\r\n    w: 3.164,\r\n    x: 2.16,\r\n    y: 2.134,\r\n    z: 1.878,\r\n    A: 2.84,\r\n    B: 2.606,\r\n    C: 2.682,\r\n    D: 2.99,\r\n    E: 2.29,\r\n    F: 2.246,\r\n    G: 2.892,\r\n    H: 3.024,\r\n    I: 1.256,\r\n    J: 1.748,\r\n    K: 2.792,\r\n    L: 2.068,\r\n    M: 3.72,\r\n    N: 3.024,\r\n    O: 3.198,\r\n    P: 2.5,\r\n    Q: 3.198,\r\n    R: 2.62,\r\n    S: 2.146,\r\n    T: 2.38,\r\n    U: 2.912,\r\n    V: 2.84,\r\n    W: 4.186,\r\n    X: 2.716,\r\n    Y: 2.618,\r\n    Z: 2.468,\r\n  },\r\n  6: {\r\n    0: 3.48,\r\n    1: 3.48,\r\n    2: 3.48,\r\n    3: 3.48,\r\n    4: 3.48,\r\n    5: 3.48,\r\n    6: 3.48,\r\n    7: 3.48,\r\n    8: 3.48,\r\n    9: 3.48,\r\n    ' ': 1.158,\r\n    '+': 3.48,\r\n    '-': 2.154,\r\n    '%': 4.818,\r\n    '.': 1.35,\r\n    a: 3.141,\r\n    b: 3.42,\r\n    c: 2.862,\r\n    d: 3.42,\r\n    e: 3.207,\r\n    f: 2.103,\r\n    g: 3.105,\r\n    h: 3.411,\r\n    i: 1.626,\r\n    j: 1.614,\r\n    k: 3.309,\r\n    l: 1.626,\r\n    m: 5.052,\r\n    n: 3.411,\r\n    o: 3.411,\r\n    p: 3.393,\r\n    q: 3.42,\r\n    r: 2.451,\r\n    s: 2.622,\r\n    t: 2.322,\r\n    u: 3.411,\r\n    v: 3.201,\r\n    w: 4.746,\r\n    x: 3.24,\r\n    y: 3.201,\r\n    z: 2.817,\r\n    A: 4.26,\r\n    B: 3.909,\r\n    C: 4.023,\r\n    D: 4.485,\r\n    E: 3.435,\r\n    F: 3.369,\r\n    G: 4.338,\r\n    H: 4.536,\r\n    I: 1.884,\r\n    J: 2.622,\r\n    K: 4.188,\r\n    L: 3.102,\r\n    M: 5.58,\r\n    N: 4.536,\r\n    O: 4.797,\r\n    P: 3.75,\r\n    Q: 4.797,\r\n    R: 3.93,\r\n    S: 3.219,\r\n    T: 3.57,\r\n    U: 4.368,\r\n    V: 4.26,\r\n    W: 6.279,\r\n    X: 4.074,\r\n    Y: 3.927,\r\n    Z: 3.702,\r\n  },\r\n  8: {\r\n    0: 4.64,\r\n    1: 4.64,\r\n    2: 4.64,\r\n    3: 4.64,\r\n    4: 4.64,\r\n    5: 4.64,\r\n    6: 4.64,\r\n    7: 4.64,\r\n    8: 4.64,\r\n    9: 4.64,\r\n    ' ': 1.544,\r\n    '+': 4.64,\r\n    '-': 2.872,\r\n    '%': 6.424,\r\n    '.': 1.8,\r\n    a: 4.188,\r\n    b: 4.56,\r\n    c: 3.816,\r\n    d: 4.56,\r\n    e: 4.276,\r\n    f: 2.804,\r\n    g: 4.14,\r\n    h: 4.548,\r\n    i: 2.168,\r\n    j: 2.152,\r\n    k: 4.412,\r\n    l: 2.168,\r\n    m: 6.736,\r\n    n: 4.548,\r\n    o: 4.548,\r\n    p: 4.524,\r\n    q: 4.56,\r\n    r: 3.268,\r\n    s: 3.496,\r\n    t: 3.096,\r\n    u: 4.548,\r\n    v: 4.268,\r\n    w: 6.328,\r\n    x: 4.32,\r\n    y: 4.268,\r\n    z: 3.756,\r\n    A: 5.68,\r\n    B: 5.212,\r\n    C: 5.364,\r\n    D: 5.98,\r\n    E: 4.58,\r\n    F: 4.492,\r\n    G: 5.784,\r\n    H: 6.048,\r\n    I: 2.512,\r\n    J: 3.496,\r\n    K: 5.584,\r\n    L: 4.136,\r\n    M: 7.44,\r\n    N: 6.048,\r\n    O: 6.396,\r\n    P: 5,\r\n    Q: 6.396,\r\n    R: 5.24,\r\n    S: 4.292,\r\n    T: 4.76,\r\n    U: 5.824,\r\n    V: 5.68,\r\n    W: 8.372,\r\n    X: 5.432,\r\n    Y: 5.236,\r\n    Z: 4.936,\r\n  },\r\n  9: {\r\n    0: 5.22,\r\n    1: 5.22,\r\n    2: 5.22,\r\n    3: 5.22,\r\n    4: 5.22,\r\n    5: 5.22,\r\n    6: 5.22,\r\n    7: 5.22,\r\n    8: 5.22,\r\n    9: 5.22,\r\n    ' ': 1.737,\r\n    '+': 5.22,\r\n    '-': 3.231,\r\n    '%': 7.227,\r\n    '.': 2.025,\r\n    a: 4.712,\r\n    b: 5.13,\r\n    c: 4.293,\r\n    d: 5.13,\r\n    e: 4.811,\r\n    f: 3.155,\r\n    g: 4.658,\r\n    h: 5.117,\r\n    i: 2.439,\r\n    j: 2.421,\r\n    k: 4.964,\r\n    l: 2.439,\r\n    m: 7.578,\r\n    n: 5.117,\r\n    o: 5.117,\r\n    p: 5.09,\r\n    q: 5.13,\r\n    r: 3.677,\r\n    s: 3.933,\r\n    t: 3.483,\r\n    u: 5.117,\r\n    v: 4.802,\r\n    w: 7.119,\r\n    x: 4.86,\r\n    y: 4.802,\r\n    z: 4.226,\r\n    A: 6.39,\r\n    B: 5.864,\r\n    C: 6.035,\r\n    D: 6.728,\r\n    E: 5.153,\r\n    F: 5.054,\r\n    G: 6.507,\r\n    H: 6.804,\r\n    I: 2.826,\r\n    J: 3.933,\r\n    K: 6.282,\r\n    L: 4.653,\r\n    M: 8.37,\r\n    N: 6.804,\r\n    O: 7.196,\r\n    P: 5.625,\r\n    Q: 7.196,\r\n    R: 5.895,\r\n    S: 4.829,\r\n    T: 5.355,\r\n    U: 6.552,\r\n    V: 6.39,\r\n    W: 9.419,\r\n    X: 6.111,\r\n    Y: 5.891,\r\n    Z: 5.553,\r\n  },\r\n  10: {\r\n    0: 5.8,\r\n    1: 5.8,\r\n    2: 5.8,\r\n    3: 5.8,\r\n    4: 5.8,\r\n    5: 5.8,\r\n    6: 5.8,\r\n    7: 5.8,\r\n    8: 5.8,\r\n    9: 5.8,\r\n    ' ': 1.93,\r\n    '+': 5.8,\r\n    '-': 3.59,\r\n    '%': 8.03,\r\n    '.': 2.25,\r\n    a: 5.235,\r\n    b: 5.7,\r\n    c: 4.77,\r\n    d: 5.7,\r\n    e: 5.345,\r\n    f: 3.505,\r\n    g: 5.175,\r\n    h: 5.685,\r\n    i: 2.71,\r\n    j: 2.69,\r\n    k: 5.515,\r\n    l: 2.71,\r\n    m: 8.42,\r\n    n: 5.685,\r\n    o: 5.685,\r\n    p: 5.655,\r\n    q: 5.7,\r\n    r: 4.085,\r\n    s: 4.37,\r\n    t: 3.87,\r\n    u: 5.685,\r\n    v: 5.335,\r\n    w: 7.91,\r\n    x: 5.4,\r\n    y: 5.335,\r\n    z: 4.695,\r\n    A: 7.1,\r\n    B: 6.515,\r\n    C: 6.705,\r\n    D: 7.475,\r\n    E: 5.725,\r\n    F: 5.615,\r\n    G: 7.23,\r\n    H: 7.56,\r\n    I: 3.14,\r\n    J: 4.37,\r\n    K: 6.98,\r\n    L: 5.17,\r\n    M: 9.3,\r\n    N: 7.56,\r\n    O: 7.995,\r\n    P: 6.25,\r\n    Q: 7.995,\r\n    R: 6.55,\r\n    S: 5.365,\r\n    T: 5.95,\r\n    U: 7.28,\r\n    V: 7.1,\r\n    W: 10.465,\r\n    X: 6.79,\r\n    Y: 6.545,\r\n    Z: 6.17,\r\n  },\r\n  11: {\r\n    0: 6.38,\r\n    1: 6.38,\r\n    2: 6.38,\r\n    3: 6.38,\r\n    4: 6.38,\r\n    5: 6.38,\r\n    6: 6.38,\r\n    7: 6.38,\r\n    8: 6.38,\r\n    9: 6.38,\r\n    ' ': 2.123,\r\n    '+': 6.38,\r\n    '-': 3.949,\r\n    '%': 8.833,\r\n    '.': 2.475,\r\n    a: 5.759,\r\n    b: 6.27,\r\n    c: 5.247,\r\n    d: 6.27,\r\n    e: 5.88,\r\n    f: 3.856,\r\n    g: 5.693,\r\n    h: 6.254,\r\n    i: 2.981,\r\n    j: 2.959,\r\n    k: 6.067,\r\n    l: 2.981,\r\n    m: 9.262,\r\n    n: 6.254,\r\n    o: 6.254,\r\n    p: 6.221,\r\n    q: 6.27,\r\n    r: 4.494,\r\n    s: 4.807,\r\n    t: 4.257,\r\n    u: 6.254,\r\n    v: 5.869,\r\n    w: 8.701,\r\n    x: 5.94,\r\n    y: 5.869,\r\n    z: 5.165,\r\n    A: 7.81,\r\n    B: 7.167,\r\n    C: 7.376,\r\n    D: 8.223,\r\n    E: 6.298,\r\n    F: 6.177,\r\n    G: 7.953,\r\n    H: 8.316,\r\n    I: 3.454,\r\n    J: 4.807,\r\n    K: 7.678,\r\n    L: 5.687,\r\n    M: 10.23,\r\n    N: 8.316,\r\n    O: 8.795,\r\n    P: 6.875,\r\n    Q: 8.795,\r\n    R: 7.205,\r\n    S: 5.902,\r\n    T: 6.545,\r\n    U: 8.008,\r\n    V: 7.81,\r\n    W: 11.512,\r\n    X: 7.469,\r\n    Y: 7.2,\r\n    Z: 6.787,\r\n  },\r\n  12: {\r\n    0: 6.96,\r\n    1: 6.96,\r\n    2: 6.96,\r\n    3: 6.96,\r\n    4: 6.96,\r\n    5: 6.96,\r\n    6: 6.96,\r\n    7: 6.96,\r\n    8: 6.96,\r\n    9: 6.96,\r\n    ' ': 2.316,\r\n    '+': 6.96,\r\n    '-': 4.308,\r\n    '%': 9.636,\r\n    '.': 2.7,\r\n    a: 6.282,\r\n    b: 6.84,\r\n    c: 5.724,\r\n    d: 6.84,\r\n    e: 6.414,\r\n    f: 4.206,\r\n    g: 6.21,\r\n    h: 6.822,\r\n    i: 3.252,\r\n    j: 3.228,\r\n    k: 6.618,\r\n    l: 3.252,\r\n    m: 10.104,\r\n    n: 6.822,\r\n    o: 6.822,\r\n    p: 6.786,\r\n    q: 6.84,\r\n    r: 4.902,\r\n    s: 5.244,\r\n    t: 4.644,\r\n    u: 6.822,\r\n    v: 6.402,\r\n    w: 9.492,\r\n    x: 6.48,\r\n    y: 6.402,\r\n    z: 5.634,\r\n    A: 8.52,\r\n    B: 7.818,\r\n    C: 8.046,\r\n    D: 8.97,\r\n    E: 6.87,\r\n    F: 6.738,\r\n    G: 8.676,\r\n    H: 9.072,\r\n    I: 3.768,\r\n    J: 5.244,\r\n    K: 8.376,\r\n    L: 6.204,\r\n    M: 11.16,\r\n    N: 9.072,\r\n    O: 9.594,\r\n    P: 7.5,\r\n    Q: 9.594,\r\n    R: 7.86,\r\n    S: 6.438,\r\n    T: 7.14,\r\n    U: 8.736,\r\n    V: 8.52,\r\n    W: 12.558,\r\n    X: 8.148,\r\n    Y: 7.854,\r\n    Z: 7.404,\r\n  },\r\n  13: {\r\n    0: 7.54,\r\n    1: 7.54,\r\n    2: 7.54,\r\n    3: 7.54,\r\n    4: 7.54,\r\n    5: 7.54,\r\n    6: 7.54,\r\n    7: 7.54,\r\n    8: 7.54,\r\n    9: 7.54,\r\n    ' ': 2.509,\r\n    '+': 7.54,\r\n    '-': 4.667,\r\n    '%': 10.439,\r\n    '.': 2.925,\r\n    a: 6.806,\r\n    b: 7.41,\r\n    c: 6.201,\r\n    d: 7.41,\r\n    e: 6.949,\r\n    f: 4.557,\r\n    g: 6.728,\r\n    h: 7.391,\r\n    i: 3.523,\r\n    j: 3.497,\r\n    k: 7.17,\r\n    l: 3.523,\r\n    m: 10.946,\r\n    n: 7.391,\r\n    o: 7.391,\r\n    p: 7.352,\r\n    q: 7.41,\r\n    r: 5.311,\r\n    s: 5.681,\r\n    t: 5.031,\r\n    u: 7.391,\r\n    v: 6.936,\r\n    w: 10.283,\r\n    x: 7.02,\r\n    y: 6.936,\r\n    z: 6.104,\r\n    A: 9.23,\r\n    B: 8.47,\r\n    C: 8.717,\r\n    D: 9.718,\r\n    E: 7.443,\r\n    F: 7.3,\r\n    G: 9.399,\r\n    H: 9.828,\r\n    I: 4.082,\r\n    J: 5.681,\r\n    K: 9.074,\r\n    L: 6.721,\r\n    M: 12.09,\r\n    N: 9.828,\r\n    O: 10.394,\r\n    P: 8.125,\r\n    Q: 10.394,\r\n    R: 8.515,\r\n    S: 6.975,\r\n    T: 7.735,\r\n    U: 9.464,\r\n    V: 9.23,\r\n    W: 13.605,\r\n    X: 8.827,\r\n    Y: 8.509,\r\n    Z: 8.021,\r\n  },\r\n  14: {\r\n    0: 8.12,\r\n    1: 8.12,\r\n    2: 8.12,\r\n    3: 8.12,\r\n    4: 8.12,\r\n    5: 8.12,\r\n    6: 8.12,\r\n    7: 8.12,\r\n    8: 8.12,\r\n    9: 8.12,\r\n    ' ': 2.702,\r\n    '+': 8.12,\r\n    '-': 5.026,\r\n    '%': 11.242,\r\n    '.': 3.15,\r\n    a: 7.329,\r\n    b: 7.98,\r\n    c: 6.678,\r\n    d: 7.98,\r\n    e: 7.483,\r\n    f: 4.907,\r\n    g: 7.245,\r\n    h: 7.959,\r\n    i: 3.794,\r\n    j: 3.766,\r\n    k: 7.721,\r\n    l: 3.794,\r\n    m: 11.788,\r\n    n: 7.959,\r\n    o: 7.959,\r\n    p: 7.917,\r\n    q: 7.98,\r\n    r: 5.719,\r\n    s: 6.118,\r\n    t: 5.418,\r\n    u: 7.959,\r\n    v: 7.469,\r\n    w: 11.074,\r\n    x: 7.56,\r\n    y: 7.469,\r\n    z: 6.573,\r\n    A: 9.94,\r\n    B: 9.121,\r\n    C: 9.387,\r\n    D: 10.465,\r\n    E: 8.015,\r\n    F: 7.861,\r\n    G: 10.122,\r\n    H: 10.584,\r\n    I: 4.396,\r\n    J: 6.118,\r\n    K: 9.772,\r\n    L: 7.238,\r\n    M: 13.02,\r\n    N: 10.584,\r\n    O: 11.193,\r\n    P: 8.75,\r\n    Q: 11.193,\r\n    R: 9.17,\r\n    S: 7.511,\r\n    T: 8.33,\r\n    U: 10.192,\r\n    V: 9.94,\r\n    W: 14.651,\r\n    X: 9.506,\r\n    Y: 9.163,\r\n    Z: 8.638,\r\n  },\r\n  18: {\r\n    0: 10.44,\r\n    1: 10.44,\r\n    2: 10.44,\r\n    3: 10.44,\r\n    4: 10.44,\r\n    5: 10.44,\r\n    6: 10.44,\r\n    7: 10.44,\r\n    8: 10.44,\r\n    9: 10.44,\r\n    ' ': 3.474,\r\n    '+': 10.44,\r\n    '-': 6.462,\r\n    '%': 14.454,\r\n    '.': 4.05,\r\n    a: 9.423,\r\n    b: 10.26,\r\n    c: 8.586,\r\n    d: 10.26,\r\n    e: 9.621,\r\n    f: 6.309,\r\n    g: 9.315,\r\n    h: 10.233,\r\n    i: 4.878,\r\n    j: 4.842,\r\n    k: 9.927,\r\n    l: 4.878,\r\n    m: 15.156,\r\n    n: 10.233,\r\n    o: 10.233,\r\n    p: 10.179,\r\n    q: 10.26,\r\n    r: 7.353,\r\n    s: 7.866,\r\n    t: 6.966,\r\n    u: 10.233,\r\n    v: 9.603,\r\n    w: 14.238,\r\n    x: 9.72,\r\n    y: 9.603,\r\n    z: 8.451,\r\n    A: 12.78,\r\n    B: 11.727,\r\n    C: 12.069,\r\n    D: 13.455,\r\n    E: 10.305,\r\n    F: 10.107,\r\n    G: 13.014,\r\n    H: 13.608,\r\n    I: 5.652,\r\n    J: 7.866,\r\n    K: 12.564,\r\n    L: 9.306,\r\n    M: 16.74,\r\n    N: 13.608,\r\n    O: 14.391,\r\n    P: 11.25,\r\n    Q: 14.391,\r\n    R: 11.79,\r\n    S: 9.657,\r\n    T: 10.71,\r\n    U: 13.104,\r\n    V: 12.78,\r\n    W: 18.837,\r\n    X: 12.222,\r\n    Y: 11.781,\r\n    Z: 11.106,\r\n  },\r\n  20: {\r\n    0: 11.6,\r\n    1: 11.6,\r\n    2: 11.6,\r\n    3: 11.6,\r\n    4: 11.6,\r\n    5: 11.6,\r\n    6: 11.6,\r\n    7: 11.6,\r\n    8: 11.6,\r\n    9: 11.6,\r\n    ' ': 3.86,\r\n    '+': 11.6,\r\n    '-': 7.18,\r\n    '%': 16.06,\r\n    '.': 4.5,\r\n    a: 10.47,\r\n    b: 11.4,\r\n    c: 9.54,\r\n    d: 11.4,\r\n    e: 10.69,\r\n    f: 7.01,\r\n    g: 10.35,\r\n    h: 11.37,\r\n    i: 5.42,\r\n    j: 5.38,\r\n    k: 11.03,\r\n    l: 5.42,\r\n    m: 16.84,\r\n    n: 11.37,\r\n    o: 11.37,\r\n    p: 11.31,\r\n    q: 11.4,\r\n    r: 8.17,\r\n    s: 8.74,\r\n    t: 7.74,\r\n    u: 11.37,\r\n    v: 10.67,\r\n    w: 15.82,\r\n    x: 10.8,\r\n    y: 10.67,\r\n    z: 9.39,\r\n    A: 14.2,\r\n    B: 13.03,\r\n    C: 13.41,\r\n    D: 14.95,\r\n    E: 11.45,\r\n    F: 11.23,\r\n    G: 14.46,\r\n    H: 15.12,\r\n    I: 6.28,\r\n    J: 8.74,\r\n    K: 13.96,\r\n    L: 10.34,\r\n    M: 18.6,\r\n    N: 15.12,\r\n    O: 15.99,\r\n    P: 12.5,\r\n    Q: 15.99,\r\n    R: 13.1,\r\n    S: 10.73,\r\n    T: 11.9,\r\n    U: 14.56,\r\n    V: 14.2,\r\n    W: 20.93,\r\n    X: 13.58,\r\n    Y: 13.09,\r\n    Z: 12.34,\r\n  },\r\n  24: {\r\n    0: 13.92,\r\n    1: 13.92,\r\n    2: 13.92,\r\n    3: 13.92,\r\n    4: 13.92,\r\n    5: 13.92,\r\n    6: 13.92,\r\n    7: 13.92,\r\n    8: 13.92,\r\n    9: 13.92,\r\n    ' ': 4.632,\r\n    '+': 13.92,\r\n    '-': 8.616,\r\n    '%': 19.272,\r\n    '.': 5.4,\r\n    a: 12.564,\r\n    b: 13.68,\r\n    c: 11.448,\r\n    d: 13.68,\r\n    e: 12.828,\r\n    f: 8.412,\r\n    g: 12.42,\r\n    h: 13.644,\r\n    i: 6.504,\r\n    j: 6.456,\r\n    k: 13.236,\r\n    l: 6.504,\r\n    m: 20.208,\r\n    n: 13.644,\r\n    o: 13.644,\r\n    p: 13.572,\r\n    q: 13.68,\r\n    r: 9.804,\r\n    s: 10.488,\r\n    t: 9.288,\r\n    u: 13.644,\r\n    v: 12.804,\r\n    w: 18.984,\r\n    x: 12.96,\r\n    y: 12.804,\r\n    z: 11.268,\r\n    A: 17.04,\r\n    B: 15.636,\r\n    C: 16.092,\r\n    D: 17.94,\r\n    E: 13.74,\r\n    F: 13.476,\r\n    G: 17.352,\r\n    H: 18.144,\r\n    I: 7.536,\r\n    J: 10.488,\r\n    K: 16.752,\r\n    L: 12.408,\r\n    M: 22.32,\r\n    N: 18.144,\r\n    O: 19.188,\r\n    P: 15,\r\n    Q: 19.188,\r\n    R: 15.72,\r\n    S: 12.876,\r\n    T: 14.28,\r\n    U: 17.472,\r\n    V: 17.04,\r\n    W: 25.116,\r\n    X: 16.296,\r\n    Y: 15.708,\r\n    Z: 14.808,\r\n  },\r\n  30: {\r\n    0: 17.4,\r\n    1: 17.4,\r\n    2: 17.4,\r\n    3: 17.4,\r\n    4: 17.4,\r\n    5: 17.4,\r\n    6: 17.4,\r\n    7: 17.4,\r\n    8: 17.4,\r\n    9: 17.4,\r\n    ' ': 5.79,\r\n    '+': 17.4,\r\n    '-': 10.77,\r\n    '%': 24.09,\r\n    '.': 6.75,\r\n    a: 15.705,\r\n    b: 17.1,\r\n    c: 14.31,\r\n    d: 17.1,\r\n    e: 16.035,\r\n    f: 10.515,\r\n    g: 15.525,\r\n    h: 17.055,\r\n    i: 8.13,\r\n    j: 8.07,\r\n    k: 16.545,\r\n    l: 8.13,\r\n    m: 25.26,\r\n    n: 17.055,\r\n    o: 17.055,\r\n    p: 16.965,\r\n    q: 17.1,\r\n    r: 12.255,\r\n    s: 13.11,\r\n    t: 11.61,\r\n    u: 17.055,\r\n    v: 16.005,\r\n    w: 23.73,\r\n    x: 16.2,\r\n    y: 16.005,\r\n    z: 14.085,\r\n    A: 21.3,\r\n    B: 19.545,\r\n    C: 20.115,\r\n    D: 22.425,\r\n    E: 17.175,\r\n    F: 16.845,\r\n    G: 21.69,\r\n    H: 22.68,\r\n    I: 9.42,\r\n    J: 13.11,\r\n    K: 20.94,\r\n    L: 15.51,\r\n    M: 27.9,\r\n    N: 22.68,\r\n    O: 23.985,\r\n    P: 18.75,\r\n    Q: 23.985,\r\n    R: 19.65,\r\n    S: 16.095,\r\n    T: 17.85,\r\n    U: 21.84,\r\n    V: 21.3,\r\n    W: 31.395,\r\n    X: 20.37,\r\n    Y: 19.635,\r\n    Z: 18.51,\r\n  },\r\n  36: {\r\n    0: 20.88,\r\n    1: 20.88,\r\n    2: 20.88,\r\n    3: 20.88,\r\n    4: 20.88,\r\n    5: 20.88,\r\n    6: 20.88,\r\n    7: 20.88,\r\n    8: 20.88,\r\n    9: 20.88,\r\n    ' ': 6.948,\r\n    '+': 20.88,\r\n    '-': 12.924,\r\n    '%': 28.908,\r\n    '.': 8.1,\r\n    a: 18.846,\r\n    b: 20.52,\r\n    c: 17.172,\r\n    d: 20.52,\r\n    e: 19.242,\r\n    f: 12.618,\r\n    g: 18.63,\r\n    h: 20.466,\r\n    i: 9.756,\r\n    j: 9.684,\r\n    k: 19.854,\r\n    l: 9.756,\r\n    m: 30.312,\r\n    n: 20.466,\r\n    o: 20.466,\r\n    p: 20.358,\r\n    q: 20.52,\r\n    r: 14.706,\r\n    s: 15.732,\r\n    t: 13.932,\r\n    u: 20.466,\r\n    v: 19.206,\r\n    w: 28.476,\r\n    x: 19.44,\r\n    y: 19.206,\r\n    z: 16.902,\r\n    A: 25.56,\r\n    B: 23.454,\r\n    C: 24.138,\r\n    D: 26.91,\r\n    E: 20.61,\r\n    F: 20.214,\r\n    G: 26.028,\r\n    H: 27.216,\r\n    I: 11.304,\r\n    J: 15.732,\r\n    K: 25.128,\r\n    L: 18.612,\r\n    M: 33.48,\r\n    N: 27.216,\r\n    O: 28.782,\r\n    P: 22.5,\r\n    Q: 28.782,\r\n    R: 23.58,\r\n    S: 19.314,\r\n    T: 21.42,\r\n    U: 26.208,\r\n    V: 25.56,\r\n    W: 37.674,\r\n    X: 24.444,\r\n    Y: 23.562,\r\n    Z: 22.212,\r\n  },\r\n}\r\n\r\nexport const fontSizeLineHeights: Record<number, number> = {\r\n  4: 5,\r\n  6: 7,\r\n  8: 10,\r\n  9: 11,\r\n  10: 12,\r\n  11: 13,\r\n  12: 14,\r\n  13: 15,\r\n  14: 20,\r\n  18: 21,\r\n  20: 24,\r\n  24: 28,\r\n  30: 35,\r\n  36: 42,\r\n}\r\n","import * as d3 from 'd3'\r\n\r\ninterface Dimensions {\r\n  width: number\r\n  height: number\r\n}\r\n\r\nexport class Zoom<Datum> {\r\n  zoomElement = document.createElement('canvas')\r\n  zoomSelection = d3.select<HTMLCanvasElement, Datum>(this.zoomElement)\r\n  behavior: d3.ZoomBehavior<HTMLCanvasElement, Datum>\r\n\r\n  translateExtent: [width: number, height: number]\r\n  zoomLevels: number[]\r\n\r\n  constructor(dimensions: Dimensions, zoomLevels: number[]) {\r\n    this.translateExtent = [dimensions.width, dimensions.height]\r\n    this.zoomLevels = zoomLevels\r\n\r\n    this.behavior = d3\r\n      .zoom<HTMLCanvasElement, Datum>()\r\n      .extent([[0, 0], this.translateExtent])\r\n      .scaleExtent([this.zoomLevels[0], this.zoomLevels[this.zoomLevels.length - 1]])\r\n      .translateExtent([[0, 0], this.translateExtent])\r\n      .on('zoom', null)\r\n\r\n    this.zoomSelection.call(this.behavior)\r\n  }\r\n\r\n  updateDimensions = (dimensions: Dimensions) => {\r\n    this.translateExtent = [dimensions.width, dimensions.height]\r\n    this.behavior.extent([[0, 0], this.translateExtent]).translateExtent([[0, 0], this.translateExtent])\r\n  }\r\n\r\n  getTransform = () => d3.zoomTransform(this.zoomElement)\r\n\r\n  scale = (newZoom?: number, mapCenter?: { x: number; y: number }) => {\r\n    if (typeof newZoom === 'number' && Number.isFinite(newZoom)) {\r\n      if (mapCenter) {\r\n        this.zoomSelection.call(this.behavior.scaleTo, newZoom, [mapCenter.x, mapCenter.y])\r\n      } else {\r\n        this.zoomSelection.call(this.behavior.scaleTo, newZoom)\r\n      }\r\n      return newZoom\r\n    }\r\n\r\n    return this.getTransform().k\r\n  }\r\n\r\n  translate = (args?: [x: number, y: number]): [x: number, y: number] => {\r\n    const scale = this.scale()\r\n\r\n    if (Array.isArray(args) && Number.isFinite(args[0]) && Number.isFinite(args[1])) {\r\n      this.zoomSelection.call(this.behavior.translateBy, -(args[0] / scale), -(args[1] / scale))\r\n      return [args[0], args[1]]\r\n    }\r\n    let t = this.getTransform()\r\n    return [t.x, t.y]\r\n  }\r\n\r\n  translateAbs = ([x, y]: [x: number, y: number]) => {\r\n    const scale = this.scale()\r\n    this.zoomSelection.call(this.behavior.translateTo, -(x / scale), -(y / scale), [0, 0])\r\n  }\r\n\r\n  getNearestSize(currentZoom: number = this.scale()) {\r\n    let nearestSize = this.zoomLevels[0]\r\n    for (var i = 0, len = this.zoomLevels.length; i < len; i++) {\r\n      const level = this.zoomLevels[i]\r\n      if (level >= currentZoom) {\r\n        nearestSize = level\r\n        break\r\n      }\r\n    }\r\n\r\n    return nearestSize\r\n  }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { PortfolioSymbolType } from '../../main/modules/portfolio/types'\r\nimport { getSymbolType } from '../../main/modules/portfolio/utils'\r\nimport { getUuid } from '../../main/util'\r\nimport { getTextFontFamily } from '../shared/getTextFontFamily'\r\nimport { gradientSmall, gradients } from '../shared/gradients'\r\nimport { fontSizeLineHeights, fontSizesWidths } from './constants/font'\r\nimport { ISettingsSection, scaleMinMax, scaleStepFormat } from './constants/settings'\r\nimport { ISettings, ISettingsSectionFont, ISettingsSectionHeader } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport {\r\n  MapData,\r\n  MapDataIndustry,\r\n  MapDataNode,\r\n  MapDataRow,\r\n  MapDataSector,\r\n  MapSubtypeId,\r\n  MapTypeId,\r\n  PerfData,\r\n  Scale,\r\n  ScaleId,\r\n} from './types'\r\nimport * as mapUtils from './utils'\r\nimport { Zoom } from './zoom'\r\n\r\nconst fontFamily = getTextFontFamily()\r\n\r\nclass Treemap {\r\n  width: number\r\n  height: number\r\n  version?: number\r\n  scale: Scale\r\n  countIndustryPerf: boolean\r\n  countSectorPerf?: boolean\r\n  nodes: MapDataNode[] = []\r\n  sectors: MapDataSector[] = []\r\n  industries: MapDataIndustry[] = []\r\n  zoom: Zoom<MapDataNode>\r\n  colorScale: (n?: number) => string\r\n  settings: ISettings\r\n  type: MapTypeId\r\n  subtype: MapSubtypeId\r\n  isSmall: boolean\r\n  zoomLevels: number[]\r\n  dataHash: string\r\n  mapNodeId: string\r\n  truncateNodeName: boolean\r\n\r\n  constructor({\r\n    countIndustryPerf = false,\r\n    countSectorPerf = false,\r\n    subtype = MapSubtypeId.DayPerf,\r\n    isSmall = false,\r\n    zoomLevels = mapUtils.getDefaultZoomLevels(),\r\n    truncateNodeName = false,\r\n    ...props\r\n  }: {\r\n    data: MapData\r\n    width: number\r\n    height: number\r\n    version?: number\r\n    scale: Scale\r\n    countIndustryPerf?: boolean\r\n    countSectorPerf?: boolean\r\n    settings: ISettings\r\n    type: MapTypeId\r\n    subtype?: MapSubtypeId\r\n    isSmall?: boolean\r\n    zoomLevels?: number[]\r\n    truncateNodeName?: boolean\r\n    mapNodeId?: string\r\n    dataHash: string\r\n  }) {\r\n    this.width = props.width\r\n    this.height = props.height\r\n    this.version = props.version\r\n    this.settings = props.settings\r\n    this.type = props.type\r\n    this.scale = props.scale\r\n    this.nodes = props.data.nodes\r\n    this.sectors = props.data.sectors\r\n    this.industries = props.data.industries\r\n    this.subtype = subtype\r\n    this.zoomLevels = zoomLevels\r\n    this.isSmall = isSmall\r\n    this.countIndustryPerf = countIndustryPerf\r\n    this.countSectorPerf = countSectorPerf\r\n    this.truncateNodeName = truncateNodeName\r\n    this.mapNodeId = props.mapNodeId ?? getUuid()\r\n    this.dataHash = props.dataHash\r\n\r\n    this.zoom = new Zoom<MapDataNode>({ width: this.width, height: this.height }, this.zoomLevels)\r\n\r\n    this.colorScale = this.getColorScale()\r\n\r\n    if (this.countIndustryPerf) {\r\n      this._updateIndustryPerf()\r\n    }\r\n    if (this.countSectorPerf) {\r\n      this._updateSectorPerf()\r\n    }\r\n  }\r\n\r\n  getIsSmall() {\r\n    return this.isSmall\r\n  }\r\n\r\n  updateData(props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }) {\r\n    this.width = props.width\r\n    this.height = props.height\r\n    this.nodes = props.data.nodes\r\n    this.sectors = props.data.sectors\r\n    this.industries = props.data.industries\r\n    this.scale = props.scale\r\n    this.dataHash = props.dataHash\r\n\r\n    if (this.countIndustryPerf) {\r\n      this._updateIndustryPerf()\r\n    }\r\n    if (this.countSectorPerf) {\r\n      this._updateSectorPerf()\r\n    }\r\n\r\n    this.colorScale = this.getColorScale()\r\n  }\r\n\r\n  getScaleMinMax() {\r\n    switch (this.scale.id) {\r\n      case ScaleId.PortfolioPct:\r\n      case ScaleId.PortfolioUsd:\r\n        if (this.nodes.length === 0) return [0, 0]\r\n        // get min/max week perf\r\n        const minValuePerf = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n        const maxValuePerf = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n        const perfMax = Math.max(minValuePerf, maxValuePerf)\r\n        // get min/max all time perf\r\n        const minValueNode = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.perf)!)\r\n        const maxValueNode = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.perf)!)\r\n        const valueMax = Math.max(minValueNode, maxValueNode)\r\n        // Use the weekly perf as a buffer, compute number of digits and round nicely\r\n        const valueToUse = this.scale.id === ScaleId.PortfolioPct ? valueMax + perfMax : valueMax * (1 + perfMax / 100)\r\n        // Sanity check\r\n        if (Number.isNaN(valueToUse)) return [0, 0]\r\n        const numberOfDigits = Math.max(Math.floor(Math.log10(Math.abs(valueToUse))), 0) + 1\r\n        const roundedBound = Math.ceil(valueToUse / numberOfDigits) * numberOfDigits\r\n\r\n        return [-roundedBound, roundedBound]\r\n      default:\r\n        return scaleMinMax[this.scale.id]\r\n    }\r\n  }\r\n\r\n  getColorScale() {\r\n    const [minDomain, maxDomain] = this.getScaleMinMax()\r\n    let gradient = gradients[this.scale.id]\r\n    if (this.getIsSmall() && this.scale.id === ScaleId.DayPerf) {\r\n      gradient = gradientSmall\r\n    }\r\n    const linearScale = d3\r\n      .scaleLinear()\r\n      .domain([minDomain, maxDomain])\r\n      .range([0, gradient.colors.length - 1])\r\n    return (d?: number) => {\r\n      if (typeof d === 'undefined' || !Number.isFinite(d)) {\r\n        return gradient.nullColor\r\n      }\r\n      const min = Math.min(minDomain, maxDomain)\r\n      const max = Math.max(minDomain, maxDomain)\r\n      const value = Math.max(Math.min(d, max), min)\r\n\r\n      const i = Math.round(linearScale(value))\r\n\r\n      return gradient.colors[i]\r\n    }\r\n  }\r\n\r\n  getParentSector(node: MapDataNode | MapDataIndustry): string {\r\n    if (node.parent && !!node.parent.parent) return this.getParentSector(node.parent as MapDataIndustry)\r\n\r\n    return node.name\r\n  }\r\n\r\n  /*\r\n   * data = {\r\n   *   nodes: {\"AAPL\":  1.5, \"MSFT\": -0.5}\r\n   *   industries: {...}\r\n   * }\r\n   */\r\n  updatePerf(data: PerfData) {\r\n    this.dataHash = data.hash\r\n\r\n    for (var i = 0; i < this.nodes.length; i++) {\r\n      const nodeName = this.nodes[i].name\r\n\r\n      if (Array.isArray(data.nodes)) {\r\n        const parentSector = this.getParentSector(this.nodes[i])\r\n        const updatedNode = data.nodes.find((node) => node.name === nodeName && node.data?.sector === parentSector)\r\n\r\n        if (!updatedNode) continue\r\n\r\n        this.nodes[i].perf = updatedNode.perf\r\n        this.nodes[i].additional = updatedNode.additional\r\n      } else {\r\n        this.nodes[i].perf = data.nodes[nodeName]\r\n        this.nodes[i].additional = data.additional[nodeName]\r\n      }\r\n    }\r\n\r\n    if (this.countIndustryPerf) {\r\n      this._updateIndustryPerf()\r\n    } else {\r\n      this._resetIndustryPerf()\r\n    }\r\n\r\n    if (this.countSectorPerf) {\r\n      this._updateSectorPerf()\r\n    }\r\n\r\n    this.colorScale = this.getColorScale()\r\n  }\r\n\r\n  _resetIndustryPerf() {\r\n    for (var i = 0; i < this.industries.length; i++) {\r\n      this.industries[i].perf = undefined\r\n    }\r\n  }\r\n\r\n  _updateIndustryPerf() {\r\n    var industry, weightedPriceSum, marketCapSum, stock, marketCap, everyStockUndefined\r\n    for (var i = 0; i < this.industries.length; i++) {\r\n      industry = this.industries[i]\r\n      weightedPriceSum = 0\r\n      marketCapSum = 0\r\n      everyStockUndefined = true\r\n      for (var j = 0; j < industry.children.length; j++) {\r\n        stock = industry.children[j]\r\n        marketCap = stock.dx * stock.dy\r\n        if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n          weightedPriceSum += stock.perf * marketCap\r\n          everyStockUndefined = false\r\n        }\r\n        marketCapSum += marketCap\r\n      }\r\n      if (!everyStockUndefined) {\r\n        industry.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n      }\r\n    }\r\n  }\r\n\r\n  _updateSectorPerf() {\r\n    var sector, industry, weightedPriceSum, marketCapSum, stock, marketCap\r\n    for (var s = 0; s < this.sectors.length; s++) {\r\n      sector = this.sectors[s]\r\n      weightedPriceSum = 0\r\n      marketCapSum = 0\r\n      for (var i = 0; i < sector.children.length; i++) {\r\n        industry = sector.children[i]\r\n        for (var j = 0; j < industry.children.length; j++) {\r\n          stock = industry.children[j]\r\n          marketCap = stock.dx * stock.dy\r\n          if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n            weightedPriceSum += stock.perf * marketCap\r\n          }\r\n          marketCapSum += marketCap\r\n        }\r\n      }\r\n      sector.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n    }\r\n  }\r\n\r\n  _getNodeTopOffset(node: MapDataNode) {\r\n    if (!this.isSmall && this.type === MapTypeId.World) return 0\r\n\r\n    const isSmallSecMap = this.isSmall && this.type === MapTypeId.Sector\r\n    // Industry\r\n    let parent: MapDataRow = node.parent\r\n    let leftPadding = this.settings.industry.padding.left\r\n    let topPadding = this.settings.industry.padding.top + this.settings.industry.header.height\r\n\r\n    if (isSmallSecMap) {\r\n      // Sector\r\n      parent = node.parent.parent\r\n      leftPadding = this.settings.sector.padding.left\r\n      topPadding = this.settings.sector.padding.top + this.settings.sector.header.height\r\n    }\r\n\r\n    const isFirstNodeInIndustry =\r\n      Math.floor(parent.x + leftPadding) === node.x && Math.floor(parent.y + topPadding) === node.y\r\n    const showIndustryHeader = LayoutGenerator.isNodeHeaderVisible(parent, this.settings)\r\n\r\n    return isFirstNodeInIndustry && showIndustryHeader ? 6 : 0\r\n  }\r\n\r\n  getNodeText(node: MapDataNode) {\r\n    let name = node.name\r\n    const scale = this.zoom.getNearestSize()\r\n    const fontSizes = this.settings.scaleFontSizes[scale]\r\n    const nodeTopOffset = this._getNodeTopOffset(node)\r\n    const nodeHeight = node.dy - nodeTopOffset\r\n\r\n    let nodeNameFontSize = this.findMaxFontSizeForText(node.name, node.dx, nodeHeight, fontSizes)\r\n    if (!nodeNameFontSize && this.truncateNodeName) {\r\n      nodeNameFontSize = fontSizes[fontSizes.length - 1]\r\n      name = this.getLongestText(\r\n        name,\r\n        nodeNameFontSize,\r\n        Math.max(0, node.dx - this.settings.fontSizePadding[nodeNameFontSize] * 2)\r\n      )\r\n    } else if (!nodeNameFontSize) return null\r\n\r\n    const nodeNameLineHeight = fontSizeLineHeights[nodeNameFontSize]\r\n    const stepFormat = scaleStepFormat[this.scale.id]\r\n    const format = stepFormat === '%N%' ? (node.dx > 32 ? stepFormat : '%N') : stepFormat\r\n\r\n    let perfText = getSymbolType(node.name) === PortfolioSymbolType.Cash ? '' : (node.additional ?? '')\r\n    if (perfText.length === 0 && node.perf !== undefined && Number.isFinite(node.perf)) {\r\n      perfText = this.formatValue(node.perf.toFixed(2), scaleMinMax[this.scale.id], format)\r\n    }\r\n\r\n    const fontPairs =\r\n      this.settings.fontSizePairs[nodeNameFontSize]?.filter((allowedSize) => fontSizes.includes(allowedSize)) ?? []\r\n\r\n    let perfFontSize\r\n    let perfLineHeight = 0\r\n    if (fontPairs.length) {\r\n      perfFontSize =\r\n        fontPairs && this.findMaxFontSizeForText(perfText, node.dx, nodeHeight - nodeNameLineHeight, fontPairs)\r\n      perfLineHeight = perfFontSize ? fontSizeLineHeights[perfFontSize] : 0\r\n    }\r\n\r\n    const textHeight = nodeNameLineHeight + perfLineHeight\r\n\r\n    return {\r\n      topOffset: node.dy - textHeight <= nodeTopOffset ? nodeTopOffset : 0,\r\n      fontSize: nodeNameFontSize,\r\n      perfText,\r\n      perfFontSize,\r\n      name,\r\n    }\r\n  }\r\n\r\n  findMaxFontSizeForText(text: string, width: number, height: number, fontSizes: number[]) {\r\n    if (!text.length) return\r\n\r\n    return fontSizes.find(\r\n      (fontSize) =>\r\n        this.getLongestText(text, fontSize, Math.max(0, width - this.settings.fontSizePadding[fontSize] * 2)) ===\r\n          text && fontSizeLineHeights[fontSize] < height\r\n    )\r\n  }\r\n\r\n  getLongestText(text: string, fontSize: number, maxWidth: number) {\r\n    if (maxWidth === 0) return ''\r\n    const widths = fontSizesWidths[fontSize]\r\n    let i = 0\r\n    let width = 0\r\n\r\n    while (i < text.length) {\r\n      width += widths[text[i]] ?? widths['W']\r\n      if (width > maxWidth) break\r\n      i++\r\n    }\r\n\r\n    return text.substring(0, i)\r\n  }\r\n\r\n  getZoomLevels() {\r\n    return this.zoomLevels\r\n  }\r\n\r\n  getNextZoomLevel() {\r\n    var actualZoomLevel = this.zoom.scale()\r\n    if (this.zoomLevels[this.zoomLevels.length - 1] === actualZoomLevel) {\r\n      return actualZoomLevel\r\n    }\r\n    for (var i = 0; i < this.zoomLevels.length; i++) {\r\n      if (this.zoomLevels[i] > actualZoomLevel) {\r\n        return this.zoomLevels[i]\r\n      }\r\n    }\r\n\r\n    return this.zoomLevels[0]\r\n  }\r\n\r\n  getPreviousZoomLevel() {\r\n    var actualZoomLevel = this.zoom.scale()\r\n    if (this.zoomLevels[0] === actualZoomLevel) {\r\n      return actualZoomLevel\r\n    }\r\n    for (var i = this.zoomLevels.length; i >= 0; i--) {\r\n      if (this.zoomLevels[i] < actualZoomLevel) {\r\n        return this.zoomLevels[i]\r\n      }\r\n    }\r\n\r\n    return this.zoomLevels[0]\r\n  }\r\n\r\n  getLastZoomLevel() {\r\n    return this.zoomLevels[this.zoomLevels.length - 1]\r\n  }\r\n\r\n  formatValue(\r\n    value: string,\r\n    [min, max]: [min: number, max: number] = scaleMinMax[this.scale.id],\r\n    format: string = scaleStepFormat[this.scale.id]\r\n  ) {\r\n    let stepFormat = format\r\n    if (typeof format !== 'string') {\r\n      stepFormat = format[value]\r\n    }\r\n\r\n    if (!stepFormat) return value\r\n\r\n    const floatValue = parseFloat(value)\r\n    const absValue = value.replace(/^-/, '')\r\n    const isPositiveScaleOnly = Math.min(min, max) >= 0 && Math.max(min, max) >= 0\r\n    let formated = stepFormat?.replace('%N', absValue) ?? absValue\r\n\r\n    // Some formats might not include number (eg. Before/After earnings)\r\n    if (!stepFormat || !stepFormat.includes('%N')) return formated\r\n\r\n    if (floatValue > 0 && !isPositiveScaleOnly) return `+${formated}`\r\n\r\n    if (floatValue < 0) return `-${formated}`\r\n\r\n    return formated\r\n  }\r\n\r\n  renderStockNode(node: MapDataNode, context: CanvasRenderingContext2D) {\r\n    // Draw background\r\n    context.fillStyle = this.colorScale(node.perf)\r\n    context.fillRect(node.x, node.y, node.dx - 1, node.dy - 1)\r\n\r\n    const nodeText = this.getNodeText(node)\r\n\r\n    if (!nodeText) return\r\n\r\n    context.save()\r\n\r\n    // Set text properties\r\n    context.textBaseline = 'middle'\r\n    context.textAlign = 'center'\r\n    context.fillStyle = 'rgba(0, 0, 0, 0.5)'\r\n\r\n    const nodeY = node.y + nodeText.topOffset\r\n    const nodeDY = node.dy - nodeText.topOffset\r\n    const textX = node.x + node.dx / 2\r\n    let nameY = nodeY + nodeDY / 2\r\n    let perfTextY = nameY + nodeText.fontSize / 2\r\n    const zoom = this.zoom.scale()\r\n    const offset = zoom > 1 ? (1 / zoom) * 1.2 : 1\r\n    if (nodeText.perfFontSize) {\r\n      perfTextY = nameY + nodeText.fontSize / 2\r\n      nameY -= nodeText.perfFontSize / 2\r\n      context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n      context.fillText(nodeText.perfText, textX + offset, perfTextY + offset)\r\n    }\r\n\r\n    context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n    context.fillText(nodeText.name, textX + offset, nameY + offset)\r\n\r\n    context.fillStyle = 'rgba(255, 255, 255, 1)'\r\n\r\n    if (nodeText.perfFontSize) {\r\n      context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n      context.fillText(nodeText.perfText, textX, perfTextY)\r\n    }\r\n\r\n    context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n    context.fillText(nodeText.name, textX, nameY)\r\n    context.restore()\r\n  }\r\n\r\n  getSpacingWithDefaults(spacing?: { top: number; right: number; bottom?: number; left: number }) {\r\n    return {\r\n      top: spacing?.top ?? 0,\r\n      right: spacing?.right ?? 0,\r\n      bottom: spacing?.bottom ?? 0,\r\n      left: spacing?.left ?? 0,\r\n    }\r\n  }\r\n\r\n  renderIndustryHeader({\r\n    node,\r\n    context,\r\n    config,\r\n    fill,\r\n    parent,\r\n  }: {\r\n    node: MapDataRow\r\n    context: CanvasRenderingContext2D\r\n    config?: ISettingsSectionHeader\r\n    parent?: ISettingsSection\r\n    fill: string\r\n  }) {\r\n    const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n    const margin = this.getSpacingWithDefaults(config?.margin)\r\n    const x = node.x + parrentPadding.left + margin.left\r\n    const y = node.y + parrentPadding.top + margin.top\r\n    const width = node.dx - parrentPadding.left - margin.left - parrentPadding.right - margin.right\r\n    const height = y + (config?.height ?? 0)\r\n\r\n    context.fillStyle = fill\r\n    context.strokeStyle = config?.border ?? this.settings.background\r\n    context.beginPath()\r\n    context.moveTo(x, y)\r\n    context.lineTo(x, height)\r\n\r\n    context.lineTo(node.x + 6, height)\r\n    context.lineTo(node.x + 11, height + 5)\r\n    context.lineTo(node.x + 16, height)\r\n\r\n    context.lineTo(x + width, height)\r\n    context.lineTo(x + width, y)\r\n    context.lineTo(x - 0.5, y)\r\n    context.fill()\r\n    context.stroke()\r\n  }\r\n\r\n  renderNodeText({\r\n    node,\r\n    context,\r\n    config,\r\n    parent,\r\n  }: {\r\n    node: MapDataRow\r\n    context: CanvasRenderingContext2D\r\n    config?: ISettingsSectionFont\r\n    parent?: ISettingsSection\r\n  }) {\r\n    if (!config) return\r\n\r\n    const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n    const padding = this.getSpacingWithDefaults(config?.padding)\r\n\r\n    context.textBaseline = 'alphabetic'\r\n    context.textAlign = 'left'\r\n    context.fillStyle = config.color\r\n    context.font = `${config.fontWeight} ${config.fontSize}px ${fontFamily}`\r\n\r\n    const text = this.getLongestText(\r\n      node.name.toUpperCase(),\r\n      config.fontSize,\r\n      node.dx - parrentPadding.left - padding.left - parrentPadding.right - padding.right\r\n    )\r\n    context.fillText(\r\n      text,\r\n      node.x + parrentPadding.left + padding.left,\r\n      node.y + parrentPadding.top + padding.top + config.fontSize\r\n    )\r\n  }\r\n\r\n  getNodeAtPosition(x: number, y: number): MapDataNode | undefined {\r\n    var scale = this.zoom.scale()\r\n    var [tx, ty] = this.zoom.translate()\r\n    for (var i = 0, len = this.nodes.length; i < len; i++) {\r\n      var d = this.nodes[i]\r\n      if (\r\n        d.x * scale + tx < x &&\r\n        x < (d.x + d.dx + 1) * scale + tx &&\r\n        d.y * scale + ty < y &&\r\n        y < (d.y + d.dy + 1) * scale + ty &&\r\n        d.parent\r\n      ) {\r\n        return d\r\n      }\r\n    }\r\n  }\r\n\r\n  getSectorAtPosition(x: number, y: number): MapDataSector | undefined {\r\n    var scale = this.zoom.scale()\r\n    var [tx, ty] = this.zoom.translate()\r\n    for (var i = 0, len = this.sectors.length; i < len; i++) {\r\n      var d = this.sectors[i]\r\n      if (\r\n        d.x * scale + tx < x &&\r\n        x < (d.x + d.dx + 1) * scale + tx &&\r\n        d.y * scale + ty < y &&\r\n        y < (d.y + d.dy + 1) * scale + ty &&\r\n        d.parent\r\n      ) {\r\n        return d\r\n      }\r\n    }\r\n  }\r\n\r\n  getIndustryAtPosition(x: number, y: number): MapDataIndustry | undefined {\r\n    var scale = this.zoom.scale()\r\n    var [tx, ty] = this.zoom.translate()\r\n    for (var i = 0, len = this.industries.length; i < len; i++) {\r\n      var d = this.industries[i]\r\n      if (\r\n        d.x * scale + tx < x &&\r\n        x < (d.x + d.dx + 1) * scale + tx &&\r\n        d.y * scale + ty < y &&\r\n        y < (d.y + d.dy + 1) * scale + ty &&\r\n        d.parent\r\n      ) {\r\n        return d\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport default Treemap\r\n","import { UseMutationResult } from '@tanstack/react-query'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport {\r\n  Dialog,\r\n  DialogBody,\r\n  DialogDismiss,\r\n  DialogFooter,\r\n  DialogHeader,\r\n  useDialogState,\r\n} from '../../../main/components/dialog'\r\nimport { ErrorView } from '../../../main/components/error-view'\r\nimport { Loading } from '../../../main/components/loading'\r\nimport { SocialShare } from '../../../main/components/social-share/SocialShare'\r\n\r\ninterface ShareResponse {\r\n  imgUrl: string\r\n  shareUrl: string\r\n}\r\n\r\ninterface ShareProps<ResponseType> {\r\n  state: UseMutationResult<ResponseType | undefined, any, any>\r\n  onShareClick: () => void\r\n  className?: string\r\n  disabled?: boolean\r\n  base64ImageData: string | null\r\n}\r\n\r\nexport function Share<ResponseType extends ShareResponse>(props: ShareProps<ResponseType>) {\r\n  const dialogState = useDialogState()\r\n\r\n  return (\r\n    <>\r\n      <Button\r\n        leftContent=\"share\"\r\n        theme=\"transparent\"\r\n        className={props.className}\r\n        onClick={() => {\r\n          props.onShareClick()\r\n          dialogState.show()\r\n        }}\r\n      >\r\n        Share map\r\n      </Button>\r\n\r\n      <Dialog state={dialogState} aria-label=\"Share map\">\r\n        <DialogHeader className=\"text-sm\">Share map</DialogHeader>\r\n        <DialogBody className=\"flex w-145 max-w-full flex-col\">\r\n          <ShareDialogBody\r\n            isError={props.state.isError}\r\n            isLoading={props.state.isLoading}\r\n            data={props.state.data}\r\n            base64ImageData={props.base64ImageData}\r\n          />\r\n        </DialogBody>\r\n        <DialogFooter>\r\n          <Button as={DialogDismiss}>Close</Button>\r\n        </DialogFooter>\r\n      </Dialog>\r\n    </>\r\n  )\r\n}\r\n\r\ninterface ShareDialogBodyProps<ResponseType> {\r\n  isError: boolean\r\n  isLoading: boolean\r\n  data?: ResponseType\r\n  base64ImageData: string | null\r\n}\r\n\r\nfunction ShareDialogBody<ResponseType extends ShareResponse>(props: ShareDialogBodyProps<ResponseType>) {\r\n  if (props.isLoading) {\r\n    return (\r\n      <div className=\"flex h-110 items-center justify-center\">\r\n        <Loading />\r\n      </div>\r\n    )\r\n  }\r\n\r\n  if (props.isError || !props.data) {\r\n    return (\r\n      <div className=\"h-110\">\r\n        <ErrorView\r\n          showRefresh={false}\r\n          title=\"Map share failed\"\r\n          message={\r\n            <>\r\n              There’s been an error sharing the map.\r\n              <br />\r\n              Please try sharing the map again and if the problem persists, please contact support.\r\n            </>\r\n          }\r\n        />\r\n      </div>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <>\r\n      <img alt={document.title} src={props.data.imgUrl} className=\"w-full\" />\r\n      <div className=\"mt-4\">\r\n        <SocialShare\r\n          shareUrl={props.data.shareUrl}\r\n          title={document.title}\r\n          imageToDownloadURL={props.data.imgUrl}\r\n          imageToDownloadBase64Data={props.base64ImageData}\r\n        />\r\n      </div>\r\n    </>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport PropTypes from 'prop-types'\r\nimport { Component } from 'react'\r\n\r\ninterface SparklineProps {\r\n  className?: string\r\n  data: number[]\r\n  width: number\r\n  height: number\r\n}\r\n\r\nclass Sparkline extends Component<SparklineProps> {\r\n  static propTypes = {\r\n    width: PropTypes.number.isRequired,\r\n    height: PropTypes.number.isRequired,\r\n    data: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n  }\r\n\r\n  shouldComponentUpdate(nextProps: SparklineProps) {\r\n    // eslint-disable-next-line eqeqeq\r\n    return nextProps.data != this.props.data\r\n  }\r\n\r\n  render() {\r\n    var data = this.props.data\r\n    var x = d3.scaleLinear().range([0, this.props.width]).domain([0, data.length])\r\n\r\n    var y = d3\r\n      .scaleLinear()\r\n      .range([this.props.height - 4, 0])\r\n      .domain(d3.extent(data, (d) => d) as [number, number])\r\n\r\n    var line = d3\r\n      .line<number>()\r\n      .curve(d3.curveBasis)\r\n      .x((d, i) => x(i))\r\n      .y((d) => y(d))\r\n\r\n    return (\r\n      <svg\r\n        className={classnames('sparkline', this.props.className)}\r\n        width={this.props.width}\r\n        height={this.props.height}\r\n      >\r\n        <g transform=\"translate(0, 2)\">\r\n          <path d={line(data)!} />\r\n        </g>\r\n      </svg>\r\n    )\r\n  }\r\n}\r\n\r\nexport default Sparkline\r\n","import logoBase64 from './assets/logo.png'\r\nimport { getTextFontFamily } from './getTextFontFamily'\r\nimport { isFirefoxDesktop } from './isMobile'\r\nimport { loadImage } from './loadImage'\r\nimport { getScaleRatio } from './retinafy'\r\n\r\nexport async function drawShareMap(canvasEl: HTMLCanvasElement, text: string[]) {\r\n  const fontFamily = getTextFontFamily()\r\n\r\n  const ratio = getScaleRatio()\r\n  const width = canvasEl.width / ratio\r\n  const height = canvasEl.height / ratio\r\n\r\n  const canvas = document.createElement('canvas')\r\n  const context = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n  canvas.width = width\r\n  canvas.height = height + 22\r\n\r\n  // Background\r\n  context.fillStyle = '#fff'\r\n  context.fillRect(0, 0, width, height)\r\n\r\n  // Logo\r\n  const logo = await loadImage(logoBase64)\r\n  context.drawImage(logo, 2, 4)\r\n\r\n  // Labels\r\n  const label = text.map((t) => t.toUpperCase())\r\n  let x = width\r\n  const y = 11\r\n\r\n  context.textBaseline = 'middle'\r\n  context.textAlign = 'right'\r\n  context.font = '9pt ' + fontFamily\r\n  for (let i = label.length - 1; i >= 0; i--) {\r\n    const text = label[i]\r\n    let textWidth = context.measureText(text).width\r\n\r\n    context.fillStyle = '#4c5261'\r\n    context.fillText(text, x, y)\r\n\r\n    if (i > 0) {\r\n      const divider = '  •  '\r\n      context.fillStyle = '#5faaf4'\r\n      context.fillText(divider, x - textWidth, y)\r\n      textWidth = textWidth + context.measureText(divider).width\r\n    }\r\n\r\n    x = x - textWidth\r\n  }\r\n\r\n  context.drawImage(canvasEl, 0, 0, width * ratio, height * ratio, 0, 22, width, height)\r\n\r\n  return canvas.toDataURL()\r\n}\r\n","export function getTextFontFamily() {\r\n  return 'Lato'\r\n}\r\n","import { ScaleId } from '../maps/types'\r\n\r\nexport interface GradientDefinition {\r\n  colors: string[]\r\n  nullColor: string\r\n}\r\n\r\nconst redGreenGradientSmall = {\r\n  colors: [\r\n    '#e01427',\r\n    '#ce252b',\r\n    '#bb2f30',\r\n    '#aa3534',\r\n    '#993938',\r\n    '#853c3c',\r\n    '#743d3f',\r\n    '#414554',\r\n    '#3e5f50',\r\n    '#3f704f',\r\n    '#3f814d',\r\n    '#3c924a',\r\n    '#36a446',\r\n    '#2bb642',\r\n    '#12c93b',\r\n  ],\r\n  nullColor: '#2f323d',\r\n}\r\nexport const redGreenGradient = {\r\n  colors: [\r\n    '#f63538',\r\n    '#ee373a',\r\n    '#e6393b',\r\n    '#df3a3d',\r\n    '#d73c3f',\r\n    '#ce3d41',\r\n    '#c73e43',\r\n    '#bf4045',\r\n    '#b64146',\r\n    '#ae4248',\r\n    '#a5424a',\r\n    '#9d434b',\r\n    '#94444d',\r\n    '#8b444e',\r\n    '#824450',\r\n    '#784551',\r\n    '#6f4552',\r\n    '#644553',\r\n    '#5a4554',\r\n    '#4f4554',\r\n    '#414554',\r\n    '#3f4c53',\r\n    '#3d5451',\r\n    '#3b5a50',\r\n    '#3a614f',\r\n    '#38694f',\r\n    '#366f4e',\r\n    '#35764e',\r\n    '#347d4e',\r\n    '#32844e',\r\n    '#31894e',\r\n    '#31904e',\r\n    '#30974f',\r\n    '#2f9e4f',\r\n    '#2fa450',\r\n    '#2faa51',\r\n    '#2fb152',\r\n    '#2fb854',\r\n    '#30be56',\r\n    '#30c558',\r\n    '#30cc5a',\r\n  ],\r\n  nullColor: '#2f323d',\r\n}\r\nconst greenRedGradient = { colors: redGreenGradient.colors.slice().reverse(), nullColor: redGreenGradient.nullColor }\r\nconst redGradient = { colors: redGreenGradient.colors.slice(0, 22).reverse(), nullColor: redGreenGradient.nullColor }\r\nconst greenGradient = { colors: redGreenGradient.colors.slice(21), nullColor: redGreenGradient.nullColor }\r\nconst blueGradient = {\r\n  colors: [\r\n    '#3d4251',\r\n    '#3d4250',\r\n    '#3d4250',\r\n    '#3e4251',\r\n    '#3e4251',\r\n    '#3d4350',\r\n    '#3d4350',\r\n    '#3d4350',\r\n    '#3e4351',\r\n    '#3e4350',\r\n    '#3d4351',\r\n    '#3d4352',\r\n    '#3f4353',\r\n    '#3f4353',\r\n    '#3f4453',\r\n    '#3f4554',\r\n    '#3e4354',\r\n    '#3e4354',\r\n    '#3f4454',\r\n    '#3f4454',\r\n    '#3f4454',\r\n    '#3f4454',\r\n    '#3f4454',\r\n    '#3f4555',\r\n    '#3f4556',\r\n    '#3f4457',\r\n    '#3f4457',\r\n    '#3f4457',\r\n    '#3f4557',\r\n    '#3f4657',\r\n    '#3f4657',\r\n    '#3f4657',\r\n    '#3f4557',\r\n    '#3e4557',\r\n    '#3e4558',\r\n    '#3f465a',\r\n    '#3f4659',\r\n    '#3f4759',\r\n    '#3f4759',\r\n    '#3f475a',\r\n    '#3f4759',\r\n    '#3f465a',\r\n    '#3f465a',\r\n    '#3f4759',\r\n    '#3f475b',\r\n    '#40475b',\r\n    '#40475b',\r\n    '#40465b',\r\n    '#40465c',\r\n    '#40465d',\r\n    '#40485d',\r\n    '#40485c',\r\n    '#40475c',\r\n    '#40465c',\r\n    '#40465c',\r\n    '#40465c',\r\n    '#40485d',\r\n    '#40485d',\r\n    '#40485e',\r\n    '#40485f',\r\n    '#40495e',\r\n    '#40495e',\r\n    '#40485e',\r\n    '#40485f',\r\n    '#40495e',\r\n    '#40485e',\r\n    '#40485f',\r\n    '#404960',\r\n    '#404960',\r\n    '#404860',\r\n    '#404861',\r\n    '#404a62',\r\n    '#404962',\r\n    '#404962',\r\n    '#404a62',\r\n    '#404a62',\r\n    '#404861',\r\n    '#404961',\r\n    '#404a63',\r\n    '#404a64',\r\n    '#404a65',\r\n    '#404b64',\r\n    '#404b64',\r\n    '#404a65',\r\n    '#404a65',\r\n    '#404a65',\r\n    '#404a65',\r\n    '#404b65',\r\n    '#404b65',\r\n    '#414c65',\r\n    '#424c65',\r\n    '#424b65',\r\n    '#414b66',\r\n    '#414b67',\r\n    '#414b67',\r\n    '#414c67',\r\n    '#424b67',\r\n    '#424c67',\r\n    '#414c67',\r\n    '#414b67',\r\n    '#414c67',\r\n    '#414c67',\r\n    '#414c69',\r\n    '#414c6a',\r\n    '#414c6a',\r\n    '#414c6a',\r\n    '#414d6a',\r\n    '#424e6a',\r\n    '#414d6a',\r\n    '#414d6a',\r\n    '#414d6a',\r\n    '#414d6a',\r\n    '#414d6a',\r\n    '#414d6b',\r\n    '#414d6c',\r\n    '#414e6c',\r\n    '#414f6c',\r\n    '#414e6c',\r\n    '#414d6c',\r\n    '#414d6c',\r\n    '#414e6c',\r\n    '#424e6d',\r\n    '#424e6d',\r\n    '#414f6d',\r\n    '#424f6f',\r\n    '#414e6f',\r\n    '#414e6f',\r\n    '#424f70',\r\n    '#414f6f',\r\n    '#414f6f',\r\n    '#414f6f',\r\n    '#414e6f',\r\n    '#414e6f',\r\n    '#414f6f',\r\n    '#414f6f',\r\n    '#414f71',\r\n    '#414f72',\r\n    '#425073',\r\n    '#425173',\r\n    '#415072',\r\n    '#425173',\r\n    '#425173',\r\n    '#425173',\r\n    '#415072',\r\n    '#415072',\r\n    '#415172',\r\n    '#415173',\r\n    '#415174',\r\n    '#415174',\r\n    '#415074',\r\n    '#415074',\r\n    '#415174',\r\n    '#415074',\r\n    '#415074',\r\n    '#415074',\r\n    '#415175',\r\n    '#415275',\r\n    '#425276',\r\n    '#425277',\r\n    '#415177',\r\n    '#415177',\r\n    '#425278',\r\n    '#425378',\r\n    '#415277',\r\n    '#415378',\r\n    '#415378',\r\n    '#415277',\r\n    '#415378',\r\n    '#42537a',\r\n    '#42537c',\r\n    '#42537b',\r\n    '#41537a',\r\n    '#41527a',\r\n    '#41537a',\r\n    '#41547a',\r\n    '#42547b',\r\n    '#41547a',\r\n    '#41547a',\r\n    '#41547c',\r\n    '#41547c',\r\n    '#41557c',\r\n    '#41557c',\r\n    '#41557c',\r\n    '#41557c',\r\n    '#41557d',\r\n    '#41547d',\r\n    '#41547c',\r\n    '#42557d',\r\n    '#41557d',\r\n    '#41557d',\r\n    '#41557f',\r\n    '#415580',\r\n    '#41567f',\r\n    '#41567f',\r\n    '#415580',\r\n    '#41567f',\r\n    '#415580',\r\n    '#415580',\r\n    '#41557f',\r\n    '#415680',\r\n    '#415680',\r\n    '#415680',\r\n    '#415681',\r\n    '#415681',\r\n    '#415781',\r\n    '#415781',\r\n    '#415681',\r\n    '#415781',\r\n    '#415781',\r\n    '#415781',\r\n    '#415782',\r\n    '#415784',\r\n    '#415784',\r\n    '#425885',\r\n    '#425885',\r\n    '#415784',\r\n    '#415784',\r\n    '#415784',\r\n    '#415784',\r\n    '#425885',\r\n    '#425885',\r\n    '#415885',\r\n    '#415885',\r\n    '#425987',\r\n    '#415887',\r\n    '#415887',\r\n    '#415987',\r\n    '#415887',\r\n    '#425988',\r\n    '#425988',\r\n    '#415887',\r\n    '#415987',\r\n    '#415988',\r\n    '#415988',\r\n    '#415988',\r\n    '#415989',\r\n    '#415989',\r\n    '#415989',\r\n    '#415989',\r\n    '#415989',\r\n    '#415989',\r\n    '#41598a',\r\n    '#405a8b',\r\n    '#405a8c',\r\n    '#405b8c',\r\n    '#405b8c',\r\n    '#405b8c',\r\n    '#405a8c',\r\n    '#405a8c',\r\n    '#405a8c',\r\n    '#405a8c',\r\n    '#405b8c',\r\n    '#415c8d',\r\n    '#415c8e',\r\n    '#405b8e',\r\n    '#415c90',\r\n    '#405b8f',\r\n    '#405c8f',\r\n    '#415d90',\r\n    '#405b8f',\r\n    '#405c8f',\r\n    '#405c8f',\r\n    '#405b8f',\r\n    '#405c8f',\r\n    '#405c90',\r\n    '#405c91',\r\n    '#405c91',\r\n    '#405c91',\r\n    '#405d91',\r\n    '#405e91',\r\n    '#405d91',\r\n    '#415e91',\r\n    '#405e91',\r\n    '#415e91',\r\n    '#415e92',\r\n    '#3f5d94',\r\n    '#3f5d93',\r\n    '#3f5d93',\r\n    '#3f5e94',\r\n    '#405e94',\r\n    '#3f5d94',\r\n    '#3f5d94',\r\n    '#3f5d94',\r\n    '#3f5e94',\r\n    '#3f5e95',\r\n    '#3f5e96',\r\n    '#3f5e96',\r\n    '#3f5e96',\r\n    '#405f97',\r\n    '#405f97',\r\n    '#3f5e96',\r\n    '#3f5e97',\r\n    '#3f5f97',\r\n    '#3f6097',\r\n    '#3f5f97',\r\n    '#3f6097',\r\n    '#3f5f98',\r\n    '#3f5f99',\r\n    '#3e5f99',\r\n    '#3e6199',\r\n    '#3e6099',\r\n    '#3e5f99',\r\n    '#3e5f99',\r\n    '#3e5f98',\r\n    '#3e6099',\r\n    '#3d609a',\r\n    '#3d6099',\r\n    '#3e609b',\r\n    '#3e619c',\r\n    '#3e619c',\r\n    '#3e619c',\r\n    '#3e609b',\r\n    '#3e609c',\r\n    '#3e609c',\r\n    '#3e619b',\r\n    '#3e629c',\r\n    '#3e629c',\r\n    '#3e619c',\r\n    '#3d619d',\r\n    '#3d639f',\r\n    '#3d629f',\r\n    '#3d629f',\r\n    '#3d639f',\r\n    '#3d629f',\r\n    '#3c619e',\r\n    '#3c619e',\r\n    '#3d629f',\r\n    '#3d62a0',\r\n    '#3d63a0',\r\n    '#3d63a0',\r\n    '#3d62a0',\r\n    '#3d63a1',\r\n    '#3d62a0',\r\n    '#3d63a0',\r\n    '#3d64a1',\r\n    '#3d63a0',\r\n    '#3c63a0',\r\n    '#3b63a2',\r\n    '#3c64a3',\r\n    '#3c65a3',\r\n    '#3b63a3',\r\n    '#3b63a3',\r\n    '#3b63a3',\r\n    '#3b63a3',\r\n    '#3c63a3',\r\n    '#3c65a3',\r\n    '#3c65a3',\r\n    '#3b64a4',\r\n    '#3a65a5',\r\n    '#3b66a6',\r\n    '#3c65a6',\r\n    '#3a65a5',\r\n    '#3a64a5',\r\n    '#3a64a5',\r\n    '#3b65a5',\r\n    '#3a65a5',\r\n    '#3a66a6',\r\n    '#3b66a6',\r\n    '#3b66a6',\r\n    '#3a66a8',\r\n    '#3a67a8',\r\n    '#3b67a8',\r\n    '#3b66a8',\r\n    '#3b66a8',\r\n    '#3b66a8',\r\n    '#3b67a8',\r\n    '#3a66a8',\r\n    '#3966a9',\r\n    '#3967a9',\r\n    '#3a67aa',\r\n    '#3a67ab',\r\n    '#3967ab',\r\n    '#3a68ab',\r\n    '#3a68ab',\r\n    '#3968ab',\r\n    '#3966aa',\r\n    '#3966aa',\r\n    '#3968ab',\r\n    '#3968ab',\r\n    '#3867ac',\r\n    '#3867ac',\r\n    '#3868ac',\r\n    '#3869ad',\r\n    '#3969ad',\r\n    '#3968ad',\r\n    '#3868ac',\r\n    '#3868ac',\r\n    '#3869ae',\r\n    '#3868ad',\r\n    '#3868ad',\r\n    '#3769af',\r\n    '#3869b0',\r\n    '#3769af',\r\n    '#3769af',\r\n    '#386ab0',\r\n    '#386ab0',\r\n    '#376aaf',\r\n    '#376aaf',\r\n    '#376ab0',\r\n    '#366ab1',\r\n    '#366ab2',\r\n    '#366ab2',\r\n    '#366ab2',\r\n    '#366ab3',\r\n    '#366bb3',\r\n    '#366ab2',\r\n    '#3669b2',\r\n    '#366ab2',\r\n    '#366ab2',\r\n    '#366ab2',\r\n    '#356bb3',\r\n    '#346bb4',\r\n    '#356cb4',\r\n    '#356cb4',\r\n    '#346bb4',\r\n    '#356cb4',\r\n    '#356cb5',\r\n    '#356cb5',\r\n    '#356cb5',\r\n    '#346cb5',\r\n    '#346cb5',\r\n    '#346cb6',\r\n    '#336db7',\r\n    '#326cb7',\r\n    '#326db7',\r\n    '#336db7',\r\n    '#336cb7',\r\n    '#326bb6',\r\n    '#326cb6',\r\n    '#326db7',\r\n    '#326db8',\r\n    '#316dba',\r\n    '#316eb9',\r\n    '#316eb9',\r\n    '#326eba',\r\n    '#316eba',\r\n    '#316db9',\r\n    '#316db9',\r\n    '#316eb9',\r\n    '#306eba',\r\n    '#306dba',\r\n    '#306dba',\r\n    '#306ebb',\r\n    '#306dbb',\r\n    '#306dbc',\r\n    '#306fbc',\r\n    '#306fbc',\r\n    '#306ebb',\r\n    '#306eba',\r\n    '#306fbc',\r\n    '#2f6fbd',\r\n    '#2d6ebe',\r\n    '#2d6ebe',\r\n    '#2d6fbe',\r\n    '#2e70be',\r\n    '#2e70be',\r\n    '#2e6fbe',\r\n    '#2e6fbe',\r\n    '#2e6fbe',\r\n    '#2c6fc0',\r\n    '#2d70c0',\r\n    '#2d70c0',\r\n    '#2b70c1',\r\n    '#2b70c1',\r\n    '#2c70c1',\r\n    '#2c70c1',\r\n    '#2b71c1',\r\n    '#2c70c1',\r\n    '#2c70c1',\r\n    '#2c71c1',\r\n    '#2c71c1',\r\n    '#2a72c3',\r\n    '#2971c3',\r\n    '#2a71c2',\r\n    '#2972c3',\r\n    '#2a71c3',\r\n    '#2a71c3',\r\n    '#2972c3',\r\n    '#2972c3',\r\n    '#2972c3',\r\n    '#2872c5',\r\n    '#2872c6',\r\n    '#2872c5',\r\n    '#2773c6',\r\n    '#2773c6',\r\n    '#2772c6',\r\n    '#2772c5',\r\n    '#2672c5',\r\n    '#2673c5',\r\n    '#2673c5',\r\n    '#2673c7',\r\n    '#2472c8',\r\n    '#2473c8',\r\n    '#2474c8',\r\n    '#2573c9',\r\n    '#2573c9',\r\n    '#2573c9',\r\n    '#2573c9',\r\n    '#2474c8',\r\n    '#2374c9',\r\n    '#2374c9',\r\n    '#2374c9',\r\n    '#2375c9',\r\n    '#2374c9',\r\n    '#2374c9',\r\n    '#2475c9',\r\n    '#2575ca',\r\n    '#2476ca',\r\n    '#2476ca',\r\n    '#2476ca',\r\n    '#2575cb',\r\n    '#2577ca',\r\n    '#2577ca',\r\n    '#2576ca',\r\n    '#2577ca',\r\n    '#2577ca',\r\n    '#2577ca',\r\n    '#2677ca',\r\n    '#2678ca',\r\n    '#2678cb',\r\n    '#2778cb',\r\n    '#2778cb',\r\n    '#2679cb',\r\n    '#2779cb',\r\n    '#2779cb',\r\n    '#2779cb',\r\n    '#2779cb',\r\n    '#2879cb',\r\n    '#287acb',\r\n    '#287acb',\r\n    '#2879cb',\r\n    '#287acb',\r\n    '#287bcb',\r\n    '#287acb',\r\n    '#287acb',\r\n    '#287bcc',\r\n    '#287bcc',\r\n    '#297bcc',\r\n    '#297bcc',\r\n    '#297bcc',\r\n    '#297bcc',\r\n    '#297ccc',\r\n    '#297ccc',\r\n    '#297dcc',\r\n    '#297dcc',\r\n    '#2a7dcc',\r\n    '#2a7dcc',\r\n    '#2a7ecd',\r\n    '#2a7ecd',\r\n    '#2a7ecc',\r\n    '#2a7ecc',\r\n    '#2b7ecd',\r\n    '#2c7ecd',\r\n    '#2c7fcd',\r\n    '#2c7fcd',\r\n    '#2b7ecc',\r\n    '#2b7ecc',\r\n    '#2c7fcd',\r\n    '#2c7fcd',\r\n    '#2c7fcd',\r\n    '#2c7fcd',\r\n    '#2b7fcd',\r\n    '#2b80cd',\r\n    '#2c80ce',\r\n    '#2d80ce',\r\n    '#2d80ce',\r\n    '#2c81cd',\r\n    '#2d82ce',\r\n    '#2d82ce',\r\n    '#2d81ce',\r\n    '#2d82ce',\r\n    '#2d82ce',\r\n    '#2d82cd',\r\n    '#2e82cd',\r\n    '#2e83ce',\r\n    '#2e82ce',\r\n    '#2d82cd',\r\n    '#2d83cd',\r\n    '#2e83cf',\r\n    '#2e84cf',\r\n    '#2e84cf',\r\n    '#2e83ce',\r\n    '#2e83ce',\r\n    '#3084cf',\r\n    '#3085cf',\r\n    '#2f85ce',\r\n    '#3085cf',\r\n    '#2f86ce',\r\n    '#2f86ce',\r\n    '#2f86cf',\r\n    '#2f85cf',\r\n    '#2f86ce',\r\n    '#2f86cf',\r\n    '#2f86cf',\r\n    '#2f87cf',\r\n    '#2f86d0',\r\n    '#2f86d0',\r\n    '#2f86d0',\r\n    '#3087cf',\r\n    '#3088d0',\r\n    '#3088d0',\r\n    '#3087cf',\r\n    '#3088cf',\r\n    '#3188d0',\r\n    '#3188d1',\r\n    '#3088d0',\r\n    '#3089d0',\r\n    '#3089d0',\r\n    '#3088d0',\r\n    '#3188d0',\r\n    '#3189d0',\r\n    '#3289d0',\r\n    '#3289d0',\r\n    '#328ad1',\r\n    '#328ad1',\r\n    '#318ad0',\r\n    '#318ad0',\r\n    '#318ad0',\r\n    '#328bd1',\r\n    '#328ad1',\r\n    '#328ad1',\r\n    '#338bd2',\r\n    '#338bd2',\r\n    '#338cd1',\r\n    '#338cd1',\r\n    '#338cd2',\r\n    '#338cd2',\r\n    '#338dd1',\r\n    '#338dd1',\r\n    '#338dd2',\r\n    '#338dd1',\r\n    '#338ed2',\r\n    '#338ed2',\r\n    '#338ed2',\r\n    '#348ed2',\r\n    '#348ed2',\r\n    '#348ed2',\r\n    '#348fd2',\r\n    '#348fd2',\r\n    '#348fd2',\r\n    '#348fd2',\r\n    '#348fd2',\r\n    '#348fd2',\r\n    '#3390d2',\r\n    '#3391d2',\r\n    '#3491d3',\r\n    '#3490d3',\r\n    '#3491d3',\r\n    '#3491d3',\r\n    '#3591d3',\r\n    '#3591d3',\r\n    '#3691d4',\r\n    '#3690d4',\r\n    '#3590d3',\r\n    '#3592d3',\r\n    '#3592d4',\r\n    '#3592d4',\r\n    '#3592d3',\r\n    '#3593d3',\r\n    '#3592d4',\r\n    '#3592d4',\r\n    '#3592d4',\r\n    '#3593d4',\r\n    '#3694d4',\r\n    '#3695d4',\r\n    '#3694d4',\r\n    '#3693d4',\r\n    '#3693d4',\r\n    '#3695d4',\r\n    '#3695d4',\r\n    '#3695d4',\r\n    '#3796d4',\r\n    '#3796d4',\r\n    '#3695d4',\r\n    '#3695d5',\r\n    '#3696d5',\r\n    '#3696d5',\r\n    '#3696d5',\r\n    '#3695d4',\r\n    '#3696d4',\r\n    '#3797d5',\r\n    '#3796d5',\r\n    '#3797d5',\r\n    '#3898d5',\r\n    '#3898d5',\r\n    '#3797d5',\r\n    '#3798d5',\r\n    '#3899d5',\r\n    '#3899d5',\r\n    '#3899d6',\r\n    '#3799d6',\r\n    '#3799d6',\r\n    '#3799d6',\r\n    '#389ad6',\r\n    '#389ad6',\r\n    '#3799d5',\r\n    '#3799d5',\r\n    '#3799d6',\r\n    '#379ad6',\r\n    '#379ad6',\r\n    '#399ad6',\r\n    '#399ad6',\r\n    '#389bd5',\r\n    '#389bd5',\r\n    '#389bd6',\r\n    '#389bd6',\r\n    '#399cd7',\r\n    '#399bd7',\r\n    '#399cd7',\r\n    '#399dd7',\r\n    '#389cd7',\r\n    '#389cd6',\r\n    '#389dd6',\r\n    '#399ed7',\r\n    '#389dd6',\r\n    '#389dd6',\r\n    '#389fd6',\r\n    '#399fd7',\r\n    '#399ed6',\r\n    '#399ed6',\r\n    '#399fd7',\r\n    '#399fd7',\r\n    '#399fd7',\r\n    '#3aa0d8',\r\n    '#3aa0d8',\r\n    '#3a9fd8',\r\n    '#3a9fd8',\r\n    '#3a9fd8',\r\n    '#3aa0d8',\r\n    '#3aa1d8',\r\n    '#3aa1d8',\r\n    '#3aa1d8',\r\n    '#3aa1d8',\r\n    '#3aa1d8',\r\n    '#3aa2d9',\r\n    '#3aa1d9',\r\n    '#3aa1d8',\r\n    '#39a2d8',\r\n    '#3aa2d9',\r\n    '#3aa3d9',\r\n    '#3ba3d9',\r\n    '#3ba3d9',\r\n    '#3ba2d8',\r\n    '#3aa2d8',\r\n    '#3aa4d8',\r\n    '#3ba4d9',\r\n    '#3aa3d8',\r\n    '#3aa3d9',\r\n    '#3ba5da',\r\n    '#3ba5d9',\r\n    '#3ba4d9',\r\n    '#3ba4d9',\r\n    '#3ba4d9',\r\n    '#3aa5d9',\r\n    '#3ba5da',\r\n    '#3ba6da',\r\n    '#3ba6da',\r\n    '#3ba6da',\r\n    '#3ba6d9',\r\n    '#3ba6d9',\r\n    '#3ba6da',\r\n    '#3aa5da',\r\n    '#3ba6da',\r\n    '#3ca7da',\r\n    '#3ca7da',\r\n    '#3ba7da',\r\n    '#3ba6da',\r\n    '#3ca7da',\r\n    '#3ca8da',\r\n    '#3ca8da',\r\n    '#3ca8da',\r\n    '#3ca9db',\r\n    '#3ca9db',\r\n    '#3ca9da',\r\n    '#3ca8db',\r\n    '#3ba8db',\r\n    '#3baadb',\r\n    '#3caadb',\r\n    '#3ca9db',\r\n    '#3caadb',\r\n    '#3caadb',\r\n    '#3ca9db',\r\n    '#3ca9db',\r\n    '#3ca9db',\r\n    '#3cabdb',\r\n    '#3cabdc',\r\n    '#3caadb',\r\n    '#3cabdb',\r\n    '#3cacdc',\r\n    '#3cacdc',\r\n    '#3cacdc',\r\n    '#3caddc',\r\n    '#3caddc',\r\n    '#3caddc',\r\n    '#3caedc',\r\n    '#3caddd',\r\n    '#3caddd',\r\n    '#3caedc',\r\n    '#3eaedd',\r\n    '#3eaddd',\r\n    '#3daddc',\r\n    '#3daedc',\r\n    '#3daedc',\r\n    '#3dafdd',\r\n    '#3dafdd',\r\n    '#3daedd',\r\n    '#3dafdd',\r\n    '#3dafdd',\r\n    '#3dafdd',\r\n    '#3db0dd',\r\n    '#3db0dd',\r\n    '#3db0dc',\r\n    '#3db0dc',\r\n    '#3db1dd',\r\n    '#3db1dd',\r\n    '#3db0dd',\r\n    '#3db0dd',\r\n    '#3db1dd',\r\n    '#3db1de',\r\n    '#3db1de',\r\n    '#3db1de',\r\n    '#3db2de',\r\n    '#3db2de',\r\n    '#3db2dd',\r\n    '#3db2dd',\r\n    '#3db3dd',\r\n    '#3db2de',\r\n    '#3db3de',\r\n    '#3db4de',\r\n    '#3db3dd',\r\n    '#3db4de',\r\n    '#3db4de',\r\n    '#3db4de',\r\n    '#3db5df',\r\n    '#3db5df',\r\n    '#3db4df',\r\n    '#3db4df',\r\n    '#3db5df',\r\n    '#3db5de',\r\n    '#3db5de',\r\n    '#3db5de',\r\n    '#3db6df',\r\n    '#3db6df',\r\n    '#3db6de',\r\n    '#3db6de',\r\n    '#3db7df',\r\n    '#3db7e0',\r\n    '#3db8e0',\r\n    '#3db8e0',\r\n    '#3db7e0',\r\n    '#3db7df',\r\n    '#3db7df',\r\n    '#3eb7df',\r\n    '#3eb8df',\r\n    '#3eb8df',\r\n    '#3eb9e0',\r\n    '#3eb9e0',\r\n    '#3eb8df',\r\n    '#3eb9df',\r\n    '#3fb9df',\r\n    '#3fb9e0',\r\n    '#3ebae1',\r\n    '#3ebae0',\r\n    '#3ebae0',\r\n    '#3ebae0',\r\n    '#3eb9e0',\r\n    '#3fbae1',\r\n    '#3fbbe1',\r\n    '#3ebae0',\r\n    '#3ebbe1',\r\n    '#3ebae0',\r\n    '#3ebbe0',\r\n    '#3ebce1',\r\n    '#3fbce1',\r\n    '#3ebce0',\r\n    '#3ebce2',\r\n    '#3ebce2',\r\n    '#3ebde2',\r\n    '#3fbde2',\r\n    '#3fbde2',\r\n    '#3ebde1',\r\n    '#3ebee1',\r\n    '#3ebde2',\r\n    '#3fbde2',\r\n    '#3fbde2',\r\n    '#3ebee1',\r\n    '#3ebfe1',\r\n    '#3ebfe1',\r\n    '#3ebfe1',\r\n    '#3fbfe2',\r\n    '#3ebfe1',\r\n    '#3ebee1',\r\n    '#3ebee2',\r\n    '#3ebfe2',\r\n    '#3ebfe2',\r\n    '#3ebfe2',\r\n    '#3ec0e2',\r\n    '#3ec1e2',\r\n    '#3fc0e3',\r\n    '#3fc0e3',\r\n    '#3ec0e2',\r\n    '#3ec1e2',\r\n    '#3ec2e2',\r\n    '#3ec2e2',\r\n    '#3ec2e2',\r\n    '#3ec3e3',\r\n    '#3ec3e3',\r\n    '#3ec3e3',\r\n    '#3ec2e3',\r\n    '#3ec2e3',\r\n    '#3fc3e3',\r\n    '#3fc4e3',\r\n    '#3ec4e3',\r\n    '#3ec3e3',\r\n    '#3ec3e3',\r\n    '#3ec5e4',\r\n    '#3fc5e4',\r\n    '#3fc5e3',\r\n    '#3fc4e4',\r\n    '#3fc5e4',\r\n    '#3ec6e4',\r\n    '#3ec5e4',\r\n    '#3ec4e4',\r\n    '#3ec5e4',\r\n    '#3ec6e4',\r\n    '#3ec6e4',\r\n    '#3ec6e4',\r\n    '#3ec6e4',\r\n    '#3ec6e4',\r\n    '#3ec7e4',\r\n    '#3ec6e4',\r\n    '#3ec6e4',\r\n    '#3ec6e4',\r\n    '#3ec7e4',\r\n    '#3dc8e4',\r\n    '#3dc8e4',\r\n    '#3dc7e5',\r\n    '#3dc7e5',\r\n    '#3dc8e5',\r\n    '#3dc8e4',\r\n    '#3dc8e4',\r\n    '#3dc9e5',\r\n    '#3dc9e5',\r\n    '#3dc9e5',\r\n    '#3dc9e5',\r\n    '#3dc9e5',\r\n    '#3dc9e4',\r\n    '#3dc9e5',\r\n    '#3dcae6',\r\n    '#3dcbe6',\r\n    '#3dcae6',\r\n    '#3dcae6',\r\n    '#3dcae6',\r\n    '#3dcbe6',\r\n    '#3dcce6',\r\n    '#3ecce6',\r\n    '#3ecce6',\r\n    '#3dcbe6',\r\n    '#3dcce6',\r\n    '#3dcce6',\r\n    '#3dcce6',\r\n    '#3dcce5',\r\n    '#3dcce5',\r\n    '#3dcce6',\r\n    '#3dcde7',\r\n    '#3dcde7',\r\n    '#3dcde7',\r\n    '#3dcfe7',\r\n    '#3dcfe7',\r\n    '#3dcfe7',\r\n    '#3dcee7',\r\n    '#3dcee6',\r\n    '#3dcee6',\r\n    '#3dcfe7',\r\n    '#3dcfe7',\r\n    '#3dcfe6',\r\n    '#3dcfe6',\r\n    '#3dd0e8',\r\n    '#3ed1e8',\r\n    '#3ed1e7',\r\n    '#3dd0e7',\r\n    '#3dd0e8',\r\n    '#3dd0e7',\r\n    '#3dd1e7',\r\n    '#3dd1e7',\r\n    '#3dd0e7',\r\n    '#3cd1e8',\r\n    '#3cd2e8',\r\n    '#3cd1e8',\r\n    '#3cd1e7',\r\n    '#3cd1e7',\r\n    '#3cd2e8',\r\n    '#3cd3e9',\r\n    '#3cd2e8',\r\n    '#3cd2e9',\r\n    '#3cd2e9',\r\n    '#3cd3e8',\r\n    '#3cd4e8',\r\n    '#3cd3e8',\r\n    '#3cd3e8',\r\n  ],\r\n  nullColor: '#2f323d',\r\n}\r\nconst earningsGradient = {\r\n  colors: [\r\n    '#592d48',\r\n    '#592d49',\r\n    '#5b2d49',\r\n    '#5b2d49',\r\n    '#5b2d49',\r\n    '#5b2e49',\r\n    '#5b2e49',\r\n    '#5b2e4a',\r\n    '#5c2e4a',\r\n    '#5d2f4b',\r\n    '#5c2f4b',\r\n    '#5c2e4b',\r\n    '#5f2f4c',\r\n    '#5f2f4c',\r\n    '#5e2e4c',\r\n    '#5e2e4c',\r\n    '#60304d',\r\n    '#60304d',\r\n    '#5f2f4d',\r\n    '#5f2f4d',\r\n    '#62304f',\r\n    '#62304f',\r\n    '#61304f',\r\n    '#62314f',\r\n    '#62314f',\r\n    '#633150',\r\n    '#633150',\r\n    '#63314f',\r\n    '#63304f',\r\n    '#643150',\r\n    '#643151',\r\n    '#643151',\r\n    '#653152',\r\n    '#653051',\r\n    '#653051',\r\n    '#663152',\r\n    '#673253',\r\n    '#673253',\r\n    '#673253',\r\n    '#673253',\r\n    '#683254',\r\n    '#683254',\r\n    '#683254',\r\n    '#693254',\r\n    '#693354',\r\n    '#6a3354',\r\n    '#6a3354',\r\n    '#6a3355',\r\n    '#6a3356',\r\n    '#6a3456',\r\n    '#6c3456',\r\n    '#6c3356',\r\n    '#6c3457',\r\n    '#6c3457',\r\n    '#6c3457',\r\n    '#6c3457',\r\n    '#6d3458',\r\n    '#6e3559',\r\n    '#6f3559',\r\n    '#6f3459',\r\n    '#6f345a',\r\n    '#70355b',\r\n    '#70365b',\r\n    '#6f355a',\r\n    '#70365b',\r\n    '#71355a',\r\n    '#71355a',\r\n    '#71365b',\r\n    '#72355b',\r\n    '#72365c',\r\n    '#72365d',\r\n    '#72355c',\r\n    '#73355c',\r\n    '#73355d',\r\n    '#73375d',\r\n    '#73375d',\r\n    '#76375e',\r\n    '#76375f',\r\n    '#76375f',\r\n    '#76375f',\r\n    '#76365e',\r\n    '#76365e',\r\n    '#76375f',\r\n    '#763860',\r\n    '#773861',\r\n    '#783860',\r\n    '#783860',\r\n    '#783861',\r\n    '#793861',\r\n    '#793862',\r\n    '#793762',\r\n    '#793761',\r\n    '#7b3962',\r\n    '#7b3962',\r\n    '#7a3962',\r\n    '#7a3962',\r\n    '#7b3963',\r\n    '#7c3964',\r\n    '#7d3a64',\r\n    '#7d3b64',\r\n    '#7d3a65',\r\n    '#7d3a65',\r\n    '#7d3a65',\r\n    '#7e3b65',\r\n    '#803b66',\r\n    '#7f3a66',\r\n    '#7e3a66',\r\n    '#7f3a67',\r\n    '#7f3b67',\r\n    '#803c67',\r\n    '#803c67',\r\n    '#7f3b67',\r\n    '#813c68',\r\n    '#823b69',\r\n    '#823b69',\r\n    '#813b69',\r\n    '#823c69',\r\n    '#823c69',\r\n    '#823c69',\r\n    '#823c69',\r\n    '#843d6a',\r\n    '#843d6a',\r\n    '#843d6a',\r\n    '#843c6b',\r\n    '#863c6c',\r\n    '#853c6c',\r\n    '#853d6c',\r\n    '#863e6c',\r\n    '#863d6c',\r\n    '#873d6c',\r\n    '#873d6c',\r\n    '#873d6d',\r\n    '#893e6e',\r\n    '#8a3e6f',\r\n    '#8a3e6f',\r\n    '#893e6e',\r\n    '#893d6e',\r\n    '#893e6e',\r\n    '#8a3f6f',\r\n    '#8b3f70',\r\n    '#8b3f71',\r\n    '#8b3e70',\r\n    '#8b3e70',\r\n    '#8c3f70',\r\n    '#8c4071',\r\n    '#8c4070',\r\n    '#8c4070',\r\n    '#8d4071',\r\n    '#8d4072',\r\n    '#8d4072',\r\n    '#8f4073',\r\n    '#8f4074',\r\n    '#8f4073',\r\n    '#8f4173',\r\n    '#8f4173',\r\n    '#904173',\r\n    '#904174',\r\n    '#904175',\r\n    '#904175',\r\n    '#914175',\r\n    '#924175',\r\n    '#924275',\r\n    '#924275',\r\n    '#914175',\r\n    '#924277',\r\n    '#934277',\r\n    '#934277',\r\n    '#944278',\r\n    '#954277',\r\n    '#954278',\r\n    '#954278',\r\n    '#954278',\r\n    '#954378',\r\n    '#964378',\r\n    '#964379',\r\n    '#96447a',\r\n    '#96437a',\r\n    '#96437a',\r\n    '#98437a',\r\n    '#98447b',\r\n    '#98457b',\r\n    '#98457b',\r\n    '#98457b',\r\n    '#99447b',\r\n    '#9a457d',\r\n    '#9b457d',\r\n    '#9b457d',\r\n    '#9a447c',\r\n    '#9a457c',\r\n    '#9b457c',\r\n    '#9b457e',\r\n    '#9b467e',\r\n    '#9c467e',\r\n    '#9d467f',\r\n    '#9e467f',\r\n    '#9d467f',\r\n    '#9e467e',\r\n    '#9e477f',\r\n    '#9e4780',\r\n    '#9e477f',\r\n    '#9f4680',\r\n    '#a04680',\r\n    '#a04880',\r\n    '#a04881',\r\n    '#a04881',\r\n    '#a04881',\r\n    '#a24883',\r\n    '#a24883',\r\n    '#a24882',\r\n    '#a24883',\r\n    '#a24883',\r\n    '#a24883',\r\n    '#a24883',\r\n    '#a34983',\r\n    '#a34983',\r\n    '#a34984',\r\n    '#a44985',\r\n    '#a54986',\r\n    '#a54986',\r\n    '#a54986',\r\n    '#a54a85',\r\n    '#a54a85',\r\n    '#a54a85',\r\n    '#a64a86',\r\n    '#a74a87',\r\n    '#a84a88',\r\n    '#a84a88',\r\n    '#a74a87',\r\n    '#a84b87',\r\n    '#a84b88',\r\n    '#a84b88',\r\n    '#a84b88',\r\n    '#a94b89',\r\n    '#aa4b89',\r\n    '#ab4b89',\r\n    '#ab4b89',\r\n    '#ab4c8a',\r\n    '#aa4c8a',\r\n    '#aa4c8a',\r\n    '#ab4c8a',\r\n    '#ad4c8b',\r\n    '#ad4c8b',\r\n    '#ad4c8b',\r\n    '#ad4c8c',\r\n    '#ae4d8d',\r\n    '#ae4c8c',\r\n    '#ae4d8d',\r\n    '#af4e8e',\r\n    '#af4e8d',\r\n    '#b04e8d',\r\n    '#b04e8d',\r\n    '#b04d8e',\r\n    '#b04e8e',\r\n    '#b04d8e',\r\n    '#b04e8e',\r\n    '#b14f8f',\r\n    '#b14e90',\r\n    '#b14e90',\r\n    '#b14f90',\r\n    '#b25090',\r\n    '#b34f90',\r\n    '#b34f90',\r\n    '#b34f90',\r\n    '#b35091',\r\n    '#b44f91',\r\n    '#b55092',\r\n    '#b55092',\r\n    '#b55092',\r\n    '#b55192',\r\n    '#b55092',\r\n    '#b55092',\r\n    '#b55093',\r\n    '#b65094',\r\n    '#b75194',\r\n    '#b85193',\r\n    '#b75093',\r\n    '#b85095',\r\n    '#b85095',\r\n    '#b85295',\r\n    '#b85295',\r\n    '#ba5296',\r\n    '#b95197',\r\n    '#b95197',\r\n    '#ba5297',\r\n    '#ba5297',\r\n    '#ba5296',\r\n    '#ba5296',\r\n    '#bb5397',\r\n    '#bc5297',\r\n    '#bd5298',\r\n    '#bd5499',\r\n    '#bc5499',\r\n    '#bc5499',\r\n    '#bc5499',\r\n    '#bd5499',\r\n    '#be549a',\r\n    '#bf549b',\r\n    '#bf549b',\r\n    '#bf549b',\r\n    '#bf549b',\r\n    '#c0559b',\r\n    '#c0559b',\r\n    '#c0559b',\r\n    '#c0559b',\r\n    '#c0549c',\r\n    '#c0549c',\r\n    '#c2569c',\r\n    '#c2569d',\r\n    '#c2569e',\r\n    '#c2569e',\r\n    '#c4569e',\r\n    '#c4569e',\r\n    '#c4569f',\r\n    '#c3579e',\r\n    '#c3579e',\r\n    '#c5579e',\r\n    '#c658a0',\r\n    '#c5579f',\r\n    '#c4579f',\r\n    '#c557a0',\r\n    '#c757a0',\r\n    '#c657a0',\r\n    '#c658a1',\r\n    '#c759a2',\r\n    '#c758a2',\r\n    '#c758a2',\r\n    '#c858a2',\r\n    '#c959a3',\r\n    '#ca59a3',\r\n    '#c958a2',\r\n    '#c958a2',\r\n    '#c959a3',\r\n    '#ca59a4',\r\n    '#cb59a4',\r\n    '#cb59a4',\r\n    '#cb59a4',\r\n    '#cb5aa5',\r\n    '#cc5ba5',\r\n    '#cc5ba5',\r\n    '#cc5aa5',\r\n    '#cd5ba6',\r\n    '#cd5ba6',\r\n    '#cd5ba6',\r\n    '#ce5ba7',\r\n    '#ce5ca7',\r\n    '#cf5ca7',\r\n    '#cf5ca7',\r\n    '#cf5ca7',\r\n    '#d05ca8',\r\n    '#d05ba9',\r\n    '#d05ba9',\r\n    '#d05ba9',\r\n    '#d15ca9',\r\n    '#d15da9',\r\n    '#d15da9',\r\n    '#d15ca9',\r\n    '#d25caa',\r\n    '#d25dab',\r\n    '#d25eab',\r\n    '#d25eab',\r\n    '#d35eab',\r\n    '#d35dab',\r\n    '#d35dab',\r\n    '#d45eac',\r\n    '#d45dac',\r\n    '#d55ead',\r\n    '#d55ead',\r\n    '#d55dad',\r\n    '#d65eac',\r\n    '#d65fad',\r\n    '#d65fae',\r\n    '#d65fae',\r\n    '#d75fae',\r\n    '#d75fae',\r\n    '#d75fae',\r\n    '#d75fae',\r\n    '#d75faf',\r\n    '#d760b0',\r\n    '#d960b0',\r\n    '#d95fb0',\r\n    '#d961b0',\r\n    '#d961b1',\r\n    '#d961b1',\r\n    '#da61b0',\r\n    '#dc61b2',\r\n    '#dc60b2',\r\n    '#db60b2',\r\n    '#db61b2',\r\n    '#dc61b2',\r\n    '#dd61b3',\r\n    '#dd61b3',\r\n    '#dd62b3',\r\n    '#de62b3',\r\n    '#de63b4',\r\n    '#de63b5',\r\n    '#dd62b4',\r\n    '#de62b4',\r\n    '#df63b5',\r\n    '#e063b5',\r\n    '#e063b5',\r\n    '#e063b6',\r\n    '#e164b6',\r\n    '#e164b6',\r\n    '#e164b6',\r\n    '#e164b7',\r\n    '#e264b7',\r\n    '#e264b7',\r\n    '#e264b7',\r\n    '#e264b8',\r\n    '#e265b8',\r\n    '#e265b8',\r\n    '#e365b8',\r\n    '#e364b8',\r\n    '#e465b9',\r\n    '#e565ba',\r\n    '#e565ba',\r\n    '#e566b9',\r\n    '#e566ba',\r\n    '#e566bb',\r\n    '#e666ba',\r\n    '#e766bb',\r\n    '#e665bb',\r\n    '#e665bb',\r\n    '#e666bb',\r\n    '#e867bc',\r\n    '#e867bc',\r\n    '#e867bc',\r\n    '#e867bc',\r\n    '#e968bd',\r\n    '#e967be',\r\n    '#e968be',\r\n    '#e969bd',\r\n    '#ea68bf',\r\n    '#ea69bf',\r\n    '#ea69bf',\r\n    '#eb69c0',\r\n    '#eb69c0',\r\n    '#eb6ac0',\r\n    '#eb6ac0',\r\n    '#ec6ac1',\r\n    '#ed6ac2',\r\n    '#ec6bc2',\r\n    '#ec6bc2',\r\n    '#ed6bc2',\r\n    '#ed6bc3',\r\n    '#ed6bc3',\r\n    '#ed6bc3',\r\n    '#ee6bc2',\r\n    '#ef6bc3',\r\n    '#ef6cc3',\r\n    '#ef6cc3',\r\n    '#f06cc4',\r\n    '#f06cc5',\r\n    '#f16cc4',\r\n    '#f16cc4',\r\n    '#f16cc5',\r\n    '#f16dc6',\r\n    '#f16dc6',\r\n    '#f36dc6',\r\n    '#f36dc7',\r\n    '#f36dc6',\r\n    '#f36dc7',\r\n    '#f36dc7',\r\n    '#f46dc7',\r\n    '#f56ec7',\r\n    '#f46ec7',\r\n    '#f46ec7',\r\n    '#f46ec8',\r\n    '#f56ec8',\r\n    '#f56fc8',\r\n    '#f66fc8',\r\n    '#f76fc9',\r\n    '#f76fc9',\r\n    '#f76fc9',\r\n    '#f86fca',\r\n    '#f970cb',\r\n    '#f971cb',\r\n    '#f870cb',\r\n    '#f870cb',\r\n    '#f870cc',\r\n    '#f970cd',\r\n    '#fa71cd',\r\n    '#fa71cd',\r\n    '#fa71cd',\r\n    '#fa72ce',\r\n    '#fb71ce',\r\n    '#fb71ce',\r\n    '#fb71ce',\r\n    '#fc72cf',\r\n    '#fb72ce',\r\n    '#fb72ce',\r\n    '#fc72cf',\r\n    '#fd72d0',\r\n    '#fe73d1',\r\n    '#ff73d1',\r\n    '#ff72d1',\r\n    '#fe72d1',\r\n    '#ff73d2',\r\n    '#ff74d2',\r\n    '#fe74d2',\r\n    '#02dfce',\r\n    '#02dece',\r\n    '#02dece',\r\n    '#03dfce',\r\n    '#03dfce',\r\n    '#03dfcd',\r\n    '#03ddcd',\r\n    '#03ddcd',\r\n    '#03ddcc',\r\n    '#02dccb',\r\n    '#02dccb',\r\n    '#03dccc',\r\n    '#03dbcb',\r\n    '#03dbca',\r\n    '#03dbca',\r\n    '#03dbca',\r\n    '#03daca',\r\n    '#04dbcb',\r\n    '#04dacb',\r\n    '#03d9ca',\r\n    '#03d8c9',\r\n    '#04d9c9',\r\n    '#04dac9',\r\n    '#04d9c9',\r\n    '#04d9c8',\r\n    '#04d7c7',\r\n    '#04d6c7',\r\n    '#04d7c8',\r\n    '#05d7c7',\r\n    '#05d6c7',\r\n    '#05d6c7',\r\n    '#04d6c7',\r\n    '#05d5c6',\r\n    '#05d5c6',\r\n    '#05d5c6',\r\n    '#05d5c5',\r\n    '#06d4c5',\r\n    '#05d4c5',\r\n    '#05d4c5',\r\n    '#06d4c5',\r\n    '#06d3c4',\r\n    '#06d2c4',\r\n    '#06d2c4',\r\n    '#06d2c3',\r\n    '#06d2c3',\r\n    '#07d2c2',\r\n    '#07d0c1',\r\n    '#07d0c2',\r\n    '#07d0c1',\r\n    '#07cfc1',\r\n    '#07cfc1',\r\n    '#07d0c1',\r\n    '#09cfc0',\r\n    '#08cfc0',\r\n    '#09cfc0',\r\n    '#0acec1',\r\n    '#0acec0',\r\n    '#09cdbf',\r\n    '#09cdbf',\r\n    '#0acebf',\r\n    '#0accbe',\r\n    '#0bccbf',\r\n    '#0bccbf',\r\n    '#0bccbe',\r\n    '#0bcbbe',\r\n    '#0bcbbe',\r\n    '#0bcbbd',\r\n    '#0ccabc',\r\n    '#0ccbbd',\r\n    '#0dcbbd',\r\n    '#0dcabc',\r\n    '#0cc9bb',\r\n    '#0dc8ba',\r\n    '#0ec9bb',\r\n    '#0ec9bb',\r\n    '#0dc8ba',\r\n    '#0ec8bb',\r\n    '#0dc7ba',\r\n    '#0ec7ba',\r\n    '#0fc7ba',\r\n    '#0ec6b9',\r\n    '#0fc6b9',\r\n    '#0fc6b9',\r\n    '#0fc5b8',\r\n    '#0fc6b8',\r\n    '#0fc6b8',\r\n    '#0fc4b8',\r\n    '#10c4b7',\r\n    '#10c4b7',\r\n    '#10c3b6',\r\n    '#10c3b6',\r\n    '#10c3b6',\r\n    '#12c2b6',\r\n    '#11c2b6',\r\n    '#11c2b6',\r\n    '#12c3b6',\r\n    '#12c2b5',\r\n    '#12c1b5',\r\n    '#12c0b5',\r\n    '#13c0b4',\r\n    '#13c1b4',\r\n    '#13c0b3',\r\n    '#13bfb3',\r\n    '#13c0b4',\r\n    '#13bfb2',\r\n    '#13beb3',\r\n    '#13beb3',\r\n    '#13bfb2',\r\n    '#14beb1',\r\n    '#14beb1',\r\n    '#14beb1',\r\n    '#14bdb1',\r\n    '#14bdb1',\r\n    '#15bdb1',\r\n    '#16bdb1',\r\n    '#15bcb0',\r\n    '#16baaf',\r\n    '#16bab0',\r\n    '#16bbb0',\r\n    '#15bbaf',\r\n    '#15b9ae',\r\n    '#15b9ae',\r\n    '#16baae',\r\n    '#17baae',\r\n    '#17b9ae',\r\n    '#17b8ae',\r\n    '#17b8ac',\r\n    '#17b8ac',\r\n    '#18b8ac',\r\n    '#18b7ab',\r\n    '#18b7ab',\r\n    '#18b7ab',\r\n    '#19b7ac',\r\n    '#18b7ac',\r\n    '#18b5ac',\r\n    '#18b5ab',\r\n    '#18b5aa',\r\n    '#19b4aa',\r\n    '#1ab4aa',\r\n    '#1ab5aa',\r\n    '#19b3a9',\r\n    '#19b3a9',\r\n    '#19b4a9',\r\n    '#19b4a9',\r\n    '#19b2a8',\r\n    '#1ab3a8',\r\n    '#1ab3a8',\r\n    '#1ab2a7',\r\n    '#1bb1a7',\r\n    '#1ab0a7',\r\n    '#1ab0a7',\r\n    '#1ab0a7',\r\n    '#1bb1a6',\r\n    '#1bb1a6',\r\n    '#1bafa6',\r\n    '#1bafa6',\r\n    '#1cafa5',\r\n    '#1cafa5',\r\n    '#1cafa5',\r\n    '#1caea4',\r\n    '#1caea4',\r\n    '#1caea4',\r\n    '#1caea4',\r\n    '#1cada3',\r\n    '#1caca2',\r\n    '#1caca2',\r\n    '#1caca2',\r\n    '#1caca2',\r\n    '#1eaba2',\r\n    '#1eaca2',\r\n    '#1eaca2',\r\n    '#1eaba2',\r\n    '#1daaa1',\r\n    '#1ea9a1',\r\n    '#1ea9a1',\r\n    '#1daaa0',\r\n    '#1ea89f',\r\n    '#1fa9a0',\r\n    '#1fa8a0',\r\n    '#1ea79f',\r\n    '#1fa79e',\r\n    '#1fa89f',\r\n    '#1fa79e',\r\n    '#1ea69d',\r\n    '#1ea79d',\r\n    '#1ea79c',\r\n    '#1ea59c',\r\n    '#1ea59c',\r\n    '#20a59c',\r\n    '#1fa59c',\r\n    '#1fa59c',\r\n    '#20a49b',\r\n    '#20a49c',\r\n    '#1fa49c',\r\n    '#1fa49a',\r\n    '#1fa39a',\r\n    '#20a29a',\r\n    '#20a39a',\r\n    '#20a39a',\r\n    '#20a29a',\r\n    '#21a199',\r\n    '#21a099',\r\n    '#21a099',\r\n    '#21a198',\r\n    '#21a098',\r\n    '#219f98',\r\n    '#219f98',\r\n    '#21a098',\r\n    '#219f97',\r\n    '#219f97',\r\n    '#219e97',\r\n    '#219d96',\r\n    '#219d97',\r\n    '#229d96',\r\n    '#229d96',\r\n    '#229d96',\r\n    '#229c95',\r\n    '#239d95',\r\n    '#239d95',\r\n    '#239c95',\r\n    '#229a94',\r\n    '#229a93',\r\n    '#229a93',\r\n    '#239b93',\r\n    '#229a93',\r\n    '#239892',\r\n    '#239892',\r\n    '#239992',\r\n    '#249991',\r\n    '#249991',\r\n    '#249791',\r\n    '#239791',\r\n    '#249791',\r\n    '#249791',\r\n    '#249791',\r\n    '#239690',\r\n    '#239590',\r\n    '#24968f',\r\n    '#24968f',\r\n    '#23958f',\r\n    '#24958e',\r\n    '#24948e',\r\n    '#24948e',\r\n    '#24958e',\r\n    '#25938d',\r\n    '#25938d',\r\n    '#25938d',\r\n    '#24938c',\r\n    '#24928c',\r\n    '#25928c',\r\n    '#25928c',\r\n    '#25928c',\r\n    '#25918c',\r\n    '#25908b',\r\n    '#25908b',\r\n    '#25908b',\r\n    '#248f8a',\r\n    '#258f8a',\r\n    '#258f8a',\r\n    '#25908b',\r\n    '#258f8a',\r\n    '#248e89',\r\n    '#258e89',\r\n    '#268e89',\r\n    '#268e88',\r\n    '#268e88',\r\n    '#268d88',\r\n    '#268c88',\r\n    '#268c86',\r\n    '#268c86',\r\n    '#268c87',\r\n    '#268c87',\r\n    '#268b86',\r\n    '#268a87',\r\n    '#268a86',\r\n    '#268a85',\r\n    '#268a86',\r\n    '#268a86',\r\n    '#268884',\r\n    '#268884',\r\n    '#268884',\r\n    '#278783',\r\n    '#278783',\r\n    '#268883',\r\n    '#278682',\r\n    '#278682',\r\n    '#278682',\r\n    '#278682',\r\n    '#278681',\r\n    '#278681',\r\n    '#278581',\r\n    '#278480',\r\n    '#278580',\r\n    '#278480',\r\n    '#278381',\r\n    '#278481',\r\n    '#27837f',\r\n    '#288480',\r\n    '#288380',\r\n    '#27827f',\r\n    '#27827f',\r\n    '#27817e',\r\n    '#27817e',\r\n    '#27817e',\r\n    '#27807d',\r\n    '#27807d',\r\n    '#27807d',\r\n    '#28807d',\r\n    '#27807c',\r\n    '#277f7b',\r\n    '#277f7b',\r\n    '#277f7b',\r\n    '#287e7b',\r\n    '#287d7a',\r\n    '#287d7a',\r\n    '#297e7b',\r\n    '#297d7b',\r\n    '#297c7b',\r\n    '#297c7b',\r\n    '#297d7b',\r\n    '#287b79',\r\n    '#287c79',\r\n    '#287b79',\r\n    '#297a79',\r\n    '#297a78',\r\n    '#297b78',\r\n    '#297b78',\r\n    '#287a77',\r\n    '#287976',\r\n    '#287876',\r\n    '#287876',\r\n    '#287876',\r\n    '#287775',\r\n    '#297876',\r\n    '#297976',\r\n    '#297776',\r\n    '#287675',\r\n    '#297776',\r\n    '#297775',\r\n    '#287674',\r\n    '#297574',\r\n    '#297574',\r\n    '#297574',\r\n    '#297474',\r\n    '#287472',\r\n    '#297472',\r\n    '#297472',\r\n    '#297472',\r\n    '#297271',\r\n    '#287271',\r\n    '#287271',\r\n    '#297271',\r\n    '#297271',\r\n    '#287171',\r\n    '#28716f',\r\n    '#29716f',\r\n    '#28706f',\r\n    '#297070',\r\n    '#297070',\r\n    '#296f6f',\r\n    '#296f6f',\r\n    '#286e6e',\r\n    '#286e6e',\r\n    '#286f6e',\r\n    '#296e6e',\r\n    '#286d6d',\r\n    '#286d6d',\r\n    '#296d6d',\r\n    '#296e6d',\r\n    '#296e6d',\r\n    '#296c6b',\r\n    '#286c6b',\r\n    '#286c6b',\r\n    '#296c6b',\r\n    '#296a6b',\r\n    '#286a6a',\r\n    '#286a6a',\r\n    '#296969',\r\n    '#2a6969',\r\n    '#296969',\r\n    '#296869',\r\n    '#2a6969',\r\n    '#2a6969',\r\n    '#2a6969',\r\n    '#2a6868',\r\n    '#296768',\r\n    '#296768',\r\n    '#2a6767',\r\n    '#2a6767',\r\n    '#2a6767',\r\n    '#2a6567',\r\n    '#296566',\r\n    '#286666',\r\n    '#286565',\r\n    '#286565',\r\n    '#296565',\r\n    '#286465',\r\n    '#296464',\r\n    '#296464',\r\n    '#286364',\r\n    '#286263',\r\n    '#286263',\r\n    '#286263',\r\n    '#286163',\r\n    '#286062',\r\n    '#286062',\r\n    '#286162',\r\n    '#296163',\r\n    '#285f62',\r\n    '#296062',\r\n    '#296062',\r\n    '#295f61',\r\n    '#296061',\r\n    '#285f60',\r\n    '#285d5f',\r\n    '#285d5f',\r\n    '#285d60',\r\n    '#285c5f',\r\n    '#285c5e',\r\n    '#285c5f',\r\n    '#295b5e',\r\n    '#285b5d',\r\n    '#285b5d',\r\n    '#285c5d',\r\n    '#295c5d',\r\n    '#285b5c',\r\n    '#285b5c',\r\n    '#285b5c',\r\n    '#285a5d',\r\n    '#28595d',\r\n    '#28595b',\r\n    '#28595b',\r\n    '#29585c',\r\n    '#28585b',\r\n    '#28585a',\r\n    '#28575a',\r\n    '#29585b',\r\n    '#29585b',\r\n    '#29575a',\r\n    '#295659',\r\n    '#285558',\r\n    '#285658',\r\n    '#285658',\r\n    '#295558',\r\n    '#295557',\r\n    '#285457',\r\n    '#285357',\r\n    '#285457',\r\n    '#285356',\r\n    '#295456',\r\n    '#295356',\r\n    '#285256',\r\n    '#295256',\r\n    '#285255',\r\n    '#285255',\r\n    '#295255',\r\n    '#295155',\r\n    '#284f54',\r\n    '#274f54',\r\n    '#275054',\r\n    '#275054',\r\n    '#275054',\r\n    '#274e52',\r\n    '#274e52',\r\n    '#284e52',\r\n    '#274d51',\r\n    '#274d51',\r\n    '#274e52',\r\n    '#274c50',\r\n    '#274c50',\r\n    '#274e51',\r\n    '#284e51',\r\n    '#274c50',\r\n    '#284c50',\r\n    '#284b50',\r\n    '#274a50',\r\n    '#284a50',\r\n    '#284a50',\r\n    '#28494e',\r\n    '#27484e',\r\n    '#274a4e',\r\n    '#274a4d',\r\n    '#27494d',\r\n    '#28484e',\r\n    '#27474c',\r\n    '#26484d',\r\n    '#26484d',\r\n    '#26484c',\r\n    '#25464b',\r\n    '#26464b',\r\n    '#26474b',\r\n    '#26474b',\r\n    '#26454a',\r\n    '#26454a',\r\n    '#26464a',\r\n    '#26464a',\r\n    '#254349',\r\n    '#264349',\r\n    '#264349',\r\n    '#26444a',\r\n  ],\r\n  nullColor: '#414554',\r\n}\r\n\r\nconst redGreenGradientBubbles = {\r\n  colors: [\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f63538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f53538',\r\n    '#f43538',\r\n    '#f43538',\r\n    '#f43538',\r\n    '#f43538',\r\n    '#f43538',\r\n    '#f43538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f33538',\r\n    '#f23538',\r\n    '#f23538',\r\n    '#f23538',\r\n    '#f23538',\r\n    '#f13538',\r\n    '#f13538',\r\n    '#f13538',\r\n    '#f13538',\r\n    '#f03538',\r\n    '#f03538',\r\n    '#f03538',\r\n    '#f03538',\r\n    '#f03538',\r\n    '#f03538',\r\n    '#ef3538',\r\n    '#ef3538',\r\n    '#ef3538',\r\n    '#ef3538',\r\n    '#ef3538',\r\n    '#ef3538',\r\n    '#ee3639',\r\n    '#ee3639',\r\n    '#ee3639',\r\n    '#ed3639',\r\n    '#ed3639',\r\n    '#ed3639',\r\n    '#ec3639',\r\n    '#ec3639',\r\n    '#ec3639',\r\n    '#eb3639',\r\n    '#eb3639',\r\n    '#eb3639',\r\n    '#eb3639',\r\n    '#eb3639',\r\n    '#ea3639',\r\n    '#ea3639',\r\n    '#ea3639',\r\n    '#e93639',\r\n    '#e93639',\r\n    '#e83538',\r\n    '#e83538',\r\n    '#e83538',\r\n    '#e73538',\r\n    '#e73538',\r\n    '#e73538',\r\n    '#e63538',\r\n    '#e63639',\r\n    '#e63639',\r\n    '#e63639',\r\n    '#e63639',\r\n    '#e53639',\r\n    '#e53639',\r\n    '#e53639',\r\n    '#e53639',\r\n    '#e53639',\r\n    '#e53639',\r\n    '#e43639',\r\n    '#e43639',\r\n    '#e43639',\r\n    '#e33639',\r\n    '#e33639',\r\n    '#e33639',\r\n    '#e23639',\r\n    '#e23639',\r\n    '#e23639',\r\n    '#e13639',\r\n    '#e13639',\r\n    '#e13639',\r\n    '#e03639',\r\n    '#e0363a',\r\n    '#e0363a',\r\n    '#e0363a',\r\n    '#df363a',\r\n    '#df363a',\r\n    '#df363a',\r\n    '#de363a',\r\n    '#de363a',\r\n    '#de363a',\r\n    '#de363a',\r\n    '#de363a',\r\n    '#de363a',\r\n    '#dd363a',\r\n    '#dd373b',\r\n    '#dd373b',\r\n    '#dc373b',\r\n    '#dc373b',\r\n    '#dc373b',\r\n    '#db373b',\r\n    '#db373b',\r\n    '#db373b',\r\n    '#da373b',\r\n    '#da373d',\r\n    '#da373d',\r\n    '#d9373d',\r\n    '#d9373d',\r\n    '#d9373d',\r\n    '#d9373d',\r\n    '#d9373d',\r\n    '#d8373e',\r\n    '#d8373e',\r\n    '#d7383e',\r\n    '#d7383e',\r\n    '#d7383e',\r\n    '#d6383e',\r\n    '#d6383e',\r\n    '#d5383e',\r\n    '#d5383e',\r\n    '#d4383e',\r\n    '#d4383e',\r\n    '#d4383f',\r\n    '#d3383f',\r\n    '#d3383f',\r\n    '#d3393f',\r\n    '#d33940',\r\n    '#d23940',\r\n    '#d23940',\r\n    '#d13940',\r\n    '#d13941',\r\n    '#d03941',\r\n    '#d03941',\r\n    '#cf3941',\r\n    '#cf3942',\r\n    '#cf3942',\r\n    '#cf3a42',\r\n    '#ce3a42',\r\n    '#cd3a43',\r\n    '#cd3a43',\r\n    '#cc3943',\r\n    '#cc3943',\r\n    '#cb3944',\r\n    '#cb3944',\r\n    '#ca3944',\r\n    '#ca3944',\r\n    '#c93a45',\r\n    '#c93a45',\r\n    '#c83a45',\r\n    '#c73a45',\r\n    '#c73a45',\r\n    '#c53a45',\r\n    '#c53a45',\r\n    '#c43a45',\r\n    '#c43a46',\r\n    '#c43a46',\r\n    '#c43c46',\r\n    '#c33c47',\r\n    '#c33c47',\r\n    '#c23c47',\r\n    '#c23c47',\r\n    '#c13c48',\r\n    '#c13c48',\r\n    '#c03c48',\r\n    '#c03c48',\r\n    '#bf3c48',\r\n    '#bf3d4a',\r\n    '#be3d4a',\r\n    '#be3d4a',\r\n    '#bd3d4a',\r\n    '#bd3d4b',\r\n    '#bc3d4b',\r\n    '#bc3d4b',\r\n    '#bb3d4b',\r\n    '#bb3d4b',\r\n    '#bb3d4c',\r\n    '#bb3d4c',\r\n    '#ba3d4c',\r\n    '#ba3e4c',\r\n    '#b83e4c',\r\n    '#b83e4c',\r\n    '#b83e4c',\r\n    '#b73e4c',\r\n    '#b73e4c',\r\n    '#b63e4c',\r\n    '#b63e4c',\r\n    '#b53e4d',\r\n    '#b53e4d',\r\n    '#b53e4d',\r\n    '#b43e4d',\r\n    '#b43e4d',\r\n    '#b33e4d',\r\n    '#b33f4d',\r\n    '#b23f4e',\r\n    '#b23f4e',\r\n    '#b23f4e',\r\n    '#b13f4e',\r\n    '#b13f4e',\r\n    '#b03e4e',\r\n    '#b03e4e',\r\n    '#b03e4f',\r\n    '#b03e4f',\r\n    '#b03e4f',\r\n    '#ae3e4f',\r\n    '#ae3e4f',\r\n    '#ad3e4f',\r\n    '#ad3e4f',\r\n    '#ac3e4f',\r\n    '#ac3f50',\r\n    '#ab3f50',\r\n    '#ab3f50',\r\n    '#aa3f50',\r\n    '#aa3f50',\r\n    '#a93f50',\r\n    '#a93f50',\r\n    '#a73f50',\r\n    '#a73f50',\r\n    '#a63f50',\r\n    '#a63f51',\r\n    '#a53f51',\r\n    '#a53f51',\r\n    '#a43f50',\r\n    '#a43f50',\r\n    '#a43f50',\r\n    '#a43f50',\r\n    '#a24050',\r\n    '#a24050',\r\n    '#a14050',\r\n    '#a04051',\r\n    '#a04051',\r\n    '#9f4051',\r\n    '#9f4051',\r\n    '#9e4051',\r\n    '#9c4051',\r\n    '#9c4051',\r\n    '#9b4051',\r\n    '#9a4051',\r\n    '#9a4053',\r\n    '#994053',\r\n    '#994153',\r\n    '#984153',\r\n    '#974153',\r\n    '#974153',\r\n    '#964153',\r\n    '#954153',\r\n    '#954153',\r\n    '#934054',\r\n    '#934054',\r\n    '#924054',\r\n    '#914054',\r\n    '#914054',\r\n    '#904053',\r\n    '#8e4053',\r\n    '#8e4153',\r\n    '#8d4153',\r\n    '#8d4153',\r\n    '#8d4154',\r\n    '#8b4154',\r\n    '#8b4154',\r\n    '#8a4154',\r\n    '#894154',\r\n    '#894154',\r\n    '#884154',\r\n    '#884154',\r\n    '#864154',\r\n    '#864154',\r\n    '#854154',\r\n    '#844155',\r\n    '#844255',\r\n    '#824255',\r\n    '#824255',\r\n    '#824255',\r\n    '#824255',\r\n    '#814255',\r\n    '#814255',\r\n    '#804255',\r\n    '#804255',\r\n    '#7e4255',\r\n    '#7e4255',\r\n    '#7d4255',\r\n    '#7d4256',\r\n    '#7c4256',\r\n    '#7c4256',\r\n    '#7b4256',\r\n    '#7b4256',\r\n    '#7b4256',\r\n    '#794256',\r\n    '#794256',\r\n    '#784256',\r\n    '#784356',\r\n    '#774256',\r\n    '#774256',\r\n    '#774256',\r\n    '#764256',\r\n    '#764256',\r\n    '#764256',\r\n    '#754256',\r\n    '#754256',\r\n    '#744255',\r\n    '#744255',\r\n    '#744255',\r\n    '#734255',\r\n    '#734255',\r\n    '#734255',\r\n    '#724255',\r\n    '#724255',\r\n    '#724255',\r\n    '#714255',\r\n    '#714255',\r\n    '#6f4255',\r\n    '#6f4255',\r\n    '#6f4255',\r\n    '#6e4255',\r\n    '#6e4255',\r\n    '#6e4255',\r\n    '#6d4255',\r\n    '#6d4255',\r\n    '#6d4255',\r\n    '#6c4255',\r\n    '#6c4255',\r\n    '#6c4255',\r\n    '#6b4155',\r\n    '#6b4155',\r\n    '#694155',\r\n    '#694155',\r\n    '#694155',\r\n    '#684155',\r\n    '#684155',\r\n    '#684155',\r\n    '#684155',\r\n    '#684155',\r\n    '#674155',\r\n    '#674155',\r\n    '#674155',\r\n    '#664154',\r\n    '#664154',\r\n    '#654154',\r\n    '#654154',\r\n    '#654154',\r\n    '#634154',\r\n    '#634154',\r\n    '#624154',\r\n    '#624154',\r\n    '#614154',\r\n    '#614154',\r\n    '#614154',\r\n    '#604054',\r\n    '#604054',\r\n    '#5f4054',\r\n    '#5f4054',\r\n    '#5f4054',\r\n    '#5e4054',\r\n    '#5e4054',\r\n    '#5d4054',\r\n    '#5d4054',\r\n    '#5d4054',\r\n    '#5c4053',\r\n    '#5c4053',\r\n    '#5c4053',\r\n    '#5b4053',\r\n    '#5b4053',\r\n    '#5a4053',\r\n    '#5a4053',\r\n    '#5a4053',\r\n    '#593f53',\r\n    '#593f53',\r\n    '#593f53',\r\n    '#583f53',\r\n    '#583f53',\r\n    '#583f53',\r\n    '#573f53',\r\n    '#573e53',\r\n    '#573e53',\r\n    '#563e53',\r\n    '#563e53',\r\n    '#563e53',\r\n    '#563e53',\r\n    '#553e52',\r\n    '#553e52',\r\n    '#553e52',\r\n    '#543e52',\r\n    '#543e52',\r\n    '#543e52',\r\n    '#543e52',\r\n    '#543e52',\r\n    '#533e52',\r\n    '#533e52',\r\n    '#533e52',\r\n    '#533e52',\r\n    '#533e52',\r\n    '#523e51',\r\n    '#523e51',\r\n    '#523e51',\r\n    '#523e51',\r\n    '#523e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#513e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503e51',\r\n    '#503f51',\r\n    '#503f51',\r\n    '#4f3f51',\r\n    '#4f3f51',\r\n    '#4f3f51',\r\n    '#4d3f51',\r\n    '#4d3f51',\r\n    '#4d4151',\r\n    '#4b4151',\r\n    '#4b4151',\r\n    '#4a4152',\r\n    '#494152',\r\n    '#484253',\r\n    '#484253',\r\n    '#474253',\r\n    '#474253',\r\n    '#464353',\r\n    '#454353',\r\n    '#454353',\r\n    '#444454',\r\n    '#444454',\r\n    '#434454',\r\n    '#434454',\r\n    '#424454',\r\n    '#424554',\r\n    '#424554',\r\n    '#424554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#414554',\r\n    '#404654',\r\n    '#404654',\r\n    '#404654',\r\n    '#404653',\r\n    '#404653',\r\n    '#3f4653',\r\n    '#3f4753',\r\n    '#3f4753',\r\n    '#3e4753',\r\n    '#3e4753',\r\n    '#3e4852',\r\n    '#3d4852',\r\n    '#3d4852',\r\n    '#3c4951',\r\n    '#3c4951',\r\n    '#3b4951',\r\n    '#3b4a51',\r\n    '#3b4a50',\r\n    '#3b4a50',\r\n    '#3a4c50',\r\n    '#394c50',\r\n    '#394c50',\r\n    '#394c50',\r\n    '#394c50',\r\n    '#394c50',\r\n    '#384c4f',\r\n    '#384c4f',\r\n    '#384c4f',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384d50',\r\n    '#384e50',\r\n    '#364e50',\r\n    '#364e4f',\r\n    '#364e4f',\r\n    '#364e4f',\r\n    '#364e4f',\r\n    '#364e4f',\r\n    '#364f4f',\r\n    '#364f4f',\r\n    '#354f4f',\r\n    '#354f4f',\r\n    '#354f4f',\r\n    '#354f4f',\r\n    '#35514f',\r\n    '#35514f',\r\n    '#35514f',\r\n    '#34514f',\r\n    '#34514f',\r\n    '#34524f',\r\n    '#34524f',\r\n    '#34524f',\r\n    '#34524f',\r\n    '#33524e',\r\n    '#33534e',\r\n    '#33534e',\r\n    '#33534e',\r\n    '#32534e',\r\n    '#32544e',\r\n    '#32544e',\r\n    '#32544e',\r\n    '#32544e',\r\n    '#31554e',\r\n    '#31554e',\r\n    '#31554e',\r\n    '#31564d',\r\n    '#31564d',\r\n    '#31564d',\r\n    '#31564d',\r\n    '#31574d',\r\n    '#30574d',\r\n    '#30574d',\r\n    '#30584d',\r\n    '#30584d',\r\n    '#2f584d',\r\n    '#2f594d',\r\n    '#2f594d',\r\n    '#2f594c',\r\n    '#2e5a4c',\r\n    '#2e5a4c',\r\n    '#2e5a4c',\r\n    '#2d5b4c',\r\n    '#2d5b4c',\r\n    '#2d5b4c',\r\n    '#2d5b4c',\r\n    '#2c5c4c',\r\n    '#2c5c4c',\r\n    '#2c5c4c',\r\n    '#2b5d4b',\r\n    '#2b5d4b',\r\n    '#2b5d4b',\r\n    '#2b5e4b',\r\n    '#2a5e4b',\r\n    '#2a5e4b',\r\n    '#2a5f4b',\r\n    '#2a5f4b',\r\n    '#2a5f4b',\r\n    '#2a604b',\r\n    '#2a604b',\r\n    '#2a604b',\r\n    '#29624b',\r\n    '#29624b',\r\n    '#29624b',\r\n    '#29624b',\r\n    '#29634b',\r\n    '#29634b',\r\n    '#29634b',\r\n    '#29644b',\r\n    '#28644b',\r\n    '#28644b',\r\n    '#28644b',\r\n    '#28654b',\r\n    '#28654a',\r\n    '#27654a',\r\n    '#27664a',\r\n    '#27664a',\r\n    '#27664a',\r\n    '#27664a',\r\n    '#26684a',\r\n    '#26684a',\r\n    '#26684a',\r\n    '#26684a',\r\n    '#26694a',\r\n    '#25694a',\r\n    '#25694a',\r\n    '#25694a',\r\n    '#256a4a',\r\n    '#256a4a',\r\n    '#256a4a',\r\n    '#256a4a',\r\n    '#246a4a',\r\n    '#246b49',\r\n    '#246b49',\r\n    '#246b49',\r\n    '#246b49',\r\n    '#246c49',\r\n    '#246c49',\r\n    '#236c49',\r\n    '#236c49',\r\n    '#236e49',\r\n    '#236e49',\r\n    '#236e49',\r\n    '#236e49',\r\n    '#236f49',\r\n    '#236f49',\r\n    '#236f49',\r\n    '#226f49',\r\n    '#227049',\r\n    '#227049',\r\n    '#227049',\r\n    '#227149',\r\n    '#227149',\r\n    '#227149',\r\n    '#227149',\r\n    '#227349',\r\n    '#217349',\r\n    '#217349',\r\n    '#217449',\r\n    '#217449',\r\n    '#217449',\r\n    '#217449',\r\n    '#217549',\r\n    '#217549',\r\n    '#217549',\r\n    '#207649',\r\n    '#207649',\r\n    '#207649',\r\n    '#207847',\r\n    '#207847',\r\n    '#207847',\r\n    '#207947',\r\n    '#207947',\r\n    '#207947',\r\n    '#207947',\r\n    '#207947',\r\n    '#207947',\r\n    '#207b47',\r\n    '#207b47',\r\n    '#207b47',\r\n    '#207c47',\r\n    '#207c47',\r\n    '#207c47',\r\n    '#207d47',\r\n    '#207d47',\r\n    '#207e48',\r\n    '#207e48',\r\n    '#207e48',\r\n    '#208048',\r\n    '#208048',\r\n    '#208048',\r\n    '#208148',\r\n    '#208148',\r\n    '#208148',\r\n    '#208248',\r\n    '#1f8247',\r\n    '#1f8247',\r\n    '#1f8347',\r\n    '#1f8347',\r\n    '#1f8347',\r\n    '#1f8547',\r\n    '#1f8547',\r\n    '#1f8547',\r\n    '#1f8647',\r\n    '#1f8647',\r\n    '#1f8647',\r\n    '#1e8747',\r\n    '#1e8747',\r\n    '#1e8747',\r\n    '#1e8747',\r\n    '#1e8947',\r\n    '#1e8947',\r\n    '#1e8947',\r\n    '#1e8a47',\r\n    '#1e8a47',\r\n    '#1e8a47',\r\n    '#1e8b47',\r\n    '#1e8b47',\r\n    '#1e8b47',\r\n    '#1e8b47',\r\n    '#1e8c47',\r\n    '#1e8c47',\r\n    '#1e8c47',\r\n    '#1e8c47',\r\n    '#1e8e47',\r\n    '#1e8e47',\r\n    '#1e8e47',\r\n    '#1e8f47',\r\n    '#1d8f47',\r\n    '#1d8f47',\r\n    '#1d8f47',\r\n    '#1d9047',\r\n    '#1d9047',\r\n    '#1e9047',\r\n    '#1e9047',\r\n    '#1e9147',\r\n    '#1e9147',\r\n    '#1e9147',\r\n    '#1e9347',\r\n    '#1e9347',\r\n    '#1e9347',\r\n    '#1e9347',\r\n    '#1e9447',\r\n    '#1e9447',\r\n    '#1e9447',\r\n    '#1e9548',\r\n    '#1e9548',\r\n    '#1e9548',\r\n    '#1e9648',\r\n    '#1e9648',\r\n    '#1e9648',\r\n    '#1f9848',\r\n    '#1f9848',\r\n    '#1f9848',\r\n    '#209948',\r\n    '#209948',\r\n    '#209948',\r\n    '#209a48',\r\n    '#209a48',\r\n    '#209a48',\r\n    '#209b48',\r\n    '#209b48',\r\n    '#209b48',\r\n    '#209b48',\r\n    '#219c48',\r\n    '#219c48',\r\n    '#219d48',\r\n    '#219d48',\r\n    '#219e48',\r\n    '#219e48',\r\n    '#219e48',\r\n    '#219f48',\r\n    '#219f48',\r\n    '#21a048',\r\n    '#21a048',\r\n    '#21a048',\r\n    '#21a148',\r\n    '#21a148',\r\n    '#21a348',\r\n    '#21a348',\r\n    '#22a449',\r\n    '#22a449',\r\n    '#22a449',\r\n    '#22a549',\r\n    '#22a549',\r\n    '#22a649',\r\n    '#22a649',\r\n    '#22a64a',\r\n    '#23a74a',\r\n    '#23a74a',\r\n    '#23a84a',\r\n    '#23a84a',\r\n    '#23aa4a',\r\n    '#23aa4a',\r\n    '#23aa4a',\r\n    '#24ab4a',\r\n    '#24ab4a',\r\n    '#24ab4a',\r\n    '#25ac4a',\r\n    '#25ac4a',\r\n    '#25ad4a',\r\n    '#25ad4a',\r\n    '#25ad4a',\r\n    '#26ae4a',\r\n    '#26ae4a',\r\n    '#26ae4a',\r\n    '#26af4a',\r\n    '#26af4a',\r\n    '#26b04a',\r\n    '#26b04a',\r\n    '#26b04a',\r\n    '#27b14a',\r\n    '#27b14a',\r\n    '#27b14a',\r\n    '#27b24a',\r\n    '#27b24a',\r\n    '#27b24a',\r\n    '#27b24a',\r\n    '#27b34a',\r\n    '#27b34a',\r\n    '#27b34a',\r\n    '#28b54b',\r\n    '#28b54b',\r\n    '#28b54b',\r\n    '#28b54b',\r\n    '#28b64b',\r\n    '#28b64b',\r\n    '#28b64d',\r\n    '#28b64d',\r\n    '#28b74d',\r\n    '#28b74d',\r\n    '#28b74d',\r\n    '#29b74d',\r\n    '#29b84d',\r\n    '#29b84d',\r\n    '#29b84d',\r\n    '#29b84d',\r\n    '#29b94d',\r\n    '#29b94d',\r\n    '#29b94d',\r\n    '#29b94d',\r\n    '#29b94d',\r\n    '#29b94d',\r\n    '#29b94d',\r\n    '#29b94e',\r\n    '#2aba4e',\r\n    '#2aba4e',\r\n    '#2aba4e',\r\n    '#2aba4e',\r\n    '#2aba4e',\r\n    '#2aba4e',\r\n    '#2aba4e',\r\n    '#2abb4e',\r\n    '#2abb4e',\r\n    '#2abb4f',\r\n    '#2abb4f',\r\n    '#2abc4f',\r\n    '#2abc4f',\r\n    '#2abc4f',\r\n    '#2bbc4f',\r\n    '#2bbc4f',\r\n    '#2bbd4f',\r\n    '#2bbd4f',\r\n    '#2bbd50',\r\n    '#2bbd50',\r\n    '#2bbd50',\r\n    '#2bbe50',\r\n    '#2bbe50',\r\n    '#2bbe50',\r\n    '#2bbe50',\r\n    '#2bbe50',\r\n    '#2bbf51',\r\n    '#2cbf51',\r\n    '#2cbf51',\r\n    '#2cbf51',\r\n    '#2cc051',\r\n    '#2cc051',\r\n    '#2cc051',\r\n    '#2cc052',\r\n    '#2cc052',\r\n    '#2cc152',\r\n    '#2cc152',\r\n    '#2cc152',\r\n    '#2cc152',\r\n    '#2dc353',\r\n    '#2dc353',\r\n    '#2dc353',\r\n    '#2dc353',\r\n    '#2dc353',\r\n    '#2ec453',\r\n    '#2ec453',\r\n    '#2ec454',\r\n    '#2ec454',\r\n    '#2ec454',\r\n    '#2ec554',\r\n    '#2ec554',\r\n    '#2fc554',\r\n    '#2fc554',\r\n    '#2fc655',\r\n    '#2fc655',\r\n    '#2fc655',\r\n    '#2fc655',\r\n    '#2fc655',\r\n    '#2fc755',\r\n    '#2fc755',\r\n    '#2fc756',\r\n    '#2fc756',\r\n    '#2fc756',\r\n    '#2fc756',\r\n    '#2fc856',\r\n    '#2fc856',\r\n    '#2fc856',\r\n    '#2fc856',\r\n    '#2fc856',\r\n    '#2fc858',\r\n    '#2fc958',\r\n    '#2fc958',\r\n    '#2fc958',\r\n    '#2fc958',\r\n    '#2fc958',\r\n    '#2fc958',\r\n    '#2fc958',\r\n    '#2fca58',\r\n    '#2fca58',\r\n    '#2fca58',\r\n    '#2fca59',\r\n    '#2fca59',\r\n    '#2fca59',\r\n    '#2fca59',\r\n    '#2fca59',\r\n    '#30ca59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb59',\r\n    '#30cb5a',\r\n    '#30cb5a',\r\n    '#30cb5a',\r\n    '#30cb5a',\r\n    '#30cb5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n    '#30cc5a',\r\n  ],\r\n  nullColor: 'pink',\r\n}\r\nconst blueGradientBubbles = {\r\n  colors: [\r\n    '#0c3574',\r\n    '#0b3475',\r\n    '#0b3475',\r\n    '#0c3475',\r\n    '#0c3575',\r\n    '#0c3475',\r\n    '#0c3475',\r\n    '#0c3576',\r\n    '#0c3677',\r\n    '#0c3677',\r\n    '#0d3776',\r\n    '#0d3676',\r\n    '#0e3677',\r\n    '#0e3576',\r\n    '#0d3576',\r\n    '#0d3677',\r\n    '#0d3777',\r\n    '#0e3778',\r\n    '#0e3778',\r\n    '#0d3877',\r\n    '#0d3878',\r\n    '#0d3878',\r\n    '#0d3878',\r\n    '#0d3878',\r\n    '#0d3978',\r\n    '#0e3778',\r\n    '#0e3779',\r\n    '#0e397a',\r\n    '#0f3979',\r\n    '#0f3a7a',\r\n    '#0f3a7b',\r\n    '#0f3a7b',\r\n    '#0e3a7a',\r\n    '#0e3a7a',\r\n    '#0f3a7a',\r\n    '#0e3a7a',\r\n    '#0f3a7c',\r\n    '#0f3a7c',\r\n    '#0f3a7b',\r\n    '#0f3b7b',\r\n    '#0f3a7b',\r\n    '#0e3a7b',\r\n    '#0e3b7c',\r\n    '#0f3c7c',\r\n    '#0f3c7c',\r\n    '#0f3d7d',\r\n    '#0f3d7d',\r\n    '#0f3c7d',\r\n    '#0f3c7e',\r\n    '#0f3d7e',\r\n    '#0f3d7e',\r\n    '#0f3d7e',\r\n    '#0f3e7e',\r\n    '#0f3d7e',\r\n    '#103e7e',\r\n    '#113e7f',\r\n    '#103e7e',\r\n    '#103d7e',\r\n    '#103e7f',\r\n    '#103e7e',\r\n    '#113e80',\r\n    '#113f80',\r\n    '#103f7f',\r\n    '#114080',\r\n    '#113f81',\r\n    '#114081',\r\n    '#113f81',\r\n    '#103e80',\r\n    '#103f81',\r\n    '#104181',\r\n    '#104181',\r\n    '#103f81',\r\n    '#114082',\r\n    '#103f82',\r\n    '#103f81',\r\n    '#114081',\r\n    '#114282',\r\n    '#114282',\r\n    '#114282',\r\n    '#124182',\r\n    '#114082',\r\n    '#114182',\r\n    '#114283',\r\n    '#124384',\r\n    '#114384',\r\n    '#114383',\r\n    '#124383',\r\n    '#124485',\r\n    '#114384',\r\n    '#114384',\r\n    '#114384',\r\n    '#114484',\r\n    '#124585',\r\n    '#124585',\r\n    '#124585',\r\n    '#134587',\r\n    '#134586',\r\n    '#134586',\r\n    '#134687',\r\n    '#134687',\r\n    '#134586',\r\n    '#134686',\r\n    '#134687',\r\n    '#134787',\r\n    '#134788',\r\n    '#134688',\r\n    '#134688',\r\n    '#134687',\r\n    '#124788',\r\n    '#124789',\r\n    '#134688',\r\n    '#134688',\r\n    '#134688',\r\n    '#134788',\r\n    '#134889',\r\n    '#13488a',\r\n    '#13488a',\r\n    '#13488a',\r\n    '#134889',\r\n    '#134789',\r\n    '#13478a',\r\n    '#13498a',\r\n    '#14498a',\r\n    '#15498b',\r\n    '#14488b',\r\n    '#14498c',\r\n    '#15498c',\r\n    '#14498b',\r\n    '#15498c',\r\n    '#15498c',\r\n    '#14498c',\r\n    '#154a8d',\r\n    '#144b8c',\r\n    '#144b8c',\r\n    '#154b8d',\r\n    '#144c8d',\r\n    '#154b8d',\r\n    '#154b8d',\r\n    '#154c8d',\r\n    '#144c8d',\r\n    '#154c8d',\r\n    '#154c8d',\r\n    '#164c8e',\r\n    '#164c8e',\r\n    '#164c8e',\r\n    '#164c8e',\r\n    '#154d8e',\r\n    '#154d8f',\r\n    '#164e90',\r\n    '#164e90',\r\n    '#164e90',\r\n    '#154e8f',\r\n    '#154d90',\r\n    '#154e90',\r\n    '#164e90',\r\n    '#154e91',\r\n    '#154f91',\r\n    '#155091',\r\n    '#165091',\r\n    '#164f91',\r\n    '#164f92',\r\n    '#165092',\r\n    '#165092',\r\n    '#165092',\r\n    '#165092',\r\n    '#155192',\r\n    '#155192',\r\n    '#175093',\r\n    '#175293',\r\n    '#175293',\r\n    '#175093',\r\n    '#175093',\r\n    '#175293',\r\n    '#175293',\r\n    '#175193',\r\n    '#175294',\r\n    '#175394',\r\n    '#175394',\r\n    '#175294',\r\n    '#175395',\r\n    '#175295',\r\n    '#175295',\r\n    '#175395',\r\n    '#175395',\r\n    '#185495',\r\n    '#185495',\r\n    '#175396',\r\n    '#175497',\r\n    '#175397',\r\n    '#175497',\r\n    '#175597',\r\n    '#175597',\r\n    '#175597',\r\n    '#175497',\r\n    '#185497',\r\n    '#195698',\r\n    '#195798',\r\n    '#185597',\r\n    '#185497',\r\n    '#185599',\r\n    '#195799',\r\n    '#195799',\r\n    '#185799',\r\n    '#185699',\r\n    '#195699',\r\n    '#195799',\r\n    '#195799',\r\n    '#19589a',\r\n    '#185899',\r\n    '#185899',\r\n    '#18589a',\r\n    '#18589a',\r\n    '#18599a',\r\n    '#18589a',\r\n    '#18579a',\r\n    '#19589b',\r\n    '#19599b',\r\n    '#19599a',\r\n    '#18599a',\r\n    '#1a5a9c',\r\n    '#1a5a9d',\r\n    '#1a5a9c',\r\n    '#1a599d',\r\n    '#1a5a9d',\r\n    '#1a5a9e',\r\n    '#1a5a9e',\r\n    '#195a9d',\r\n    '#195a9d',\r\n    '#195a9d',\r\n    '#195a9d',\r\n    '#1a5a9e',\r\n    '#1a5b9f',\r\n    '#1a5b9e',\r\n    '#1a5b9e',\r\n    '#1a5d9e',\r\n    '#1a5c9f',\r\n    '#195c9f',\r\n    '#195c9f',\r\n    '#195da0',\r\n    '#195d9f',\r\n    '#195ca0',\r\n    '#1a5ca0',\r\n    '#1a5d9f',\r\n    '#1a5ea1',\r\n    '#1a5ea1',\r\n    '#1a5da0',\r\n    '#1a5da0',\r\n    '#195ea0',\r\n    '#195ea0',\r\n    '#1a5ea0',\r\n    '#1a5ea1',\r\n    '#1c5fa3',\r\n    '#1c5fa3',\r\n    '#1b5fa3',\r\n    '#1b5ea2',\r\n    '#1b5ea2',\r\n    '#1b5ea2',\r\n    '#1b5fa3',\r\n    '#1b60a3',\r\n    '#1b60a3',\r\n    '#1b5fa3',\r\n    '#1b60a3',\r\n    '#1c61a4',\r\n    '#1b60a4',\r\n    '#1b60a4',\r\n    '#1b61a4',\r\n    '#1b60a4',\r\n    '#1b60a4',\r\n    '#1b60a4',\r\n    '#1b62a4',\r\n    '#1b62a5',\r\n    '#1b61a5',\r\n    '#1b62a5',\r\n    '#1b62a5',\r\n    '#1b61a5',\r\n    '#1d61a6',\r\n    '#1d63a6',\r\n    '#1c62a6',\r\n    '#1d63a6',\r\n    '#1d62a6',\r\n    '#1c62a6',\r\n    '#1c63a7',\r\n    '#1d64a8',\r\n    '#1c64a7',\r\n    '#1c64a7',\r\n    '#1d65a8',\r\n    '#1c63a8',\r\n    '#1d64a9',\r\n    '#1d65a9',\r\n    '#1d65a9',\r\n    '#1d65a9',\r\n    '#1d65a9',\r\n    '#1d66a9',\r\n    '#1d66a9',\r\n    '#1c65a9',\r\n    '#1d66aa',\r\n    '#1d66aa',\r\n    '#1c65aa',\r\n    '#1c66aa',\r\n    '#1c66aa',\r\n    '#1d66aa',\r\n    '#1c66ab',\r\n    '#1c68ab',\r\n    '#1c67ab',\r\n    '#1c67ab',\r\n    '#1d68ab',\r\n    '#1d68ac',\r\n    '#1e68ac',\r\n    '#1e67ab',\r\n    '#1d67ab',\r\n    '#1e69ac',\r\n    '#1e69ac',\r\n    '#1d68ac',\r\n    '#1d68ac',\r\n    '#1e69ae',\r\n    '#1e6aae',\r\n    '#1e6aad',\r\n    '#1e69ad',\r\n    '#1e6aae',\r\n    '#1d69ae',\r\n    '#1d6aae',\r\n    '#1e6bae',\r\n    '#1e6aaf',\r\n    '#1e6baf',\r\n    '#1e6baf',\r\n    '#1e6bb0',\r\n    '#1e6cb0',\r\n    '#1d6baf',\r\n    '#1d6baf',\r\n    '#1e6bb0',\r\n    '#1d6ab0',\r\n    '#1d6cb0',\r\n    '#1d6db1',\r\n    '#1e6cb1',\r\n    '#1e6db0',\r\n    '#1e6cb1',\r\n    '#1d6cb1',\r\n    '#1d6cb0',\r\n    '#1f6db1',\r\n    '#1f6cb1',\r\n    '#1f6cb1',\r\n    '#1f6db2',\r\n    '#1f6cb1',\r\n    '#1f6db1',\r\n    '#1f6eb3',\r\n    '#1f6fb3',\r\n    '#1f6eb3',\r\n    '#1f6eb3',\r\n    '#1f6fb3',\r\n    '#1f6fb3',\r\n    '#1f6fb4',\r\n    '#1f6fb4',\r\n    '#1f6fb4',\r\n    '#2070b5',\r\n    '#1f70b4',\r\n    '#1f70b4',\r\n    '#1f70b4',\r\n    '#1f71b5',\r\n    '#1f71b5',\r\n    '#1f71b5',\r\n    '#1f71b5',\r\n    '#1f70b5',\r\n    '#1f71b5',\r\n    '#1f72b6',\r\n    '#1f72b6',\r\n    '#1f71b6',\r\n    '#1f71b6',\r\n    '#1f72b5',\r\n    '#2072b6',\r\n    '#2172b7',\r\n    '#2172b7',\r\n    '#2172b6',\r\n    '#2172b6',\r\n    '#2172b7',\r\n    '#2072b7',\r\n    '#2073b8',\r\n    '#2173b9',\r\n    '#2173b9',\r\n    '#2075b8',\r\n    '#2075b8',\r\n    '#2174b8',\r\n    '#2174b9',\r\n    '#2175ba',\r\n    '#2174ba',\r\n    '#2174ba',\r\n    '#2175ba',\r\n    '#2175ba',\r\n    '#2176bb',\r\n    '#2176bb',\r\n    '#2076ba',\r\n    '#2076ba',\r\n    '#2176bb',\r\n    '#2176bb',\r\n    '#2076bb',\r\n    '#2077bb',\r\n    '#2177bc',\r\n    '#2077bb',\r\n    '#2077bb',\r\n    '#2077bc',\r\n    '#2077bc',\r\n    '#2077bc',\r\n    '#2177bd',\r\n    '#2078bc',\r\n    '#2078bc',\r\n    '#2178bd',\r\n    '#2279be',\r\n    '#2178be',\r\n    '#2179be',\r\n    '#2179be',\r\n    '#2279bf',\r\n    '#2278bf',\r\n    '#2179bf',\r\n    '#217abf',\r\n    '#227ac0',\r\n    '#2279c0',\r\n    '#227ac0',\r\n    '#227abf',\r\n    '#227ac0',\r\n    '#217bc0',\r\n    '#227bc0',\r\n    '#227bc0',\r\n    '#217bc0',\r\n    '#217ac0',\r\n    '#217bc0',\r\n    '#217cc1',\r\n    '#227cc1',\r\n    '#217cc1',\r\n    '#217cc1',\r\n    '#227cc1',\r\n    '#217cc1',\r\n    '#227cc2',\r\n    '#227cc2',\r\n    '#227dc2',\r\n    '#217dc1',\r\n    '#217dc2',\r\n    '#217dc2',\r\n    '#217dc3',\r\n    '#217ec3',\r\n    '#217ec3',\r\n    '#217ec3',\r\n    '#227ec4',\r\n    '#237fc4',\r\n    '#237ec5',\r\n    '#237ec5',\r\n    '#237ec5',\r\n    '#237ec4',\r\n    '#237ec4',\r\n    '#237ec6',\r\n    '#237fc6',\r\n    '#2380c6',\r\n    '#237fc5',\r\n    '#237fc5',\r\n    '#2380c5',\r\n    '#2380c7',\r\n    '#2381c6',\r\n    '#2381c6',\r\n    '#2380c6',\r\n    '#2381c7',\r\n    '#2380c6',\r\n    '#2380c7',\r\n    '#2381c8',\r\n    '#2382c7',\r\n    '#2381c7',\r\n    '#2381c7',\r\n    '#2382c8',\r\n    '#2382c8',\r\n    '#2383c8',\r\n    '#2384c9',\r\n    '#2384c9',\r\n    '#2383c8',\r\n    '#2383c9',\r\n    '#2383ca',\r\n    '#2384ca',\r\n    '#2384ca',\r\n    '#2383ca',\r\n    '#2383ca',\r\n    '#2384ca',\r\n    '#2384ca',\r\n    '#2484cb',\r\n    '#2485cb',\r\n    '#2385cb',\r\n    '#2384cb',\r\n    '#2385cb',\r\n    '#2485cb',\r\n    '#2585cc',\r\n    '#2586cc',\r\n    '#2485cc',\r\n    '#2485cc',\r\n    '#2485cc',\r\n    '#2486cd',\r\n    '#2586cd',\r\n    '#2587cd',\r\n    '#2487cc',\r\n    '#2486cd',\r\n    '#2587cd',\r\n    '#2587cd',\r\n    '#2487ce',\r\n    '#2588ce',\r\n    '#2588ce',\r\n    '#2588ce',\r\n    '#2488cf',\r\n    '#2588cf',\r\n    '#2589ce',\r\n    '#2589ce',\r\n    '#2688cf',\r\n    '#2589ce',\r\n    '#2789cf',\r\n    '#2889d0',\r\n    '#2889d0',\r\n    '#288ad0',\r\n    '#2889d0',\r\n    '#298ad0',\r\n    '#2b8bd0',\r\n    '#2a89cf',\r\n    '#2989cf',\r\n    '#2b8bcf',\r\n    '#2c8cd0',\r\n    '#2c8ccf',\r\n    '#2d8cd0',\r\n    '#2d8cd0',\r\n    '#2c8bd0',\r\n    '#2e8cd1',\r\n    '#2e8cd1',\r\n    '#2e8cd0',\r\n    '#2e8cd1',\r\n    '#2e8dd0',\r\n    '#308ed0',\r\n    '#318ed1',\r\n    '#318dd1',\r\n    '#308dd0',\r\n    '#308dd0',\r\n    '#318fd0',\r\n    '#338fd1',\r\n    '#328dd1',\r\n    '#338ed1',\r\n    '#348fd1',\r\n    '#348fd2',\r\n    '#338ed2',\r\n    '#338ed1',\r\n    '#348fd1',\r\n    '#3590d1',\r\n    '#368fd2',\r\n    '#3690d1',\r\n    '#3690d1',\r\n    '#3690d2',\r\n    '#3791d3',\r\n    '#3791d3',\r\n    '#3791d2',\r\n    '#3790d2',\r\n    '#3790d2',\r\n    '#3892d2',\r\n    '#3892d2',\r\n    '#3992d2',\r\n    '#3a92d3',\r\n    '#3a93d3',\r\n    '#3b92d3',\r\n    '#3b92d3',\r\n    '#3a93d3',\r\n    '#3a93d3',\r\n    '#3b93d3',\r\n    '#3c94d3',\r\n    '#3d94d3',\r\n    '#3d94d3',\r\n    '#3d94d3',\r\n    '#3d93d3',\r\n    '#3f93d4',\r\n    '#3f96d4',\r\n    '#3f96d4',\r\n    '#3e95d3',\r\n    '#3e96d3',\r\n    '#3f96d4',\r\n    '#4095d4',\r\n    '#4095d4',\r\n    '#3f96d4',\r\n    '#3f96d4',\r\n    '#4096d4',\r\n    '#4297d4',\r\n    '#4197d4',\r\n    '#4096d3',\r\n    '#4196d3',\r\n    '#4397d5',\r\n    '#4398d5',\r\n    '#4397d5',\r\n    '#4398d5',\r\n    '#4398d5',\r\n    '#4499d5',\r\n    '#4499d5',\r\n    '#4499d5',\r\n    '#4499d5',\r\n    '#459ad5',\r\n    '#459ad4',\r\n    '#459ad4',\r\n    '#459ad4',\r\n    '#459ad5',\r\n    '#459ad6',\r\n    '#469bd6',\r\n    '#469bd5',\r\n    '#469ad5',\r\n    '#469ad5',\r\n    '#479bd5',\r\n    '#499cd6',\r\n    '#499cd6',\r\n    '#499cd5',\r\n    '#499cd5',\r\n    '#499cd6',\r\n    '#4a9dd6',\r\n    '#4a9fd6',\r\n    '#4a9ed6',\r\n    '#4a9ed5',\r\n    '#4a9ed6',\r\n    '#4b9ed7',\r\n    '#4b9ed7',\r\n    '#4b9fd7',\r\n    '#4a9ed7',\r\n    '#4b9ed7',\r\n    '#4ca0d7',\r\n    '#4c9ed7',\r\n    '#4b9ed7',\r\n    '#4c9fd7',\r\n    '#4da0d7',\r\n    '#4da0d8',\r\n    '#4da0d8',\r\n    '#4c9fd8',\r\n    '#4c9fd7',\r\n    '#4da0d7',\r\n    '#4ea2d8',\r\n    '#4ea2d8',\r\n    '#4ea1d8',\r\n    '#4ea2d7',\r\n    '#4ea2d7',\r\n    '#4ea2d8',\r\n    '#4ea2d7',\r\n    '#4ea2d7',\r\n    '#4fa3d9',\r\n    '#50a3d9',\r\n    '#50a3d8',\r\n    '#4fa2d8',\r\n    '#4fa3d8',\r\n    '#51a3d8',\r\n    '#51a3d8',\r\n    '#51a3d9',\r\n    '#51a3d8',\r\n    '#51a3d8',\r\n    '#52a4d9',\r\n    '#52a5da',\r\n    '#52a4d9',\r\n    '#52a4d9',\r\n    '#52a5da',\r\n    '#53a5da',\r\n    '#53a5da',\r\n    '#53a5da',\r\n    '#54a5da',\r\n    '#54a5da',\r\n    '#54a6d9',\r\n    '#54a7d9',\r\n    '#54a6d9',\r\n    '#54a7d9',\r\n    '#55a8da',\r\n    '#55a8da',\r\n    '#56a8db',\r\n    '#55a7da',\r\n    '#56a8db',\r\n    '#57a8db',\r\n    '#56a7da',\r\n    '#57a8db',\r\n    '#57a8db',\r\n    '#57a8db',\r\n    '#58a9da',\r\n    '#58aada',\r\n    '#57a9da',\r\n    '#57a8da',\r\n    '#57a9da',\r\n    '#58aadb',\r\n    '#59aadb',\r\n    '#59aadb',\r\n    '#59aadc',\r\n    '#59abdb',\r\n    '#5aacdb',\r\n    '#5aabdb',\r\n    '#59abdb',\r\n    '#5babdb',\r\n    '#5babdc',\r\n    '#5babdc',\r\n    '#5aabdc',\r\n    '#5baddc',\r\n    '#5bacdc',\r\n    '#5cacdc',\r\n    '#5bacdc',\r\n    '#5caedc',\r\n    '#5caddc',\r\n    '#5cacdc',\r\n    '#5caddc',\r\n    '#5dafdc',\r\n    '#5dafdc',\r\n    '#5caedc',\r\n    '#5daedc',\r\n    '#5eb0dd',\r\n    '#5db0dd',\r\n    '#5eafdd',\r\n    '#5eafdd',\r\n    '#5fb1dd',\r\n    '#5fb1dd',\r\n    '#5fafdd',\r\n    '#5fafdd',\r\n    '#60b1dd',\r\n    '#60b1dd',\r\n    '#60b1dd',\r\n    '#60b1dd',\r\n    '#60b1dd',\r\n    '#61b1de',\r\n    '#61b1de',\r\n    '#61b1de',\r\n    '#61b1de',\r\n    '#61b2dd',\r\n    '#61b2dd',\r\n    '#62b2dd',\r\n    '#62b2de',\r\n    '#62b2de',\r\n    '#62b2de',\r\n    '#63b3dd',\r\n    '#63b4de',\r\n    '#63b4df',\r\n    '#63b4df',\r\n    '#63b3df',\r\n    '#63b4de',\r\n    '#63b4de',\r\n    '#63b4df',\r\n    '#63b5df',\r\n    '#64b6df',\r\n    '#64b6df',\r\n    '#64b6df',\r\n    '#64b5de',\r\n    '#65b6e0',\r\n    '#65b7e0',\r\n    '#65b7df',\r\n    '#65b6e0',\r\n    '#65b6e0',\r\n    '#65b6df',\r\n    '#66b6df',\r\n    '#67b7e0',\r\n    '#67b8e0',\r\n    '#66b8df',\r\n    '#66b8e0',\r\n    '#67b8df',\r\n    '#67b7df',\r\n    '#67b8e0',\r\n    '#67b9e0',\r\n    '#67b8e0',\r\n    '#68b9e1',\r\n    '#69bae1',\r\n    '#69bae1',\r\n    '#68b8e0',\r\n    '#69b9e0',\r\n    '#69bae0',\r\n    '#69bae0',\r\n    '#6abbe1',\r\n    '#69bbe0',\r\n    '#69bbe0',\r\n    '#69bbe1',\r\n    '#6abce1',\r\n    '#6abbe0',\r\n    '#6abbe0',\r\n    '#6abbe1',\r\n    '#6abce1',\r\n    '#6abce2',\r\n    '#6bbde2',\r\n    '#6bbee1',\r\n    '#6cbde2',\r\n    '#6cbde2',\r\n    '#6bbde1',\r\n    '#6cbde1',\r\n    '#6cbde2',\r\n    '#6cbde2',\r\n    '#6cbde2',\r\n    '#6cbee2',\r\n    '#6cbee2',\r\n    '#6dbfe2',\r\n    '#6dbfe2',\r\n    '#6dbee2',\r\n    '#6ebee3',\r\n    '#6fbfe3',\r\n    '#6fc0e3',\r\n    '#6fc0e2',\r\n    '#6ebfe3',\r\n    '#6ec0e3',\r\n    '#6ec1e3',\r\n    '#6ec1e3',\r\n    '#6ec1e4',\r\n    '#6fc0e3',\r\n    '#70c1e3',\r\n    '#70c2e3',\r\n    '#70c2e4',\r\n    '#6fc1e3',\r\n    '#6fc1e3',\r\n    '#70c2e3',\r\n    '#71c2e4',\r\n    '#70c3e4',\r\n    '#70c2e4',\r\n    '#70c2e4',\r\n    '#72c4e4',\r\n    '#72c4e4',\r\n    '#71c2e4',\r\n    '#71c2e4',\r\n    '#73c4e4',\r\n    '#72c3e4',\r\n    '#72c3e4',\r\n    '#72c3e4',\r\n    '#72c4e4',\r\n    '#73c5e4',\r\n    '#73c5e4',\r\n    '#72c5e4',\r\n    '#73c6e4',\r\n    '#73c5e4',\r\n    '#73c6e4',\r\n    '#74c7e5',\r\n    '#73c6e4',\r\n    '#75c8e5',\r\n    '#74c7e5',\r\n    '#74c7e5',\r\n    '#74c6e5',\r\n    '#75c6e5',\r\n    '#76c7e5',\r\n    '#75c7e5',\r\n    '#76c8e5',\r\n    '#75c8e5',\r\n    '#75c8e6',\r\n    '#76c8e6',\r\n    '#77c8e5',\r\n    '#76c9e6',\r\n    '#76c9e5',\r\n    '#76c9e5',\r\n    '#77cae6',\r\n    '#77c9e6',\r\n    '#77c9e6',\r\n    '#77c9e6',\r\n    '#78cae6',\r\n    '#77cbe7',\r\n    '#77cbe7',\r\n    '#78cbe7',\r\n    '#78cbe7',\r\n    '#79cae6',\r\n    '#78cae6',\r\n    '#78cbe7',\r\n    '#78cae6',\r\n    '#79cae6',\r\n    '#7acce6',\r\n    '#7acde7',\r\n    '#7acbe7',\r\n    '#79cce6',\r\n    '#79cee7',\r\n    '#7acee8',\r\n    '#7acde8',\r\n    '#79cde7',\r\n    '#7acde7',\r\n    '#7bcee8',\r\n    '#7acee7',\r\n    '#7acfe7',\r\n    '#7acee7',\r\n    '#7ccee8',\r\n    '#7bcee7',\r\n    '#7bcfe7',\r\n    '#7bcfe7',\r\n    '#7bcfe8',\r\n    '#7dd0e9',\r\n    '#7dd0e9',\r\n    '#7ccfe8',\r\n    '#7ccfe8',\r\n    '#7cd1e8',\r\n    '#7cd1e8',\r\n    '#7cd0e8',\r\n    '#7cd0e8',\r\n    '#7dd1e8',\r\n    '#7dd2e9',\r\n    '#7dd2e9',\r\n    '#7ed2e9',\r\n    '#7dd1e8',\r\n    '#7dd2e8',\r\n    '#7fd3ea',\r\n    '#7fd3ea',\r\n    '#7ed3e9',\r\n    '#7ed2ea',\r\n    '#80d2ea',\r\n    '#7fd3e9',\r\n    '#7fd2e9',\r\n    '#80d4ea',\r\n    '#80d5ea',\r\n    '#7fd4e9',\r\n    '#7fd4e9',\r\n    '#80d4e9',\r\n    '#81d6ea',\r\n    '#81d6eb',\r\n    '#80d4ea',\r\n    '#80d5ea',\r\n    '#80d6ea',\r\n    '#80d5ea',\r\n    '#81d6ea',\r\n    '#81d6ea',\r\n    '#82d6ea',\r\n    '#82d7ea',\r\n    '#82d8ea',\r\n    '#81d6ea',\r\n    '#81d6ea',\r\n    '#82d8ea',\r\n    '#82d7eb',\r\n    '#82d8eb',\r\n    '#82d8eb',\r\n    '#82d7eb',\r\n    '#83d9eb',\r\n    '#84d9ec',\r\n    '#84d9ec',\r\n    '#83d8eb',\r\n    '#83d8eb',\r\n    '#85d8eb',\r\n    '#85d9eb',\r\n    '#84daeb',\r\n    '#85daeb',\r\n    '#85dbec',\r\n    '#85dbec',\r\n    '#84daec',\r\n    '#85dbec',\r\n    '#86dbec',\r\n    '#86dbec',\r\n    '#85dbec',\r\n    '#85dbec',\r\n    '#85dbec',\r\n    '#85dcec',\r\n    '#86ddec',\r\n    '#86dceb',\r\n    '#86dceb',\r\n    '#87ddec',\r\n    '#86dced',\r\n    '#86dcec',\r\n    '#86deec',\r\n    '#86deed',\r\n    '#87ddec',\r\n    '#87deed',\r\n    '#87dfec',\r\n    '#87deec',\r\n    '#88deed',\r\n    '#89deec',\r\n    '#88deec',\r\n    '#88dfed',\r\n    '#88dfec',\r\n    '#89e0ed',\r\n    '#89e0ee',\r\n    '#88dfee',\r\n    '#89e0ee',\r\n    '#88dfed',\r\n    '#88dfed',\r\n    '#8ae1ee',\r\n    '#89e1ed',\r\n    '#8ae2ee',\r\n    '#8ae2ee',\r\n    '#8ae2ee',\r\n    '#8ae1ee',\r\n    '#8be3ee',\r\n    '#8be3ee',\r\n    '#8be2ee',\r\n    '#8be2ee',\r\n    '#8be2ef',\r\n    '#8ce2ef',\r\n    '#8ce3ef',\r\n    '#8be3ee',\r\n    '#8ce4ef',\r\n    '#8be3ef',\r\n    '#8be3ee',\r\n    '#8de5ef',\r\n    '#8de4ef',\r\n    '#8de4ef',\r\n    '#8de5ef',\r\n    '#8ce4ef',\r\n    '#8de4ef',\r\n    '#8de4ef',\r\n    '#8de4f0',\r\n    '#8ee6f0',\r\n    '#8ee6f0',\r\n    '#8ee6ef',\r\n    '#8ee6ef',\r\n    '#8de7ef',\r\n    '#8de6ef',\r\n    '#8fe7f0',\r\n    '#8fe8f1',\r\n    '#8ee6ef',\r\n    '#8ee6ef',\r\n    '#8ee8f1',\r\n    '#8fe8f1',\r\n    '#8fe7f0',\r\n    '#90e8f1',\r\n    '#90e8f1',\r\n    '#8fe8f0',\r\n    '#90eaf1',\r\n    '#8fe9f0',\r\n    '#8fe9f0',\r\n    '#90eaf1',\r\n    '#90eaf1',\r\n    '#91eaf1',\r\n    '#91eaf1',\r\n    '#91eaf1',\r\n    '#92ebf2',\r\n    '#91eaf1',\r\n  ],\r\n  nullColor: 'pink',\r\n}\r\n\r\nexport const gradients: Record<ScaleId, GradientDefinition> = {\r\n  [ScaleId.IntradayReduced]: redGreenGradient,\r\n  [ScaleId.DayPerf]: redGreenGradient,\r\n  _5: redGreenGradient,\r\n  _10: redGreenGradient,\r\n  _15: redGreenGradient,\r\n  _20: redGreenGradient,\r\n  _25: redGreenGradient,\r\n  _relvol: blueGradient,\r\n  _pe: greenRedGradient,\r\n  _fpe: greenRedGradient,\r\n  _peg: greenRedGradient,\r\n  _ps: greenRedGradient,\r\n  _pb: greenRedGradient,\r\n  _div: greenGradient,\r\n  _eps5y: redGreenGradient,\r\n  _short: redGradient,\r\n  _rec: redGreenGradient,\r\n  _earndate: earningsGradient,\r\n  _portfolioPct: redGreenGradient,\r\n  _portfolioUsd: redGreenGradient,\r\n  _percentHundred: redGreenGradient,\r\n}\r\n\r\nexport const bubbleGradients: Record<ScaleId, GradientDefinition> = {\r\n  [ScaleId.IntradayReduced]: redGreenGradientBubbles,\r\n  [ScaleId.DayPerf]: redGreenGradientBubbles,\r\n  _5: redGreenGradientBubbles,\r\n  _10: redGreenGradientBubbles,\r\n  _15: redGreenGradientBubbles,\r\n  _20: redGreenGradientBubbles,\r\n  _25: redGreenGradientBubbles,\r\n  _relvol: blueGradientBubbles,\r\n  _pe: redGreenGradientBubbles,\r\n  _fpe: redGreenGradientBubbles,\r\n  _peg: redGreenGradientBubbles,\r\n  _ps: redGreenGradientBubbles,\r\n  _pb: redGreenGradientBubbles,\r\n  _div: redGreenGradientBubbles,\r\n  _eps5y: redGreenGradientBubbles,\r\n  _short: redGreenGradientBubbles, // TODO red skala\r\n  _rec: redGreenGradientBubbles,\r\n  _earndate: redGreenGradientBubbles,\r\n  _portfolioPct: redGreenGradientBubbles,\r\n  _portfolioUsd: redGreenGradientBubbles,\r\n  _percentHundred: redGreenGradientBubbles,\r\n}\r\n\r\nexport const gradientSmall = redGreenGradientSmall\r\n","/**\r\n * Load image before we can render it in canvas\r\n */\r\nexport function loadImage(src: string): Promise<HTMLImageElement> {\r\n  return new Promise((resolve, reject) => {\r\n    var image = new Image()\r\n\r\n    image.onload = function () {\r\n      resolve(image)\r\n    }\r\n\r\n    image.onerror = function () {\r\n      reject()\r\n    }\r\n\r\n    image.src = src\r\n  })\r\n}\r\n","export function getScaleRatio() {\r\n  return window.devicePixelRatio ?? 1\r\n}\r\n\r\nexport function retinafy(\r\n  canvas: HTMLCanvasElement | undefined | null,\r\n  context: CanvasRenderingContext2D | undefined,\r\n  width: number,\r\n  height: number\r\n) {\r\n  if (!canvas || !context) return\r\n\r\n  const ratio = getScaleRatio()\r\n\r\n  canvas.width = width * ratio\r\n  canvas.height = height * ratio\r\n  canvas.style.width = width + 'px'\r\n  canvas.style.height = height + 'px'\r\n  context.scale(ratio, ratio)\r\n\r\n  return ratio\r\n}\r\n","export enum AdsProvider {\r\n  None,\r\n  InvestingChannel,\r\n  Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n  if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n  if (FinvizSettings.adsProvider === 2) {\r\n    return AdsProvider.Freestar\r\n  }\r\n\r\n  return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n  const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n  window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n  window.gtag?.('event', 'page_view')\r\n\r\n  if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n    window.freestar?.queue.push(() => freestar.trackPageview())\r\n  }\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRoundingType, ButtonSizeType, ButtonThemeType } from '../button'\r\nimport { ButtonGroup, ButtonGroupProps } from '../button-group'\r\nimport { SelectItem } from '../select/types'\r\n\r\nexport type ButtonSwitchItem<ValueType> = Pick<SelectItem<ValueType>, 'value' | 'label' | 'disabled'>\r\n\r\nexport interface ButtonSwitchProps<ValueType, ItemType extends ButtonSwitchItem<ValueType>> extends ButtonGroupProps {\r\n  /**\r\n   * Label to display above the select\r\n   */\r\n  label?: string\r\n\r\n  /**\r\n   * Class names for label\r\n   */\r\n  labelClassNames?: string\r\n\r\n  /**\r\n   * Array of items to display as button options\r\n   */\r\n  items: ItemType[]\r\n\r\n  /**\r\n   * Currently selected value\r\n   */\r\n  value?: ValueType\r\n\r\n  /**\r\n   * Default value when uncontrolled\r\n   */\r\n  defaultValue?: ValueType\r\n\r\n  /**\r\n   * Callback when item changes. Called for both controlled and uncontrolled selects\r\n   */\r\n  onChange?: (value: ItemType) => void\r\n\r\n  /**\r\n   * Optional className for the ButtonGroup wrapper\r\n   */\r\n  className?: string\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   * Size of the button\r\n   *\r\n   * @default \"regular\"\r\n   */\r\n  size?: ButtonSizeType\r\n\r\n  /**\r\n   * Data test id\r\n   *\r\n   * @default \"\"\r\n   */\r\n  'data-testid'?: string\r\n\r\n  groupRounding?: ButtonRoundingType\r\n}\r\n\r\nexport function ButtonSwitch<ValueType, ItemType extends ButtonSwitchItem<ValueType>>(\r\n  props: Omit<ButtonSwitchProps<ValueType, ItemType>, 'children'>\r\n) {\r\n  const {\r\n    items,\r\n    value: controlledValue,\r\n    label,\r\n    defaultValue,\r\n    onChange,\r\n    className = 'flex p-0.5',\r\n    size,\r\n    labelClassNames,\r\n    rounding = 'regular',\r\n    groupRounding = 'regular',\r\n    activeTheme = 'blue',\r\n    ...restProps\r\n  } = props\r\n  const [internalValue, setInternalValue] = React.useState<ValueType | undefined>(defaultValue)\r\n  const value = controlledValue !== undefined ? controlledValue : internalValue\r\n\r\n  const handleChange = React.useCallback(\r\n    (newValue: ItemType) => {\r\n      setInternalValue(newValue.value)\r\n      onChange?.(newValue)\r\n    },\r\n    [onChange]\r\n  )\r\n\r\n  return (\r\n    <div className=\"inline-flex items-center gap-1\">\r\n      <ButtonGroup {...restProps} rounding={groupRounding} className={className} hasDivider={false}>\r\n        {items.map((option, index) => (\r\n          <Button\r\n            key={`button-${index}`}\r\n            data-testid={props['data-testid'] && `${props['data-testid']}-button-${index}`}\r\n            contentClass=\"flex justify-center\"\r\n            size={size}\r\n            type=\"button\"\r\n            rounding={rounding}\r\n            disabled={option.disabled}\r\n            theme={value === option.value ? activeTheme : undefined}\r\n            onClick={() => handleChange(option)}\r\n          >\r\n            {option.label}\r\n          </Button>\r\n        ))}\r\n      </ButtonGroup>\r\n      {label && <span className={classNames('select-none text-2xs', labelClassNames)}>{label}</span>}\r\n    </div>\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  darkGray = 'darkGray',\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<HTMLProps<HTMLInputElement>, '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<CheckboxProps>,\r\n  ref: ForwardedRef<HTMLInputElement>\r\n) {\r\n  const checked = props.checked ?? props.defaultChecked\r\n\r\n  return (\r\n    <label\r\n      className={classnames(className, CheckboxSize[size], 'group/checkbox flex items-center', {\r\n        'text-gray-400 dark:text-gray-500': props.disabled,\r\n      })}\r\n    >\r\n      <div className=\"relative mr-2 flex\">\r\n        <input\r\n          {...props}\r\n          ref={ref}\r\n          type=\"checkbox\"\r\n          className={classnames(\r\n            'h-4 w-4 cursor-pointer appearance-none rounded-sm border ring-gray-300 focus:outline-none focus-visible:ring-2', // Base\r\n            'border-gray-200 bg-white dark:border-gray-600 dark:bg-gray-800', // Normal\r\n            'group-hover/checkbox:border-gray-400', // Hover\r\n            'disabled:border-gray-100 disabled:bg-gray-100 disabled:checked:border-gray-400 disabled:checked:bg-gray-400 dark:disabled:bg-gray-600 dark:disabled:checked:border-gray-600 dark:disabled:checked:bg-gray-600 dark:disabled:group-hover/checkbox:border-gray-600', // Disabled\r\n            // Checked color styles\r\n            {\r\n              'checked:border-violet-400 checked:bg-violet-400 group-hover/checkbox:checked:border-violet-500 group-hover/checkbox:checked:bg-violet-500 dark:checked:border-violet-400 dark:checked:bg-violet-400 dark:group-hover/checkbox:checked:border-violet-300 dark:group-hover/checkbox:checked:bg-violet-300':\r\n                color === ColorVariant.violet,\r\n              'checked:border-emerald-400 checked:bg-emerald-400 group-hover/checkbox:checked:border-emerald-500 group-hover/checkbox:checked:bg-emerald-500 dark:checked:border-emerald-300 dark:checked:bg-emerald-300 dark:group-hover/checkbox:checked:border-emerald-200 dark:group-hover/checkbox:checked:bg-emerald-200':\r\n                color === ColorVariant.emerald,\r\n              'checked:border-orange-300 checked:bg-orange-300 group-hover/checkbox:checked:border-orange-400 group-hover/checkbox:checked:bg-orange-400 dark:checked:border-orange-300 dark:checked:bg-orange-300 dark:group-hover/checkbox:checked:border-orange-200 dark:group-hover/checkbox:checked:bg-orange-200':\r\n                color === ColorVariant.orange,\r\n              'checked:border-teal-400 checked:bg-teal-400 group-hover/checkbox:checked:border-teal-500 group-hover/checkbox:checked:bg-teal-500 dark:checked:border-teal-300 dark:checked:bg-teal-300 dark:group-hover/checkbox:checked:border-teal-200 dark:group-hover/checkbox:checked:bg-teal-200':\r\n                color === ColorVariant.teal,\r\n              'checked:border-pink-400 checked:bg-pink-400 group-hover/checkbox:checked:border-pink-500 group-hover/checkbox:checked:bg-pink-500 dark:checked:border-pink-400 dark:checked:bg-pink-400 dark:group-hover/checkbox:checked:border-pink-300 dark:group-hover/checkbox:checked:bg-pink-300':\r\n                color === ColorVariant.pink,\r\n              'checked:border-lime-400 checked:bg-lime-400 group-hover/checkbox:checked:border-lime-500 group-hover/checkbox:checked:bg-lime-500 dark:checked:border-lime-300 dark:checked:bg-lime-300 dark:group-hover/checkbox:checked:border-lime-200 dark:group-hover/checkbox:checked:bg-lime-200':\r\n                color === ColorVariant.lime,\r\n              'checked:border-purple-400 checked:bg-purple-400 group-hover/checkbox:checked:border-purple-500 group-hover/checkbox:checked:bg-purple-500 dark:checked:border-purple-400 dark:checked:bg-purple-400 dark:group-hover/checkbox:checked:border-purple-300 dark:group-hover/checkbox:checked:bg-purple-300':\r\n                color === ColorVariant.purple,\r\n              'checked:border-green-400 checked:bg-green-400 group-hover/checkbox:checked:border-green-500 group-hover/checkbox:checked:bg-green-500 dark:checked:border-green-400 dark:checked:bg-green-400 dark:group-hover/checkbox:checked:border-green-300 dark:group-hover/checkbox:checked:bg-green-300':\r\n                color === ColorVariant.green,\r\n              'checked:border-yellow-300 checked:bg-yellow-300 group-hover/checkbox:checked:border-yellow-400 group-hover/checkbox:checked:bg-yellow-400 dark:checked:border-yellow-200 dark:checked:bg-yellow-200 dark:group-hover/checkbox:checked:border-yellow-100 dark:group-hover/checkbox:checked:bg-yellow-100':\r\n                color === ColorVariant.yellow,\r\n              'checked:border-blue-400 checked:bg-blue-400 group-hover/checkbox:checked:border-blue-500 group-hover/checkbox:checked:bg-blue-500 dark:checked:border-blue-300 dark:checked:bg-blue-300 dark:group-hover/checkbox:checked:border-blue-200 dark:group-hover/checkbox:checked:bg-blue-200':\r\n                color === ColorVariant.blue,\r\n              'checked:border-red-400 checked:bg-red-400 group-hover/checkbox:checked:border-red-500 group-hover/checkbox:checked:bg-red-500 dark:checked:border-red-400 dark:checked:bg-red-400 dark:group-hover/checkbox:checked:border-red-300 dark:group-hover/checkbox:checked:bg-red-300':\r\n                color === ColorVariant.red,\r\n              'checked:border-gray-400 checked:bg-gray-400 group-hover/checkbox:checked:border-gray-500 group-hover/checkbox:checked:bg-gray-500 dark:checked:border-gray-400 dark:checked:bg-gray-400 dark:group-hover/checkbox:checked:border-gray-300 dark:group-hover/checkbox:checked:bg-gray-300':\r\n                color === ColorVariant.gray,\r\n              'checked:border-gray-700 checked:bg-gray-700 group-hover/checkbox:checked:border-gray-800 group-hover/checkbox:checked:bg-gray-800 dark:checked:border-gray-200 dark:checked:bg-gray-200 dark:group-hover/checkbox:checked:border-gray-100 dark:group-hover/checkbox:checked:bg-gray-100':\r\n                color === ColorVariant.darkGray,\r\n              'checked:border-blue-400 checked:bg-blue-400 group-hover/checkbox:checked:border-blue-500 group-hover/checkbox:checked:bg-blue-500 dark:checked:border-blue-400 dark:checked:bg-blue-400 dark:group-hover/checkbox:checked:border-blue-500':\r\n                color === ColorVariant.default,\r\n            }\r\n          )}\r\n        />\r\n        {checked && (\r\n          <Icon\r\n            name=\"checkboxTick\"\r\n            className={classnames('absolute left-0.5 top-0.5', {\r\n              'text-gray-50': color === ColorVariant.default,\r\n              'text-white dark:text-gray-800': color !== ColorVariant.default,\r\n            })}\r\n            width={12}\r\n          />\r\n        )}\r\n      </div>\r\n      {label ?? children}\r\n    </label>\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<Props> & HTMLProps<HTMLDivElement>) {\r\n  const container = useRef<HTMLDivElement>(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: boolean) => {\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    <div\r\n      {...props}\r\n      ref={container}\r\n      className={classnames(className, 'relative outline-none')}\r\n      onTouchStart={handleMoveStart}\r\n      onMouseDown={handleMoveStart}\r\n      onKeyDown={handleKeyDown}\r\n      tabIndex={0}\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    <div\r\n      className=\"absolute -m-3 h-6 w-6 rounded-full bg-white bg-checkerboard bg-fixed shadow sm:-m-2 sm:h-4 sm:w-4\"\r\n      style={{\r\n        top: `${top * 100}%`,\r\n        left: `${left * 100}%`,\r\n      }}\r\n    >\r\n      <div className=\"h-full w-full rounded-full border-2 border-white\" style={{ backgroundColor: color }} />\r\n    </div>\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    <DraggablePicker onMove={changeLightness} onKey={changeLightness} aria-label=\"Alpha\">\r\n      <div className=\"flex h-4 overflow-hidden rounded-md bg-white bg-checkerboard bg-fixed\">\r\n        <div className=\"grow\" style={{ backgroundImage: gradientPreview }} />\r\n      </div>\r\n      <Pointer top={0.5} left={1 - color.a} color={hsvaToHEXString(color, true)} />\r\n    </DraggablePicker>\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    <div className=\"grid grid-cols-8 gap-3\" data-testid=\"color-palette\">\r\n      {colors.map((colorObj) => {\r\n        const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n        return (\r\n          <div\r\n            key={colorObj.value}\r\n            className=\"flex h-5 w-full items-center justify-center rounded\"\r\n            title={colorObj.title}\r\n            style={{ backgroundColor: colorObj.value }}\r\n            onClick={() => onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n          >\r\n            {isSelected && <Icon name=\"checkboxTick\" className=\"text-gray-50\" />}\r\n          </div>\r\n        )\r\n      })}\r\n    </div>\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    <DraggablePicker\r\n      onMove={changeSaturation}\r\n      onKey={changeSaturation}\r\n      aria-label=\"Color\"\r\n      className=\"flex grow flex-col\"\r\n    >\r\n      <div className=\"flex h-full flex-1 flex-col overflow-hidden rounded-md bg-gradient-hue\">\r\n        <div className=\"h-full flex-1 bg-white-fade-in\" />\r\n      </div>\r\n      <Pointer top={position.top} left={position.left} color={colorPreview} />\r\n    </DraggablePicker>\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    <DraggablePicker onMove={changeLightness} onKey={changeLightness} aria-label=\"Lightness\">\r\n      <div className=\"flex h-4 rounded-md\" style={{ backgroundImage: gradientPreview }} />\r\n      <Pointer top={0.5} left={1 - color.v} color={colorPreview} />\r\n    </DraggablePicker>\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    <div\r\n      className={classnames(\r\n        'relative flex h-full w-full overflow-hidden border border-gray-100 bg-white bg-checkerboard dark:border-gray-700',\r\n        className\r\n      )}\r\n    >\r\n      {icon && (\r\n        <div className=\"absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center p-0.5\">\r\n          {isValidIconName(icon) ? (\r\n            <Icon name={icon} className=\"shrink-0\" color={isTooLight ? 'black' : 'white'} width=\"100%\" height=\"100%\" />\r\n          ) : (\r\n            icon\r\n          )}\r\n        </div>\r\n      )}\r\n      {colors.map((color, index) => (\r\n        // &nbsp has to be there because of a bug on safari which ignores h-full when empty element\r\n        <div key={index} className=\"h-full flex-1\" style={{ backgroundColor: color }}>\r\n          &nbsp;\r\n        </div>\r\n      ))}\r\n    </div>\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<InputComponentProps, 'onChange'> {\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<HTMLInputElement>\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: React.KeyboardEvent<HTMLInputElement>) => {\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      <Input\r\n        {...props}\r\n        ref={ref}\r\n        value={colorInput}\r\n        inputClass={classnames(\r\n          'text-left',\r\n          {\r\n            'pl-6.5': !hasColorPreview && !isRgba,\r\n            'pl-1': !hasColorPreview && isRgba,\r\n            'pl-12': hasColorPreview && !isRgba,\r\n            'pl-8': hasColorPreview && isRgba,\r\n          },\r\n          inputClass\r\n        )}\r\n        leftContent={\r\n          <div className={classnames('flex items-center', { 'ml-4 pl-1': hasColorPreview })}>\r\n            {hasColorPreview && (\r\n              <div className=\"h-5 w-5\">\r\n                <ColorPreview color={color} className=\"rounded\" />\r\n              </div>\r\n            )}\r\n            {!isRgba && <span className={classnames({ 'ml-2': hasColorPreview })}>#</span>}\r\n          </div>\r\n        }\r\n        onChange={handleColorInputChange}\r\n      />\r\n    )\r\n  }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport 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  const popover = Ariakit.usePopoverContext()\r\n  const input = popover?.useState('disclosureElement')\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    <div className=\"flex h-full w-full flex-col space-y-4 sm:space-y-2\">\r\n      {canSelectCustom && (\r\n        <>\r\n          {isMobile() && (\r\n            <Button onClick={onSetCustomCodeClick} className=\"-mb-2 sm:mb-0\" contentClass=\"text-center\">\r\n              Paste color code\r\n            </Button>\r\n          )}\r\n          <HueSaturation color={hsvaColor} onChange={onChangeCallback} />\r\n          <Lightness color={hsvaColor} onChange={onChangeCallback} />\r\n\r\n          {canSelectAlpha && <Alpha color={hsvaColor} onChange={onChangeCallback} />}\r\n        </>\r\n      )}\r\n\r\n      <div\r\n        className={classnames({\r\n          '-mx-2 border-t border-gray-200 px-2 pt-3 dark:border-gray-700 sm:pt-2': canSelectCustom,\r\n        })}\r\n      >\r\n        <ColorPalette\r\n          color={color}\r\n          onChange={(_hex, orignalColor) => {\r\n            input?.focus({ preventScroll: true })\r\n            onPaletteItemClick?.()\r\n            onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n          }}\r\n        />\r\n      </div>\r\n    </div>\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      <PopoverTrigger\r\n        state={popoverState}\r\n        render={\r\n          <PickerInput\r\n            color={props.color}\r\n            label={label}\r\n            type={isMobileDevice || !canSelectCustom ? 'button' : 'text'}\r\n            data-testid={inputDataTestId}\r\n            onChange={onChange}\r\n          />\r\n        }\r\n      />\r\n      <Popover state={popoverState} hideOnInteractOutside aria-label=\"Color picker\" backdrop={false}>\r\n        <div\r\n          className={classnames(\r\n            'w-64 p-2',\r\n            canSelectCustom && {\r\n              'h-72': isMobileDevice,\r\n              'h-64': !isMobileDevice,\r\n            }\r\n          )}\r\n        >\r\n          <ColorPicker\r\n            {...props}\r\n            onChange={onChange}\r\n            onPaletteItemClick={() => {\r\n              if (canSelectCustom) return\r\n              popoverState.hide()\r\n            }}\r\n          />\r\n        </div>\r\n      </Popover>\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, 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        <div className=\"p-2 pb-0\">\r\n          <PickerInput\r\n            data-testid=\"color-picker-input\"\r\n            label={colorInputLabel}\r\n            color={props.color}\r\n            hasColorPreview={false}\r\n            onChange={onChange}\r\n          />\r\n        </div>\r\n      )}\r\n      <div\r\n        className={classnames(\r\n          'w-full min-w-64 p-2',\r\n          canSelectCustom && {\r\n            'h-72': isMobileDevice,\r\n            'h-64': !isMobileDevice,\r\n          }\r\n        )}\r\n      >\r\n        <ColorPicker {...props} canSelectCustom={canSelectCustom} onChange={onChange} onPaletteItemClick={() => {}} />\r\n      </div>\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    <Button\r\n      leftContent={<ColorPreview color={color} className={classnames('h-4 w-4', ButtonRounding.small)} />}\r\n      {...props}\r\n    >\r\n      {children}\r\n    </Button>\r\n  )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps<ColorType extends ButtonColorProperties>\r\n  extends Omit<ColorPickerProps, 'color' | 'onChange'> {\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   * Identifier for e2e testing\r\n   *\r\n   * @default undefined\r\n   */\r\n  buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker<ColorType extends ButtonColorProperties>({\r\n  size,\r\n  icon,\r\n  colors,\r\n  className,\r\n  onChange,\r\n  buttonPickerDataTestId,\r\n  ...props\r\n}: ButtonColorPickerProps<ColorType>) {\r\n  const popoverState = usePopoverState()\r\n  const isOpen = popoverState.useState('open')\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      <Button\r\n        state={popoverState}\r\n        as={PopoverTrigger}\r\n        data-testid={buttonPickerDataTestId}\r\n        theme=\"outline\"\r\n        className={classnames('p-0.5', className)}\r\n        rounding=\"regular\"\r\n        appearance=\"square\"\r\n        size={size}\r\n        active={isOpen}\r\n      >\r\n        <ColorPreview\r\n          icon={icon}\r\n          color={colors.map(({ color }) => color)}\r\n          className={classnames('h-full w-full', ButtonRounding.small)}\r\n        />\r\n      </Button>\r\n      <Popover state={popoverState} aria-label=\"Color picker\">\r\n        {isMultiPicker && (\r\n          <div className=\"flex justify-center p-2 pb-0\">\r\n            <ButtonGroup childComponent={ColorTabButton} hasDivider={false}>\r\n              {colors.map(({ color, label }, index) => (\r\n                <ColorTabButton\r\n                  key={index}\r\n                  color={color}\r\n                  active={activeColorIndex === index}\r\n                  onClick={() => setActiveColorIndex(index)}\r\n                >\r\n                  {label}\r\n                </ColorTabButton>\r\n              ))}\r\n            </ButtonGroup>\r\n          </div>\r\n        )}\r\n        <MultiColorPicker\r\n          key={activeColorIndex}\r\n          {...props}\r\n          color={colors[activeColorIndex].color}\r\n          onChange={handleColorChange}\r\n        />\r\n      </Popover>\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<InputProps, 'label'> {\r\n  className?: string\r\n  text: string\r\n  bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC<Props> = ({ 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    <div className={className}>\r\n      <Textarea\r\n        label={label}\r\n        readOnly\r\n        onClick={(e) => e.currentTarget.select()}\r\n        inputClass=\"h-12\"\r\n        data-testid=\"copy-to-clipboard-textarea\"\r\n        value={text}\r\n      />\r\n      <div className=\"mt-1 flex flex-wrap\">\r\n        {bottomLeftContent && <div>{bottomLeftContent}</div>}\r\n        <Button\r\n          className=\"ml-auto flex-none\"\r\n          theme=\"blue\"\r\n          onClick={handleCopyToClipboard}\r\n          disabled={isCopied}\r\n          leftContent={isCopied ? 'checkboxTick' : undefined}\r\n          data-testid=\"copy-to-clipboard-copy-button\"\r\n        >\r\n          {isCopied ? 'Copied' : 'Copy'}\r\n        </Button>\r\n      </div>\r\n    </div>\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 { usePrevious } from '../../hooks/use-previous'\r\nimport { usePopoverPlacement } from '../../hooks/usePopoverPlacement'\r\nimport { blurWithoutScroll, focusWithoutScroll, preventDefault } from '../../util'\r\n\r\nenum DropdownRounding {\r\n  none = '',\r\n  regular = 'rounded-lg',\r\n}\r\n\r\nenum DropdownTheme {\r\n  none = '',\r\n  default = 'border border-primary bg-primary',\r\n}\r\n\r\ninterface StatelessDropdownProps\r\n  extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'>,\r\n    Pick<Ariakit.MenuProps, 'hideOnInteractOutside'> {\r\n  /**\r\n   * Trigger button for the dropdown\r\n   */\r\n  trigger: JSX.Element | null\r\n\r\n  /**\r\n   * Disable interaction with other page elements when the dropdown is open\r\n   *\r\n   * @default true\r\n   */\r\n  modal?: boolean\r\n\r\n  /**\r\n   * When true, the dropdown will show when dropdown is hovered. Combine with\r\n   * `backdrop={false}` to make the popover hide on mouse out\r\n   */\r\n  showOnHover?: boolean\r\n\r\n  /**\r\n   * Placement of the dropdown\r\n   *\r\n   */\r\n  placement?: Ariakit.MenuProviderProps['placement']\r\n\r\n  /**\r\n   * Orientation in which the items are laid out. Changes which arrows control next/prev item\r\n   *\r\n   * @default vertical\r\n   */\r\n  orientation?: 'vertical' | 'horizontal'\r\n\r\n  /**\r\n   * Set rounding for the dropdown list\r\n   *\r\n   * @default regular\r\n   */\r\n  rounding?: keyof typeof DropdownRounding\r\n\r\n  /**\r\n   * Dropdown theme\r\n   *\r\n   * @default default\r\n   */\r\n  theme?: keyof typeof DropdownTheme\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   * Show backdrop on the dialog. Provide your own element if you want to add background or animation\r\n   *\r\n   */\r\n  backdrop?: false | JSX.Element\r\n\r\n  /**\r\n   * Do not render the items when the popover is not visible\r\n   *\r\n   * @default true\r\n   */\r\n  unmountOnHide?: boolean\r\n\r\n  /**\r\n   * If true, the dropdown will overlay the trigger if necessary instead of going\r\n   * out of bounds and overflowing\r\n   */\r\n  overlap?: boolean\r\n\r\n  /**\r\n   * Callback before the menu starts hiding. Event can be prevented which keeps the menu open\r\n   * This callback isn’t called on backdrop click. Use `backdrop={<div onMouseDown={…} />}` to react on backdrop clicks\r\n   */\r\n  onClose?: (ev: Event) => void\r\n\r\n  /**\r\n   * Used to provide virtual anchor, useful for context menu, etc\r\n   */\r\n  getAnchorRect?: () => { x: number; y: number }\r\n\r\n  /**\r\n   * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n   * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n   */\r\n  autoFocusOnShow?: false | ((element: HTMLElement) => boolean)\r\n\r\n  /**\r\n   * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n   * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n   */\r\n  autoFocusOnHide?: false | ((element: HTMLElement) => boolean)\r\n\r\n  /**\r\n   * Callback which is called when the dialog opens and all animations complete\r\n   */\r\n  onFullyOpen?: () => void\r\n\r\n  /**\r\n   * Callback which is called when the dialog closes and all animations complete\r\n   */\r\n  onFullyClosed?: () => void\r\n}\r\n\r\nexport const StatelessDropdown = React.forwardRef(function DropdownComponent(\r\n  {\r\n    trigger,\r\n    modal = true,\r\n    rounding = 'regular',\r\n    theme = 'default',\r\n    gutter,\r\n    unmountOnHide = true,\r\n    children,\r\n    backdrop,\r\n    showOnHover,\r\n    hideOnInteractOutside,\r\n    autoFocusOnShow,\r\n    autoFocusOnHide,\r\n    onFullyOpen,\r\n    onFullyClosed,\r\n    ...props\r\n  }: React.PropsWithChildren<StatelessDropdownProps>,\r\n  ref: React.ForwardedRef<HTMLButtonElement>\r\n) {\r\n  const store = Ariakit.useMenuContext()\r\n  const { placement, zIndex, updatePosition } = usePopoverPlacement(store)\r\n  const isOpen = store?.useState('open')\r\n  const [isFullyOpen, setIsFullyOpen] = React.useState(false)\r\n  const isMounted = store?.useState('mounted')\r\n  const wasMounted = usePrevious(isMounted)\r\n  const menuGutter = gutter ?? (store?.parent ? 6 : 4)\r\n\r\n  React.useEffect(() => {\r\n    if (wasMounted && !isMounted) {\r\n      onFullyClosed?.()\r\n    }\r\n    // We want to call it only on isMounted change\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isMounted])\r\n\r\n  return (\r\n    <>\r\n      {trigger && (\r\n        <Ariakit.MenuButton\r\n          ref={ref}\r\n          // @ts-expect-error - TS is correct here MenuButton doesn’t have `active` prop,\r\n          // but we want to pass it to the rendered component\r\n          active={store?.parent ? undefined : isOpen}\r\n          showOnHover={showOnHover}\r\n          render={trigger}\r\n        />\r\n      )}\r\n      <Ariakit.Menu\r\n        {...props}\r\n        focusable={false}\r\n        // Render in a portal to escape overflow\r\n        portal\r\n        modal={modal || showOnHover === false}\r\n        hideOnHoverOutside={showOnHover}\r\n        hideOnInteractOutside={hideOnInteractOutside}\r\n        preventBodyScroll={false}\r\n        // Do not keep the children mounted when the popover is closed\r\n        unmountOnHide={unmountOnHide}\r\n        // Space between button and popover\r\n        gutter={menuGutter}\r\n        // Manage the focus ourselves so we can prevent scrolling when focusing the disclosure element\r\n        // We can’t focus if using `showOnHover`.\r\n        autoFocusOnShow={autoFocusOnShow ?? focusWithoutScroll}\r\n        autoFocusOnHide={autoFocusOnHide ?? blurWithoutScroll}\r\n        // Custom event prevents scrolling issues\r\n        // See website PR #1968\r\n        backdrop={backdrop ?? <div onMouseDown={preventDefault} data-testid=\"dropdown-backdrop\" />}\r\n        // Update zIndex when popover position changes\r\n        updatePosition={updatePosition}\r\n        // E2E tests don’t wait for transitions to complete and it could lead to bugs with other popover components (ResizeObserver loop exceeded)\r\n        // or visual diffs due a screenshot being captured while the dropdown still in transition\r\n        // If you encounter this problem, just do `cy.get('[data-fully-open=true]').should('exist')` before continuing to wait for the dropdown\r\n        data-fully-open={isFullyOpen}\r\n        className={classNames(\r\n          props.className,\r\n          zIndex,\r\n          DropdownRounding[rounding],\r\n          DropdownTheme[theme],\r\n          'custom-scrollbar absolute 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-radius:0]': DropdownRounding[rounding] === DropdownRounding.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        onTransitionEnd={(ev) => {\r\n          if (ev.target === ev.currentTarget && isOpen) {\r\n            setIsFullyOpen(true)\r\n            onFullyOpen?.()\r\n          }\r\n        }}\r\n      >\r\n        <div\r\n          tabIndex={-1}\r\n          className=\"flex max-h-[500px] grow scroll-py-1.5 flex-col overflow-y-auto overscroll-contain p-1.5 outline-none\"\r\n        >\r\n          {children}\r\n        </div>\r\n      </Ariakit.Menu>\r\n    </>\r\n  )\r\n})\r\n\r\nexport interface DropdownProps extends StatelessDropdownProps {\r\n  state?: Ariakit.MenuStore\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(\r\n  (\r\n    { state, placement, orientation = 'vertical', ...props }: React.PropsWithChildren<DropdownProps>,\r\n    ref: React.ForwardedRef<HTMLButtonElement>\r\n  ) => (\r\n    <Ariakit.MenuProvider store={state} focusLoop virtualFocus placement={placement} orientation={orientation}>\r\n      <StatelessDropdown ref={ref} {...props} />\r\n    </Ariakit.MenuProvider>\r\n  )\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { OptionButton, OptionButtonProps } from '../OptionButton'\r\nimport { BUTTON_DEFAULT_ELEMENT } from '../button'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface DropdownItemProps extends OptionButtonProps {\r\n  store?: Ariakit.MenuStore\r\n\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  hideOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent<TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT>(\r\n  { as: asComponent, ...props }: PropsWithAs<TagType> & DropdownItemProps,\r\n  ref: React.ForwardedRef<HTMLDivElement>\r\n) {\r\n  return <Ariakit.MenuItem ref={ref} {...props} render={<OptionButton as={asComponent} />} />\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 BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n  props: PropsWithAs<TagType> & DropdownItemProps & { ref?: React.ForwardedRef<HTMLElement> }\r\n) => ReturnType<typeof DropdownItemComponent>\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport const useDropdownState = Ariakit.useMenuStore\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps<SVGSVGElement>\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n  return (\r\n    <svg\r\n      {...props}\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      className={classnames('pointer-events-none block shrink-0 fill-current', className)}\r\n      width={width}\r\n      height={height}\r\n    />\r\n  )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { PartialBy } from '../../types'\r\nimport { MenuGroup } from '../MenuGroup'\r\nimport { Dropdown, DropdownItem, DropdownProps } from '../dropdown'\r\nimport { ObjectHash } from '../types'\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 ContextMenuInnerProps extends PartialBy<DropdownProps, 'trigger'> {\r\n  /**\r\n   * Items visible in the menu\r\n   */\r\n  items: ContextMenuItem[]\r\n}\r\n\r\nexport function ContextMenuInner(\r\n  { trigger, items, onClose, ...props }: ContextMenuInnerProps,\r\n  ref: React.ForwardedRef<HTMLButtonElement>\r\n) {\r\n  return (\r\n    <Dropdown\r\n      ref={ref}\r\n      {...props}\r\n      aria-label=\"Context Menu\"\r\n      trigger={trigger!}\r\n      onClose={onClose}\r\n      // Props are passed to the underlying dropdown menu div, this disables context menu on options\r\n      onContextMenu={(ev) => ev.preventDefault()}\r\n    >\r\n      {items?.map((item, index) => {\r\n        if (item.type === 'divider') {\r\n          return <MenuGroup key={index} label={item.label} />\r\n        }\r\n\r\n        if (item?.options !== undefined) {\r\n          return (\r\n            <ContextMenuInner\r\n              items={item.options}\r\n              onClose={onClose}\r\n              trigger={\r\n                <DropdownItem rightContent=\"caretRight\" data-testid={`dropdown-menu-${item.id}`}>\r\n                  {item.label}\r\n                </DropdownItem>\r\n              }\r\n            />\r\n          )\r\n        }\r\n\r\n        return (\r\n          <DropdownItem\r\n            key={index}\r\n            onClick={() => {\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          >\r\n            {item.label}\r\n          </DropdownItem>\r\n        )\r\n      })}\r\n    </Dropdown>\r\n  )\r\n}\r\n\r\nexport const ContextMenu = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps<HTMLDivElement> {\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<HTMLDivElement, ChartGridCellProps>(\r\n  ({ children, gridArea, className, ...props }, ref) => (\r\n    <div\r\n      {...props}\r\n      ref={ref}\r\n      className={classnames(className, 'flex flex-1 flex-col overflow-hidden')}\r\n      style={{ gridArea }}\r\n    >\r\n      {children}\r\n    </div>\r\n  )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps<HTMLDivElement> {\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    <div\r\n      {...props}\r\n      className={classnames(className, 'grid grow gap-px', {\r\n        'border border-gray-100 bg-gray-100 dark:border-gray-700 dark:bg-gray-700': border,\r\n      })}\r\n      style={{ gridTemplateColumns: `repeat(${columns}, 1fr)`, gridTemplateRows: `repeat(${rows}, 1fr)` }}\r\n    >\r\n      {children}\r\n    </div>\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<ChartGridProps> = (props) => <GridLayout {...props} />\r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor<any, any, any> = (data) => data\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst DEFAULT_VALUE_KEY = 'value'\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n  TagType extends React.ElementType,\r\n  ValueKey extends keyof React.ComponentProps<TagType> = typeof DEFAULT_VALUE_KEY,\r\n  ChangeKey extends keyof React.ComponentProps<TagType> = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters<React.ComponentProps<TagType>[ChangeKey]>) => React.ComponentProps<TagType>[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n  TagType extends React.ElementType,\r\n  ValueKey extends keyof React.ComponentProps<TagType>,\r\n  ChangeKey extends keyof React.ComponentProps<TagType>,\r\n> = RequireByKey<PropsWithAs<TagType>, 'as'> & {\r\n  valueKey?: ValueKey\r\n  changeKey?: ChangeKey\r\n  valueAccessor?: ValueAccessor<TagType, ValueKey, ChangeKey>\r\n}\r\n\r\nexport function InnerState<\r\n  TagType extends React.ElementType,\r\n  ValueKey extends keyof React.ComponentProps<TagType> = typeof DEFAULT_VALUE_KEY,\r\n  ChangeKey extends keyof React.ComponentProps<TagType> = 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<TagType, ValueKey, ChangeKey>) {\r\n  const { [valueKey]: value, [changeKey]: onChange } = props\r\n  const [state, setState] = React.useState<React.ComponentProps<TagType>[ValueKey]>(value)\r\n\r\n  const handleChange = React.useCallback<ValueAccessor<TagType, ValueKey, ChangeKey>>(\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<HTMLInputElement>\r\n\r\ninterface RangeSliderProps extends Omit<InputProps, 'label' | 'size'> {\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<HTMLDivElement>(null)\r\n  const thumbRef = useRef<HTMLSpanElement>(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    <Label title={label} className={className}>\r\n      <div className={classnames(RangeSize[size], 'group flex h-8 items-center space-x-3')}>\r\n        {leftContent}\r\n\r\n        <div ref={trackRef} className=\"relative grow\">\r\n          <div className=\"group w-full\">\r\n            <div\r\n              className={classnames('h-0.5 overflow-hidden rounded bg-gray-200 dark:bg-gray-600', {\r\n                'opacity-0': !hasTrack,\r\n              })}\r\n            >\r\n              <div\r\n                className=\"h-full origin-top-left bg-blue-400 group-hover:bg-blue-500\"\r\n                style={{ width: `${thumbLeft}%` }}\r\n              />\r\n            </div>\r\n\r\n            <span\r\n              ref={thumbRef}\r\n              className={classnames(\r\n                'absolute top-1/2 -mt-3 h-6 w-6 rounded-full border-2 border-blue-400 bg-white shadow transition-transform duration-200 group-hover:scale-110 group-hover:border-blue-500 dark:bg-gray-600 sm:-mt-2 sm:h-4 sm:w-4',\r\n                { 'opacity-0': !hasTrack }\r\n              )}\r\n              style={{ left: `${thumbLeft}%` }}\r\n            />\r\n          </div>\r\n\r\n          <input\r\n            {...props}\r\n            type=\"range\"\r\n            min={min}\r\n            max={max}\r\n            step={step}\r\n            className={classnames(inputClassName, 'absolute top-0 h-full w-full cursor-pointer opacity-0')}\r\n          />\r\n        </div>\r\n\r\n        {rightContent}\r\n      </div>\r\n    </Label>\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<IToolbarContext>({\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 * as Ariakit from '@ariakit/react'\r\nimport 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 { StatelessDropdown } from '../dropdown'\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<HTMLDivElement> => {\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 bg-white dark:bg-gray-800', {\r\n          'p-1.5': !isMobile,\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        }),\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<ToolbarProps>) {\r\n  const hasFocusRings = React.useRef(false)\r\n  const toolbarRef = React.useRef<HTMLDivElement>(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  return (\r\n    <Ariakit.Menubar\r\n      ref={toolbarRef}\r\n      focusable={false}\r\n      id=\"toolbar\"\r\n      data-testid=\"toolbar\"\r\n      className={classnames(toolbarSettings.className, className)}\r\n      orientation={\r\n        contextProviderValue.isWrapped ? 'both' : contextProviderValue.isStretched ? 'horizontal' : 'vertical'\r\n      }\r\n    >\r\n      <Ariakit.MenuProvider\r\n        showTimeout={100}\r\n        hideTimeout={200}\r\n        placement={contextProviderValue.isStretched ? 'bottom' : 'right-start'}\r\n      >\r\n        <ToolbarContext.Provider value={contextProviderValue}>{children}</ToolbarContext.Provider>\r\n        <StatelessDropdown\r\n          // This is where all the group items will be rendered and the trigger will be assigned programmatically\r\n          trigger={null}\r\n          modal={false}\r\n          backdrop={false}\r\n          rounding={\r\n            contextProviderValue.theme === ToolbarTheme.alternative && !FinvizSettings.hasRedesignEnabled\r\n              ? 'none'\r\n              : undefined\r\n          }\r\n          autoFocusOnShow={() => {\r\n            hasFocusRings.current = !!document.querySelector('[data-focus-visible]')\r\n            return true\r\n          }}\r\n          autoFocusOnHide={(el: HTMLElement) => {\r\n            // Only call focus when we previously had focus rings to prevent sticky focus rings\r\n            if (hasFocusRings.current) el.focus({ preventScroll: true })\r\n            hasFocusRings.current = false\r\n            return false\r\n          }}\r\n        />\r\n      </Ariakit.MenuProvider>\r\n    </Ariakit.Menubar>\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 } 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  className,\r\n  theme,\r\n  isActive,\r\n  isStretched,\r\n  isInAction,\r\n}: {\r\n  className: string\r\n  theme: ToolbarTheme\r\n  isStretched: boolean\r\n  isActive?: boolean\r\n  isInAction?: boolean\r\n}): Omit<ButtonHTMLProps, 'as'> & 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          className,\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          className,\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<ButtonProps, 'theme'> {\r\n  rowId?: number\r\n  item: IToolbarItem\r\n  disabledTooltip?: string\r\n  isInAction?: boolean\r\n  isLoading?: boolean\r\n}\r\n\r\nexport const ToolbarButton = React.forwardRef(function ToolbarButton<TagType extends React.ElementType = 'button'>(\r\n  { item, disabledTooltip, isInAction: isInActionProp, isLoading, ...props }: PropsWithAs<TagType> & ToolbarButtonProps,\r\n  ref: React.ForwardedRef<HTMLElement>\r\n) {\r\n  const context = Ariakit.useMenuContext()\r\n  const { theme, isStretched } = useToolbarContext()\r\n  const isInAction = isInActionProp && item.iconAction !== undefined\r\n  const buttonSettings = getButtonThemeSettings({\r\n    className: props.className,\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    <Icon name={(props.active && item.iconActive) || item.icon} width={32} className=\"shrink-0\" />\r\n  )\r\n\r\n  return (\r\n    <Ariakit.MenuItem\r\n      {...props}\r\n      // Ariakit defines the element to be a div, but we know we are rendering a button\r\n      ref={ref as React.ForwardedRef<HTMLDivElement>}\r\n      store={context?.menubar || undefined}\r\n      blurOnHoverEnd\r\n      render={\r\n        <Button\r\n          {...buttonSettings}\r\n          className={buttonSettings.className}\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            <Delayed delay={100} delayComponent={getMainIcon()}>\r\n              <Spinner width={16} />\r\n            </Delayed>\r\n          ) : (\r\n            <>\r\n              {props.children ??\r\n                (isInAction ? (\r\n                  <Delayed delay={100} delayComponent={getMainIcon()}>\r\n                    <Icon name={item.iconAction} width={32} className=\"shrink-0\" />\r\n                  </Delayed>\r\n                ) : (\r\n                  getMainIcon()\r\n                ))}\r\n            </>\r\n          )}\r\n        </Button>\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 { isMobile } from '../../../app/shared/isMobile'\r\nimport { DropdownItem } from '../dropdown'\r\nimport { Icon } from '../icon'\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\nconst isMobileBrowser = isMobile()\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  rowId?: number\r\n}\r\n\r\nexport const ToolbarGroup = React.forwardRef(function ToolbarGroup(\r\n  {\r\n    defaultItem,\r\n    isActive,\r\n    isLoading,\r\n    groupItems,\r\n    groupTitle,\r\n    onChange,\r\n    useNativeSelect = isMobileBrowser,\r\n    disabled,\r\n    disabledTooltip,\r\n    rowId,\r\n  }: ToolbarGroupProps,\r\n  ref: React.ForwardedRef<HTMLButtonElement>\r\n) {\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\r\n  // Setup states, pass Menubar context to this menu so we can control the shared menu\r\n  const context = Ariakit.useMenuContext()\r\n  const menu = Ariakit.useMenuStore({ store: context })\r\n\r\n  // We have multiple menu triggers but just one shared menu so we need a way to know which button has been hovered\r\n  const [menuButton, setMenuButton] = React.useState<HTMLDivElement | null>(null)\r\n  const open = menu.useState((state) => state.mounted && state.anchorElement === menuButton)\r\n\r\n  // Find the element to render the menu into using Portal\r\n  const parentMenu = menu.useState('contentElement')\r\n  const menuContentElement = React.useMemo(() => parentMenu?.querySelector('div'), [parentMenu])\r\n\r\n  /**\r\n   * Charts prevent bubling mouseover so we need to hide the menu manually\r\n   */\r\n  const hideMenu = menu.hide\r\n  React.useEffect(() => {\r\n    const onMouseLeave = () => hideMenu()\r\n\r\n    parentMenu?.addEventListener('mouseleave', onMouseLeave)\r\n    return () => parentMenu?.removeEventListener('mouseleave', onMouseLeave)\r\n  }, [hideMenu, parentMenu])\r\n\r\n  const showMenu = menu.show\r\n  const handleMenuOpen = React.useCallback(\r\n    (ev: React.SyntheticEvent<HTMLElement, Event>) => {\r\n      menu.setDisclosureElement(ev.currentTarget)\r\n      menu.setAnchorElement(ev.currentTarget)\r\n      showMenu()\r\n    },\r\n    [menu, showMenu]\r\n  )\r\n\r\n  const trigger = (\r\n    <ToolbarButton\r\n      ref={ref}\r\n      rowId={rowId}\r\n      className=\"relative\"\r\n      data-testid={`toolbar-group-${groupId}-expand`}\r\n      item={selectedItem}\r\n      active={isActive}\r\n      disabled={disabled}\r\n      title={groupTitle}\r\n      disabledTooltip={disabledTooltip}\r\n      isLoading={isLoading}\r\n    >\r\n      <Icon name={(isActive && selectedItem.iconActive) || selectedItem.icon} width={32} className=\"shrink-0\" />\r\n      <Icon name=\"toolExpand\" width={32} className=\"absolute flex\" />\r\n    </ToolbarButton>\r\n  )\r\n\r\n  if (useNativeSelect) {\r\n    return (\r\n      <label\r\n        className={classnames('relative flex', {\r\n          grow: isAlternativeTheme && isStretched,\r\n        })}\r\n      >\r\n        {trigger}\r\n        <NativeSelect\r\n          className=\"pointer-events-none\"\r\n          items={groupItems.map((item) => ({ 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      </label>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <Ariakit.MenuProvider store={menu} parent={null} focusLoop virtualFocus>\r\n      <Ariakit.MenuButton\r\n        ref={setMenuButton}\r\n        showOnHover\r\n        render={trigger}\r\n        onFocusVisible={handleMenuOpen}\r\n        onClick={(ev: React.MouseEvent<HTMLButtonElement>) => {\r\n          // Preventing this means the dropdown will only open on hover not by a click\r\n          ev.preventDefault()\r\n        }}\r\n        onPointerDown={(ev: React.PointerEvent<HTMLButtonElement>) => {\r\n          // Finally, pre-select the current group tool\r\n          onChange(selectedItem.id, 'group')\r\n          handleMenuOpen(ev)\r\n        }}\r\n      />\r\n      {open && (\r\n        // Render this menu's contents into the parent menu.\r\n        <Ariakit.Portal portalElement={menuContentElement} render={<React.Fragment />}>\r\n          {groupItems.map((item) => (\r\n            <DropdownItem\r\n              key={item.id}\r\n              store={menu}\r\n              leftContent={<Icon name={item.icon} className=\"mr-1.5 shrink-0\" width={28} />}\r\n              data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n              rounding={theme === ToolbarTheme.alternative && !FinvizSettings.hasRedesignEnabled ? 'none' : undefined}\r\n              onPointerDown={() => {\r\n                setSelectedItem(item)\r\n                onChange(item.id, 'select')\r\n              }}\r\n            >\r\n              {item.title}\r\n            </DropdownItem>\r\n          ))}\r\n        </Ariakit.Portal>\r\n      )}\r\n    </Ariakit.MenuProvider>\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  rowId,\r\n}: PartialBy<ToolbarGroupProps, 'groupItems'>) {\r\n  const isItemActive = isActive && !disabled\r\n\r\n  if (!!groupItems?.length) {\r\n    return (\r\n      <ToolbarGroup\r\n        rowId={rowId}\r\n        groupTitle={groupTitle}\r\n        groupItems={groupItems}\r\n        defaultItem={defaultItem}\r\n        disabled={disabled}\r\n        isActive={isItemActive}\r\n        isLoading={isLoading}\r\n        onChange={onChange}\r\n        useNativeSelect={useNativeSelect}\r\n        disabledTooltip={disabledTooltip}\r\n      />\r\n    )\r\n  }\r\n\r\n  return (\r\n    <ToolbarButton\r\n      rowId={rowId}\r\n      data-testid={`toolbar-item-${defaultItem.id}`}\r\n      item={defaultItem}\r\n      active={isItemActive}\r\n      isLoading={isLoading}\r\n      isInAction={isInAction}\r\n      disabled={disabled}\r\n      disabledTooltip={disabledTooltip}\r\n      onClick={() => {\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    <div\r\n      className={classnames(\r\n        'bg-gray-100 dark:bg-gray-600',\r\n        {\r\n          'col-span-2 min-h-[1px] w-full': direction === ToolbarDirection.vertical,\r\n          'mx-2 min-w-[1px]': direction === ToolbarDirection.horizontal,\r\n          'my-2': direction === ToolbarDirection.vertical && theme === ToolbarTheme.alternative,\r\n          'h-full': direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n          'h-8': direction === ToolbarDirection.horizontal && theme === ToolbarTheme.alternative,\r\n        },\r\n        className\r\n      )}\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    <Box className=\"w-64 p-4 pb-14\">\r\n      {step.title && (\r\n        <Heading level={5} className=\"mb-2\">\r\n          {step.title}\r\n        </Heading>\r\n      )}\r\n      {step.body && <Paragraph>{step.body}</Paragraph>}\r\n    </Box>\r\n  )\r\n}\r\n","import { offset, shift } from '@floating-ui/dom'\r\nimport 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 = <T>(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(\r\n        buttonClasses,\r\n        'mr-auto',\r\n        getButtonTheme({ theme: ButtonTheme.light }).button,\r\n        ButtonPadding.regular\r\n      ),\r\n      text: 'Exit',\r\n    },\r\n    index > 0 && {\r\n      action: tour.back,\r\n      classes: classnames(buttonClasses, getButtonTheme({ theme: ButtonTheme.light }).button, ButtonPadding.regular),\r\n      text: step.backButton ?? 'Back',\r\n    },\r\n    {\r\n      classes: classnames(buttonClasses, getButtonTheme({ theme: 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.StepOptions[] {\r\n  return steps.map((step, index) => ({\r\n    attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n    classes: 'z-dialog bg-transparent m-0',\r\n    floatingUIOptions: {\r\n      middleware: [shift({ padding: 10 }), offset(step.offset ?? { mainAxis: 10, crossAxis: 0 })],\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.TourOptions) {\r\n  const [isLoading, setIsLoading] = React.useState(false)\r\n  const [currentTour, setTour] = React.useState<Shepherd.Tour | null>(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        void 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","/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps } from '../button'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\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  xlarge = '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 <Icon name={content} />\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\nconst InternalTab = React.forwardRef(function InternalTab<\r\n  TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n  {\r\n    rounding = 'none',\r\n    theme = 'tab',\r\n    size = 'medium',\r\n    'aria-selected': ariaSelected,\r\n    children,\r\n    ...props\r\n  }: Omit<ButtonComponentProps<TagType>, 'theme'>,\r\n  ref: React.ForwardedRef<HTMLElement>\r\n) {\r\n  const spacing = TabSpacing[size]\r\n  const active = Boolean(ariaSelected)\r\n  const rightContent = getRightContent(props.rightContent, active)\r\n\r\n  return (\r\n    <Button\r\n      // TS thinks the Omit type (due to spread above) doesn’t satisfy button props\r\n      {...(props as ButtonComponentProps<TagType>)}\r\n      ref={ref}\r\n      active={active}\r\n      theme={theme}\r\n      size={size}\r\n      rounding={rounding}\r\n      rightContent={undefined}\r\n      className={classNames('group/badge', props.className)}\r\n      contentClass={classNames(spacing, 'flex', props.contentClass)}\r\n    >\r\n      <span>{children}</span>\r\n      {rightContent}\r\n    </Button>\r\n  )\r\n})\r\n\r\nexport function Tab<TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT>(\r\n  props: React.PropsWithChildren<ButtonComponentProps<TagType>>\r\n) {\r\n  return <Ariakit.Tab {...props} render={<InternalTab />} />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\n\r\nexport function TabList(props: Ariakit.TabListProps) {\r\n  return (\r\n    <Ariakit.TabList\r\n      {...props}\r\n      className={classNames(props.className, 'flex shadow-[inset_0_-1px_0] shadow-gray-100 dark:shadow-gray-700')}\r\n    />\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function TabPanel(props: Ariakit.TabPanelProps) {\r\n  return <Ariakit.TabPanel {...props} />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function Tabs({ children }: React.PropsWithChildren<Ariakit.TabProviderProps>) {\r\n  return (\r\n    <Ariakit.TabProvider>\r\n      <div className=\"w-full space-y-1\">{children}</div>\r\n    </Ariakit.TabProvider>\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-2 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  className?: string\r\n  size?: BadgeSizeType\r\n  padding?: BadgePaddingType\r\n  active?: boolean\r\n}\r\n\r\nexport function Badge({\r\n  className,\r\n  size = 'medium',\r\n  padding = size,\r\n  active,\r\n  children,\r\n}: React.PropsWithChildren<BadgeProps>) {\r\n  const badgePadding = BadgePadding[padding]\r\n  const badgeSize = BadgeSize[size]\r\n\r\n  return (\r\n    <span\r\n      className={classNames(\r\n        className,\r\n        'inline-flex justify-center rounded-full text-2xs leading-4 font-medium',\r\n        badgePadding,\r\n        badgeSize,\r\n        {\r\n          'bg-blue-500 text-blue-50 dark:text-white': active,\r\n          'bg-gray-200/30 text-default group-hover/badge:bg-gray-200/50 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:group-hover/badge:bg-gray-200/50 dark:hover:bg-gray-200/50':\r\n            !active,\r\n        }\r\n      )}\r\n    >\r\n      {children}\r\n    </span>\r\n  )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum TagSize {\r\n  small = 'h-4 min-w-4', // 16px height\r\n  medium = 'h-5 min-w-5', // 20px height\r\n  large = 'min-w-5',\r\n}\r\ntype TagSizeType = keyof typeof TagSize\r\n\r\nenum TagPadding {\r\n  small = 'px-[5px] py-0', // 16px height\r\n  medium = 'px-1.5 py-0.5', // 20px height\r\n  large = 'p-3',\r\n}\r\ntype TagPaddingType = keyof typeof TagPadding\r\n\r\nenum TagFont {\r\n  small = 'text-3xs leading-3', // 10px/12px\r\n  medium = 'text-2xs leading-4', // 12px/16px\r\n  large = 'text-sm',\r\n}\r\n\r\nenum TagVariant {\r\n  filled = 'border border-bg-primary bg-gray-50 text-gray-600 font-medium dark:bg-gray-600 dark:text-gray-50',\r\n  bordered = 'border border-primary text-muted',\r\n}\r\n\r\ntype TagVariantType = keyof typeof TagVariant\r\n\r\nenum TagRounding {\r\n  small = 'rounded-sm',\r\n  // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\r\n  medium = 'rounded-sm',\r\n  large = 'rounded-md',\r\n}\r\n\r\ntype TagProps = {\r\n  size?: TagSizeType\r\n  padding?: TagPaddingType\r\n  variant?: TagVariantType\r\n  className?: string\r\n}\r\n\r\nexport function Tag({\r\n  className,\r\n  size = 'medium',\r\n  padding = size,\r\n  variant = 'filled',\r\n  children,\r\n}: React.PropsWithChildren<TagProps>) {\r\n  const tagPadding = TagPadding[padding]\r\n  const tagSize = TagSize[size]\r\n  const tagFont = TagFont[size]\r\n  const tagRounding = TagRounding[size]\r\n  const tagVariant = TagVariant[variant]\r\n\r\n  return (\r\n    <span\r\n      className={classNames(\r\n        className,\r\n        'inline-flex items-center justify-center',\r\n        tagPadding,\r\n        tagRounding,\r\n        tagVariant,\r\n        tagSize,\r\n        tagFont\r\n      )}\r\n    >\r\n      {children}\r\n    </span>\r\n  )\r\n}\r\n","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick<DelayedProps, 'delay' | 'timeout' | 'throwOnTimeout'>\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n  return (\r\n    <Delayed\r\n      delay={delay}\r\n      timeout={timeout}\r\n      delayComponent={null}\r\n      throwOnTimeout={throwOnTimeout}\r\n      timeoutComponent={\r\n        <ErrorView\r\n          showContact={false}\r\n          title=\"Loading error\"\r\n          message={\r\n            <>\r\n              There’s been an error loading the application.\r\n              <br />\r\n              Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n              <a href={link.toContact()} className=\"text-blue-600 underline hover:no-underline\">\r\n                contact support\r\n              </a>\r\n              .\r\n            </>\r\n          }\r\n        />\r\n      }\r\n    >\r\n      <Spinner />\r\n    </Delayed>\r\n  )\r\n}\r\n\r\nexport function LoadingScreen(props: LoadingProps) {\r\n  return (\r\n    <div className=\"flex max-h-screen min-h-64 grow items-center justify-center\">\r\n      <Loading {...props} />\r\n    </div>\r\n  )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType<typeof useNotification>\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<NotificationOptions>\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren<any>) {\r\n  const [isOpen, setIsOpen] = React.useState(false)\r\n  const [notification, setNotification] = React.useState<NotificationState | null>(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<NotificationOptions> = {}) => {\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    <NotificationContext.Provider value={context.current}>\r\n      {props.children}\r\n      {isOpen && (\r\n        <WrapperComponent>\r\n          <Ariakit.Dialog\r\n            role=\"alert\"\r\n            aria-label=\"Notification\"\r\n            className={classnames(\r\n              positionClass,\r\n              'pointer-events-none fixed left-0 top-0 z-notification flex origin-top-left p-2 opacity-0 transition-opacity data-[enter]:opacity-100 data-[leave]:transition-none sm:p-5'\r\n            )}\r\n            unmountOnHide\r\n            // Manually control the state\r\n            open={isOpen}\r\n            onClose={context.current.hide}\r\n            // Disable modal settings so that we can still interact with other elements\r\n            modal={false}\r\n            backdrop={false}\r\n            // Disable focus on the dialog element itself\r\n            focusable={false}\r\n            // Disable interactions\r\n            hideOnEscape={false}\r\n            hideOnInteractOutside={false}\r\n            autoFocusOnShow={false}\r\n            autoFocusOnHide={false}\r\n            // Set viewport styles so that notifications are visible on mobile zoom\r\n            style={{\r\n              width: viewport.width,\r\n              height: viewport.height,\r\n              transform: `translate(${viewport.left}px, ${viewport.top}px) scale(${viewport.scale})`,\r\n              willChange: 'auto',\r\n            }}\r\n          >\r\n            {notification?.element}\r\n          </Ariakit.Dialog>\r\n        </WrapperComponent>\r\n      )}\r\n    </NotificationContext.Provider>\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<T extends { notificationContext: NotificationContextType }>(\r\n  WrappedComponent: React.ComponentType<T>\r\n) {\r\n  const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n  const WithNotificationContext = (props: Omit<T, 'notificationContext'>) => {\r\n    const notification = useNotification()\r\n    return <WrappedComponent {...(props as T)} notificationContext={notification} />\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\nexport enum NotificationTheme {\r\n  default,\r\n  success,\r\n  failure,\r\n}\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  theme?: NotificationTheme\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  theme = NotificationTheme.default,\r\n  children,\r\n}: React.PropsWithChildren<NotificationProps>) {\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    <div\r\n      className={classnames(\r\n        className,\r\n        'pointer-events-auto flex space-x-4 rounded-md border border-transparent px-3 py-2 shadow-modal dark:shadow-modal-dark',\r\n        {\r\n          'bg-gray-800 dark:border-gray-600': theme === NotificationTheme.default,\r\n          'bg-green-500 text-green-100 dark:border-green-500 dark:bg-green-800': theme === NotificationTheme.success,\r\n          'bg-red-500 text-red-100 dark:border-red-500 dark:bg-red-800': theme === NotificationTheme.failure,\r\n        }\r\n      )}\r\n    >\r\n      <div className=\"text-left text-white\">{children}</div>\r\n      <div>\r\n        {actions ?? (\r\n          <Button as={Ariakit.DialogDismiss} theme=\"dark\">\r\n            {closeText}\r\n          </Button>\r\n        )}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { Icon } from '../icon'\r\n\r\nconst imgFromUrlToBase64 = (url: string) =>\r\n  fetch(url).then(async (response) => URL.createObjectURL(await response.blob()))\r\n\r\nexport interface DownloadImageButtonProps {\r\n  /**\r\n   * The URL of the image to download. If not provided, button will be disabled\r\n   */\r\n  downloadUrl?: string | null\r\n\r\n  /**\r\n   * Optional base64 encoded image data. If provided, this will be used instead of downloadUrl\r\n   */\r\n  base64ImageData?: string | null\r\n}\r\n\r\nexport function DownloadImageButton({ downloadUrl, base64ImageData: dataUrl }: DownloadImageButtonProps) {\r\n  const fileName = React.useMemo(() => {\r\n    const name = downloadUrl?.split(/[/?#]/).pop() ?? 'image'\r\n    return name.includes('.') ? name : `${name}.png`\r\n  }, [downloadUrl])\r\n\r\n  const [imageUri, setImageUri] = React.useState<string | null>(null)\r\n  React.useEffect(() => {\r\n    const val = dataUrl || downloadUrl\r\n    if (!val) return\r\n    imgFromUrlToBase64(val)\r\n      .then(setImageUri)\r\n      .catch(() => {})\r\n  }, [dataUrl, downloadUrl])\r\n\r\n  return (\r\n    imageUri && (\r\n      <Button\r\n        as=\"a\"\r\n        href={imageUri}\r\n        download={fileName}\r\n        onClick={() => {\r\n          window.gtag?.('event', 'click', { event_category: 'social-share-image-download' })\r\n        }}\r\n        size=\"small\"\r\n        contentClass=\"flex items-center\"\r\n        leftContent={<Icon name=\"import\" width={16} />}\r\n      >\r\n        Download\r\n      </Button>\r\n    )\r\n  )\r\n}\r\n","import { FacebookIcon, FacebookShareButton, TwitterIcon, TwitterShareButton } from 'react-share'\r\n\r\nimport { Button } from '../button'\r\nimport { CopyToClipboard } from '../copy-to-clipboard'\r\nimport { Heading } from '../typography'\r\nimport { DownloadImageButton } from './DownloadImageButton'\r\n\r\nexport function SocialShare({\r\n  shareUrl,\r\n  title,\r\n  imageToDownloadURL,\r\n  imageToDownloadBase64Data,\r\n}: {\r\n  shareUrl: string\r\n  title: string\r\n  imageToDownloadURL?: string\r\n  imageToDownloadBase64Data?: string | null\r\n}) {\r\n  return (\r\n    <CopyToClipboard\r\n      label={\r\n        // m-0 class can be removed after removing old css from stock detail\r\n        <Heading level={5} className=\"m-0\">\r\n          Copy and paste link in email, website, or forum\r\n        </Heading>\r\n      }\r\n      text={shareUrl}\r\n      bottomLeftContent={\r\n        <div className=\"flex space-x-1\">\r\n          <FacebookShareButton url={shareUrl}>\r\n            <Button\r\n              as=\"span\"\r\n              size=\"small\"\r\n              contentClass=\"flex items-center\"\r\n              onClick={() => {\r\n                window.gtag?.('event', 'click', { event_category: 'social-share-facebook-button' })\r\n              }}\r\n              leftContent={<FacebookIcon size={16} round={true} className=\"shrink-0\" />}\r\n            >\r\n              Share\r\n            </Button>\r\n          </FacebookShareButton>\r\n          <TwitterShareButton url={shareUrl} via=\"FINVIZ_com\" title={title}>\r\n            <Button\r\n              as=\"span\"\r\n              size=\"small\"\r\n              contentClass=\"flex items-center\"\r\n              onClick={() => {\r\n                window.gtag?.('event', 'click', { event_category: 'social-share-twitter-button' })\r\n              }}\r\n              leftContent={<TwitterIcon size={16} round={true} className=\"shrink-0\" />}\r\n            >\r\n              Twitter\r\n            </Button>\r\n          </TwitterShareButton>\r\n          {imageToDownloadURL && (\r\n            <DownloadImageButton downloadUrl={imageToDownloadURL} base64ImageData={imageToDownloadBase64Data} />\r\n          )}\r\n        </div>\r\n      }\r\n    />\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { usePrevious } from '../hooks/use-previous'\r\nimport { Input, InputComponentProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipProps, TooltipTrigger } from './tooltip'\r\n\r\ninterface TooltipSettingsProps\r\n  extends Pick<TooltipProps, 'gutter' | 'isPointerEventsEnabled'>,\r\n    Pick<Ariakit.TooltipStoreProps, 'placement'> {\r\n  color?: keyof typeof TooltipColor\r\n}\r\n\r\ninterface TooltipInputProps extends InputComponentProps {\r\n  /**\r\n   * Settings for Tooltip component and useTooltipStore\r\n   */\r\n  tooltipSettings?: TooltipSettingsProps\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n  { tooltipSettings, name, children, ...props }: React.PropsWithChildren<TooltipInputProps>,\r\n  ref: React.ForwardedRef<HTMLInputElement>\r\n) {\r\n  const { color, gutter, placement = 'bottom', isPointerEventsEnabled } = tooltipSettings ?? {}\r\n  const prevMessage = usePrevious(children, true)\r\n\r\n  const [isFocused, setIsFocused] = React.useState(false)\r\n  const handleFocus = React.useRef(() => setIsFocused(true))\r\n  const handleBlur = React.useRef(() => setIsFocused(false))\r\n\r\n  const input = <Input {...props} ref={ref} name={name} />\r\n  if (!children && !prevMessage) return input\r\n\r\n  return (\r\n    <Ariakit.TooltipProvider placement={placement} open={isFocused && !!children}>\r\n      <TooltipTrigger\r\n        state={undefined}\r\n        hideOnBlur\r\n        showOnHover={false}\r\n        render={input}\r\n        onFocus={handleFocus.current}\r\n        onBlur={handleBlur.current}\r\n      />\r\n      <Tooltip\r\n        state={undefined}\r\n        isPointerEventsEnabled={isPointerEventsEnabled}\r\n        id={name}\r\n        color={color}\r\n        gutter={gutter}\r\n        className=\"px-2.5\"\r\n        hideOnHoverOutside={false}\r\n        data-testid={name?.length ? `${name}-tooltip` : undefined}\r\n      >\r\n        {children ?? prevMessage}\r\n      </Tooltip>\r\n    </Ariakit.TooltipProvider>\r\n  )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bigint: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","import { computePosition, arrow as arrow$2, offset as offset$1, shift as shift$1, limitShift as limitShift$1, flip as flip$1, size as size$1, autoPlacement as autoPlacement$1, hide as hide$1, inline as inline$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (typeof a === 'function' && a.toString() === b.toString()) {\n    return true;\n  }\n  let length;\n  let i;\n  let keys;\n  if (a && b && typeof a === 'object') {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length !== b.length) return false;\n      for (i = length; i-- !== 0;) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n    for (i = length; i-- !== 0;) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n    for (i = length; i-- !== 0;) {\n      const key = keys[i];\n      if (key === '_owner' && a.$$typeof) {\n        continue;\n      }\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n  if (typeof window === 'undefined') {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform,\n    elements: {\n      reference: externalReference,\n      floating: externalFloating\n    } = {},\n    transform = true,\n    whileElementsMounted,\n    open\n  } = options;\n  const [data, setData] = React.useState({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false\n  });\n  const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n  const [_reference, _setReference] = React.useState(null);\n  const [_floating, _setFloating] = React.useState(null);\n  const setReference = React.useCallback(node => {\n    if (node !== referenceRef.current) {\n      referenceRef.current = node;\n      _setReference(node);\n    }\n  }, []);\n  const setFloating = React.useCallback(node => {\n    if (node !== floatingRef.current) {\n      floatingRef.current = node;\n      _setFloating(node);\n    }\n  }, []);\n  const referenceEl = externalReference || _reference;\n  const floatingEl = externalFloating || _floating;\n  const referenceRef = React.useRef(null);\n  const floatingRef = React.useRef(null);\n  const dataRef = React.useRef(data);\n  const hasWhileElementsMounted = whileElementsMounted != null;\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n  const update = React.useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n    const config = {\n      placement,\n      strategy,\n      middleware: latestMiddleware\n    };\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n    computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n      const fullData = {\n        ...data,\n        isPositioned: true\n      };\n      if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n        dataRef.current = fullData;\n        ReactDOM.flushSync(() => {\n          setData(fullData);\n        });\n      }\n    });\n  }, [latestMiddleware, placement, strategy, platformRef]);\n  index(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData(data => ({\n        ...data,\n        isPositioned: false\n      }));\n    }\n  }, [open]);\n  const isMountedRef = React.useRef(false);\n  index(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n  index(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      }\n      update();\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n  const refs = React.useMemo(() => ({\n    reference: referenceRef,\n    floating: floatingRef,\n    setReference,\n    setFloating\n  }), [setReference, setFloating]);\n  const elements = React.useMemo(() => ({\n    reference: referenceEl,\n    floating: floatingEl\n  }), [referenceEl, floatingEl]);\n  const floatingStyles = React.useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0\n    };\n    if (!elements.floating) {\n      return initialStyles;\n    }\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n        ...(getDPR(elements.floating) >= 1.5 && {\n          willChange: 'transform'\n        })\n      };\n    }\n    return {\n      position: strategy,\n      left: x,\n      top: y\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n  return React.useMemo(() => ({\n    ...data,\n    update,\n    refs,\n    elements,\n    floatingStyles\n  }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n  function isRef(value) {\n    return {}.hasOwnProperty.call(value, 'current');\n  }\n  return {\n    name: 'arrow',\n    options,\n    fn(state) {\n      const {\n        element,\n        padding\n      } = typeof options === 'function' ? options(state) : options;\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrow$2({\n            element: element.current,\n            padding\n          }).fn(state);\n        }\n        return {};\n      }\n      if (element) {\n        return arrow$2({\n          element,\n          padding\n        }).fn(state);\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n  ...offset$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n  ...shift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n  ...limitShift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n  ...flip$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n  ...size$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n  ...autoPlacement$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n  ...hide$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n  ...inline$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n  ...arrow$1(options),\n  options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react';\nimport { useLayoutEffect, useEffect, useRef } from 'react';\nimport { stopEvent, getDocument, isMouseLikePointerType, contains, activeElement, isSafari, isTypeableCombobox, isVirtualClick, isVirtualPointerEvent, getTarget, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, isMac, getUserAgent } from '@floating-ui/react/utils';\nimport { floor, evaluate } from '@floating-ui/utils';\nimport { getComputedStyle, isElement, getNodeName, isHTMLElement, getWindow, isLastTraversableNode, getParentNode } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable } from 'tabbable';\nimport * as ReactDOM from 'react-dom';\nimport { getOverflowAncestors, useFloating as useFloating$1, offset, detectOverflow } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n  return React.useMemo(() => {\n    if (refs.every(ref => ref == null)) {\n      return null;\n    }\n    return value => {\n      refs.forEach(ref => {\n        if (typeof ref === 'function') {\n          ref(value);\n        } else if (ref != null) {\n          ref.current = value;\n        }\n      });\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n  const ref = React.useRef(() => {\n    if (process.env.NODE_ENV !== \"production\") {\n      throw new Error('Cannot call an event handler while rendering.');\n    }\n  });\n  useSafeInsertionEffect(() => {\n    ref.current = callback;\n  });\n  return React.useCallback(function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return ref.current == null ? void 0 : ref.current(...args);\n  }, []);\n}\n\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nfunction isDifferentRow(index, cols, prevRow) {\n  return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfBounds(listRef, index) {\n  return index < 0 || index >= listRef.current.length;\n}\nfunction getMinIndex(listRef, disabledIndices) {\n  return findNonDisabledIndex(listRef, {\n    disabledIndices\n  });\n}\nfunction getMaxIndex(listRef, disabledIndices) {\n  return findNonDisabledIndex(listRef, {\n    decrement: true,\n    startingIndex: listRef.current.length,\n    disabledIndices\n  });\n}\nfunction findNonDisabledIndex(listRef, _temp) {\n  let {\n    startingIndex = -1,\n    decrement = false,\n    disabledIndices,\n    amount = 1\n  } = _temp === void 0 ? {} : _temp;\n  const list = listRef.current;\n  let index = startingIndex;\n  do {\n    index += decrement ? -amount : amount;\n  } while (index >= 0 && index <= list.length - 1 && isDisabled(list, index, disabledIndices));\n  return index;\n}\nfunction getGridNavigatedIndex(elementsRef, _ref) {\n  let {\n    event,\n    orientation,\n    loop,\n    cols,\n    disabledIndices,\n    minIndex,\n    maxIndex,\n    prevIndex,\n    stopEvent: stop = false\n  } = _ref;\n  let nextIndex = prevIndex;\n  if (event.key === ARROW_UP) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = maxIndex;\n    } else {\n      nextIndex = findNonDisabledIndex(elementsRef, {\n        startingIndex: nextIndex,\n        amount: cols,\n        decrement: true,\n        disabledIndices\n      });\n      if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n        const col = prevIndex % cols;\n        const maxCol = maxIndex % cols;\n        const offset = maxIndex - (maxCol - col);\n        if (maxCol === col) {\n          nextIndex = maxIndex;\n        } else {\n          nextIndex = maxCol > col ? offset : offset - cols;\n        }\n      }\n    }\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n  if (event.key === ARROW_DOWN) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = minIndex;\n    } else {\n      nextIndex = findNonDisabledIndex(elementsRef, {\n        startingIndex: prevIndex,\n        amount: cols,\n        disabledIndices\n      });\n      if (loop && prevIndex + cols > maxIndex) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex % cols - cols,\n          amount: cols,\n          disabledIndices\n        });\n      }\n    }\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n\n  // Remains on the same row/column.\n  if (orientation === 'both') {\n    const prevRow = floor(prevIndex / cols);\n    if (event.key === ARROW_RIGHT) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== cols - 1) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex,\n          disabledIndices\n        });\n        if (loop && isDifferentRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledIndex(elementsRef, {\n            startingIndex: prevIndex - prevIndex % cols - 1,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      }\n      if (isDifferentRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    if (event.key === ARROW_LEFT) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== 0) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex,\n          decrement: true,\n          disabledIndices\n        });\n        if (loop && isDifferentRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledIndex(elementsRef, {\n            startingIndex: prevIndex + (cols - prevIndex % cols),\n            decrement: true,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex + (cols - prevIndex % cols),\n          decrement: true,\n          disabledIndices\n        });\n      }\n      if (isDifferentRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    const lastRow = floor(maxIndex / cols) === prevRow;\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      if (loop && lastRow) {\n        nextIndex = event.key === ARROW_LEFT ? maxIndex : findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      } else {\n        nextIndex = prevIndex;\n      }\n    }\n  }\n  return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction buildCellMap(sizes, cols, dense) {\n  const cellMap = [];\n  let startIndex = 0;\n  sizes.forEach((_ref2, index) => {\n    let {\n      width,\n      height\n    } = _ref2;\n    if (width > cols) {\n      if (process.env.NODE_ENV !== \"production\") {\n        throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n      }\n    }\n    let itemPlaced = false;\n    if (dense) {\n      startIndex = 0;\n    }\n    while (!itemPlaced) {\n      const targetCells = [];\n      for (let i = 0; i < width; i++) {\n        for (let j = 0; j < height; j++) {\n          targetCells.push(startIndex + i + j * cols);\n        }\n      }\n      if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n        targetCells.forEach(cell => {\n          cellMap[cell] = index;\n        });\n        itemPlaced = true;\n      } else {\n        startIndex++;\n      }\n    }\n  });\n\n  // convert into a non-sparse array\n  return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n  if (index === -1) return -1;\n  const firstCellIndex = cellMap.indexOf(index);\n  const sizeItem = sizes[index];\n  switch (corner) {\n    case 'tl':\n      return firstCellIndex;\n    case 'tr':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + sizeItem.width - 1;\n    case 'bl':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + (sizeItem.height - 1) * cols;\n    case 'br':\n      return cellMap.lastIndexOf(index);\n  }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getCellIndices(indices, cellMap) {\n  return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isDisabled(list, index, disabledIndices) {\n  if (disabledIndices) {\n    return disabledIndices.includes(index);\n  }\n  const element = list[index];\n  return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    preventScroll = false,\n    cancelPrevious = true,\n    sync = false\n  } = options;\n  cancelPrevious && cancelAnimationFrame(rafId);\n  const exec = () => el == null ? void 0 : el.focus({\n    preventScroll\n  });\n  if (sync) {\n    exec();\n  } else {\n    rafId = requestAnimationFrame(exec);\n  }\n}\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\nfunction sortByDocumentPosition(a, b) {\n  const position = a.compareDocumentPosition(b);\n  if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n    return -1;\n  }\n  if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n    return 1;\n  }\n  return 0;\n}\nfunction areMapsEqual(map1, map2) {\n  if (map1.size !== map2.size) {\n    return false;\n  }\n  for (const [key, value] of map1.entries()) {\n    if (value !== map2.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n  register: () => {},\n  unregister: () => {},\n  map: /*#__PURE__*/new Map(),\n  elementsRef: {\n    current: []\n  }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n  const {\n    children,\n    elementsRef,\n    labelsRef\n  } = props;\n  const [map, setMap] = React.useState(() => new Map());\n  const register = React.useCallback(node => {\n    setMap(prevMap => new Map(prevMap).set(node, null));\n  }, []);\n  const unregister = React.useCallback(node => {\n    setMap(prevMap => {\n      const map = new Map(prevMap);\n      map.delete(node);\n      return map;\n    });\n  }, []);\n  index(() => {\n    const newMap = new Map(map);\n    const nodes = Array.from(newMap.keys()).sort(sortByDocumentPosition);\n    nodes.forEach((node, index) => {\n      newMap.set(node, index);\n    });\n    if (!areMapsEqual(map, newMap)) {\n      setMap(newMap);\n    }\n  }, [map]);\n  return /*#__PURE__*/React.createElement(FloatingListContext.Provider, {\n    value: React.useMemo(() => ({\n      register,\n      unregister,\n      map,\n      elementsRef,\n      labelsRef\n    }), [register, unregister, map, elementsRef, labelsRef])\n  }, children);\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    label\n  } = props;\n  const {\n    register,\n    unregister,\n    map,\n    elementsRef,\n    labelsRef\n  } = React.useContext(FloatingListContext);\n  const [index$1, setIndex] = React.useState(null);\n  const componentRef = React.useRef(null);\n  const ref = React.useCallback(node => {\n    componentRef.current = node;\n    if (index$1 !== null) {\n      elementsRef.current[index$1] = node;\n      if (labelsRef) {\n        var _node$textContent;\n        const isLabelDefined = label !== undefined;\n        labelsRef.current[index$1] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n      }\n    }\n  }, [index$1, elementsRef, labelsRef, label]);\n  index(() => {\n    const node = componentRef.current;\n    if (node) {\n      register(node);\n      return () => {\n        unregister(node);\n      };\n    }\n  }, [register, unregister]);\n  index(() => {\n    const index = componentRef.current ? map.get(componentRef.current) : null;\n    if (index != null) {\n      setIndex(index);\n    }\n  }, [map]);\n  return React.useMemo(() => ({\n    ref,\n    index: index$1 == null ? -1 : index$1\n  }), [index$1, ref]);\n}\n\nfunction renderJsx(render, computedProps) {\n  if (typeof render === 'function') {\n    return render(computedProps);\n  }\n  if (render) {\n    return /*#__PURE__*/React.cloneElement(render, computedProps);\n  }\n  return /*#__PURE__*/React.createElement(\"div\", computedProps);\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n  activeIndex: 0,\n  onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n  const {\n    render,\n    orientation = 'both',\n    loop = true,\n    cols = 1,\n    disabledIndices,\n    activeIndex: externalActiveIndex,\n    onNavigate: externalSetActiveIndex,\n    itemSizes,\n    dense = false,\n    ...domProps\n  } = props;\n  const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n  const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n  const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n  const elementsRef = React.useRef([]);\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const contextValue = React.useMemo(() => ({\n    activeIndex,\n    onNavigate\n  }), [activeIndex, onNavigate]);\n  const isGrid = cols > 1;\n  function handleKeyDown(event) {\n    if (!allKeys.includes(event.key)) return;\n    let nextIndex = activeIndex;\n    const minIndex = getMinIndex(elementsRef, disabledIndices);\n    const maxIndex = getMaxIndex(elementsRef, disabledIndices);\n    if (isGrid) {\n      const sizes = itemSizes || Array.from({\n        length: elementsRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = buildCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isDisabled(elementsRef.current, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isDisabled(elementsRef.current, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      nextIndex = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getCellIndices([...(disabledIndices || elementsRef.current.map((_, index) => isDisabled(elementsRef.current, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction we're\n        // moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === ARROW_RIGHT ? 'tr' : 'tl')\n      })]; // navigated cell will never be nullish\n    }\n    const toEndKeys = {\n      horizontal: [ARROW_RIGHT],\n      vertical: [ARROW_DOWN],\n      both: [ARROW_RIGHT, ARROW_DOWN]\n    }[orientation];\n    const toStartKeys = {\n      horizontal: [ARROW_LEFT],\n      vertical: [ARROW_UP],\n      both: [ARROW_LEFT, ARROW_UP]\n    }[orientation];\n    const preventedKeys = isGrid ? allKeys : {\n      horizontal: horizontalKeys,\n      vertical: verticalKeys,\n      both: allKeys\n    }[orientation];\n    if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n      if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n        nextIndex = minIndex;\n      } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n        nextIndex = maxIndex;\n      } else {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: nextIndex,\n          decrement: toStartKeys.includes(event.key),\n          disabledIndices\n        });\n      }\n    }\n    if (nextIndex !== activeIndex && !isIndexOutOfBounds(elementsRef, nextIndex)) {\n      event.stopPropagation();\n      if (preventedKeys.includes(event.key)) {\n        event.preventDefault();\n      }\n      onNavigate(nextIndex);\n\n      // Wait for FocusManager `returnFocus` to execute.\n      queueMicrotask(() => {\n        enqueueFocus(elementsRef.current[nextIndex]);\n      });\n    }\n  }\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: forwardedRef,\n    'aria-orientation': orientation === 'both' ? undefined : orientation,\n    onKeyDown(e) {\n      domProps.onKeyDown == null || domProps.onKeyDown(e);\n      renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n      handleKeyDown(e);\n    }\n  };\n  return /*#__PURE__*/React.createElement(CompositeContext.Provider, {\n    value: contextValue\n  }, /*#__PURE__*/React.createElement(FloatingList, {\n    elementsRef: elementsRef\n  }, renderJsx(render, computedProps)));\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n  const {\n    render,\n    ...domProps\n  } = props;\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const {\n    activeIndex,\n    onNavigate\n  } = React.useContext(CompositeContext);\n  const {\n    ref,\n    index\n  } = useListItem();\n  const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n  const isActive = activeIndex === index;\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: mergedRef,\n    tabIndex: isActive ? 0 : -1,\n    'data-active': isActive ? '' : undefined,\n    onFocus(e) {\n      domProps.onFocus == null || domProps.onFocus(e);\n      renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n      onNavigate(index);\n    }\n  };\n  return renderJsx(render, computedProps);\n});\n\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n  const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n  index(() => {\n    if (id == null) {\n      setId(genId());\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n  React.useEffect(() => {\n    serverHandoffComplete = true;\n  }, []);\n  return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n  devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n  var _devMessageSet;\n  for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n    messages[_key] = arguments[_key];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n    var _devMessageSet2;\n    (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n    console.warn(message);\n  }\n}\nfunction error() {\n  var _devMessageSet3;\n  for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    messages[_key2] = arguments[_key2];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n    var _devMessageSet4;\n    (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n    console.error(message);\n  }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n  const {\n    context: {\n      placement,\n      elements: {\n        floating\n      },\n      middlewareData: {\n        arrow\n      }\n    },\n    width = 14,\n    height = 7,\n    tipRadius = 0,\n    strokeWidth = 0,\n    staticOffset,\n    stroke,\n    d,\n    style: {\n      transform,\n      ...restStyle\n    } = {},\n    ...rest\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!ref) {\n      warn('The `ref` prop is required for `FloatingArrow`.');\n    }\n  }\n  const clipPathId = useId();\n  const [isRTL, setIsRTL] = React.useState(false);\n\n  // https://github.com/floating-ui/floating-ui/issues/2932\n  index(() => {\n    if (!floating) return;\n    const isRTL = getComputedStyle(floating).direction === 'rtl';\n    if (isRTL) {\n      setIsRTL(true);\n    }\n  }, [floating]);\n  if (!floating) {\n    return null;\n  }\n\n  // Strokes must be double the border width, this ensures the stroke's width\n  // works as you'd expect.\n  const computedStrokeWidth = strokeWidth * 2;\n  const halfStrokeWidth = computedStrokeWidth / 2;\n  const svgX = width / 2 * (tipRadius / -8 + 1);\n  const svgY = height / 2 * tipRadius / 4;\n  const [side, alignment] = placement.split('-');\n  const isCustomShape = !!d;\n  const isVerticalSide = side === 'top' || side === 'bottom';\n  const yOffsetProp = staticOffset && alignment === 'end' ? 'bottom' : 'top';\n  let xOffsetProp = staticOffset && alignment === 'end' ? 'right' : 'left';\n  if (staticOffset && isRTL) {\n    xOffsetProp = alignment === 'end' ? 'left' : 'right';\n  }\n  const arrowX = (arrow == null ? void 0 : arrow.x) != null ? staticOffset || arrow.x : '';\n  const arrowY = (arrow == null ? void 0 : arrow.y) != null ? staticOffset || arrow.y : '';\n  const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n  const rotation = {\n    top: isCustomShape ? 'rotate(180deg)' : '',\n    left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n    bottom: isCustomShape ? '' : 'rotate(180deg)',\n    right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n  }[side];\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({}, rest, {\n    \"aria-hidden\": true,\n    ref: ref,\n    width: isCustomShape ? width : width + computedStrokeWidth,\n    height: width,\n    viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n    style: {\n      position: 'absolute',\n      pointerEvents: 'none',\n      [xOffsetProp]: arrowX,\n      [yOffsetProp]: arrowY,\n      [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n      transform: \"\" + rotation + (transform != null ? transform : ''),\n      ...restStyle\n    }\n  }), computedStrokeWidth > 0 && /*#__PURE__*/React.createElement(\"path\", {\n    clipPath: \"url(#\" + clipPathId + \")\",\n    fill: \"none\",\n    stroke: stroke\n    // Account for the stroke on the fill path rendered below.\n    ,\n    strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n    d: dValue\n  }), /*#__PURE__*/React.createElement(\"path\", {\n    stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n    d: dValue\n  }), /*#__PURE__*/React.createElement(\"clipPath\", {\n    id: clipPathId\n  }, /*#__PURE__*/React.createElement(\"rect\", {\n    x: -halfStrokeWidth,\n    y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n    width: width + computedStrokeWidth,\n    height: width\n  })));\n});\n\nfunction createPubSub() {\n  const map = new Map();\n  return {\n    emit(event, data) {\n      var _map$get;\n      (_map$get = map.get(event)) == null || _map$get.forEach(handler => handler(data));\n    },\n    on(event, listener) {\n      map.set(event, [...(map.get(event) || []), listener]);\n    },\n    off(event, listener) {\n      var _map$get2;\n      map.set(event, ((_map$get2 = map.get(event)) == null ? void 0 : _map$get2.filter(l => l !== listener)) || []);\n    }\n  };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n  var _React$useContext;\n  return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n  const id = useId();\n  const tree = useFloatingTree();\n  const reactParentId = useFloatingParentNodeId();\n  const parentId = customParentId || reactParentId;\n  index(() => {\n    const node = {\n      id,\n      parentId\n    };\n    tree == null || tree.addNode(node);\n    return () => {\n      tree == null || tree.removeNode(node);\n    };\n  }, [tree, id, parentId]);\n  return id;\n}\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n  const {\n    children,\n    id\n  } = props;\n  const parentId = useFloatingParentNodeId();\n  return /*#__PURE__*/React.createElement(FloatingNodeContext.Provider, {\n    value: React.useMemo(() => ({\n      id,\n      parentId\n    }), [id, parentId])\n  }, children);\n}\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n  const {\n    children\n  } = props;\n  const nodesRef = React.useRef([]);\n  const addNode = React.useCallback(node => {\n    nodesRef.current = [...nodesRef.current, node];\n  }, []);\n  const removeNode = React.useCallback(node => {\n    nodesRef.current = nodesRef.current.filter(n => n !== node);\n  }, []);\n  const events = React.useState(() => createPubSub())[0];\n  return /*#__PURE__*/React.createElement(FloatingTreeContext.Provider, {\n    value: React.useMemo(() => ({\n      nodesRef,\n      addNode,\n      removeNode,\n      events\n    }), [addNode, removeNode, events])\n  }, children);\n}\n\nfunction createAttribute(name) {\n  return \"data-floating-ui-\" + name;\n}\n\nfunction useLatestRef(value) {\n  const ref = useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n  if (pointerType && !isMouseLikePointerType(pointerType)) {\n    return 0;\n  }\n  if (typeof value === 'number') {\n    return value;\n  }\n  return value == null ? void 0 : value[prop];\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    events,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    delay = 0,\n    handleClose = null,\n    mouseOnly = false,\n    restMs = 0,\n    move = true\n  } = props;\n  const tree = useFloatingTree();\n  const parentId = useFloatingParentNodeId();\n  const handleCloseRef = useLatestRef(handleClose);\n  const delayRef = useLatestRef(delay);\n  const openRef = useLatestRef(open);\n  const pointerTypeRef = React.useRef();\n  const timeoutRef = React.useRef(-1);\n  const handlerRef = React.useRef();\n  const restTimeoutRef = React.useRef(-1);\n  const blockMouseMoveRef = React.useRef(true);\n  const performedPointerEventsMutationRef = React.useRef(false);\n  const unbindMouseMoveRef = React.useRef(() => {});\n  const isHoverOpen = React.useCallback(() => {\n    var _dataRef$current$open;\n    const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n    return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n  }, [dataRef]);\n\n  // When closing before opening, clear the delay timeouts to cancel it\n  // from showing.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        open\n      } = _ref;\n      if (!open) {\n        clearTimeout(timeoutRef.current);\n        clearTimeout(restTimeoutRef.current);\n        blockMouseMoveRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [enabled, events]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    if (!handleCloseRef.current) return;\n    if (!open) return;\n    function onLeave(event) {\n      if (isHoverOpen()) {\n        onOpenChange(false, event, 'hover');\n      }\n    }\n    const html = getDocument(elements.floating).documentElement;\n    html.addEventListener('mouseleave', onLeave);\n    return () => {\n      html.removeEventListener('mouseleave', onLeave);\n    };\n  }, [elements.floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n  const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n    if (runElseBranch === void 0) {\n      runElseBranch = true;\n    }\n    if (reason === void 0) {\n      reason = 'hover';\n    }\n    const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n    if (closeDelay && !handlerRef.current) {\n      clearTimeout(timeoutRef.current);\n      timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n    } else if (runElseBranch) {\n      clearTimeout(timeoutRef.current);\n      onOpenChange(false, event, reason);\n    }\n  }, [delayRef, onOpenChange]);\n  const cleanupMouseMoveHandler = useEffectEvent(() => {\n    unbindMouseMoveRef.current();\n    handlerRef.current = undefined;\n  });\n  const clearPointerEvents = useEffectEvent(() => {\n    if (performedPointerEventsMutationRef.current) {\n      const body = getDocument(elements.floating).body;\n      body.style.pointerEvents = '';\n      body.removeAttribute(safePolygonIdentifier);\n      performedPointerEventsMutationRef.current = false;\n    }\n  });\n\n  // Registering the mouse events on the reference directly to bypass React's\n  // delegation system. If the cursor was on a disabled element and then entered\n  // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function isClickLikeOpenEvent() {\n      return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n    }\n    function onMouseEnter(event) {\n      clearTimeout(timeoutRef.current);\n      blockMouseMoveRef.current = false;\n      if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || restMs > 0 && !getDelay(delayRef.current, 'open')) {\n        return;\n      }\n      const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n      if (openDelay) {\n        timeoutRef.current = window.setTimeout(() => {\n          if (!openRef.current) {\n            onOpenChange(true, event, 'hover');\n          }\n        }, openDelay);\n      } else {\n        onOpenChange(true, event, 'hover');\n      }\n    }\n    function onMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      unbindMouseMoveRef.current();\n      const doc = getDocument(elements.floating);\n      clearTimeout(restTimeoutRef.current);\n      if (handleCloseRef.current && dataRef.current.floatingContext) {\n        // Prevent clearing `onScrollMouseLeave` timeout.\n        if (!open) {\n          clearTimeout(timeoutRef.current);\n        }\n        handlerRef.current = handleCloseRef.current({\n          ...dataRef.current.floatingContext,\n          tree,\n          x: event.clientX,\n          y: event.clientY,\n          onClose() {\n            clearPointerEvents();\n            cleanupMouseMoveHandler();\n            closeWithDelay(event, true, 'safe-polygon');\n          }\n        });\n        const handler = handlerRef.current;\n        doc.addEventListener('mousemove', handler);\n        unbindMouseMoveRef.current = () => {\n          doc.removeEventListener('mousemove', handler);\n        };\n        return;\n      }\n\n      // Allow interactivity without `safePolygon` on touch devices. With a\n      // pointer, a short close delay is an alternative, so it should work\n      // consistently.\n      const shouldClose = pointerTypeRef.current === 'touch' ? !contains(elements.floating, event.relatedTarget) : true;\n      if (shouldClose) {\n        closeWithDelay(event);\n      }\n    }\n\n    // Ensure the floating element closes after scrolling even if the pointer\n    // did not move.\n    // https://github.com/floating-ui/floating-ui/discussions/1692\n    function onScrollMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      if (!dataRef.current.floatingContext) return;\n      handleCloseRef.current == null || handleCloseRef.current({\n        ...dataRef.current.floatingContext,\n        tree,\n        x: event.clientX,\n        y: event.clientY,\n        onClose() {\n          clearPointerEvents();\n          cleanupMouseMoveHandler();\n          closeWithDelay(event);\n        }\n      })(event);\n    }\n    if (isElement(elements.domReference)) {\n      var _elements$floating;\n      const ref = elements.domReference;\n      open && ref.addEventListener('mouseleave', onScrollMouseLeave);\n      (_elements$floating = elements.floating) == null || _elements$floating.addEventListener('mouseleave', onScrollMouseLeave);\n      move && ref.addEventListener('mousemove', onMouseEnter, {\n        once: true\n      });\n      ref.addEventListener('mouseenter', onMouseEnter);\n      ref.addEventListener('mouseleave', onMouseLeave);\n      return () => {\n        var _elements$floating2;\n        open && ref.removeEventListener('mouseleave', onScrollMouseLeave);\n        (_elements$floating2 = elements.floating) == null || _elements$floating2.removeEventListener('mouseleave', onScrollMouseLeave);\n        move && ref.removeEventListener('mousemove', onMouseEnter);\n        ref.removeEventListener('mouseenter', onMouseEnter);\n        ref.removeEventListener('mouseleave', onMouseLeave);\n      };\n    }\n  }, [elements, enabled, context, mouseOnly, restMs, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, openRef, tree, delayRef, handleCloseRef, dataRef]);\n\n  // Block pointer-events of every element other than the reference and floating\n  // while the floating element is open and has a `handleClose` handler. Also\n  // handles nested floating elements.\n  // https://github.com/floating-ui/floating-ui/issues/1722\n  index(() => {\n    var _handleCloseRef$curre;\n    if (!enabled) return;\n    if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && _handleCloseRef$curre.__options.blockPointerEvents && isHoverOpen()) {\n      const body = getDocument(elements.floating).body;\n      body.setAttribute(safePolygonIdentifier, '');\n      body.style.pointerEvents = 'none';\n      performedPointerEventsMutationRef.current = true;\n      const floatingEl = elements.floating;\n      if (isElement(elements.domReference) && floatingEl) {\n        var _tree$nodesRef$curren;\n        const ref = elements.domReference;\n        const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n        if (parentFloating) {\n          parentFloating.style.pointerEvents = '';\n        }\n        ref.style.pointerEvents = 'auto';\n        floatingEl.style.pointerEvents = 'auto';\n        return () => {\n          ref.style.pointerEvents = '';\n          floatingEl.style.pointerEvents = '';\n        };\n      }\n    }\n  }, [enabled, open, parentId, elements, tree, handleCloseRef, isHoverOpen]);\n  index(() => {\n    if (!open) {\n      pointerTypeRef.current = undefined;\n      cleanupMouseMoveHandler();\n      clearPointerEvents();\n    }\n  }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n  React.useEffect(() => {\n    return () => {\n      cleanupMouseMoveHandler();\n      clearTimeout(timeoutRef.current);\n      clearTimeout(restTimeoutRef.current);\n      clearPointerEvents();\n    };\n  }, [enabled, elements.domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n  const reference = React.useMemo(() => {\n    function setPointerRef(event) {\n      pointerTypeRef.current = event.pointerType;\n    }\n    return {\n      onPointerDown: setPointerRef,\n      onPointerEnter: setPointerRef,\n      onMouseMove(event) {\n        const {\n          nativeEvent\n        } = event;\n        function handleMouseMove() {\n          if (!blockMouseMoveRef.current && !openRef.current) {\n            onOpenChange(true, nativeEvent, 'hover');\n          }\n        }\n        if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n          return;\n        }\n        if (open || restMs === 0) {\n          return;\n        }\n        clearTimeout(restTimeoutRef.current);\n        if (pointerTypeRef.current === 'touch') {\n          handleMouseMove();\n        } else {\n          restTimeoutRef.current = window.setTimeout(handleMouseMove, restMs);\n        }\n      }\n    };\n  }, [mouseOnly, onOpenChange, open, openRef, restMs]);\n  const floating = React.useMemo(() => ({\n    onMouseEnter() {\n      clearTimeout(timeoutRef.current);\n    },\n    onMouseLeave(event) {\n      closeWithDelay(event.nativeEvent, false);\n    }\n  }), [closeWithDelay]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  delay: 0,\n  initialDelay: 0,\n  timeoutMs: 0,\n  currentId: null,\n  setCurrentId: NOOP,\n  setState: NOOP,\n  isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const [state, setState] = React.useReducer((prev, next) => ({\n    ...prev,\n    ...next\n  }), {\n    delay,\n    timeoutMs,\n    initialDelay: delay,\n    currentId: null,\n    isInstantPhase: false\n  });\n  const initialCurrentIdRef = React.useRef(null);\n  const setCurrentId = React.useCallback(currentId => {\n    setState({\n      currentId\n    });\n  }, []);\n  index(() => {\n    if (state.currentId) {\n      if (initialCurrentIdRef.current === null) {\n        initialCurrentIdRef.current = state.currentId;\n      } else if (!state.isInstantPhase) {\n        setState({\n          isInstantPhase: true\n        });\n      }\n    } else {\n      if (state.isInstantPhase) {\n        setState({\n          isInstantPhase: false\n        });\n      }\n      initialCurrentIdRef.current = null;\n    }\n  }, [state.currentId, state.isInstantPhase]);\n  return /*#__PURE__*/React.createElement(FloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      ...state,\n      setState,\n      setCurrentId\n    }), [state, setCurrentId])\n  }, children);\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    id: optionId\n  } = options;\n  const id = optionId != null ? optionId : floatingId;\n  const groupContext = useDelayGroupContext();\n  const {\n    currentId,\n    setCurrentId,\n    initialDelay,\n    setState,\n    timeoutMs\n  } = groupContext;\n  index(() => {\n    if (!currentId) return;\n    setState({\n      delay: {\n        open: 1,\n        close: getDelay(initialDelay, 'close')\n      }\n    });\n    if (currentId !== id) {\n      onOpenChange(false);\n    }\n  }, [id, onOpenChange, setState, currentId, initialDelay]);\n  index(() => {\n    function unset() {\n      onOpenChange(false);\n      setState({\n        delay: initialDelay,\n        currentId: null\n      });\n    }\n    if (!currentId) return;\n    if (!open && currentId === id) {\n      if (timeoutMs) {\n        const timeout = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeout);\n        };\n      }\n      unset();\n    }\n  }, [open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n  index(() => {\n    if (setCurrentId === NOOP || !open) return;\n    setCurrentId(id);\n  }, [open, setCurrentId, id]);\n  return groupContext;\n}\n\nfunction getAncestors(nodes, id) {\n  var _nodes$find;\n  let allAncestors = [];\n  let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n  while (currentParentId) {\n    const currentNode = nodes.find(node => node.id === currentParentId);\n    currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n    if (currentNode) {\n      allAncestors = allAncestors.concat(currentNode);\n    }\n  }\n  return allAncestors;\n}\n\nfunction getChildren(nodes, id) {\n  let allChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && ((_node$context = node.context) == null ? void 0 : _node$context.open);\n  });\n  let currentChildren = allChildren;\n  while (currentChildren.length) {\n    currentChildren = nodes.filter(node => {\n      var _currentChildren;\n      return (_currentChildren = currentChildren) == null ? void 0 : _currentChildren.some(n => {\n        var _node$context2;\n        return node.parentId === n.id && ((_node$context2 = node.context) == null ? void 0 : _node$context2.open);\n      });\n    });\n    allChildren = allChildren.concat(currentChildren);\n  }\n  return allChildren;\n}\nfunction getDeepestNode(nodes, id) {\n  let deepestNodeId;\n  let maxDepth = -1;\n  function findDeepest(nodeId, depth) {\n    if (depth > maxDepth) {\n      deepestNodeId = nodeId;\n      maxDepth = depth;\n    }\n    const children = getChildren(nodes, nodeId);\n    children.forEach(child => {\n      findDeepest(child.id, depth + 1);\n    });\n  }\n  findDeepest(id, 0);\n  return nodes.find(node => node.id === deepestNodeId);\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nlet counterMap = /*#__PURE__*/new WeakMap();\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nconst unwrapHost = node => node && (node.host || unwrapHost(node.parentNode));\nconst correctElements = (parent, targets) => targets.map(target => {\n  if (parent.contains(target)) {\n    return target;\n  }\n  const correctedTarget = unwrapHost(target);\n  if (parent.contains(correctedTarget)) {\n    return correctedTarget;\n  }\n  return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n  const markerName = 'data-floating-ui-inert';\n  const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n  const avoidElements = correctElements(body, uncorrectedAvoidElements);\n  const elementsToKeep = new Set();\n  const elementsToStop = new Set(avoidElements);\n  const hiddenElements = [];\n  if (!markerMap[markerName]) {\n    markerMap[markerName] = new WeakMap();\n  }\n  const markerCounter = markerMap[markerName];\n  avoidElements.forEach(keep);\n  deep(body);\n  elementsToKeep.clear();\n  function keep(el) {\n    if (!el || elementsToKeep.has(el)) {\n      return;\n    }\n    elementsToKeep.add(el);\n    el.parentNode && keep(el.parentNode);\n  }\n  function deep(parent) {\n    if (!parent || elementsToStop.has(parent)) {\n      return;\n    }\n    [].forEach.call(parent.children, node => {\n      if (getNodeName(node) === 'script') return;\n      if (elementsToKeep.has(node)) {\n        deep(node);\n      } else {\n        const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n        const alreadyHidden = attr !== null && attr !== 'false';\n        const counterValue = (counterMap.get(node) || 0) + 1;\n        const markerValue = (markerCounter.get(node) || 0) + 1;\n        counterMap.set(node, counterValue);\n        markerCounter.set(node, markerValue);\n        hiddenElements.push(node);\n        if (counterValue === 1 && alreadyHidden) {\n          uncontrolledElementsSet.add(node);\n        }\n        if (markerValue === 1) {\n          node.setAttribute(markerName, '');\n        }\n        if (!alreadyHidden && controlAttribute) {\n          node.setAttribute(controlAttribute, 'true');\n        }\n      }\n    });\n  }\n  lockCount++;\n  return () => {\n    hiddenElements.forEach(element => {\n      const counterValue = (counterMap.get(element) || 0) - 1;\n      const markerValue = (markerCounter.get(element) || 0) - 1;\n      counterMap.set(element, counterValue);\n      markerCounter.set(element, markerValue);\n      if (!counterValue) {\n        if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n          element.removeAttribute(controlAttribute);\n        }\n        uncontrolledElementsSet.delete(element);\n      }\n      if (!markerValue) {\n        element.removeAttribute(markerName);\n      }\n    });\n    lockCount--;\n    if (!lockCount) {\n      counterMap = new WeakMap();\n      counterMap = new WeakMap();\n      uncontrolledElementsSet = new WeakSet();\n      markerMap = {};\n    }\n  };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n  if (ariaHidden === void 0) {\n    ariaHidden = false;\n  }\n  if (inert === void 0) {\n    inert = false;\n  }\n  const body = getDocument(avoidElements[0]).body;\n  return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live]'))), body, ariaHidden, inert);\n}\n\nconst getTabbableOptions = () => ({\n  getShadowRoot: true,\n  displayCheck:\n  // JSDOM does not support the `tabbable` library. To solve this we can\n  // check if `ResizeObserver` is a real function (not polyfilled), which\n  // determines if the current environment is JSDOM-like.\n  typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, direction) {\n  const allTabbable = tabbable(container, getTabbableOptions());\n  if (direction === 'prev') {\n    allTabbable.reverse();\n  }\n  const activeIndex = allTabbable.indexOf(activeElement(getDocument(container)));\n  const nextTabbableElements = allTabbable.slice(activeIndex + 1);\n  return nextTabbableElements[0];\n}\nfunction getNextTabbable() {\n  return getTabbableIn(document.body, 'next');\n}\nfunction getPreviousTabbable() {\n  return getTabbableIn(document.body, 'prev');\n}\nfunction isOutsideEvent(event, container) {\n  const containerElement = container || event.currentTarget;\n  const relatedTarget = event.relatedTarget;\n  return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n  const tabbableElements = tabbable(container, getTabbableOptions());\n  tabbableElements.forEach(element => {\n    element.dataset.tabindex = element.getAttribute('tabindex') || '';\n    element.setAttribute('tabindex', '-1');\n  });\n}\nfunction enableFocusInside(container) {\n  const elements = container.querySelectorAll('[data-tabindex]');\n  elements.forEach(element => {\n    const tabindex = element.dataset.tabindex;\n    delete element.dataset.tabindex;\n    if (tabindex) {\n      element.setAttribute('tabindex', tabindex);\n    } else {\n      element.removeAttribute('tabindex');\n    }\n  });\n}\nfunction getClosestTabbableElement(tabbableElements, element, floating) {\n  const elementIndex = tabbableElements.indexOf(element);\n  function traverseTabbableElements(next) {\n    const attr = createAttribute('focus-guard');\n    let index = elementIndex + (next ? 1 : 0);\n    let currentElement = tabbableElements[index];\n    while (currentElement && (!currentElement.isConnected || currentElement.hasAttribute(attr) || contains(floating, currentElement))) {\n      if (next) {\n        index++;\n      } else {\n        index--;\n      }\n      currentElement = tabbableElements[index];\n    }\n    return currentElement;\n  }\n\n  // First, try to find the next tabbable element\n  const next = traverseTabbableElements(true);\n  if (next) {\n    return next;\n  }\n\n  // If we can't find a next tabbable element, try to find the previous one\n  return traverseTabbableElements(false);\n}\n\n// See Diego Haz's Sandbox for making this logic work well on Safari/iOS:\n// https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/FocusTrap.tsx\n\nconst HIDDEN_STYLES = {\n  border: 0,\n  clip: 'rect(0 0 0 0)',\n  height: '1px',\n  margin: '-1px',\n  overflow: 'hidden',\n  padding: 0,\n  position: 'fixed',\n  whiteSpace: 'nowrap',\n  width: '1px',\n  top: 0,\n  left: 0\n};\nlet timeoutId;\nfunction setActiveElementOnTab(event) {\n  if (event.key === 'Tab') {\n    event.target;\n    clearTimeout(timeoutId);\n  }\n}\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n  const [role, setRole] = React.useState();\n  index(() => {\n    if (isSafari()) {\n      // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n      // on VoiceOver does trigger the onFocus event, so we can use the focus\n      // trap element. On Safari, only buttons trigger the onFocus event.\n      // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n      // button role.\n      setRole('button');\n    }\n    document.addEventListener('keydown', setActiveElementOnTab);\n    return () => {\n      document.removeEventListener('keydown', setActiveElementOnTab);\n    };\n  }, []);\n  const restProps = {\n    ref,\n    tabIndex: 0,\n    // Role is only for VoiceOver\n    role,\n    'aria-hidden': role ? undefined : true,\n    [createAttribute('focus-guard')]: '',\n    style: HIDDEN_STYLES\n  };\n  return /*#__PURE__*/React.createElement(\"span\", _extends({}, props, restProps));\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    id,\n    root\n  } = props;\n  const uniqueId = useId();\n  const portalContext = usePortalContext();\n  const [portalNode, setPortalNode] = React.useState(null);\n  const portalNodeRef = React.useRef(null);\n  index(() => {\n    return () => {\n      portalNode == null || portalNode.remove();\n      // Allow the subsequent layout effects to create a new node on updates.\n      // The portal node will still be cleaned up on unmount.\n      // https://github.com/floating-ui/floating-ui/issues/2454\n      queueMicrotask(() => {\n        portalNodeRef.current = null;\n      });\n    };\n  }, [portalNode]);\n  index(() => {\n    // Wait for the uniqueId to be generated before creating the portal node in\n    // React <18 (using `useFloatingId` instead of the native `useId`).\n    // https://github.com/floating-ui/floating-ui/issues/2778\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    const existingIdRoot = id ? document.getElementById(id) : null;\n    if (!existingIdRoot) return;\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    existingIdRoot.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, uniqueId]);\n  index(() => {\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n    if (container && !isElement(container)) container = container.current;\n    container = container || document.body;\n    let idWrapper = null;\n    if (id) {\n      idWrapper = document.createElement('div');\n      idWrapper.id = id;\n      container.appendChild(idWrapper);\n    }\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    container = idWrapper || container;\n    container.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, root, uniqueId, portalContext]);\n  return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n  const {\n    children,\n    id,\n    root = null,\n    preserveTabOrder = true\n  } = props;\n  const portalNode = useFloatingPortalNode({\n    id,\n    root\n  });\n  const [focusManagerState, setFocusManagerState] = React.useState(null);\n  const beforeOutsideRef = React.useRef(null);\n  const afterOutsideRef = React.useRef(null);\n  const beforeInsideRef = React.useRef(null);\n  const afterInsideRef = React.useRef(null);\n  const shouldRenderGuards =\n  // The FocusManager and therefore floating element are currently open/\n  // rendered.\n  !!focusManagerState &&\n  // Guards are only for non-modal focus management.\n  !focusManagerState.modal &&\n  // Don't render if unmount is transitioning.\n  focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n  // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n  React.useEffect(() => {\n    if (!portalNode || !preserveTabOrder || focusManagerState != null && focusManagerState.modal) {\n      return;\n    }\n\n    // Make sure elements inside the portal element are tabbable only when the\n    // portal has already been focused, either by tabbing into a focus trap\n    // element outside or using the mouse.\n    function onFocus(event) {\n      if (portalNode && isOutsideEvent(event)) {\n        const focusing = event.type === 'focusin';\n        const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n        manageFocus(portalNode);\n      }\n    }\n    // Listen to the event on the capture phase so they run before the focus\n    // trap elements onFocus prop is called.\n    portalNode.addEventListener('focusin', onFocus, true);\n    portalNode.addEventListener('focusout', onFocus, true);\n    return () => {\n      portalNode.removeEventListener('focusin', onFocus, true);\n      portalNode.removeEventListener('focusout', onFocus, true);\n    };\n  }, [portalNode, preserveTabOrder, focusManagerState == null ? void 0 : focusManagerState.modal]);\n  return /*#__PURE__*/React.createElement(PortalContext.Provider, {\n    value: React.useMemo(() => ({\n      preserveTabOrder,\n      beforeOutsideRef,\n      afterOutsideRef,\n      beforeInsideRef,\n      afterInsideRef,\n      portalNode,\n      setFocusManagerState\n    }), [preserveTabOrder, portalNode])\n  }, shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"outside\",\n    ref: beforeOutsideRef,\n    onFocus: event => {\n      if (isOutsideEvent(event, portalNode)) {\n        var _beforeInsideRef$curr;\n        (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n      } else {\n        const prevTabbable = getPreviousTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n        prevTabbable == null || prevTabbable.focus();\n      }\n    }\n  }), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(\"span\", {\n    \"aria-owns\": portalNode.id,\n    style: HIDDEN_STYLES\n  }), portalNode && /*#__PURE__*/ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"outside\",\n    ref: afterOutsideRef,\n    onFocus: event => {\n      if (isOutsideEvent(event, portalNode)) {\n        var _afterInsideRef$curre;\n        (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n      } else {\n        const nextTabbable = getNextTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n        nextTabbable == null || nextTabbable.focus();\n        (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent));\n      }\n    }\n  }));\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction addPreviouslyFocusedElement(element) {\n  previouslyFocusedElements = previouslyFocusedElements.filter(el => el.isConnected);\n  let tabbableEl = element;\n  if (!tabbableEl || getNodeName(tabbableEl) === 'body') return;\n  if (!isTabbable(tabbableEl, getTabbableOptions())) {\n    const tabbableChild = tabbable(tabbableEl, getTabbableOptions())[0];\n    if (tabbableChild) {\n      tabbableEl = tabbableChild;\n    }\n  }\n  previouslyFocusedElements.push(tabbableEl);\n  if (previouslyFocusedElements.length > LIST_LIMIT) {\n    previouslyFocusedElements = previouslyFocusedElements.slice(-LIST_LIMIT);\n  }\n}\nfunction getPreviouslyFocusedElement() {\n  return previouslyFocusedElements.slice().reverse().find(el => el.isConnected);\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n  return /*#__PURE__*/React.createElement(\"button\", _extends({}, props, {\n    type: \"button\",\n    ref: ref,\n    tabIndex: -1,\n    style: HIDDEN_STYLES\n  }));\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n  const {\n    context,\n    children,\n    disabled = false,\n    order = ['content'],\n    guards: _guards = true,\n    initialFocus = 0,\n    returnFocus = true,\n    restoreFocus = false,\n    modal = true,\n    visuallyHiddenDismiss = false,\n    closeOnFocusOut = true\n  } = props;\n  const {\n    open,\n    refs,\n    nodeId,\n    onOpenChange,\n    events,\n    dataRef,\n    floatingId,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n  // If the reference is a combobox and is typeable (e.g. input/textarea),\n  // there are different focus semantics. The guards should not be rendered, but\n  // aria-hidden should be applied to all nodes still. Further, the visually\n  // hidden dismiss button should only appear at the end of the list, not the\n  // start.\n  const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n  // Force the guards to be rendered if the `inert` attribute is not supported.\n  const guards = supportsInert() ? _guards : true;\n  const orderRef = useLatestRef(order);\n  const initialFocusRef = useLatestRef(initialFocus);\n  const returnFocusRef = useLatestRef(returnFocus);\n  const tree = useFloatingTree();\n  const portalContext = usePortalContext();\n  const startDismissButtonRef = React.useRef(null);\n  const endDismissButtonRef = React.useRef(null);\n  const preventReturnFocusRef = React.useRef(false);\n  const isPointerDownRef = React.useRef(false);\n  const tabbableIndexRef = React.useRef(-1);\n  const isInsidePortal = portalContext != null;\n  const firstElementChild = floating == null ? void 0 : floating.firstElementChild;\n  // If the floating element is acting as a positioning wrapper rather than the\n  // element that receives aria props, use it as the focus root instead.\n  const floatingFocusNode = (firstElementChild == null ? void 0 : firstElementChild.id) === floatingId ? firstElementChild : floating;\n  const getTabbableContent = useEffectEvent(function (container) {\n    if (container === void 0) {\n      container = floatingFocusNode;\n    }\n    return container ? tabbable(container, getTabbableOptions()) : [];\n  });\n  const getTabbableElements = useEffectEvent(container => {\n    const content = getTabbableContent(container);\n    return orderRef.current.map(type => {\n      if (domReference && type === 'reference') {\n        return domReference;\n      }\n      if (floatingFocusNode && type === 'floating') {\n        return floatingFocusNode;\n      }\n      return content;\n    }).filter(Boolean).flat();\n  });\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!modal) return;\n    function onKeyDown(event) {\n      if (event.key === 'Tab') {\n        // The focus guards have nothing to focus, so we need to stop the event.\n        if (contains(floatingFocusNode, activeElement(getDocument(floatingFocusNode))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n          stopEvent(event);\n        }\n        const els = getTabbableElements();\n        const target = getTarget(event);\n        if (orderRef.current[0] === 'reference' && target === domReference) {\n          stopEvent(event);\n          if (event.shiftKey) {\n            enqueueFocus(els[els.length - 1]);\n          } else {\n            enqueueFocus(els[1]);\n          }\n        }\n        if (orderRef.current[1] === 'floating' && target === floatingFocusNode && event.shiftKey) {\n          stopEvent(event);\n          enqueueFocus(els[0]);\n        }\n      }\n    }\n    const doc = getDocument(floatingFocusNode);\n    doc.addEventListener('keydown', onKeyDown);\n    return () => {\n      doc.removeEventListener('keydown', onKeyDown);\n    };\n  }, [disabled, domReference, floatingFocusNode, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!floating) return;\n    function handleFocusIn(event) {\n      const target = getTarget(event);\n      const tabbableContent = getTabbableContent();\n      const tabbableIndex = tabbableContent.indexOf(target);\n      if (tabbableIndex !== -1) {\n        tabbableIndexRef.current = tabbableIndex;\n      }\n    }\n    floating.addEventListener('focusin', handleFocusIn);\n    return () => {\n      floating.removeEventListener('focusin', handleFocusIn);\n    };\n  }, [disabled, floating, getTabbableContent]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!closeOnFocusOut) return;\n\n    // In Safari, buttons lose focus when pressing them.\n    function handlePointerDown() {\n      isPointerDownRef.current = true;\n      setTimeout(() => {\n        isPointerDownRef.current = false;\n      });\n    }\n    function handleFocusOutside(event) {\n      const relatedTarget = event.relatedTarget;\n      queueMicrotask(() => {\n        const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getChildren(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context, _node$context2;\n          return contains((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n        }) || getAncestors(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context3, _node$context4;\n          return ((_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating) === relatedTarget || ((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.domReference) === relatedTarget;\n        })));\n\n        // Restore focus to the previous tabbable element index to prevent\n        // focus from being lost outside the floating tree.\n        if (restoreFocus && movedToUnrelatedNode && activeElement(getDocument(floatingFocusNode)) === getDocument(floatingFocusNode).body) {\n          // Let `FloatingPortal` effect knows that focus is still inside the\n          // floating tree.\n          if (isHTMLElement(floatingFocusNode)) {\n            floatingFocusNode == null || floatingFocusNode.focus();\n          }\n          const prevTabbableIndex = tabbableIndexRef.current;\n          const tabbableContent = getTabbableContent();\n          const nodeToFocus = tabbableContent[prevTabbableIndex] || tabbableContent[tabbableContent.length - 1] || floatingFocusNode;\n          if (isHTMLElement(nodeToFocus)) {\n            nodeToFocus.focus();\n          }\n        }\n\n        // Focus did not move inside the floating tree, and there are no tabbable\n        // portal guards to handle closing.\n        if ((isUntrappedTypeableCombobox ? true : !modal) && relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n        // Fix React 18 Strict Mode returnFocus due to double rendering.\n        relatedTarget !== getPreviouslyFocusedElement()) {\n          preventReturnFocusRef.current = true;\n          onOpenChange(false, event);\n        }\n      });\n    }\n    if (floating && isHTMLElement(domReference)) {\n      domReference.addEventListener('focusout', handleFocusOutside);\n      domReference.addEventListener('pointerdown', handlePointerDown);\n      floating.addEventListener('focusout', handleFocusOutside);\n      return () => {\n        domReference.removeEventListener('focusout', handleFocusOutside);\n        domReference.removeEventListener('pointerdown', handlePointerDown);\n        floating.removeEventListener('focusout', handleFocusOutside);\n      };\n    }\n  }, [disabled, domReference, floating, floatingFocusNode, modal, nodeId, tree, portalContext, onOpenChange, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox]);\n  React.useEffect(() => {\n    var _portalContext$portal;\n    if (disabled) return;\n\n    // Don't hide portals nested within the parent portal.\n    const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n    if (floating) {\n      const insideElements = [floating, ...portalNodes, startDismissButtonRef.current, endDismissButtonRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n      const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, guards, !guards) : markOthers(insideElements);\n      return () => {\n        cleanup();\n      };\n    }\n  }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards]);\n  index(() => {\n    if (disabled || !isHTMLElement(floatingFocusNode)) return;\n    const doc = getDocument(floatingFocusNode);\n    const previouslyFocusedElement = activeElement(doc);\n\n    // Wait for any layout effect state setters to execute to set `tabIndex`.\n    queueMicrotask(() => {\n      const focusableElements = getTabbableElements(floatingFocusNode);\n      const initialFocusValue = initialFocusRef.current;\n      const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floatingFocusNode;\n      const focusAlreadyInsideFloatingEl = contains(floatingFocusNode, previouslyFocusedElement);\n      if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n        enqueueFocus(elToFocus, {\n          preventScroll: elToFocus === floatingFocusNode\n        });\n      }\n    });\n  }, [disabled, open, floatingFocusNode, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n  index(() => {\n    if (disabled || !floatingFocusNode) return;\n    let preventReturnFocusScroll = false;\n    const doc = getDocument(floatingFocusNode);\n    const previouslyFocusedElement = activeElement(doc);\n    const contextData = dataRef.current;\n    let openEvent = contextData.openEvent;\n    const domReference = refs.domReference.current;\n    addPreviouslyFocusedElement(previouslyFocusedElement);\n\n    // Dismissing via outside press should always ignore `returnFocus` to\n    // prevent unwanted scrolling.\n    function onOpenChange(_ref) {\n      let {\n        open,\n        reason,\n        event,\n        nested\n      } = _ref;\n      if (open) {\n        openEvent = event;\n      }\n      if (reason === 'escape-key' && refs.domReference.current) {\n        addPreviouslyFocusedElement(refs.domReference.current);\n      }\n      if (reason === 'hover' && event.type === 'mouseleave') {\n        preventReturnFocusRef.current = true;\n      }\n      if (reason !== 'outside-press') return;\n      if (nested) {\n        preventReturnFocusRef.current = false;\n        preventReturnFocusScroll = true;\n      } else {\n        preventReturnFocusRef.current = !(isVirtualClick(event) || isVirtualPointerEvent(event));\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n      const activeEl = activeElement(doc);\n      const isFocusInsideFloatingTree = contains(floating, activeEl) || tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n        var _node$context5;\n        return contains((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.floating, activeEl);\n      });\n      const shouldFocusReference = isFocusInsideFloatingTree || openEvent && ['click', 'mousedown'].includes(openEvent.type);\n      if (shouldFocusReference && refs.domReference.current) {\n        addPreviouslyFocusedElement(refs.domReference.current);\n      }\n      const returnContextElement = domReference || previouslyFocusedElement;\n      const tabbableElements = tabbable(getDocument(returnContextElement).body, getTabbableOptions());\n\n      // Wait for the return element to get potentially disconnected before\n      // checking.\n      queueMicrotask(() => {\n        let returnElement = getPreviouslyFocusedElement();\n        if (!returnElement && isHTMLElement(returnContextElement) && floating) {\n          returnElement = getClosestTabbableElement(tabbableElements, returnContextElement, floating);\n        }\n        if (\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(returnElement) && (\n        // If the focus moved somewhere else after mount, avoid returning focus\n        // since it likely entered a different element which should be\n        // respected: https://github.com/floating-ui/floating-ui/issues/2607\n        returnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n          returnElement.focus({\n            preventScroll: preventReturnFocusScroll\n          });\n        }\n      });\n    };\n  }, [disabled, floating, floatingFocusNode, returnFocusRef, dataRef, refs, events, tree, nodeId]);\n\n  // Synchronize the `context` & `modal` value to the FloatingPortal context.\n  // It will decide whether or not it needs to render its own guards.\n  index(() => {\n    if (disabled) return;\n    if (!portalContext) return;\n    portalContext.setFocusManagerState({\n      modal,\n      closeOnFocusOut,\n      open,\n      onOpenChange,\n      refs\n    });\n    return () => {\n      portalContext.setFocusManagerState(null);\n    };\n  }, [disabled, portalContext, modal, open, onOpenChange, refs, closeOnFocusOut]);\n  index(() => {\n    if (disabled) return;\n    if (!floatingFocusNode) return;\n    if (typeof MutationObserver !== 'function') return;\n    if (ignoreInitialFocus) return;\n    const handleMutation = () => {\n      const tabIndex = floatingFocusNode.getAttribute('tabindex');\n      const tabbableContent = getTabbableContent();\n      const activeEl = activeElement(getDocument(floating));\n      const tabbableIndex = tabbableContent.indexOf(activeEl);\n      if (tabbableIndex !== -1) {\n        tabbableIndexRef.current = tabbableIndex;\n      }\n      if (orderRef.current.includes('floating') || activeEl !== refs.domReference.current && tabbableContent.length === 0) {\n        if (tabIndex !== '0') {\n          floatingFocusNode.setAttribute('tabindex', '0');\n        }\n      } else if (tabIndex !== '-1') {\n        floatingFocusNode.setAttribute('tabindex', '-1');\n      }\n    };\n    handleMutation();\n    const observer = new MutationObserver(handleMutation);\n    observer.observe(floatingFocusNode, {\n      childList: true,\n      subtree: true,\n      attributes: true\n    });\n    return () => {\n      observer.disconnect();\n    };\n  }, [disabled, floating, floatingFocusNode, refs, orderRef, getTabbableContent, ignoreInitialFocus]);\n  function renderDismissButton(location) {\n    if (disabled || !visuallyHiddenDismiss || !modal) {\n      return null;\n    }\n    return /*#__PURE__*/React.createElement(VisuallyHiddenDismiss, {\n      ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n      onClick: event => onOpenChange(false, event.nativeEvent)\n    }, typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss');\n  }\n  const shouldRenderGuards = !disabled && guards && (modal ? !isUntrappedTypeableCombobox : true) && (isInsidePortal || modal);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"inside\",\n    ref: portalContext == null ? void 0 : portalContext.beforeInsideRef,\n    onFocus: event => {\n      if (modal) {\n        const els = getTabbableElements();\n        enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n      } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n        preventReturnFocusRef.current = false;\n        if (isOutsideEvent(event, portalContext.portalNode)) {\n          const nextTabbable = getNextTabbable() || domReference;\n          nextTabbable == null || nextTabbable.focus();\n        } else {\n          var _portalContext$before;\n          (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n        }\n      }\n    }\n  }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"inside\",\n    ref: portalContext == null ? void 0 : portalContext.afterInsideRef,\n    onFocus: event => {\n      if (modal) {\n        enqueueFocus(getTabbableElements()[0]);\n      } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n        if (closeOnFocusOut) {\n          preventReturnFocusRef.current = true;\n        }\n        if (isOutsideEvent(event, portalContext.portalNode)) {\n          const prevTabbable = getPreviousTabbable() || domReference;\n          prevTabbable == null || prevTabbable.focus();\n        } else {\n          var _portalContext$afterO;\n          (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n        }\n      }\n    }\n  }));\n}\n\nconst activeLocks = /*#__PURE__*/new Set();\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n  const {\n    lockScroll = false,\n    ...rest\n  } = props;\n  const lockId = useId();\n  index(() => {\n    if (!lockScroll) return;\n    activeLocks.add(lockId);\n    const isIOS = /iP(hone|ad|od)|iOS/.test(getPlatform());\n    const bodyStyle = document.body.style;\n    // RTL <body> scrollbar\n    const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n    const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n    const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n    const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.scrollX;\n    const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.scrollY;\n    bodyStyle.overflow = 'hidden';\n    if (scrollbarWidth) {\n      bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n    }\n\n    // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n    // technique has fewer side effects.\n    if (isIOS) {\n      var _window$visualViewpor, _window$visualViewpor2;\n      // iOS 12 does not support `visualViewport`.\n      const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n      const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n      Object.assign(bodyStyle, {\n        position: 'fixed',\n        top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n        left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n        right: '0'\n      });\n    }\n    return () => {\n      activeLocks.delete(lockId);\n      if (activeLocks.size === 0) {\n        Object.assign(bodyStyle, {\n          overflow: '',\n          [paddingProp]: ''\n        });\n        if (isIOS) {\n          Object.assign(bodyStyle, {\n            position: '',\n            top: '',\n            left: '',\n            right: ''\n          });\n          window.scrollTo(scrollX, scrollY);\n        }\n      }\n    };\n  }, [lockId, lockScroll]);\n  return /*#__PURE__*/React.createElement(\"div\", _extends({\n    ref: ref\n  }, rest, {\n    style: {\n      position: 'fixed',\n      overflow: 'auto',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      ...rest.style\n    }\n  }));\n});\n\nfunction isButtonTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isSpaceIgnored(element) {\n  return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    elements: {\n      domReference\n    }\n  } = context;\n  const {\n    enabled = true,\n    event: eventOption = 'click',\n    toggle = true,\n    ignoreMouse = false,\n    keyboardHandlers = true\n  } = props;\n  const pointerTypeRef = React.useRef();\n  const didKeyDownRef = React.useRef(false);\n  const reference = React.useMemo(() => ({\n    onPointerDown(event) {\n      pointerTypeRef.current = event.pointerType;\n    },\n    onMouseDown(event) {\n      const pointerType = pointerTypeRef.current;\n\n      // Ignore all buttons except for the \"main\" button.\n      // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n      if (event.button !== 0) return;\n      if (eventOption === 'click') return;\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        // Prevent stealing focus from the floating element\n        event.preventDefault();\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onClick(event) {\n      const pointerType = pointerTypeRef.current;\n      if (eventOption === 'mousedown' && pointerTypeRef.current) {\n        pointerTypeRef.current = undefined;\n        return;\n      }\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent ? dataRef.current.openEvent.type === 'click' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onKeyDown(event) {\n      pointerTypeRef.current = undefined;\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n        return;\n      }\n      if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n        // Prevent scrolling\n        event.preventDefault();\n        didKeyDownRef.current = true;\n      }\n      if (event.key === 'Enter') {\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    },\n    onKeyUp(event) {\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n        return;\n      }\n      if (event.key === ' ' && didKeyDownRef.current) {\n        didKeyDownRef.current = false;\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    }\n  }), [dataRef, domReference, eventOption, ignoreMouse, keyboardHandlers, onOpenChange, open, toggle]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nfunction createVirtualElement(domElement, data) {\n  let offsetX = null;\n  let offsetY = null;\n  let isAutoUpdateEvent = false;\n  return {\n    contextElement: domElement || undefined,\n    getBoundingClientRect() {\n      var _data$dataRef$current;\n      const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0\n      };\n      const isXAxis = data.axis === 'x' || data.axis === 'both';\n      const isYAxis = data.axis === 'y' || data.axis === 'both';\n      const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n      let width = domRect.width;\n      let height = domRect.height;\n      let x = domRect.x;\n      let y = domRect.y;\n      if (offsetX == null && data.x && isXAxis) {\n        offsetX = domRect.x - data.x;\n      }\n      if (offsetY == null && data.y && isYAxis) {\n        offsetY = domRect.y - data.y;\n      }\n      x -= offsetX || 0;\n      y -= offsetY || 0;\n      width = 0;\n      height = 0;\n      if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n        width = data.axis === 'y' ? domRect.width : 0;\n        height = data.axis === 'x' ? domRect.height : 0;\n        x = isXAxis && data.x != null ? data.x : x;\n        y = isYAxis && data.y != null ? data.y : y;\n      } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n        height = data.axis === 'x' ? domRect.height : height;\n        width = data.axis === 'y' ? domRect.width : width;\n      }\n      isAutoUpdateEvent = true;\n      return {\n        width,\n        height,\n        x,\n        y,\n        top: y,\n        right: x + width,\n        bottom: y + height,\n        left: x\n      };\n    }\n  };\n}\nfunction isMouseBasedEvent(event) {\n  return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    dataRef,\n    elements: {\n      floating,\n      domReference\n    },\n    refs\n  } = context;\n  const {\n    enabled = true,\n    axis = 'both',\n    x = null,\n    y = null\n  } = props;\n  const initialRef = React.useRef(false);\n  const cleanupListenerRef = React.useRef(null);\n  const [pointerType, setPointerType] = React.useState();\n  const [reactive, setReactive] = React.useState([]);\n  const setReference = useEffectEvent((x, y) => {\n    if (initialRef.current) return;\n\n    // Prevent setting if the open event was not a mouse-like one\n    // (e.g. focus to open, then hover over the reference element).\n    // Only apply if the event exists.\n    if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n      return;\n    }\n    refs.setPositionReference(createVirtualElement(domReference, {\n      x,\n      y,\n      axis,\n      dataRef,\n      pointerType\n    }));\n  });\n  const handleReferenceEnterOrMove = useEffectEvent(event => {\n    if (x != null || y != null) return;\n    if (!open) {\n      setReference(event.clientX, event.clientY);\n    } else if (!cleanupListenerRef.current) {\n      // If there's no cleanup, there's no listener, but we want to ensure\n      // we add the listener if the cursor landed on the floating element and\n      // then back on the reference (i.e. it's interactive).\n      setReactive([]);\n    }\n  });\n\n  // If the pointer is a mouse-like pointer, we want to continue following the\n  // mouse even if the floating element is transitioning out. On touch\n  // devices, this is undesirable because the floating element will move to\n  // the dismissal touch point.\n  const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n  const addListener = React.useCallback(() => {\n    // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n    if (!openCheck || !enabled || x != null || y != null) return;\n    const win = getWindow(floating);\n    function handleMouseMove(event) {\n      const target = getTarget(event);\n      if (!contains(floating, target)) {\n        setReference(event.clientX, event.clientY);\n      } else {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      }\n    }\n    if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n      win.addEventListener('mousemove', handleMouseMove);\n      const cleanup = () => {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      };\n      cleanupListenerRef.current = cleanup;\n      return cleanup;\n    }\n    refs.setPositionReference(domReference);\n  }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n  React.useEffect(() => {\n    return addListener();\n  }, [addListener, reactive]);\n  React.useEffect(() => {\n    if (enabled && !floating) {\n      initialRef.current = false;\n    }\n  }, [enabled, floating]);\n  React.useEffect(() => {\n    if (!enabled && open) {\n      initialRef.current = true;\n    }\n  }, [enabled, open]);\n  index(() => {\n    if (enabled && (x != null || y != null)) {\n      initialRef.current = false;\n      setReference(x, y);\n    }\n  }, [enabled, x, y, setReference]);\n  const reference = React.useMemo(() => {\n    function setPointerTypeRef(_ref) {\n      let {\n        pointerType\n      } = _ref;\n      setPointerType(pointerType);\n    }\n    return {\n      onPointerDown: setPointerTypeRef,\n      onPointerEnter: setPointerTypeRef,\n      onMouseMove: handleReferenceEnterOrMove,\n      onMouseEnter: handleReferenceEnterOrMove\n    };\n  }, [handleReferenceEnterOrMove]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst bubbleHandlerKeys = {\n  pointerdown: 'onPointerDown',\n  mousedown: 'onMouseDown',\n  click: 'onClick'\n};\nconst captureHandlerKeys = {\n  pointerdown: 'onPointerDownCapture',\n  mousedown: 'onMouseDownCapture',\n  click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n  var _normalizable$escapeK, _normalizable$outside;\n  return {\n    escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n    outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n  };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    elements,\n    dataRef\n  } = context;\n  const {\n    enabled = true,\n    escapeKey = true,\n    outsidePress: unstable_outsidePress = true,\n    outsidePressEvent = 'pointerdown',\n    referencePress = false,\n    referencePressEvent = 'pointerdown',\n    ancestorScroll = false,\n    bubbles,\n    capture\n  } = props;\n  const tree = useFloatingTree();\n  const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n  const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n  const insideReactTreeRef = React.useRef(false);\n  const endedOrStartedInsideRef = React.useRef(false);\n  const {\n    escapeKey: escapeKeyBubbles,\n    outsidePress: outsidePressBubbles\n  } = normalizeProp(bubbles);\n  const {\n    escapeKey: escapeKeyCapture,\n    outsidePress: outsidePressCapture\n  } = normalizeProp(capture);\n  const closeOnEscapeKeyDown = useEffectEvent(event => {\n    var _dataRef$current$floa;\n    if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n      return;\n    }\n    const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n    const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n    if (!escapeKeyBubbles) {\n      event.stopPropagation();\n      if (children.length > 0) {\n        let shouldDismiss = true;\n        children.forEach(child => {\n          var _child$context;\n          if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n            shouldDismiss = false;\n            return;\n          }\n        });\n        if (!shouldDismiss) {\n          return;\n        }\n      }\n    }\n    onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n  });\n  const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n    var _getTarget2;\n    const callback = () => {\n      var _getTarget;\n      closeOnEscapeKeyDown(event);\n      (_getTarget = getTarget(event)) == null || _getTarget.removeEventListener('keydown', callback);\n    };\n    (_getTarget2 = getTarget(event)) == null || _getTarget2.addEventListener('keydown', callback);\n  });\n  const closeOnPressOutside = useEffectEvent(event => {\n    var _dataRef$current$floa2;\n    // Given developers can stop the propagation of the synthetic event,\n    // we can only be confident with a positive value.\n    const insideReactTree = insideReactTreeRef.current;\n    insideReactTreeRef.current = false;\n\n    // When click outside is lazy (`click` event), handle dragging.\n    // Don't close if:\n    // - The click started inside the floating element.\n    // - The click ended inside the floating element.\n    const endedOrStartedInside = endedOrStartedInsideRef.current;\n    endedOrStartedInsideRef.current = false;\n    if (outsidePressEvent === 'click' && endedOrStartedInside) {\n      return;\n    }\n    if (insideReactTree) {\n      return;\n    }\n    if (typeof outsidePress === 'function' && !outsidePress(event)) {\n      return;\n    }\n    const target = getTarget(event);\n    const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n    const markers = getDocument(elements.floating).querySelectorAll(inertSelector);\n    let targetRootAncestor = isElement(target) ? target : null;\n    while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n      const nextParent = getParentNode(targetRootAncestor);\n      if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n        break;\n      }\n      targetRootAncestor = nextParent;\n    }\n\n    // Check if the click occurred on a third-party element injected after the\n    // floating element rendered.\n    if (markers.length && isElement(target) && !isRootElement(target) &&\n    // Clicked on a direct ancestor (e.g. FloatingOverlay).\n    !contains(target, elements.floating) &&\n    // If the target root element contains none of the markers, then the\n    // element was injected after the floating element rendered.\n    Array.from(markers).every(marker => !contains(targetRootAncestor, marker))) {\n      return;\n    }\n\n    // Check if the click occurred on the scrollbar\n    if (isHTMLElement(target) && floating) {\n      // In Firefox, `target.scrollWidth > target.clientWidth` for inline\n      // elements.\n      const canScrollX = target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n      const canScrollY = target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n      let xCond = canScrollY && event.offsetX > target.clientWidth;\n\n      // In some browsers it is possible to change the <body> (or window)\n      // scrollbar to the left side, but is very rare and is difficult to\n      // check for. Plus, for modal dialogs with backdrops, it is more\n      // important that the backdrop is checked but not so much the window.\n      if (canScrollY) {\n        const isRTL = getComputedStyle(target).direction === 'rtl';\n        if (isRTL) {\n          xCond = event.offsetX <= target.offsetWidth - target.clientWidth;\n        }\n      }\n      if (xCond || canScrollX && event.offsetY > target.clientHeight) {\n        return;\n      }\n    }\n    const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n    const targetIsInsideChildren = tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n      var _node$context;\n      return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n    });\n    if (isEventTargetWithin(event, elements.floating) || isEventTargetWithin(event, elements.domReference) || targetIsInsideChildren) {\n      return;\n    }\n    const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n    if (children.length > 0) {\n      let shouldDismiss = true;\n      children.forEach(child => {\n        var _child$context2;\n        if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n          shouldDismiss = false;\n          return;\n        }\n      });\n      if (!shouldDismiss) {\n        return;\n      }\n    }\n    onOpenChange(false, event, 'outside-press');\n  });\n  const closeOnPressOutsideCapture = useEffectEvent(event => {\n    var _getTarget4;\n    const callback = () => {\n      var _getTarget3;\n      closeOnPressOutside(event);\n      (_getTarget3 = getTarget(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n    };\n    (_getTarget4 = getTarget(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n  });\n  React.useEffect(() => {\n    if (!open || !enabled) {\n      return;\n    }\n    dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n    dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n    function onScroll(event) {\n      onOpenChange(false, event, 'ancestor-scroll');\n    }\n    const doc = getDocument(elements.floating);\n    escapeKey && doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n    outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n    let ancestors = [];\n    if (ancestorScroll) {\n      if (isElement(elements.domReference)) {\n        ancestors = getOverflowAncestors(elements.domReference);\n      }\n      if (isElement(elements.floating)) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.floating));\n      }\n      if (!isElement(elements.reference) && elements.reference && elements.reference.contextElement) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.reference.contextElement));\n      }\n    }\n\n    // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n    ancestors = ancestors.filter(ancestor => {\n      var _doc$defaultView;\n      return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n    });\n    ancestors.forEach(ancestor => {\n      ancestor.addEventListener('scroll', onScroll, {\n        passive: true\n      });\n    });\n    return () => {\n      escapeKey && doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n      outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n      ancestors.forEach(ancestor => {\n        ancestor.removeEventListener('scroll', onScroll);\n      });\n    };\n  }, [dataRef, elements, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n  React.useEffect(() => {\n    insideReactTreeRef.current = false;\n  }, [outsidePress, outsidePressEvent]);\n  const reference = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    [bubbleHandlerKeys[referencePressEvent]]: event => {\n      if (referencePress) {\n        onOpenChange(false, event.nativeEvent, 'reference-press');\n      }\n    }\n  }), [closeOnEscapeKeyDown, onOpenChange, referencePress, referencePressEvent]);\n  const floating = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    onMouseDown() {\n      endedOrStartedInsideRef.current = true;\n    },\n    onMouseUp() {\n      endedOrStartedInsideRef.current = true;\n    },\n    [captureHandlerKeys[outsidePressEvent]]: () => {\n      insideReactTreeRef.current = true;\n    }\n  }), [closeOnEscapeKeyDown, outsidePressEvent]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction useFloatingRootContext(options) {\n  const {\n    open = false,\n    onOpenChange: onOpenChangeProp,\n    elements: elementsProp\n  } = options;\n  const floatingId = useId();\n  const dataRef = React.useRef({});\n  const [events] = React.useState(() => createPubSub());\n  const nested = useFloatingParentNodeId() != null;\n  if (process.env.NODE_ENV !== \"production\") {\n    const optionDomReference = elementsProp.reference;\n    if (optionDomReference && !isElement(optionDomReference)) {\n      error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n    }\n  }\n  const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n  const onOpenChange = useEffectEvent((open, event, reason) => {\n    dataRef.current.openEvent = open ? event : undefined;\n    events.emit('openchange', {\n      open,\n      event,\n      reason,\n      nested\n    });\n    onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n  });\n  const refs = React.useMemo(() => ({\n    setPositionReference\n  }), []);\n  const elements = React.useMemo(() => ({\n    reference: positionReference || elementsProp.reference || null,\n    floating: elementsProp.floating || null,\n    domReference: elementsProp.reference\n  }), [positionReference, elementsProp.reference, elementsProp.floating]);\n  return React.useMemo(() => ({\n    dataRef,\n    open,\n    onOpenChange,\n    elements,\n    events,\n    floatingId,\n    refs\n  }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    nodeId\n  } = options;\n  const internalRootContext = useFloatingRootContext({\n    ...options,\n    elements: {\n      reference: null,\n      floating: null,\n      ...options.elements\n    }\n  });\n  const rootContext = options.rootContext || internalRootContext;\n  const computedElements = rootContext.elements;\n  const [_domReference, setDomReference] = React.useState(null);\n  const [positionReference, _setPositionReference] = React.useState(null);\n  const optionDomReference = computedElements == null ? void 0 : computedElements.reference;\n  const domReference = optionDomReference || _domReference;\n  const domReferenceRef = React.useRef(null);\n  const tree = useFloatingTree();\n  index(() => {\n    if (domReference) {\n      domReferenceRef.current = domReference;\n    }\n  }, [domReference]);\n  const position = useFloating$1({\n    ...options,\n    elements: {\n      ...computedElements,\n      ...(positionReference && {\n        reference: positionReference\n      })\n    }\n  });\n  const setPositionReference = React.useCallback(node => {\n    const computedPositionReference = isElement(node) ? {\n      getBoundingClientRect: () => node.getBoundingClientRect(),\n      contextElement: node\n    } : node;\n    // Store the positionReference in state if the DOM reference is specified externally via the\n    // `elements.reference` option. This ensures that it won't be overridden on future renders.\n    _setPositionReference(computedPositionReference);\n    position.refs.setReference(computedPositionReference);\n  }, [position.refs]);\n  const setReference = React.useCallback(node => {\n    if (isElement(node) || node === null) {\n      domReferenceRef.current = node;\n      setDomReference(node);\n    }\n\n    // Backwards-compatibility for passing a virtual element to `reference`\n    // after it has set the DOM reference.\n    if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n    // Don't allow setting virtual elements using the old technique back to\n    // `null` to support `positionReference` + an unstable `reference`\n    // callback ref.\n    node !== null && !isElement(node)) {\n      position.refs.setReference(node);\n    }\n  }, [position.refs]);\n  const refs = React.useMemo(() => ({\n    ...position.refs,\n    setReference,\n    setPositionReference,\n    domReference: domReferenceRef\n  }), [position.refs, setReference, setPositionReference]);\n  const elements = React.useMemo(() => ({\n    ...position.elements,\n    domReference: domReference\n  }), [position.elements, domReference]);\n  const context = React.useMemo(() => ({\n    ...position,\n    ...rootContext,\n    refs,\n    elements,\n    nodeId\n  }), [position, refs, elements, nodeId, rootContext]);\n  index(() => {\n    rootContext.dataRef.current.floatingContext = context;\n    const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n    if (node) {\n      node.context = context;\n    }\n  });\n  return React.useMemo(() => ({\n    ...position,\n    context,\n    refs,\n    elements\n  }), [position, refs, elements, context]);\n}\n\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    visibleOnly = true\n  } = props;\n  const blockFocusRef = React.useRef(false);\n  const timeoutRef = React.useRef();\n  const keyboardModalityRef = React.useRef(true);\n  React.useEffect(() => {\n    if (!enabled) return;\n    const win = getWindow(elements.domReference);\n\n    // If the reference was focused and the user left the tab/window, and the\n    // floating element was not open, the focus should be blocked when they\n    // return to the tab/window.\n    function onBlur() {\n      if (!open && isHTMLElement(elements.domReference) && elements.domReference === activeElement(getDocument(elements.domReference))) {\n        blockFocusRef.current = true;\n      }\n    }\n    function onKeyDown() {\n      keyboardModalityRef.current = true;\n    }\n    win.addEventListener('blur', onBlur);\n    win.addEventListener('keydown', onKeyDown, true);\n    return () => {\n      win.removeEventListener('blur', onBlur);\n      win.removeEventListener('keydown', onKeyDown, true);\n    };\n  }, [elements.domReference, open, enabled]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        reason\n      } = _ref;\n      if (reason === 'reference-press' || reason === 'escape-key') {\n        blockFocusRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [events, enabled]);\n  React.useEffect(() => {\n    return () => {\n      clearTimeout(timeoutRef.current);\n    };\n  }, []);\n  const reference = React.useMemo(() => ({\n    onPointerDown(event) {\n      if (isVirtualPointerEvent(event.nativeEvent)) return;\n      keyboardModalityRef.current = false;\n    },\n    onMouseLeave() {\n      blockFocusRef.current = false;\n    },\n    onFocus(event) {\n      if (blockFocusRef.current) return;\n      const target = getTarget(event.nativeEvent);\n      if (visibleOnly && isElement(target)) {\n        try {\n          // Mac Safari unreliably matches `:focus-visible` on the reference\n          // if focus was outside the page initially - use the fallback\n          // instead.\n          if (isSafari() && isMac()) throw Error();\n          if (!target.matches(':focus-visible')) return;\n        } catch (e) {\n          // Old browsers will throw an error when using `:focus-visible`.\n          if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n            return;\n          }\n        }\n      }\n      onOpenChange(true, event.nativeEvent, 'focus');\n    },\n    onBlur(event) {\n      blockFocusRef.current = false;\n      const relatedTarget = event.relatedTarget;\n      const nativeEvent = event.nativeEvent;\n\n      // Hit the non-modal focus management portal guard. Focus will be\n      // moved into the floating element immediately after.\n      const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n      // Wait for the window blur listener to fire.\n      timeoutRef.current = window.setTimeout(() => {\n        var _dataRef$current$floa;\n        const activeEl = activeElement(elements.domReference ? elements.domReference.ownerDocument : document);\n\n        // Focus left the page, keep it open.\n        if (!relatedTarget && activeEl === elements.domReference) return;\n\n        // When focusing the reference element (e.g. regular click), then\n        // clicking into the floating element, prevent it from hiding.\n        // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n        // We can not rely on relatedTarget to point to the correct element\n        // as it will only point to the shadow host of the newly focused element\n        // and not the element that actually has received focus if it is located\n        // inside a shadow root.\n        if (contains((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains(elements.domReference, activeEl) || movedToFocusGuard) {\n          return;\n        }\n        onOpenChange(false, nativeEvent, 'focus');\n      });\n    }\n  }), [dataRef, elements.domReference, onOpenChange, visibleOnly]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nfunction mergeProps(userProps, propsList, elementKey) {\n  const map = new Map();\n  const isItem = elementKey === 'item';\n  let domUserProps = userProps;\n  if (isItem && userProps) {\n    const {\n      [ACTIVE_KEY]: _,\n      [SELECTED_KEY]: __,\n      ...validProps\n    } = userProps;\n    domUserProps = validProps;\n  }\n  return {\n    ...(elementKey === 'floating' && {\n      tabIndex: -1\n    }),\n    ...domUserProps,\n    ...propsList.map(value => {\n      const propsOrGetProps = value ? value[elementKey] : null;\n      if (typeof propsOrGetProps === 'function') {\n        return userProps ? propsOrGetProps(userProps) : null;\n      }\n      return propsOrGetProps;\n    }).concat(userProps).reduce((acc, props) => {\n      if (!props) {\n        return acc;\n      }\n      Object.entries(props).forEach(_ref => {\n        let [key, value] = _ref;\n        if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n          return;\n        }\n        if (key.indexOf('on') === 0) {\n          if (!map.has(key)) {\n            map.set(key, []);\n          }\n          if (typeof value === 'function') {\n            var _map$get;\n            (_map$get = map.get(key)) == null || _map$get.push(value);\n            acc[key] = function () {\n              var _map$get2;\n              for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n              return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n            };\n          }\n        } else {\n          acc[key] = value;\n        }\n      });\n      return acc;\n    }, {})\n  };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n  if (propsList === void 0) {\n    propsList = [];\n  }\n  const referenceDeps = propsList.map(key => key == null ? void 0 : key.reference);\n  const floatingDeps = propsList.map(key => key == null ? void 0 : key.floating);\n  const itemDeps = propsList.map(key => key == null ? void 0 : key.item);\n  const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  referenceDeps);\n  const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  floatingDeps);\n  const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  itemDeps);\n  return React.useMemo(() => ({\n    getReferenceProps,\n    getFloatingProps,\n    getItemProps\n  }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nlet isPreventScrollSupported = false;\nfunction doSwitch(orientation, vertical, horizontal) {\n  switch (orientation) {\n    case 'vertical':\n      return vertical;\n    case 'horizontal':\n      return horizontal;\n    default:\n      return vertical || horizontal;\n  }\n}\nfunction isMainOrientationKey(key, orientation) {\n  const vertical = key === ARROW_UP || key === ARROW_DOWN;\n  const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n  const vertical = key === ARROW_DOWN;\n  const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  const horizontal = key === ARROW_DOWN;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n  const horizontal = key === ARROW_UP;\n  return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n  const {\n    open,\n    onOpenChange,\n    elements\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onNavigate: unstable_onNavigate = () => {},\n    enabled = true,\n    selectedIndex = null,\n    allowEscape = false,\n    loop = false,\n    nested = false,\n    rtl = false,\n    virtual = false,\n    focusItemOnOpen = 'auto',\n    focusItemOnHover = true,\n    openOnArrowKeyDown = true,\n    disabledIndices = undefined,\n    orientation = 'vertical',\n    cols = 1,\n    scrollItemIntoView = true,\n    virtualItemRef,\n    itemSizes,\n    dense = false\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (allowEscape) {\n      if (!loop) {\n        warn('`useListNavigation` looping must be enabled to allow escaping.');\n      }\n      if (!virtual) {\n        warn('`useListNavigation` must be virtual to allow escaping.');\n      }\n    }\n    if (orientation === 'vertical' && cols > 1) {\n      warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n    }\n  }\n  const parentId = useFloatingParentNodeId();\n  const tree = useFloatingTree();\n  const onNavigate = useEffectEvent(unstable_onNavigate);\n  const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n  const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n  const keyRef = React.useRef(null);\n  const isPointerModalityRef = React.useRef(true);\n  const previousOnNavigateRef = React.useRef(onNavigate);\n  const previousMountedRef = React.useRef(!!elements.floating);\n  const previousOpenRef = React.useRef(open);\n  const forceSyncFocus = React.useRef(false);\n  const forceScrollIntoViewRef = React.useRef(false);\n  const disabledIndicesRef = useLatestRef(disabledIndices);\n  const latestOpenRef = useLatestRef(open);\n  const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n  const floatingRef = useLatestRef(elements.floating);\n  const selectedIndexRef = useLatestRef(selectedIndex);\n  const [activeId, setActiveId] = React.useState();\n  const [virtualId, setVirtualId] = React.useState();\n  const focusItem = useEffectEvent(function (listRef, indexRef, forceScrollIntoView) {\n    if (forceScrollIntoView === void 0) {\n      forceScrollIntoView = false;\n    }\n    function runFocus(item) {\n      if (virtual) {\n        setActiveId(item.id);\n        tree == null || tree.events.emit('virtualfocus', item);\n        if (virtualItemRef) {\n          virtualItemRef.current = item;\n        }\n      } else {\n        enqueueFocus(item, {\n          preventScroll: true,\n          // Mac Safari does not move the virtual cursor unless the focus call\n          // is sync. However, for the very first focus call, we need to wait\n          // for the position to be ready in order to prevent unwanted\n          // scrolling. This means the virtual cursor will not move to the first\n          // item when first opening the floating element, but will on\n          // subsequent calls. `preventScroll` is supported in modern Safari,\n          // so we can use that instead.\n          // iOS Safari must be async or the first item will not be focused.\n          sync: isMac() && isSafari() ? isPreventScrollSupported || forceSyncFocus.current : false\n        });\n      }\n    }\n    const initialItem = listRef.current[indexRef.current];\n    if (initialItem) {\n      runFocus(initialItem);\n    }\n    requestAnimationFrame(() => {\n      const waitedItem = listRef.current[indexRef.current] || initialItem;\n      if (!waitedItem) return;\n      if (!initialItem) {\n        runFocus(waitedItem);\n      }\n      const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n      const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n      if (shouldScrollIntoView) {\n        // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n        // by all browsers.\n        waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n          block: 'nearest',\n          inline: 'nearest'\n        } : scrollIntoViewOptions);\n      }\n    });\n  });\n  index(() => {\n    document.createElement('div').focus({\n      get preventScroll() {\n        isPreventScrollSupported = true;\n        return false;\n      }\n    });\n  }, []);\n\n  // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n  // element. Also, reset `activeIndex` upon closing the floating element.\n  index(() => {\n    if (!enabled) return;\n    if (open && elements.floating) {\n      if (focusItemOnOpenRef.current && selectedIndex != null) {\n        // Regardless of the pointer modality, we want to ensure the selected\n        // item comes into view when the floating element is opened.\n        forceScrollIntoViewRef.current = true;\n        indexRef.current = selectedIndex;\n        onNavigate(selectedIndex);\n      }\n    } else if (previousMountedRef.current) {\n      // Since the user can specify `onNavigate` conditionally\n      // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n      // we store and call the previous function.\n      indexRef.current = -1;\n      previousOnNavigateRef.current(null);\n    }\n  }, [enabled, open, elements.floating, selectedIndex, onNavigate]);\n\n  // Sync `activeIndex` to be the focused item while the floating element is\n  // open.\n  index(() => {\n    if (!enabled) return;\n    if (open && elements.floating) {\n      if (activeIndex == null) {\n        forceSyncFocus.current = false;\n        if (selectedIndexRef.current != null) {\n          return;\n        }\n\n        // Reset while the floating element was open (e.g. the list changed).\n        if (previousMountedRef.current) {\n          indexRef.current = -1;\n          focusItem(listRef, indexRef);\n        }\n\n        // Initial sync.\n        if ((!previousOpenRef.current || !previousMountedRef.current) && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n          let runs = 0;\n          const waitForListPopulated = () => {\n            if (listRef.current[0] == null) {\n              // Avoid letting the browser paint if possible on the first try,\n              // otherwise use rAF. Don't try more than twice, since something\n              // is wrong otherwise.\n              if (runs < 2) {\n                const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n                scheduler(waitForListPopulated);\n              }\n              runs++;\n            } else {\n              indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinIndex(listRef, disabledIndicesRef.current) : getMaxIndex(listRef, disabledIndicesRef.current);\n              keyRef.current = null;\n              onNavigate(indexRef.current);\n            }\n          };\n          waitForListPopulated();\n        }\n      } else if (!isIndexOutOfBounds(listRef, activeIndex)) {\n        indexRef.current = activeIndex;\n        focusItem(listRef, indexRef, forceScrollIntoViewRef.current);\n        forceScrollIntoViewRef.current = false;\n      }\n    }\n  }, [enabled, open, elements.floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n  // Ensure the parent floating element has focus when a nested child closes\n  // to allow arrow key navigation to work after the pointer leaves the child.\n  index(() => {\n    var _nodes$find;\n    if (!enabled || elements.floating || !tree || virtual || !previousMountedRef.current) {\n      return;\n    }\n    const nodes = tree.nodesRef.current;\n    const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n    const activeEl = activeElement(getDocument(elements.floating));\n    const treeContainsActiveEl = nodes.some(node => node.context && contains(node.context.elements.floating, activeEl));\n    if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n      parent.focus({\n        preventScroll: true\n      });\n    }\n  }, [enabled, elements.floating, tree, parentId, virtual]);\n  index(() => {\n    if (!enabled) return;\n    if (!tree) return;\n    if (!virtual) return;\n    if (parentId) return;\n    function handleVirtualFocus(item) {\n      setVirtualId(item.id);\n      if (virtualItemRef) {\n        virtualItemRef.current = item;\n      }\n    }\n    tree.events.on('virtualfocus', handleVirtualFocus);\n    return () => {\n      tree.events.off('virtualfocus', handleVirtualFocus);\n    };\n  }, [enabled, tree, virtual, parentId, virtualItemRef]);\n  index(() => {\n    previousOnNavigateRef.current = onNavigate;\n    previousMountedRef.current = !!elements.floating;\n  });\n  index(() => {\n    if (!open) {\n      keyRef.current = null;\n    }\n  }, [open]);\n  index(() => {\n    previousOpenRef.current = open;\n  }, [open]);\n  const hasActiveIndex = activeIndex != null;\n  const item = React.useMemo(() => {\n    function syncCurrentTarget(currentTarget) {\n      if (!open) return;\n      const index = listRef.current.indexOf(currentTarget);\n      if (index !== -1) {\n        onNavigate(index);\n      }\n    }\n    const props = {\n      onFocus(_ref) {\n        let {\n          currentTarget\n        } = _ref;\n        syncCurrentTarget(currentTarget);\n      },\n      onClick: _ref2 => {\n        let {\n          currentTarget\n        } = _ref2;\n        return currentTarget.focus({\n          preventScroll: true\n        });\n      },\n      // Safari\n      ...(focusItemOnHover && {\n        onMouseMove(_ref3) {\n          let {\n            currentTarget\n          } = _ref3;\n          syncCurrentTarget(currentTarget);\n        },\n        onPointerLeave(_ref4) {\n          let {\n            pointerType\n          } = _ref4;\n          if (!isPointerModalityRef.current || pointerType === 'touch') {\n            return;\n          }\n          indexRef.current = -1;\n          focusItem(listRef, indexRef);\n          onNavigate(null);\n          if (!virtual) {\n            enqueueFocus(floatingRef.current, {\n              preventScroll: true\n            });\n          }\n        }\n      })\n    };\n    return props;\n  }, [open, floatingRef, focusItem, focusItemOnHover, listRef, onNavigate, virtual]);\n  const commonOnKeyDown = useEffectEvent(event => {\n    isPointerModalityRef.current = false;\n    forceSyncFocus.current = true;\n\n    // If the floating element is animating out, ignore navigation. Otherwise,\n    // the `activeIndex` gets set to 0 despite not being open so the next time\n    // the user ArrowDowns, the first item won't be focused.\n    if (!latestOpenRef.current && event.currentTarget === floatingRef.current) {\n      return;\n    }\n    if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl)) {\n      stopEvent(event);\n      onOpenChange(false, event.nativeEvent, 'list-navigation');\n      if (isHTMLElement(elements.domReference) && !virtual) {\n        elements.domReference.focus();\n      }\n      return;\n    }\n    const currentIndex = indexRef.current;\n    const minIndex = getMinIndex(listRef, disabledIndices);\n    const maxIndex = getMaxIndex(listRef, disabledIndices);\n    if (event.key === 'Home') {\n      stopEvent(event);\n      indexRef.current = minIndex;\n      onNavigate(indexRef.current);\n    }\n    if (event.key === 'End') {\n      stopEvent(event);\n      indexRef.current = maxIndex;\n      onNavigate(indexRef.current);\n    }\n\n    // Grid navigation.\n    if (cols > 1) {\n      const sizes = itemSizes || Array.from({\n        length: listRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = buildCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isDisabled(listRef.current, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isDisabled(listRef.current, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      indexRef.current = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getCellIndices([...(disabledIndices || listRef.current.map((_, index) => isDisabled(listRef.current, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction\n        // we're moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === ARROW_RIGHT ? 'tr' : 'tl'),\n        stopEvent: true\n      })]; // navigated cell will never be nullish\n\n      onNavigate(indexRef.current);\n      if (orientation === 'both') {\n        return;\n      }\n    }\n    if (isMainOrientationKey(event.key, orientation)) {\n      stopEvent(event);\n\n      // Reset the index if no item is focused.\n      if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n        indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n        onNavigate(indexRef.current);\n        return;\n      }\n      if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n        if (loop) {\n          indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.min(maxIndex, findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          }));\n        }\n      } else {\n        if (loop) {\n          indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.max(minIndex, findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          }));\n        }\n      }\n      if (isIndexOutOfBounds(listRef, indexRef.current)) {\n        onNavigate(null);\n      } else {\n        onNavigate(indexRef.current);\n      }\n    }\n  });\n  const ariaActiveDescendantProp = React.useMemo(() => {\n    return virtual && open && hasActiveIndex && {\n      'aria-activedescendant': virtualId || activeId\n    };\n  }, [virtual, open, hasActiveIndex, virtualId, activeId]);\n  const floating = React.useMemo(() => {\n    return {\n      'aria-orientation': orientation === 'both' ? undefined : orientation,\n      ...(!isTypeableCombobox(elements.domReference) && ariaActiveDescendantProp),\n      onKeyDown: commonOnKeyDown,\n      onPointerMove() {\n        isPointerModalityRef.current = true;\n      }\n    };\n  }, [ariaActiveDescendantProp, commonOnKeyDown, elements.domReference, orientation]);\n  const reference = React.useMemo(() => {\n    function checkVirtualMouse(event) {\n      if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    function checkVirtualPointer(event) {\n      // `pointerdown` fires first, reset the state then perform the checks.\n      focusItemOnOpenRef.current = focusItemOnOpen;\n      if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    return {\n      ...ariaActiveDescendantProp,\n      onKeyDown(event) {\n        isPointerModalityRef.current = false;\n        const isArrowKey = event.key.indexOf('Arrow') === 0;\n        const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n        const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl);\n        const isMainKey = isMainOrientationKey(event.key, orientation);\n        const isNavigationKey = (nested ? isCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n        if (virtual && open) {\n          const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n          const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n          if (isArrowKey && deepestNode && virtualItemRef) {\n            const eventObject = new KeyboardEvent('keydown', {\n              key: event.key,\n              bubbles: true\n            });\n            if (isCrossOpenKey || isCrossCloseKey) {\n              var _deepestNode$context, _deepestNode$context2;\n              const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n              const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? listRef.current.find(item => (item == null ? void 0 : item.id) === activeId) : null;\n              if (dispatchItem) {\n                stopEvent(event);\n                dispatchItem.dispatchEvent(eventObject);\n                setVirtualId(undefined);\n              }\n            }\n            if (isMainKey && deepestNode.context) {\n              if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n                var _deepestNode$context$;\n                stopEvent(event);\n                (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n                return;\n              }\n            }\n          }\n          return commonOnKeyDown(event);\n        }\n\n        // If a floating element should not open on arrow key down, avoid\n        // setting `activeIndex` while it's closed.\n        if (!open && !openOnArrowKeyDown && isArrowKey) {\n          return;\n        }\n        if (isNavigationKey) {\n          keyRef.current = nested && isMainKey ? null : event.key;\n        }\n        if (nested) {\n          if (isCrossOpenKey) {\n            stopEvent(event);\n            if (open) {\n              indexRef.current = getMinIndex(listRef, disabledIndicesRef.current);\n              onNavigate(indexRef.current);\n            } else {\n              onOpenChange(true, event.nativeEvent, 'list-navigation');\n            }\n          }\n          return;\n        }\n        if (isMainKey) {\n          if (selectedIndex != null) {\n            indexRef.current = selectedIndex;\n          }\n          stopEvent(event);\n          if (!open && openOnArrowKeyDown) {\n            onOpenChange(true, event.nativeEvent, 'list-navigation');\n          } else {\n            commonOnKeyDown(event);\n          }\n          if (open) {\n            onNavigate(indexRef.current);\n          }\n        }\n      },\n      onFocus() {\n        if (open && !virtual) {\n          onNavigate(null);\n        }\n      },\n      onPointerDown: checkVirtualPointer,\n      onMouseDown: checkVirtualMouse,\n      onClick: checkVirtualMouse\n    };\n  }, [activeId, ariaActiveDescendantProp, commonOnKeyDown, disabledIndicesRef, focusItemOnOpen, listRef, nested, onNavigate, onOpenChange, open, openOnArrowKeyDown, orientation, rtl, selectedIndex, tree, virtual, virtualItemRef]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n  var _componentRoleToAriaR;\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    floatingId\n  } = context;\n  const {\n    enabled = true,\n    role = 'dialog'\n  } = props;\n  const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n  const referenceId = useId();\n  const parentId = useFloatingParentNodeId();\n  const isNested = parentId != null;\n  const reference = React.useMemo(() => {\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return {\n        [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n      };\n    }\n    return {\n      'aria-expanded': open ? 'true' : 'false',\n      'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n      'aria-controls': open ? floatingId : undefined,\n      ...(ariaRole === 'listbox' && {\n        role: 'combobox'\n      }),\n      ...(ariaRole === 'menu' && {\n        id: referenceId\n      }),\n      ...(ariaRole === 'menu' && isNested && {\n        role: 'menuitem'\n      }),\n      ...(role === 'select' && {\n        'aria-autocomplete': 'none'\n      }),\n      ...(role === 'combobox' && {\n        'aria-autocomplete': 'list'\n      })\n    };\n  }, [ariaRole, floatingId, isNested, open, referenceId, role]);\n  const floating = React.useMemo(() => {\n    const floatingProps = {\n      id: floatingId,\n      ...(ariaRole && {\n        role: ariaRole\n      })\n    };\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return floatingProps;\n    }\n    return {\n      ...floatingProps,\n      ...(ariaRole === 'menu' && {\n        'aria-labelledby': referenceId\n      })\n    };\n  }, [ariaRole, floatingId, referenceId, role]);\n  const item = React.useCallback(_ref => {\n    let {\n      active,\n      selected\n    } = _ref;\n    const commonProps = {\n      role: 'option',\n      ...(active && {\n        id: floatingId + \"-option\"\n      })\n    };\n\n    // For `menu`, we are unable to tell if the item is a `menuitemradio`\n    // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n    // avoid defaulting to `menuitem` as it may overwrite custom role props.\n    switch (role) {\n      case 'select':\n        return {\n          ...commonProps,\n          'aria-selected': active && selected\n        };\n      case 'combobox':\n        {\n          return {\n            ...commonProps,\n            ...(active && {\n              'aria-selected': true\n            })\n          };\n        }\n    }\n    return {};\n  }, [floatingId, role]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n  return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n  const [isMounted, setIsMounted] = React.useState(open);\n  if (open && !isMounted) {\n    setIsMounted(true);\n  }\n  React.useEffect(() => {\n    if (!open && isMounted) {\n      const timeout = setTimeout(() => setIsMounted(false), durationMs);\n      return () => clearTimeout(timeout);\n    }\n  }, [open, isMounted, durationMs]);\n  return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements: {\n      floating\n    }\n  } = context;\n  const {\n    duration = 250\n  } = props;\n  const isNumberDuration = typeof duration === 'number';\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [status, setStatus] = React.useState('unmounted');\n  const isMounted = useDelayUnmount(open, closeDuration);\n  if (!isMounted && status === 'close') {\n    setStatus('unmounted');\n  }\n  index(() => {\n    if (!floating) return;\n    if (open) {\n      setStatus('initial');\n      const frame = requestAnimationFrame(() => {\n        setStatus('open');\n      });\n      return () => {\n        cancelAnimationFrame(frame);\n      };\n    }\n    setStatus('close');\n  }, [open, floating]);\n  return {\n    isMounted,\n    status\n  };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    initial: unstable_initial = {\n      opacity: 0\n    },\n    open: unstable_open,\n    close: unstable_close,\n    common: unstable_common,\n    duration = 250\n  } = props;\n  const placement = context.placement;\n  const side = placement.split('-')[0];\n  const fnArgs = React.useMemo(() => ({\n    side,\n    placement\n  }), [side, placement]);\n  const isNumberDuration = typeof duration === 'number';\n  const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [styles, setStyles] = React.useState(() => ({\n    ...execWithArgsOrReturn(unstable_common, fnArgs),\n    ...execWithArgsOrReturn(unstable_initial, fnArgs)\n  }));\n  const {\n    isMounted,\n    status\n  } = useTransitionStatus(context, {\n    duration\n  });\n  const initialRef = useLatestRef(unstable_initial);\n  const openRef = useLatestRef(unstable_open);\n  const closeRef = useLatestRef(unstable_close);\n  const commonRef = useLatestRef(unstable_common);\n  index(() => {\n    const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n    const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n    const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n    const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n      acc[key] = '';\n      return acc;\n    }, {});\n    if (status === 'initial') {\n      setStyles(styles => ({\n        transitionProperty: styles.transitionProperty,\n        ...commonStyles,\n        ...initialStyles\n      }));\n    }\n    if (status === 'open') {\n      setStyles({\n        transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: openDuration + \"ms\",\n        ...commonStyles,\n        ...openStyles\n      });\n    }\n    if (status === 'close') {\n      const styles = closeStyles || initialStyles;\n      setStyles({\n        transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: closeDuration + \"ms\",\n        ...commonStyles,\n        ...styles\n      });\n    }\n  }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n  return {\n    isMounted,\n    styles\n  };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n  var _ref;\n  const {\n    open,\n    dataRef\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onMatch: unstable_onMatch,\n    onTypingChange: unstable_onTypingChange,\n    enabled = true,\n    findMatch = null,\n    resetMs = 750,\n    ignoreKeys = [],\n    selectedIndex = null\n  } = props;\n  const timeoutIdRef = React.useRef();\n  const stringRef = React.useRef('');\n  const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n  const matchIndexRef = React.useRef(null);\n  const onMatch = useEffectEvent(unstable_onMatch);\n  const onTypingChange = useEffectEvent(unstable_onTypingChange);\n  const findMatchRef = useLatestRef(findMatch);\n  const ignoreKeysRef = useLatestRef(ignoreKeys);\n  index(() => {\n    if (open) {\n      clearTimeout(timeoutIdRef.current);\n      matchIndexRef.current = null;\n      stringRef.current = '';\n    }\n  }, [open]);\n  index(() => {\n    // Sync arrow key navigation but not typeahead navigation.\n    if (open && stringRef.current === '') {\n      var _ref2;\n      prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n    }\n  }, [open, selectedIndex, activeIndex]);\n  const setTypingChange = useEffectEvent(value => {\n    if (value) {\n      if (!dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    } else {\n      if (dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    }\n  });\n  const onKeyDown = useEffectEvent(event => {\n    function getMatchingIndex(list, orderedList, string) {\n      const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n      return str ? list.indexOf(str) : -1;\n    }\n    const listContent = listRef.current;\n    if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n      if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n        setTypingChange(false);\n      } else if (event.key === ' ') {\n        stopEvent(event);\n      }\n    }\n    if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n    // Character key.\n    event.key.length !== 1 ||\n    // Modifier key.\n    event.ctrlKey || event.metaKey || event.altKey) {\n      return;\n    }\n    if (open && event.key !== ' ') {\n      stopEvent(event);\n      setTypingChange(true);\n    }\n\n    // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n    // allow it in this case, too.\n    const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n      var _text$, _text$2;\n      return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n    });\n\n    // Allows the user to cycle through items that start with the same letter\n    // in rapid succession.\n    if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n    }\n    stringRef.current += event.key;\n    clearTimeout(timeoutIdRef.current);\n    timeoutIdRef.current = setTimeout(() => {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n      setTypingChange(false);\n    }, resetMs);\n    const prevIndex = prevIndexRef.current;\n    const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n    if (index !== -1) {\n      onMatch(index);\n      matchIndexRef.current = index;\n    } else if (event.key !== ' ') {\n      stringRef.current = '';\n      setTypingChange(false);\n    }\n  });\n  const reference = React.useMemo(() => ({\n    onKeyDown\n  }), [onKeyDown]);\n  const floating = React.useMemo(() => {\n    return {\n      onKeyDown,\n      onKeyUp(event) {\n        if (event.key === ' ') {\n          setTypingChange(false);\n        }\n      }\n    };\n  }, [onKeyDown, setTypingChange]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n  return {\n    ...state,\n    rects: {\n      ...state.rects,\n      floating: {\n        ...state.rects.floating,\n        height\n      }\n    }\n  };\n}\n/**\n * Positions the floating element such that an inner element inside of it is\n * anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n */\nconst inner = props => ({\n  name: 'inner',\n  options: props,\n  async fn(state) {\n    const {\n      listRef,\n      overflowRef,\n      onFallbackChange,\n      offset: innerOffset = 0,\n      index = 0,\n      minItemsVisible = 4,\n      referenceOverflowThreshold = 0,\n      scrollRef,\n      ...detectOverflowOptions\n    } = evaluate(props, state);\n    const {\n      rects,\n      elements: {\n        floating\n      }\n    } = state;\n    const item = listRef.current[index];\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!state.placement.startsWith('bottom')) {\n        warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n      }\n    }\n    if (!item) {\n      return {};\n    }\n    const nextArgs = {\n      ...state,\n      ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n    };\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n    const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, el.scrollHeight), detectOverflowOptions);\n    const refOverflow = await detectOverflow(nextArgs, {\n      ...detectOverflowOptions,\n      elementContext: 'reference'\n    });\n    const diffY = Math.max(0, overflow.top);\n    const nextY = nextArgs.y + diffY;\n    const maxHeight = Math.max(0, el.scrollHeight - diffY - Math.max(0, overflow.bottom));\n    el.style.maxHeight = maxHeight + \"px\";\n    el.scrollTop = diffY;\n\n    // There is not enough space, fallback to standard anchored positioning\n    if (onFallbackChange) {\n      if (el.offsetHeight < item.offsetHeight * Math.min(minItemsVisible, listRef.current.length - 1) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold) {\n        ReactDOM.flushSync(() => onFallbackChange(true));\n      } else {\n        ReactDOM.flushSync(() => onFallbackChange(false));\n      }\n    }\n    if (overflowRef) {\n      overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n        ...nextArgs,\n        y: nextY\n      }, el.offsetHeight), detectOverflowOptions);\n    }\n    return {\n      y: nextY\n    };\n  }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n */\nfunction useInnerOffset(context, props) {\n  const {\n    open,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    overflowRef,\n    scrollRef,\n    onChange: unstable_onChange\n  } = props;\n  const onChange = useEffectEvent(unstable_onChange);\n  const controlledScrollingRef = React.useRef(false);\n  const prevScrollTopRef = React.useRef(null);\n  const initialOverflowRef = React.useRef(null);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onWheel(e) {\n      if (e.ctrlKey || !el || overflowRef.current == null) {\n        return;\n      }\n      const dY = e.deltaY;\n      const isAtTop = overflowRef.current.top >= -0.5;\n      const isAtBottom = overflowRef.current.bottom >= -0.5;\n      const remainingScroll = el.scrollHeight - el.clientHeight;\n      const sign = dY < 0 ? -1 : 1;\n      const method = dY < 0 ? 'max' : 'min';\n      if (el.scrollHeight <= el.clientHeight) {\n        return;\n      }\n      if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n        e.preventDefault();\n        ReactDOM.flushSync(() => {\n          onChange(d => d + Math[method](dY, remainingScroll * sign));\n        });\n      } else if (/firefox/i.test(getUserAgent())) {\n        // Needed to propagate scrolling during momentum scrolling phase once\n        // it gets limited by the boundary. UX improvement, not critical.\n        el.scrollTop += dY;\n      }\n    }\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n    if (open && el) {\n      el.addEventListener('wheel', onWheel);\n\n      // Wait for the position to be ready.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n        if (overflowRef.current != null) {\n          initialOverflowRef.current = {\n            ...overflowRef.current\n          };\n        }\n      });\n      return () => {\n        prevScrollTopRef.current = null;\n        initialOverflowRef.current = null;\n        el.removeEventListener('wheel', onWheel);\n      };\n    }\n  }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n  const floating = React.useMemo(() => ({\n    onKeyDown() {\n      controlledScrollingRef.current = true;\n    },\n    onWheel() {\n      controlledScrollingRef.current = false;\n    },\n    onPointerMove() {\n      controlledScrollingRef.current = false;\n    },\n    onScroll() {\n      const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n      if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n        return;\n      }\n      if (prevScrollTopRef.current !== null) {\n        const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n        if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n          ReactDOM.flushSync(() => onChange(d => d + scrollDiff));\n        }\n      }\n\n      // [Firefox] Wait for the height change to have been applied.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n      });\n    }\n  }), [elements.floating, onChange, overflowRef, scrollRef]);\n  return React.useMemo(() => enabled ? {\n    floating\n  } : {}, [enabled, floating]);\n}\n\nfunction isPointInPolygon(point, polygon) {\n  const [x, y] = point;\n  let isInside = false;\n  const length = polygon.length;\n  for (let i = 0, j = length - 1; i < length; j = i++) {\n    const [xi, yi] = polygon[i] || [0, 0];\n    const [xj, yj] = polygon[j] || [0, 0];\n    const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n    if (intersect) {\n      isInside = !isInside;\n    }\n  }\n  return isInside;\n}\nfunction isInside(point, rect) {\n  return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    buffer = 0.5,\n    blockPointerEvents = false,\n    requireIntent = true\n  } = options;\n  let timeoutId;\n  let hasLanded = false;\n  let lastX = null;\n  let lastY = null;\n  let lastCursorTime = performance.now();\n  function getCursorSpeed(x, y) {\n    const currentTime = performance.now();\n    const elapsedTime = currentTime - lastCursorTime;\n    if (lastX === null || lastY === null || elapsedTime === 0) {\n      lastX = x;\n      lastY = y;\n      lastCursorTime = currentTime;\n      return null;\n    }\n    const deltaX = x - lastX;\n    const deltaY = y - lastY;\n    const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n    const speed = distance / elapsedTime; // px / ms\n\n    lastX = x;\n    lastY = y;\n    lastCursorTime = currentTime;\n    return speed;\n  }\n  const fn = _ref => {\n    let {\n      x,\n      y,\n      placement,\n      elements,\n      onClose,\n      nodeId,\n      tree\n    } = _ref;\n    return function onMouseMove(event) {\n      function close() {\n        clearTimeout(timeoutId);\n        onClose();\n      }\n      clearTimeout(timeoutId);\n      if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n        return;\n      }\n      const {\n        clientX,\n        clientY\n      } = event;\n      const clientPoint = [clientX, clientY];\n      const target = getTarget(event);\n      const isLeave = event.type === 'mouseleave';\n      const isOverFloatingEl = contains(elements.floating, target);\n      const isOverReferenceEl = contains(elements.domReference, target);\n      const refRect = elements.domReference.getBoundingClientRect();\n      const rect = elements.floating.getBoundingClientRect();\n      const side = placement.split('-')[0];\n      const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n      const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n      const isOverReferenceRect = isInside(clientPoint, refRect);\n      const isFloatingWider = rect.width > refRect.width;\n      const isFloatingTaller = rect.height > refRect.height;\n      const left = (isFloatingWider ? refRect : rect).left;\n      const right = (isFloatingWider ? refRect : rect).right;\n      const top = (isFloatingTaller ? refRect : rect).top;\n      const bottom = (isFloatingTaller ? refRect : rect).bottom;\n      if (isOverFloatingEl) {\n        hasLanded = true;\n        if (!isLeave) {\n          return;\n        }\n      }\n      if (isOverReferenceEl) {\n        hasLanded = false;\n      }\n      if (isOverReferenceEl && !isLeave) {\n        hasLanded = true;\n        return;\n      }\n\n      // Prevent overlapping floating element from being stuck in an open-close\n      // loop: https://github.com/floating-ui/floating-ui/issues/1910\n      if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n        return;\n      }\n\n      // If any nested child is open, abort.\n      if (tree && getChildren(tree.nodesRef.current, nodeId).some(_ref2 => {\n        let {\n          context\n        } = _ref2;\n        return context == null ? void 0 : context.open;\n      })) {\n        return;\n      }\n\n      // If the pointer is leaving from the opposite side, the \"buffer\" logic\n      // creates a point where the floating element remains open, but should be\n      // ignored.\n      // A constant of 1 handles floating point rounding errors.\n      if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n        return close();\n      }\n\n      // Ignore when the cursor is within the rectangular trough between the\n      // two elements. Since the triangle is created from the cursor point,\n      // which can start beyond the ref element's edge, traversing back and\n      // forth from the ref to the floating element can cause it to close. This\n      // ensures it always remains open in that case.\n      let rectPoly = [];\n      switch (side) {\n        case 'top':\n          rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n          break;\n        case 'bottom':\n          rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n          break;\n        case 'left':\n          rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n          break;\n        case 'right':\n          rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n          break;\n      }\n      function getPolygon(_ref3) {\n        let [x, y] = _ref3;\n        switch (side) {\n          case 'top':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'bottom':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'left':\n            {\n              const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n              return [...commonPoints, cursorPointOne, cursorPointTwo];\n            }\n          case 'right':\n            {\n              const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n        }\n      }\n      if (isPointInPolygon([clientX, clientY], rectPoly)) {\n        return;\n      }\n      if (hasLanded && !isOverReferenceRect) {\n        return close();\n      }\n      if (!isLeave && requireIntent) {\n        const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n        const cursorSpeedThreshold = 0.1;\n        if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n          return close();\n        }\n      }\n      if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n        close();\n      } else if (!hasLanded && requireIntent) {\n        timeoutId = window.setTimeout(close, 40);\n      }\n    };\n  };\n  fn.__options = {\n    blockPointerEvents\n  };\n  return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\n\nfunction activeElement(doc) {\n  let activeElement = doc.activeElement;\n  while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n    var _activeElement;\n    activeElement = activeElement.shadowRoot.activeElement;\n  }\n  return activeElement;\n}\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n  const uaData = navigator.userAgentData;\n  if (uaData != null && uaData.platform) {\n    return uaData.platform;\n  }\n  return navigator.platform;\n}\nfunction getUserAgent() {\n  const uaData = navigator.userAgentData;\n  if (uaData && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(_ref => {\n      let {\n        brand,\n        version\n      } = _ref;\n      return brand + \"/\" + version;\n    }).join(' ');\n  }\n  return navigator.userAgent;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n  // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n  // Try to find a workaround for this. `react-aria` source still has the check.\n  if (event.mozInputSource === 0 && event.isTrusted) {\n    return true;\n  }\n  if (isAndroid() && event.pointerType) {\n    return event.type === 'click' && event.buttons === 1;\n  }\n  return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n  if (isJSDOM()) return false;\n  return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n  // iOS VoiceOver returns 0.333• for width/height.\n  event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isSafari() {\n  // Chrome DevTools does not complain about navigator.vendor\n  return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n  const re = /android/i;\n  return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n  return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n  return getUserAgent().includes('jsdom/');\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n  // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n  // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n  const values = ['mouse', 'pen'];\n  if (!strict) {\n    values.push('', undefined);\n  }\n  return values.includes(pointerType);\n}\nfunction isReactEvent(event) {\n  return 'nativeEvent' in event;\n}\nfunction isRootElement(element) {\n  return element.matches('html,body');\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isEventTargetWithin(event, node) {\n  if (node == null) {\n    return false;\n  }\n  if ('composedPath' in event) {\n    return event.composedPath().includes(node);\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n  const e = event;\n  return e.target != null && node.contains(e.target);\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nfunction isTypeableElement(element) {\n  return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction stopEvent(event) {\n  event.preventDefault();\n  event.stopPropagation();\n}\nfunction isTypeableCombobox(element) {\n  if (!element) return false;\n  return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\n\nexport { TYPEABLE_SELECTOR, activeElement, contains, getDocument, getPlatform, getTarget, getUserAgent, isAndroid, isEventTargetWithin, isJSDOM, isMac, isMouseLikePointerType, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, stopEvent };\n"],"names":["formatPerf","d","treemap","additional","perf","formatValue","toFixed","CanvasHover","props","_hoveredSparkline$toF","_hoveredSparkline","_hoveredNode$data$dat","_hoveredNode$data","prevDataHash","React","dataHash","hoveredNode","visibleNodes","sparklineData","setState","refs","floatingStyles","context","isPositioned","update","useFloating","open","strategy","placement","middleware","offset","mainAxis","flip","crossAxis","shift","clientPoint","useClientPoint","getFloatingProps","useInteractions","handleMapStoreChange","storeHoveredNode","MapStore","getHoveredNode","mapNodeId","getSparklines","getVisibleTooltipNodes","name","tickersToLoad","filter","node","current","map","includes","push","MapActions","loadSparklineData","type","prevState","addChangeListener","removeChangeListener","loadSparklinesCancel","hoveredSparkline","hasSparkline","length","price","isSmall","title","MapTypeId","World","parent","backgroundColor","colorScale","undefined","_jsxs","ref","setFloating","id","className","classnames","invisible","style","children","_jsx","_Fragment","data","nameOverride","Sparkline","width","height","description","colSpan","c","_sparklineData$c$name","_c$data$data$nameOver","_c$data","color","Canvas","constructor","event","super","_defineProperty","zoom","initialized","this","_cache","bind","componentDidMount","_onChange","mapActionCreators","_setOnPublish","_getPublishCanvas","_initialize","componentDidUpdate","state","renderFromCache","_canvasContext","renderHover","_hoverContext","_setCanvasSize","worldBackground","_updateCanvasCaches","_loadTreemapGeoBackground","then","componentWillUnmount","_this$_hoverCanvas$cu","_hoverCanvas","removeEventListener","_onWheel","render","alt","legend","hover","_canvas","classNames","onMouseDown","_onMouseDown","onMouseMove","_onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","scale","x","y","translate","nearestSize","getNearestSize","_createCache","save","drawImage","canvas","restore","mouseDown","e","offsetX","offsetY","getOffset","nodeAtPosition","getNodeAtPosition","industryAtPosition","getIndustryAtPosition","MapActionCreators","setHoveredNode","_this$props$onNodeCli","_this$props","sectorAtPosition","getSectorAtPosition","onNodeClick","call","industry","sector","preventDefault","deltaY","_onPanStart","lastPanX","pointers","clientX","lastPanY","clientY","_onPanMove","movementX","movementY","changeTranslate","_onPinch","offsetX1","target","offsetLeft","offsetParent","offsetY1","offsetTop","direction","_setCanvasContexts","canvasContext","getContext","isFirefoxDesktop","willReadFrequently","hoverContext","retinafy","zoomOnWheel","zoomLevels","getZoomLevels","_createCacheWithPriority","hoverCanvas","hammertime","Hammer","get","set","enable","threshold","on","addEventListener","passive","_getTreemapGeoBackground","getIsSmall","FinvizSettings","hasDarkTheme","image","loadImage","default","oldScale","oldTranslate","cacheCanvas","document","createElement","cacheContext","translateAbs","renderCanvas","resetSparklineData","currentZoom","callback","animationFrameId","window","cancelAnimationFrame","remainingLevels","level","requestAnimationFrame","_queueUpdateCache","scales","currentScale","arguments","_hover$border","settings","clearRect","apply","showIndustryHeader","LayoutGenerator","isNodeHeaderVisible","depth","NodeDepth","Industry","industryOffset","padding","top","smallIndustryPadding","Sector","header","strokeStyle","border","lineWidth","strokeRect","dx","dy","beginPath","i","moveTo","lineTo","_hover$background","stroke","renderIndustryHeader","config","fill","background","renderNodeText","fillStyle","fillRect","naturalWidth","naturalHeight","index","sectors","industries","nodes","renderStockNode","isLargeNode","isGeoMap","renderBackground","Number","isFinite","_treemap$settings$sec","renderSectorBorders","_treemap$settings$sec2","boxover","tooltip","scaleMin","scaleMax","getScaleMinMax","steps","diff","step","Math","round","stepWidth","indexOf","format","scaleStepFormat","Portfolio","ETFHoldings","ManagersAndFunds","isWidget","minWidth","textShadow","toString","MapContext","setTreemap","setGenerator","useMapContext","MapContextProvider","generator","Provider","value","Map","_ref","isLoadingData","isFetchingPerf","subtype","truncateNodeName","prevTreemap","containerRef","hasRendered","setHasRendered","mapUtils","size","mapSettings","MAP_EXPORT","Treemap","getLayout","scaleId","label","countIndustryPerf","countSectorPerf","updateTimeoutRef","setTimeout","layout","updateLayout","clearTimeout","containerElement","resize","throttle","Delayed","delayComponent","Spinner","QueryClientContext","fallback","Loading","BrowserRouter","MapSelectTheme","hasRedesign","hasRedesignEnabled","MapSelect","_props$rounding","_props$size","_props$listProps","ariaLabel","theme","items","onChange","selectTheme","dark","button","rounding","rightContent","Icon","popover","light","getMapSelectTheme","itemOptions","item","isSelectItemGroup","hasBorder","Select","placeholder","defaultValue","listProps","filterItems","input","stock","toUpperCase","sort","a","b","slice","useSearch","setValue","results","setResults","onInputChange","onItemClick","cx","cy","diffX","diffY","zoomAndTranslate","getLastZoomLevel","onResultMouseLeave","SearchInput","Input","leftContent","SearchResult","result","onClick","Button","contentClass","Expand","onExpand","_window$gtag","_window","body","classList","contains","EXPANDED_MAP_BODY_CLASSS","remove","gtag","event_category","add","getElementById","scrollTo","isMobile","isIpad","Share","uploadImage","useMutation","api","imageData","setImageData","onShareClick","async","mapStore","getPublishCanvas","drawShareMap","mapType","getFormattedDateString","mutate","ShareDialog","disabled","base64ImageData","useZoomButtons","zoomOut","ev","zoomIn","Zoom","handlers","SVG","Topbar","navContent","mapControls","useMapData","mapBaseData","initialPerf","fetchPerfData","queryClient","useQueryClient","dataVersion","prevType","perfData","setQueryData","baseDataQuery","useQuery","queryKey","queryFn","getMapBaseData","initialData","cacheTime","Infinity","staleTime","perfDataQuery","getQueryData","FALLBACK_PERF_RESPONSE","version","keepPreviousData","refetchInterval","onSuccess","location","reload","restoredData","useMapType","_MAP_TYPES$find","_subtypes$find","query","URLSearchParams","useLocation","search","typeFromQuery","subtypeFromQuery","MAP_TYPES","find","t","subtypes","flatMap","MapSubtypeId","DayPerf","mapPerf","apiRequest","st","mapPerfScreener","uploadMap","method","headers","ContentType","FormUrlEncoded","file","replace","_targetScale","updateVisibleSparklines","debouncedLoadSparklines","_lastSparklinesRequest","debounce","tickers","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","cancel","join","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","aborted","LOAD_SPARKLINES_FAILED","trailing","SET_HOVERED_NODE","_lastSparklinesReques3","_lastSparklinesReques4","RESET_SPARKLINE_DATA","tx","CHANGE_TRANSLATE","zoomLevel","getNextZoomLevel","animate","RENDER_TREEMAP","getPreviousZoomLevel","updateData","updateDimensions","updatePerfData","updatePerf","UPDATE_DATA","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","Dispatcher","action","payload","source","PayloadSources","SERVER_ACTION","dispatch","VIEW_ACTION","keyMirror","INIT_STARTED","INIT_FAILED","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_sparklinesData","_isWidget","getDataVersion","dispatchToken","register","fontSizesWidths","f","g","h","j","k","l","m","n","o","p","q","r","s","u","v","w","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","fontSizeLineHeights","dimensions","d3","zoomElement","translateExtent","behavior","extent","newZoom","mapCenter","zoomSelection","scaleTo","getTransform","args","Array","isArray","translateBy","translateTo","scaleExtent","len","fontFamily","getTextFontFamily","_props$mapNodeId","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","ScaleId","PortfolioPct","PortfolioUsd","minValuePerf","abs","_node$data$perfWeek","_node$data","perfWeek","maxValuePerf","_node$data$perfWeek2","_node$data2","perfMax","max","minValueNode","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","getParentSector","hash","nodeName","parentSector","updatedNode","_node$data3","_resetIndustryPerf","weightedPriceSum","marketCapSum","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","left","topPadding","isFirstNodeInIndustry","getNodeText","_node$additional","_this$settings$fontSi","_this$settings$fontSi2","fontSizes","scaleFontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","getLongestText","fontSizePadding","nodeNameLineHeight","stepFormat","perfText","getSymbolType","PortfolioSymbolType","Cash","fontPairs","fontSizePairs","allowedSize","perfFontSize","perfLineHeight","textHeight","topOffset","fontSize","text","maxWidth","widths","_widths$text$i","substring","actualZoomLevel","_stepFormat$replace","_stepFormat","floatValue","parseFloat","absValue","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","font","fillText","getSpacingWithDefaults","spacing","_spacing$top","_spacing$right","_spacing$bottom","_spacing$left","right","bottom","_ref2","_config$height","_config$border","parrentPadding","margin","_ref3","fontWeight","dialogState","useDialogState","show","Dialog","DialogHeader","DialogBody","ShareDialogBody","isError","isLoading","DialogFooter","as","DialogDismiss","ErrorView","showRefresh","message","src","imgUrl","SocialShare","shareUrl","imageToDownloadURL","imageToDownloadBase64Data","Component","shouldComponentUpdate","nextProps","line","curve","transform","PropTypes","isRequired","canvasEl","ratio","getScaleRatio","logo","logoBase64","textWidth","measureText","divider","toDataURL","redGreenGradient","greenRedGradient","reverse","redGradient","greenGradient","redGreenGradientBubbles","IntradayReduced","_5","_10","_15","_20","_25","_relvol","_pe","_fpe","_peg","_ps","_pb","_div","_eps5y","_short","_rec","_earndate","_portfolioPct","_portfolioUsd","_percentHundred","bubbleGradients","Promise","resolve","reject","Image","onload","onerror","_window$devicePixelRa","devicePixelRatio","AdsProvider","getAdsProvider","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag2","_window2","pathname","freestarPageView","_window$freestar","freestar","queue","trackPageview","ButtonSwitch","controlledValue","labelClassNames","groupRounding","activeTheme","restProps","internalValue","setInternalValue","handleChange","newValue","ButtonGroup","hasDivider","option","ColorVariant","CheckboxSize","CheckboxComponent","_props$checked","checked","defaultChecked","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","darkGray","Checkbox","forwardRef","clamp","num","isTouch","getRelativePosition","rect","getBoundingClientRect","pointer","touches","pageX","pageXOffset","pageY","pageYOffset","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","isValid","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","hexStringToRGBA","hexString","hexColor","removeHashSymbol","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","String","parseInt","strColor","isValidColor","isRgb","startsWith","Option","convertColorToHEX","getIsRgb","rgbKeys","some","getHSVAFromColor","Alpha","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","ColorPalette","lowerCaseColor","toLowerCase","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","icon","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","Ariakit","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","trim","alert","_hex","orignalColor","focus","preventScroll","InputColorPicker","inputDataTestId","popoverState","usePopoverState","isMobileDevice","PopoverTrigger","Popover","hideOnInteractOutside","backdrop","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonRounding","small","ButtonColorPicker","buttonPickerDataTestId","isOpen","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","appearance","active","_ref4","childComponent","_ref5","CopyToClipboard","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","Textarea","readOnly","select","DropdownRounding","DropdownTheme","StatelessDropdown","trigger","modal","gutter","unmountOnHide","showOnHover","autoFocusOnShow","autoFocusOnHide","onFullyOpen","onFullyClosed","store","zIndex","updatePosition","usePopoverPlacement","isFullyOpen","setIsFullyOpen","isMounted","wasMounted","usePrevious","menuGutter","focusable","portal","hideOnHoverOutside","preventBodyScroll","focusWithoutScroll","blurWithoutScroll","none","onTransitionEnd","Dropdown","orientation","focusLoop","virtualFocus","DropdownItemComponent","asComponent","OptionButton","DropdownItem","useDropdownState","xmlns","ContextMenuInner","onClose","onContextMenu","MenuGroup","options","_item$onClick","Object","assign","menu_option","ContextMenu","ChartGridCell","gridArea","GridLayout","columns","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","RangeSize","RangeSlider","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","Boolean","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","horizontal","alternative","Toolbar","hasFocusRings","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","originalWidth","offsetWidth","showTimeout","hideTimeout","querySelector","el","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","menubar","blurOnHoverEnd","titleActive","delay","isMobileBrowser","ToolbarGroup","defaultItem","groupItems","groupTitle","useNativeSelect","rowId","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","menu","menuButton","setMenuButton","mounted","anchorElement","parentMenu","menuContentElement","hideMenu","showMenu","handleMenuOpen","setDisclosureElement","setAnchorElement","NativeSelect","findIndex","onFocusVisible","onPointerDown","portalElement","ToolbarItem","isItemActive","ToolbarDivider","StepContent","Box","Heading","Paragraph","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","tour","arr","_step$backButton","_step$nextButton","complete","classes","getButtonTheme","ButtonTheme","ButtonPadding","back","backButton","next","nextButton","getTourKey","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","reduce","acc","initialTour","completeTour","key","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","signal","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","from","forEach","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","element","floatingUIOptions","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","event_label","TabSpacing","InternalTab","ariaSelected","content","Tab","TabList","TabPanel","Tabs","BadgeSize","BadgePadding","Badge","badgePadding","badgeSize","TagSize","TagPadding","TagFont","TagVariant","TagRounding","Tag","variant","tagPadding","tagSize","tagFont","tagRounding","tagVariant","throwOnTimeout","timeoutComponent","showContact","href","link","toContact","LoadingScreen","NotificationPosition","NotificationContext","useNotification","NotificationWrapper","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","getVisualViewport","visualViewport","positionClass","_notification$options","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","role","hideOnEscape","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","NotificationTheme","Notification","closeText","actions","timeoutInMs","timeoutId","success","failure","imgFromUrlToBase64","url","fetch","URL","createObjectURL","response","blob","DownloadImageButton","downloadUrl","dataUrl","fileName","_downloadUrl$split$po","split","pop","imageUri","setImageUri","val","catch","download","FacebookShareButton","FacebookIcon","TwitterShareButton","via","TwitterIcon","TooltipInputComponent","tooltipSettings","isPointerEventsEnabled","prevMessage","isFocused","setIsFocused","handleFocus","handleBlur","TooltipTrigger","hideOnBlur","onFocus","onBlur","Tooltip","TooltipInput","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","module","exports","shim","propName","componentName","propFullName","secret","err","Error","getShim","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","elementType","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","deepEqual","keys","hasOwnProperty","$$typeof","getDPR","ownerDocument","defaultView","roundByDPR","dpr","useLatestRef","platform","elements","reference","externalReference","floating","externalFloating","whileElementsMounted","setData","middlewareData","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","floatingRef","referenceEl","floatingEl","dataRef","hasWhileElementsMounted","whileElementsMountedRef","platformRef","fullData","isMountedRef","initialStyles","deps","SafeReact","useSafeInsertionEffect","useInsertionEffect","fn","useEffectEvent","_len","_key","ARROW_UP","ARROW_DOWN","ARROW_LEFT","ARROW_RIGHT","horizontalKeys","verticalKeys","serverHandoffComplete","count","genId","random","useId","setId","createPubSub","_map$get","handler","listener","off","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","_React$useContext","useFloatingTree","isMouseBasedEvent","domReference","axis","initialRef","cleanupListenerRef","pointerType","setPointerType","reactive","setReactive","openEvent","setPositionReference","domElement","isAutoUpdateEvent","contextElement","_data$dataRef$current","domRect","isXAxis","isYAxis","canTrackCursorOnAutoUpdate","createVirtualElement","handleReferenceEnterOrMove","openCheck","strict","values","addListener","win","handleMouseMove","composedPath","child","rootNode","getRootNode","parentNode","host","cleanup","setPointerTypeRef","onPointerEnter","onMouseEnter","nodeId","internalRootContext","onOpenChange","onOpenChangeProp","elementsProp","floatingId","events","nested","positionReference","reason","useFloatingRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReferenceRef","tree","computedPositionReference","floatingContext","nodesRef","ACTIVE_KEY","SELECTED_KEY","mergeProps","userProps","propsList","elementKey","isItem","domUserProps","_","__","validProps","propsOrGetProps","concat","entries","has","referenceDeps","floatingDeps","itemDeps","getReferenceProps","getItemProps"],"sourceRoot":""}