{"version":3,"file":"5608.0ab68674.js","mappings":"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AG,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,KACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,MACHknB,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,IACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,MACHknB,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,MACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,MACHknB,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,KACLltB,EAAG,MACHC,EAAG,IACHsB,EAAG,KACHrF,EAAG,IACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,KACHqf,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHrG,EAAG,KACH3E,EAAG,KACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,KACHlnB,EAAG,IACHC,EAAG,MACHknB,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,MACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,KACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,MACHknB,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,IACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,MACHknB,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,MACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,OACHlnB,EAAG,KACHC,EAAG,MACHknB,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,KACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,OACHlnB,EAAG,KACHC,EAAG,MACHknB,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,KACLltB,EAAG,MACHC,EAAG,MACHsB,EAAG,MACHrF,EAAG,MACHM,EAAG,MACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,OACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,OACHC,EAAG,MACHC,EAAG,OACHlnB,EAAG,KACHC,EAAG,MACHknB,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,IACLltB,EAAG,MACHC,EAAG,KACHsB,EAAG,KACHrF,EAAG,KACHM,EAAG,MACHiuB,EAAG,KACHC,EAAG,MACHC,EAAG,MACHpf,EAAG,KACHqf,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHrG,EAAG,KACH3E,EAAG,KACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,MACHknB,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,IACLltB,EAAG,OACHC,EAAG,MACHsB,EAAG,OACHrF,EAAG,MACHM,EAAG,OACHiuB,EAAG,MACHC,EAAG,MACHC,EAAG,OACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHrG,EAAG,OACH3E,EAAG,MACHiL,EAAG,OACHC,EAAG,OACHC,EAAG,OACHlnB,EAAG,MACHC,EAAG,OACHknB,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,KACLltB,EAAG,OACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,OACHiuB,EAAG,OACHC,EAAG,OACHC,EAAG,OACHpf,EAAG,KACHqf,EAAG,KACHC,EAAG,OACHC,EAAG,KACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,KACHC,EAAG,OACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,OACHC,EAAG,OACHC,EAAG,MACHlnB,EAAG,KACHC,EAAG,OACHknB,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,IACLltB,EAAG,OACHC,EAAG,MACHsB,EAAG,OACHrF,EAAG,MACHM,EAAG,OACHiuB,EAAG,OACHC,EAAG,MACHC,EAAG,OACHpf,EAAG,MACHqf,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHrG,EAAG,OACH3E,EAAG,OACHiL,EAAG,OACHC,EAAG,OACHC,EAAG,OACHlnB,EAAG,MACHC,EAAG,OACHknB,E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UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,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,CAACrZ,EAAAA,GAAQH,SAAUqpB,EACnBtkB,GAAIskB,EACJrkB,IAAKqkB,EACLpkB,IAAKokB,EACLnkB,IAAKmkB,EACLlkB,IAAKkkB,EACLjkB,QA77HmB,CACnByU,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,WAm9FXzU,IAAKikB,EACLhkB,KAAMgkB,EACN/jB,KAAM+jB,EACN9jB,IAAK8jB,EACL7jB,IAAK6jB,EACL5jB,KAAM+jB,EACN9jB,OAAQ0jB,EACRzjB,OAAQ4jB,EACR3jB,KAAMwjB,EACNvjB,UA19FuB,CACvB+T,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,WAg/DX/T,cAAesjB,EACfrjB,cAAeqjB,GAGJM,EAAuD,CAClE,CAACxpB,EAAAA,GAAQH,SAAU0pB,EACnB3kB,GAAI2kB,EACJ1kB,IAAK0kB,EACLzkB,IAAKykB,EACLxkB,IAAKwkB,EACLvkB,IAAKukB,EACLtkB,QA3gC0B,CAC1ByU,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,QAiCXzU,IAAKqkB,EACLpkB,KAAMokB,EACNnkB,KAAMmkB,EACNlkB,IAAKkkB,EACLjkB,IAAKikB,E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","sources":["webpack://@finviz/website/../config/colors.js","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/constants/constants.ts","webpack://@finviz/website/./js/app/maps/constants/generator.ts","webpack://@finviz/website/./js/app/maps/constants/settings.ts","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/layout-generator.tsx","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/maps/types.ts","webpack://@finviz/website/./js/app/maps/utils.ts","webpack://@finviz/website/./js/app/screener/utils.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/isStockFastRefreshAvailable.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/RedGreenText.tsx","webpack://@finviz/website/./js/main/components/Table/Table.tsx","webpack://@finviz/website/./js/main/components/Table/types.ts","webpack://@finviz/website/./js/main/components/Table/TableCell.tsx","webpack://@finviz/website/./js/main/components/Table/TableHeader.tsx","webpack://@finviz/website/./js/main/components/Table/TableRow.tsx","webpack://@finviz/website/./js/main/components/Table/hooks.ts","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/icon/svg.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/hooks/use-sort-data.ts","webpack://@finviz/website/./js/main/hooks/useVisualViewport.ts","webpack://@finviz/website/./js/main/modules/portfolio/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/portfolio/constants/general.ts","webpack://@finviz/website/./js/main/modules/portfolio/services/api.ts","webpack://@finviz/website/./js/main/modules/portfolio/types.tsx","webpack://@finviz/website/./js/main/modules/portfolio/utils.ts"],"sourcesContent":["// Keep in sync with charts repository colors.js file in: app/constants/colors.js\r\n\r\nmodule.exports = {\r\n white: '#fff',\r\n black: '#000',\r\n inherit: 'inherit',\r\n transparent: 'transparent',\r\n current: 'currentColor',\r\n finviz: {\r\n 'blue-gray': '#262931',\r\n blue: '#4fa4f4',\r\n },\r\n gray: {\r\n 50: '#f3f3f5',\r\n 100: '#dedfe5',\r\n 200: '#c3c6d0',\r\n 300: '#a3a8b9',\r\n 400: '#868ea5',\r\n 500: '#676f85',\r\n 600: '#4c5263',\r\n 700: '#353945',\r\n 750: '#2c303b',\r\n 800: '#22262f',\r\n 900: '#14161d',\r\n },\r\n red: {\r\n 50: '#fef0f0',\r\n 100: '#fcd6d6',\r\n 200: '#fbb4b4',\r\n 300: '#fd8487',\r\n 400: '#fb5057',\r\n 500: '#d91e2b',\r\n 600: '#9f1f2a',\r\n 700: '#691f24',\r\n 800: '#45171a',\r\n 900: '#280e0f',\r\n },\r\n orange: {\r\n 50: '#fef2eb',\r\n 100: '#fdd9c5',\r\n 200: '#fab889',\r\n 300: '#ef9323',\r\n 400: '#ca7b14',\r\n 500: '#a0600e',\r\n 600: '#79460a',\r\n 700: '#583006',\r\n 800: '#3d1e03',\r\n 900: '#261101',\r\n },\r\n amber: {\r\n 50: '#fef2e7',\r\n 100: '#fedab5',\r\n 200: '#fbba56',\r\n 300: '#de9c1a',\r\n 400: '#bb830f',\r\n 500: '#956600',\r\n 600: '#704b00',\r\n 700: '#4f3400',\r\n 800: '#372200',\r\n 900: '#211300',\r\n },\r\n yellow: {\r\n 50: '#fdf2df',\r\n 100: '#fcdc86',\r\n 200: '#f3c736',\r\n 300: '#cda30b',\r\n 400: '#b08900',\r\n 500: '#8b6a00',\r\n 600: '#664e21',\r\n 700: '#46371e',\r\n 800: '#2f2516',\r\n 900: '#1b150d',\r\n },\r\n brightYellow: {\r\n 50: '#fff699',\r\n 100: '#fff200',\r\n },\r\n lime: {\r\n 50: '#ebfad6',\r\n 100: '#caec90',\r\n 200: '#aad547',\r\n 300: '#8db61e',\r\n 400: '#769913',\r\n 500: '#5b7800',\r\n 600: '#435900',\r\n 700: '#2e3e00',\r\n 800: '#1e2a00',\r\n 900: '#111900',\r\n },\r\n green: {\r\n 50: '#e7f7e8',\r\n 100: '#beeac1',\r\n 200: '#86d895',\r\n 300: '#34c062',\r\n 400: '#00a449',\r\n 500: '#19803d',\r\n 600: '#265d35',\r\n 700: '#1e4027',\r\n 800: '#162b1b',\r\n 900: '#0d1810',\r\n },\r\n emerald: {\r\n 50: '#ddfaee',\r\n 100: '#a2f0d2',\r\n 200: '#4dddaf',\r\n 300: '#25be93',\r\n 400: '#1d9f7b',\r\n 500: '#157e60',\r\n 600: '#035d47',\r\n 700: '#004139',\r\n 800: '#002c22',\r\n 900: '#001a13',\r\n },\r\n teal: {\r\n 50: '#e0f8fc',\r\n 100: '#9beef7',\r\n 200: '#4fd8e5',\r\n 300: '#27b9c4',\r\n 400: '#109ba5',\r\n 500: '#007c83',\r\n 600: '#005b62',\r\n 700: '#004045',\r\n 800: '#002b2e',\r\n 900: '#00191b',\r\n },\r\n blue: {\r\n 50: '#ebf4fe',\r\n 100: '#cae2fc',\r\n 200: '#9bcbfa',\r\n 300: '#57aefb',\r\n 400: '#2f91ef',\r\n 500: '#306dca',\r\n 600: '#2f5091',\r\n 700: '#263766',\r\n 800: '#1b2542',\r\n 900: '#101527',\r\n },\r\n violet: {\r\n 50: '#f4f2fe',\r\n 100: '#e1dbfd',\r\n 200: '#c9befc',\r\n 300: '#ad9bfb',\r\n 400: '#9978f9',\r\n 500: '#7c51e7',\r\n 600: '#5e36b8',\r\n 700: '#402979',\r\n 800: '#2a1e4e',\r\n 900: '#18122c',\r\n },\r\n purple: {\r\n 50: '#f9f1fe',\r\n 100: '#eed8fd',\r\n 200: '#e1b6fc',\r\n 300: '#d38bfb',\r\n 400: '#c85bf9',\r\n 500: '#ae27e0',\r\n 600: '#8514ac',\r\n 700: '#60077e',\r\n 800: '#44005a',\r\n 900: '#2a003a',\r\n },\r\n pink: {\r\n 50: '#fef1f4',\r\n 100: '#fdd6e1',\r\n 200: '#fcb2c7',\r\n 300: '#f984aa',\r\n 400: '#f25090',\r\n 500: '#cd2a74',\r\n 600: '#9d1658',\r\n 700: '#700c42',\r\n 800: '#4e052b',\r\n 900: '#32011a',\r\n },\r\n}\r\n","import classnames from 'classnames'\r\nimport { Component } 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 { getVisibleTooltipTickers } from '../utils'\r\n\r\ninterface CanvasHoverProps {\r\n treemap: Treemap\r\n mapType: MapTypeId\r\n mapNodeId: string\r\n}\r\n\r\ninterface CanvasHoverState {\r\n visibleTickers: string[]\r\n activeNode?: MapDataNode\r\n sparklinesData: Record\r\n}\r\n\r\nclass CanvasHover extends Component {\r\n state: CanvasHoverState = { visibleTickers: [], activeNode: undefined, sparklinesData: {} }\r\n\r\n componentDidMount() {\r\n MapStore.addChangeListener(this._onChange)\r\n document.addEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentWillUnmount() {\r\n MapActions.loadSparklinesCancel()\r\n MapStore.removeChangeListener(this._onChange)\r\n document.removeEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentDidUpdate(_: CanvasHoverProps, prevState: CanvasHoverState) {\r\n const { activeNode, visibleTickers, sparklinesData } = this.state\r\n\r\n if (!activeNode || activeNode.name === prevState?.activeNode?.name) return\r\n\r\n if (!visibleTickers.includes(activeNode.name)) {\r\n visibleTickers.push(activeNode.name)\r\n }\r\n\r\n const tickersToLoad = visibleTickers.filter((ticker) => !sparklinesData[ticker])\r\n\r\n if (tickersToLoad.length) {\r\n MapActions.loadSparklineData(tickersToLoad, this.props.mapType)\r\n }\r\n }\r\n\r\n _onChange = () => {\r\n const activeNode = MapStore.getHoveredNode(this.props.mapNodeId)\r\n const sparklinesData = MapStore.getSparklines()\r\n\r\n this.setState({\r\n visibleTickers: getVisibleTooltipTickers(activeNode),\r\n activeNode,\r\n sparklinesData,\r\n })\r\n }\r\n\r\n _formatPerf = (d: MapDataNode) => {\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 this.props.treemap.formatValue(d.perf.toFixed(2))\r\n } else {\r\n return 'N/A'\r\n }\r\n }\r\n\r\n render() {\r\n var d = MapStore.getHoveredNode(this.props.mapNodeId)\r\n if (!this.state.activeNode || !d) {\r\n return null\r\n }\r\n var hasSparkline =\r\n this.state.sparklinesData && this.state.sparklinesData[d.name] && this.state.sparklinesData[d.name].length > 0\r\n var price = hasSparkline\r\n ? this.state.sparklinesData[d.name][this.state.sparklinesData[d.name].length - 1].toFixed(2)\r\n : ''\r\n var colorScale = this.props.treemap.colorScale\r\n var type = this.props.treemap.type\r\n\r\n var children = d.parent.children\r\n .filter((node) => this.state.visibleTickers.includes(node.name))\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n\r\n var isSmall = children.length > 15\r\n var title = (type !== MapTypeId.World ? d.parent.parent.name + ' - ' : '') + d.parent.name\r\n return (\r\n
\r\n

{title}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {d.description}\r\n \r\n \r\n\r\n {children.length > 1 &&\r\n children.map((c) => {\r\n var hasSparkline =\r\n this.state.sparklinesData &&\r\n this.state.sparklinesData[c.name] &&\r\n this.state.sparklinesData[c.name].length > 0\r\n var data = hasSparkline ? this.state.sparklinesData[c.name] : []\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
{d.data?.data?.nameOverride ?? d.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {price}{this._formatPerf(d)}
{c.data?.data?.nameOverride ?? c.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {hasSparkline ? data[data.length - 1].toFixed(2) : ''}\r\n {this._formatPerf(c)}\r\n
\r\n
\r\n )\r\n }\r\n\r\n _onMouseMove = (e: MouseEvent) => {\r\n if (!this.state.activeNode) {\r\n return\r\n }\r\n var marginLeft = 100\r\n var marginTop = 0\r\n var el = document.getElementById('hover')!\r\n var hoverWidth = el.scrollWidth\r\n var hoverHeight = el.scrollHeight\r\n var availWidth = document.documentElement.clientWidth\r\n var availHeight = document.documentElement.clientHeight\r\n if (e.clientX + hoverWidth + marginLeft * 1.5 < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else if (e.clientX - hoverWidth - marginLeft > 0) {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n } else {\r\n marginLeft = 20\r\n if (e.clientX + hoverWidth + marginLeft < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n }\r\n }\r\n el.style.top =\r\n Math.max(0, e.clientY + marginTop - Math.max(0, e.clientY + marginTop + hoverHeight - availHeight)) + 'px'\r\n }\r\n}\r\n\r\nexport default CanvasHover\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\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 {\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()\r\n _hoverCanvas = React.createRef()\r\n\r\n // @ts-ignore\r\n _canvasContext: CanvasRenderingContext2D\r\n // @ts-ignore\r\n _hoverContext: CanvasRenderingContext2D\r\n\r\n _cache: Record = {}\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 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 (treemap.type === MapTypeId.World) {\r\n 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
\r\n \r\n {alt}\r\n \r\n {(hover || zoom) && (\r\n \r\n )}\r\n {legend && }\r\n {hover && }\r\n
\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) {\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) {\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=[
\" +\r\n props.treemap.scale.tooltip +\r\n '
] 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
\r\n {![MapTypeId.Portfolio, MapTypeId.ETFHoldings].includes(props.treemap.type) && (\r\n
\r\n Use mouse wheel to zoom in and out. Drag zoomed map to pan it.\r\n
\r\n Double‑click a ticker to display detailed information in a new window.\r\n
\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
\r\n )}\r\n
\r\n {steps.map((step, index) => (\r\n \r\n {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\r\n
\r\n ))}\r\n
\r\n \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>\r\n generator?: LayoutGenerator\r\n setGenerator: React.Dispatch>\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()\r\n const [generator, setGenerator] = React.useState()\r\n\r\n return (\r\n {props.children}\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['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(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.name, tooltip: subtype.tooltip },\r\n countIndustryPerf: subtype.countIndustryPerf,\r\n countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n type: type.type,\r\n subtype: subtype.id,\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()\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.name, 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
\r\n \r\n {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\r\n }>\r\n
\r\n \r\n
\r\n
\r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * 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) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {props.children}\r\n \r\n \r\n \r\n )\r\n}\r\n","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\n\r\nexport enum MapSelectTheme {\r\n light,\r\n dark,\r\n}\r\n\r\ninterface MapSelectThemeReturn {\r\n label: React.HTMLProps\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: ,\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 extends Omit, '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({\r\n label,\r\n 'aria-label': ariaLabel,\r\n theme = 'dark',\r\n items,\r\n onChange,\r\n ...props\r\n}: MapSelectProps) {\r\n const selectTheme = React.useMemo(() => getMapSelectTheme(MapSelectTheme[theme]), [theme])\r\n\r\n return (\r\n
\r\n {label && (\r\n

{label}

\r\n )}\r\n \r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { 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) => {\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) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface SearchResultProps extends ButtonProps, Omit {\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) {\r\n return (\r\n
  • \r\n onClick(result)}\r\n >\r\n {result.name}\r\n {result.description}\r\n \r\n
  • \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 \r\n )\r\n}\r\n","/* eslint-disable import/first */\r\nimport { 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\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.name, getFormattedDateString()])\r\n\r\n if (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}\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import 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 mapControls?: React.ReactNode\r\n}\r\n\r\nexport function Topbar(props: React.PropsWithChildren) {\r\n return (\r\n
    \r\n {props.navContent && (\r\n
    \r\n {props.navContent}\r\n
    \r\n )}\r\n
    {props.children}
    \r\n {props.mapControls}\r\n
    \r\n )\r\n}\r\n","import { MapSubtype, MapSubtypeId, MapType, MapTypeId, PerfData, ScaleId } from '../types'\r\n\r\nexport const EXPANDED_MAP_BODY_CLASSS = 'is-map-expanded'\r\nexport const FALLBACK_PERF_RESPONSE: PerfData = { nodes: {}, additional: {}, subtype: MapSubtypeId.DayPerf, hash: '' }\r\n\r\nexport const MAP_SUBTYPES_COMPANIES_BY_ID: Record = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToEarnings]: {\r\n id: MapSubtypeId.PriceToEarnings,\r\n name: 'P/E',\r\n scaleId: ScaleId.PriceToEarnings,\r\n tooltip: \"Color indicates the stock's price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ForwardPriceToEearnings]: {\r\n id: MapSubtypeId.ForwardPriceToEearnings,\r\n name: 'Forward P/E',\r\n scaleId: ScaleId.ForwardPriceToEearnings,\r\n tooltip: \"Color indicates the stock's forward price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceEarningsToGrowth]: {\r\n id: MapSubtypeId.PriceEarningsToGrowth,\r\n name: 'PEG',\r\n scaleId: ScaleId.PriceEarningsToGrowth,\r\n tooltip: \"Color indicates the stock's price-to-earnings-to-growth ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToSellsRatio]: {\r\n id: MapSubtypeId.PriceToSellsRatio,\r\n name: 'P/S',\r\n scaleId: ScaleId.PriceToSellsRatio,\r\n tooltip: \"Color indicates the stock's price-to-sales ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToBookRatio]: {\r\n id: MapSubtypeId.PriceToBookRatio,\r\n name: 'P/B',\r\n scaleId: ScaleId.PriceToBookRatio,\r\n tooltip: \"Color indicates the stock's price-to-book ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.DividendYield]: {\r\n id: MapSubtypeId.DividendYield,\r\n name: 'Dividend Yield',\r\n scaleId: ScaleId.DividendYield,\r\n tooltip: \"Color indicates the stock's dividend yield.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EPSGrowth5y]: {\r\n id: MapSubtypeId.EPSGrowth5y,\r\n name: 'EPS Growth Past 5 Years',\r\n scaleId: ScaleId.EPSGrowth5y,\r\n tooltip: \"Color indicates the stock's annual earnings (EPS) growth over past 5 years.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.FloatShort]: {\r\n id: MapSubtypeId.FloatShort,\r\n name: 'Float Short',\r\n scaleId: ScaleId.FloatShort,\r\n tooltip: \"Color indicates percent of the stock's float sold short.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.AnalystRecommendation]: {\r\n id: MapSubtypeId.AnalystRecommendation,\r\n name: 'Analysts Recom.',\r\n scaleId: ScaleId.AnalystRecommendation,\r\n tooltip:\r\n \"Color indicates the analyst's recommendations for given stocks. The rating is based on a 1-5 scale, ranging from a strong-buy, to a strong-sell.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EarningsPerf]: {\r\n id: MapSubtypeId.EarningsPerf,\r\n name: 'Earnings Day Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n \"Color indicates stock's performance on earnings day. Next day performance for earnings reported after market close.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n [MapSubtypeId.EarningsDate]: {\r\n id: MapSubtypeId.EarningsDate,\r\n name: 'Earnings Date',\r\n scaleId: ScaleId.EarningsDate,\r\n tooltip: \"Color indicates stock's earnings date.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_ETF_BY_ID = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_COMPANIES: MapSubtype[] = Object.values(MAP_SUBTYPES_COMPANIES_BY_ID)\r\n\r\nexport const MAP_SUBTYPES_ETF: MapSubtype[] = Object.values(MAP_SUBTYPES_ETF_BY_ID)\r\n\r\nexport const MAP_TYPES: MapType[] = [\r\n {\r\n name: 'S&P 500',\r\n pageTitle: 'S&P 500 Map',\r\n description:\r\n \"Standard and Poor's 500 index stocks categorized by sectors and industries. Size represents market cap.\",\r\n type: MapTypeId.Sector,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'World',\r\n pageTitle: 'World Map',\r\n description:\r\n 'Foreign ADR stocks listed on NYSE, NASDAQ, AMEX categorized by geo location. Size represents market cap.',\r\n type: MapTypeId.World,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Full',\r\n pageTitle: 'Stock Market Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.SectorFull,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Exchange Traded Funds',\r\n pageTitle: 'ETF Map - Exchange Traded Funds Map',\r\n nameShort: 'ETF',\r\n description: 'ETFs categorized by sectors and styles. Size represents 3-month average dollar volume, $1M minimum.',\r\n type: MapTypeId.ETF,\r\n subtypes: MAP_SUBTYPES_ETF,\r\n },\r\n]\r\n\r\nexport const MAP_TYPE_SCREENER = {\r\n name: 'Screener',\r\n pageTitle: 'Screener Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Stock size represents market cap.',\r\n type: MapTypeId.Screener,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n\r\nexport const MAP_TYPE_ETF_HOLDINGS_WIDGET = {\r\n name: 'ETF Holdings',\r\n pageTitle: '',\r\n description: '',\r\n type: MapTypeId.ETFHoldings,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n","export type MapOrder = Record\r\n\r\nexport const MAP_MIN_WIDTH = 700\r\nexport const MAP_MIN_HEIGHT = 388\r\nexport const SECTOR_MIN_HEIGHT = 5\r\nexport const LEGEND_HEIGHT = 79\r\n\r\nexport const LARGE_MAP_HEIGHT_RATIO = 1.8\r\nexport const SMALL_MAP_GEO_HEIGHT_RATIO = 1.7\r\nexport const SMALL_MAP_HEIGHT_RATIO = 1.085 // old design ratio - 1.33\r\n\r\n// Minimal size of node to display header\r\nexport const LARGE_NODE_SIZE = {\r\n dx: 40,\r\n dy: 12,\r\n}\r\n\r\n// Don't display header if node height - header is smaller than this\r\nexport const LARGE_NODE_MIN_HEIGHT = 5\r\n\r\nexport const ORDER_SP500: MapOrder = {\r\n Technology: 10,\r\n Financial: 11,\r\n 'Communication Services': 9,\r\n Healthcare: 4,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\n\r\nexport const ORDER_SEC_ALL: MapOrder = {\r\n Financial: 10,\r\n Technology: 9,\r\n 'Communication Services': 8,\r\n 'Consumer Cyclical': 7,\r\n 'Consumer Defensive': 6,\r\n Healthcare: 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\nexport const ORDER_ETF: MapOrder = {\r\n US: 11,\r\n 'US Sector': 10,\r\n 'US Large Cap': 9,\r\n 'US Mid Cap': 8,\r\n 'US Small Cap': 7,\r\n 'US Volatility': 6,\r\n Global: 5,\r\n International: 3,\r\n 'Fixed Income': 2,\r\n Commodity: 4,\r\n Strategy: 1,\r\n Forex: 0,\r\n}\r\n\r\nexport const ORDER_SCREENER: MapOrder = {\r\n Technology: 10,\r\n Financial: 9,\r\n 'Communication Services': 8,\r\n Healthcare: 7,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_WORLD: MapOrder = {\r\n Ireland: 20,\r\n 'United Kingdom': 19,\r\n Spain: 18,\r\n France: 17,\r\n Belgium: 16,\r\n Netherlands: 15,\r\n Switzerland: 14,\r\n\r\n China: 21,\r\n Japan: 20,\r\n India: 19,\r\n 'Hong Kong': 18,\r\n 'South Korea': 15,\r\n Taiwan: 14,\r\n\r\n Colombia: 30,\r\n Chile: 29,\r\n Argentina: 28,\r\n}\r\n\r\nexport const WORLD_INDUSTRIES = [\r\n {\r\n x: 4,\r\n y: 0,\r\n dx: 240,\r\n dy: 226,\r\n name: 'Canada',\r\n countries: ['Canada'],\r\n },\r\n {\r\n x: 4,\r\n y: 230,\r\n dx: 240,\r\n dy: 135,\r\n name: 'Mexico',\r\n countries: ['Cayman Islands', 'Bermuda', 'Mexico'],\r\n },\r\n {\r\n x: 4,\r\n y: 375,\r\n dx: 240,\r\n dy: 170,\r\n name: 'South America',\r\n countries: ['Netherlands Antilles', 'Panama', 'Peru', 'Argentina', 'Colombia', 'Chile', 'Brazil'],\r\n },\r\n {\r\n x: 730,\r\n y: 380,\r\n dx: 108,\r\n dy: 80,\r\n name: 'South Africa',\r\n countries: ['South Africa'],\r\n },\r\n {\r\n x: 725,\r\n y: 180,\r\n dx: 108,\r\n dy: 81,\r\n name: 'Israel',\r\n countries: ['Israel'],\r\n },\r\n {\r\n x: 1055,\r\n y: 420,\r\n dx: 144,\r\n dy: 80,\r\n name: 'Australia',\r\n countries: ['Australia'],\r\n },\r\n {\r\n x: 871,\r\n y: 0,\r\n dx: 336,\r\n dy: 396,\r\n name: 'Asia',\r\n countries: [\r\n 'Malaysia',\r\n 'Russia',\r\n 'Philippines',\r\n 'Indonesia',\r\n 'Singapore',\r\n 'South Korea',\r\n 'Taiwan',\r\n 'India',\r\n 'Hong Kong',\r\n 'Japan',\r\n 'China',\r\n ],\r\n },\r\n {\r\n x: 324,\r\n y: 0,\r\n dx: 374,\r\n dy: 428,\r\n name: 'Europe',\r\n countries: [\r\n 'Cyprus',\r\n 'Channel Islands',\r\n 'Greece',\r\n 'Luxembourg',\r\n 'Germany',\r\n 'Belgium',\r\n 'Spain',\r\n 'France',\r\n 'Ireland',\r\n 'Switzerland',\r\n 'Netherlands',\r\n 'United Kingdom',\r\n ],\r\n },\r\n {\r\n x: 697,\r\n y: 75,\r\n dx: 144,\r\n dy: 51,\r\n name: 'Frozen',\r\n countries: ['Finland', 'Sweden', 'Norway', 'Denmark'],\r\n },\r\n {\r\n x: 542,\r\n y: 414,\r\n dx: 102,\r\n dy: 68,\r\n name: 'Italy',\r\n countries: ['Italy'],\r\n },\r\n]\r\n","import tailwindColors from '../../../../../config/colors'\r\nimport { ScaleId } from '../types'\r\n\r\nexport interface ISettings {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string\r\n industry: ISettingsSection\r\n sector: ISettingsSection\r\n scaleFontSizes: Record\r\n fontSizePadding: Record\r\n fontSizePairs: Record\r\n}\r\n\r\nexport interface ISettingsSection {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string | null\r\n border: string | null\r\n header: ISettingsSectionHeader\r\n hover?: ISettingsSectionHeader\r\n}\r\n\r\nexport interface ISettingsSectionHeader extends ISettingsSectionFont {\r\n background: string | null\r\n border: string | null\r\n height: number\r\n margin: { top: number; right: number; bottom: number; left: number }\r\n}\r\n\r\nexport interface ISettingsSectionFont {\r\n color: string\r\n fontSize: number\r\n fontWeight: 'bold' | 'normal'\r\n padding: { top: number; right: number; left: number }\r\n}\r\n\r\nexport const scaleMinMax: Record = {\r\n [ScaleId.DayPerf]: [-3, 3],\r\n _5: [-6, 6],\r\n _10: [-10, 10],\r\n _15: [-18, 18],\r\n _20: [-24, 24],\r\n _25: [-30, 30],\r\n _relvol: [0, 3],\r\n _pe: [0, 30],\r\n _fpe: [0, 30],\r\n _peg: [0, 3],\r\n _ps: [0, 5],\r\n _pb: [0, 5],\r\n _div: [0, 5],\r\n _eps5y: [-50, 50],\r\n _short: [0, 15],\r\n _rec: [5, 1],\r\n _earndate: [30, -30],\r\n // Portfolio — values are just placeholders, the real value is computed from data\r\n _portfolioPct: [-1, 1],\r\n _portfolioUsd: [-1, 1],\r\n}\r\n\r\nexport const scaleStepFormat: Record = {\r\n [ScaleId.DayPerf]: '%N%',\r\n _5: '%N%',\r\n _10: '%N%',\r\n _15: '%N%',\r\n _20: '%N%',\r\n _25: '%N%',\r\n _relvol: '%N',\r\n _pe: '%N',\r\n _fpe: '%N',\r\n _peg: '%N',\r\n _ps: '%N',\r\n _pb: '%N',\r\n _div: '%N%',\r\n _eps5y: '%N%',\r\n _short: '%N%',\r\n _rec: { 1: '%N Strong Buy', 2: '%N Buy', 3: '%N Hold', 4: '%N Sell', 5: '%N Strong Sell' },\r\n _earndate: {\r\n '-30': '%N Days',\r\n '-15': '%N Days',\r\n '-1': 'After Earnings',\r\n 1: 'Before Earnings',\r\n 15: '%N Days',\r\n 30: '%N Days',\r\n },\r\n _portfolioPct: '%N%',\r\n _portfolioUsd: '$%N',\r\n}\r\n\r\nexport const Settings: ISettings = {\r\n padding: { top: 0, right: 0, bottom: 1, left: 1 },\r\n background: tailwindColors.finviz['blue-gray'],\r\n sector: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: null,\r\n height: 14.5,\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -1, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: tailwindColors.finviz['blue-gray'],\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -0.5, right: 4, left: 4 },\r\n },\r\n hover: {\r\n color: '#6b5811',\r\n background: '#ffd614',\r\n border: '#ffd614',\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -0.5, right: 3, left: 4 },\r\n },\r\n },\r\n scaleFontSizes: {\r\n 1: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8],\r\n 1.5: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 2.25: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 3: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n },\r\n fontSizePadding: {\r\n 36: 30,\r\n 30: 25,\r\n 24: 20,\r\n 20: 14,\r\n 18: 12,\r\n 14: 9,\r\n 13: 7,\r\n 12: 7,\r\n 11: 4,\r\n 10: 3,\r\n 9: 3,\r\n 8: 2.5,\r\n 6: 0,\r\n 4: 1,\r\n },\r\n fontSizePairs: {\r\n 36: [18, 14, 13, 12],\r\n 30: [14, 13, 12, 11, 10],\r\n 24: [14, 13, 12, 11, 10],\r\n 20: [12, 11, 10, 9, 8, 6],\r\n 18: [11, 10, 9, 8, 6],\r\n 14: [9, 8, 6, 4],\r\n 13: [9, 8, 6, 4],\r\n 12: [9, 8, 6, 4],\r\n 11: [8, 6, 4],\r\n 10: [10, 9, 8, 6, 4],\r\n 9: [9, 8, 6, 4],\r\n 8: [8, 6, 4],\r\n 6: [6, 4],\r\n 4: [4],\r\n },\r\n}\r\n\r\nexport const SettingsSmall: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n background: '#343842',\r\n sector: {\r\n ...Settings.industry,\r\n padding: { top: 0.5, right: 0, bottom: 0, left: 2 },\r\n border: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -1.5 },\r\n padding: { top: 0.5, right: 1, left: 1 },\r\n border: '#343842',\r\n fontSize: 9,\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n padding: { top: 0, right: 1, bottom: 1, left: 0 },\r\n header: {\r\n ...Settings.industry.header,\r\n height: 0,\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 2, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallDark: ISettings = {\r\n ...SettingsSmall,\r\n sector: {\r\n ...SettingsSmall.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmall.sector.header,\r\n padding: { top: 0.5, right: 2, left: 2 },\r\n margin: { top: 0, right: 1.5, bottom: 0, left: -0.5 },\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n industry: {\r\n ...SettingsSmall.industry,\r\n header: {\r\n ...SettingsSmall.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeo: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#a7c4d3',\r\n industry: {\r\n ...Settings.industry,\r\n background: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n height: 9,\r\n fontSize: 8,\r\n border: '#e0e0e0',\r\n margin: { top: -0.5, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -1, right: 0, left: 1 },\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 1, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeoDark: ISettings = {\r\n ...SettingsSmallGeo,\r\n background: tailwindColors.gray[800],\r\n sector: {\r\n ...SettingsSmallGeo.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsSmallGeo.industry,\r\n border: tailwindColors.gray[800],\r\n background: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmallGeo.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreener: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n sector: {\r\n ...Settings.sector,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#363a46',\r\n border: '#d3d3d3',\r\n header: {\r\n ...Settings.sector.header,\r\n height: 20,\r\n padding: { top: 2.5, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n header: {\r\n ...Settings.industry.header,\r\n border: '#363a46',\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreenerDark: ISettings = {\r\n ...SettingsScreener,\r\n sector: {\r\n ...SettingsScreener.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsScreener.industry,\r\n header: {\r\n ...SettingsScreener.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\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\n\r\nexport type MapDataHookReturn = ReturnType\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 cacheBuster: number,\r\n mapBaseData?: MapDataRoot,\r\n initialPerf?: PerfData,\r\n fetchBaseData = api.mapBaseData,\r\n fetchPerfData = api.mapPerf\r\n) {\r\n const queryClient = useQueryClient()\r\n const dataVersion = React.useRef()\r\n const prevType = React.useRef()\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 /**\r\n * Fetch base data and perf data for the map. We cannot use `useQueries` here,\r\n * because `keepPreviousData` doesn’t work as it creates new objects every time.\r\n */\r\n const baseDataQuery = useQuery({\r\n queryKey: ['mapBaseData', type, cacheBuster],\r\n queryFn: () => fetchBaseData(type, cacheBuster),\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(['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.data, 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\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 subtype = type.subtypes.find((subtype) => subtype.id === subtypeFromQuery) ?? type.subtypes[0]\r\n\r\n return { type, subtype }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport * as constants from './constants/generator'\r\nimport { ISettings } from './constants/settings'\r\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, NodeDepth } from './types'\r\n\r\nexport default class LayoutGenerator {\r\n width: number\r\n height: number\r\n settings: ISettings\r\n layout?: Array>\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n nodes: MapDataNode[] = []\r\n isSmall: boolean\r\n type: MapTypeId\r\n minSectorHeight: number\r\n\r\n static smallIndustryPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static smallIndustryGeoPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static getSizeRatio = (type: MapTypeId, isSmall: boolean) => {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return constants.SMALL_MAP_GEO_HEIGHT_RATIO\r\n }\r\n return constants.SMALL_MAP_HEIGHT_RATIO\r\n }\r\n\r\n return constants.LARGE_MAP_HEIGHT_RATIO\r\n }\r\n\r\n static calculateHeight = (\r\n width: number,\r\n type: MapTypeId,\r\n isSmall: boolean,\r\n ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n ) => ~~(width / ratio)\r\n\r\n static calculateWidth = (height: number, type: MapTypeId, isSmall: boolean) => {\r\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n\r\n return Math.round(height * ratio)\r\n }\r\n\r\n static isNodeHeaderVisible(node: any, settings: ISettings) {\r\n const deltaX = node.dx ?? Math.round(node.x1) - Math.round(node.x0)\r\n const deltaY = node.dy ?? Math.round(node.y1) - Math.round(node.y0)\r\n\r\n const isLargeNode = deltaX >= constants.LARGE_NODE_SIZE.dx && deltaY >= constants.LARGE_NODE_SIZE.dy\r\n const showHeader =\r\n deltaY - settings.industry.padding.top - settings.industry.header.height > constants.LARGE_NODE_MIN_HEIGHT\r\n\r\n return isLargeNode && showHeader\r\n }\r\n\r\n constructor(width: number, height: number, type: MapTypeId, settings: ISettings, isSmall: boolean = false) {\r\n this.width = width\r\n this.height = height\r\n this.settings = settings\r\n this.isSmall = isSmall\r\n this.type = type\r\n this.minSectorHeight = settings.sector.padding.top + settings.sector.header.height + constants.SECTOR_MIN_HEIGHT\r\n }\r\n\r\n getExportData() {\r\n let mapRoot: MapDataRoot\r\n if (this.type === MapTypeId.World) {\r\n mapRoot = this._rootsToRoot(this.industries)\r\n } else {\r\n mapRoot = this.layout?.find((node) => node.data.name === 'Root') as unknown as MapDataRoot\r\n }\r\n\r\n // Save some file size by filtering out small nodes on maps where hover is not a concern\r\n if (this.isSmall) {\r\n mapRoot.children = this.filterVisibleNodes(mapRoot.children)\r\n }\r\n\r\n const stringified = JSON.stringify(mapRoot, (key, value) => (key === 'parent' ? '[Circular]' : value))\r\n\r\n return JSON.parse(stringified)\r\n }\r\n\r\n getLayoutData() {\r\n return {\r\n nodes: this.nodes,\r\n sectors: this.sectors,\r\n industries: this.industries,\r\n }\r\n }\r\n\r\n filterVisibleNodes = (arr: T[]) =>\r\n arr.filter((node) => {\r\n const isVisible = this.isNodeVisible(node)\r\n if (isVisible && node.children?.length) {\r\n node.children = this.filterVisibleNodes(node.children)\r\n }\r\n return isVisible\r\n })\r\n\r\n isNodeVisible(d: MapDataRow) {\r\n if (!d.depth || d.depth < NodeDepth.Industry) return true\r\n\r\n return d.dx > 0 && d.dy > 0\r\n }\r\n\r\n getLayout(data: MapDataRoot) {\r\n this.nodes = []\r\n this.sectors = []\r\n this.industries = []\r\n\r\n switch (this.type) {\r\n case MapTypeId.Sector:\r\n this.layout = this._generateSP500(data).descendants()\r\n break\r\n case MapTypeId.SectorFull:\r\n this.layout = this._generateFull(data).descendants()\r\n break\r\n case MapTypeId.Portfolio:\r\n case MapTypeId.Screener:\r\n case MapTypeId.ETFHoldings:\r\n this.layout = this._generateScreener(data).descendants()\r\n break\r\n case MapTypeId.World:\r\n this.layout = this._generateWorld(data)\r\n break\r\n case MapTypeId.ETF:\r\n this.layout = this._generateETF(data).descendants()\r\n break\r\n }\r\n\r\n this.layout?.forEach((d: any) => {\r\n this._transformNode(d)\r\n\r\n if (!this.isNodeVisible(d)) return\r\n\r\n if (!d.children) {\r\n this.nodes.push(d)\r\n } else if (d.parent && !d.parent.parent) {\r\n this.sectors.push(d)\r\n } else if (d.parent && !!d.parent.parent && d.children) {\r\n this.industries.push(d)\r\n }\r\n })\r\n\r\n return this.getLayoutData()\r\n }\r\n\r\n _transformNode(d: d3.HierarchyRectangularNode) {\r\n Object.assign(d, {\r\n name: d.data.name,\r\n description: d.data.description,\r\n perf: d.data.perf,\r\n additional: d.data.additional,\r\n x: d.x0,\r\n y: d.y0,\r\n dx: d.x1 - d.x0,\r\n dy: d.y1 - d.y0,\r\n })\r\n }\r\n\r\n _rootsToRoot(roots: any) {\r\n return {\r\n name: 'Root',\r\n children: [\r\n {\r\n name: 'World',\r\n children: roots,\r\n },\r\n ],\r\n duplicateTickers: 0,\r\n } as MapDataRoot\r\n }\r\n\r\n _getPadding = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (this.isSmall || LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryPadding.top,\r\n LayoutGenerator.smallIndustryPadding.right,\r\n LayoutGenerator.smallIndustryPadding.bottom,\r\n LayoutGenerator.smallIndustryPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getPaddingGeo = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryGeoPadding.top,\r\n LayoutGenerator.smallIndustryGeoPadding.right,\r\n LayoutGenerator.smallIndustryGeoPadding.bottom,\r\n LayoutGenerator.smallIndustryGeoPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getHierarchySort = <\r\n Datum extends { y0?: number; y1?: number; value?: number; data: { name: string }; depth?: number },\r\n >(\r\n a: Datum,\r\n b: Datum,\r\n order: constants.MapOrder\r\n ): number => {\r\n // Sort small sectors (works only when layout is recalculated)\r\n const heightB = b.y1! - b.y0!\r\n if (b.depth === NodeDepth.Sector && Number.isFinite(heightB) && heightB < this.minSectorHeight) {\r\n return b.value! - a.value!\r\n }\r\n\r\n if (order.hasOwnProperty(a.data.name) && order.hasOwnProperty(b.data.name)) {\r\n return order[b.data.name] - order[a.data.name]\r\n }\r\n return b.value! - a.value!\r\n }\r\n\r\n _getHierarchy = (data: MapDataRoot, order: constants.MapOrder) =>\r\n d3\r\n .hierarchy(data as unknown as MapDataNode)\r\n .sum((d) => d.value)\r\n .sort((a, b) => this._getHierarchySort(a, b, order))\r\n\r\n _getTreemap = (width: number, height: number) => {\r\n const paddingFn = this.type === MapTypeId.World ? this._getPaddingGeo : this._getPadding\r\n\r\n return d3\r\n .treemap()\r\n .size([width, height])\r\n .round(true)\r\n .tile(d3.treemapSquarify.ratio(1))\r\n .paddingTop((d) => paddingFn(d)[0])\r\n .paddingRight((d) => paddingFn(d)[1])\r\n .paddingBottom((d) => paddingFn(d)[2])\r\n .paddingLeft((d) => paddingFn(d)[3])\r\n }\r\n\r\n _getIndustriesRoots(data: MapDataRoot, industries: string[]) {\r\n return data.children[0].children.filter(function (d) {\r\n return industries.some((i) => i === d.name)\r\n })\r\n }\r\n\r\n _getSectorsRoots(data: MapDataRoot, sectors: string[]) {\r\n return data.children.filter(function (d) {\r\n return sectors.some((s) => s === d.name)\r\n })\r\n }\r\n\r\n _generateLayout(data: MapDataRoot, order: constants.MapOrder, recountSectors = false) {\r\n const treemapHeight = LayoutGenerator.calculateHeight(this.width, this.type, false)\r\n const treemap = this._getTreemap(this.width, treemapHeight)\r\n const hierarchy = this._getHierarchy(data, order)\r\n const recalculateHeight = this.height !== treemapHeight\r\n\r\n // Calculate the base layout\r\n let nodes = treemap(hierarchy)\r\n\r\n // Recalculate for custom height\r\n if (this.height !== treemapHeight) {\r\n treemap.tile(d3.treemapResquarify).size([this.width, this.height])\r\n }\r\n\r\n // Run layout again so that possible small sectors are reordered\r\n // This also applies the recalculateHeight option\r\n if (recountSectors || recalculateHeight) {\r\n nodes = treemap(nodes.sort((a, b) => this._getHierarchySort(a, b, order)))\r\n }\r\n\r\n return nodes\r\n }\r\n\r\n _generateSP500(data: MapDataRoot) {\r\n const nodes = this._generateLayout(data, constants.ORDER_SP500)\r\n\r\n // Switch financial and technology sector\r\n const financialSector = nodes.find((node) => node.data.name === 'Financial')!\r\n const technologySector = nodes.find((node) => node.data.name === 'Technology')!\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n\r\n financialSector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n technologySector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n return nodes\r\n }\r\n\r\n _generateFull(data: MapDataRoot) {\r\n const layout = this._generateLayout(data, constants.ORDER_SEC_ALL)\r\n\r\n // Swap Technology and financial sectors\r\n const technologySector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Technology')!\r\n const financialSector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Financial')!\r\n\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n technologySector.each((node) => {\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n financialSector.each((node) => {\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n return layout\r\n }\r\n\r\n _generateScreener(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_SCREENER, true)\r\n }\r\n\r\n _generateETF(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_ETF)\r\n }\r\n\r\n _generateWorld = (data: MapDataRoot) => {\r\n const originalWidth = 1211\r\n const ratio = this.width / originalWidth\r\n let nodes: Array> = []\r\n\r\n for (let industryIndex = 0; industryIndex < constants.WORLD_INDUSTRIES.length; industryIndex++) {\r\n const industry = constants.WORLD_INDUSTRIES[industryIndex]\r\n const industryX = Math.round(industry.x * ratio)\r\n const industryY = Math.round(industry.y * ratio)\r\n const industryWidth = Math.round(industry.dx * ratio)\r\n const industryHeight = Math.round(industry.dy * ratio)\r\n\r\n const countriesRoots = this._getIndustriesRoots(data, industry.countries)\r\n const root = this._rootsToRoot(countriesRoots)\r\n const hierarchy = this._getHierarchy(root, constants.ORDER_WORLD)\r\n const treemap = this._getTreemap(industryWidth, industryHeight)\r\n const treemapNodes = treemap(hierarchy)\r\n\r\n treemapNodes.each((d) => {\r\n d.x0 += industryX\r\n d.x1 += industryX\r\n d.y0 += industryY\r\n d.y1 += industryY\r\n })\r\n\r\n // SWITCH BRAZIL AND OTHERS\r\n if (industry.name === 'South America') {\r\n const brazil = treemapNodes.find((d) => d.data.name === 'Brazil')!\r\n const colombia = treemapNodes.find((d) => d.data.name === 'Colombia')!\r\n const brazilWidth = brazil.x1 - brazil.x0\r\n const colombiaWidth = colombia.x1 - colombia.x0\r\n\r\n treemapNodes.each((d) => {\r\n if ([d.parent?.data.name, d.data.name].includes('Brazil')) {\r\n d.x0 += colombiaWidth\r\n d.x1 += colombiaWidth\r\n } else {\r\n d.x0 -= brazilWidth\r\n d.x1 -= brazilWidth\r\n }\r\n })\r\n }\r\n\r\n nodes = nodes.concat(treemapNodes.descendants())\r\n }\r\n\r\n return nodes\r\n }\r\n}\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapBaseData(type: MapTypeId, cacheBuster: number) {\r\n return apiRequest(`/maps/${type}.json`, { query: { rev: cacheBuster } }, true)\r\n}\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/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(`/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(`/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 { getVisibleTooltipTickers } 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 if (hoveredNode) {\r\n const tickersToLoad = getVisibleTooltipTickers(hoveredNode)\r\n\r\n if (!tickersToLoad.includes(hoveredNode.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n if (tickersToLoad.length) {\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n }\r\n }\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | 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 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 if (!node) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n }\r\n\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) {\r\n 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 {\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\nexport default new AppDispatcher()\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 = {}\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> = {\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 = {\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 {\r\n zoomElement = document.createElement('canvas')\r\n zoomSelection = d3.select(this.zoomElement)\r\n behavior: d3.ZoomBehavior\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()\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\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({ 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 { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n ETFHoldings = 'etf_holdings',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: string\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n hash: string\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n subtype: MapSubtypeId\r\n version?: number\r\n hash: string\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ScreenerQuery, ScreenerView } from '../screener/utils'\r\nimport { isMobile } from '../shared/isMobile'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from './constants/constants'\r\nimport { LEGEND_HEIGHT, MAP_MIN_HEIGHT, MAP_MIN_WIDTH } from './constants/generator'\r\nimport { Settings, SettingsSmall, SettingsSmallGeo } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport type Treemap from './treemap'\r\nimport {\r\n MapDataIndustry,\r\n MapDataNode,\r\n MapDataRoot,\r\n MapDataRow,\r\n MapDataSector,\r\n MapSubtypeId,\r\n MapTypeId,\r\n PerfData,\r\n} from './types'\r\n\r\nexport function getOffset(e: MouseEvent | React.MouseEvent) {\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n\r\n return {\r\n offsetX: e.clientX - rect.left,\r\n offsetY: e.clientY - rect.top,\r\n }\r\n}\r\n\r\nexport function getIsSmall() {\r\n const query = new URLSearchParams(window.location.search)\r\n return query.get('settings') === 'small'\r\n}\r\n\r\nexport function getSettingsForMapType(type: MapTypeId, isSmall?: boolean) {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return SettingsSmallGeo\r\n }\r\n return SettingsSmall\r\n }\r\n\r\n return Settings\r\n}\r\n\r\ntype DataRow = MapDataRow | MapDataRoot\r\n/**\r\n * We strip parents when serializing data for precomputed JSONs\r\n * but we need to restore them so that we can get them in treemap\r\n */\r\nexport function restoreDataKeys(\r\n data: T[],\r\n perfData: PerfData,\r\n parent?: any\r\n): T[] {\r\n return data.map((row) => {\r\n const newRow = {\r\n ...row,\r\n parent,\r\n perf: (perfData.nodes as Record)[row.name],\r\n additional: perfData.additional[row.name],\r\n }\r\n\r\n newRow.children = row.children ? restoreDataKeys(row.children, perfData, newRow) : undefined\r\n\r\n return newRow\r\n })\r\n}\r\n\r\nexport function splitData(mapData: MapDataRoot) {\r\n let sectors: MapDataSector[] = []\r\n let industries: MapDataIndustry[] = []\r\n let nodes: MapDataNode[] = []\r\n\r\n mapData.children?.forEach((sector) => {\r\n sectors.push(sector)\r\n sector.children?.forEach((industry) => {\r\n industries.push(industry)\r\n industry.children?.forEach((company) => {\r\n if (!(company.dx < 1 || company.dy < 1)) {\r\n nodes.push(company)\r\n }\r\n })\r\n })\r\n })\r\n\r\n return { sectors, industries, nodes }\r\n}\r\n\r\nexport function getMapData(mapData: MapDataRoot, perfData: PerfData) {\r\n const [data] = restoreDataKeys([mapData], perfData)\r\n\r\n return splitData(data)\r\n}\r\n\r\nexport async function fetchBaseData(filename: string, cacheBuster: number) {\r\n // https://stackoverflow.com/questions/52635660/can-link-rel-preload-be-made-to-work-with-fetch\r\n const response = await fetch(`/maps/${filename}?rev=${cacheBuster}`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n mode: 'no-cors',\r\n })\r\n\r\n return response.json()\r\n}\r\n\r\nfunction getSizeForExpandedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n wrapper?.style.removeProperty('max-width')\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n const elementHeight = Math.max(window.innerHeight - LEGEND_HEIGHT - 50, MAP_MIN_HEIGHT)\r\n\r\n // We don’t want the map to overflow the height\r\n if (size.height > elementHeight) {\r\n const newWidth = LayoutGenerator.calculateWidth(elementHeight, type, isSmall)\r\n size = {\r\n width: newWidth,\r\n height: LayoutGenerator.calculateHeight(newWidth, type, isSmall),\r\n }\r\n }\r\n\r\n if (wrapper) {\r\n wrapper.style.maxWidth = `${size.width}px`\r\n }\r\n\r\n return size\r\n}\r\n\r\nfunction getRatioSizeForWidth(width: number, type: MapTypeId, isSmall: boolean) {\r\n const mapWidth = Math.max(width, MAP_MIN_WIDTH)\r\n return {\r\n width: mapWidth,\r\n height: LayoutGenerator.calculateHeight(mapWidth, type, isSmall),\r\n }\r\n}\r\n\r\nfunction getSizeRatioBasedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n // Remove maxWidth if exiting expanded mode\r\n if (wrapper?.style.maxWidth) {\r\n wrapper.style.removeProperty('max-width')\r\n }\r\n\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n\r\n // Set height so that we know if scrollbars are visible\r\n element.style.height = `${size.height + LEGEND_HEIGHT}px`\r\n\r\n // Add a bit of padding if scrollbar is visible and map touches it\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\r\n const isMediumScreen =\r\n window.innerWidth > 1430 &&\r\n window.innerWidth < 1450 &&\r\n !document.body.classList.contains('is-screener') &&\r\n !document.body.classList.contains('is-portfolio')\r\n if (isMediumScreen && scrollbarWidth > 0) {\r\n size = getRatioSizeForWidth(element.clientWidth - 10, type, isSmall)\r\n\r\n // This means we would display a horizontal scrollbar, which we don’t want\r\n } else if (size.width !== element.clientWidth) {\r\n size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n }\r\n\r\n element.style.removeProperty('height')\r\n\r\n return size\r\n}\r\n\r\n/**\r\n * Calculate size of the treemap based on w/h ratio and scrollbars visibility\r\n */\r\nexport function getSize(element: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n const canvasWrapper = document.getElementById('canvas-wrapper')\r\n\r\n if (!element) {\r\n return { width: 1, height: 1 }\r\n }\r\n\r\n // Custom width using query param\r\n const query = new URLSearchParams(window.location.search)\r\n if (query.has('width')) {\r\n const width = Number(query.get('width'))\r\n const parsedRatio = query.has('ratio') ? parseFloat(query.get('ratio')!) : undefined\r\n const ratio = Number.isFinite(parsedRatio) ? parsedRatio : undefined\r\n return {\r\n width,\r\n height: LayoutGenerator.calculateHeight(width, type, isSmall, ratio),\r\n }\r\n }\r\n\r\n // Expanded map\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n return getSizeForExpandedMap(element, canvasWrapper, type, isSmall)\r\n }\r\n\r\n if (type === MapTypeId.ETFHoldings) {\r\n return { height: element.clientHeight, width: element.clientWidth }\r\n }\r\n\r\n return getSizeRatioBasedMap(element, canvasWrapper, type, isSmall)\r\n}\r\n\r\n/**\r\n * Get treemap zoom levels based on env\r\n */\r\nexport function getDefaultZoomLevels() {\r\n if (isMobile()) {\r\n return [1, 1.5]\r\n }\r\n\r\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\r\n return [1, 1.5, 2.25]\r\n }\r\n\r\n return [1, 1.5, 2.25, 3]\r\n}\r\n\r\nexport function parseInitDataAsPerf(data?: MapDataRoot): PerfData | undefined {\r\n if (!data) return\r\n\r\n const nodes: Record = {}\r\n const additional: Record = {}\r\n\r\n for (const sector of data.children) {\r\n for (const industry of sector.children) {\r\n for (const node of industry.children) {\r\n if (node.perf !== undefined) {\r\n nodes[node.name] = node.perf\r\n }\r\n if (node.additional !== undefined) {\r\n additional[node.name] = node.additional\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n nodes,\r\n additional,\r\n subtype: MapSubtypeId.DayPerf,\r\n version: 1,\r\n hash: data.hash,\r\n }\r\n}\r\n\r\nconst MAX_SPARKLINES = 120\r\nconst HOVER_TOP_ROW_HEIGHT = 100\r\nconst HOVER_BORDER_WIDTH = 4\r\nconst ROW_HEIGHT = 30\r\nconst ROW_HEIGHT_SMALL = 24\r\nconst ROW_HEIGHT_BREAKPOINT = 15\r\n\r\nexport function getVisibleTooltipTickers(node?: MapDataNode) {\r\n if (!node) return []\r\n\r\n const industryTickers = node.parent.children\r\n const isSmall = industryTickers.length > ROW_HEIGHT_BREAKPOINT\r\n const rowHeight = isSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT\r\n const visibleRows = Math.floor((window.innerHeight - HOVER_TOP_ROW_HEIGHT - 2 * HOVER_BORDER_WIDTH) / rowHeight)\r\n const visibleChildren = industryTickers\r\n .slice()\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n .slice(0, Math.min(visibleRows, MAX_SPARKLINES))\r\n .map((n) => n.name)\r\n\r\n return visibleChildren\r\n}\r\n\r\nexport function onNodeClick({\r\n treemap,\r\n node,\r\n industry,\r\n sector,\r\n}: {\r\n treemap: Treemap\r\n node?: MapDataNode\r\n industry?: MapDataIndustry\r\n sector?: MapDataSector\r\n}) {\r\n if (node) {\r\n window.open(`/quote.ashx?t=${node.name}`)\r\n return\r\n }\r\n\r\n const query = new URLSearchParams()\r\n query.set(ScreenerQuery.View, ScreenerView.Overview.toString())\r\n\r\n // Use ticker filter for ETFs\r\n if (treemap.type === MapTypeId.ETF) {\r\n let tickers: string[] = []\r\n if (industry) {\r\n tickers = industry.children.map((node) => node.name)\r\n } else if (sector) {\r\n tickers = sector.children.flatMap((industry) => industry.children.map((node) => node.name))\r\n }\r\n\r\n if (tickers.length) {\r\n query.set(ScreenerQuery.Tickers, tickers.join(','))\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n\r\n return\r\n }\r\n\r\n if (industry) {\r\n const id = industry.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n const filter = treemap.type === MapTypeId.World ? 'geo' : 'ind'\r\n\r\n query.set(ScreenerQuery.Filters, `${filter}_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n } else if (sector) {\r\n const id = sector.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n\r\n query.set(ScreenerQuery.Filters, `sec_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n}\r\n\r\nenum MapsPollingIntervalInMs {\r\n Free = 180000,\r\n Elite = 3000,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport function getMapsRefreshInterval({\r\n base = MapsPollingIntervalInMs.Elite,\r\n reduced = MapsPollingIntervalInMs.EliteStocksReduced,\r\n free = MapsPollingIntervalInMs.Free,\r\n}: { base?: number; reduced?: number; free?: number } = {}) {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n let customRefreshInterval = base\r\n if (!isPremium) {\r\n customRefreshInterval = free\r\n } else if (!isStockFastRefreshAvailable()) {\r\n customRefreshInterval = reduced\r\n }\r\n\r\n return customRefreshInterval\r\n}\r\n","export enum ScreenerQuery {\r\n View = 'v',\r\n Signal = 's',\r\n Order = 'o',\r\n Tickers = 't',\r\n Filters = 'f',\r\n FilterTab = 'ft',\r\n MapSubtype = 'st',\r\n}\r\n\r\nexport enum ScreenerFilter {\r\n MarketCap = 'cap',\r\n Index = 'idx',\r\n Sector = 'sec',\r\n Industry = 'ind',\r\n AverageVolume = 'sh_avgvol',\r\n}\r\n\r\nexport enum ScreenerAddtionalQuery {\r\n ShowEtf = 'show_etf',\r\n}\r\n\r\nexport enum ScreenerView {\r\n Overview = 11,\r\n Maps = 71,\r\n Bubbles = 72,\r\n}\r\n\r\nexport function eventListenerRegister(el: HTMLElement, eventName: string, handler: (...args: any[]) => any) {\r\n el.addEventListener(eventName, handler)\r\n\r\n return () => {\r\n el.removeEventListener(eventName, handler)\r\n }\r\n}\r\n\r\nexport function textContent(el: HTMLElement) {\r\n return el.textContent || el.innerText\r\n}\r\n\r\nexport function ScreenerGetOptionsList(select: HTMLSelectElement) {\r\n const options = select.getAttribute('data-selected')?.split('|') ?? [],\r\n result = []\r\n for (var i = 0, len = options.length; i < len; i++) {\r\n var option = options[i]\r\n for (var j = 0; j < select.children.length; j++) {\r\n var optionEl = select.children[j] as HTMLOptionElement\r\n if (optionEl.value === option) {\r\n result.push({\r\n key: option,\r\n value: textContent(optionEl),\r\n })\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\nexport function ScreenerRenderCustomModal(select: any) {\r\n const filter = select.getAttribute('data-filter')\r\n const customWrapper = document.getElementById('fsm_' + filter) as HTMLElement\r\n if (customWrapper) {\r\n select.style.display = 'none'\r\n customWrapper.style.display = 'block'\r\n const input = document.getElementById('fsmi_' + filter) as HTMLInputElement\r\n const options = ScreenerGetOptionsList(select)\r\n const arr = []\r\n for (let i = 0, len = options.length; i < len; i++) {\r\n arr.push(options[i].value)\r\n }\r\n input.value = arr.join(', ')\r\n }\r\n}\r\n\r\nconst DATE_REGEX = /^[0-9]{2}[-][0-9]{2}[-][0-9]{4}/\r\n\r\nexport function getIsOptionDateRange(option: string) {\r\n if (!option.includes('x')) return false\r\n\r\n const [from, to] = option.split('x')\r\n const [isValidFromDate, isValidToDate] = [from, to].map((value) => {\r\n if (DATE_REGEX.test(value)) {\r\n return !Number.isNaN(new Date(value.replace(/-/g, '/')).getTime())\r\n }\r\n return false\r\n })\r\n\r\n return isValidFromDate || isValidToDate\r\n}\r\n\r\nexport function getInitialDateFromSelectedValues(selectedValues: string[]) {\r\n const initialDate = selectedValues.find(getIsOptionDateRange)\r\n\r\n if (initialDate) {\r\n return initialDate.split('x').map((date) => (DATE_REGEX.test(date) ? date.replace(/-/g, '/') : undefined))\r\n }\r\n}\r\n\r\nexport function dateRangeToFilterString({ from, to }: { from?: string; to?: string }) {\r\n return from || to ? `${from ?? ''}x${to ?? ''}`.replace(/\\//g, '-') : null\r\n}\r\n\r\n/**\r\n * Creates link for given view & subview and ignores any additional query params\r\n */\r\nexport function getQueryForView(view?: ScreenerView, allowedParams: string[] = [], baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const allowList = [...allowedParams, ...Object.values(ScreenerQuery)]\r\n\r\n /**\r\n * Seems like `query` is a live property, so we can’t use `query.forEach` to delete,\r\n * so we need to copy keys before looping.\r\n * https://stackoverflow.com/questions/60522437\r\n */\r\n const keys = Array.from(query.keys())\r\n\r\n keys.forEach((key) => {\r\n if (!allowList.includes(key)) {\r\n query.delete(key)\r\n }\r\n })\r\n\r\n const [, originalView, settings = 0] = query.get(ScreenerQuery.View)?.match(/(\\d{2})(\\d)/) ?? []\r\n\r\n if (view ?? originalView) {\r\n query.set(ScreenerQuery.View, `${view ?? originalView}${settings}`)\r\n }\r\n\r\n return query\r\n}\r\n\r\n/**\r\n * Parse screener `f` query param to object\r\n */\r\nexport function parseScreenerFilters(baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const filtersString = query.get(ScreenerQuery.Filters)\r\n\r\n if (!filtersString) return {}\r\n\r\n return Object.fromEntries(\r\n filtersString.split(',').map((f) => {\r\n const lastUnderscore = f.lastIndexOf('_')\r\n const key = f.substring(0, lastUnderscore)\r\n const value = f.substring(lastUnderscore + 1)\r\n return [key, value.split('|')]\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Stringify screener `f` query param\r\n */\r\nexport function stringifyScreenerFilters(filters: Record) {\r\n return Object.entries(filters)\r\n .filter(([, value]) => String(value).length > 0)\r\n .map(([key, value]) => `${key}_${value.join('|')}`)\r\n .join(',')\r\n}\r\n\r\nexport function rangesToFilter(\r\n ranges: {\r\n from: string\r\n to: string\r\n }[],\r\n rangeSuffixes?: string[],\r\n delimiter = 'x',\r\n rangeDelimiter = 'to'\r\n) {\r\n return ranges.reduce((filter, range, index) => {\r\n const { from, to } = range\r\n const rangeStr = from || to ? `${from}${rangeDelimiter}${to}${rangeSuffixes?.[index] ?? ''}` : ''\r\n\r\n let currentFilter = filter\r\n if (index > 0) currentFilter += delimiter\r\n return currentFilter + rangeStr\r\n }, '')\r\n}\r\n","/* eslint-disable import/first */\r\nimport { UseMutationResult } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { FacebookIcon, FacebookShareButton, TwitterIcon, TwitterShareButton } from 'react-share'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { CopyToClipboard } from '../../../main/components/copy-to-clipboard'\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 { Heading } from '../../../main/components/typography'\r\n\r\ninterface ShareResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\ninterface ShareProps {\r\n state: UseMutationResult\r\n onShareClick: () => void\r\n className?: string\r\n disabled?: boolean\r\n}\r\n\r\nexport function Share(props: ShareProps) {\r\n const dialogState = useDialogState()\r\n\r\n return (\r\n <>\r\n {\r\n props.onShareClick()\r\n dialogState.show()\r\n }}\r\n >\r\n Share map\r\n \r\n\r\n \r\n Share map\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\ninterface ShareDialogBodyProps {\r\n isError: boolean\r\n isLoading: boolean\r\n data?: ResponseType\r\n}\r\n\r\nfunction ShareDialogBody(props: ShareDialogBodyProps) {\r\n if (props.isLoading) {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n }\r\n\r\n if (props.isError || !props.data) {\r\n return (\r\n
    \r\n \r\n There’s been an error sharing the map.\r\n
    \r\n Please try sharing the map again and if the problem persists, please contact support.\r\n \r\n }\r\n />\r\n
    \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {document.title}\r\n
    \r\n \r\n Copy and paste link in email, website, or forum\r\n \r\n }\r\n text={props.data.shareUrl}\r\n bottomLeftContent={\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n />\r\n
    \r\n \r\n )\r\n}\r\n","import 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 {\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()\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 \r\n \r\n \r\n \r\n \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 = {\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}\r\n\r\nexport const bubbleGradients: Record = {\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}\r\n\r\nexport const gradientSmall = redGreenGradientSmall\r\n","import { getDate } from '../header/utils'\r\n\r\n// Keep in sync with the original in charts repo in app/constants/common.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\n/*\r\n * Keep in sync with the original (Utils static method) in charts repo in app/utils.ts\r\n * See line 15, we use getDate instead of convertLocalToNyTime\r\n */\r\nexport function isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = getDate()\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n}\r\n","/**\r\n * Load image before we can render it in canvas\r\n */\r\nexport function loadImage(src: string): Promise {\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 { Icon } from './icon'\r\n\r\ninterface RedGreenTextProps {\r\n value?: number | null\r\n children: any\r\n rightContent?: React.ReactNode\r\n className?: string\r\n rightClass?: string\r\n}\r\n\r\n/**\r\n * Component which renders red/green text based on whether the value is positive or negative if value\r\n * is 0, it will not be colored and it will not display the guide triangle\r\n */\r\nexport function RedGreenText({ value, children, className, rightContent, rightClass }: RedGreenTextProps) {\r\n const hasValue = value && Number.isFinite(value)\r\n const showArrow = rightContent === undefined && hasValue && value !== 0\r\n\r\n return (\r\n 0,\r\n 'text-negative': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {showArrow ? (\r\n 0 ? 'arrowUpShort' : 'arrowDownShort'} className=\"block\" />\r\n ) : null}\r\n {rightContent}\r\n \r\n \r\n )\r\n}\r\n\r\n/**\r\n * Used to position multiple lines of RedGreen text, this component will make sure all numbers are\r\n * in line with their `rightContent`\r\n */\r\nexport function RedGreenMultiline({ className, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n
    \r\n {React.Children.map(children, (child: React.ReactElement) => {\r\n if (React.isValidElement(child) && child.type === RedGreenText) {\r\n return React.cloneElement(child, {\r\n className: classnames(child.props.className, 'table-row'),\r\n rightClass: 'table-cell align-middle',\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
    \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport const Table = React.forwardRef(\r\n (props: React.PropsWithChildren>, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableHead(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n\r\ninterface TableBodyProps extends React.HTMLProps {\r\n spacing?: 'regular' | 'large' | 'none'\r\n}\r\n\r\nexport const TableBody = React.forwardRef(\r\n (\r\n { spacing = 'none', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableFooter(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","export enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from './types'\r\n\r\nexport interface TableCellProps extends React.HTMLProps {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasLeading?: boolean\r\n}\r\n\r\nexport function TableCell({\r\n isFirst,\r\n isLast,\r\n align = TableAlign.Left,\r\n hasPadding = true,\r\n hasLeading = true,\r\n className,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { TableAlign } from './types'\r\n\r\nconst TABLE_HEADER_DEFAULT_ELEMENT = 'th'\r\n\r\ninterface SortProps {\r\n isActive: boolean\r\n direction: 1 | -1\r\n}\r\n\r\nfunction TableSortIndicator({ isActive, direction, className }: Partial & { className?: string }) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface TableHeaderProps extends Omit, 'as'> {\r\n isActive?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasHover?: boolean\r\n}\r\n\r\nexport function TableHeader({\r\n as: asComponent,\r\n align,\r\n children,\r\n isActive,\r\n hasPadding = true,\r\n hasHover,\r\n ...props\r\n}: Omit, 'align'> & TableHeaderProps) {\r\n const componentToRender = asComponent ?? TABLE_HEADER_DEFAULT_ELEMENT\r\n\r\n return React.createElement(\r\n componentToRender,\r\n {\r\n ...props,\r\n className: classnames(\r\n props.className,\r\n 'whitespace-nowrap font-normal h-5 hover:first:rounded-l-md hover:last:rounded-r-md',\r\n {\r\n 'cursor-pointer hover:select-none hover:bg-gray-200/30 dark:hover:bg-gray-500/30':\r\n hasHover && !props.disabled,\r\n 'text-gray-500 dark:text-gray-300': props.disabled,\r\n 'text-gray-600 dark:text-gray-200': !isActive && !props.disabled,\r\n 'font-medium text-gray-800 dark:text-gray-50': isActive,\r\n 'text-left': align === TableAlign.Left,\r\n 'text-center': align === TableAlign.Center,\r\n 'text-right': align === TableAlign.Right,\r\n 'px-1': hasPadding,\r\n 'p-0': !hasPadding,\r\n }\r\n ),\r\n },\r\n children\r\n )\r\n}\r\n\r\nexport function TableHeaderSortable({\r\n direction,\r\n ...props\r\n}: Omit, 'align'> & Partial & TableHeaderProps) {\r\n const isDisabled = props.disabled === true\r\n\r\n return (\r\n \r\n \r\n {props.align === TableAlign.Right && (\r\n \r\n )}\r\n {props.children}\r\n {props.align !== TableAlign.Right && (\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TableRowProps extends React.PropsWithChildren> {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n isHoverable?: boolean\r\n isRounded?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n (\r\n { isFirst, isLast, isHoverable = true, isRounded = false, ...props }: TableRowProps,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape, isSortByShape, useSortData } from '../../hooks/use-sort-data'\r\nimport { SortableValue } from '../../types'\r\nimport { SortByColumnOptions } from '../../util'\r\n\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport interface TableSort {\r\n column: ColumnType\r\n direction: SortDirection\r\n}\r\n\r\n/**\r\n * Default sort getter which either gets column matching by `defaultSortId` or returns the first column\r\n */\r\nexport function getDefaultSort(\r\n columns: ColumnType[],\r\n defaultSort?: DefaultSort\r\n): TableSort {\r\n if (defaultSort === null) return { column: null as ColumnType, direction: SortDirection.Ascending }\r\n if (defaultSort && typeof defaultSort === 'object') return defaultSort as unknown as TableSort\r\n\r\n const foundColumn = columns.find((column) => isSortByShape(column) && column.id === defaultSort)\r\n\r\n return {\r\n column: foundColumn ?? (defaultSort as unknown as ColumnType | undefined) ?? columns[0],\r\n direction: SortDirection.Ascending,\r\n }\r\n}\r\n\r\n/**\r\n * Get default sorting from url when persisting sort\r\n */\r\nexport function getDefaultSortFromUrl, OrderType extends string | null>(\r\n columns: ColumnType[],\r\n order?: OrderType,\r\n idKey: keyof ColumnType = 'id'\r\n): TableSort {\r\n if (order === null) return { column: null as unknown as ColumnType, direction: SortDirection.Ascending }\r\n\r\n const isDesc = order?.startsWith('-')\r\n const queryParam = isDesc ? order?.substring(1) : order\r\n const column = columns.find((column) => column[idKey] === queryParam)\r\n\r\n if (column) {\r\n return { column, direction: isDesc ? SortDirection.Descending : SortDirection.Ascending }\r\n } else {\r\n return { column: columns[0], direction: SortDirection.Ascending }\r\n }\r\n}\r\n\r\nexport function saveSortToUrl>(\r\n prev: URLSearchParams,\r\n urlPersistKey: string,\r\n newSort: ColumnType | null,\r\n idKey: keyof ColumnType = 'id',\r\n defaultSort: unknown = null\r\n) {\r\n const newParams = new URLSearchParams(prev)\r\n const previousOrder = newParams.get(urlPersistKey) ?? defaultSort\r\n const isDescOrder = previousOrder?.toString().startsWith('-')\r\n\r\n if (newSort === null) {\r\n newParams.delete(urlPersistKey)\r\n } else {\r\n newParams.set(urlPersistKey, `${!isDescOrder && previousOrder === newSort[idKey] ? '-' : ''}${newSort[idKey]}`)\r\n }\r\n\r\n return newParams\r\n}\r\n\r\ninterface UseTableSortProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> {\r\n data: DataType[]\r\n columns: ColumnType[]\r\n\r\n /**\r\n * You can either provide id of the column or whole shape\r\n * defaultSort: { column: columns[0], direction: -1 }\r\n * If your ids are constants (or enums), you will get name suggestions\r\n */\r\n defaultSort?: DefaultSort\r\n\r\n /**\r\n * Custom value getter. By default these can be defined on every column using `getValueForSort`\r\n */\r\n valueGetter?: (column: ColumnType) => (row: DataType) => SortableValue\r\n\r\n /**\r\n * Additional options for sorting, including ignoring null values or sorting null as last\r\n */\r\n options?: SortByColumnOptions\r\n}\r\n\r\n/**\r\n * This hook has multiple\r\n */\r\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({ data, columns, defaultSort, valueGetter, options }: UseTableSortProps) {\r\n const [sort, setSort] = React.useState(getDefaultSort(columns, defaultSort) as TableSort)\r\n\r\n const changeSort = React.useCallback((newSort: SortType, direction?: SortDirection) => {\r\n setSort((prevSort) => {\r\n if (newSort && direction) {\r\n return { column: newSort, direction }\r\n }\r\n\r\n if (newSort && prevSort.column?.id === newSort.id) {\r\n return { ...prevSort, direction: prevSort.direction * -1 }\r\n }\r\n\r\n return { column: newSort, direction: SortDirection.Ascending }\r\n })\r\n }, [])\r\n\r\n const sortedData = useSortData({ data, direction: sort.direction, sortBy: sort.column, valueGetter, options })\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n\r\ninterface UseTableSortWithUrlProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> extends UseTableSortProps {\r\n /**\r\n * When set, the sorting will be persisted in the URL. Loading the\r\n *\r\n * @default undefined\r\n */\r\n urlPersistKey?: string\r\n\r\n /**\r\n * Key to get value of the URL sort from a column\r\n * @deafult \"id\"\r\n */\r\n idKey?: keyof ColumnType\r\n}\r\n\r\nexport function useTableSortWithUrl<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({\r\n data,\r\n columns,\r\n defaultSort,\r\n valueGetter,\r\n urlPersistKey,\r\n idKey = 'id',\r\n options,\r\n}: UseTableSortWithUrlProps) {\r\n const {\r\n data: sortedData,\r\n changeSort: changeSortState,\r\n sort,\r\n } = useTableSort({ data, columns, defaultSort, valueGetter, options })\r\n const [searchParams, setSearchParams] = useSearchParams()\r\n const defaultSortRef = React.useRef(\r\n urlPersistKey && typeof defaultSort === 'string'\r\n ? getDefaultSortFromUrl(columns, searchParams.get(urlPersistKey) ?? defaultSort, idKey)\r\n : getDefaultSort(columns, defaultSort)\r\n )\r\n\r\n const changeSort = React.useCallback(\r\n (newSort: SortType) => {\r\n if (urlPersistKey) {\r\n const defaultSort: ColumnType | null = defaultSortRef.current.column\r\n setSearchParams(\r\n (prev) =>\r\n saveSortToUrl(prev, urlPersistKey, newSort, idKey, defaultSort === null ? null : defaultSort[idKey]),\r\n {\r\n preventScrollReset: true,\r\n }\r\n )\r\n }\r\n\r\n changeSortState(newSort)\r\n },\r\n [idKey, setSearchParams, urlPersistKey, changeSortState]\r\n )\r\n\r\n /**\r\n * Update sort from url\r\n */\r\n React.useEffect(() => {\r\n if (!urlPersistKey) return\r\n\r\n const newSort = searchParams.get(urlPersistKey)\r\n if (newSort) {\r\n const sort = getDefaultSortFromUrl(columns, newSort, idKey)\r\n changeSortState(sort.column, sort.direction)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey, changeSortState])\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \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\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
    \r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n }\r\n />\r\n }\r\n >\r\n \r\n \r\n )\r\n}\r\n\r\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
    {children}
    \r\n
    \r\n {actions ?? (\r\n \r\n )}\r\n
    \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SortDirectionValue, SortableValue } from '../types'\r\nimport { SortByColumnOptions, sortByColumn } from '../util'\r\n\r\nexport interface SortByShape {\r\n id: IdType\r\n\r\n /**\r\n * Provide value calculation for sort when value is computed in column renderer\r\n */\r\n getValueForSort?: (row: DataType) => SortableValue\r\n}\r\n\r\nexport function isSortByShape(sortBy?: unknown): sortBy is SortByShape {\r\n return sortBy?.hasOwnProperty?.('id') === true\r\n}\r\n\r\n/**\r\n * Default value getter which gets row data by `getValueForSort` defined on the column\r\n * If no sort value getter is provided, it falls back to getting data by column.id or returns the whole row\r\n */\r\nexport function getDefaultValueGetter(column: SortBy) {\r\n return (row: DataType): SortableValue => {\r\n let value = null\r\n\r\n if (isSortByShape(column)) {\r\n if (typeof column.getValueForSort === 'function') value = column.getValueForSort(row)\r\n else if (typeof row === 'object') value = row?.[column.id as keyof typeof row]\r\n } else {\r\n value = row\r\n }\r\n\r\n return (value as SortableValue) ?? null\r\n }\r\n}\r\n\r\nexport function useSortData({\r\n data,\r\n sortBy,\r\n direction,\r\n valueGetter = getDefaultValueGetter,\r\n options,\r\n}: {\r\n data: DataType[]\r\n sortBy?: SortBy | null\r\n direction: SortDirectionValue\r\n valueGetter?: (sortBy: SortBy) => (row: DataType) => SortableValue\r\n options?: SortByColumnOptions\r\n}) {\r\n return React.useMemo(() => {\r\n if (!sortBy) return [...data]\r\n\r\n return [...data].sort((a, b) =>\r\n sortByColumn({\r\n ...options,\r\n a,\r\n b,\r\n direction,\r\n valueGetter: valueGetter(sortBy),\r\n })\r\n )\r\n }, [data, options, direction, valueGetter, sortBy])\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function getVisualViewport(visualViewport: VisualViewport | null) {\r\n const width = visualViewport?.width ?? window.innerWidth\r\n const height = visualViewport?.height ?? window.innerHeight\r\n const scale = visualViewport?.scale ?? 1\r\n\r\n return {\r\n top: visualViewport?.offsetTop ?? 0,\r\n left: visualViewport?.offsetLeft ?? 0,\r\n scale: Math.round((1 / scale) * 100) / 100,\r\n width: Math.round(width * scale),\r\n height: Math.round(height * scale),\r\n unscaledWidth: width,\r\n unscaledHeight: height,\r\n }\r\n}\r\n\r\nexport function useVisualViewport({ enabled = true, onScroll = true }: { enabled?: boolean; onScroll?: boolean } = {}) {\r\n const [viewport, setViewport] = React.useState(getVisualViewport(window.visualViewport))\r\n\r\n React.useEffect(() => {\r\n if (!enabled) return\r\n\r\n const handleChange = throttle((ev: Event) => {\r\n const viewport = ev.currentTarget as VisualViewport\r\n if (viewport) {\r\n setViewport(() => getVisualViewport(viewport))\r\n }\r\n }, 50)\r\n\r\n window.visualViewport?.addEventListener('resize', handleChange)\r\n if (onScroll) window.visualViewport?.addEventListener('scroll', handleChange)\r\n handleChange({ currentTarget: window.visualViewport } as Event)\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', handleChange)\r\n window.visualViewport?.removeEventListener('scroll', handleChange)\r\n }\r\n }, [enabled, onScroll])\r\n\r\n return React.useMemo(() => ({ viewport, setViewport }), [viewport])\r\n}\r\n","import classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, PortfolioSymbolType, PortfolioTransaction, RowKind, TableColumnDefinition } from '../types'\r\nimport { PORTFOLIO_DATE_FORMAT_VIEW, TRANSACTION_LABEL } from './general'\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.Spacer]: {\r\n id: ColumnId.Spacer,\r\n urlSort: '',\r\n name: '',\r\n renderColumn: () => null,\r\n },\r\n [ColumnId.Ticker]: {\r\n id: ColumnId.Ticker,\r\n urlSort: 'ticker',\r\n name: 'Ticker',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n if (args.row.type === PortfolioSymbolType.Stock && !args.row.isDelisted) {\r\n return (\r\n ev.stopPropagation()}\r\n >\r\n {args.row.ticker}\r\n \r\n )\r\n }\r\n\r\n return {args.row.ticker}\r\n default:\r\n return {args.row.ticker}\r\n }\r\n },\r\n },\r\n [ColumnId.Company]: {\r\n id: ColumnId.Company,\r\n urlSort: 'company',\r\n name: 'Company',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n case RowKind.Summary:\r\n return (\r\n \r\n Summary:{' '}\r\n \r\n {args.row.tickers} Ticker{args.row.tickers === 1 ? '' : 's'}\r\n \r\n / \r\n \r\n {args.row.transactions} Transaction{args.row.transactions === 1 ? '' : 's'}\r\n \r\n \r\n )\r\n default:\r\n return
    {args.row.company}
    \r\n }\r\n },\r\n },\r\n [ColumnId.CostAvg]: {\r\n id: ColumnId.CostAvg,\r\n urlSort: 'costavg',\r\n name: 'Avg. Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.costAvg)\r\n }\r\n default:\r\n return formatNumber(args.row.costAvg)\r\n }\r\n },\r\n },\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n urlSort: 'price',\r\n name: 'Price',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n return formatNumber(args.row.lastClose)\r\n }\r\n },\r\n },\r\n [ColumnId.LastChange]: {\r\n id: ColumnId.LastChange,\r\n urlSort: 'lastchange',\r\n name: 'Change $',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => (args.kind === RowKind.Group ? args.row.lastClose - args.row.prevClose : null),\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n if (args.row.isDelisted) return '-'\r\n\r\n const lastChange = args.row.lastClose - args.row.prevClose\r\n return (\r\n \r\n {formatNumber(lastChange, {\r\n showPlusSign: true,\r\n fractions: args.row.lastClose < 1 ? 4 : 2,\r\n })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastChangePct]: {\r\n id: ColumnId.LastChangePct,\r\n urlSort: 'changepct',\r\n name: 'Change %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n default:\r\n return (\r\n \r\n {formatNumber(args.row.lastChangePct, { showPlusSign: true })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastVolume]: {\r\n id: ColumnId.LastVolume,\r\n urlSort: 'volume',\r\n name: 'Volume',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.lastVolume, { fractions: 0 })\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Transaction]: {\r\n id: ColumnId.Transaction,\r\n urlSort: 'transaction',\r\n name: 'Transaction',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return TRANSACTION_LABEL[args.row.transaction]\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Date]: {\r\n id: ColumnId.Date,\r\n urlSort: 'date',\r\n name: 'Date',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return (\r\n \r\n {dateFns.format(new Date(args.row.date), PORTFOLIO_DATE_FORMAT_VIEW)}\r\n \r\n )\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Shares]: {\r\n id: ColumnId.Shares,\r\n urlSort: 'shares',\r\n name: 'Shares',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n default:\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n },\r\n },\r\n [ColumnId.Price]: {\r\n id: ColumnId.Price,\r\n urlSort: 'cost',\r\n name: 'Cost / Share',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.price)\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.ValuePaid]: {\r\n id: ColumnId.ValuePaid,\r\n urlSort: 'totalcost',\r\n name: 'Total Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valuePaid)\r\n },\r\n },\r\n [ColumnId.Amount]: {\r\n id: ColumnId.Amount,\r\n urlSort: 'amount',\r\n name: 'Amount',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.valuePaid,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Trade && args.kind !== RowKind.Transaction) return null\r\n return formatNumber(args.row.price)\r\n },\r\n },\r\n [ColumnId.ValueMarket]: {\r\n id: ColumnId.ValueMarket,\r\n urlSort: 'marketvalue',\r\n name: 'Market Value',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valueMarket)\r\n },\r\n },\r\n [ColumnId.GainMarketUsd]: {\r\n id: ColumnId.GainMarketUsd,\r\n urlSort: 'gainusd',\r\n name: 'Total Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketPct]: {\r\n id: ColumnId.GainMarketPct,\r\n urlSort: 'gainpct',\r\n name: 'Total Gain %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketCombined]: {\r\n id: ColumnId.GainMarketCombined,\r\n urlSort: 'gainmarket',\r\n name: 'Total Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.gainMarketPct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.GainTodayUsd]: {\r\n id: ColumnId.GainTodayUsd,\r\n urlSort: 'changeusd',\r\n name: 'Today’s Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainTodayCombined]: {\r\n id: ColumnId.GainTodayCombined,\r\n urlSort: 'gaintoday',\r\n name: 'Today’s Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.lastChangePct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n {formatNumber(args.row.lastChangePct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.Order]: {\r\n id: ColumnId.Order,\r\n urlSort: 'order',\r\n name: 'Order',\r\n align: TableAlign.Right,\r\n renderColumn: () => null,\r\n },\r\n})\r\n\r\nexport const columns = Object.values(columnMap)\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { PortfolioEntryTransaction, PortfolioSymbolType, PortfolioTransaction } from '../types'\r\n\r\nexport const PORTFOLIO_CASH_SYMBOL = '$CASH'\r\n\r\nexport const PORTFOLIO_DATE_FORMAT_VIEW = 'MM-dd-yyyy'\r\nexport const PORTFOLIO_DATE_FORMAT_DATA = \"yyyy-MM-dd'T00:00:00'\"\r\n\r\nexport const PORTFOLIO_REFRESH_INTERVAL_ELITE = 20 * 1000\r\nexport const PORTFOLIO_REFRESH_INTERVAL_FREE = 60 * 1000\r\n\r\nexport const TRANSACTION_LABEL: Record = {\r\n [PortfolioTransaction.Watch]: 'Watch',\r\n\r\n // Stock transactions\r\n [PortfolioTransaction.Buy]: 'Buy',\r\n [PortfolioTransaction.Short]: 'Short Sell',\r\n\r\n // Cash transactions\r\n [PortfolioTransaction.CashDeposit]: 'Cash Deposit',\r\n [PortfolioTransaction.CashWithdraw]: 'Cash Withdraw',\r\n [PortfolioTransaction.CashIncome]: 'Income',\r\n [PortfolioTransaction.CashFee]: 'Fee',\r\n}\r\n\r\nexport const STOCK_TRANSACTIONS = [PortfolioTransaction.Buy, PortfolioTransaction.Short]\r\n\r\nexport const CASH_TRANSACTIONS = [\r\n PortfolioTransaction.CashDeposit,\r\n PortfolioTransaction.CashWithdraw,\r\n PortfolioTransaction.CashIncome,\r\n PortfolioTransaction.CashFee,\r\n]\r\n\r\nexport const EMPTY_FORM_ENTRY = {\r\n ticker: '',\r\n date: `${dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA)}`,\r\n shares: undefined,\r\n price: undefined,\r\n transaction: PortfolioTransaction.Buy,\r\n}\r\n\r\nexport const EMPTY_TRANSACTION: Omit = {\r\n ...EMPTY_FORM_ENTRY,\r\n shares: 0,\r\n price: 0,\r\n type: PortfolioSymbolType.Stock,\r\n valuePaid: null,\r\n valueMarket: null,\r\n valueMarketPrev: null,\r\n gainMarket: null,\r\n gainMarketPct: null,\r\n gainMarketUsd: null,\r\n gainTodayUsd: null,\r\n lastChangePct: null,\r\n}\r\n\r\nexport const PORTFOLIO_INPUT_NAME = 'portfolio_name'\r\nexport const PORTFOLIO_INPUT_EMPTY_ERROR = 'Please enter portfolio name.'\r\nexport const PORTFOLIO_INPUT_EXISTS_ERROR = 'Portfolio with that name already exists.'\r\nexport const TICKERS_INPUT_NAME = 'tickers'\r\nexport const TICKERS_INPUT_FORMAT_TIP = 'Separate multiple tickers by a comma, e.g.: AAPL, MSFT, GOOG.'\r\n\r\n// Keep in sync with PortfolioSizeEnum in Website/App_Code/User.cs & config/types/globals.d.ts\r\nexport enum PortfolioSizeEnum {\r\n Default = 'default',\r\n Compact = 'compact',\r\n}\r\n","import { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { ContentType, apiRequest } from '../../../services/api'\r\nimport { PORTFOLIO_CASH_SYMBOL } from '../constants/general'\r\nimport {\r\n PortfolioDefinition,\r\n PortfolioEntryBase,\r\n PortfolioFormGroup,\r\n PortfolioInitData,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionWatch,\r\n} from '../types'\r\nimport { getSymbolType } from '../utils'\r\n\r\nexport const EMPTY_RESPONSE: PortfolioInitData = {\r\n limit: 0,\r\n selectedPortfolio: 0,\r\n limitTransactions: 0,\r\n portfolio: [],\r\n news: [],\r\n portfolios: [],\r\n}\r\n\r\nexport function portfolioData(portfolioId?: string | number | null) {\r\n return apiRequest('/api/portfolio_data.ashx', { query: { pid: portfolioId ?? '' } })\r\n}\r\n\r\nexport function deletePortfolio(portfolioId?: string | number) {\r\n return apiRequest('/request_portfolio_delete.ashx', { query: { pid: portfolioId }, method: 'DELETE' })\r\n}\r\n\r\nexport function portfolioEntry(\r\n query?: Record,\r\n method?: string,\r\n body?: Omit, 'type'>\r\n) {\r\n return apiRequest(\r\n '/api/portfolio_entry.ashx',\r\n {\r\n query,\r\n method,\r\n body: JSON.stringify(body),\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport const QUOTE_INVALID_TICKER_REQUEST = '_UNKNOWN'\r\nexport const QUOTE_INVALID_TICKER_RESPONSE = 'NA'\r\nexport const QUOTE_TICKER_DELIMITER = ','\r\n\r\nexport function quoteData(tickers: string[]) {\r\n return apiRequest('request_quote.ashx', {\r\n query: { t: tickers.filter((ticker) => ticker.length).join(',') },\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n}\r\n\r\nexport async function validateTickers(tickers: string[]) {\r\n const response = await apiRequest<{ tickers: string; specialSymbols: Record }>(\r\n '/portfolio_tickers.ashx',\r\n {\r\n query: { json: true },\r\n },\r\n true\r\n )\r\n\r\n const parsedTickers = response?.tickers.split('|') ?? []\r\n const specialTickers = Object.keys(response?.specialSymbols ?? [])\r\n\r\n return tickers.map((ticker) => [...specialTickers, ...parsedTickers].includes(ticker))\r\n}\r\n\r\nexport async function recalculatePortfolio(\r\n rows: PortfolioFormGroup[],\r\n totalValue = 100000.0\r\n): Promise {\r\n const tickers: string[] = []\r\n let numberOfTransactions = 0\r\n\r\n rows.forEach((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n\r\n if (getSymbolType(ticker) === PortfolioSymbolType.Stock) numberOfTransactions += row.transactions.length\r\n tickers.push(ticker.length ? ticker : QUOTE_INVALID_TICKER_REQUEST)\r\n })\r\n\r\n const pricePerColumn = totalValue / numberOfTransactions\r\n\r\n const response = await quoteData(tickers)\r\n const prices = response?.split(QUOTE_TICKER_DELIMITER)\r\n\r\n if (prices?.length !== tickers.length) {\r\n window.Sentry?.captureMessage('Invalid recalculated data', {\r\n extra: {\r\n requestTickers: tickers,\r\n requestTickersLength: tickers.length,\r\n responseLength: prices?.length,\r\n },\r\n })\r\n\r\n return []\r\n }\r\n\r\n const tickerPrices = Object.fromEntries(\r\n prices.map((price, index) => {\r\n const tickerPrice = price === QUOTE_INVALID_TICKER_RESPONSE ? NaN : parseFloat(price)\r\n\r\n return [tickers[index], isNaN(tickerPrice) ? NaN : tickerPrice]\r\n })\r\n )\r\n\r\n return rows.map((row) => ({\r\n id: row.id,\r\n ticker: row.ticker,\r\n transactions: row.transactions.map((transaction) => {\r\n const price = tickerPrices[row.ticker]\r\n const shares = Math.round((pricePerColumn / price) * 10000) / 10000\r\n\r\n const calculatedPrice = isNaN(price) ? transaction.price : price\r\n const calculatedShares = isNaN(shares) ? transaction.shares : shares\r\n\r\n return {\r\n ...transaction,\r\n transaction:\r\n transaction.transaction === PortfolioTransaction.Watch ? PortfolioTransaction.Buy : transaction.transaction,\r\n price: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedPrice,\r\n shares: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedShares,\r\n }\r\n }),\r\n }))\r\n}\r\n\r\nexport function submitForm(data: URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport type TickersApiResponse = {\r\n portfolioId: number\r\n message?: string\r\n portfolioEntries: Record>\r\n}\r\n\r\nexport enum ErrorSource {\r\n Portfolio,\r\n Tickers,\r\n}\r\n\r\nexport type TickersApiErrorResponse = {\r\n source: ErrorSource\r\n message: string\r\n isNotification?: boolean\r\n}\r\n\r\nexport function portfolioTickers({\r\n tickers,\r\n portfolioName,\r\n portfolioId,\r\n}: {\r\n tickers: string\r\n portfolioName?: string\r\n portfolioId?: number\r\n}) {\r\n const query = Object.assign(\r\n { tickers },\r\n typeof portfolioName !== 'undefined' && { portfolio_name: portfolioName },\r\n typeof portfolioId !== 'undefined' && { pid: portfolioId }\r\n )\r\n\r\n return apiRequest(\r\n '/api/portfolio_tickers.ashx',\r\n {\r\n method: 'POST',\r\n query,\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport function submitEditForm(data: string | URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport function reorderPortfolios(body: PortfolioDefinition[]) {\r\n return apiRequest('/api/portfolio_reorder.ashx', {\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { NullableNumbers } from '../../types'\r\n\r\nexport enum PortfolioQuery {\r\n View = 'v',\r\n TableView = 'tv',\r\n PortfolioId = 'pid',\r\n Order = 'o',\r\n Tickers = 't',\r\n Map = 'map',\r\n Size = 'mapSize',\r\n Subtype = 'subtype',\r\n Group = 'group',\r\n}\r\n\r\nexport enum PortfolioMapSizeKey {\r\n MarketValue = 'market',\r\n Gain = 'gain',\r\n}\r\n\r\nexport enum PortfolioView {\r\n View = '1',\r\n Edit = '2',\r\n}\r\n\r\nexport enum PortfolioTableView {\r\n Ticker = '1',\r\n Trade = '2',\r\n}\r\n\r\nexport const PortfolioTableViewLabels = {\r\n [PortfolioTableView.Ticker]: 'Tickers',\r\n [PortfolioTableView.Trade]: 'Trades',\r\n}\r\n\r\nexport enum PortfolioSymbolType {\r\n Stock = 'stock',\r\n Cash = 'cash',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n\r\n // Stock transactions\r\n Buy = 1,\r\n Short = 2,\r\n\r\n // Cash transactions\r\n CashDeposit = 200,\r\n CashWithdraw = 201,\r\n CashIncome = 202,\r\n CashFee = 203,\r\n}\r\n\r\nexport enum NumberOfShares {\r\n None = 0,\r\n /**\r\n * The usage of this is technically incorrect. The value for `PositiveNumber` is 1.\r\n * But we don’t care in this context, because we only want to differentiate betwen zero/non-zero values,\r\n * which helps us get correct types.\r\n *\r\n * # Don’t compare `entry.shares === NumberOfShares.PositiveNumber`\r\n */\r\n PositiveNumber = 1,\r\n}\r\n\r\nexport interface PortfolioEntryBase {\r\n id: number\r\n ticker: string\r\n date: string\r\n transaction: PortfolioTransaction\r\n shares: number\r\n price: number\r\n type: PortfolioSymbolType\r\n}\r\n\r\n/**\r\n * Base type which lists all common properties\r\n */\r\nexport interface PortfolioEntryComputed {\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarket: number\r\n gainMarketPct: number\r\n gainMarketUsd: number\r\n gainTodayUsd: number\r\n lastChangePct: number\r\n}\r\n\r\n/**\r\n * Transaction with > 0 shares\r\n */\r\nexport interface PortfolioTransactionStake extends PortfolioEntryBase, PortfolioEntryComputed {\r\n shares: NumberOfShares.PositiveNumber\r\n}\r\n\r\n/**\r\n * Transaction with 0 shares\r\n */\r\nexport interface PortfolioTransactionWatch\r\n extends Omit,\r\n NullableNumbers {\r\n shares: NumberOfShares.None\r\n transaction: PortfolioTransaction\r\n}\r\n\r\nexport type PortfolioEntryTransaction = PortfolioTransactionStake | PortfolioTransactionWatch\r\n\r\nexport type PortfolioActionType = PortfolioEntryTransaction & { isNotification?: boolean; message?: string }\r\n\r\n/**\r\n * Top level portfolio entry\r\n */\r\nexport interface PortfolioGroup extends PortfolioEntryComputed {\r\n ticker: string\r\n shares: number\r\n industry: string\r\n country: string\r\n company: string\r\n marketCap: number\r\n prevClose: number\r\n lastClose: number\r\n lastVolume: number\r\n perfWeek: number\r\n costAvg: number\r\n transactions: PortfolioEntryTransaction[]\r\n order: number\r\n id: number\r\n date: string\r\n type: PortfolioSymbolType\r\n isDelisted?: true\r\n}\r\n\r\nexport type PortfolioTrade = Omit & PortfolioEntryTransaction\r\n\r\nexport type PortfolioMapEntry = Omit & PortfolioTransactionStake\r\n\r\n/**\r\n * Summary row for the whole portfolio\r\n */\r\nexport interface PortfolioSummary {\r\n tickers: number\r\n transactions: number\r\n shares: number\r\n lastChangePct: number\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketStocks: number\r\n valueMarketStocksPrev: number\r\n gainMarketUsd: number\r\n gainMarketPct: number\r\n gainTodayUsd: number\r\n}\r\n\r\nexport interface PortfolioDefinition {\r\n id: number\r\n name: string\r\n order: number\r\n}\r\n\r\nexport interface PortfolioInitData {\r\n limit: number\r\n limitTransactions: number\r\n selectedPortfolio: number\r\n portfolios: PortfolioDefinition[]\r\n portfolio: PortfolioGroup[]\r\n news: string[]\r\n version?: number\r\n}\r\n\r\nexport interface PortfolioFormEntry\r\n extends Pick,\r\n Partial> {\r\n uuid: string\r\n}\r\n\r\nexport interface PortfolioFormGroup extends Pick {\r\n id: string\r\n transactions: PortfolioFormEntry[]\r\n}\r\n\r\nexport enum ColumnId {\r\n Spacer = 'spacer',\r\n Ticker = 'ticker',\r\n Company = 'company',\r\n LastClose = 'lastClose',\r\n CostAvg = 'costAvg',\r\n LastChange = 'lastChange',\r\n LastChangePct = 'lastChangePct',\r\n LastVolume = 'lastVolume',\r\n Transaction = 'transaction',\r\n Date = 'date',\r\n Shares = 'shares',\r\n Price = 'price',\r\n ValuePaid = 'valuePaid',\r\n Amount = 'amount',\r\n ValueMarket = 'valueMarket',\r\n GainMarketUsd = 'gainMarketUsd',\r\n GainMarketPct = 'gainMarketPct',\r\n GainMarketCombined = 'gainMarketCombined',\r\n GainTodayUsd = 'gainTodayUsd',\r\n GainTodayCombined = 'gainTodayCombined',\r\n Order = 'order',\r\n}\r\n\r\nexport enum RowKind {\r\n Group, // A group of transactions\r\n Transaction, // A transaction made inside ticker\r\n Summary, // Portfolio summary\r\n Watchlist, // Charts portfolio watchlist table\r\n Trade,\r\n}\r\n\r\ninterface GroupProps {\r\n kind: RowKind.Group\r\n row: PortfolioGroup\r\n}\r\ninterface TradeProps {\r\n kind: RowKind.Trade\r\n row: PortfolioTrade\r\n}\r\n\r\ninterface TransactionProps {\r\n kind: RowKind.Transaction\r\n row: PortfolioEntryTransaction\r\n}\r\n\r\ninterface SummaryProps {\r\n kind: RowKind.Summary\r\n row: PortfolioSummary\r\n}\r\n\r\ninterface WatchlistProps {\r\n index: number\r\n kind: RowKind.Watchlist\r\n row: PortfolioGroup\r\n}\r\n\r\nexport interface TableColumnDefinition<\r\n PropsType = GroupProps | TradeProps | TransactionProps | SummaryProps | WatchlistProps,\r\n> extends SortByShape {\r\n urlSort: string\r\n name: string\r\n align?: TableAlign\r\n\r\n /**\r\n * Get the value of the column and render it\r\n */\r\n renderColumn: (props: PropsType) => React.ReactNode\r\n}\r\n\r\nexport enum ActionKind {\r\n AddTickers,\r\n RemoveTicker,\r\n AddTransaction,\r\n EditTransaction,\r\n RemoveTransaction,\r\n ReorderTickers,\r\n PortfoliosReorder,\r\n}\r\n\r\nexport interface Action {\r\n kind: ActionKind\r\n payload: PayloadType\r\n}\r\n\r\nexport type AddTickersError = {\r\n tickers?: string\r\n}\r\n\r\nexport interface CreatePortfolioErrors extends AddTickersError {\r\n portfolioName?: string\r\n}\r\n\r\nexport interface CreatePortfolioData {\r\n tickers: string\r\n portfolioName: string\r\n}\r\n\r\nexport type FormErrors = Partial>\r\n\r\nexport interface PortfolioBulkEditErrors {\r\n portfolioName: boolean\r\n rows: Record\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { MapDataNode, MapDataRoot, MapSubtypeId, PerfData } from '../../../app/maps/types'\r\nimport { getMapsRefreshInterval } from '../../../app/maps/utils'\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { parseInitData } from '../../../app/shared/utils'\r\nimport * as storage from '../../services/local-storage'\r\nimport { formatNumber, getUuid } from '../../util'\r\nimport { columnMap } from './constants/columns'\r\nimport {\r\n CASH_TRANSACTIONS,\r\n EMPTY_FORM_ENTRY,\r\n PORTFOLIO_CASH_SYMBOL,\r\n PORTFOLIO_DATE_FORMAT_DATA,\r\n PORTFOLIO_DATE_FORMAT_VIEW,\r\n PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n STOCK_TRANSACTIONS,\r\n} from './constants/general'\r\nimport * as api from './services/api'\r\nimport {\r\n ColumnId,\r\n FormErrors,\r\n PortfolioEntryBase,\r\n PortfolioEntryTransaction,\r\n PortfolioFormEntry,\r\n PortfolioFormGroup,\r\n PortfolioGroup,\r\n PortfolioInitData,\r\n PortfolioMapEntry,\r\n PortfolioMapSizeKey,\r\n PortfolioQuery,\r\n PortfolioSummary,\r\n PortfolioSymbolType,\r\n PortfolioTableView,\r\n PortfolioTransaction,\r\n PortfolioTransactionStake,\r\n PortfolioView,\r\n} from './types'\r\n\r\nexport enum PortfolioDataKey {\r\n Cash = 'cash',\r\n LongGainers = 'longGainers',\r\n LongLosers = 'longLosers',\r\n ShortGainers = 'shortGainers',\r\n ShortLosers = 'shortLosers',\r\n}\r\n\r\nconst industryLabelKey = 'description'\r\n\r\nconst groupPrefix = {\r\n long: 'Long',\r\n short: 'Short',\r\n}\r\n\r\nconst groupLabel = {\r\n gainers: 'Gainers',\r\n losers: 'Losers',\r\n}\r\n\r\nexport const LOCAL_STORAGE_KEY = 'portfolio-map'\r\n\r\ntype PortfolioMapData = { [key in PortfolioDataKey]: MapDataNode[] }\r\n\r\nexport interface PortfolioSavedSettings {\r\n tableView: PortfolioTableView\r\n showMap: boolean\r\n showIndustries: boolean\r\n subtype: MapSubtypeId\r\n tableOrder: string\r\n}\r\n\r\nexport const DEFAULT_SETTINGS: PortfolioSavedSettings = {\r\n tableView: PortfolioTableView.Ticker,\r\n showMap: true,\r\n showIndustries: true,\r\n subtype: MapSubtypeId.PortfolioGainPct,\r\n tableOrder: columnMap[ColumnId.Order].urlSort,\r\n}\r\n\r\n/**\r\n * Map param in query/local storage is string but we need a boolean\r\n */\r\nexport function parseBoolFromValue(value?: string | null) {\r\n try {\r\n if (value) {\r\n return Boolean(JSON.parse(value))\r\n }\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function getMapSettingFromLocalStorage() {\r\n const savedSettings = storage.getValue(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS)\r\n\r\n return { ...DEFAULT_SETTINGS, ...savedSettings }\r\n}\r\n\r\nexport function saveMapSettingToLocalStorage(\r\n key: keyof PortfolioSavedSettings,\r\n value: PortfolioSavedSettings[typeof key]\r\n) {\r\n storage.setValue(\r\n LOCAL_STORAGE_KEY,\r\n (prevState) => {\r\n const itemToStore = { ...prevState, [key]: value }\r\n // TODO: remove - temporary code to remove removed property from settings\r\n if ('customTickersOrder' in itemToStore) delete itemToStore.customTickersOrder\r\n return itemToStore\r\n },\r\n DEFAULT_SETTINGS\r\n )\r\n}\r\n\r\nconst SUMMARY_DEFAULT: PortfolioSummary = {\r\n tickers: 0,\r\n transactions: 0,\r\n shares: 0,\r\n lastChangePct: 0,\r\n valuePaid: 0,\r\n valueMarket: 0,\r\n valueMarketStocks: 0,\r\n valueMarketStocksPrev: 0,\r\n gainMarketUsd: 0,\r\n gainMarketPct: 0,\r\n gainTodayUsd: 0,\r\n}\r\n\r\nexport function getSummary(data: PortfolioGroup[]) {\r\n let allTransactions = 0\r\n let nonWatchTransactions = 0\r\n\r\n const computed = data.reduce((prev, current) => {\r\n allTransactions += current.transactions.length || 1\r\n nonWatchTransactions += current.transactions.length\r\n\r\n if (current.isDelisted) return prev\r\n\r\n const valueMarket = prev.valueMarket + current.valueMarket\r\n const valueMarketStocks =\r\n prev.valueMarketStocks + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarket)\r\n const valueMarketStocksPrev =\r\n prev.valueMarketStocksPrev + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarketPrev)\r\n const valuePaid = prev.valuePaid + current.valuePaid\r\n const lastChangePct = valueMarketStocksPrev <= 0 ? 0 : (valueMarketStocks / valueMarketStocksPrev - 1) * 100\r\n const gainMarketPct = valuePaid <= 0 ? 0 : (valueMarketStocks / valuePaid - 1) * 100\r\n\r\n return {\r\n ...prev,\r\n valueMarket: valueMarket,\r\n valueMarketStocks,\r\n valueMarketStocksPrev,\r\n lastChangePct,\r\n gainMarketPct,\r\n shares: prev.shares + current.shares,\r\n valuePaid: prev.valuePaid + current.valuePaid,\r\n gainMarketUsd: prev.gainMarketUsd + current.gainMarketUsd,\r\n gainTodayUsd: prev.gainTodayUsd + current.gainTodayUsd,\r\n }\r\n }, SUMMARY_DEFAULT)\r\n\r\n return {\r\n ...computed,\r\n transactions: nonWatchTransactions,\r\n allTransactions,\r\n tickers: data.length,\r\n }\r\n}\r\n\r\nfunction isMapTransaction(entry: PortfolioEntryTransaction): entry is PortfolioTransactionStake {\r\n return entry.shares > 0 || entry.type === PortfolioSymbolType.Cash\r\n}\r\n\r\n/**\r\n * Goes through all the items and merges them together so that we don’t end up\r\n * with multiple map tiles with same ticker & transaction\r\n */\r\nexport function flattenAndDedupe(data: PortfolioGroup[]) {\r\n const result: PortfolioMapEntry[] = []\r\n\r\n data.forEach((group) => {\r\n group.transactions.forEach((entry) => {\r\n if (!isMapTransaction(entry)) return\r\n\r\n const previouslyAdded = result.findIndex(\r\n (prev) =>\r\n prev.ticker === entry.ticker &&\r\n (entry.type === PortfolioSymbolType.Cash ? true : prev.transaction === entry.transaction)\r\n )\r\n\r\n if (previouslyAdded < 0) {\r\n const newEntry = { ...group, ...entry, transactions: undefined }\r\n delete newEntry.transactions\r\n result.push(newEntry)\r\n } else {\r\n const prevEntry = result[previouslyAdded]\r\n const valueMarket = prevEntry.valueMarket + entry.valueMarket\r\n const valuePaid = prevEntry.valuePaid + entry.valuePaid\r\n\r\n result[previouslyAdded] = {\r\n ...prevEntry,\r\n valuePaid,\r\n valueMarket,\r\n shares: prevEntry.shares + entry.shares,\r\n valueMarketPrev: prevEntry.valueMarketPrev + entry.valueMarketPrev,\r\n gainMarketUsd: prevEntry.gainMarketUsd + entry.gainMarketUsd,\r\n gainMarketPct: (valueMarket / valuePaid - 1) * 100,\r\n gainTodayUsd: prevEntry.gainTodayUsd + entry.gainTodayUsd,\r\n }\r\n }\r\n })\r\n })\r\n\r\n return Object.values(result)\r\n}\r\n\r\n/**\r\n * Checks if item is loser/gainer and returns the appropriate flag\r\n */\r\nfunction getEntryGroup(type: PortfolioSymbolType, gain: number, transaction: PortfolioTransaction) {\r\n if (type === PortfolioSymbolType.Cash) return PortfolioDataKey.Cash\r\n\r\n switch (transaction) {\r\n case PortfolioTransaction.Short: {\r\n return gain > 0 ? PortfolioDataKey.ShortGainers : PortfolioDataKey.ShortLosers\r\n }\r\n\r\n default:\r\n case PortfolioTransaction.Buy: {\r\n return gain >= 0 ? PortfolioDataKey.LongGainers : PortfolioDataKey.LongLosers\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates industry node with children\r\n */\r\nexport function getIndustries(industries: Record) {\r\n return Object.keys(industries).map((industry) => ({\r\n name: industry,\r\n children: industries[industry],\r\n }))\r\n}\r\n\r\n/**\r\n * Group items by key\r\n * @see https://stackoverflow.com/a/47385953\r\n */\r\nexport function groupByKey(list: Item[], key: keyof Item) {\r\n return list.reduce>((hash, obj) => {\r\n if (obj[key] === undefined) return hash\r\n return Object.assign(hash, { [obj[key] as string]: (hash[obj[key] as string] || []).concat(obj) })\r\n }, {})\r\n}\r\n\r\n/**\r\n * Creates long/short gainers/losers group with all the children, optionally grouping them by industry\r\n */\r\nfunction createGroup(key: PortfolioDataKey, data: PortfolioMapData, groupByIndustry = true) {\r\n let groupName = ''\r\n switch (key) {\r\n case PortfolioDataKey.Cash:\r\n groupName = 'Other'\r\n break\r\n default:\r\n const isLong = [PortfolioDataKey.LongGainers, PortfolioDataKey.LongLosers].includes(key)\r\n const isGainer = [PortfolioDataKey.LongGainers, PortfolioDataKey.ShortGainers].includes(key)\r\n const longPrefix = data.shortGainers.length || data.shortLosers.length ? `${groupPrefix.long}: ` : ''\r\n const shortPrefix = data.longGainers.length || data.longLosers.length ? `${groupPrefix.short}: ` : ''\r\n groupName = `${isLong ? longPrefix : shortPrefix}${isGainer ? groupLabel.gainers : groupLabel.losers}`\r\n break\r\n }\r\n\r\n if (groupByIndustry) {\r\n let children: Array<{ name: string; children: MapDataNode[] }> = []\r\n if (key === PortfolioDataKey.Cash && data[key].length) children = [{ name: 'Cash', children: data[key] }]\r\n else children = getIndustries(groupByKey(data[key], industryLabelKey))\r\n return { name: groupName, children }\r\n }\r\n\r\n return { name: groupName, children: data[key] }\r\n}\r\n\r\nexport function getPerfText(node: PortfolioMapEntry, subtype: MapSubtypeId) {\r\n switch (subtype) {\r\n case MapSubtypeId.PortfolioGainPct:\r\n return node.gainMarketPct\r\n case MapSubtypeId.PortfolioGainUsd:\r\n return node.gainMarketUsd\r\n case MapSubtypeId.PortfolioChangePct:\r\n return node.lastChangePct\r\n case MapSubtypeId.PortfolioChangeUsd:\r\n return node.gainTodayUsd\r\n }\r\n}\r\n\r\nfunction getPerfForTicker | any[]>(\r\n ticker: string,\r\n list?: ListType,\r\n group?: PortfolioDataKey\r\n) {\r\n if (Array.isArray(list)) {\r\n return list.find((item) => item.name === ticker && item.data?.group === group)?.perf\r\n }\r\n\r\n return list?.[ticker]\r\n}\r\n\r\n/**\r\n * Returns data for the map. This data is deduped and split into gainers/losers & industries\r\n */\r\nexport function getMapData({\r\n data,\r\n perfData,\r\n size,\r\n subtype,\r\n groupByIndustry,\r\n}: {\r\n data?: PortfolioGroup[]\r\n perfData?: PerfData\r\n size: PortfolioMapSizeKey\r\n subtype: MapSubtypeId\r\n groupByIndustry?: boolean\r\n}) {\r\n if (!data) return { hasData: false }\r\n\r\n const dedupedData = flattenAndDedupe(data)\r\n\r\n const isPortfolioSubtype = subtype.startsWith('portfolio')\r\n const parsedData = dedupedData.reduce(\r\n (prev: PortfolioMapData, current) => {\r\n const group = getEntryGroup(current.type, current.gainMarketPct / 100, current.transaction)\r\n // The map can’t display negative values so we need to Math.abs\r\n let value = Math.abs(size === PortfolioMapSizeKey.MarketValue ? current.valueMarket : current.gainMarketUsd)\r\n if (!Number.isFinite(value)) value = 0\r\n\r\n const subtypePerf = getPerfText(current, subtype)\r\n const perfText = isPortfolioSubtype ? subtypePerf : getPerfForTicker(current.ticker, perfData?.nodes, group)\r\n\r\n const entry = {\r\n name: current.ticker,\r\n value,\r\n perf: current.type === PortfolioSymbolType.Cash ? null : perfText ?? subtypePerf,\r\n additional:\r\n current.type === PortfolioSymbolType.Cash\r\n ? formatNumber(current.valueMarket)\r\n : getPerfForTicker(current.ticker, perfData?.additional, group),\r\n description: current.industry,\r\n data: { perfWeek: current.perfWeek, group },\r\n } as MapDataNode\r\n\r\n if (value > 0) {\r\n return { ...prev, [group]: [...prev[group], entry] }\r\n }\r\n\r\n return prev\r\n },\r\n {\r\n [PortfolioDataKey.Cash]: [],\r\n [PortfolioDataKey.LongGainers]: [],\r\n [PortfolioDataKey.LongLosers]: [],\r\n [PortfolioDataKey.ShortGainers]: [],\r\n [PortfolioDataKey.ShortLosers]: [],\r\n }\r\n )\r\n\r\n return {\r\n dataHash: `${groupByIndustry}-${size}-${subtype}-${\r\n isPortfolioSubtype || !perfData ? new Date().getTime() : perfData.hash\r\n }`,\r\n hasData: Object.values(parsedData).some((arr) => arr.length > 0),\r\n data: {\r\n name: 'Portfolio',\r\n children: Object.keys(parsedData)\r\n .map((key) => createGroup(key as PortfolioDataKey, parsedData, groupByIndustry))\r\n .filter((category) => category.children.length),\r\n } as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function parsePortfolioQuery(params: URLSearchParams, defaultPortfolioId: number) {\r\n const currentPortfolio = Number.parseInt(params.get(PortfolioQuery.PortfolioId) ?? '')\r\n const portfolioId =\r\n Number.isFinite(currentPortfolio) && currentPortfolio !== 0 ? currentPortfolio : defaultPortfolioId\r\n\r\n return {\r\n portfolioId,\r\n params: Object.fromEntries(params.entries()) as Record, // Re-export the original query as key/val\r\n view: params.get(PortfolioQuery.View) ?? PortfolioView.View,\r\n tableView: (params.get(PortfolioQuery.TableView) as PortfolioTableView) ?? undefined,\r\n map: parseBoolFromValue(params.get(PortfolioQuery.Map)) ?? getMapSettingFromLocalStorage().showMap,\r\n size: (params.get(PortfolioQuery.Size) ?? PortfolioMapSizeKey.MarketValue) as PortfolioMapSizeKey,\r\n subtype: (params.get(PortfolioQuery.Subtype) ?? getMapSettingFromLocalStorage().subtype) as MapSubtypeId,\r\n group: params.get(PortfolioQuery.Group)?.toUpperCase().split(',') ?? [],\r\n tickers: params.get(PortfolioQuery.Tickers)?.split(',') ?? [],\r\n }\r\n}\r\n\r\nexport function getColumnsByKeys(keys: ColumnId[]) {\r\n return keys.map((key) => columnMap[key])\r\n}\r\n\r\nexport function getFormattedDate(format = PORTFOLIO_DATE_FORMAT_DATA) {\r\n return `${dateFns.format(new Date(), format)}`\r\n}\r\n\r\nexport function validateEditRow(\r\n state: Partial,\r\n dateFormat = PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat = true\r\n) {\r\n const formErrors: FormErrors = {}\r\n\r\n if (state.ticker !== undefined && state.ticker.trim().length === 0) {\r\n formErrors.ticker = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (!state.date || !dateFns.isValid(parseInputAsDate({ input: state.date, format: dateFormat, checkFormat })))\r\n ) {\r\n formErrors.date = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.shares === undefined || isNaN(state.shares) || state.shares < 0)\r\n ) {\r\n formErrors.shares = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.price === undefined || isNaN(state.price) || state.price <= 0)\r\n ) {\r\n formErrors.price = true\r\n }\r\n\r\n return { isValid: Object.keys(formErrors).length === 0, errors: formErrors }\r\n}\r\n\r\nexport function parseInputAsDate({\r\n input,\r\n format = PORTFOLIO_DATE_FORMAT_VIEW,\r\n checkFormat = true,\r\n}: {\r\n input: Date | string\r\n format?: string\r\n checkFormat?: boolean\r\n}) {\r\n if (checkFormat && typeof input === 'string' && input.length !== format.length) {\r\n return new Date('Invalid Date')\r\n }\r\n if (input instanceof Date && dateFns.isValid(input)) return input\r\n\r\n return dateFns.parse(input.toString(), format, new Date())\r\n}\r\n\r\nexport const FORM_ENTRY_KEYS = Object.keys(EMPTY_FORM_ENTRY)\r\n\r\nfunction appendRowToFormData(serializer: URLSearchParams, row: Partial, index: number) {\r\n FORM_ENTRY_KEYS.forEach((key) => serializer.append(`${key}${index}`, `${row[key as keyof PortfolioEntryBase] ?? ''}`))\r\n}\r\n\r\nexport function getBulkEditData(\r\n data: Array,\r\n options: { resetCash?: boolean } = {}\r\n): Record {\r\n return data.reduce(\r\n (acc, row) => {\r\n const id = getUuid()\r\n const transactions =\r\n row.transactions.length === 0 || (options.resetCash && getSymbolType(row.ticker) === PortfolioSymbolType.Cash)\r\n ? [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n : row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\r\n return {\r\n ...acc,\r\n [id]: { ...row, id, transactions },\r\n }\r\n },\r\n {} as Record\r\n )\r\n}\r\n\r\nexport function serializeFormData<\r\n EntryType extends { ticker: string; transactions?: Array> },\r\n>(entries: EntryType[]) {\r\n const serializer = new URLSearchParams()\r\n entries\r\n .flatMap((entry) => {\r\n if (!entry.transactions || entry.transactions?.length === 0) {\r\n return getNewTransaction(entry.ticker, PortfolioTransaction.Watch)\r\n }\r\n\r\n return entry.transactions\r\n })\r\n .forEach((entry, index) => {\r\n if (entry.ticker.length) appendRowToFormData(serializer, entry, index)\r\n })\r\n\r\n return serializer\r\n}\r\n\r\nexport async function validateFormData(data: PortfolioFormGroup[], validateFields = true) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n try {\r\n const tickers = data.map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n return ticker.length ? ticker : api.QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const validatedTickers = await api.validateTickers(tickers)\r\n\r\n isValid = tickers.length === validatedTickers.length\r\n\r\n // Validate fields\r\n if (validateFields) {\r\n data.forEach((row, index) => {\r\n const validationResult = row.transactions.map((transaction) =>\r\n validateEditRow(transaction, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n )\r\n\r\n const hasInvalidEntries = validationResult.some((result) => !result.isValid)\r\n const isInvalidTicker = validatedTickers[index] !== true\r\n\r\n if (hasInvalidEntries || isInvalidTicker) {\r\n isValid = false\r\n }\r\n\r\n errors[row.id] = validationResult.map((result) => ({ ...result.errors, ticker: isInvalidTicker }))\r\n })\r\n }\r\n } catch {\r\n return {\r\n isValid: false,\r\n errors: {},\r\n }\r\n }\r\n\r\n return { isValid, errors }\r\n}\r\n\r\nexport function getNumberValue(value?: number) {\r\n if (value === undefined || isNaN(value)) return NaN\r\n return value\r\n}\r\n\r\nexport function getNewTransaction(ticker: string, transaction = PortfolioTransaction.Buy): PortfolioFormEntry {\r\n const symbolType = getSymbolType(ticker)\r\n const allowedTransactions = getTransactionsForSymbolType(symbolType)\r\n\r\n return {\r\n ...EMPTY_FORM_ENTRY,\r\n uuid: getUuid() as string,\r\n ticker,\r\n type: getSymbolType(ticker),\r\n date: getFormattedDate(PORTFOLIO_DATE_FORMAT_DATA),\r\n transaction: [PortfolioTransaction.Watch, ...allowedTransactions].includes(transaction)\r\n ? transaction\r\n : allowedTransactions[0],\r\n shares: transaction === PortfolioTransaction.Watch || symbolType === PortfolioSymbolType.Cash ? 0 : undefined,\r\n price: transaction === PortfolioTransaction.Watch ? 0 : undefined,\r\n }\r\n}\r\n\r\nexport function getPortfolioInitData() {\r\n let returnData = { isInitData: false, initData: api.EMPTY_RESPONSE }\r\n const initDataElement = document.getElementById('portfolio-init-data')\r\n if (initDataElement) {\r\n const initData = parseInitData('portfolio-init-data')\r\n initDataElement.remove()\r\n returnData = { isInitData: !!initData, initData: initData ?? api.EMPTY_RESPONSE }\r\n }\r\n return returnData\r\n}\r\n\r\nconst EMPTY_TRANSACTION = { transaction: PortfolioTransaction.Watch, index: 0, price: 0 }\r\n\r\nexport function getTradesStructureData(portfolioData: PortfolioGroup[]) {\r\n return portfolioData\r\n .flatMap((ticker) => {\r\n const transactions = [...ticker.transactions]\r\n if (transactions.length === 0) {\r\n transactions.push(EMPTY_TRANSACTION as unknown as PortfolioEntryTransaction)\r\n }\r\n return transactions.map((transaction) => {\r\n const obj = { ...ticker } as Omit & {\r\n transactions?: PortfolioEntryTransaction[]\r\n }\r\n delete obj.transactions\r\n return { ...obj, ...transaction }\r\n })\r\n })\r\n .sort((a, b) => a.id - b.id)\r\n}\r\n\r\nexport function getSymbolType(symbol?: string) {\r\n if (symbol?.toUpperCase() === PORTFOLIO_CASH_SYMBOL) return PortfolioSymbolType.Cash\r\n\r\n return PortfolioSymbolType.Stock\r\n}\r\n\r\nexport function isStockTransaction(transaction: PortfolioTransaction) {\r\n return STOCK_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function isCashTransaction(transaction: PortfolioTransaction) {\r\n return CASH_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function getTransactionsForSymbolType(symbolType: PortfolioSymbolType) {\r\n switch (symbolType) {\r\n case PortfolioSymbolType.Cash:\r\n return CASH_TRANSACTIONS\r\n default:\r\n return STOCK_TRANSACTIONS\r\n }\r\n}\r\n\r\nexport function getPortfolioRefreshInterval() {\r\n return getMapsRefreshInterval({\r\n base: PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n free: PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n })\r\n}\r\n"],"names":["module","exports","white","black","inherit","transparent","current","finviz","blue","gray","red","orange","amber","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","CanvasHover","Component","constructor","arguments","_defineProperty","visibleTickers","activeNode","undefined","sparklinesData","MapStore","getHoveredNode","this","props","mapNodeId","getSparklines","setState","getVisibleTooltipTickers","d","additional","perf","treemap","formatValue","toFixed","e","state","marginLeft","el","document","getElementById","hoverWidth","scrollWidth","hoverHeight","scrollHeight","availWidth","documentElement","clientWidth","availHeight","clientHeight","clientX","style","left","top","Math","max","clientY","componentDidMount","addChangeListener","_onChange","addEventListener","_onMouseMove","componentWillUnmount","MapActions","loadSparklinesCancel","removeChangeListener","removeEventListener","componentDidUpdate","_","prevState","_prevState$activeNode","name","includes","push","tickersToLoad","filter","ticker","length","loadSparklineData","mapType","render","_d$data$data$nameOver","_d$data","hasSparkline","price","colorScale","type","children","parent","node","sort","a","b","dx","dy","isSmall","title","MapTypeId","World","_jsxs","id","_jsx","className","backgroundColor","data","nameOverride","Sparkline","width","height","_formatPerf","classnames","description","colSpan","map","c","_c$data$data$nameOver","_c$data","color","Canvas","React","event","super","zoom","initialized","dataHash","_cache","bind","mapActionCreators","_setOnPublish","_getPublishCanvas","_initialize","renderFromCache","_canvasContext","renderHover","_hoverContext","_setCanvasSize","_loadTreemapGeoBackground","then","_updateCanvasCaches","_this$_hoverCanvas$cu","_hoverCanvas","_onWheel","alt","legend","hover","ref","_canvas","classNames","onMouseDown","_onMouseDown","onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","scale","context","x","y","translate","nearestSize","getNearestSize","_createCache","save","drawImage","canvas","restore","mouseDown","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","lastPanY","_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","passive","_getTreemapGeoBackground","getIsSmall","FinvizSettings","hasDarkTheme","image","worldBackground","loadImage","default","oldScale","oldTranslate","cacheCanvas","createElement","cacheContext","translateAbs","renderCanvas","resetSparklineData","currentZoom","callback","animationFrameId","window","cancelAnimationFrame","remainingLevels","level","requestAnimationFrame","_queueUpdateCache","scales","currentScale","_hover$border","settings","hoveredNode","clearRect","apply","showIndustryHeader","LayoutGenerator","isNodeHeaderVisible","depth","NodeDepth","Industry","industryOffset","padding","smallIndustryPadding","Sector","header","strokeStyle","border","lineWidth","strokeRect","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","round","stepWidth","indexOf","format","scaleStepFormat","Portfolio","ETFHoldings","isWidget","minWidth","textShadow","toString","concat","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","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","label","ariaLabel","theme","items","onChange","selectTheme","dark","button","rounding","rightContent","Icon","popover","light","getMapSelectTheme","Select","placeholder","defaultValue","listProps","filterItems","input","stock","toUpperCase","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","scrollTo","isMobile","isIpad","Share","uploadImage","useMutation","api","onShareClick","async","mapStore","getPublishCanvas","drawShareMap","getFormattedDateString","mutate","ShareDialog","disabled","useZoomButtons","zoomOut","ev","zoomIn","Zoom","handlers","_Fragment","SVG","Topbar","navContent","mapControls","FALLBACK_PERF_RESPONSE","MapSubtypeId","DayPerf","hash","MAP_SUBTYPES_COMPANIES_BY_ID","ScaleId","WeekPerf","MonthPerf","ThreeMonthPerf","SixMonthPerf","YearPerf","YearToDatePerf","RelativeVolume","PriceToEarnings","ForwardPriceToEearnings","PriceEarningsToGrowth","PriceToSellsRatio","PriceToBookRatio","DividendYield","EPSGrowth5y","FloatShort","AnalystRecommendation","EarningsPerf","EarningsDate","MAP_SUBTYPES_ETF_BY_ID","MAP_SUBTYPES_COMPANIES","Object","values","MAP_SUBTYPES_ETF","MAP_TYPES","pageTitle","subtypes","SectorFull","nameShort","ETF","MAP_TYPE_SCREENER","Screener","MAP_TYPE_ETF_HOLDINGS_WIDGET","MAP_MIN_WIDTH","MAP_MIN_HEIGHT","SECTOR_MIN_HEIGHT","LEGEND_HEIGHT","LARGE_MAP_HEIGHT_RATIO","SMALL_MAP_GEO_HEIGHT_RATIO","SMALL_MAP_HEIGHT_RATIO","LARGE_NODE_SIZE","LARGE_NODE_MIN_HEIGHT","ORDER_SP500","Technology","Financial","Healthcare","Industrials","Energy","Utilities","Semiconductors","ORDER_SEC_ALL","ORDER_ETF","US","Global","International","Commodity","Strategy","Forex","ORDER_SCREENER","ORDER_WORLD","Ireland","Spain","France","Belgium","Netherlands","Switzerland","China","Japan","India","Taiwan","Colombia","Chile","Argentina","WORLD_INDUSTRIES","countries","scaleMinMax","_5","_10","_15","_20","_25","_relvol","_pe","_fpe","_peg","_ps","_pb","_div","_eps5y","_short","_rec","_earndate","_portfolioPct","_portfolioUsd","Settings","right","bottom","tailwindColors","fontSize","fontWeight","margin","scaleFontSizes","fontSizePadding","fontSizePairs","SettingsSmall","SettingsSmallDark","SettingsSmallGeo","SettingsSmallGeoDark","SettingsScreener","SettingsScreenerDark","useMapData","cacheBuster","mapBaseData","initialPerf","fetchBaseData","fetchPerfData","queryClient","useQueryClient","dataVersion","prevType","perfData","setQueryData","baseDataQuery","useQuery","queryKey","queryFn","initialData","cacheTime","Infinity","staleTime","perfDataQuery","getQueryData","version","keepPreviousData","refetchInterval","onSuccess","location","reload","restoredData","useMapType","_MAP_TYPES$find","_type$subtypes$find","query","URLSearchParams","useLocation","search","typeFromQuery","subtypeFromQuery","find","t","_node$dx","_node$dy","deltaX","x1","x0","y1","y0","constants","showHeader","arr","_node$children","isVisible","isNodeVisible","filterVisibleNodes","Root","smallIndustryGeoPadding","order","heightB","minSectorHeight","hasOwnProperty","d3","sum","_getHierarchySort","paddingFn","_getPaddingGeo","_getPadding","tile","ratio","paddingTop","paddingRight","paddingBottom","paddingLeft","industryIndex","industryX","industryY","industryWidth","industryHeight","countriesRoots","_getIndustriesRoots","root","_rootsToRoot","hierarchy","_getHierarchy","treemapNodes","_getTreemap","each","brazil","colombia","brazilWidth","colombiaWidth","_d$parent","descendants","getExportData","mapRoot","_this$layout","stringified","JSON","stringify","key","parse","getLayoutData","_this$layout2","_generateSP500","_generateFull","_generateScreener","_generateWorld","_generateETF","forEach","_transformNode","assign","roots","duplicateTickers","some","_getSectorsRoots","s","_generateLayout","recountSectors","treemapHeight","calculateHeight","recalculateHeight","financialSector","technologySector","financialHeight","technologyHeight","eachAfter","_class","getSizeRatio","apiRequest","rev","mapPerf","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","LOAD_SPARKLINES_FAILED","trailing","RESET_SPARKLINE_DATA","SET_HOVERED_NODE","_lastSparklinesReques3","_lastSparklinesReques4","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","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","zoomElement","translateExtent","behavior","extent","newZoom","mapCenter","zoomSelection","scaleTo","getTransform","args","Array","isArray","translateBy","translateTo","scaleExtent","len","fontFamily","getTextFontFamily","_props$mapNodeId","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","PortfolioPct","PortfolioUsd","minValuePerf","abs","_node$data$perfWeek","_node$data","perfWeek","maxValuePerf","_node$data$perfWeek2","_node$data2","perfMax","minValueNode","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","getParentSector","nodeName","parentSector","updatedNode","_node$data3","_resetIndustryPerf","weightedPriceSum","marketCapSum","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","topPadding","isFirstNodeInIndustry","getNodeText","_node$additional","_this$settings$fontSi","_this$settings$fontSi2","fontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","getLongestText","nodeNameLineHeight","stepFormat","perfText","getSymbolType","PortfolioSymbolType","Cash","fontPairs","allowedSize","perfFontSize","perfLineHeight","textHeight","topOffset","text","maxWidth","widths","_widths$text$i","substring","actualZoomLevel","_stepFormat$replace","_stepFormat","floatValue","parseFloat","absValue","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","offset","font","fillText","getSpacingWithDefaults","spacing","_spacing$top","_spacing$right","_spacing$bottom","_spacing$left","_ref2","_config$height","_config$border","parrentPadding","_ref3","rect","currentTarget","getBoundingClientRect","getSettingsForMapType","restoreDataKeys","row","newRow","getMapData","mapData","_mapData$children","_sector$children","_industry$children","company","splitData","filename","fetch","credentials","mode","json","getRatioSizeForWidth","mapWidth","getSize","element","canvasWrapper","has","parsedRatio","wrapper","removeProperty","elementHeight","innerHeight","newWidth","calculateWidth","getSizeForExpandedMap","scrollbarWidth","innerWidth","getSizeRatioBasedMap","getDefaultZoomLevels","test","navigator","userAgent","parseInitDataAsPerf","MAX_SPARKLINES","HOVER_TOP_ROW_HEIGHT","HOVER_BORDER_WIDTH","ROW_HEIGHT","ROW_HEIGHT_SMALL","ROW_HEIGHT_BREAKPOINT","industryTickers","rowHeight","visibleRows","open","ScreenerQuery","View","ScreenerView","Overview","flatMap","Tickers","toLowerCase","Filters","MapsPollingIntervalInMs","getMapsRefreshInterval","base","Elite","reduced","EliteStocksReduced","free","Free","customRefreshInterval","hasUserPremium","isStockFastRefreshAvailable","ScreenerFilter","ScreenerAddtionalQuery","eventListenerRegister","eventName","handler","textContent","innerText","ScreenerRenderCustomModal","select","getAttribute","customWrapper","display","options","_select$getAttribute$","_select$getAttribute","split","option","optionEl","ScreenerGetOptionsList","DATE_REGEX","getIsOptionDateRange","from","to","isValidFromDate","isValidToDate","Date","getTime","getInitialDateFromSelectedValues","selectedValues","initialDate","date","dateRangeToFilterString","getQueryForView","view","_query$get$match","_query$get","allowedParams","baseQuery","allowList","keys","delete","originalView","match","parseScreenerFilters","filtersString","fromEntries","lastUnderscore","lastIndexOf","stringifyScreenerFilters","filters","entries","String","rangesToFilter","ranges","rangeSuffixes","delimiter","rangeDelimiter","reduce","_rangeSuffixes$index","rangeStr","currentFilter","dialogState","useDialogState","show","Dialog","DialogHeader","DialogBody","ShareDialogBody","isError","isLoading","DialogFooter","as","DialogDismiss","ErrorView","showRefresh","message","src","imgUrl","CopyToClipboard","Heading","shareUrl","bottomLeftContent","FacebookShareButton","url","FacebookIcon","TwitterShareButton","via","TwitterIcon","shouldComponentUpdate","nextProps","line","curve","transform","PropTypes","isRequired","canvasEl","getScaleRatio","logo","logoBase64","textWidth","measureText","divider","toDataURL","redGreenGradient","greenRedGradient","reverse","redGradient","greenGradient","redGreenGradientBubbles","bubbleGradients","PREMARKET_AFTERMARKET_HOURS","hasPremarket","hasAftermarket","bufferMinutes","getMinutes","hours","minutes","getDate","dayOfWeek","getDay","currentDayMinutes","getHours","premarketMinutes","aftermarketMinutes","isWeekend","isOpen","isClosed","Promise","resolve","reject","Image","onload","onerror","_window$devicePixelRa","devicePixelRatio","AdsProvider","getAdsProvider","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag2","_window2","pathname","freestarPageView","_window$freestar","freestar","queue","trackPageview","RedGreenText","rightClass","hasValue","showArrow","RedGreenMultiline","child","Table","_props$cellPadding","cellPadding","TableHead","TableBody","TableFooter","TableAlign","TableCell","isFirst","isLast","align","Left","hasPadding","hasLeading","Center","Right","TABLE_HEADER_DEFAULT_ELEMENT","TableSortIndicator","isActive","invisible","TableHeader","asComponent","hasHover","componentToRender","TableHeaderSortable","isDisabled","TableRow","isHoverable","isRounded","SortDirection","getDefaultSort","columns","defaultSort","column","Ascending","foundColumn","isSortByShape","getDefaultSortFromUrl","idKey","isDesc","startsWith","queryParam","Descending","useTableSort","valueGetter","setSort","changeSort","newSort","prevSort","_prevSort$column","useSortData","sortBy","useTableSortWithUrl","_searchParams$get","urlPersistKey","sortedData","changeSortState","searchParams","setSearchParams","useSearchParams","defaultSortRef","prev","_newParams$get","newParams","previousOrder","isDescOrder","saveSortToUrl","preventScrollReset","delay","timeout","throwOnTimeout","timeoutComponent","visible","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","failedTimeout","Error","xmlns","showContact","href","link","toContact","LoadingScreen","NotificationPosition","NotificationContext","hide","useNotification","NotificationWrapper","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","getVisualViewport","visualViewport","positionClass","_notification$options","position","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","Ariakit","role","unmountOnHide","onClose","modal","backdrop","focusable","hideOnEscape","hideOnInteractOutside","autoFocusOnShow","autoFocusOnHide","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","Notification","closeText","actions","timeoutInMs","timeoutId","_sortBy$hasOwnPropert","getDefaultValueGetter","getValueForSort","sortByColumn","_visualViewport$width","_visualViewport$heigh","_visualViewport$scale","_visualViewport$offse","_visualViewport$offse2","unscaledWidth","unscaledHeight","onScroll","_window$visualViewpor","_window$visualViewpor2","handleChange","_window$visualViewpor3","_window$visualViewpor4","columnMap","freeze","ColumnId","Spacer","urlSort","renderColumn","Ticker","kind","RowKind","Transaction","Summary","Group","Trade","Stock","isDelisted","stopPropagation","Company","transactions","CostAvg","transaction","PortfolioTransaction","Watch","formatNumber","costAvg","LastClose","lastClose","LastChange","prevClose","lastChange","showPlusSign","fractions","LastChangePct","lastChangePct","LastVolume","lastVolume","TRANSACTION_LABEL","dateFns","PORTFOLIO_DATE_FORMAT_VIEW","Shares","shares","Price","ValuePaid","valuePaid","Amount","ValueMarket","valueMarket","GainMarketUsd","gainMarketUsd","GainMarketPct","gainMarketPct","GainMarketCombined","GainTodayUsd","gainTodayUsd","GainTodayCombined","Order","PORTFOLIO_CASH_SYMBOL","PORTFOLIO_DATE_FORMAT_DATA","PORTFOLIO_REFRESH_INTERVAL_ELITE","PORTFOLIO_REFRESH_INTERVAL_FREE","Buy","Short","CashDeposit","CashWithdraw","CashIncome","CashFee","STOCK_TRANSACTIONS","CASH_TRANSACTIONS","EMPTY_FORM_ENTRY","EMPTY_TRANSACTION","valueMarketPrev","gainMarket","PORTFOLIO_INPUT_NAME","PORTFOLIO_INPUT_EMPTY_ERROR","PORTFOLIO_INPUT_EXISTS_ERROR","TICKERS_INPUT_NAME","TICKERS_INPUT_FORMAT_TIP","PortfolioSizeEnum","EMPTY_RESPONSE","limit","selectedPortfolio","limitTransactions","portfolio","news","portfolios","portfolioData","portfolioId","pid","deletePortfolio","portfolioEntry","QUOTE_INVALID_TICKER_REQUEST","QUOTE_INVALID_TICKER_RESPONSE","QUOTE_TICKER_DELIMITER","quoteData","Html","validateTickers","_response$tickers$spl","_response$specialSymb","response","parsedTickers","specialTickers","specialSymbols","recalculatePortfolio","rows","totalValue","numberOfTransactions","getSanitizedTicker","trim","pricePerColumn","prices","_window$Sentry","Sentry","captureMessage","extra","requestTickers","requestTickersLength","responseLength","tickerPrices","tickerPrice","NaN","calculatedPrice","calculatedShares","submitForm","ErrorSource","portfolioTickers","portfolioName","portfolio_name","submitEditForm","reorderPortfolios","PortfolioQuery","PortfolioMapSizeKey","PortfolioView","PortfolioTableView","PortfolioTableViewLabels","ActionKind","PortfolioDataKey","industryLabelKey","groupPrefix","long","short","groupLabel","gainers","losers","LOCAL_STORAGE_KEY","DEFAULT_SETTINGS","tableView","showMap","showIndustries","PortfolioGainPct","tableOrder","parseBoolFromValue","Boolean","getMapSettingFromLocalStorage","savedSettings","storage","saveMapSettingToLocalStorage","itemToStore","customTickersOrder","SUMMARY_DEFAULT","valueMarketStocks","valueMarketStocksPrev","getSummary","allTransactions","nonWatchTransactions","flattenAndDedupe","group","entry","isMapTransaction","previouslyAdded","findIndex","newEntry","prevEntry","getIndustries","groupByKey","list","obj","getPerfForTicker","_list$find","item","_item$data","groupByIndustry","hasData","dedupedData","isPortfolioSubtype","parsedData","gain","ShortGainers","ShortLosers","LongGainers","LongLosers","getEntryGroup","MarketValue","subtypePerf","PortfolioGainUsd","PortfolioChangePct","PortfolioChangeUsd","getPerfText","groupName","isLong","isGainer","longPrefix","shortGainers","shortLosers","shortPrefix","longGainers","longLosers","createGroup","category","parsePortfolioQuery","params","defaultPortfolioId","_params$get","_params$get2","_parseBoolFromValue","_params$get3","_params$get4","_params$get$toUpperCa","_params$get5","_params$get$split","_params$get6","currentPortfolio","parseInt","PortfolioId","TableView","Size","Subtype","getColumnsByKeys","getFormattedDate","validateEditRow","dateFormat","checkFormat","formErrors","parseInputAsDate","isValid","errors","FORM_ENTRY_KEYS","getBulkEditData","acc","resetCash","getNewTransaction","uuid","serializeFormData","serializer","_entry$transactions","_row","append","appendRowToFormData","validateFormData","validateFields","validatedTickers","validationResult","hasInvalidEntries","isInvalidTicker","getNumberValue","symbolType","allowedTransactions","getTransactionsForSymbolType","getPortfolioInitData","returnData","isInitData","initData","initDataElement","parseInitData","getTradesStructureData","symbol","getPortfolioRefreshInterval"],"sourceRoot":""}