{"version":3,"file":"static/js/800.ff5797ab.chunk.js","mappings":"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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,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEJC,UAAW,QAg/BFO,EAAiD,CAC1D,CAACC,EAAAA,GAAQC,iBAAkBX,EAC3B,CAACU,EAAAA,GAAQE,SAAUZ,EACnBa,GAAIb,EACJc,IAAKd,EACLe,IAAKf,EACLgB,IAAKhB,EACLiB,IAAKjB,EACLkB,QA97HiB,CACjBjB,OAAQ,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEJC,UAAW,WAo9FXiB,IAAKhB,EACLiB,KAAMjB,EACNkB,KAAMlB,EACNmB,IAAKnB,EACLoB,IAAKpB,EACLqB,KAAMjB,EACNkB,OAAQzB,EACR0B,OAAQpB,EACRqB,KAAM3B,EACN4B,UA39FqB,CACrB3B,OAAQ,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEJC,UAAW,WAi/DX2B,cAAe7B,EACf8B,cAAe9B,GA0BN+B,GAtBRrB,EAAAA,GAAQC,gBACRD,EAAAA,GAAQE,QAphIiB,CAC1BX,OAAQ,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEJC,UAAW,YCxBF8B,EAAmE,CAC5E,EAAG,CACC,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,GACLC,EA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MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,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,OAEP,GAAI,CACA,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,KACLnD,EAAG,MACHC,EAAG,IACHC,EAAG,KACHC,EAAG,IACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,IACHC,EAAG,MACHC,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,MAEP,GAAI,CACA,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH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,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,IACLnD,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,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,OAEP,GAAI,CACA,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,IACLnD,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACH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","sources":["components/Heatmap/assets/colors.js","components/Loading.tsx","components/Heatmap/shared/gradients.ts","components/Heatmap/constants/font.ts","components/Heatmap/zoom.ts","components/Heatmap/treemap.ts","components/Heatmap/components/CanvasHover.tsx","components/Heatmap/components/Legend.tsx","components/Heatmap/components/Canvas.tsx","components/Heatmap/shared/loadImage.ts","components/Heatmap/components/Map.tsx","components/Heatmap/components/QueryClientContext.tsx","components/Heatmap/components/MapContext.tsx","components/Heatmap/constants/constants.ts","components/Heatmap/constants/generator.ts","components/Heatmap/constants/settings.ts","components/Heatmap/services/api.ts","components/Heatmap/components/Topbar/Expand.tsx","components/Heatmap/components/Topbar/Save-image.tsx","components/Heatmap/shared/drawShareMap.ts","components/Heatmap/index.tsx","components/Heatmap/hooks/use-map-type.ts","components/Heatmap/hooks/use-map-data.ts","components/Heatmap/layout-generator.tsx","components/Heatmap/services/mainapi.ts","components/Heatmap/shared/isMobile.ts","components/Heatmap/shared/retinafy.ts","components/Heatmap/store/action-creators.ts","components/Heatmap/store/app-dispatcher.ts","components/Heatmap/store/constants.ts","components/Heatmap/store/store.ts","components/Heatmap/store/map-store.ts","components/Heatmap/types.ts","components/Heatmap/screener/utils.ts","components/Heatmap/utils.ts"],"sourcesContent":["// Keep in sync with charts repository colors.js file in: app/constants/colors.js\n\nmodule.exports = {\n white: '#fff',\n black: '#000',\n inherit: 'inherit',\n transparent: 'transparent',\n current: 'currentColor',\n customApp: {\n 'blue-gray': '#262931',\n blue: '#4fa4f4',\n },\n gray: {\n 50: '#f3f3f5',\n 100: '#dedfe5',\n 200: '#c3c6d0',\n 300: '#a3a8b9',\n 400: '#868ea5',\n 500: '#676f85',\n 600: '#4c5263',\n 700: '#353945',\n 750: '#2c303b',\n 800: '#22262f',\n 900: '#14161d',\n },\n red: {\n 50: '#fef0f0',\n 100: '#fcd6d6',\n 200: '#fbb4b4',\n 300: '#fd8487',\n 400: '#fb5057',\n 500: '#d91e2b',\n 600: '#9f1f2a',\n 700: '#691f24',\n 800: '#45171a',\n 900: '#280e0f',\n },\n orange: {\n 50: '#fef2eb',\n 100: '#fdd9c5',\n 200: '#fab889',\n 300: '#ef9323',\n 400: '#ca7b14',\n 500: '#a0600e',\n 600: '#79460a',\n 700: '#583006',\n 800: '#3d1e03',\n 900: '#261101',\n },\n amber: {\n 50: '#fef2e7',\n 100: '#fedab5',\n 200: '#fbba56',\n 300: '#de9c1a',\n 400: '#bb830f',\n 500: '#956600',\n 600: '#704b00',\n 700: '#4f3400',\n 800: '#372200',\n 900: '#211300',\n },\n tangerine: {\n 50: '#fef1ee',\n 100: '#fed8ce',\n 200: '#fdb5a0',\n 300: '#fc8955',\n 400: '#db6e35',\n 500: '#b35314',\n 600: '#814021',\n 700: '#5a2d18',\n 800: '#3c1e12',\n 900: '#291711',\n },\n yellow: {\n 50: '#fdf2df',\n 100: '#fcdc86',\n 200: '#f3c736',\n 300: '#cda30b',\n 400: '#b08900',\n 500: '#8b6a00',\n 600: '#664e21',\n 700: '#46371e',\n 800: '#2f2516',\n 900: '#1b150d',\n },\n brightYellow: {\n 50: '#fff699',\n 100: '#fff200',\n },\n lime: {\n 50: '#ebfad6',\n 100: '#caec90',\n 200: '#aad547',\n 300: '#8db61e',\n 400: '#769913',\n 500: '#5b7800',\n 600: '#435900',\n 700: '#2e3e00',\n 800: '#1e2a00',\n 900: '#111900',\n },\n green: {\n 50: '#e7f7e8',\n 100: '#beeac1',\n 200: '#86d895',\n 300: '#34c062',\n 400: '#00a449',\n 500: '#19803d',\n 600: '#265d35',\n 700: '#1e4027',\n 800: '#162b1b',\n 900: '#0d1810',\n },\n emerald: {\n 50: '#ddfaee',\n 100: '#a2f0d2',\n 200: '#4dddaf',\n 300: '#25be93',\n 400: '#1d9f7b',\n 500: '#157e60',\n 600: '#035d47',\n 700: '#004139',\n 800: '#002c22',\n 900: '#001a13',\n },\n teal: {\n 50: '#e0f8fc',\n 100: '#9beef7',\n 200: '#4fd8e5',\n 300: '#27b9c4',\n 400: '#109ba5',\n 500: '#007c83',\n 600: '#005b62',\n 700: '#004045',\n 800: '#002b2e',\n 900: '#00191b',\n },\n blue: {\n 50: '#ebf4fe',\n 100: '#cae2fc',\n 200: '#9bcbfa',\n 300: '#57aefb',\n 400: '#2f91ef',\n 500: '#306dca',\n 600: '#2f5091',\n 700: '#263766',\n 800: '#1b2542',\n 900: '#101527',\n },\n violet: {\n 50: '#f4f2fe',\n 100: '#e1dbfd',\n 200: '#c9befc',\n 300: '#ad9bfb',\n 400: '#9978f9',\n 500: '#7c51e7',\n 600: '#5e36b8',\n 700: '#402979',\n 800: '#2a1e4e',\n 900: '#18122c',\n },\n purple: {\n 50: '#f9f1fe',\n 100: '#eed8fd',\n 200: '#e1b6fc',\n 300: '#d38bfb',\n 400: '#c85bf9',\n 500: '#ae27e0',\n 600: '#8514ac',\n 700: '#60077e',\n 800: '#44005a',\n 900: '#2a003a',\n },\n pink: {\n 50: '#fef1f4',\n 100: '#fdd6e1',\n 200: '#fcb2c7',\n 300: '#f984aa',\n 400: '#f25090',\n 500: '#cd2a74',\n 600: '#9d1658',\n 700: '#700c42',\n 800: '#4e052b',\n 900: '#32011a',\n },\n}\n","import Loader from \"./Loader\"\n\nexport const Loading = () => {\n return
\n \n
\n}","import { ScaleId } from '../types'\n\nexport interface GradientDefinition {\n colors: string[]\n nullColor: string\n}\n\nconst redGreenGradientSmall = {\n colors: [\n '#e01427',\n '#ce252b',\n '#bb2f30',\n '#aa3534',\n '#993938',\n '#853c3c',\n '#743d3f',\n '#414554',\n '#3e5f50',\n '#3f704f',\n '#3f814d',\n '#3c924a',\n '#36a446',\n '#2bb642',\n '#12c93b',\n ],\n nullColor: '#2f323d',\n}\nexport const redGreenGradient = {\n colors: [\n '#f63538',\n '#ee373a',\n '#e6393b',\n '#df3a3d',\n '#d73c3f',\n '#ce3d41',\n '#c73e43',\n '#bf4045',\n '#b64146',\n '#ae4248',\n '#a5424a',\n '#9d434b',\n '#94444d',\n '#8b444e',\n '#824450',\n '#784551',\n '#6f4552',\n '#644553',\n '#5a4554',\n '#4f4554',\n '#414554',\n '#3f4c53',\n '#3d5451',\n '#3b5a50',\n '#3a614f',\n '#38694f',\n '#366f4e',\n '#35764e',\n '#347d4e',\n '#32844e',\n '#31894e',\n '#31904e',\n '#30974f',\n '#2f9e4f',\n '#2fa450',\n '#2faa51',\n '#2fb152',\n '#2fb854',\n '#30be56',\n '#30c558',\n '#30cc5a',\n ],\n nullColor: '#2f323d',\n}\nconst greenRedGradient = { colors: redGreenGradient.colors.slice().reverse(), nullColor: redGreenGradient.nullColor }\nconst redGradient = { colors: redGreenGradient.colors.slice(0, 22).reverse(), nullColor: redGreenGradient.nullColor }\nconst greenGradient = { colors: redGreenGradient.colors.slice(21), nullColor: redGreenGradient.nullColor }\nconst blueGradient = {\n colors: [\n '#3d4251',\n '#3d4250',\n '#3d4250',\n '#3e4251',\n '#3e4251',\n '#3d4350',\n '#3d4350',\n '#3d4350',\n '#3e4351',\n '#3e4350',\n '#3d4351',\n '#3d4352',\n '#3f4353',\n '#3f4353',\n '#3f4453',\n '#3f4554',\n '#3e4354',\n '#3e4354',\n '#3f4454',\n '#3f4454',\n '#3f4454',\n '#3f4454',\n '#3f4454',\n '#3f4555',\n '#3f4556',\n '#3f4457',\n '#3f4457',\n '#3f4457',\n '#3f4557',\n '#3f4657',\n '#3f4657',\n '#3f4657',\n '#3f4557',\n '#3e4557',\n '#3e4558',\n '#3f465a',\n '#3f4659',\n '#3f4759',\n '#3f4759',\n '#3f475a',\n '#3f4759',\n '#3f465a',\n '#3f465a',\n '#3f4759',\n '#3f475b',\n '#40475b',\n '#40475b',\n '#40465b',\n '#40465c',\n '#40465d',\n '#40485d',\n '#40485c',\n '#40475c',\n '#40465c',\n '#40465c',\n '#40465c',\n '#40485d',\n '#40485d',\n '#40485e',\n '#40485f',\n '#40495e',\n '#40495e',\n '#40485e',\n '#40485f',\n '#40495e',\n '#40485e',\n '#40485f',\n '#404960',\n '#404960',\n '#404860',\n '#404861',\n '#404a62',\n '#404962',\n '#404962',\n '#404a62',\n '#404a62',\n '#404861',\n '#404961',\n '#404a63',\n '#404a64',\n '#404a65',\n '#404b64',\n '#404b64',\n '#404a65',\n '#404a65',\n '#404a65',\n '#404a65',\n '#404b65',\n '#404b65',\n '#414c65',\n '#424c65',\n '#424b65',\n '#414b66',\n '#414b67',\n '#414b67',\n '#414c67',\n '#424b67',\n '#424c67',\n '#414c67',\n '#414b67',\n '#414c67',\n '#414c67',\n '#414c69',\n '#414c6a',\n '#414c6a',\n '#414c6a',\n '#414d6a',\n '#424e6a',\n '#414d6a',\n '#414d6a',\n '#414d6a',\n '#414d6a',\n '#414d6a',\n '#414d6b',\n '#414d6c',\n '#414e6c',\n '#414f6c',\n '#414e6c',\n '#414d6c',\n '#414d6c',\n '#414e6c',\n '#424e6d',\n '#424e6d',\n '#414f6d',\n '#424f6f',\n '#414e6f',\n '#414e6f',\n '#424f70',\n '#414f6f',\n '#414f6f',\n '#414f6f',\n '#414e6f',\n '#414e6f',\n '#414f6f',\n '#414f6f',\n '#414f71',\n '#414f72',\n '#425073',\n '#425173',\n '#415072',\n '#425173',\n '#425173',\n '#425173',\n '#415072',\n '#415072',\n '#415172',\n '#415173',\n '#415174',\n '#415174',\n '#415074',\n '#415074',\n '#415174',\n '#415074',\n '#415074',\n '#415074',\n '#415175',\n '#415275',\n '#425276',\n '#425277',\n '#415177',\n '#415177',\n '#425278',\n '#425378',\n '#415277',\n '#415378',\n '#415378',\n '#415277',\n '#415378',\n '#42537a',\n '#42537c',\n '#42537b',\n '#41537a',\n '#41527a',\n '#41537a',\n '#41547a',\n '#42547b',\n '#41547a',\n '#41547a',\n '#41547c',\n '#41547c',\n '#41557c',\n '#41557c',\n '#41557c',\n '#41557c',\n '#41557d',\n '#41547d',\n '#41547c',\n '#42557d',\n '#41557d',\n '#41557d',\n '#41557f',\n '#415580',\n '#41567f',\n '#41567f',\n '#415580',\n '#41567f',\n '#415580',\n '#415580',\n '#41557f',\n '#415680',\n '#415680',\n '#415680',\n '#415681',\n '#415681',\n '#415781',\n '#415781',\n '#415681',\n '#415781',\n '#415781',\n '#415781',\n '#415782',\n '#415784',\n '#415784',\n '#425885',\n '#425885',\n '#415784',\n '#415784',\n '#415784',\n '#415784',\n '#425885',\n '#425885',\n '#415885',\n '#415885',\n '#425987',\n '#415887',\n '#415887',\n '#415987',\n '#415887',\n '#425988',\n '#425988',\n '#415887',\n '#415987',\n '#415988',\n '#415988',\n '#415988',\n '#415989',\n '#415989',\n '#415989',\n '#415989',\n '#415989',\n '#415989',\n '#41598a',\n '#405a8b',\n '#405a8c',\n '#405b8c',\n '#405b8c',\n '#405b8c',\n '#405a8c',\n '#405a8c',\n '#405a8c',\n '#405a8c',\n '#405b8c',\n '#415c8d',\n '#415c8e',\n '#405b8e',\n '#415c90',\n '#405b8f',\n '#405c8f',\n '#415d90',\n '#405b8f',\n '#405c8f',\n '#405c8f',\n '#405b8f',\n '#405c8f',\n '#405c90',\n '#405c91',\n '#405c91',\n '#405c91',\n '#405d91',\n '#405e91',\n '#405d91',\n '#415e91',\n '#405e91',\n '#415e91',\n '#415e92',\n '#3f5d94',\n '#3f5d93',\n '#3f5d93',\n '#3f5e94',\n '#405e94',\n '#3f5d94',\n '#3f5d94',\n '#3f5d94',\n '#3f5e94',\n '#3f5e95',\n '#3f5e96',\n '#3f5e96',\n '#3f5e96',\n '#405f97',\n '#405f97',\n '#3f5e96',\n '#3f5e97',\n '#3f5f97',\n '#3f6097',\n '#3f5f97',\n '#3f6097',\n '#3f5f98',\n '#3f5f99',\n '#3e5f99',\n '#3e6199',\n '#3e6099',\n '#3e5f99',\n '#3e5f99',\n '#3e5f98',\n '#3e6099',\n '#3d609a',\n '#3d6099',\n '#3e609b',\n '#3e619c',\n '#3e619c',\n '#3e619c',\n '#3e609b',\n '#3e609c',\n '#3e609c',\n '#3e619b',\n '#3e629c',\n '#3e629c',\n '#3e619c',\n '#3d619d',\n '#3d639f',\n '#3d629f',\n '#3d629f',\n '#3d639f',\n '#3d629f',\n '#3c619e',\n '#3c619e',\n '#3d629f',\n '#3d62a0',\n '#3d63a0',\n '#3d63a0',\n '#3d62a0',\n '#3d63a1',\n '#3d62a0',\n '#3d63a0',\n '#3d64a1',\n '#3d63a0',\n '#3c63a0',\n '#3b63a2',\n '#3c64a3',\n '#3c65a3',\n '#3b63a3',\n '#3b63a3',\n '#3b63a3',\n '#3b63a3',\n '#3c63a3',\n '#3c65a3',\n '#3c65a3',\n '#3b64a4',\n '#3a65a5',\n '#3b66a6',\n '#3c65a6',\n '#3a65a5',\n '#3a64a5',\n '#3a64a5',\n '#3b65a5',\n '#3a65a5',\n '#3a66a6',\n '#3b66a6',\n '#3b66a6',\n '#3a66a8',\n '#3a67a8',\n '#3b67a8',\n '#3b66a8',\n '#3b66a8',\n '#3b66a8',\n '#3b67a8',\n '#3a66a8',\n '#3966a9',\n '#3967a9',\n '#3a67aa',\n '#3a67ab',\n '#3967ab',\n '#3a68ab',\n '#3a68ab',\n '#3968ab',\n '#3966aa',\n '#3966aa',\n '#3968ab',\n '#3968ab',\n '#3867ac',\n '#3867ac',\n '#3868ac',\n '#3869ad',\n '#3969ad',\n '#3968ad',\n '#3868ac',\n '#3868ac',\n '#3869ae',\n '#3868ad',\n '#3868ad',\n '#3769af',\n '#3869b0',\n '#3769af',\n '#3769af',\n '#386ab0',\n '#386ab0',\n '#376aaf',\n '#376aaf',\n '#376ab0',\n '#366ab1',\n '#366ab2',\n '#366ab2',\n '#366ab2',\n '#366ab3',\n '#366bb3',\n '#366ab2',\n '#3669b2',\n '#366ab2',\n '#366ab2',\n '#366ab2',\n '#356bb3',\n '#346bb4',\n '#356cb4',\n '#356cb4',\n '#346bb4',\n '#356cb4',\n '#356cb5',\n '#356cb5',\n '#356cb5',\n '#346cb5',\n '#346cb5',\n '#346cb6',\n '#336db7',\n '#326cb7',\n '#326db7',\n '#336db7',\n '#336cb7',\n '#326bb6',\n '#326cb6',\n '#326db7',\n '#326db8',\n '#316dba',\n '#316eb9',\n '#316eb9',\n '#326eba',\n '#316eba',\n '#316db9',\n '#316db9',\n '#316eb9',\n '#306eba',\n '#306dba',\n '#306dba',\n '#306ebb',\n '#306dbb',\n '#306dbc',\n '#306fbc',\n '#306fbc',\n '#306ebb',\n '#306eba',\n '#306fbc',\n '#2f6fbd',\n '#2d6ebe',\n '#2d6ebe',\n '#2d6fbe',\n '#2e70be',\n '#2e70be',\n '#2e6fbe',\n '#2e6fbe',\n '#2e6fbe',\n '#2c6fc0',\n '#2d70c0',\n '#2d70c0',\n '#2b70c1',\n '#2b70c1',\n '#2c70c1',\n '#2c70c1',\n '#2b71c1',\n '#2c70c1',\n '#2c70c1',\n '#2c71c1',\n '#2c71c1',\n '#2a72c3',\n '#2971c3',\n '#2a71c2',\n '#2972c3',\n '#2a71c3',\n '#2a71c3',\n '#2972c3',\n '#2972c3',\n '#2972c3',\n '#2872c5',\n '#2872c6',\n '#2872c5',\n '#2773c6',\n '#2773c6',\n '#2772c6',\n '#2772c5',\n '#2672c5',\n '#2673c5',\n '#2673c5',\n '#2673c7',\n '#2472c8',\n '#2473c8',\n '#2474c8',\n '#2573c9',\n '#2573c9',\n '#2573c9',\n '#2573c9',\n '#2474c8',\n '#2374c9',\n '#2374c9',\n '#2374c9',\n '#2375c9',\n '#2374c9',\n '#2374c9',\n '#2475c9',\n '#2575ca',\n '#2476ca',\n '#2476ca',\n '#2476ca',\n '#2575cb',\n '#2577ca',\n '#2577ca',\n '#2576ca',\n '#2577ca',\n '#2577ca',\n '#2577ca',\n '#2677ca',\n '#2678ca',\n '#2678cb',\n '#2778cb',\n '#2778cb',\n '#2679cb',\n '#2779cb',\n '#2779cb',\n '#2779cb',\n '#2779cb',\n '#2879cb',\n '#287acb',\n '#287acb',\n '#2879cb',\n '#287acb',\n '#287bcb',\n '#287acb',\n '#287acb',\n '#287bcc',\n '#287bcc',\n '#297bcc',\n '#297bcc',\n '#297bcc',\n '#297bcc',\n '#297ccc',\n '#297ccc',\n '#297dcc',\n '#297dcc',\n '#2a7dcc',\n '#2a7dcc',\n '#2a7ecd',\n '#2a7ecd',\n '#2a7ecc',\n '#2a7ecc',\n '#2b7ecd',\n '#2c7ecd',\n '#2c7fcd',\n '#2c7fcd',\n '#2b7ecc',\n '#2b7ecc',\n '#2c7fcd',\n '#2c7fcd',\n '#2c7fcd',\n '#2c7fcd',\n '#2b7fcd',\n '#2b80cd',\n '#2c80ce',\n '#2d80ce',\n '#2d80ce',\n '#2c81cd',\n '#2d82ce',\n '#2d82ce',\n '#2d81ce',\n '#2d82ce',\n '#2d82ce',\n '#2d82cd',\n '#2e82cd',\n '#2e83ce',\n '#2e82ce',\n '#2d82cd',\n '#2d83cd',\n '#2e83cf',\n '#2e84cf',\n '#2e84cf',\n '#2e83ce',\n '#2e83ce',\n '#3084cf',\n '#3085cf',\n '#2f85ce',\n '#3085cf',\n '#2f86ce',\n '#2f86ce',\n '#2f86cf',\n '#2f85cf',\n '#2f86ce',\n '#2f86cf',\n '#2f86cf',\n '#2f87cf',\n '#2f86d0',\n '#2f86d0',\n '#2f86d0',\n '#3087cf',\n '#3088d0',\n '#3088d0',\n '#3087cf',\n '#3088cf',\n '#3188d0',\n '#3188d1',\n '#3088d0',\n '#3089d0',\n '#3089d0',\n '#3088d0',\n '#3188d0',\n '#3189d0',\n '#3289d0',\n '#3289d0',\n '#328ad1',\n '#328ad1',\n '#318ad0',\n '#318ad0',\n '#318ad0',\n '#328bd1',\n '#328ad1',\n '#328ad1',\n '#338bd2',\n '#338bd2',\n '#338cd1',\n '#338cd1',\n '#338cd2',\n '#338cd2',\n '#338dd1',\n '#338dd1',\n '#338dd2',\n '#338dd1',\n '#338ed2',\n '#338ed2',\n '#338ed2',\n '#348ed2',\n '#348ed2',\n '#348ed2',\n '#348fd2',\n '#348fd2',\n '#348fd2',\n '#348fd2',\n '#348fd2',\n '#348fd2',\n '#3390d2',\n '#3391d2',\n '#3491d3',\n '#3490d3',\n '#3491d3',\n '#3491d3',\n '#3591d3',\n '#3591d3',\n '#3691d4',\n '#3690d4',\n '#3590d3',\n '#3592d3',\n '#3592d4',\n '#3592d4',\n '#3592d3',\n '#3593d3',\n '#3592d4',\n '#3592d4',\n '#3592d4',\n '#3593d4',\n '#3694d4',\n '#3695d4',\n '#3694d4',\n '#3693d4',\n '#3693d4',\n '#3695d4',\n '#3695d4',\n '#3695d4',\n '#3796d4',\n '#3796d4',\n '#3695d4',\n '#3695d5',\n '#3696d5',\n '#3696d5',\n '#3696d5',\n '#3695d4',\n '#3696d4',\n '#3797d5',\n '#3796d5',\n '#3797d5',\n '#3898d5',\n '#3898d5',\n '#3797d5',\n '#3798d5',\n '#3899d5',\n '#3899d5',\n '#3899d6',\n '#3799d6',\n '#3799d6',\n '#3799d6',\n '#389ad6',\n '#389ad6',\n '#3799d5',\n '#3799d5',\n '#3799d6',\n '#379ad6',\n '#379ad6',\n '#399ad6',\n '#399ad6',\n '#389bd5',\n '#389bd5',\n '#389bd6',\n '#389bd6',\n '#399cd7',\n '#399bd7',\n '#399cd7',\n '#399dd7',\n '#389cd7',\n '#389cd6',\n '#389dd6',\n '#399ed7',\n '#389dd6',\n '#389dd6',\n '#389fd6',\n '#399fd7',\n '#399ed6',\n '#399ed6',\n '#399fd7',\n '#399fd7',\n '#399fd7',\n '#3aa0d8',\n '#3aa0d8',\n '#3a9fd8',\n '#3a9fd8',\n '#3a9fd8',\n '#3aa0d8',\n '#3aa1d8',\n '#3aa1d8',\n '#3aa1d8',\n '#3aa1d8',\n '#3aa1d8',\n '#3aa2d9',\n '#3aa1d9',\n '#3aa1d8',\n '#39a2d8',\n '#3aa2d9',\n '#3aa3d9',\n '#3ba3d9',\n '#3ba3d9',\n '#3ba2d8',\n '#3aa2d8',\n '#3aa4d8',\n '#3ba4d9',\n '#3aa3d8',\n '#3aa3d9',\n '#3ba5da',\n '#3ba5d9',\n '#3ba4d9',\n '#3ba4d9',\n '#3ba4d9',\n '#3aa5d9',\n '#3ba5da',\n '#3ba6da',\n '#3ba6da',\n '#3ba6da',\n '#3ba6d9',\n '#3ba6d9',\n '#3ba6da',\n '#3aa5da',\n '#3ba6da',\n '#3ca7da',\n '#3ca7da',\n '#3ba7da',\n '#3ba6da',\n '#3ca7da',\n '#3ca8da',\n '#3ca8da',\n '#3ca8da',\n '#3ca9db',\n '#3ca9db',\n '#3ca9da',\n '#3ca8db',\n '#3ba8db',\n '#3baadb',\n '#3caadb',\n '#3ca9db',\n '#3caadb',\n '#3caadb',\n '#3ca9db',\n '#3ca9db',\n '#3ca9db',\n '#3cabdb',\n '#3cabdc',\n '#3caadb',\n '#3cabdb',\n '#3cacdc',\n '#3cacdc',\n '#3cacdc',\n '#3caddc',\n '#3caddc',\n '#3caddc',\n '#3caedc',\n '#3caddd',\n '#3caddd',\n '#3caedc',\n '#3eaedd',\n '#3eaddd',\n '#3daddc',\n '#3daedc',\n '#3daedc',\n '#3dafdd',\n '#3dafdd',\n '#3daedd',\n '#3dafdd',\n '#3dafdd',\n '#3dafdd',\n '#3db0dd',\n '#3db0dd',\n '#3db0dc',\n '#3db0dc',\n '#3db1dd',\n '#3db1dd',\n '#3db0dd',\n '#3db0dd',\n '#3db1dd',\n '#3db1de',\n '#3db1de',\n '#3db1de',\n '#3db2de',\n '#3db2de',\n '#3db2dd',\n '#3db2dd',\n '#3db3dd',\n '#3db2de',\n '#3db3de',\n '#3db4de',\n '#3db3dd',\n '#3db4de',\n '#3db4de',\n '#3db4de',\n '#3db5df',\n '#3db5df',\n '#3db4df',\n '#3db4df',\n '#3db5df',\n '#3db5de',\n '#3db5de',\n '#3db5de',\n '#3db6df',\n '#3db6df',\n '#3db6de',\n '#3db6de',\n '#3db7df',\n '#3db7e0',\n '#3db8e0',\n '#3db8e0',\n '#3db7e0',\n '#3db7df',\n '#3db7df',\n '#3eb7df',\n '#3eb8df',\n '#3eb8df',\n '#3eb9e0',\n '#3eb9e0',\n '#3eb8df',\n '#3eb9df',\n '#3fb9df',\n '#3fb9e0',\n '#3ebae1',\n '#3ebae0',\n '#3ebae0',\n '#3ebae0',\n '#3eb9e0',\n '#3fbae1',\n '#3fbbe1',\n '#3ebae0',\n '#3ebbe1',\n '#3ebae0',\n '#3ebbe0',\n '#3ebce1',\n '#3fbce1',\n '#3ebce0',\n '#3ebce2',\n '#3ebce2',\n '#3ebde2',\n '#3fbde2',\n '#3fbde2',\n '#3ebde1',\n '#3ebee1',\n '#3ebde2',\n '#3fbde2',\n '#3fbde2',\n '#3ebee1',\n '#3ebfe1',\n '#3ebfe1',\n '#3ebfe1',\n '#3fbfe2',\n '#3ebfe1',\n '#3ebee1',\n '#3ebee2',\n '#3ebfe2',\n '#3ebfe2',\n '#3ebfe2',\n '#3ec0e2',\n '#3ec1e2',\n '#3fc0e3',\n '#3fc0e3',\n '#3ec0e2',\n '#3ec1e2',\n '#3ec2e2',\n '#3ec2e2',\n '#3ec2e2',\n '#3ec3e3',\n '#3ec3e3',\n '#3ec3e3',\n '#3ec2e3',\n '#3ec2e3',\n '#3fc3e3',\n '#3fc4e3',\n '#3ec4e3',\n '#3ec3e3',\n '#3ec3e3',\n '#3ec5e4',\n '#3fc5e4',\n '#3fc5e3',\n '#3fc4e4',\n '#3fc5e4',\n '#3ec6e4',\n '#3ec5e4',\n '#3ec4e4',\n '#3ec5e4',\n '#3ec6e4',\n '#3ec6e4',\n '#3ec6e4',\n '#3ec6e4',\n '#3ec6e4',\n '#3ec7e4',\n '#3ec6e4',\n '#3ec6e4',\n '#3ec6e4',\n '#3ec7e4',\n '#3dc8e4',\n '#3dc8e4',\n '#3dc7e5',\n '#3dc7e5',\n '#3dc8e5',\n '#3dc8e4',\n '#3dc8e4',\n '#3dc9e5',\n '#3dc9e5',\n '#3dc9e5',\n '#3dc9e5',\n '#3dc9e5',\n '#3dc9e4',\n '#3dc9e5',\n '#3dcae6',\n '#3dcbe6',\n '#3dcae6',\n '#3dcae6',\n '#3dcae6',\n '#3dcbe6',\n '#3dcce6',\n '#3ecce6',\n '#3ecce6',\n '#3dcbe6',\n '#3dcce6',\n '#3dcce6',\n '#3dcce6',\n '#3dcce5',\n '#3dcce5',\n '#3dcce6',\n '#3dcde7',\n '#3dcde7',\n '#3dcde7',\n '#3dcfe7',\n '#3dcfe7',\n '#3dcfe7',\n '#3dcee7',\n '#3dcee6',\n '#3dcee6',\n '#3dcfe7',\n '#3dcfe7',\n '#3dcfe6',\n '#3dcfe6',\n '#3dd0e8',\n '#3ed1e8',\n '#3ed1e7',\n '#3dd0e7',\n '#3dd0e8',\n '#3dd0e7',\n '#3dd1e7',\n '#3dd1e7',\n '#3dd0e7',\n '#3cd1e8',\n '#3cd2e8',\n '#3cd1e8',\n '#3cd1e7',\n '#3cd1e7',\n '#3cd2e8',\n '#3cd3e9',\n '#3cd2e8',\n '#3cd2e9',\n '#3cd2e9',\n '#3cd3e8',\n '#3cd4e8',\n '#3cd3e8',\n '#3cd3e8',\n ],\n nullColor: '#2f323d',\n}\nconst earningsGradient = {\n colors: [\n '#592d48',\n '#592d49',\n '#5b2d49',\n '#5b2d49',\n '#5b2d49',\n '#5b2e49',\n '#5b2e49',\n '#5b2e4a',\n '#5c2e4a',\n '#5d2f4b',\n '#5c2f4b',\n '#5c2e4b',\n '#5f2f4c',\n '#5f2f4c',\n '#5e2e4c',\n '#5e2e4c',\n '#60304d',\n '#60304d',\n '#5f2f4d',\n '#5f2f4d',\n '#62304f',\n '#62304f',\n '#61304f',\n '#62314f',\n '#62314f',\n '#633150',\n '#633150',\n '#63314f',\n '#63304f',\n '#643150',\n '#643151',\n '#643151',\n '#653152',\n '#653051',\n '#653051',\n '#663152',\n '#673253',\n '#673253',\n '#673253',\n '#673253',\n '#683254',\n '#683254',\n '#683254',\n '#693254',\n '#693354',\n '#6a3354',\n '#6a3354',\n '#6a3355',\n '#6a3356',\n '#6a3456',\n '#6c3456',\n '#6c3356',\n '#6c3457',\n '#6c3457',\n '#6c3457',\n '#6c3457',\n '#6d3458',\n '#6e3559',\n '#6f3559',\n '#6f3459',\n '#6f345a',\n '#70355b',\n '#70365b',\n '#6f355a',\n '#70365b',\n '#71355a',\n '#71355a',\n '#71365b',\n '#72355b',\n '#72365c',\n '#72365d',\n '#72355c',\n '#73355c',\n '#73355d',\n '#73375d',\n '#73375d',\n '#76375e',\n '#76375f',\n '#76375f',\n '#76375f',\n '#76365e',\n '#76365e',\n '#76375f',\n '#763860',\n '#773861',\n '#783860',\n '#783860',\n '#783861',\n '#793861',\n '#793862',\n '#793762',\n '#793761',\n '#7b3962',\n '#7b3962',\n '#7a3962',\n '#7a3962',\n '#7b3963',\n '#7c3964',\n '#7d3a64',\n '#7d3b64',\n '#7d3a65',\n '#7d3a65',\n '#7d3a65',\n '#7e3b65',\n '#803b66',\n '#7f3a66',\n '#7e3a66',\n '#7f3a67',\n '#7f3b67',\n '#803c67',\n '#803c67',\n '#7f3b67',\n '#813c68',\n '#823b69',\n '#823b69',\n '#813b69',\n '#823c69',\n '#823c69',\n '#823c69',\n '#823c69',\n '#843d6a',\n '#843d6a',\n '#843d6a',\n '#843c6b',\n '#863c6c',\n '#853c6c',\n '#853d6c',\n '#863e6c',\n '#863d6c',\n '#873d6c',\n '#873d6c',\n '#873d6d',\n '#893e6e',\n '#8a3e6f',\n '#8a3e6f',\n '#893e6e',\n '#893d6e',\n '#893e6e',\n '#8a3f6f',\n '#8b3f70',\n '#8b3f71',\n '#8b3e70',\n '#8b3e70',\n '#8c3f70',\n '#8c4071',\n '#8c4070',\n '#8c4070',\n '#8d4071',\n '#8d4072',\n '#8d4072',\n '#8f4073',\n '#8f4074',\n '#8f4073',\n '#8f4173',\n '#8f4173',\n '#904173',\n '#904174',\n '#904175',\n '#904175',\n '#914175',\n '#924175',\n '#924275',\n '#924275',\n '#914175',\n '#924277',\n '#934277',\n '#934277',\n '#944278',\n '#954277',\n '#954278',\n '#954278',\n '#954278',\n '#954378',\n '#964378',\n '#964379',\n '#96447a',\n '#96437a',\n '#96437a',\n '#98437a',\n '#98447b',\n '#98457b',\n '#98457b',\n '#98457b',\n '#99447b',\n '#9a457d',\n '#9b457d',\n '#9b457d',\n '#9a447c',\n '#9a457c',\n '#9b457c',\n '#9b457e',\n '#9b467e',\n '#9c467e',\n '#9d467f',\n '#9e467f',\n '#9d467f',\n '#9e467e',\n '#9e477f',\n '#9e4780',\n '#9e477f',\n '#9f4680',\n '#a04680',\n '#a04880',\n '#a04881',\n '#a04881',\n '#a04881',\n '#a24883',\n '#a24883',\n '#a24882',\n '#a24883',\n '#a24883',\n '#a24883',\n '#a24883',\n '#a34983',\n '#a34983',\n '#a34984',\n '#a44985',\n '#a54986',\n '#a54986',\n '#a54986',\n '#a54a85',\n '#a54a85',\n '#a54a85',\n '#a64a86',\n '#a74a87',\n '#a84a88',\n '#a84a88',\n '#a74a87',\n '#a84b87',\n '#a84b88',\n '#a84b88',\n '#a84b88',\n '#a94b89',\n '#aa4b89',\n '#ab4b89',\n '#ab4b89',\n '#ab4c8a',\n '#aa4c8a',\n '#aa4c8a',\n '#ab4c8a',\n '#ad4c8b',\n '#ad4c8b',\n '#ad4c8b',\n '#ad4c8c',\n '#ae4d8d',\n '#ae4c8c',\n '#ae4d8d',\n '#af4e8e',\n '#af4e8d',\n '#b04e8d',\n '#b04e8d',\n '#b04d8e',\n '#b04e8e',\n '#b04d8e',\n '#b04e8e',\n '#b14f8f',\n '#b14e90',\n '#b14e90',\n '#b14f90',\n '#b25090',\n '#b34f90',\n '#b34f90',\n '#b34f90',\n '#b35091',\n '#b44f91',\n '#b55092',\n '#b55092',\n '#b55092',\n '#b55192',\n '#b55092',\n '#b55092',\n '#b55093',\n '#b65094',\n '#b75194',\n '#b85193',\n '#b75093',\n '#b85095',\n '#b85095',\n '#b85295',\n '#b85295',\n '#ba5296',\n '#b95197',\n '#b95197',\n '#ba5297',\n '#ba5297',\n '#ba5296',\n '#ba5296',\n '#bb5397',\n '#bc5297',\n '#bd5298',\n '#bd5499',\n '#bc5499',\n '#bc5499',\n '#bc5499',\n '#bd5499',\n '#be549a',\n '#bf549b',\n '#bf549b',\n '#bf549b',\n '#bf549b',\n '#c0559b',\n '#c0559b',\n '#c0559b',\n '#c0559b',\n '#c0549c',\n '#c0549c',\n '#c2569c',\n '#c2569d',\n '#c2569e',\n '#c2569e',\n '#c4569e',\n '#c4569e',\n '#c4569f',\n '#c3579e',\n '#c3579e',\n '#c5579e',\n '#c658a0',\n '#c5579f',\n '#c4579f',\n '#c557a0',\n '#c757a0',\n '#c657a0',\n '#c658a1',\n '#c759a2',\n '#c758a2',\n '#c758a2',\n '#c858a2',\n '#c959a3',\n '#ca59a3',\n '#c958a2',\n '#c958a2',\n '#c959a3',\n '#ca59a4',\n '#cb59a4',\n '#cb59a4',\n '#cb59a4',\n '#cb5aa5',\n '#cc5ba5',\n '#cc5ba5',\n '#cc5aa5',\n '#cd5ba6',\n '#cd5ba6',\n '#cd5ba6',\n '#ce5ba7',\n '#ce5ca7',\n '#cf5ca7',\n '#cf5ca7',\n '#cf5ca7',\n '#d05ca8',\n '#d05ba9',\n '#d05ba9',\n '#d05ba9',\n '#d15ca9',\n '#d15da9',\n '#d15da9',\n '#d15ca9',\n '#d25caa',\n '#d25dab',\n '#d25eab',\n '#d25eab',\n '#d35eab',\n '#d35dab',\n '#d35dab',\n '#d45eac',\n '#d45dac',\n '#d55ead',\n '#d55ead',\n '#d55dad',\n '#d65eac',\n '#d65fad',\n '#d65fae',\n '#d65fae',\n '#d75fae',\n '#d75fae',\n '#d75fae',\n '#d75fae',\n '#d75faf',\n '#d760b0',\n '#d960b0',\n '#d95fb0',\n '#d961b0',\n '#d961b1',\n '#d961b1',\n '#da61b0',\n '#dc61b2',\n '#dc60b2',\n '#db60b2',\n '#db61b2',\n '#dc61b2',\n '#dd61b3',\n '#dd61b3',\n '#dd62b3',\n '#de62b3',\n '#de63b4',\n '#de63b5',\n '#dd62b4',\n '#de62b4',\n '#df63b5',\n '#e063b5',\n '#e063b5',\n '#e063b6',\n '#e164b6',\n '#e164b6',\n '#e164b6',\n '#e164b7',\n '#e264b7',\n '#e264b7',\n '#e264b7',\n '#e264b8',\n '#e265b8',\n '#e265b8',\n '#e365b8',\n '#e364b8',\n '#e465b9',\n '#e565ba',\n '#e565ba',\n '#e566b9',\n '#e566ba',\n '#e566bb',\n '#e666ba',\n '#e766bb',\n '#e665bb',\n '#e665bb',\n '#e666bb',\n '#e867bc',\n '#e867bc',\n '#e867bc',\n '#e867bc',\n '#e968bd',\n '#e967be',\n '#e968be',\n '#e969bd',\n '#ea68bf',\n '#ea69bf',\n '#ea69bf',\n '#eb69c0',\n '#eb69c0',\n '#eb6ac0',\n '#eb6ac0',\n '#ec6ac1',\n '#ed6ac2',\n '#ec6bc2',\n '#ec6bc2',\n '#ed6bc2',\n '#ed6bc3',\n '#ed6bc3',\n '#ed6bc3',\n '#ee6bc2',\n '#ef6bc3',\n '#ef6cc3',\n '#ef6cc3',\n '#f06cc4',\n '#f06cc5',\n '#f16cc4',\n '#f16cc4',\n '#f16cc5',\n '#f16dc6',\n '#f16dc6',\n '#f36dc6',\n '#f36dc7',\n '#f36dc6',\n '#f36dc7',\n '#f36dc7',\n '#f46dc7',\n '#f56ec7',\n '#f46ec7',\n '#f46ec7',\n '#f46ec8',\n '#f56ec8',\n '#f56fc8',\n '#f66fc8',\n '#f76fc9',\n '#f76fc9',\n '#f76fc9',\n '#f86fca',\n '#f970cb',\n '#f971cb',\n '#f870cb',\n '#f870cb',\n '#f870cc',\n '#f970cd',\n '#fa71cd',\n '#fa71cd',\n '#fa71cd',\n '#fa72ce',\n '#fb71ce',\n '#fb71ce',\n '#fb71ce',\n '#fc72cf',\n '#fb72ce',\n '#fb72ce',\n '#fc72cf',\n '#fd72d0',\n '#fe73d1',\n '#ff73d1',\n '#ff72d1',\n '#fe72d1',\n '#ff73d2',\n '#ff74d2',\n '#fe74d2',\n '#02dfce',\n '#02dece',\n '#02dece',\n '#03dfce',\n '#03dfce',\n '#03dfcd',\n '#03ddcd',\n '#03ddcd',\n '#03ddcc',\n '#02dccb',\n '#02dccb',\n '#03dccc',\n '#03dbcb',\n '#03dbca',\n '#03dbca',\n '#03dbca',\n '#03daca',\n '#04dbcb',\n '#04dacb',\n '#03d9ca',\n '#03d8c9',\n '#04d9c9',\n '#04dac9',\n '#04d9c9',\n '#04d9c8',\n '#04d7c7',\n '#04d6c7',\n '#04d7c8',\n '#05d7c7',\n '#05d6c7',\n '#05d6c7',\n '#04d6c7',\n '#05d5c6',\n '#05d5c6',\n '#05d5c6',\n '#05d5c5',\n '#06d4c5',\n '#05d4c5',\n '#05d4c5',\n '#06d4c5',\n '#06d3c4',\n '#06d2c4',\n '#06d2c4',\n '#06d2c3',\n '#06d2c3',\n '#07d2c2',\n '#07d0c1',\n '#07d0c2',\n '#07d0c1',\n '#07cfc1',\n '#07cfc1',\n '#07d0c1',\n '#09cfc0',\n '#08cfc0',\n '#09cfc0',\n '#0acec1',\n '#0acec0',\n '#09cdbf',\n '#09cdbf',\n '#0acebf',\n '#0accbe',\n '#0bccbf',\n '#0bccbf',\n '#0bccbe',\n '#0bcbbe',\n '#0bcbbe',\n '#0bcbbd',\n '#0ccabc',\n '#0ccbbd',\n '#0dcbbd',\n '#0dcabc',\n '#0cc9bb',\n '#0dc8ba',\n '#0ec9bb',\n '#0ec9bb',\n '#0dc8ba',\n '#0ec8bb',\n '#0dc7ba',\n '#0ec7ba',\n '#0fc7ba',\n '#0ec6b9',\n '#0fc6b9',\n '#0fc6b9',\n '#0fc5b8',\n '#0fc6b8',\n '#0fc6b8',\n '#0fc4b8',\n '#10c4b7',\n '#10c4b7',\n '#10c3b6',\n '#10c3b6',\n '#10c3b6',\n '#12c2b6',\n '#11c2b6',\n '#11c2b6',\n '#12c3b6',\n '#12c2b5',\n '#12c1b5',\n '#12c0b5',\n '#13c0b4',\n '#13c1b4',\n '#13c0b3',\n '#13bfb3',\n '#13c0b4',\n '#13bfb2',\n '#13beb3',\n '#13beb3',\n '#13bfb2',\n '#14beb1',\n '#14beb1',\n '#14beb1',\n '#14bdb1',\n '#14bdb1',\n '#15bdb1',\n '#16bdb1',\n '#15bcb0',\n '#16baaf',\n '#16bab0',\n '#16bbb0',\n '#15bbaf',\n '#15b9ae',\n '#15b9ae',\n '#16baae',\n '#17baae',\n '#17b9ae',\n '#17b8ae',\n '#17b8ac',\n '#17b8ac',\n '#18b8ac',\n '#18b7ab',\n '#18b7ab',\n '#18b7ab',\n '#19b7ac',\n '#18b7ac',\n '#18b5ac',\n '#18b5ab',\n '#18b5aa',\n '#19b4aa',\n '#1ab4aa',\n '#1ab5aa',\n '#19b3a9',\n '#19b3a9',\n '#19b4a9',\n '#19b4a9',\n '#19b2a8',\n '#1ab3a8',\n '#1ab3a8',\n '#1ab2a7',\n '#1bb1a7',\n '#1ab0a7',\n '#1ab0a7',\n '#1ab0a7',\n '#1bb1a6',\n '#1bb1a6',\n '#1bafa6',\n '#1bafa6',\n '#1cafa5',\n '#1cafa5',\n '#1cafa5',\n '#1caea4',\n '#1caea4',\n '#1caea4',\n '#1caea4',\n '#1cada3',\n '#1caca2',\n '#1caca2',\n '#1caca2',\n '#1caca2',\n '#1eaba2',\n '#1eaca2',\n '#1eaca2',\n '#1eaba2',\n '#1daaa1',\n '#1ea9a1',\n '#1ea9a1',\n '#1daaa0',\n '#1ea89f',\n '#1fa9a0',\n '#1fa8a0',\n '#1ea79f',\n '#1fa79e',\n '#1fa89f',\n '#1fa79e',\n '#1ea69d',\n '#1ea79d',\n '#1ea79c',\n '#1ea59c',\n '#1ea59c',\n '#20a59c',\n '#1fa59c',\n '#1fa59c',\n '#20a49b',\n '#20a49c',\n '#1fa49c',\n '#1fa49a',\n '#1fa39a',\n '#20a29a',\n '#20a39a',\n '#20a39a',\n '#20a29a',\n '#21a199',\n '#21a099',\n '#21a099',\n '#21a198',\n '#21a098',\n '#219f98',\n '#219f98',\n '#21a098',\n '#219f97',\n '#219f97',\n '#219e97',\n '#219d96',\n '#219d97',\n '#229d96',\n '#229d96',\n '#229d96',\n '#229c95',\n '#239d95',\n '#239d95',\n '#239c95',\n '#229a94',\n '#229a93',\n '#229a93',\n '#239b93',\n '#229a93',\n '#239892',\n '#239892',\n '#239992',\n '#249991',\n '#249991',\n '#249791',\n '#239791',\n '#249791',\n '#249791',\n '#249791',\n '#239690',\n '#239590',\n '#24968f',\n '#24968f',\n '#23958f',\n '#24958e',\n '#24948e',\n '#24948e',\n '#24958e',\n '#25938d',\n '#25938d',\n '#25938d',\n '#24938c',\n '#24928c',\n '#25928c',\n '#25928c',\n '#25928c',\n '#25918c',\n '#25908b',\n '#25908b',\n '#25908b',\n '#248f8a',\n '#258f8a',\n '#258f8a',\n '#25908b',\n '#258f8a',\n '#248e89',\n '#258e89',\n '#268e89',\n '#268e88',\n '#268e88',\n '#268d88',\n '#268c88',\n '#268c86',\n '#268c86',\n '#268c87',\n '#268c87',\n '#268b86',\n '#268a87',\n '#268a86',\n '#268a85',\n '#268a86',\n '#268a86',\n '#268884',\n '#268884',\n '#268884',\n '#278783',\n '#278783',\n '#268883',\n '#278682',\n '#278682',\n '#278682',\n '#278682',\n '#278681',\n '#278681',\n '#278581',\n '#278480',\n '#278580',\n '#278480',\n '#278381',\n '#278481',\n '#27837f',\n '#288480',\n '#288380',\n '#27827f',\n '#27827f',\n '#27817e',\n '#27817e',\n '#27817e',\n '#27807d',\n '#27807d',\n '#27807d',\n '#28807d',\n '#27807c',\n '#277f7b',\n '#277f7b',\n '#277f7b',\n '#287e7b',\n '#287d7a',\n '#287d7a',\n '#297e7b',\n '#297d7b',\n '#297c7b',\n '#297c7b',\n '#297d7b',\n '#287b79',\n '#287c79',\n '#287b79',\n '#297a79',\n '#297a78',\n '#297b78',\n '#297b78',\n '#287a77',\n '#287976',\n '#287876',\n '#287876',\n '#287876',\n '#287775',\n '#297876',\n '#297976',\n '#297776',\n '#287675',\n '#297776',\n '#297775',\n '#287674',\n '#297574',\n '#297574',\n '#297574',\n '#297474',\n '#287472',\n '#297472',\n '#297472',\n '#297472',\n '#297271',\n '#287271',\n '#287271',\n '#297271',\n '#297271',\n '#287171',\n '#28716f',\n '#29716f',\n '#28706f',\n '#297070',\n '#297070',\n '#296f6f',\n '#296f6f',\n '#286e6e',\n '#286e6e',\n '#286f6e',\n '#296e6e',\n '#286d6d',\n '#286d6d',\n '#296d6d',\n '#296e6d',\n '#296e6d',\n '#296c6b',\n '#286c6b',\n '#286c6b',\n '#296c6b',\n '#296a6b',\n '#286a6a',\n '#286a6a',\n '#296969',\n '#2a6969',\n '#296969',\n '#296869',\n '#2a6969',\n '#2a6969',\n '#2a6969',\n '#2a6868',\n '#296768',\n '#296768',\n '#2a6767',\n '#2a6767',\n '#2a6767',\n '#2a6567',\n '#296566',\n '#286666',\n '#286565',\n '#286565',\n '#296565',\n '#286465',\n '#296464',\n '#296464',\n '#286364',\n '#286263',\n '#286263',\n '#286263',\n '#286163',\n '#286062',\n '#286062',\n '#286162',\n '#296163',\n '#285f62',\n '#296062',\n '#296062',\n '#295f61',\n '#296061',\n '#285f60',\n '#285d5f',\n '#285d5f',\n '#285d60',\n '#285c5f',\n '#285c5e',\n '#285c5f',\n '#295b5e',\n '#285b5d',\n '#285b5d',\n '#285c5d',\n '#295c5d',\n '#285b5c',\n '#285b5c',\n '#285b5c',\n '#285a5d',\n '#28595d',\n '#28595b',\n '#28595b',\n '#29585c',\n '#28585b',\n '#28585a',\n '#28575a',\n '#29585b',\n '#29585b',\n '#29575a',\n '#295659',\n '#285558',\n '#285658',\n '#285658',\n '#295558',\n '#295557',\n '#285457',\n '#285357',\n '#285457',\n '#285356',\n '#295456',\n '#295356',\n '#285256',\n '#295256',\n '#285255',\n '#285255',\n '#295255',\n '#295155',\n '#284f54',\n '#274f54',\n '#275054',\n '#275054',\n '#275054',\n '#274e52',\n '#274e52',\n '#284e52',\n '#274d51',\n '#274d51',\n '#274e52',\n '#274c50',\n '#274c50',\n '#274e51',\n '#284e51',\n '#274c50',\n '#284c50',\n '#284b50',\n '#274a50',\n '#284a50',\n '#284a50',\n '#28494e',\n '#27484e',\n '#274a4e',\n '#274a4d',\n '#27494d',\n '#28484e',\n '#27474c',\n '#26484d',\n '#26484d',\n '#26484c',\n '#25464b',\n '#26464b',\n '#26474b',\n '#26474b',\n '#26454a',\n '#26454a',\n '#26464a',\n '#26464a',\n '#254349',\n '#264349',\n '#264349',\n '#26444a',\n ],\n nullColor: '#414554',\n}\n\nconst redGreenGradientBubbles = {\n colors: [\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f63538',\n '#f53538',\n '#f53538',\n '#f53538',\n '#f53538',\n '#f53538',\n '#f53538',\n '#f53538',\n '#f53538',\n '#f43538',\n '#f43538',\n '#f43538',\n '#f43538',\n '#f43538',\n '#f43538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f33538',\n '#f23538',\n '#f23538',\n '#f23538',\n '#f23538',\n '#f13538',\n '#f13538',\n '#f13538',\n '#f13538',\n '#f03538',\n '#f03538',\n '#f03538',\n '#f03538',\n '#f03538',\n '#f03538',\n '#ef3538',\n '#ef3538',\n '#ef3538',\n '#ef3538',\n '#ef3538',\n '#ef3538',\n '#ee3639',\n '#ee3639',\n '#ee3639',\n '#ed3639',\n '#ed3639',\n '#ed3639',\n '#ec3639',\n '#ec3639',\n '#ec3639',\n '#eb3639',\n '#eb3639',\n '#eb3639',\n '#eb3639',\n '#eb3639',\n '#ea3639',\n '#ea3639',\n '#ea3639',\n '#e93639',\n '#e93639',\n '#e83538',\n '#e83538',\n '#e83538',\n '#e73538',\n '#e73538',\n '#e73538',\n '#e63538',\n '#e63639',\n '#e63639',\n '#e63639',\n '#e63639',\n '#e53639',\n '#e53639',\n '#e53639',\n '#e53639',\n '#e53639',\n '#e53639',\n '#e43639',\n '#e43639',\n '#e43639',\n '#e33639',\n '#e33639',\n '#e33639',\n '#e23639',\n '#e23639',\n '#e23639',\n '#e13639',\n '#e13639',\n '#e13639',\n '#e03639',\n '#e0363a',\n '#e0363a',\n '#e0363a',\n '#df363a',\n '#df363a',\n '#df363a',\n '#de363a',\n '#de363a',\n '#de363a',\n '#de363a',\n '#de363a',\n '#de363a',\n '#dd363a',\n '#dd373b',\n '#dd373b',\n '#dc373b',\n '#dc373b',\n '#dc373b',\n '#db373b',\n '#db373b',\n '#db373b',\n '#da373b',\n '#da373d',\n '#da373d',\n '#d9373d',\n '#d9373d',\n '#d9373d',\n '#d9373d',\n '#d9373d',\n '#d8373e',\n '#d8373e',\n '#d7383e',\n '#d7383e',\n '#d7383e',\n '#d6383e',\n '#d6383e',\n '#d5383e',\n '#d5383e',\n '#d4383e',\n '#d4383e',\n '#d4383f',\n '#d3383f',\n '#d3383f',\n '#d3393f',\n '#d33940',\n '#d23940',\n '#d23940',\n '#d13940',\n '#d13941',\n '#d03941',\n '#d03941',\n '#cf3941',\n '#cf3942',\n '#cf3942',\n '#cf3a42',\n '#ce3a42',\n '#cd3a43',\n '#cd3a43',\n '#cc3943',\n '#cc3943',\n '#cb3944',\n '#cb3944',\n '#ca3944',\n '#ca3944',\n '#c93a45',\n '#c93a45',\n '#c83a45',\n '#c73a45',\n '#c73a45',\n '#c53a45',\n '#c53a45',\n '#c43a45',\n '#c43a46',\n '#c43a46',\n '#c43c46',\n '#c33c47',\n '#c33c47',\n '#c23c47',\n '#c23c47',\n '#c13c48',\n '#c13c48',\n '#c03c48',\n '#c03c48',\n '#bf3c48',\n '#bf3d4a',\n '#be3d4a',\n '#be3d4a',\n '#bd3d4a',\n '#bd3d4b',\n '#bc3d4b',\n '#bc3d4b',\n '#bb3d4b',\n '#bb3d4b',\n '#bb3d4c',\n '#bb3d4c',\n '#ba3d4c',\n '#ba3e4c',\n '#b83e4c',\n '#b83e4c',\n '#b83e4c',\n '#b73e4c',\n '#b73e4c',\n '#b63e4c',\n '#b63e4c',\n '#b53e4d',\n '#b53e4d',\n '#b53e4d',\n '#b43e4d',\n '#b43e4d',\n '#b33e4d',\n '#b33f4d',\n '#b23f4e',\n '#b23f4e',\n '#b23f4e',\n '#b13f4e',\n '#b13f4e',\n '#b03e4e',\n '#b03e4e',\n '#b03e4f',\n '#b03e4f',\n '#b03e4f',\n '#ae3e4f',\n '#ae3e4f',\n '#ad3e4f',\n '#ad3e4f',\n '#ac3e4f',\n '#ac3f50',\n '#ab3f50',\n '#ab3f50',\n '#aa3f50',\n '#aa3f50',\n '#a93f50',\n '#a93f50',\n '#a73f50',\n '#a73f50',\n '#a63f50',\n '#a63f51',\n '#a53f51',\n '#a53f51',\n '#a43f50',\n '#a43f50',\n '#a43f50',\n '#a43f50',\n '#a24050',\n '#a24050',\n '#a14050',\n '#a04051',\n '#a04051',\n '#9f4051',\n '#9f4051',\n '#9e4051',\n '#9c4051',\n '#9c4051',\n '#9b4051',\n '#9a4051',\n '#9a4053',\n '#994053',\n '#994153',\n '#984153',\n '#974153',\n '#974153',\n '#964153',\n '#954153',\n '#954153',\n '#934054',\n '#934054',\n '#924054',\n '#914054',\n '#914054',\n '#904053',\n '#8e4053',\n '#8e4153',\n '#8d4153',\n '#8d4153',\n '#8d4154',\n '#8b4154',\n '#8b4154',\n '#8a4154',\n '#894154',\n '#894154',\n '#884154',\n '#884154',\n '#864154',\n '#864154',\n '#854154',\n '#844155',\n '#844255',\n '#824255',\n '#824255',\n '#824255',\n '#824255',\n '#814255',\n '#814255',\n '#804255',\n '#804255',\n '#7e4255',\n '#7e4255',\n '#7d4255',\n '#7d4256',\n '#7c4256',\n '#7c4256',\n '#7b4256',\n '#7b4256',\n '#7b4256',\n '#794256',\n '#794256',\n '#784256',\n '#784356',\n '#774256',\n '#774256',\n '#774256',\n '#764256',\n '#764256',\n '#764256',\n '#754256',\n '#754256',\n '#744255',\n '#744255',\n '#744255',\n '#734255',\n '#734255',\n '#734255',\n '#724255',\n '#724255',\n '#724255',\n '#714255',\n '#714255',\n '#6f4255',\n '#6f4255',\n '#6f4255',\n '#6e4255',\n '#6e4255',\n '#6e4255',\n '#6d4255',\n '#6d4255',\n '#6d4255',\n '#6c4255',\n '#6c4255',\n '#6c4255',\n '#6b4155',\n '#6b4155',\n '#694155',\n '#694155',\n '#694155',\n '#684155',\n '#684155',\n '#684155',\n '#684155',\n '#684155',\n '#674155',\n '#674155',\n '#674155',\n '#664154',\n '#664154',\n '#654154',\n '#654154',\n '#654154',\n '#634154',\n '#634154',\n '#624154',\n '#624154',\n '#614154',\n '#614154',\n '#614154',\n '#604054',\n '#604054',\n '#5f4054',\n '#5f4054',\n '#5f4054',\n '#5e4054',\n '#5e4054',\n '#5d4054',\n '#5d4054',\n '#5d4054',\n '#5c4053',\n '#5c4053',\n '#5c4053',\n '#5b4053',\n '#5b4053',\n '#5a4053',\n '#5a4053',\n '#5a4053',\n '#593f53',\n '#593f53',\n '#593f53',\n '#583f53',\n '#583f53',\n '#583f53',\n '#573f53',\n '#573e53',\n '#573e53',\n '#563e53',\n '#563e53',\n '#563e53',\n '#563e53',\n '#553e52',\n '#553e52',\n '#553e52',\n '#543e52',\n '#543e52',\n '#543e52',\n '#543e52',\n '#543e52',\n '#533e52',\n '#533e52',\n '#533e52',\n '#533e52',\n '#533e52',\n '#523e51',\n '#523e51',\n '#523e51',\n '#523e51',\n '#523e51',\n '#513e51',\n '#513e51',\n '#513e51',\n '#513e51',\n '#513e51',\n '#513e51',\n '#513e51',\n '#513e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503e51',\n '#503f51',\n '#503f51',\n '#4f3f51',\n '#4f3f51',\n '#4f3f51',\n '#4d3f51',\n '#4d3f51',\n '#4d4151',\n '#4b4151',\n '#4b4151',\n '#4a4152',\n '#494152',\n '#484253',\n '#484253',\n '#474253',\n '#474253',\n '#464353',\n '#454353',\n '#454353',\n '#444454',\n '#444454',\n '#434454',\n '#434454',\n '#424454',\n '#424554',\n '#424554',\n '#424554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#414554',\n '#404654',\n '#404654',\n '#404654',\n '#404653',\n '#404653',\n '#3f4653',\n '#3f4753',\n '#3f4753',\n '#3e4753',\n '#3e4753',\n '#3e4852',\n '#3d4852',\n '#3d4852',\n '#3c4951',\n '#3c4951',\n '#3b4951',\n '#3b4a51',\n '#3b4a50',\n '#3b4a50',\n '#3a4c50',\n '#394c50',\n '#394c50',\n '#394c50',\n '#394c50',\n '#394c50',\n '#384c4f',\n '#384c4f',\n '#384c4f',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384d50',\n '#384e50',\n '#364e50',\n '#364e4f',\n '#364e4f',\n '#364e4f',\n '#364e4f',\n '#364e4f',\n '#364f4f',\n '#364f4f',\n '#354f4f',\n '#354f4f',\n '#354f4f',\n '#354f4f',\n '#35514f',\n '#35514f',\n '#35514f',\n '#34514f',\n '#34514f',\n '#34524f',\n '#34524f',\n '#34524f',\n '#34524f',\n '#33524e',\n '#33534e',\n '#33534e',\n '#33534e',\n '#32534e',\n '#32544e',\n '#32544e',\n '#32544e',\n '#32544e',\n '#31554e',\n '#31554e',\n '#31554e',\n '#31564d',\n '#31564d',\n '#31564d',\n '#31564d',\n '#31574d',\n '#30574d',\n '#30574d',\n '#30584d',\n '#30584d',\n '#2f584d',\n '#2f594d',\n '#2f594d',\n '#2f594c',\n '#2e5a4c',\n '#2e5a4c',\n '#2e5a4c',\n '#2d5b4c',\n '#2d5b4c',\n '#2d5b4c',\n '#2d5b4c',\n '#2c5c4c',\n '#2c5c4c',\n '#2c5c4c',\n '#2b5d4b',\n '#2b5d4b',\n '#2b5d4b',\n '#2b5e4b',\n '#2a5e4b',\n '#2a5e4b',\n '#2a5f4b',\n '#2a5f4b',\n '#2a5f4b',\n '#2a604b',\n '#2a604b',\n '#2a604b',\n '#29624b',\n '#29624b',\n '#29624b',\n '#29624b',\n '#29634b',\n '#29634b',\n '#29634b',\n '#29644b',\n '#28644b',\n '#28644b',\n '#28644b',\n '#28654b',\n '#28654a',\n '#27654a',\n '#27664a',\n '#27664a',\n '#27664a',\n '#27664a',\n '#26684a',\n '#26684a',\n '#26684a',\n '#26684a',\n '#26694a',\n '#25694a',\n '#25694a',\n '#25694a',\n '#256a4a',\n '#256a4a',\n '#256a4a',\n '#256a4a',\n '#246a4a',\n '#246b49',\n '#246b49',\n '#246b49',\n '#246b49',\n '#246c49',\n '#246c49',\n '#236c49',\n '#236c49',\n '#236e49',\n '#236e49',\n '#236e49',\n '#236e49',\n '#236f49',\n '#236f49',\n '#236f49',\n '#226f49',\n '#227049',\n '#227049',\n '#227049',\n '#227149',\n '#227149',\n '#227149',\n '#227149',\n '#227349',\n '#217349',\n '#217349',\n '#217449',\n '#217449',\n '#217449',\n '#217449',\n '#217549',\n '#217549',\n '#217549',\n '#207649',\n '#207649',\n '#207649',\n '#207847',\n '#207847',\n '#207847',\n '#207947',\n '#207947',\n '#207947',\n '#207947',\n '#207947',\n '#207947',\n '#207b47',\n '#207b47',\n '#207b47',\n '#207c47',\n '#207c47',\n '#207c47',\n '#207d47',\n '#207d47',\n '#207e48',\n '#207e48',\n '#207e48',\n '#208048',\n '#208048',\n '#208048',\n '#208148',\n '#208148',\n '#208148',\n '#208248',\n '#1f8247',\n '#1f8247',\n '#1f8347',\n '#1f8347',\n '#1f8347',\n '#1f8547',\n '#1f8547',\n '#1f8547',\n '#1f8647',\n '#1f8647',\n '#1f8647',\n '#1e8747',\n '#1e8747',\n '#1e8747',\n '#1e8747',\n '#1e8947',\n '#1e8947',\n '#1e8947',\n '#1e8a47',\n '#1e8a47',\n '#1e8a47',\n '#1e8b47',\n '#1e8b47',\n '#1e8b47',\n '#1e8b47',\n '#1e8c47',\n '#1e8c47',\n '#1e8c47',\n '#1e8c47',\n '#1e8e47',\n '#1e8e47',\n '#1e8e47',\n '#1e8f47',\n '#1d8f47',\n '#1d8f47',\n '#1d8f47',\n '#1d9047',\n '#1d9047',\n '#1e9047',\n '#1e9047',\n '#1e9147',\n '#1e9147',\n '#1e9147',\n '#1e9347',\n '#1e9347',\n '#1e9347',\n '#1e9347',\n '#1e9447',\n '#1e9447',\n '#1e9447',\n '#1e9548',\n '#1e9548',\n '#1e9548',\n '#1e9648',\n '#1e9648',\n '#1e9648',\n '#1f9848',\n '#1f9848',\n '#1f9848',\n '#209948',\n '#209948',\n '#209948',\n '#209a48',\n '#209a48',\n '#209a48',\n '#209b48',\n '#209b48',\n '#209b48',\n '#209b48',\n '#219c48',\n '#219c48',\n '#219d48',\n '#219d48',\n '#219e48',\n '#219e48',\n '#219e48',\n '#219f48',\n '#219f48',\n '#21a048',\n '#21a048',\n '#21a048',\n '#21a148',\n '#21a148',\n '#21a348',\n '#21a348',\n '#22a449',\n '#22a449',\n '#22a449',\n '#22a549',\n '#22a549',\n '#22a649',\n '#22a649',\n '#22a64a',\n '#23a74a',\n '#23a74a',\n '#23a84a',\n '#23a84a',\n '#23aa4a',\n '#23aa4a',\n '#23aa4a',\n '#24ab4a',\n '#24ab4a',\n '#24ab4a',\n '#25ac4a',\n '#25ac4a',\n '#25ad4a',\n '#25ad4a',\n '#25ad4a',\n '#26ae4a',\n '#26ae4a',\n '#26ae4a',\n '#26af4a',\n '#26af4a',\n '#26b04a',\n '#26b04a',\n '#26b04a',\n '#27b14a',\n '#27b14a',\n '#27b14a',\n '#27b24a',\n '#27b24a',\n '#27b24a',\n '#27b24a',\n '#27b34a',\n '#27b34a',\n '#27b34a',\n '#28b54b',\n '#28b54b',\n '#28b54b',\n '#28b54b',\n '#28b64b',\n '#28b64b',\n '#28b64d',\n '#28b64d',\n '#28b74d',\n '#28b74d',\n '#28b74d',\n '#29b74d',\n '#29b84d',\n '#29b84d',\n '#29b84d',\n '#29b84d',\n '#29b94d',\n '#29b94d',\n '#29b94d',\n '#29b94d',\n '#29b94d',\n '#29b94d',\n '#29b94d',\n '#29b94e',\n '#2aba4e',\n '#2aba4e',\n '#2aba4e',\n '#2aba4e',\n '#2aba4e',\n '#2aba4e',\n '#2aba4e',\n '#2abb4e',\n '#2abb4e',\n '#2abb4f',\n '#2abb4f',\n '#2abc4f',\n '#2abc4f',\n '#2abc4f',\n '#2bbc4f',\n '#2bbc4f',\n '#2bbd4f',\n '#2bbd4f',\n '#2bbd50',\n '#2bbd50',\n '#2bbd50',\n '#2bbe50',\n '#2bbe50',\n '#2bbe50',\n '#2bbe50',\n '#2bbe50',\n '#2bbf51',\n '#2cbf51',\n '#2cbf51',\n '#2cbf51',\n '#2cc051',\n '#2cc051',\n '#2cc051',\n '#2cc052',\n '#2cc052',\n '#2cc152',\n '#2cc152',\n '#2cc152',\n '#2cc152',\n '#2dc353',\n '#2dc353',\n '#2dc353',\n '#2dc353',\n '#2dc353',\n '#2ec453',\n '#2ec453',\n '#2ec454',\n '#2ec454',\n '#2ec454',\n '#2ec554',\n '#2ec554',\n '#2fc554',\n '#2fc554',\n '#2fc655',\n '#2fc655',\n '#2fc655',\n '#2fc655',\n '#2fc655',\n '#2fc755',\n '#2fc755',\n '#2fc756',\n '#2fc756',\n '#2fc756',\n '#2fc756',\n '#2fc856',\n '#2fc856',\n '#2fc856',\n '#2fc856',\n '#2fc856',\n '#2fc858',\n '#2fc958',\n '#2fc958',\n '#2fc958',\n '#2fc958',\n '#2fc958',\n '#2fc958',\n '#2fc958',\n '#2fca58',\n '#2fca58',\n '#2fca58',\n '#2fca59',\n '#2fca59',\n '#2fca59',\n '#2fca59',\n '#2fca59',\n '#30ca59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb59',\n '#30cb5a',\n '#30cb5a',\n '#30cb5a',\n '#30cb5a',\n '#30cb5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n '#30cc5a',\n ],\n nullColor: 'pink',\n}\nconst blueGradientBubbles = {\n colors: [\n '#0c3574',\n '#0b3475',\n '#0b3475',\n '#0c3475',\n '#0c3575',\n '#0c3475',\n '#0c3475',\n '#0c3576',\n '#0c3677',\n '#0c3677',\n '#0d3776',\n '#0d3676',\n '#0e3677',\n '#0e3576',\n '#0d3576',\n '#0d3677',\n '#0d3777',\n '#0e3778',\n '#0e3778',\n '#0d3877',\n '#0d3878',\n '#0d3878',\n '#0d3878',\n '#0d3878',\n '#0d3978',\n '#0e3778',\n '#0e3779',\n '#0e397a',\n '#0f3979',\n '#0f3a7a',\n '#0f3a7b',\n '#0f3a7b',\n '#0e3a7a',\n '#0e3a7a',\n '#0f3a7a',\n '#0e3a7a',\n '#0f3a7c',\n '#0f3a7c',\n '#0f3a7b',\n '#0f3b7b',\n '#0f3a7b',\n '#0e3a7b',\n '#0e3b7c',\n '#0f3c7c',\n '#0f3c7c',\n '#0f3d7d',\n '#0f3d7d',\n '#0f3c7d',\n '#0f3c7e',\n '#0f3d7e',\n '#0f3d7e',\n '#0f3d7e',\n '#0f3e7e',\n '#0f3d7e',\n '#103e7e',\n '#113e7f',\n '#103e7e',\n '#103d7e',\n '#103e7f',\n '#103e7e',\n '#113e80',\n '#113f80',\n '#103f7f',\n '#114080',\n '#113f81',\n '#114081',\n '#113f81',\n '#103e80',\n '#103f81',\n '#104181',\n '#104181',\n '#103f81',\n '#114082',\n '#103f82',\n '#103f81',\n '#114081',\n '#114282',\n '#114282',\n '#114282',\n '#124182',\n '#114082',\n '#114182',\n '#114283',\n '#124384',\n '#114384',\n '#114383',\n '#124383',\n '#124485',\n '#114384',\n '#114384',\n '#114384',\n '#114484',\n '#124585',\n '#124585',\n '#124585',\n '#134587',\n '#134586',\n '#134586',\n '#134687',\n '#134687',\n '#134586',\n '#134686',\n '#134687',\n '#134787',\n '#134788',\n '#134688',\n '#134688',\n '#134687',\n '#124788',\n '#124789',\n '#134688',\n '#134688',\n '#134688',\n '#134788',\n '#134889',\n '#13488a',\n '#13488a',\n '#13488a',\n '#134889',\n '#134789',\n '#13478a',\n '#13498a',\n '#14498a',\n '#15498b',\n '#14488b',\n '#14498c',\n '#15498c',\n '#14498b',\n '#15498c',\n '#15498c',\n '#14498c',\n '#154a8d',\n '#144b8c',\n '#144b8c',\n '#154b8d',\n '#144c8d',\n '#154b8d',\n '#154b8d',\n '#154c8d',\n '#144c8d',\n '#154c8d',\n '#154c8d',\n '#164c8e',\n '#164c8e',\n '#164c8e',\n '#164c8e',\n '#154d8e',\n '#154d8f',\n '#164e90',\n '#164e90',\n '#164e90',\n '#154e8f',\n '#154d90',\n '#154e90',\n '#164e90',\n '#154e91',\n '#154f91',\n '#155091',\n '#165091',\n '#164f91',\n '#164f92',\n '#165092',\n '#165092',\n '#165092',\n '#165092',\n '#155192',\n '#155192',\n '#175093',\n '#175293',\n '#175293',\n '#175093',\n '#175093',\n '#175293',\n '#175293',\n '#175193',\n '#175294',\n '#175394',\n '#175394',\n '#175294',\n '#175395',\n '#175295',\n '#175295',\n '#175395',\n '#175395',\n '#185495',\n '#185495',\n '#175396',\n '#175497',\n '#175397',\n '#175497',\n '#175597',\n '#175597',\n '#175597',\n '#175497',\n '#185497',\n '#195698',\n '#195798',\n '#185597',\n '#185497',\n '#185599',\n '#195799',\n '#195799',\n '#185799',\n '#185699',\n '#195699',\n '#195799',\n '#195799',\n '#19589a',\n '#185899',\n '#185899',\n '#18589a',\n '#18589a',\n '#18599a',\n '#18589a',\n '#18579a',\n '#19589b',\n '#19599b',\n '#19599a',\n '#18599a',\n '#1a5a9c',\n '#1a5a9d',\n '#1a5a9c',\n '#1a599d',\n '#1a5a9d',\n '#1a5a9e',\n '#1a5a9e',\n '#195a9d',\n '#195a9d',\n '#195a9d',\n '#195a9d',\n '#1a5a9e',\n '#1a5b9f',\n '#1a5b9e',\n '#1a5b9e',\n '#1a5d9e',\n '#1a5c9f',\n '#195c9f',\n '#195c9f',\n '#195da0',\n '#195d9f',\n '#195ca0',\n '#1a5ca0',\n '#1a5d9f',\n '#1a5ea1',\n '#1a5ea1',\n '#1a5da0',\n '#1a5da0',\n '#195ea0',\n '#195ea0',\n '#1a5ea0',\n '#1a5ea1',\n '#1c5fa3',\n '#1c5fa3',\n '#1b5fa3',\n '#1b5ea2',\n '#1b5ea2',\n '#1b5ea2',\n '#1b5fa3',\n '#1b60a3',\n '#1b60a3',\n '#1b5fa3',\n '#1b60a3',\n '#1c61a4',\n '#1b60a4',\n '#1b60a4',\n '#1b61a4',\n '#1b60a4',\n '#1b60a4',\n '#1b60a4',\n '#1b62a4',\n '#1b62a5',\n '#1b61a5',\n '#1b62a5',\n '#1b62a5',\n '#1b61a5',\n '#1d61a6',\n '#1d63a6',\n '#1c62a6',\n '#1d63a6',\n '#1d62a6',\n '#1c62a6',\n '#1c63a7',\n '#1d64a8',\n '#1c64a7',\n '#1c64a7',\n '#1d65a8',\n '#1c63a8',\n '#1d64a9',\n '#1d65a9',\n '#1d65a9',\n '#1d65a9',\n '#1d65a9',\n '#1d66a9',\n '#1d66a9',\n '#1c65a9',\n '#1d66aa',\n '#1d66aa',\n '#1c65aa',\n '#1c66aa',\n '#1c66aa',\n '#1d66aa',\n '#1c66ab',\n '#1c68ab',\n '#1c67ab',\n '#1c67ab',\n '#1d68ab',\n '#1d68ac',\n '#1e68ac',\n '#1e67ab',\n '#1d67ab',\n '#1e69ac',\n '#1e69ac',\n '#1d68ac',\n '#1d68ac',\n '#1e69ae',\n '#1e6aae',\n '#1e6aad',\n '#1e69ad',\n '#1e6aae',\n '#1d69ae',\n '#1d6aae',\n '#1e6bae',\n '#1e6aaf',\n '#1e6baf',\n '#1e6baf',\n '#1e6bb0',\n '#1e6cb0',\n '#1d6baf',\n '#1d6baf',\n '#1e6bb0',\n '#1d6ab0',\n '#1d6cb0',\n '#1d6db1',\n '#1e6cb1',\n '#1e6db0',\n '#1e6cb1',\n '#1d6cb1',\n '#1d6cb0',\n '#1f6db1',\n '#1f6cb1',\n '#1f6cb1',\n '#1f6db2',\n '#1f6cb1',\n '#1f6db1',\n '#1f6eb3',\n '#1f6fb3',\n '#1f6eb3',\n '#1f6eb3',\n '#1f6fb3',\n '#1f6fb3',\n '#1f6fb4',\n '#1f6fb4',\n '#1f6fb4',\n '#2070b5',\n '#1f70b4',\n '#1f70b4',\n '#1f70b4',\n '#1f71b5',\n '#1f71b5',\n '#1f71b5',\n '#1f71b5',\n '#1f70b5',\n '#1f71b5',\n '#1f72b6',\n '#1f72b6',\n '#1f71b6',\n '#1f71b6',\n '#1f72b5',\n '#2072b6',\n '#2172b7',\n '#2172b7',\n '#2172b6',\n '#2172b6',\n '#2172b7',\n '#2072b7',\n '#2073b8',\n '#2173b9',\n '#2173b9',\n '#2075b8',\n '#2075b8',\n '#2174b8',\n '#2174b9',\n '#2175ba',\n '#2174ba',\n '#2174ba',\n '#2175ba',\n '#2175ba',\n '#2176bb',\n '#2176bb',\n '#2076ba',\n '#2076ba',\n '#2176bb',\n '#2176bb',\n '#2076bb',\n '#2077bb',\n '#2177bc',\n '#2077bb',\n '#2077bb',\n '#2077bc',\n '#2077bc',\n '#2077bc',\n '#2177bd',\n '#2078bc',\n '#2078bc',\n '#2178bd',\n '#2279be',\n '#2178be',\n '#2179be',\n '#2179be',\n '#2279bf',\n '#2278bf',\n '#2179bf',\n '#217abf',\n '#227ac0',\n '#2279c0',\n '#227ac0',\n '#227abf',\n '#227ac0',\n '#217bc0',\n '#227bc0',\n '#227bc0',\n '#217bc0',\n '#217ac0',\n '#217bc0',\n '#217cc1',\n '#227cc1',\n '#217cc1',\n '#217cc1',\n '#227cc1',\n '#217cc1',\n '#227cc2',\n '#227cc2',\n '#227dc2',\n '#217dc1',\n '#217dc2',\n '#217dc2',\n '#217dc3',\n '#217ec3',\n '#217ec3',\n '#217ec3',\n '#227ec4',\n '#237fc4',\n '#237ec5',\n '#237ec5',\n '#237ec5',\n '#237ec4',\n '#237ec4',\n '#237ec6',\n '#237fc6',\n '#2380c6',\n '#237fc5',\n '#237fc5',\n '#2380c5',\n '#2380c7',\n '#2381c6',\n '#2381c6',\n '#2380c6',\n '#2381c7',\n '#2380c6',\n '#2380c7',\n '#2381c8',\n '#2382c7',\n '#2381c7',\n '#2381c7',\n '#2382c8',\n '#2382c8',\n '#2383c8',\n '#2384c9',\n '#2384c9',\n '#2383c8',\n '#2383c9',\n '#2383ca',\n '#2384ca',\n '#2384ca',\n '#2383ca',\n '#2383ca',\n '#2384ca',\n '#2384ca',\n '#2484cb',\n '#2485cb',\n '#2385cb',\n '#2384cb',\n '#2385cb',\n '#2485cb',\n '#2585cc',\n '#2586cc',\n '#2485cc',\n '#2485cc',\n '#2485cc',\n '#2486cd',\n '#2586cd',\n '#2587cd',\n '#2487cc',\n '#2486cd',\n '#2587cd',\n '#2587cd',\n '#2487ce',\n '#2588ce',\n '#2588ce',\n '#2588ce',\n '#2488cf',\n '#2588cf',\n '#2589ce',\n '#2589ce',\n '#2688cf',\n '#2589ce',\n '#2789cf',\n '#2889d0',\n '#2889d0',\n '#288ad0',\n '#2889d0',\n '#298ad0',\n '#2b8bd0',\n '#2a89cf',\n '#2989cf',\n '#2b8bcf',\n '#2c8cd0',\n '#2c8ccf',\n '#2d8cd0',\n '#2d8cd0',\n '#2c8bd0',\n '#2e8cd1',\n '#2e8cd1',\n '#2e8cd0',\n '#2e8cd1',\n '#2e8dd0',\n '#308ed0',\n '#318ed1',\n '#318dd1',\n '#308dd0',\n '#308dd0',\n '#318fd0',\n '#338fd1',\n '#328dd1',\n '#338ed1',\n '#348fd1',\n '#348fd2',\n '#338ed2',\n '#338ed1',\n '#348fd1',\n '#3590d1',\n '#368fd2',\n '#3690d1',\n '#3690d1',\n '#3690d2',\n '#3791d3',\n '#3791d3',\n '#3791d2',\n '#3790d2',\n '#3790d2',\n '#3892d2',\n '#3892d2',\n '#3992d2',\n '#3a92d3',\n '#3a93d3',\n '#3b92d3',\n '#3b92d3',\n '#3a93d3',\n '#3a93d3',\n '#3b93d3',\n '#3c94d3',\n '#3d94d3',\n '#3d94d3',\n '#3d94d3',\n '#3d93d3',\n '#3f93d4',\n '#3f96d4',\n '#3f96d4',\n '#3e95d3',\n '#3e96d3',\n '#3f96d4',\n '#4095d4',\n '#4095d4',\n '#3f96d4',\n '#3f96d4',\n '#4096d4',\n '#4297d4',\n '#4197d4',\n '#4096d3',\n '#4196d3',\n '#4397d5',\n '#4398d5',\n '#4397d5',\n '#4398d5',\n '#4398d5',\n '#4499d5',\n '#4499d5',\n '#4499d5',\n '#4499d5',\n '#459ad5',\n '#459ad4',\n '#459ad4',\n '#459ad4',\n '#459ad5',\n '#459ad6',\n '#469bd6',\n '#469bd5',\n '#469ad5',\n '#469ad5',\n '#479bd5',\n '#499cd6',\n '#499cd6',\n '#499cd5',\n '#499cd5',\n '#499cd6',\n '#4a9dd6',\n '#4a9fd6',\n '#4a9ed6',\n '#4a9ed5',\n '#4a9ed6',\n '#4b9ed7',\n '#4b9ed7',\n '#4b9fd7',\n '#4a9ed7',\n '#4b9ed7',\n '#4ca0d7',\n '#4c9ed7',\n '#4b9ed7',\n '#4c9fd7',\n '#4da0d7',\n '#4da0d8',\n '#4da0d8',\n '#4c9fd8',\n '#4c9fd7',\n '#4da0d7',\n '#4ea2d8',\n '#4ea2d8',\n '#4ea1d8',\n '#4ea2d7',\n '#4ea2d7',\n '#4ea2d8',\n '#4ea2d7',\n '#4ea2d7',\n '#4fa3d9',\n '#50a3d9',\n '#50a3d8',\n '#4fa2d8',\n '#4fa3d8',\n '#51a3d8',\n '#51a3d8',\n '#51a3d9',\n '#51a3d8',\n '#51a3d8',\n '#52a4d9',\n '#52a5da',\n '#52a4d9',\n '#52a4d9',\n '#52a5da',\n '#53a5da',\n '#53a5da',\n '#53a5da',\n '#54a5da',\n '#54a5da',\n '#54a6d9',\n '#54a7d9',\n '#54a6d9',\n '#54a7d9',\n '#55a8da',\n '#55a8da',\n '#56a8db',\n '#55a7da',\n '#56a8db',\n '#57a8db',\n '#56a7da',\n '#57a8db',\n '#57a8db',\n '#57a8db',\n '#58a9da',\n '#58aada',\n '#57a9da',\n '#57a8da',\n '#57a9da',\n '#58aadb',\n '#59aadb',\n '#59aadb',\n '#59aadc',\n '#59abdb',\n '#5aacdb',\n '#5aabdb',\n '#59abdb',\n '#5babdb',\n '#5babdc',\n '#5babdc',\n '#5aabdc',\n '#5baddc',\n '#5bacdc',\n '#5cacdc',\n '#5bacdc',\n '#5caedc',\n '#5caddc',\n '#5cacdc',\n '#5caddc',\n '#5dafdc',\n '#5dafdc',\n '#5caedc',\n '#5daedc',\n '#5eb0dd',\n '#5db0dd',\n '#5eafdd',\n '#5eafdd',\n '#5fb1dd',\n '#5fb1dd',\n '#5fafdd',\n '#5fafdd',\n '#60b1dd',\n '#60b1dd',\n '#60b1dd',\n '#60b1dd',\n '#60b1dd',\n '#61b1de',\n '#61b1de',\n '#61b1de',\n '#61b1de',\n '#61b2dd',\n '#61b2dd',\n '#62b2dd',\n '#62b2de',\n '#62b2de',\n '#62b2de',\n '#63b3dd',\n '#63b4de',\n '#63b4df',\n '#63b4df',\n '#63b3df',\n '#63b4de',\n '#63b4de',\n '#63b4df',\n '#63b5df',\n '#64b6df',\n '#64b6df',\n '#64b6df',\n '#64b5de',\n '#65b6e0',\n '#65b7e0',\n '#65b7df',\n '#65b6e0',\n '#65b6e0',\n '#65b6df',\n '#66b6df',\n '#67b7e0',\n '#67b8e0',\n '#66b8df',\n '#66b8e0',\n '#67b8df',\n '#67b7df',\n '#67b8e0',\n '#67b9e0',\n '#67b8e0',\n '#68b9e1',\n '#69bae1',\n '#69bae1',\n '#68b8e0',\n '#69b9e0',\n '#69bae0',\n '#69bae0',\n '#6abbe1',\n '#69bbe0',\n '#69bbe0',\n '#69bbe1',\n '#6abce1',\n '#6abbe0',\n '#6abbe0',\n '#6abbe1',\n '#6abce1',\n '#6abce2',\n '#6bbde2',\n '#6bbee1',\n '#6cbde2',\n '#6cbde2',\n '#6bbde1',\n '#6cbde1',\n '#6cbde2',\n '#6cbde2',\n '#6cbde2',\n '#6cbee2',\n '#6cbee2',\n '#6dbfe2',\n '#6dbfe2',\n '#6dbee2',\n '#6ebee3',\n '#6fbfe3',\n '#6fc0e3',\n '#6fc0e2',\n '#6ebfe3',\n '#6ec0e3',\n '#6ec1e3',\n '#6ec1e3',\n '#6ec1e4',\n '#6fc0e3',\n '#70c1e3',\n '#70c2e3',\n '#70c2e4',\n '#6fc1e3',\n '#6fc1e3',\n '#70c2e3',\n '#71c2e4',\n '#70c3e4',\n '#70c2e4',\n '#70c2e4',\n '#72c4e4',\n '#72c4e4',\n '#71c2e4',\n '#71c2e4',\n '#73c4e4',\n '#72c3e4',\n '#72c3e4',\n '#72c3e4',\n '#72c4e4',\n '#73c5e4',\n '#73c5e4',\n '#72c5e4',\n '#73c6e4',\n '#73c5e4',\n '#73c6e4',\n '#74c7e5',\n '#73c6e4',\n '#75c8e5',\n '#74c7e5',\n '#74c7e5',\n '#74c6e5',\n '#75c6e5',\n '#76c7e5',\n '#75c7e5',\n '#76c8e5',\n '#75c8e5',\n '#75c8e6',\n '#76c8e6',\n '#77c8e5',\n '#76c9e6',\n '#76c9e5',\n '#76c9e5',\n '#77cae6',\n '#77c9e6',\n '#77c9e6',\n '#77c9e6',\n '#78cae6',\n '#77cbe7',\n '#77cbe7',\n '#78cbe7',\n '#78cbe7',\n '#79cae6',\n '#78cae6',\n '#78cbe7',\n '#78cae6',\n '#79cae6',\n '#7acce6',\n '#7acde7',\n '#7acbe7',\n '#79cce6',\n '#79cee7',\n '#7acee8',\n '#7acde8',\n '#79cde7',\n '#7acde7',\n '#7bcee8',\n '#7acee7',\n '#7acfe7',\n '#7acee7',\n '#7ccee8',\n '#7bcee7',\n '#7bcfe7',\n '#7bcfe7',\n '#7bcfe8',\n '#7dd0e9',\n '#7dd0e9',\n '#7ccfe8',\n '#7ccfe8',\n '#7cd1e8',\n '#7cd1e8',\n '#7cd0e8',\n '#7cd0e8',\n '#7dd1e8',\n '#7dd2e9',\n '#7dd2e9',\n '#7ed2e9',\n '#7dd1e8',\n '#7dd2e8',\n '#7fd3ea',\n '#7fd3ea',\n '#7ed3e9',\n '#7ed2ea',\n '#80d2ea',\n '#7fd3e9',\n '#7fd2e9',\n '#80d4ea',\n '#80d5ea',\n '#7fd4e9',\n '#7fd4e9',\n '#80d4e9',\n '#81d6ea',\n '#81d6eb',\n '#80d4ea',\n '#80d5ea',\n '#80d6ea',\n '#80d5ea',\n '#81d6ea',\n '#81d6ea',\n '#82d6ea',\n '#82d7ea',\n '#82d8ea',\n '#81d6ea',\n '#81d6ea',\n '#82d8ea',\n '#82d7eb',\n '#82d8eb',\n '#82d8eb',\n '#82d7eb',\n '#83d9eb',\n '#84d9ec',\n '#84d9ec',\n '#83d8eb',\n '#83d8eb',\n '#85d8eb',\n '#85d9eb',\n '#84daeb',\n '#85daeb',\n '#85dbec',\n '#85dbec',\n '#84daec',\n '#85dbec',\n '#86dbec',\n '#86dbec',\n '#85dbec',\n '#85dbec',\n '#85dbec',\n '#85dcec',\n '#86ddec',\n '#86dceb',\n '#86dceb',\n '#87ddec',\n '#86dced',\n '#86dcec',\n '#86deec',\n '#86deed',\n '#87ddec',\n '#87deed',\n '#87dfec',\n '#87deec',\n '#88deed',\n '#89deec',\n '#88deec',\n '#88dfed',\n '#88dfec',\n '#89e0ed',\n '#89e0ee',\n '#88dfee',\n '#89e0ee',\n '#88dfed',\n '#88dfed',\n '#8ae1ee',\n '#89e1ed',\n '#8ae2ee',\n '#8ae2ee',\n '#8ae2ee',\n '#8ae1ee',\n '#8be3ee',\n '#8be3ee',\n '#8be2ee',\n '#8be2ee',\n '#8be2ef',\n '#8ce2ef',\n '#8ce3ef',\n '#8be3ee',\n '#8ce4ef',\n '#8be3ef',\n '#8be3ee',\n '#8de5ef',\n '#8de4ef',\n '#8de4ef',\n '#8de5ef',\n '#8ce4ef',\n '#8de4ef',\n '#8de4ef',\n '#8de4f0',\n '#8ee6f0',\n '#8ee6f0',\n '#8ee6ef',\n '#8ee6ef',\n '#8de7ef',\n '#8de6ef',\n '#8fe7f0',\n '#8fe8f1',\n '#8ee6ef',\n '#8ee6ef',\n '#8ee8f1',\n '#8fe8f1',\n '#8fe7f0',\n '#90e8f1',\n '#90e8f1',\n '#8fe8f0',\n '#90eaf1',\n '#8fe9f0',\n '#8fe9f0',\n '#90eaf1',\n '#90eaf1',\n '#91eaf1',\n '#91eaf1',\n '#91eaf1',\n '#92ebf2',\n '#91eaf1',\n ],\n nullColor: 'pink',\n}\n\nexport const gradients: Record = {\n [ScaleId.IntradayReduced]: redGreenGradient,\n [ScaleId.DayPerf]: redGreenGradient,\n _5: redGreenGradient,\n _10: redGreenGradient,\n _15: redGreenGradient,\n _20: redGreenGradient,\n _25: redGreenGradient,\n _relvol: blueGradient,\n _pe: greenRedGradient,\n _fpe: greenRedGradient,\n _peg: greenRedGradient,\n _ps: greenRedGradient,\n _pb: greenRedGradient,\n _div: greenGradient,\n _eps5y: redGreenGradient,\n _short: redGradient,\n _rec: redGreenGradient,\n _earndate: earningsGradient,\n _portfolioPct: redGreenGradient,\n _portfolioUsd: redGreenGradient,\n}\n\nexport const bubbleGradients: Record = {\n [ScaleId.IntradayReduced]: redGreenGradientBubbles,\n [ScaleId.DayPerf]: redGreenGradientBubbles,\n _5: redGreenGradientBubbles,\n _10: redGreenGradientBubbles,\n _15: redGreenGradientBubbles,\n _20: redGreenGradientBubbles,\n _25: redGreenGradientBubbles,\n _relvol: blueGradientBubbles,\n _pe: redGreenGradientBubbles,\n _fpe: redGreenGradientBubbles,\n _peg: redGreenGradientBubbles,\n _ps: redGreenGradientBubbles,\n _pb: redGreenGradientBubbles,\n _div: redGreenGradientBubbles,\n _eps5y: redGreenGradientBubbles,\n _short: redGreenGradientBubbles, // TODO red skala\n _rec: redGreenGradientBubbles,\n _earndate: redGreenGradientBubbles,\n _portfolioPct: redGreenGradientBubbles,\n _portfolioUsd: redGreenGradientBubbles,\n}\n\nexport const gradientSmall = redGreenGradientSmall\n","// Based on Lato font with bold weight\nexport const fontSizesWidths: Record> = {\n 4: {\n 0: 2.32,\n 1: 2.32,\n 2: 2.32,\n 3: 2.32,\n 4: 2.32,\n 5: 2.32,\n 6: 2.32,\n 7: 2.32,\n 8: 2.32,\n 9: 2.32,\n ' ': 0.772,\n '+': 2.32,\n '-': 1.436,\n '%': 3.212,\n '.': 0.9,\n a: 2.094,\n b: 2.28,\n c: 1.908,\n d: 2.28,\n e: 2.138,\n f: 1.402,\n g: 2.07,\n h: 2.274,\n i: 1.084,\n j: 1.076,\n k: 2.206,\n l: 1.084,\n m: 3.368,\n n: 2.274,\n o: 2.274,\n p: 2.262,\n q: 2.28,\n r: 1.634,\n s: 1.748,\n t: 1.548,\n u: 2.274,\n v: 2.134,\n w: 3.164,\n x: 2.16,\n y: 2.134,\n z: 1.878,\n A: 2.84,\n B: 2.606,\n C: 2.682,\n D: 2.99,\n E: 2.29,\n F: 2.246,\n G: 2.892,\n H: 3.024,\n I: 1.256,\n J: 1.748,\n K: 2.792,\n L: 2.068,\n M: 3.72,\n N: 3.024,\n O: 3.198,\n P: 2.5,\n Q: 3.198,\n R: 2.62,\n S: 2.146,\n T: 2.38,\n U: 2.912,\n V: 2.84,\n W: 4.186,\n X: 2.716,\n Y: 2.618,\n Z: 2.468,\n },\n 6: {\n 0: 3.48,\n 1: 3.48,\n 2: 3.48,\n 3: 3.48,\n 4: 3.48,\n 5: 3.48,\n 6: 3.48,\n 7: 3.48,\n 8: 3.48,\n 9: 3.48,\n ' ': 1.158,\n '+': 3.48,\n '-': 2.154,\n '%': 4.818,\n '.': 1.35,\n a: 3.141,\n b: 3.42,\n c: 2.862,\n d: 3.42,\n e: 3.207,\n f: 2.103,\n g: 3.105,\n h: 3.411,\n i: 1.626,\n j: 1.614,\n k: 3.309,\n l: 1.626,\n m: 5.052,\n n: 3.411,\n o: 3.411,\n p: 3.393,\n q: 3.42,\n r: 2.451,\n s: 2.622,\n t: 2.322,\n u: 3.411,\n v: 3.201,\n w: 4.746,\n x: 3.24,\n y: 3.201,\n z: 2.817,\n A: 4.26,\n B: 3.909,\n C: 4.023,\n D: 4.485,\n E: 3.435,\n F: 3.369,\n G: 4.338,\n H: 4.536,\n I: 1.884,\n J: 2.622,\n K: 4.188,\n L: 3.102,\n M: 5.58,\n N: 4.536,\n O: 4.797,\n P: 3.75,\n Q: 4.797,\n R: 3.93,\n S: 3.219,\n T: 3.57,\n U: 4.368,\n V: 4.26,\n W: 6.279,\n X: 4.074,\n Y: 3.927,\n Z: 3.702,\n },\n 8: {\n 0: 4.64,\n 1: 4.64,\n 2: 4.64,\n 3: 4.64,\n 4: 4.64,\n 5: 4.64,\n 6: 4.64,\n 7: 4.64,\n 8: 4.64,\n 9: 4.64,\n ' ': 1.544,\n '+': 4.64,\n '-': 2.872,\n '%': 6.424,\n '.': 1.8,\n a: 4.188,\n b: 4.56,\n c: 3.816,\n d: 4.56,\n e: 4.276,\n f: 2.804,\n g: 4.14,\n h: 4.548,\n i: 2.168,\n j: 2.152,\n k: 4.412,\n l: 2.168,\n m: 6.736,\n n: 4.548,\n o: 4.548,\n p: 4.524,\n q: 4.56,\n r: 3.268,\n s: 3.496,\n t: 3.096,\n u: 4.548,\n v: 4.268,\n w: 6.328,\n x: 4.32,\n y: 4.268,\n z: 3.756,\n A: 5.68,\n B: 5.212,\n C: 5.364,\n D: 5.98,\n E: 4.58,\n F: 4.492,\n G: 5.784,\n H: 6.048,\n I: 2.512,\n J: 3.496,\n K: 5.584,\n L: 4.136,\n M: 7.44,\n N: 6.048,\n O: 6.396,\n P: 5,\n Q: 6.396,\n R: 5.24,\n S: 4.292,\n T: 4.76,\n U: 5.824,\n V: 5.68,\n W: 8.372,\n X: 5.432,\n Y: 5.236,\n Z: 4.936,\n },\n 9: {\n 0: 5.22,\n 1: 5.22,\n 2: 5.22,\n 3: 5.22,\n 4: 5.22,\n 5: 5.22,\n 6: 5.22,\n 7: 5.22,\n 8: 5.22,\n 9: 5.22,\n ' ': 1.737,\n '+': 5.22,\n '-': 3.231,\n '%': 7.227,\n '.': 2.025,\n a: 4.712,\n b: 5.13,\n c: 4.293,\n d: 5.13,\n e: 4.811,\n f: 3.155,\n g: 4.658,\n h: 5.117,\n i: 2.439,\n j: 2.421,\n k: 4.964,\n l: 2.439,\n m: 7.578,\n n: 5.117,\n o: 5.117,\n p: 5.09,\n q: 5.13,\n r: 3.677,\n s: 3.933,\n t: 3.483,\n u: 5.117,\n v: 4.802,\n w: 7.119,\n x: 4.86,\n y: 4.802,\n z: 4.226,\n A: 6.39,\n B: 5.864,\n C: 6.035,\n D: 6.728,\n E: 5.153,\n F: 5.054,\n G: 6.507,\n H: 6.804,\n I: 2.826,\n J: 3.933,\n K: 6.282,\n L: 4.653,\n M: 8.37,\n N: 6.804,\n O: 7.196,\n P: 5.625,\n Q: 7.196,\n R: 5.895,\n S: 4.829,\n T: 5.355,\n U: 6.552,\n V: 6.39,\n W: 9.419,\n X: 6.111,\n Y: 5.891,\n Z: 5.553,\n },\n 10: {\n 0: 5.8,\n 1: 5.8,\n 2: 5.8,\n 3: 5.8,\n 4: 5.8,\n 5: 5.8,\n 6: 5.8,\n 7: 5.8,\n 8: 5.8,\n 9: 5.8,\n ' ': 1.93,\n '+': 5.8,\n '-': 3.59,\n '%': 8.03,\n '.': 2.25,\n a: 5.235,\n b: 5.7,\n c: 4.77,\n d: 5.7,\n e: 5.345,\n f: 3.505,\n g: 5.175,\n h: 5.685,\n i: 2.71,\n j: 2.69,\n k: 5.515,\n l: 2.71,\n m: 8.42,\n n: 5.685,\n o: 5.685,\n p: 5.655,\n q: 5.7,\n r: 4.085,\n s: 4.37,\n t: 3.87,\n u: 5.685,\n v: 5.335,\n w: 7.91,\n x: 5.4,\n y: 5.335,\n z: 4.695,\n A: 7.1,\n B: 6.515,\n C: 6.705,\n D: 7.475,\n E: 5.725,\n F: 5.615,\n G: 7.23,\n H: 7.56,\n I: 3.14,\n J: 4.37,\n K: 6.98,\n L: 5.17,\n M: 9.3,\n N: 7.56,\n O: 7.995,\n P: 6.25,\n Q: 7.995,\n R: 6.55,\n S: 5.365,\n T: 5.95,\n U: 7.28,\n V: 7.1,\n W: 10.465,\n X: 6.79,\n Y: 6.545,\n Z: 6.17,\n },\n 11: {\n 0: 6.38,\n 1: 6.38,\n 2: 6.38,\n 3: 6.38,\n 4: 6.38,\n 5: 6.38,\n 6: 6.38,\n 7: 6.38,\n 8: 6.38,\n 9: 6.38,\n ' ': 2.123,\n '+': 6.38,\n '-': 3.949,\n '%': 8.833,\n '.': 2.475,\n a: 5.759,\n b: 6.27,\n c: 5.247,\n d: 6.27,\n e: 5.88,\n f: 3.856,\n g: 5.693,\n h: 6.254,\n i: 2.981,\n j: 2.959,\n k: 6.067,\n l: 2.981,\n m: 9.262,\n n: 6.254,\n o: 6.254,\n p: 6.221,\n q: 6.27,\n r: 4.494,\n s: 4.807,\n t: 4.257,\n u: 6.254,\n v: 5.869,\n w: 8.701,\n x: 5.94,\n y: 5.869,\n z: 5.165,\n A: 7.81,\n B: 7.167,\n C: 7.376,\n D: 8.223,\n E: 6.298,\n F: 6.177,\n G: 7.953,\n H: 8.316,\n I: 3.454,\n J: 4.807,\n K: 7.678,\n L: 5.687,\n M: 10.23,\n N: 8.316,\n O: 8.795,\n P: 6.875,\n Q: 8.795,\n R: 7.205,\n S: 5.902,\n T: 6.545,\n U: 8.008,\n V: 7.81,\n W: 11.512,\n X: 7.469,\n Y: 7.2,\n Z: 6.787,\n },\n 12: {\n 0: 6.96,\n 1: 6.96,\n 2: 6.96,\n 3: 6.96,\n 4: 6.96,\n 5: 6.96,\n 6: 6.96,\n 7: 6.96,\n 8: 6.96,\n 9: 6.96,\n ' ': 2.316,\n '+': 6.96,\n '-': 4.308,\n '%': 9.636,\n '.': 2.7,\n a: 6.282,\n b: 6.84,\n c: 5.724,\n d: 6.84,\n e: 6.414,\n f: 4.206,\n g: 6.21,\n h: 6.822,\n i: 3.252,\n j: 3.228,\n k: 6.618,\n l: 3.252,\n m: 10.104,\n n: 6.822,\n o: 6.822,\n p: 6.786,\n q: 6.84,\n r: 4.902,\n s: 5.244,\n t: 4.644,\n u: 6.822,\n v: 6.402,\n w: 9.492,\n x: 6.48,\n y: 6.402,\n z: 5.634,\n A: 8.52,\n B: 7.818,\n C: 8.046,\n D: 8.97,\n E: 6.87,\n F: 6.738,\n G: 8.676,\n H: 9.072,\n I: 3.768,\n J: 5.244,\n K: 8.376,\n L: 6.204,\n M: 11.16,\n N: 9.072,\n O: 9.594,\n P: 7.5,\n Q: 9.594,\n R: 7.86,\n S: 6.438,\n T: 7.14,\n U: 8.736,\n V: 8.52,\n W: 12.558,\n X: 8.148,\n Y: 7.854,\n Z: 7.404,\n },\n 13: {\n 0: 7.54,\n 1: 7.54,\n 2: 7.54,\n 3: 7.54,\n 4: 7.54,\n 5: 7.54,\n 6: 7.54,\n 7: 7.54,\n 8: 7.54,\n 9: 7.54,\n ' ': 2.509,\n '+': 7.54,\n '-': 4.667,\n '%': 10.439,\n '.': 2.925,\n a: 6.806,\n b: 7.41,\n c: 6.201,\n d: 7.41,\n e: 6.949,\n f: 4.557,\n g: 6.728,\n h: 7.391,\n i: 3.523,\n j: 3.497,\n k: 7.17,\n l: 3.523,\n m: 10.946,\n n: 7.391,\n o: 7.391,\n p: 7.352,\n q: 7.41,\n r: 5.311,\n s: 5.681,\n t: 5.031,\n u: 7.391,\n v: 6.936,\n w: 10.283,\n x: 7.02,\n y: 6.936,\n z: 6.104,\n A: 9.23,\n B: 8.47,\n C: 8.717,\n D: 9.718,\n E: 7.443,\n F: 7.3,\n G: 9.399,\n H: 9.828,\n I: 4.082,\n J: 5.681,\n K: 9.074,\n L: 6.721,\n M: 12.09,\n N: 9.828,\n O: 10.394,\n P: 8.125,\n Q: 10.394,\n R: 8.515,\n S: 6.975,\n T: 7.735,\n U: 9.464,\n V: 9.23,\n W: 13.605,\n X: 8.827,\n Y: 8.509,\n Z: 8.021,\n },\n 14: {\n 0: 8.12,\n 1: 8.12,\n 2: 8.12,\n 3: 8.12,\n 4: 8.12,\n 5: 8.12,\n 6: 8.12,\n 7: 8.12,\n 8: 8.12,\n 9: 8.12,\n ' ': 2.702,\n '+': 8.12,\n '-': 5.026,\n '%': 11.242,\n '.': 3.15,\n a: 7.329,\n b: 7.98,\n c: 6.678,\n d: 7.98,\n e: 7.483,\n f: 4.907,\n g: 7.245,\n h: 7.959,\n i: 3.794,\n j: 3.766,\n k: 7.721,\n l: 3.794,\n m: 11.788,\n n: 7.959,\n o: 7.959,\n p: 7.917,\n q: 7.98,\n r: 5.719,\n s: 6.118,\n t: 5.418,\n u: 7.959,\n v: 7.469,\n w: 11.074,\n x: 7.56,\n y: 7.469,\n z: 6.573,\n A: 9.94,\n B: 9.121,\n C: 9.387,\n D: 10.465,\n E: 8.015,\n F: 7.861,\n G: 10.122,\n H: 10.584,\n I: 4.396,\n J: 6.118,\n K: 9.772,\n L: 7.238,\n M: 13.02,\n N: 10.584,\n O: 11.193,\n P: 8.75,\n Q: 11.193,\n R: 9.17,\n S: 7.511,\n T: 8.33,\n U: 10.192,\n V: 9.94,\n W: 14.651,\n X: 9.506,\n Y: 9.163,\n Z: 8.638,\n },\n 18: {\n 0: 10.44,\n 1: 10.44,\n 2: 10.44,\n 3: 10.44,\n 4: 10.44,\n 5: 10.44,\n 6: 10.44,\n 7: 10.44,\n 8: 10.44,\n 9: 10.44,\n ' ': 3.474,\n '+': 10.44,\n '-': 6.462,\n '%': 14.454,\n '.': 4.05,\n a: 9.423,\n b: 10.26,\n c: 8.586,\n d: 10.26,\n e: 9.621,\n f: 6.309,\n g: 9.315,\n h: 10.233,\n i: 4.878,\n j: 4.842,\n k: 9.927,\n l: 4.878,\n m: 15.156,\n n: 10.233,\n o: 10.233,\n p: 10.179,\n q: 10.26,\n r: 7.353,\n s: 7.866,\n t: 6.966,\n u: 10.233,\n v: 9.603,\n w: 14.238,\n x: 9.72,\n y: 9.603,\n z: 8.451,\n A: 12.78,\n B: 11.727,\n C: 12.069,\n D: 13.455,\n E: 10.305,\n F: 10.107,\n G: 13.014,\n H: 13.608,\n I: 5.652,\n J: 7.866,\n K: 12.564,\n L: 9.306,\n M: 16.74,\n N: 13.608,\n O: 14.391,\n P: 11.25,\n Q: 14.391,\n R: 11.79,\n S: 9.657,\n T: 10.71,\n U: 13.104,\n V: 12.78,\n W: 18.837,\n X: 12.222,\n Y: 11.781,\n Z: 11.106,\n },\n 20: {\n 0: 11.6,\n 1: 11.6,\n 2: 11.6,\n 3: 11.6,\n 4: 11.6,\n 5: 11.6,\n 6: 11.6,\n 7: 11.6,\n 8: 11.6,\n 9: 11.6,\n ' ': 3.86,\n '+': 11.6,\n '-': 7.18,\n '%': 16.06,\n '.': 4.5,\n a: 10.47,\n b: 11.4,\n c: 9.54,\n d: 11.4,\n e: 10.69,\n f: 7.01,\n g: 10.35,\n h: 11.37,\n i: 5.42,\n j: 5.38,\n k: 11.03,\n l: 5.42,\n m: 16.84,\n n: 11.37,\n o: 11.37,\n p: 11.31,\n q: 11.4,\n r: 8.17,\n s: 8.74,\n t: 7.74,\n u: 11.37,\n v: 10.67,\n w: 15.82,\n x: 10.8,\n y: 10.67,\n z: 9.39,\n A: 14.2,\n B: 13.03,\n C: 13.41,\n D: 14.95,\n E: 11.45,\n F: 11.23,\n G: 14.46,\n H: 15.12,\n I: 6.28,\n J: 8.74,\n K: 13.96,\n L: 10.34,\n M: 18.6,\n N: 15.12,\n O: 15.99,\n P: 12.5,\n Q: 15.99,\n R: 13.1,\n S: 10.73,\n T: 11.9,\n U: 14.56,\n V: 14.2,\n W: 20.93,\n X: 13.58,\n Y: 13.09,\n Z: 12.34,\n },\n 24: {\n 0: 13.92,\n 1: 13.92,\n 2: 13.92,\n 3: 13.92,\n 4: 13.92,\n 5: 13.92,\n 6: 13.92,\n 7: 13.92,\n 8: 13.92,\n 9: 13.92,\n ' ': 4.632,\n '+': 13.92,\n '-': 8.616,\n '%': 19.272,\n '.': 5.4,\n a: 12.564,\n b: 13.68,\n c: 11.448,\n d: 13.68,\n e: 12.828,\n f: 8.412,\n g: 12.42,\n h: 13.644,\n i: 6.504,\n j: 6.456,\n k: 13.236,\n l: 6.504,\n m: 20.208,\n n: 13.644,\n o: 13.644,\n p: 13.572,\n q: 13.68,\n r: 9.804,\n s: 10.488,\n t: 9.288,\n u: 13.644,\n v: 12.804,\n w: 18.984,\n x: 12.96,\n y: 12.804,\n z: 11.268,\n A: 17.04,\n B: 15.636,\n C: 16.092,\n D: 17.94,\n E: 13.74,\n F: 13.476,\n G: 17.352,\n H: 18.144,\n I: 7.536,\n J: 10.488,\n K: 16.752,\n L: 12.408,\n M: 22.32,\n N: 18.144,\n O: 19.188,\n P: 15,\n Q: 19.188,\n R: 15.72,\n S: 12.876,\n T: 14.28,\n U: 17.472,\n V: 17.04,\n W: 25.116,\n X: 16.296,\n Y: 15.708,\n Z: 14.808,\n },\n 30: {\n 0: 17.4,\n 1: 17.4,\n 2: 17.4,\n 3: 17.4,\n 4: 17.4,\n 5: 17.4,\n 6: 17.4,\n 7: 17.4,\n 8: 17.4,\n 9: 17.4,\n ' ': 5.79,\n '+': 17.4,\n '-': 10.77,\n '%': 24.09,\n '.': 6.75,\n a: 15.705,\n b: 17.1,\n c: 14.31,\n d: 17.1,\n e: 16.035,\n f: 10.515,\n g: 15.525,\n h: 17.055,\n i: 8.13,\n j: 8.07,\n k: 16.545,\n l: 8.13,\n m: 25.26,\n n: 17.055,\n o: 17.055,\n p: 16.965,\n q: 17.1,\n r: 12.255,\n s: 13.11,\n t: 11.61,\n u: 17.055,\n v: 16.005,\n w: 23.73,\n x: 16.2,\n y: 16.005,\n z: 14.085,\n A: 21.3,\n B: 19.545,\n C: 20.115,\n D: 22.425,\n E: 17.175,\n F: 16.845,\n G: 21.69,\n H: 22.68,\n I: 9.42,\n J: 13.11,\n K: 20.94,\n L: 15.51,\n M: 27.9,\n N: 22.68,\n O: 23.985,\n P: 18.75,\n Q: 23.985,\n R: 19.65,\n S: 16.095,\n T: 17.85,\n U: 21.84,\n V: 21.3,\n W: 31.395,\n X: 20.37,\n Y: 19.635,\n Z: 18.51,\n },\n 36: {\n 0: 20.88,\n 1: 20.88,\n 2: 20.88,\n 3: 20.88,\n 4: 20.88,\n 5: 20.88,\n 6: 20.88,\n 7: 20.88,\n 8: 20.88,\n 9: 20.88,\n ' ': 6.948,\n '+': 20.88,\n '-': 12.924,\n '%': 28.908,\n '.': 8.1,\n a: 18.846,\n b: 20.52,\n c: 17.172,\n d: 20.52,\n e: 19.242,\n f: 12.618,\n g: 18.63,\n h: 20.466,\n i: 9.756,\n j: 9.684,\n k: 19.854,\n l: 9.756,\n m: 30.312,\n n: 20.466,\n o: 20.466,\n p: 20.358,\n q: 20.52,\n r: 14.706,\n s: 15.732,\n t: 13.932,\n u: 20.466,\n v: 19.206,\n w: 28.476,\n x: 19.44,\n y: 19.206,\n z: 16.902,\n A: 25.56,\n B: 23.454,\n C: 24.138,\n D: 26.91,\n E: 20.61,\n F: 20.214,\n G: 26.028,\n H: 27.216,\n I: 11.304,\n J: 15.732,\n K: 25.128,\n L: 18.612,\n M: 33.48,\n N: 27.216,\n O: 28.782,\n P: 22.5,\n Q: 28.782,\n R: 23.58,\n S: 19.314,\n T: 21.42,\n U: 26.208,\n V: 25.56,\n W: 37.674,\n X: 24.444,\n Y: 23.562,\n Z: 22.212,\n },\n}\n\nexport const fontSizeLineHeights: Record = {\n 4: 5,\n 6: 7,\n 8: 10,\n 9: 11,\n 10: 12,\n 11: 13,\n 12: 14,\n 13: 15,\n 14: 20,\n 18: 21,\n 20: 24,\n 24: 28,\n 30: 35,\n 36: 42,\n}\n","import * as d3 from 'd3'\n\ninterface Dimensions {\n width: number\n height: number\n}\n\nexport class Zoom {\n zoomElement = document.createElement('canvas')\n zoomSelection = d3.select(this.zoomElement)\n behavior: d3.ZoomBehavior\n\n translateExtent: [width: number, height: number]\n zoomLevels: number[]\n\n constructor(dimensions: Dimensions, zoomLevels: number[]) {\n this.translateExtent = [dimensions.width, dimensions.height]\n this.zoomLevels = zoomLevels\n\n this.behavior = d3\n .zoom()\n .extent([[0, 0], this.translateExtent])\n .scaleExtent([this.zoomLevels[0], this.zoomLevels[this.zoomLevels.length - 1]])\n .translateExtent([[0, 0], this.translateExtent])\n .on('zoom', null)\n\n this.zoomSelection.call(this.behavior)\n }\n\n updateDimensions = (dimensions: Dimensions) => {\n this.translateExtent = [dimensions.width, dimensions.height]\n this.behavior.extent([[0, 0], this.translateExtent]).translateExtent([[0, 0], this.translateExtent])\n }\n\n getTransform = () => d3.zoomTransform(this.zoomElement)\n\n scale = (newZoom?: number, mapCenter?: { x: number; y: number }) => {\n if (typeof newZoom === 'number' && Number.isFinite(newZoom)) {\n if (mapCenter) {\n this.zoomSelection.call(this.behavior.scaleTo, newZoom, [mapCenter.x, mapCenter.y])\n } else {\n this.zoomSelection.call(this.behavior.scaleTo, newZoom)\n }\n return newZoom\n }\n\n return this.getTransform().k\n }\n\n translate = (args?: [x: number, y: number]): [x: number, y: number] => {\n const scale = this.scale()\n\n if (Array.isArray(args) && Number.isFinite(args[0]) && Number.isFinite(args[1])) {\n this.zoomSelection.call(this.behavior.translateBy, -(args[0] / scale), -(args[1] / scale))\n return [args[0], args[1]]\n }\n let t = this.getTransform()\n return [t.x, t.y]\n }\n\n translateAbs = ([x, y]: [x: number, y: number]) => {\n const scale = this.scale()\n this.zoomSelection.call(this.behavior.translateTo, -(x / scale), -(y / scale), [0, 0])\n }\n\n getNearestSize(currentZoom: number = this.scale()) {\n let nearestSize = this.zoomLevels[0]\n for (var i = 0, len = this.zoomLevels.length; i < len; i++) {\n const level = this.zoomLevels[i]\n if (level >= currentZoom) {\n nearestSize = level\n break\n }\n }\n\n return nearestSize\n }\n}\n","import * as d3 from 'd3'\n\nimport { PortfolioSymbolType } from './types'\nimport { getUuid, getSymbolType } from './utils'\nimport { gradientSmall, gradients } from './shared/gradients'\nimport { fontSizeLineHeights, fontSizesWidths } from './constants/font'\nimport { ISettingsSection, scaleMinMax, scaleStepFormat } from './constants/settings'\nimport { ISettings, ISettingsSectionFont, ISettingsSectionHeader } from './constants/settings'\nimport LayoutGenerator from './layout-generator'\nimport {\n MapData,\n MapDataIndustry,\n MapDataNode,\n MapDataRow,\n MapDataSector,\n MapSubtypeId,\n MapTypeId,\n PerfData,\n Scale,\n ScaleId,\n} from './types'\nimport * as mapUtils from './utils'\nimport { Zoom } from './zoom'\n\nconst fontFamily = 'Popins, sans-serif'\n\nclass Treemap {\n width: number\n height: number\n version?: number\n scale: Scale\n countIndustryPerf: boolean\n countSectorPerf?: boolean\n nodes: MapDataNode[] = []\n sectors: MapDataSector[] = []\n industries: MapDataIndustry[] = []\n zoom: Zoom\n colorScale: (n?: number) => string\n settings: ISettings\n type: MapTypeId\n subtype: MapSubtypeId\n isSmall: boolean\n zoomLevels: number[]\n dataHash: string\n mapNodeId: string\n truncateNodeName: boolean\n\n constructor({\n countIndustryPerf = false,\n countSectorPerf = false,\n subtype = MapSubtypeId.DayPerf,\n isSmall = false,\n zoomLevels = mapUtils.getDefaultZoomLevels(),\n truncateNodeName = false,\n ...props\n }: {\n data: MapData\n width: number\n height: number\n version?: number\n scale: Scale\n countIndustryPerf?: boolean\n countSectorPerf?: boolean\n settings: ISettings\n type: MapTypeId\n subtype?: MapSubtypeId\n isSmall?: boolean\n zoomLevels?: number[]\n truncateNodeName?: boolean\n mapNodeId?: string\n dataHash: string\n }) {\n this.width = props.width\n this.height = props.height\n this.version = props.version\n this.settings = props.settings\n this.type = props.type\n this.scale = props.scale\n this.nodes = props.data.nodes\n this.sectors = props.data.sectors\n this.industries = props.data.industries\n this.subtype = subtype\n this.zoomLevels = zoomLevels\n this.isSmall = isSmall\n this.countIndustryPerf = countIndustryPerf\n this.countSectorPerf = countSectorPerf\n this.truncateNodeName = truncateNodeName\n this.mapNodeId = props.mapNodeId ?? getUuid()\n this.dataHash = props.dataHash\n\n this.zoom = new Zoom({ width: this.width, height: this.height }, this.zoomLevels)\n\n this.colorScale = this.getColorScale()\n\n if (this.countIndustryPerf) {\n this._updateIndustryPerf()\n }\n if (this.countSectorPerf) {\n this._updateSectorPerf()\n }\n }\n\n getIsSmall() {\n return this.isSmall\n }\n\n updateData(props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }) {\n this.width = props.width\n this.height = props.height\n this.nodes = props.data.nodes\n this.sectors = props.data.sectors\n this.industries = props.data.industries\n this.scale = props.scale\n this.dataHash = props.dataHash\n\n if (this.countIndustryPerf) {\n this._updateIndustryPerf()\n }\n if (this.countSectorPerf) {\n this._updateSectorPerf()\n }\n\n this.colorScale = this.getColorScale()\n }\n\n getScaleMinMax() {\n switch (this.scale.id) {\n case ScaleId.PortfolioPct:\n case ScaleId.PortfolioUsd:\n if (this.nodes.length === 0) return [0, 0]\n // get min/max week perf\n const minValuePerf = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\n const maxValuePerf = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\n const perfMax = Math.max(minValuePerf, maxValuePerf)\n // get min/max all time perf\n const minValueNode = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.perf)!)\n const maxValueNode = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.perf)!)\n const valueMax = Math.max(minValueNode, maxValueNode)\n // Use the weekly perf as a buffer, compute number of digits and round nicely\n const valueToUse = this.scale.id === ScaleId.PortfolioPct ? valueMax + perfMax : valueMax * (1 + perfMax / 100)\n // Sanity check\n if (Number.isNaN(valueToUse)) return [0, 0]\n const numberOfDigits = Math.max(Math.floor(Math.log10(Math.abs(valueToUse))), 0) + 1\n const roundedBound = Math.ceil(valueToUse / numberOfDigits) * numberOfDigits\n\n return [-roundedBound, roundedBound]\n default:\n return scaleMinMax[this.scale.id]\n }\n }\n\n getColorScale() {\n const [minDomain, maxDomain] = this.getScaleMinMax()\n let gradient = gradients[this.scale.id]\n if (this.getIsSmall() && this.scale.id === ScaleId.DayPerf) {\n gradient = gradientSmall\n }\n const linearScale = d3\n .scaleLinear()\n .domain([minDomain, maxDomain])\n .range([0, gradient.colors.length - 1])\n return (d?: number) => {\n if (typeof d === 'undefined' || !Number.isFinite(d)) {\n return gradient.nullColor\n }\n const min = Math.min(minDomain, maxDomain)\n const max = Math.max(minDomain, maxDomain)\n const value = Math.max(Math.min(d, max), min)\n\n const i = Math.round(linearScale(value))\n\n return gradient.colors[i]\n }\n }\n\n getParentSector(node: MapDataNode | MapDataIndustry): string {\n if (node.parent && !!node.parent.parent) return this.getParentSector(node.parent as MapDataIndustry)\n\n return node.name\n }\n\n /*\n * data = {\n * nodes: {\"AAPL\": 1.5, \"MSFT\": -0.5}\n * industries: {...}\n * }\n */\n updatePerf(data: PerfData) {\n this.dataHash = data.hash\n\n for (var i = 0; i < this.nodes.length; i++) {\n const nodeName = this.nodes[i].name\n\n if (Array.isArray(data.nodes)) {\n const parentSector = this.getParentSector(this.nodes[i])\n const updatedNode = data.nodes.find((node) => node.name === nodeName && node.data?.sector === parentSector)\n\n if (!updatedNode) continue\n\n this.nodes[i].perf = updatedNode.perf\n this.nodes[i].additional = updatedNode.additional\n } else {\n this.nodes[i].perf = data.nodes[nodeName]\n this.nodes[i].additional = data.additional[nodeName]\n }\n }\n\n if (this.countIndustryPerf) {\n this._updateIndustryPerf()\n } else {\n this._resetIndustryPerf()\n }\n\n if (this.countSectorPerf) {\n this._updateSectorPerf()\n }\n\n this.colorScale = this.getColorScale()\n }\n\n _resetIndustryPerf() {\n for (var i = 0; i < this.industries.length; i++) {\n this.industries[i].perf = undefined\n }\n }\n\n _updateIndustryPerf() {\n var industry, weightedPriceSum, marketCapSum, stock, marketCap, everyStockUndefined\n for (var i = 0; i < this.industries.length; i++) {\n industry = this.industries[i]\n weightedPriceSum = 0\n marketCapSum = 0\n everyStockUndefined = true\n for (var j = 0; j < industry.children.length; j++) {\n stock = industry.children[j]\n marketCap = stock.dx * stock.dy\n if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\n weightedPriceSum += stock.perf * marketCap\n everyStockUndefined = false\n }\n marketCapSum += marketCap\n }\n if (!everyStockUndefined) {\n industry.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\n }\n }\n }\n\n _updateSectorPerf() {\n var sector, industry, weightedPriceSum, marketCapSum, stock, marketCap\n for (var s = 0; s < this.sectors.length; s++) {\n sector = this.sectors[s]\n weightedPriceSum = 0\n marketCapSum = 0\n for (var i = 0; i < sector.children.length; i++) {\n industry = sector.children[i]\n for (var j = 0; j < industry.children.length; j++) {\n stock = industry.children[j]\n marketCap = stock.dx * stock.dy\n if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\n weightedPriceSum += stock.perf * marketCap\n }\n marketCapSum += marketCap\n }\n }\n sector.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\n }\n }\n\n _getNodeTopOffset(node: MapDataNode) {\n if (!this.isSmall && this.type === MapTypeId.World) return 0\n\n const isSmallSecMap = this.isSmall && this.type === MapTypeId.Sector\n // Industry\n let parent: MapDataRow = node.parent\n let leftPadding = this.settings.industry.padding.left\n let topPadding = this.settings.industry.padding.top + this.settings.industry.header.height\n\n if (isSmallSecMap) {\n // Sector\n parent = node.parent.parent\n leftPadding = this.settings.sector.padding.left\n topPadding = this.settings.sector.padding.top + this.settings.sector.header.height\n }\n\n const isFirstNodeInIndustry =\n Math.floor(parent.x + leftPadding) === node.x && Math.floor(parent.y + topPadding) === node.y\n const showIndustryHeader = LayoutGenerator.isNodeHeaderVisible(parent, this.settings)\n\n return isFirstNodeInIndustry && showIndustryHeader ? 6 : 0\n }\n\n getNodeText(node: MapDataNode) {\n let name = node.name\n const scale = this.zoom.getNearestSize()\n const fontSizes = this.settings.scaleFontSizes[scale]\n const nodeTopOffset = this._getNodeTopOffset(node)\n const nodeHeight = node.dy - nodeTopOffset\n\n let nodeNameFontSize = this.findMaxFontSizeForText(node.name, node.dx, nodeHeight, fontSizes)\n if (!nodeNameFontSize && this.truncateNodeName) {\n nodeNameFontSize = fontSizes[fontSizes.length - 1]\n name = this.getLongestText(\n name,\n nodeNameFontSize,\n Math.max(0, node.dx - this.settings.fontSizePadding[nodeNameFontSize] * 2)\n )\n } else if (!nodeNameFontSize) return null\n\n const nodeNameLineHeight = fontSizeLineHeights[nodeNameFontSize]\n const stepFormat = scaleStepFormat[this.scale.id]\n const format = stepFormat === '%N%' ? (node.dx > 32 ? stepFormat : '%N') : stepFormat\n\n let perfText = getSymbolType(node.name) === PortfolioSymbolType.Cash ? '' : (node.additional ?? '')\n if (perfText.length === 0 && node.perf !== undefined && Number.isFinite(node.perf)) {\n perfText = this.formatValue(node.perf.toFixed(2), scaleMinMax[this.scale.id], format)\n }\n\n const fontPairs =\n this.settings.fontSizePairs[nodeNameFontSize]?.filter((allowedSize) => fontSizes.includes(allowedSize)) ?? []\n\n let perfFontSize\n let perfLineHeight = 0\n if (fontPairs.length) {\n perfFontSize =\n fontPairs && this.findMaxFontSizeForText(perfText, node.dx, nodeHeight - nodeNameLineHeight, fontPairs)\n perfLineHeight = perfFontSize ? fontSizeLineHeights[perfFontSize] : 0\n }\n\n const textHeight = nodeNameLineHeight + perfLineHeight\n\n return {\n topOffset: node.dy - textHeight <= nodeTopOffset ? nodeTopOffset : 0,\n fontSize: nodeNameFontSize,\n perfText,\n perfFontSize,\n name,\n }\n }\n\n findMaxFontSizeForText(text: string, width: number, height: number, fontSizes: number[]) {\n if (!text.length) return\n\n return fontSizes.find(\n (fontSize) =>\n this.getLongestText(text, fontSize, Math.max(0, width - this.settings.fontSizePadding[fontSize] * 2)) ===\n text && fontSizeLineHeights[fontSize] < height\n )\n }\n\n getLongestText(text: string, fontSize: number, maxWidth: number) {\n if (maxWidth === 0) return ''\n const widths = fontSizesWidths[fontSize]\n let i = 0\n let width = 0\n\n while (i < text.length) {\n width += widths[text[i]] ?? widths['W']\n if (width > maxWidth) break\n i++\n }\n\n return text.substring(0, i)\n }\n\n getZoomLevels() {\n return this.zoomLevels\n }\n\n getNextZoomLevel() {\n var actualZoomLevel = this.zoom.scale()\n if (this.zoomLevels[this.zoomLevels.length - 1] === actualZoomLevel) {\n return actualZoomLevel\n }\n for (var i = 0; i < this.zoomLevels.length; i++) {\n if (this.zoomLevels[i] > actualZoomLevel) {\n return this.zoomLevels[i]\n }\n }\n\n return this.zoomLevels[0]\n }\n\n getPreviousZoomLevel() {\n var actualZoomLevel = this.zoom.scale()\n if (this.zoomLevels[0] === actualZoomLevel) {\n return actualZoomLevel\n }\n for (var i = this.zoomLevels.length; i >= 0; i--) {\n if (this.zoomLevels[i] < actualZoomLevel) {\n return this.zoomLevels[i]\n }\n }\n\n return this.zoomLevels[0]\n }\n\n getLastZoomLevel() {\n return this.zoomLevels[this.zoomLevels.length - 1]\n }\n\n formatValue(\n value: string,\n [min, max]: [min: number, max: number] = scaleMinMax[this.scale.id],\n format: string = scaleStepFormat[this.scale.id]\n ) {\n let stepFormat = format\n if (typeof format !== 'string') {\n stepFormat = format[value]\n }\n\n if (!stepFormat) return value\n\n const floatValue = parseFloat(value)\n const absValue = value.replace(/^-/, '')\n const isPositiveScaleOnly = Math.min(min, max) >= 0 && Math.max(min, max) >= 0\n let formated = stepFormat?.replace('%N', absValue) ?? absValue\n\n // Some formats might not include number (eg. Before/After earnings)\n if (!stepFormat || !stepFormat.includes('%N')) return formated\n\n if (floatValue > 0 && !isPositiveScaleOnly) return `+${formated}`\n\n if (floatValue < 0) return `-${formated}`\n\n return formated\n }\n\n renderStockNode(node: MapDataNode, context: CanvasRenderingContext2D) {\n // Draw background\n context.fillStyle = this.colorScale(node.perf);\n context.fillRect(node.x, node.y, node.dx - 1, node.dy - 1)\n\n const nodeText = this.getNodeText(node)\n\n if (!nodeText) return\n\n context.save()\n\n // Set text properties\n context.textBaseline = 'middle'\n context.textAlign = 'center'\n context.fillStyle = 'rgba(0, 0, 0, 0.5)'\n\n const nodeY = node.y + nodeText.topOffset\n const nodeDY = node.dy - nodeText.topOffset\n const textX = node.x + node.dx / 2\n let nameY = nodeY + nodeDY / 2\n let perfTextY = nameY + nodeText.fontSize / 2\n const zoom = this.zoom.scale()\n const offset = zoom > 1 ? (1 / zoom) * 1.2 : 1\n if (nodeText.perfFontSize) {\n perfTextY = nameY + nodeText.fontSize / 2\n nameY -= nodeText.perfFontSize / 2\n context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\n context.fillText(nodeText.perfText, textX + offset, perfTextY + offset)\n }\n\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\n context.fillText(nodeText.name, textX + offset, nameY + offset)\n\n context.fillStyle = 'rgba(255, 255, 255, 1)'\n\n if (nodeText.perfFontSize) {\n context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\n context.fillText(nodeText.perfText, textX, perfTextY)\n }\n\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\n context.fillText(nodeText.name, textX, nameY)\n context.restore()\n }\n\n getSpacingWithDefaults(spacing?: { top: number; right: number; bottom?: number; left: number }) {\n return {\n top: spacing?.top ?? 0,\n right: spacing?.right ?? 0,\n bottom: spacing?.bottom ?? 0,\n left: spacing?.left ?? 0,\n }\n }\n\n renderIndustryHeader({\n node,\n context,\n config,\n fill,\n parent,\n }: {\n node: MapDataRow\n context: CanvasRenderingContext2D\n config?: ISettingsSectionHeader\n parent?: ISettingsSection\n fill: string\n }) {\n const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\n const margin = this.getSpacingWithDefaults(config?.margin)\n const x = node.x + parrentPadding.left + margin.left\n const y = node.y + parrentPadding.top + margin.top\n const width = node.dx - parrentPadding.left - margin.left - parrentPadding.right - margin.right\n const height = y + (config?.height ?? 0)\n\n context.fillStyle = fill\n context.strokeStyle = config?.border ?? this.settings.background\n context.beginPath()\n context.moveTo(x, y)\n context.lineTo(x, height)\n\n context.lineTo(node.x + 6, height)\n // this to add notch in industry header\n // context.lineTo(node.x + 11, height + 5)\n // context.lineTo(node.x + 16, height)\n\n context.lineTo(x + width, height)\n context.lineTo(x + width, y)\n context.lineTo(x - 0.5, y)\n context.fill()\n context.stroke()\n }\n\n renderNodeText({\n node,\n context,\n config,\n parent,\n }: {\n node: MapDataRow\n context: CanvasRenderingContext2D\n config?: ISettingsSectionFont\n parent?: ISettingsSection\n }) {\n if (!config) return\n\n const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\n const padding = this.getSpacingWithDefaults(config?.padding)\n\n context.textBaseline = 'alphabetic'\n context.textAlign = 'left'\n context.fillStyle = config.color\n context.font = `${config.fontWeight} ${config.fontSize}px ${fontFamily}`\n\n const text = this.getLongestText(\n node.name.toUpperCase(),\n config.fontSize,\n node.dx - parrentPadding.left - padding.left - parrentPadding.right - padding.right\n )\n context.fillText(\n text,\n node.x + parrentPadding.left + padding.left,\n node.y + parrentPadding.top + padding.top + config.fontSize\n )\n }\n\n getNodeAtPosition(x: number, y: number): MapDataNode | undefined {\n var scale = this.zoom.scale()\n var [tx, ty] = this.zoom.translate()\n for (var i = 0, len = this.nodes.length; i < len; i++) {\n var d = this.nodes[i]\n if (\n d.x * scale + tx < x &&\n x < (d.x + d.dx + 1) * scale + tx &&\n d.y * scale + ty < y &&\n y < (d.y + d.dy + 1) * scale + ty &&\n d.parent\n ) {\n return d\n }\n }\n }\n\n getSectorAtPosition(x: number, y: number): MapDataSector | undefined {\n var scale = this.zoom.scale()\n var [tx, ty] = this.zoom.translate()\n for (var i = 0, len = this.sectors.length; i < len; i++) {\n var d = this.sectors[i]\n if (\n d.x * scale + tx < x &&\n x < (d.x + d.dx + 1) * scale + tx &&\n d.y * scale + ty < y &&\n y < (d.y + d.dy + 1) * scale + ty &&\n d.parent\n ) {\n return d\n }\n }\n }\n\n getIndustryAtPosition(x: number, y: number): MapDataIndustry | undefined {\n var scale = this.zoom.scale()\n var [tx, ty] = this.zoom.translate()\n for (var i = 0, len = this.industries.length; i < len; i++) {\n var d = this.industries[i]\n if (\n d.x * scale + tx < x &&\n x < (d.x + d.dx + 1) * scale + tx &&\n d.y * scale + ty < y &&\n y < (d.y + d.dy + 1) * scale + ty &&\n d.parent\n ) {\n return d\n }\n }\n }\n}\n\nexport default Treemap\n","import { flip, offset, shift, computePosition } from '@floating-ui/react'\nimport classnames from 'classnames'\nimport * as React from 'react'\nimport { debounce } from 'lodash';\n\nimport '../style/map-hover.css'\nimport MapStore from '../store/map-store'\nimport Treemap from '../treemap'\nimport { MapDataNode, MapTypeId } from '../types'\nimport { formatMarketValue, getVisibleTooltipNodes } from '../utils'\n\ninterface CanvasHoverProps {\n treemap: Treemap\n mapType: MapTypeId\n mapNodeId: string\n}\n\ninterface CanvasHoverState {\n hoveredNode?: MapDataNode | null\n visibleNodes: MapDataNode[]\n sparklineData: Record\n}\n\nconst formatPerf = (d: MapDataNode, treemap: Treemap) => {\n if (typeof d.additional !== 'undefined' && d.additional !== null) {\n return d.additional\n } else if (typeof d.perf !== 'undefined' && d.perf !== null) {\n return treemap.formatValue(d.perf.toFixed(2))\n } else {\n return 'N/A'\n }\n}\n\nexport default function CanvasHover(props: CanvasHoverProps) {\n const [{ hoveredNode, visibleNodes }, setState] = React.useState({\n hoveredNode: null,\n visibleNodes: [],\n sparklineData: {},\n })\n /**\n * Compute position using floating ui\n */\n const hoverRef = React.useRef(null);\n\n // Function to smoothly update the hover position\n const updateHoverPosition = React.useCallback(\n debounce((clientX: number, clientY: number) => {\n const hoverEl = hoverRef.current;\n if (hoverEl) {\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: 0,\n height: 0,\n x: clientX,\n y: clientY,\n left: clientX,\n right: clientX,\n top: clientY,\n bottom: clientY,\n };\n },\n };\n\n computePosition(virtualEl, hoverEl, {\n placement: 'right-start',\n middleware: [offset({ mainAxis: 100 }), flip({ crossAxis: false }), shift()],\n }).then(({ x, y }) => {\n Object.assign(hoverEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n });\n }\n }, 16), // Run the function at most every 16ms (approx 60 FPS)\n []\n );\n React.useEffect(() => {\n const handleMouseMove = (event: MouseEvent) => {\n updateHoverPosition(event.clientX, event.clientY);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n };\n }, [updateHoverPosition]);\n\n // const { refs, floatingStyles, context, isPositioned, update } = useFloating({\n // open: !!hoveredNode,\n // strategy: 'fixed',\n // placement: 'right-start',\n // middleware: [\n // offset({ mainAxis: 100 }),\n // flip({ crossAxis: false }),\n // shift(),\n // // resetPositionMiddleware()\n // ],\n // })\n\n // const clientPoint = useClientPoint(context)\n // const { getFloatingProps } = useInteractions([clientPoint])\n // console.log(isPositioned);\n // React.useEffect(() => {\n // if (!hoveredNode || !isPositioned) {\n // update()\n\n // }\n // }, [isPositioned])\n\n /**\n * Update state when store changes\n */\n React.useEffect(() => {\n const handleMapStoreChange = () => {\n const storeHoveredNode = MapStore.getHoveredNode(props.mapNodeId)\n const visibleNodes = getVisibleTooltipNodes(storeHoveredNode)\n\n setState((prevState) => ({ ...prevState, hoveredNode: storeHoveredNode, visibleNodes }))\n }\n\n MapStore.addChangeListener(handleMapStoreChange)\n\n return () => {\n MapStore.removeChangeListener(handleMapStoreChange)\n }\n }, [hoveredNode?.name, props.mapNodeId, props.mapType])\n\n const price = `$${hoveredNode?.data.price.toFixed(2)}`\n\n const formattedMarketValue = formatMarketValue(hoveredNode?.data.value)\n const isSmall = visibleNodes.length > 15\n const title =\n (props.treemap.type !== MapTypeId.World ? hoveredNode?.parent.parent.name + ' - ' : '') + hoveredNode?.parent.name\n const backgroundColor = hoveredNode ? props.treemap.colorScale(hoveredNode.perf) : undefined\n\n return (\n \n

{title}

\n \n \n {hoveredNode && (\n <>\n \n \n \n \n\n \n \n \n \n \n \n \n )}\n {\n visibleNodes.length > 1 &&\n \n \n \n \n \n \n \n }\n {visibleNodes.length > 1 &&\n visibleNodes.map((c) => {\n // const hasSparkline = sparklineData?.[c.name]?.length > 0\n // const data = hasSparkline ? sparklineData[c.name] : []\n return (\n \n \n\n\n \n \n \n \n \n )\n })}\n \n
\n {hoveredNode.data?.data?.nameOverride ?? hoveredNode.name}\n \n {/* {hasSparkline && (\n \n )} */}\n {price}{formatPerf(hoveredNode, props.treemap)}
\n {`${hoveredNode.description} ${formattedMarketValue}`}\n
\n Ticker\n \n Stock\n \n %Change\n \n Market Cap\n
\n {`${c.data?.data?.nameOverride ?? c.name}`}\n \n {\n // hasSparkline && \n }\n \n {`$${c?.data.price.toFixed(2)}`}\n {/* {hasSparkline ? data[data.length - 1].toFixed(2) : `$${c?.data.price.toFixed(2)}`} */}\n \n {formatPerf(c, props.treemap)}\n \n {`${formatMarketValue(c?.data.value)}`}\n
\n \n )\n}\n","import classnames from 'classnames'\n\nimport { scaleStepFormat } from '../constants/settings'\nimport MapStore from '../store/map-store'\nimport Treemap from '../treemap'\nimport { MapTypeId } from '../types'\n\ninterface LegendProps {\n treemap: Treemap\n className?: string\n}\n\nfunction Legend(props: LegendProps) {\n const colorScale = props.treemap.colorScale\n\n if (!colorScale) {\n return null\n }\n\n var boxover =\n 'cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[' +\n props.treemap.scale.name +\n \"] body=[
\" +\n props.treemap.scale.tooltip +\n '
] offsety=[-70] delay=[500]'\n\n const [scaleMin, scaleMax] = props.treemap.getScaleMinMax()\n var steps = [scaleMin]\n var diff = scaleMax - scaleMin\n if (diff > 0) {\n var step = diff / 6\n for (var i = 1; i < 7; i++) {\n steps.push(Math.round((scaleMin + step * i) * 10) / 10)\n }\n }\n\n if (props.treemap.scale.id === '_rec') {\n steps = [5, 4, 3, 2, 1]\n } else if (props.treemap.scale.id === '_earndate') {\n steps = [-30, -15, -1, 1, 15, 30]\n }\n\n // TODO some widths\n var stepWidth = ['_rec', '_earndate'].indexOf(props.treemap.scale.id) !== -1 ? 100 : 50\n var format = scaleStepFormat[props.treemap.scale.id]\n return (\n
\n {![MapTypeId.Portfolio, MapTypeId.ETFHoldings].includes(props.treemap.type) && (\n
\n Powered by unusualflow.com\n
\n )}\n
\n {steps.map((step, index) => (\n \n {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\n
\n ))}\n
\n \n )\n}\n\nexport default Legend\n","import classNames from 'classnames'\nimport Hammer from 'hammerjs'\nimport * as React from 'react'\n\nimport '../style/map.css'\nimport { isFirefoxDesktop } from '../shared/isMobile'\nimport { loadImage } from '../shared/loadImage'\nimport { retinafy } from '../shared/retinafy'\nimport LayoutGenerator from '../layout-generator'\nimport MapActionCreators from '../store/action-creators'\nimport mapActionCreators from '../store/action-creators'\nimport MapStore from '../store/map-store'\nimport Treemap from '../treemap'\nimport { MapDataIndustry, MapDataNode, MapDataSector, MapTypeId, NodeDepth } from '../types'\nimport { getOffset } from '../utils'\nimport CanvasHover from './CanvasHover'\nimport Legend from './Legend'\n\ninterface CanvasProps {\n alt?: string\n treemap: Treemap\n zoom?: boolean\n legend?: boolean\n zoomOnWheel?: boolean\n hover?: boolean\n onNodeClick?: (props: {\n event: React.MouseEvent\n treemap: Treemap\n node?: MapDataNode\n industry?: MapDataIndustry\n sector?: MapDataSector\n }) => void\n}\n\ninterface CanvasState {\n zoom: number\n initialized: boolean\n type: MapTypeId\n dataHash: string\n width: number\n height: number\n}\n\n// TODO presunt w, h, zoom, translate do stavu\nclass Canvas extends React.Component {\n static defaultProps = {\n zoom: true,\n legend: true,\n hover: true,\n zoomOnWheel: true,\n }\n\n state: CanvasState = {\n zoom: 1,\n initialized: false,\n type: this.props.treemap.type,\n dataHash: this.props.treemap.dataHash,\n width: this.props.treemap.width,\n height: this.props.treemap.height,\n }\n\n _canvas = React.createRef()\n _hoverCanvas = React.createRef()\n\n // @ts-ignore\n _canvasContext: CanvasRenderingContext2D\n // @ts-ignore\n _hoverContext: CanvasRenderingContext2D\n\n _cache: Record = {}\n mouseDown: boolean = false\n lastPanX: number = 0\n lastPanY: number = 0\n\n animationFrameId: number | null = null\n\n // @ts-ignore\n worldBackground: HTMLImageElement\n\n constructor(props: CanvasProps) {\n super(props)\n\n this._cache = {}\n\n for (var event of [\n '_onChange',\n '_onMouseDown',\n '_onMouseMove',\n '_onMouseUp',\n '_onMouseLeave',\n '_onDoubleClick',\n '_onWheel',\n '_onPanStart',\n '_onPanMove',\n '_onPinch',\n '_getPublishCanvas',\n ]) {\n // @ts-ignore\n this[event] = this[event].bind(this)\n }\n }\n\n componentDidMount() {\n MapStore.addChangeListener(this._onChange)\n mapActionCreators._setOnPublish(this._getPublishCanvas)\n\n this._initialize()\n }\n\n componentDidUpdate() {\n if (!this.state.initialized) return\n\n const { treemap } = this.props\n const { dataHash, type } = this.state\n\n // Nothing changed from outside, so we just render the current view\n if (\n // Data update\n treemap.dataHash === dataHash &&\n // Type update\n type === treemap.type &&\n // Window Resize\n treemap.width === this.state.width &&\n treemap.height === this.state.height\n ) {\n this.renderFromCache(this._canvasContext)\n this.renderHover(this._hoverContext)\n return\n }\n\n this._setCanvasSize(treemap.width, treemap.height)\n\n if (!this.worldBackground && treemap.type === MapTypeId.World) {\n this._loadTreemapGeoBackground().then(() => this._updateCanvasCaches(treemap))\n } else {\n this._updateCanvasCaches(treemap)\n }\n }\n\n componentWillUnmount() {\n // TODO remove hammer listener\n MapStore.removeChangeListener(this._onChange)\n this._hoverCanvas.current?.removeEventListener('wheel', this._onWheel)\n }\n\n render() {\n const { initialized } = this.state\n const { alt, treemap, legend, hover, zoom } = this.props\n\n return (\n
\n \n {alt}\n \n {(hover || zoom) && (\n \n )}\n {legend && }\n {hover && }\n
\n )\n }\n\n renderFromCache(context: CanvasRenderingContext2D) {\n const { treemap } = this.props\n const { zoom } = this.state\n const [x, y] = treemap.zoom.translate()\n const nearestSize = treemap.zoom.getNearestSize(zoom)\n\n // Last resort if the cache doesn’t exist\n if (!this._cache[nearestSize]) this._createCache(nearestSize)\n\n context.save()\n context.drawImage(this._cache[nearestSize].canvas, ~~x, ~~y, ~~(treemap.width * zoom), ~~(treemap.height * zoom))\n context.restore()\n }\n\n _onChange() {\n const { treemap } = this.props\n\n this.setState({ zoom: treemap.zoom.scale() })\n }\n\n _onMouseDown() {\n this.mouseDown = true\n }\n\n _onMouseMove(e: React.MouseEvent) {\n if (this.mouseDown || !this.props.hover) return\n\n const { treemap } = this.props\n var { offsetX, offsetY } = getOffset(e)\n let nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\n\n if (!nodeAtPosition) {\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\n nodeAtPosition = industryAtPosition?.children[0]\n }\n\n MapActionCreators.setHoveredNode(treemap.mapNodeId, nodeAtPosition)\n }\n\n _onMouseUp() {\n this.mouseDown = false\n }\n\n _onMouseLeave() {\n MapActionCreators.setHoveredNode(this.props.treemap.mapNodeId, undefined)\n }\n\n _onDoubleClick(e: React.MouseEvent) {\n const { treemap } = this.props\n const { offsetX, offsetY } = getOffset(e)\n const nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\n const sectorAtPosition = treemap.getSectorAtPosition(offsetX, offsetY)\n this.props.onNodeClick?.({\n event: e,\n treemap,\n node: nodeAtPosition,\n industry: industryAtPosition,\n sector: sectorAtPosition,\n })\n }\n\n _onWheel(e: MouseEvent) {\n if (!this.props.zoom) return\n\n e.preventDefault()\n\n if (!this.state.initialized) {\n return\n }\n\n var { offsetX, offsetY } = getOffset(e)\n // @ts-ignore\n MapActionCreators.zoom(this.props.treemap, -e.deltaY, offsetX, offsetY)\n }\n\n _onPanStart(e: any) {\n if (!this.state.initialized) {\n return\n }\n\n this.lastPanX = e.pointers[0].clientX\n this.lastPanY = e.pointers[0].clientY\n }\n\n _onPanMove(e: any) {\n if (!this.state.initialized) {\n return\n }\n\n var movementX = this.lastPanX - e.pointers[0].clientX\n var movementY = this.lastPanY - e.pointers[0].clientY\n this.lastPanX = e.pointers[0].clientX\n this.lastPanY = e.pointers[0].clientY\n const { treemap } = this.props\n MapActionCreators.changeTranslate(treemap, movementX, movementY)\n }\n\n _onPinch(e: any) {\n if (!this.state.initialized || !this.props.zoom || e.pointers.length < 2) {\n return\n }\n\n var offsetX1 = e.pointers[0].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft, // TODO fix scrolled\n offsetY1 = e.pointers[0].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\n offsetX2 = e.pointers[1].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft,\n offsetY2 = e.pointers[1].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\n offsetX = (offsetX1 + offsetX2) / 2,\n offsetY = (offsetY1 + offsetY2) / 2\n var direction = e.scale >= 1 ? 1 : -1\n MapActionCreators.zoom(this.props.treemap, direction, offsetX, offsetY)\n }\n\n _setCanvasContexts() {\n const canvas = this._canvas.current!\n const canvasContext = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\n this._canvasContext = canvasContext\n\n if (this.props.hover || this.props.zoom) {\n const hoverCanvas = this._hoverCanvas.current!\n const hoverContext = hoverCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\n\n this._hoverContext = hoverContext\n }\n }\n\n _setCanvasSize(width: number, height: number) {\n retinafy(this._canvas.current, this._canvasContext, width, height)\n\n if (this.props.hover || this.props.zoom) {\n retinafy(this._hoverCanvas.current, this._hoverContext, width, height)\n }\n }\n\n async _initialize() {\n const { treemap, zoomOnWheel } = this.props\n\n this._setCanvasContexts()\n this._setCanvasSize(treemap.width, treemap.height)\n\n const zoomLevels = treemap.getZoomLevels()\n var render = () => {\n this._createCacheWithPriority(zoomLevels, zoomLevels[0], () => {\n this.setState({ initialized: true })\n\n const hoverCanvas = this._hoverCanvas.current\n\n if (!hoverCanvas) return\n\n var hammertime = new Hammer(hoverCanvas)\n hammertime.get('pinch').set({ enable: true, threshold: 0.1 })\n hammertime.on('panstart', this._onPanStart)\n hammertime.on('panmove', this._onPanMove)\n hammertime.on('pinch', this._onPinch)\n\n if (zoomOnWheel) {\n hoverCanvas.addEventListener('wheel', this._onWheel, { passive: false })\n }\n })\n }\n\n if (treemap.type === MapTypeId.World) {\n await this._loadTreemapGeoBackground()\n render()\n } else {\n render()\n }\n }\n\n async _getTreemapGeoBackground() {\n if (this.props.treemap.getIsSmall()) {\n return import('../assets/map_geo.png')\n }\n\n return import('../assets/map_geo.png')\n }\n\n async _loadTreemapGeoBackground() {\n try {\n const image = await this._getTreemapGeoBackground()\n this.worldBackground = await loadImage(image.default)\n } catch { }\n }\n\n _createCache(scale: number) {\n const { treemap } = this.props\n\n const oldScale = treemap.zoom.scale()\n const oldTranslate = treemap.zoom.translate()\n const width = ~~(treemap.width * scale)\n const height = ~~(treemap.height * scale)\n\n if (!this._cache[scale]) {\n const cacheCanvas = document.createElement('canvas')\n const cacheContext = cacheCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\n\n this._cache[scale] = { canvas: cacheCanvas, context: cacheContext }\n }\n\n retinafy(this._cache[scale].canvas, this._cache[scale].context, width, height)\n\n treemap.zoom.scale(scale)\n treemap.zoom.translateAbs([0, 0])\n this.renderCanvas(this._cache[scale].context, treemap)\n treemap.zoom.scale(oldScale)\n treemap.zoom.translateAbs(oldTranslate)\n }\n\n _updateCanvasCaches(treemap: Treemap) {\n this._createCacheWithPriority(treemap.getZoomLevels(), treemap.zoom.getNearestSize(), () => {\n this.setState((prevState) => ({\n dataHash: treemap.dataHash,\n width: treemap.width,\n height: treemap.height,\n type: treemap.type,\n zoom: treemap.type !== prevState.type ? 1 : prevState.zoom,\n }))\n\n // Reset zoom if we’re changing map type\n if (this.state.type !== treemap.type) {\n mapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\n // mapActionCreators.resetSparklineData()\n }\n\n this.renderFromCache(this._canvasContext)\n })\n }\n\n _createCacheWithPriority(zoomLevels: number[], currentZoom: number, callback?: () => void) {\n if (this.animationFrameId) window.cancelAnimationFrame(this.animationFrameId)\n\n const remainingLevels = zoomLevels.filter((level) => level !== currentZoom)\n this.animationFrameId = requestAnimationFrame(() => {\n this._createCache(currentZoom)\n callback?.()\n this._queueUpdateCache(remainingLevels)\n })\n }\n\n _queueUpdateCache(scales: number[], currentScale = 0) {\n if (!scales[currentScale]) return\n\n this.animationFrameId = requestAnimationFrame(() => {\n this._createCache(scales[currentScale])\n this._queueUpdateCache(scales, currentScale + 1)\n })\n }\n\n renderHover(context: CanvasRenderingContext2D) {\n if (!this.props.hover) return\n\n const { treemap } = this.props\n const { hover } = treemap.settings.industry\n const hoveredNode = MapStore.getHoveredNode(treemap.mapNodeId)\n const industry = hoveredNode?.parent\n\n context.save()\n\n context.clearRect(0, 0, treemap.width, treemap.height)\n context.translate.apply(context, treemap.zoom.translate())\n context.scale(treemap.zoom.scale(), treemap.zoom.scale())\n\n if (!industry) {\n context.restore()\n return\n }\n\n const showIndustryHeader =\n LayoutGenerator.isNodeHeaderVisible(industry, treemap.settings) && industry.depth === NodeDepth.Industry\n let industryOffset =\n treemap.getIsSmall() || showIndustryHeader\n ? treemap.settings.industry.padding.top\n : LayoutGenerator.smallIndustryPadding.top\n\n if (industry.depth === NodeDepth.Sector) industryOffset = treemap.settings.sector.header.height\n\n if (showIndustryHeader && !treemap.getIsSmall()) {\n industryOffset += 1.5\n }\n\n // Outter border\n context.strokeStyle = hover?.border ?? 'transparent'\n context.lineWidth = 3\n context.strokeRect(industry.x - 0.5, industry.y - 0.5 + industryOffset, industry.dx, industry.dy - industryOffset)\n\n // Inner borders\n context.translate(0.5, 0.5)\n context.lineWidth = 1\n context.beginPath()\n for (let i = 0; i < industry.children.length; i++) {\n const node = industry.children[i]\n context.moveTo(node.x - 1, node.y - 1)\n context.lineTo(node.x + node.dx - 1, node.y - 1)\n context.lineTo(node.x + node.dx - 1, node.y + node.dy - 1)\n context.lineTo(node.x - 1, node.y + node.dy - 1)\n context.lineTo(node.x - 1, node.y - 1.5)\n }\n context.stroke()\n\n // Header and text\n if (!treemap.getIsSmall() && showIndustryHeader) {\n context.translate(-0.5, -0.5)\n treemap.renderIndustryHeader({\n node: industry,\n context,\n config: hover,\n parent: treemap.settings.industry,\n fill: hover?.background ?? treemap.settings.background,\n })\n treemap.renderNodeText({ node: industry, context, config: hover, parent: treemap.settings.industry })\n }\n\n context.restore()\n }\n\n renderCanvas(context: CanvasRenderingContext2D, treemap: Treemap) {\n context.save()\n\n const scale = treemap.zoom.getNearestSize()\n\n context.fillStyle = treemap.settings.background\n context.fillRect(0, 0, treemap.width * scale, treemap.height * scale)\n\n context.translate.apply(context, treemap.zoom.translate())\n context.scale(scale, scale)\n\n /* BACKGROUND */\n if (treemap.type === MapTypeId.World && this.worldBackground) {\n if (treemap.getIsSmall()) context.translate(0, 20)\n\n context.drawImage(\n this.worldBackground,\n 0,\n 0,\n this.worldBackground.naturalWidth,\n this.worldBackground.naturalHeight,\n 0,\n 20,\n treemap.width,\n treemap.width / (this.worldBackground.naturalWidth / this.worldBackground.naturalHeight)\n )\n }\n\n if (treemap.settings.sector.background) {\n context.fillStyle = treemap.settings.sector.background\n for (let index = 0; index < treemap.sectors.length; index++) {\n const node = treemap.sectors[index]\n context.fillRect(node.x, node.y, node.dx, node.dy)\n }\n }\n\n if (treemap.settings.industry.background) {\n context.fillStyle = treemap.settings.industry.background\n for (let index = 0; index < treemap.industries.length; index++) {\n const node = treemap.industries[index]\n context.fillRect(node.x, node.y + 3, node.dx - 1, node.dy - 4)\n }\n }\n\n /* STOCKS */\n for (let index = 0; index < treemap.nodes.length; index++) {\n const node = treemap.nodes[index]\n if (!node.parent) continue // Skip on root node\n treemap.renderStockNode(treemap.nodes[index], context)\n }\n\n /* INDUSTRIES */\n for (let index = 0; index < treemap.industries.length; index++) {\n const node = treemap.industries[index]\n const isLargeNode = LayoutGenerator.isNodeHeaderVisible(node, treemap.settings)\n const isGeoMap = treemap.type === MapTypeId.World\n const renderBackground = treemap.getIsSmall() ? isGeoMap : !isGeoMap\n\n if (!isLargeNode || (treemap.getIsSmall() && !isGeoMap)) continue\n\n if (Number.isFinite(node.perf) && renderBackground) {\n treemap.renderIndustryHeader({\n node,\n context,\n config: treemap.settings.industry.header,\n parent: treemap.settings.industry,\n fill: treemap.colorScale(node.perf),\n })\n }\n\n treemap.renderNodeText({\n node,\n context,\n config: treemap.settings.industry.header,\n parent: treemap.settings.industry,\n })\n }\n\n /* SECTORS */\n if (treemap.type !== MapTypeId.World) {\n for (let index = 0; index < treemap.sectors.length; index++) {\n const node = treemap.sectors[index]\n\n if (treemap.getIsSmall()) {\n treemap.renderIndustryHeader({\n node,\n context,\n config: treemap.settings.sector.header,\n parent: treemap.settings.sector,\n fill: treemap.settings.sector.header.background ?? treemap.colorScale(node.perf),\n })\n }\n\n treemap.renderNodeText({\n node,\n context,\n config: treemap.settings.sector.header,\n parent: treemap.settings.sector,\n })\n }\n }\n\n context.restore()\n\n if (treemap.settings.sector.border) {\n this.renderSectorBorders(context, treemap)\n }\n }\n\n renderSectorBorders(context: CanvasRenderingContext2D, treemap: Treemap) {\n const scale = treemap.zoom.scale()\n context.lineWidth = 2 * scale\n context.strokeStyle = treemap.settings.sector.border ?? 'transparent'\n\n context.beginPath()\n\n // Outside border\n context.moveTo(0, 0)\n context.lineTo(treemap.width * scale, 0)\n context.lineTo(treemap.width * scale, treemap.height * scale)\n context.lineTo(0, treemap.height * scale)\n context.lineTo(0, -1)\n\n for (let index = 0; index < treemap.sectors.length; index++) {\n const sector = treemap.sectors[index]\n\n context.strokeRect(sector.x * scale, sector.y * scale, sector.dx * scale, sector.dy * scale)\n }\n\n context.stroke()\n }\n\n _getPublishCanvas() {\n return this._cache[1].canvas\n }\n}\n\nexport default Canvas\n","/**\n * Load image before we can render it in canvas\n */\nexport function loadImage(src: string): Promise {\n return new Promise((resolve, reject) => {\n var image = new Image()\n\n image.onload = function () {\n resolve(image)\n }\n\n image.onerror = function () {\n reject()\n }\n\n image.src = src\n })\n}\n","import classnames from 'classnames'\nimport throttle from 'lodash.throttle'\nimport * as React from 'react'\nimport { Loading } from '../../Loading'\n\nimport { ISettings } from '../constants/settings'\nimport LayoutGenerator from '../layout-generator'\nimport mapActionCreators from '../store/action-creators'\nimport Treemap from '../treemap'\nimport { MapDataRoot, MapSubtype, MapType } from '../types'\nimport * as mapUtils from '../utils'\nimport Canvas from './Canvas'\n\nconst MapContext = React.createContext<{\n treemap?: Treemap\n setTreemap: React.Dispatch>\n generator?: LayoutGenerator\n setGenerator: React.Dispatch>\n}>({ setTreemap: () => { }, setGenerator: () => { } })\n\nexport function useMapContext() {\n return React.useContext(MapContext)\n}\n\nexport function MapContextProvider(props: React.PropsWithChildren) {\n const [treemap, setTreemap] = React.useState()\n const [generator, setGenerator] = React.useState()\n\n return (\n {props.children}\n )\n}\n\ninterface MapProps {\n className?: string\n isLoadingData?: boolean\n isFetchingPerf?: boolean\n type: MapType\n subtype: MapSubtype\n data?: MapDataRoot\n settings?: ISettings\n onNodeClick?: React.ComponentProps['onNodeClick']\n zoom?: boolean\n zoomOnWheel?: boolean\n legend?: boolean\n hover?: boolean\n truncateNodeName?: boolean\n dataHash?: string\n}\n\nexport function Map({\n className,\n isLoadingData,\n isFetchingPerf = isLoadingData,\n type,\n subtype,\n data,\n settings,\n onNodeClick,\n zoom,\n zoomOnWheel,\n legend,\n hover,\n truncateNodeName,\n dataHash,\n}: MapProps) {\n const { setGenerator, treemap: prevTreemap, setTreemap } = useMapContext()\n const containerRef = React.useRef(null)\n\n /**\n * We can’t `useEffect` for generator/treemap, because we’d have to deal with stale references in\n * other effects. In order to ensure we always get the current values, we need to either `useRef`\n * them (and update props for both state and ref) or `useMemo` and wait for first render to happen.\n */\n const [hasRendered, setHasRendered] = React.useState(false)\n\n /**\n * Generator makes the layout, it should only change when the map type or settings change.\n */\n const generator = React.useMemo(() => {\n if (!hasRendered || !containerRef.current) return\n\n const isSmall = mapUtils.getIsSmall()\n const size = mapUtils.getSize(containerRef.current, type.type, isSmall)\n const mapSettings = settings ?? mapUtils.getSettingsForMapType(type.type, isSmall)\n const generator = new LayoutGenerator(size.width, size.height, type.type, mapSettings, isSmall)\n\n // This is used for updating the map base data using map-generator\n // window.MAP_EXPORT = generator\n\n return generator\n }, [hasRendered, type.type, settings])\n\n /**\n * Treemap object is the logical representation of the map (whereas Canvas is graphical)\n * We want to hold to it for as long as we can and reuse it. That’s why we’re comparing\n * `prevTreemap` and returning the prev value if it equals.\n */\n const treemap = React.useMemo(() => {\n if (!generator || !data || !dataHash || prevTreemap?.type === type.type) return prevTreemap\n\n return new Treemap({\n data: generator.getLayout(data),\n width: generator.width,\n height: generator.height,\n settings: generator.settings,\n isSmall: generator.isSmall,\n scale: { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip },\n countIndustryPerf: subtype.countIndustryPerf,\n countSectorPerf: generator.isSmall && subtype.countSectorPerf,\n type: type.type,\n subtype: subtype.value,\n truncateNodeName,\n mapNodeId: prevTreemap?.mapNodeId,\n dataHash,\n zoomLevels: zoom === false ? [1] : undefined,\n })\n // Can’t add `prevTreemap` because we’d end up in a loop\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [generator, data, type.type, subtype])\n\n /**\n * Update context values\n */\n React.useEffect(() => {\n setHasRendered(true)\n setGenerator(generator)\n setTreemap(treemap)\n }, [generator, setGenerator, setTreemap, treemap])\n\n /**\n * Handle data updates\n */\n const updateTimeoutRef = React.useRef()\n React.useEffect(() => {\n if (!treemap || !generator || !data || isFetchingPerf) return\n\n updateTimeoutRef.current = window.setTimeout(() => {\n if (!dataHash || treemap.dataHash === dataHash) return\n\n const layout = generator.getLayout(data)\n mapActionCreators.updateLayout(treemap, {\n width: generator.width,\n height: generator.height,\n data: layout,\n scale: { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip },\n dataHash,\n })\n }, 100)\n\n return () => {\n if (updateTimeoutRef.current) window.clearTimeout(updateTimeoutRef.current)\n }\n }, [generator, treemap, data, isFetchingPerf, subtype, dataHash])\n\n /**\n * Recalculate layout when the window size changes\n */\n React.useEffect(() => {\n const containerElement = containerRef.current\n\n if (!generator || !containerElement || !treemap || !data) return\n\n const resize = throttle(() => {\n const size = mapUtils.getSize(containerElement, generator.type, generator.isSmall)\n\n if (size.width === treemap.width && size.height === treemap.height) return\n\n treemap.zoom.scale(1)\n generator.width = size.width\n generator.height = size.height\n const layout = generator.getLayout(data)\n mapActionCreators.updateLayout(treemap, {\n width: generator.width,\n height: generator.height,\n data: layout,\n scale: treemap.scale,\n dataHash: treemap.dataHash,\n })\n }, 100)\n\n window.addEventListener('resize', resize)\n\n return () => {\n window.removeEventListener('resize', resize)\n }\n }, [generator, treemap, data])\n\n return (\n
\n \n {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\n \n ) :\n\n <>\n \n \n }\n
\n \n )\n}\n","import { DefaultOptions, MutationCache, QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport * as React from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\n\nimport { DefaultErrorBoundary } from './ErrorView'\n\ninterface QueryClientConfig {\n queryCache?: QueryCache\n mutationCache?: MutationCache\n defaultOptions?: DefaultOptions\n}\n\ninterface QueryContextProps {\n queryOptions?: QueryClientConfig\n}\n\nexport function getQueryClient(queryOptions?: QueryClientConfig) {\n return new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n ...queryOptions?.defaultOptions?.queries,\n },\n ...queryOptions?.defaultOptions,\n },\n // ...queryOptions,\n })\n}\n\nexport function QueryClientContext({ children, queryOptions }: React.PropsWithChildren) {\n // const client = React.useRef(getQueryClient(queryOptions))\n const client = React.useMemo(() => getQueryClient(queryOptions), [queryOptions]);\n\n\n return (\n \n {/* */}\n {children}\n \n )\n}\n\nexport function withQueryClientContext(\n Component: React.ComponentType,\n config?: QueryClientConfig\n): React.ComponentType {\n const hocComponent = (props: Props) => (\n \n \n \n )\n\n hocComponent.displayName = `withQueryClientContext(${Component.displayName ?? 'Component'})`\n\n return hocComponent\n}\n","import * as React from 'react'\nimport { BrowserRouter } from 'react-router-dom'\n\nimport { QueryClientContext } from './QueryClientContext'\nimport { MapContextProvider } from './Map'\n\nexport function MapContext(props: React.PropsWithChildren) {\n return (\n \n \n \n Loading...\n \n }\n >\n {props.children}\n \n \n \n )\n}\n","import { MapSubtype, MapSubtypeId, MapType, MapTypeId, PerfData, ScaleId } from '../types'\n\nexport const EXPANDED_MAP_BODY_CLASSS = 'is-map-expanded'\nexport const FALLBACK_PERF_RESPONSE: PerfData = { nodes: {}, currentPriceNodes: {}, valueNodes: {}, additional: {}, subtype: MapSubtypeId.DayPerf, hash: '' }\n\ntype SubtypesRecord = Record\ntype SubtypesGroup = { items: MapSubtype[] }\n\nconst MAP_SUBTYPES_INTRADAY_BY_ID: SubtypesRecord = {\n [MapSubtypeId.IntradayPerf1m]: {\n value: MapSubtypeId.IntradayPerf1m,\n label: '1-Minute Performance',\n scaleId: ScaleId.IntradayReduced,\n tooltip:\n 'Color indicates 1 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf2m]: {\n value: MapSubtypeId.IntradayPerf2m,\n label: '2-Minute Performance',\n scaleId: ScaleId.IntradayReduced,\n tooltip:\n 'Color indicates 2 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf3m]: {\n value: MapSubtypeId.IntradayPerf3m,\n label: '3-Minute Performance',\n scaleId: ScaleId.IntradayReduced,\n tooltip:\n 'Color indicates 3 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf5m]: {\n value: MapSubtypeId.IntradayPerf5m,\n label: '5-Minute Performance',\n scaleId: ScaleId.IntradayReduced,\n tooltip:\n 'Color indicates 5 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf10m]: {\n value: MapSubtypeId.IntradayPerf10m,\n label: '10-Minute Performance',\n scaleId: ScaleId.IntradayReduced,\n tooltip:\n 'Color indicates 10 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf15m]: {\n value: MapSubtypeId.IntradayPerf15m,\n label: '15-Minute Performance',\n scaleId: ScaleId.IntradayReduced,\n tooltip:\n 'Color indicates 15 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf30m]: {\n value: MapSubtypeId.IntradayPerf30m,\n label: '30-Minute Performance',\n scaleId: ScaleId.DayPerf,\n tooltip:\n 'Color indicates 30 minute stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf1h]: {\n value: MapSubtypeId.IntradayPerf1h,\n label: '1-Hour Performance',\n scaleId: ScaleId.DayPerf,\n tooltip:\n 'Color indicates 1 hour stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf2h]: {\n value: MapSubtypeId.IntradayPerf2h,\n label: '2-Hour Performance',\n scaleId: ScaleId.DayPerf,\n tooltip:\n 'Color indicates 2 hour stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerf4h]: {\n value: MapSubtypeId.IntradayPerf4h,\n label: '4-Hour Performance',\n scaleId: ScaleId.DayPerf,\n tooltip:\n 'Color indicates 4 hour stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.IntradayPerfAH]: {\n value: MapSubtypeId.IntradayPerfAH,\n label: 'After-Hours Performance',\n scaleId: ScaleId.DayPerf,\n tooltip:\n 'Color indicates after-hours stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n}\n\nconst MAP_SUBTYPES_INTERDAY_BY_ID: SubtypesRecord = {\n [MapSubtypeId.DayPerf]: {\n value: MapSubtypeId.DayPerf,\n label: '1-Day Performance',\n scaleId: ScaleId.DayPerf,\n tooltip:\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.WeekPerf]: {\n value: MapSubtypeId.WeekPerf,\n label: '1-Week Performance',\n scaleId: ScaleId.WeekPerf,\n tooltip:\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.MonthPerf]: {\n value: MapSubtypeId.MonthPerf,\n label: '1-Month Performance',\n scaleId: ScaleId.MonthPerf,\n tooltip:\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.ThreeMonthPerf]: {\n value: MapSubtypeId.ThreeMonthPerf,\n label: '3-Month Performance',\n scaleId: ScaleId.ThreeMonthPerf,\n tooltip:\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.SixMonthPerf]: {\n value: MapSubtypeId.SixMonthPerf,\n label: '6-Month Performance',\n scaleId: ScaleId.SixMonthPerf,\n tooltip:\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.YearPerf]: {\n value: MapSubtypeId.YearPerf,\n label: '1-Year Performance',\n scaleId: ScaleId.YearPerf,\n tooltip:\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.YearToDatePerf]: {\n value: MapSubtypeId.YearToDatePerf,\n label: 'Year To Date Performance',\n scaleId: ScaleId.YearPerf,\n tooltip:\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n}\n\nexport const MAP_SUBTYPES_GENERAL: SubtypesRecord = {\n [MapSubtypeId.RelativeVolume]: {\n value: MapSubtypeId.RelativeVolume,\n label: 'Relative Volume',\n scaleId: ScaleId.RelativeVolume,\n tooltip:\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.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.PriceToEarnings]: {\n value: MapSubtypeId.PriceToEarnings,\n label: 'P/E',\n scaleId: ScaleId.PriceToEarnings,\n tooltip: \"Color indicates the stock's price-to-earnings ratio.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.ForwardPriceToEearnings]: {\n value: MapSubtypeId.ForwardPriceToEearnings,\n label: 'Forward P/E',\n scaleId: ScaleId.ForwardPriceToEearnings,\n tooltip: \"Color indicates the stock's forward price-to-earnings ratio.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.PriceEarningsToGrowth]: {\n value: MapSubtypeId.PriceEarningsToGrowth,\n label: 'PEG',\n scaleId: ScaleId.PriceEarningsToGrowth,\n tooltip: \"Color indicates the stock's price-to-earnings-to-growth ratio.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.PriceToSellsRatio]: {\n value: MapSubtypeId.PriceToSellsRatio,\n label: 'P/S',\n scaleId: ScaleId.PriceToSellsRatio,\n tooltip: \"Color indicates the stock's price-to-sales ratio.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.PriceToBookRatio]: {\n value: MapSubtypeId.PriceToBookRatio,\n label: 'P/B',\n scaleId: ScaleId.PriceToBookRatio,\n tooltip: \"Color indicates the stock's price-to-book ratio.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.DividendYield]: {\n value: MapSubtypeId.DividendYield,\n label: 'Dividend Yield',\n scaleId: ScaleId.DividendYield,\n tooltip: \"Color indicates the stock's dividend yield.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.EPSGrowth5y]: {\n value: MapSubtypeId.EPSGrowth5y,\n label: 'EPS Growth Past 5 Years',\n scaleId: ScaleId.EPSGrowth5y,\n tooltip: \"Color indicates the stock's annual earnings (EPS) growth over past 5 years.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.FloatShort]: {\n value: MapSubtypeId.FloatShort,\n label: 'Float Short',\n scaleId: ScaleId.FloatShort,\n tooltip: \"Color indicates percent of the stock's float sold short.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.AnalystRecommendation]: {\n value: MapSubtypeId.AnalystRecommendation,\n label: 'Analysts Recom.',\n scaleId: ScaleId.AnalystRecommendation,\n tooltip:\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.\",\n countIndustryPerf: true,\n countSectorPerf: true,\n },\n [MapSubtypeId.EarningsPerf]: {\n value: MapSubtypeId.EarningsPerf,\n label: 'Earnings Day Performance',\n scaleId: ScaleId.MonthPerf,\n tooltip:\n \"Color indicates stock's performance on earnings day. Next day performance for earnings reported after market close.\",\n countIndustryPerf: false,\n countSectorPerf: false,\n },\n [MapSubtypeId.EarningsDate]: {\n value: MapSubtypeId.EarningsDate,\n label: 'Earnings Date',\n scaleId: ScaleId.EarningsDate,\n tooltip: \"Color indicates stock's earnings date.\",\n countIndustryPerf: false,\n countSectorPerf: false,\n },\n}\n\nexport const MAP_SUBTYPE_DAY_PERF = MAP_SUBTYPES_INTERDAY_BY_ID[MapSubtypeId.DayPerf]\n\nconst MAP_SUBTYPES_INTRADAY: SubtypesGroup = { items: Object.values(MAP_SUBTYPES_INTRADAY_BY_ID) }\nconst MAP_SUBTYPES_INTERDAY: SubtypesGroup = { items: Object.values(MAP_SUBTYPES_INTERDAY_BY_ID) }\nconst MAP_SUBTYPES_TIMEFRAMES: SubtypesGroup[] = [MAP_SUBTYPES_INTRADAY, MAP_SUBTYPES_INTERDAY]\n\nexport const MAP_SUBTYPES_COMPANIES: SubtypesGroup[] = [\n ...MAP_SUBTYPES_TIMEFRAMES,\n { items: Object.values(MAP_SUBTYPES_GENERAL) },\n]\n\nexport const MAP_SUBTYPES_ETF: SubtypesGroup[] = [\n ...MAP_SUBTYPES_TIMEFRAMES,\n { items: [MAP_SUBTYPES_GENERAL[MapSubtypeId.RelativeVolume]] },\n]\n\nexport const MAP_TYPES: MapType[] = [\n {\n name: 'S&P 500',\n pageTitle: 'S&P 500 Map',\n description:\n \"Standard and Poor's 500 index stocks categorized by sectors and industries. Size represents market cap.\",\n type: MapTypeId.Sector,\n subtypes: MAP_SUBTYPES_COMPANIES,\n },\n {\n name: 'World',\n pageTitle: 'World Map',\n description:\n 'Foreign ADR stocks listed on NYSE, NASDAQ, AMEX categorized by geo location. Size represents market cap.',\n type: MapTypeId.World,\n subtypes: MAP_SUBTYPES_COMPANIES,\n },\n {\n name: 'Full',\n pageTitle: 'Stock Market Map',\n description:\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\n type: MapTypeId.SectorFull,\n subtypes: MAP_SUBTYPES_COMPANIES,\n },\n {\n name: 'Exchange Traded Funds',\n pageTitle: 'ETF Map - Exchange Traded Funds Map',\n nameShort: 'ETF',\n description: 'ETFs categorized by sectors and styles. Size represents 3-month average dollar volume, $1M minimum.',\n type: MapTypeId.ETF,\n subtypes: MAP_SUBTYPES_ETF,\n },\n]\n\nexport const MAP_TYPE_SCREENER = {\n name: 'Screener',\n pageTitle: 'Screener Map',\n description:\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Stock size represents market cap.',\n type: MapTypeId.Screener,\n subtypes: MAP_SUBTYPES_COMPANIES,\n}\n\nexport const MAP_TYPE_ETF_HOLDINGS_WIDGET = {\n name: 'ETF Holdings',\n pageTitle: '',\n description: '',\n type: MapTypeId.ETFHoldings,\n subtypes: MAP_SUBTYPES_COMPANIES,\n}\n","export type MapOrder = Record\n\nexport const MAP_MIN_WIDTH = 700\nexport const MAP_MIN_HEIGHT = 388\nexport const SECTOR_MIN_HEIGHT = 5\nexport const LEGEND_HEIGHT = 79\n\nexport const LARGE_MAP_HEIGHT_RATIO = 1.8\nexport const SMALL_MAP_GEO_HEIGHT_RATIO = 1.7\nexport const SMALL_MAP_HEIGHT_RATIO = 1.085 // old design ratio - 1.33\n\n// Minimal size of node to display header\nexport const LARGE_NODE_SIZE = {\n dx: 40,\n dy: 12,\n}\n\n// Don't display header if node height - header is smaller than this\nexport const LARGE_NODE_MIN_HEIGHT = 5\n\nexport const ORDER_SP500: MapOrder = {\n Technology: 10,\n Financial: 11,\n 'Communication Services': 9,\n 'Consumer Defensive': 7,\n 'Consumer Cyclical': 6,\n Healthcare: 8,\n Industrials: 5,\n 'Real Estate': 4,\n Energy: 3,\n Utilities: 2,\n 'Basic Materials': 1,\n\n 'Software - Infrastructure': 2,\n Semiconductors: 1,\n}\n","import tailwindColors from '../assets/colors'\nimport { ScaleId } from '../types'\n\nexport interface ISettings {\n padding: { top: number; right: number; bottom: number; left: number }\n background: string\n industry: ISettingsSection\n sector: ISettingsSection\n scaleFontSizes: Record\n fontSizePadding: Record\n fontSizePairs: Record\n}\n\nexport interface ISettingsSection {\n padding: { top: number; right: number; bottom: number; left: number }\n background: string | null\n border: string | null\n header: ISettingsSectionHeader\n hover?: ISettingsSectionHeader\n}\n\nexport interface ISettingsSectionHeader extends ISettingsSectionFont {\n background: string | null\n border: string | null\n height: number\n margin: { top: number; right: number; bottom: number; left: number }\n}\n\nexport interface ISettingsSectionFont {\n color: string\n fontSize: number\n fontWeight: 'bold' | 'normal'\n padding: { top: number; right: number; left: number }\n}\n\nexport const scaleMinMax: Record = {\n [ScaleId.IntradayReduced]: [-1, 1],\n [ScaleId.DayPerf]: [-3, 3],\n _5: [-6, 6],\n _10: [-10, 10],\n _15: [-18, 18],\n _20: [-24, 24],\n _25: [-30, 30],\n _relvol: [0, 3],\n _pe: [0, 30],\n _fpe: [0, 30],\n _peg: [0, 3],\n _ps: [0, 5],\n _pb: [0, 5],\n _div: [0, 5],\n _eps5y: [-50, 50],\n _short: [0, 15],\n _rec: [5, 1],\n _earndate: [30, -30],\n // Portfolio — values are just placeholders, the real value is computed from data\n _portfolioPct: [-1, 1],\n _portfolioUsd: [-1, 1],\n}\n\nexport const scaleStepFormat: Record = {\n [ScaleId.IntradayReduced]: '%N%',\n [ScaleId.DayPerf]: '%N%',\n _5: '%N%',\n _10: '%N%',\n _15: '%N%',\n _20: '%N%',\n _25: '%N%',\n _relvol: '%N',\n _pe: '%N',\n _fpe: '%N',\n _peg: '%N',\n _ps: '%N',\n _pb: '%N',\n _div: '%N%',\n _eps5y: '%N%',\n _short: '%N%',\n _rec: { 1: '%N Strong Buy', 2: '%N Buy', 3: '%N Hold', 4: '%N Sell', 5: '%N Strong Sell' },\n _earndate: {\n '-30': '%N Days',\n '-15': '%N Days',\n '-1': 'After Earnings',\n 1: 'Before Earnings',\n 15: '%N Days',\n 30: '%N Days',\n },\n _portfolioPct: '%N%',\n _portfolioUsd: '$%N',\n}\n\nexport const Settings: ISettings = {\n padding: { top: 0, right: 0, bottom: 1, left: 1 },\n background: tailwindColors.customApp['blue-gray'],\n sector: {\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\n background: null,\n border: null,\n header: {\n color: '#fff',\n background: null,\n border: null,\n height: 14.5,\n fontSize: 13,\n fontWeight: 'bold',\n margin: { top: 0, right: 0, bottom: 5, left: 0 },\n padding: { top: -1, right: 4, left: 4 },\n },\n },\n industry: {\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\n background: null,\n border: null,\n header: {\n color: '#fff',\n background: null,\n border: tailwindColors.customApp['blue-gray'],\n height: 14,\n fontSize: 12,\n fontWeight: 'normal',\n margin: { top: 0, right: 0.5, bottom: 0, left: -0.5 },\n padding: { top: -0.5, right: 4, left: 4 },\n },\n hover: {\n color: '#041c38',\n background: '#1271e6',\n border: '#1271e6',\n height: 12,\n fontSize: 10,\n fontWeight: 'normal',\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\n padding: { top: -0.5, right: 3, left: 4 },\n },\n },\n scaleFontSizes: {\n 1: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8],\n 1.5: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\n 2.25: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\n 3: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\n },\n fontSizePadding: {\n 36: 30,\n 30: 25,\n 24: 20,\n 20: 14,\n 18: 12,\n 14: 9,\n 13: 7,\n 12: 7,\n 11: 4,\n 10: 3,\n 9: 3,\n 8: 2.5,\n 6: 0,\n 4: 1,\n },\n fontSizePairs: {\n 36: [18, 14, 13, 12],\n 30: [14, 13, 12, 11, 10],\n 24: [14, 13, 12, 11, 10],\n 20: [12, 11, 10, 9, 8, 6],\n 18: [11, 10, 9, 8, 6],\n 14: [9, 8, 6, 4],\n 13: [9, 8, 6, 4],\n 12: [9, 8, 6, 4],\n 11: [8, 6, 4],\n 10: [10, 9, 8, 6, 4],\n 9: [9, 8, 6, 4],\n 8: [8, 6, 4],\n 6: [6, 4],\n 4: [4],\n },\n}\n\nexport const SettingsSmall: ISettings = {\n ...Settings,\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\n background: '#343842',\n sector: {\n ...Settings.industry,\n padding: { top: 0.5, right: 0, bottom: 0, left: 2 },\n border: '#e0e0e0',\n header: {\n ...Settings.industry.header,\n margin: { top: 0, right: 0.5, bottom: 0, left: -1.5 },\n padding: { top: 0.5, right: 1, left: 1 },\n border: '#343842',\n fontSize: 9,\n },\n },\n industry: {\n ...Settings.industry,\n padding: { top: 0, right: 1, bottom: 1, left: 0 },\n header: {\n ...Settings.industry.header,\n height: 0,\n },\n },\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 2, 6: 0, 4: 0 },\n fontSizePairs: {\n 14: [9, 8, 6],\n 13: [9, 8, 6],\n 12: [6],\n 11: [6],\n 10: [6],\n 9: [6],\n 8: [6],\n 6: [6],\n },\n}\n\nexport const SettingsSmallDark: ISettings = {\n ...SettingsSmall,\n sector: {\n ...SettingsSmall.sector,\n background: tailwindColors.gray[800],\n border: tailwindColors.gray[800],\n header: {\n ...SettingsSmall.sector.header,\n padding: { top: 0.5, right: 2, left: 2 },\n margin: { top: 0, right: 1.5, bottom: 0, left: -0.5 },\n border: tailwindColors.gray[800],\n },\n },\n industry: {\n ...SettingsSmall.industry,\n header: {\n ...SettingsSmall.industry.header,\n border: tailwindColors.gray[800],\n },\n },\n}\n\nexport const SettingsSmallGeo: ISettings = {\n ...Settings,\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\n background: '#a7c4d3',\n industry: {\n ...Settings.industry,\n background: '#e0e0e0',\n header: {\n ...Settings.industry.header,\n height: 9,\n fontSize: 8,\n border: '#e0e0e0',\n margin: { top: -0.5, right: 0.5, bottom: 0, left: -0.5 },\n padding: { top: -1, right: 0, left: 1 },\n },\n },\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 1, 6: 0, 4: 0 },\n fontSizePairs: {\n 14: [9, 8, 6],\n 13: [9, 8, 6],\n 12: [6],\n 11: [6],\n 10: [6],\n 9: [6],\n 8: [6],\n 6: [6],\n },\n}\n\nexport const SettingsSmallGeoDark: ISettings = {\n ...SettingsSmallGeo,\n background: tailwindColors.gray[800],\n sector: {\n ...SettingsSmallGeo.sector,\n background: tailwindColors.gray[800],\n border: tailwindColors.gray[800],\n },\n industry: {\n ...SettingsSmallGeo.industry,\n border: tailwindColors.gray[800],\n background: tailwindColors.gray[800],\n header: {\n ...SettingsSmallGeo.industry.header,\n border: tailwindColors.gray[800],\n },\n },\n}\n\nexport const SettingsScreener: ISettings = {\n ...Settings,\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\n sector: {\n ...Settings.sector,\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\n background: '#363a46',\n border: '#d3d3d3',\n header: {\n ...Settings.sector.header,\n height: 20,\n padding: { top: 2.5, right: 4, left: 4 },\n },\n },\n industry: {\n ...Settings.industry,\n header: {\n ...Settings.industry.header,\n border: '#363a46',\n },\n },\n}\n\nexport const SettingsScreenerDark: ISettings = {\n ...SettingsScreener,\n sector: {\n ...SettingsScreener.sector,\n background: tailwindColors.gray[800],\n border: tailwindColors.gray[800],\n },\n industry: {\n ...SettingsScreener.industry,\n header: {\n ...SettingsScreener.industry.header,\n border: tailwindColors.gray[800],\n },\n },\n}\n","import { ContentType, apiRequest } from './mainapi'\nimport { MapSubtypeId, MapTypeId, PerfData } from '../types'\nimport { BASE_URL } from '../../../utils/config'\nimport preMarketData from '../assets/base_data/pre-market.json'\nimport { isMarketOpen, isPremarket } from '../header/utils'\n\nexport async function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\n if (isPremarket()) {\n // if (!isMarketOpen()) {\n return {\n \"nodes\": preMarketData,\n \"additional\": {},\n \"valueNodes\": {},\n \"currentPriceNodes\": {},\n \"subtype\": subtype,\n \"version\": 10,\n \"hash\": generateRandomHash().substring(0, 32)\n }\n }\n const apiResponse: any = await apiRequest(`${BASE_URL}/market-breakdown`, { method: 'POST', query: { t: type, st: subtype } })\n const computeValues = apiResponse.reduce((acc: any, { symbol, changePercentage, price, marketCap }: any) => {\n acc.result[symbol] = changePercentage;\n acc.currentPrice[symbol] = price;\n acc.currentValue[symbol] = marketCap;\n return acc;\n }, { result: {}, currentPrice: {}, currentValue: {} });\n\n const { result, currentPrice, currentValue } = computeValues;\n\n const data = {\n \"nodes\": result,\n \"additional\": {},\n \"valueNodes\": currentValue,\n \"currentPriceNodes\": currentPrice,\n \"subtype\": subtype,\n \"version\": 10,\n \"hash\": generateRandomHash().substring(0, 32)\n } // TODO to move this to API\n return { data }\n}\n\nexport async function baseData(type: MapTypeId, subtype: MapSubtypeId) {\n if (!isMarketOpen()) {\n return {\n \"nodes\": preMarketData,\n \"additional\": {},\n \"subtype\": subtype,\n \"version\": 10,\n \"hash\": generateRandomHash().substring(0, 32)\n }\n }\n return await apiRequest(`${BASE_URL}/market-breakdown`, { method: 'POST', query: { t: type, st: subtype } })\n}\n\nfunction generateRandomHash() {\n return Math.random().toString(36).substring(2) + Math.random().toString(36).substring(2);\n}\n\nexport function mapPerfScreener(query = window.location.search) {\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\n}\n\nexport interface UploadMapResponse {\n imgUrl: string\n shareUrl: string\n}\n\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\n return apiRequest(`/publish_map_submit.ashx`, {\n method: 'POST',\n headers: {\n 'Content-Type': ContentType.FormUrlEncoded,\n },\n body: new URLSearchParams({\n file: data.replace('data:image/png;base64,', ''),\n type,\n subtype,\n }),\n })\n}\n","import * as React from 'react'\r\n\r\nimport { EXPANDED_MAP_BODY_CLASSS } from '../../constants/constants'\r\nimport { isIpad, isMobile } from '../../shared/isMobile'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { MapDataRoot } from '../../types'\r\nimport * as mapUtils from '../../utils'\r\nimport { useMapContext } from '../Map'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro'\r\n\r\ninterface ExpandProps {\r\n data?: MapDataRoot\r\n className?: string\r\n \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 const containerElement = document.getElementById('container-fluid')\r\n if (!containerElement) return\r\n\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS) && document.fullscreenElement) {\r\n document.exitFullscreen()\r\n document.body.classList.remove(EXPANDED_MAP_BODY_CLASSS)\r\n } else {\r\n document.body.classList.add(EXPANDED_MAP_BODY_CLASSS)\r\n containerElement.requestFullscreen().catch((err) => {\r\n console.error(`Error attempting to enable full-screen mode: ${err.message} (${err.name})`)\r\n })\r\n\r\n }\r\n\r\n \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\r\n if (isMobile() && !isIpad()) return null\r\n\r\n return (\r\n \r\n Fullscreen\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { MapSubtype, MapType } from '../../types'\r\nimport { useMapContext } from '../Map'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro'\r\nimport mapStore from '../../store/map-store'\r\nimport { drawShareMap } from '../../shared/drawShareMap'\r\nimport { getDate, getFormattedDateString } from '../../header/utils'\r\n\r\ninterface SaveImageProps {\r\n mapType: MapType\r\n subtype: MapSubtype\r\n className?: string\r\n\r\n}\r\n\r\nexport function SaveImage(props: SaveImageProps) {\r\n const { treemap } = useMapContext()\r\n\r\n const onSaveImage = React.useCallback(async () => {\r\n if (!treemap) return\r\n\r\n const canvas = mapStore.getPublishCanvas()\r\n const data = await drawShareMap(canvas, [props.mapType.name, props.subtype.label, getFormattedDateString(), ' '])\r\n if (data) {\r\n const link = document.createElement('a')\r\n link.href = data\r\n const currentDateTime = getFormattedDateString(getDate(), 'long')\r\n const customFilename = `unusualflow.com - ${currentDateTime}`\r\n\r\n link.download = `${customFilename}.png`\r\n link.click()\r\n }\r\n\r\n }, [treemap])\r\n\r\n\r\n return (\r\n \r\n Save Image\r\n \r\n \r\n\r\n )\r\n}\r\n","// import logoBase64 from './assets/logo.png'\nimport { isFirefoxDesktop } from './isMobile'\nimport { loadImage } from './loadImage'\nimport { getScaleRatio } from './retinafy'\n\nexport async function drawShareMap(canvasEl: HTMLCanvasElement, text: string[]) {\n const fontFamily = \"Popins, sans-serif\"\n\n const ratio = getScaleRatio()\n const width = canvasEl.width / ratio\n const height = canvasEl.height / ratio\n\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\n canvas.width = width\n canvas.height = height + 22\n\n // Background\n context.fillStyle = '#fff'\n context.fillRect(0, 0, width, height)\n\n // Logo\n // const logo = await loadImage('/static/media/icon-unusual-flow-primary.bc40ba535302973175700ed94fd7b874.svg')\n // context.drawImage(logo, 2, 4)\n \n context.textAlign = 'left'\n context.font = '12pt ' + fontFamily\n context.fillStyle = '#4c5261'\n context.fillText((\"unusualflow.com\").toUpperCase(), 2, 17)\n\n // Labels\n const label = text.map((t) => t.toUpperCase())\n let x = width\n const y = 11\n\n context.textBaseline = 'middle'\n context.textAlign = 'right'\n context.font = '9pt ' + fontFamily\n for (let i = label.length - 1; i >= 0; i--) {\n const text = label[i]\n let textWidth = context.measureText(text).width\n\n context.fillStyle = '#4c5261'\n context.fillText(text, x, y)\n\n if (i > 0) {\n if (text !== ' '){\n const divider = ' • '\n context.fillStyle = '#5faaf4'\n context.fillText(divider, x - textWidth, y)\n textWidth = textWidth + context.measureText(divider).width\n }\n }\n\n x = x - textWidth\n }\n\n context.drawImage(canvasEl, 0, 0, width * ratio, height * ratio, 0, 22, width, height)\n\n // context.font = 'bold 12pt ' + fontFamily\n // context.fillStyle = '#4c5261'\n // context.textBaseline = 'bottom'\n // context.textAlign = 'center'\n // context.fillText('Unusualflow.com', width / 2, height + 40) // Adding text 40px from the bottom\n\n\n return canvas.toDataURL()\n}\n","import * as React from 'react'\n// import { ErrorBoundary } from 'react-error-boundary'\n\nimport { Map, useMapContext } from './components/Map'\nimport { useMapData } from './hooks/use-map-data'\nimport { useMapType } from './hooks/use-map-type'\nimport { MapDataRoot } from './types'\nimport * as mapUtils from './utils'\nimport { Expand } from './components/Topbar/Expand'\nimport { SaveImage } from './components/Topbar/Save-image'\n\nconst linkClassName = 'btn btn-sm btn-primary'\n\nexport interface MapInitProps {\n initData?: MapDataRoot\n initialPerf?: any\n generate?: boolean\n}\n\nfunction HeatmapApp(props: MapInitProps) {\n\n const { treemap } = useMapContext()\n const { type, subtype } = useMapType()\n const mapData = useMapData(type.type, subtype.value, props.initData, props.initialPerf)\n\n /**\n * Set new subtype to be false on perf data load so we don’t display loading state when fetching\n * new perf data for the same type\n */\n const [isNewSubtype, setIsNewSubtype] = React.useState(false)\n React.useEffect(() => {\n if (!mapData.perfDataQuery.isFetching) {\n setIsNewSubtype(false)\n }\n }, [mapData.perfDataQuery.isFetching])\n\n const isLoadingInitialBaseData = mapData.baseDataQuery.isLoading\n const isLoadingInitialPerf = mapData.perfDataQuery.isLoading\n const isInitialLoading = isLoadingInitialBaseData || isLoadingInitialPerf\n const isFetchingNewPerf = isNewSubtype && !mapData.perfDataQuery.isLoading && mapData.perfDataQuery.isFetching\n\n return (\n
\n
\n
\n
\n S&P 500\n
\n
\n \n \n
\n\n
\n
\n\n
\n
\n \n
\n
\n
\n\n )\n}\n\nexport default HeatmapApp\n","// import { useLocation } from 'react-router-dom'\n\nimport { MAP_TYPES } from '../constants/constants'\nimport { MapSubtypeId } from '../types'\n\n/**\n * Hook which gets the current map type and subtype from the URL\n */\nexport function useMapType() {\n // const query = new URLSearchParams(useLocation().search)\n const query = new URLSearchParams({})\n const typeFromQuery = query.get('t')\n const subtypeFromQuery = query.get('st')\n\n const type = MAP_TYPES.find((t) => t.type === typeFromQuery) ?? MAP_TYPES[0]\n const subtypes = type.subtypes.flatMap((type) => type.items)\n const subtype =\n subtypes.find((subtype) => subtype.value === subtypeFromQuery) ??\n subtypes.find((subtype) => subtype.value === MapSubtypeId.DayPerf) ??\n subtypes[0]\n\n return { type, subtype }\n}\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\nimport * as React from 'react'\n\nimport { FALLBACK_PERF_RESPONSE } from '../constants/constants'\nimport * as api from '../services/api'\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData, StockData } from '../types'\nimport * as mapUtils from '../utils'\nimport { getMapBaseData } from '../utils'\n\nexport type MapDataHookReturn = ReturnType\n\n/**\n * Hook which fetches map data and perf data from the api\n */\nexport function useMapData(\n type: MapTypeId,\n subtype: MapSubtypeId,\n mapBaseData?: MapDataRoot,\n initialPerf?: PerfData,\n fetchPerfData = api.mapPerf,\n) {\n const queryClient = useQueryClient()\n const dataVersion = React.useRef()\n const prevType = React.useRef()\n\n React.useEffect(() => {\n if (mapBaseData) {\n const perfData = mapUtils.parseInitDataAsPerf(mapBaseData)\n queryClient.setQueryData(['mapPerf', type, subtype], perfData)\n prevType.current = type\n } else if (initialPerf) {\n queryClient.setQueryData(['mapPerf', type, subtype], initialPerf)\n prevType.current = type\n }\n // This effect only needs to run on mount, otherwise we’d be overriding the data\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const baseDataQuery = useQuery({\n queryKey: ['mapBaseData', type],\n queryFn: async () => getMapBaseData(type) as unknown as Promise,\n initialData: !prevType.current ? mapBaseData : undefined,\n staleTime: Infinity,\n })\n\n // const baseDataQuery = useQuery({\n // queryKey: ['mapBaseData', type],\n // // queryFn: async () => {\n // // const data = await fetchBaseData(type, subtype) as unknown as StockData[]\n // // return getMapBaseData(type, data) as unknown as Promise\n // // },\n // queryFn: async () => getMapBaseData(type,data) as unknown as Promise,\n // initialData: () => (!prevType.current ? mapBaseData : undefined),\n // // cacheTime: Infinity,\n // staleTime: Infinity,\n // })\n\n const perfDataQuery = useQuery({\n queryKey: ['mapPerf', type, subtype],\n queryFn: async () => {\n const { data } = await fetchPerfData(type, subtype)\n\n return (\n data ??\n queryClient.getQueryData(['mapPerf', type, subtype]) ?? {\n ...FALLBACK_PERF_RESPONSE,\n version: dataVersion.current,\n }\n )\n },\n // Keep previous data if the map type hasn’t changed\n // keepPreviousData: prevType.current === type,\n refetchInterval: () => mapUtils.getMapsRefreshInterval(),\n staleTime: 600000,\n // onSuccess(data:any) {\n // if (!dataVersion.current && data) {\n // dataVersion.current = data.version\n // }\n\n // if (dataVersion.current !== data?.version) {\n // window.location.reload()\n // return\n // }\n\n // prevType.current = type\n // },\n })\n\n const data = React.useMemo(() => {\n if (!perfDataQuery.data || !baseDataQuery.data) return undefined\n\n const [restoredData] = mapUtils.restoreDataKeys([baseDataQuery.data], perfDataQuery.data)\n\n return restoredData\n }, [baseDataQuery, perfDataQuery.data])\n\n return {\n data,\n baseDataQuery,\n perfDataQuery,\n }\n}\n","import * as d3 from 'd3'\n\nimport * as constants from './constants/generator'\nimport { ISettings } from './constants/settings'\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, NodeDepth } from './types'\n\nexport default class LayoutGenerator {\n width: number\n height: number\n settings: ISettings\n layout?: Array>\n sectors: MapDataSector[] = []\n industries: MapDataIndustry[] = []\n nodes: MapDataNode[] = []\n isSmall: boolean\n type: MapTypeId\n minSectorHeight: number\n\n static smallIndustryPadding = {\n top: 4,\n right: 1,\n bottom: 1,\n left: 1,\n }\n\n static smallIndustryGeoPadding = {\n top: 4,\n right: 1,\n bottom: 1,\n left: 1,\n }\n\n static getSizeRatio = (type: MapTypeId, isSmall: boolean) => {\n if (isSmall) {\n if (type === MapTypeId.World) {\n return constants.SMALL_MAP_GEO_HEIGHT_RATIO\n }\n return constants.SMALL_MAP_HEIGHT_RATIO\n }\n\n return constants.LARGE_MAP_HEIGHT_RATIO\n }\n\n static calculateHeight = (\n width: number,\n type: MapTypeId,\n isSmall: boolean,\n ratio = LayoutGenerator.getSizeRatio(type, isSmall)\n ) => ~~(width / ratio)\n\n static calculateWidth = (height: number, type: MapTypeId, isSmall: boolean) => {\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\n\n return Math.round(height * ratio)\n }\n\n static isNodeHeaderVisible(node: any, settings: ISettings) {\n const deltaX = node.dx ?? Math.round(node.x1) - Math.round(node.x0)\n const deltaY = node.dy ?? Math.round(node.y1) - Math.round(node.y0)\n\n const isLargeNode = deltaX >= constants.LARGE_NODE_SIZE.dx && deltaY >= constants.LARGE_NODE_SIZE.dy\n const showHeader =\n deltaY - settings.industry.padding.top - settings.industry.header.height > constants.LARGE_NODE_MIN_HEIGHT\n\n return isLargeNode && showHeader\n }\n\n constructor(width: number, height: number, type: MapTypeId, settings: ISettings, isSmall: boolean = false) {\n this.width = width\n this.height = height\n this.settings = settings\n this.isSmall = isSmall\n this.type = type\n this.minSectorHeight = settings.sector.padding.top + settings.sector.header.height + constants.SECTOR_MIN_HEIGHT\n }\n\n\n\n getLayoutData() {\n return {\n nodes: this.nodes,\n sectors: this.sectors,\n industries: this.industries,\n }\n }\n\n filterVisibleNodes = (arr: T[]) =>\n arr.filter((node) => {\n const isVisible = this.isNodeVisible(node)\n if (isVisible && node.children?.length) {\n node.children = this.filterVisibleNodes(node.children)\n }\n return isVisible\n })\n\n isNodeVisible(d: MapDataRow) {\n if (!d.depth || d.depth < NodeDepth.Industry) return true\n\n return d.dx > 0 && d.dy > 0\n }\n\n getLayout(data: MapDataRoot) {\n this.nodes = []\n this.sectors = []\n this.industries = []\n this.layout = this._generateSP500(data).descendants()\n\n this.layout?.forEach((d: any) => {\n\n this._transformNode(d)\n\n if (!this.isNodeVisible(d)) return\n\n if (!d.children) {\n this.nodes.push(d)\n } else if (d.parent && !d.parent.parent) {\n this.sectors.push(d)\n } else if (d.parent && !!d.parent.parent && d.children) {\n this.industries.push(d)\n }\n })\n\n return this.getLayoutData()\n }\n\n _transformNode(d: d3.HierarchyRectangularNode) {\n Object.assign(d, {\n name: d.data.name,\n description: d.data.description,\n perf: d.data.perf, // this is to set performance\n additional: d.data.additional,\n x: d.x0,\n y: d.y0,\n dx: d.x1 - d.x0,\n dy: d.y1 - d.y0,\n })\n }\n\n\n _getPadding = (d: d3.HierarchyRectangularNode) => {\n // Root\n if (d.depth === NodeDepth.Root) {\n return [\n this.settings.padding.top,\n this.settings.padding.right,\n this.settings.padding.bottom,\n this.settings.padding.left,\n ]\n }\n\n // Industries\n if (d.depth === NodeDepth.Industry) {\n if (this.isSmall || LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\n return [\n this.settings.industry.padding.top + this.settings.industry.header.height,\n this.settings.industry.padding.right,\n this.settings.industry.padding.bottom,\n this.settings.industry.padding.left,\n ]\n }\n\n return [\n LayoutGenerator.smallIndustryPadding.top,\n LayoutGenerator.smallIndustryPadding.right,\n LayoutGenerator.smallIndustryPadding.bottom,\n LayoutGenerator.smallIndustryPadding.left,\n ]\n }\n\n // Sectors\n return [\n this.settings.sector.padding.top + this.settings.sector.header.height,\n this.settings.sector.padding.right,\n this.settings.sector.padding.bottom,\n this.settings.sector.padding.left,\n ]\n }\n\n _getHierarchySort = <\n Datum extends { y0?: number; y1?: number; value?: number; data: { name: string }; depth?: number },\n >(\n a: Datum,\n b: Datum,\n order: constants.MapOrder\n ): number => {\n // Sort small sectors (works only when layout is recalculated)\n const heightB = b.y1! - b.y0!\n if (b.depth === NodeDepth.Sector && Number.isFinite(heightB) && heightB < this.minSectorHeight) {\n return b.value! - a.value!\n }\n\n if (order.hasOwnProperty(a.data.name) && order.hasOwnProperty(b.data.name)) {\n return order[b.data.name] - order[a.data.name]\n }\n return b.value! - a.value!\n }\n\n _getHierarchy = (data: MapDataRoot, order: constants.MapOrder) =>\n d3\n .hierarchy(data as unknown as MapDataNode)\n .sum((d) => d.value)\n .sort((a, b) => this._getHierarchySort(a, b, order))\n\n _getTreemap = (width: number, height: number) => {\n const paddingFn = this._getPadding\n\n return d3\n .treemap()\n .size([width, height])\n .round(true)\n .tile(d3.treemapSquarify.ratio(1))\n .paddingTop((d) => paddingFn(d)[0])\n .paddingRight((d) => paddingFn(d)[1])\n .paddingBottom((d) => paddingFn(d)[2])\n .paddingLeft((d) => paddingFn(d)[3])\n }\n\n _generateLayout(data: MapDataRoot, order: constants.MapOrder, recountSectors = false) {\n const treemapHeight = LayoutGenerator.calculateHeight(this.width, this.type, false)\n const treemap = this._getTreemap(this.width, treemapHeight)\n const hierarchy = this._getHierarchy(data, order)\n const recalculateHeight = this.height !== treemapHeight\n\n // Calculate the base layout\n let nodes = treemap(hierarchy)\n\n // Recalculate for custom height\n if (this.height !== treemapHeight) {\n treemap.tile(d3.treemapResquarify).size([this.width, this.height])\n }\n\n // Run layout again so that possible small sectors are reordered\n // This also applies the recalculateHeight option\n if (recountSectors || recalculateHeight) {\n nodes = treemap(nodes.sort((a, b) => this._getHierarchySort(a, b, order)))\n }\n\n return nodes\n }\n\n _generateSP500(data: MapDataRoot) {\n let industryCount: any = {}\n data.children.forEach((stock) => {\n // Count the sectors\n if (stock.name) {\n industryCount[stock.name] = stock.children.length;\n }\n });\n\n const nodes = this._generateLayout(data, constants.ORDER_SP500)\n\n // Switch financial and technology sector\n // const financialSector = nodes.find((node) => node.data.name === 'Financial')!\n // const technologySector = nodes.find((node) => node.data.name === 'Technology')!\n // const financialHeight = financialSector.y1 - financialSector.y0\n // const technologyHeight = technologySector.y1 - technologySector.y0\n\n // financialSector.eachAfter((node) => {\n // if (node.y1 - node.y0 < 1) return\n // node.y0 += technologyHeight\n // node.y1 += technologyHeight\n // })\n\n // technologySector.eachAfter((node) => {\n // if (node.y1 - node.y0 < 1) return\n // node.y0 -= financialHeight\n // node.y1 -= financialHeight\n // })\n\n // // Switch consumer sectors\n // const consumerDefensiveSector = nodes.find((node) => node.data.name === 'Consumer Defensive')!\n // const consumerCyclicalSector = nodes.find((node) => node.data.name === 'Consumer Cyclical')!\n // const consumerDefensiveWidth = consumerDefensiveSector.x1 - consumerDefensiveSector.x0\n // const consumerCyclicalWidth = consumerCyclicalSector.x1 - consumerCyclicalSector.x0\n\n // consumerDefensiveSector.eachAfter((node) => {\n // if (node.x1 - node.x0 < 1) return\n // node.x0 += consumerCyclicalWidth\n // node.x1 += consumerCyclicalWidth\n // })\n\n // consumerCyclicalSector.eachAfter((node) => {\n // if (node.x1 - node.x0 < 1) return\n // node.x0 -= consumerDefensiveWidth\n // node.x1 -= consumerDefensiveWidth\n // })\n\n return nodes\n }\n}\n","import * as Sentry from '@sentry/browser'\nimport { localStorageKey } from '../../../utils/config'\n\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\n// START\nexport enum ContentType {\n ApplicationJson = 'application/json',\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\n FormUrlEncoded = 'application/x-www-form-urlencoded',\n Html = 'text/html; charset=utf-8',\n}\n\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\n switch (contentType) {\n case ContentType.ApplicationJson:\n case ContentType.ApplicationJsonUTF:\n case ContentType.FormUrlEncoded:\n return JSON.parse(response)\n default:\n return response\n }\n}\n// END\n\nexport class ThrowableError extends Error {\n status: number\n isServerError = false\n body: unknown\n extra: Record = {}\n\n constructor(status: number, message = 'ThrowableError', body = '', extra: Record = {}) {\n super(`${status} ${message}`)\n this.status = status\n this.isServerError = status >= 500\n this.body = body\n this.extra = extra\n }\n}\n\nexport interface CancelablePromise extends Promise {\n aborted?: boolean\n cancel?: () => void\n}\n\n/**\n * General api fetch utility which returns a cancelable promise\n */\nexport function apiRequest(\n url: string,\n { query, headers = {}, ...options }: RequestInit & { query?: Record } = {},\n throwOnAllErrors = false\n): CancelablePromise {\n const controller = 'AbortController' in window ? new AbortController() : undefined\n const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\n const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\n\n const requestOptions = {\n ...options,\n headers: {\n 'Content-Type': contentType,\n 'authorization': localStorage.getItem(localStorageKey.token) || '',\n ...headers,\n },\n }\n const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\n\n const cancelableRequest: CancelablePromise = request\n .then(async (response) => {\n const textResponse = await response.text()\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\n\n try {\n const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\n if (!response.ok || response.status >= 500) {\n throw new ThrowableError(response.status, response.statusText, parsedResponse, {\n rayId: response.headers.get('cf-ray'),\n })\n }\n\n return parsedResponse.data\n } catch (error: any) {\n if (error instanceof ThrowableError) {\n throw error\n }\n throw new ThrowableError(response.status, error.message, textResponse, {\n rayId: response.headers.get('cf-ray'),\n })\n }\n })\n .catch((error: ThrowableError) => {\n if (error.status >= 500) {\n Sentry.withScope((scope) => {\n scope.setContext('Cloudflare', error.extra)\n\n if (error.status === 500) {\n Sentry.captureException(error)\n } else {\n Sentry.captureMessage(`${error.status} ${error.message}`)\n }\n })\n }\n if (throwOnAllErrors) {\n throw error\n }\n })\n\n if (controller) {\n cancelableRequest.cancel = () => {\n controller.abort()\n cancelableRequest.aborted = true\n }\n }\n\n return cancelableRequest\n}\n","// OS Matches\nconst matchesAndroid = navigator.userAgent.match(/Android/i)\nconst matchesWebOS = navigator.userAgent.match(/webOS/i)\nconst matchesIPhone = navigator.userAgent.match(/iPhone/i)\nconst matchesiPad = navigator.userAgent.match(/iPad/i)\nconst matchesIPod = navigator.userAgent.match(/iPod/i)\nconst matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\nconst matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\nconst matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\n\n// Browser Matches\nconst matchesFirefox = !!navigator.userAgent.match(/firefox/i)\nconst matchesSafariDesktopLike =\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\n\nconst isMobileDevice =\n matchesAndroid ||\n matchesWebOS ||\n matchesIPhone ||\n matchesiPad ||\n matchesIPod ||\n matchesBlackBerry ||\n matchesWindowsPhone ||\n matchesIOSLike\n\nexport function isMobile() {\n return !!isMobileDevice\n}\n\nexport function isIphone() {\n return !!(matchesIPhone && !matchesiPad)\n}\n\nexport function isIpad() {\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesiPad\n}\n\nexport function isSafariDesktop() {\n return matchesSafariDesktopLike\n}\n\nexport function isIos() {\n return !!matchesIOSLike && !isSafariDesktop()\n}\n\nexport function isFirefox() {\n return matchesFirefox\n}\n\nexport function isFirefoxDesktop() {\n return isFirefox() && !isMobile()\n}\n","export function getScaleRatio() {\n return window.devicePixelRatio ?? 1\n}\n\nexport function retinafy(\n canvas: HTMLCanvasElement | undefined | null,\n context: CanvasRenderingContext2D | undefined,\n width: number,\n height: number\n) {\n if (!canvas || !context) return\n\n const ratio = getScaleRatio()\n\n canvas.width = width * ratio\n canvas.height = height * ratio\n canvas.style.width = width + 'px'\n canvas.style.height = height + 'px'\n context.scale(ratio, ratio)\n\n return ratio\n}\n","import debounce from 'lodash.debounce'\n\nimport { CancelablePromise, apiRequest } from '../services/mainapi'\nimport Treemap from '../treemap'\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\nimport { getVisibleTooltipNodes } from '../utils'\nimport AppDispatcher from './app-dispatcher'\nimport { ActionTypes } from './constants'\nimport mapStore from './map-store'\nimport { BASE_URL } from '../../../utils/config'\n\nvar _targetScale = 1\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\n _targetScale = scale\n animate()\n function animate() {\n treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\n if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\n requestAnimationFrame(animate)\n }\n }\n}\n\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\n _targetScale = scale\n animate()\n function animate() {\n treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\n if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\n requestAnimationFrame(animate)\n }\n }\n}\n\nfunction updateVisibleSparklines(treemap: Treemap) {\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\n const visibleNodes = getVisibleTooltipNodes(hoveredNode)\n\n if (!visibleNodes.length) return\n\n const tickersToLoad = visibleNodes.map((node) => node!.name)\n if (hoveredNode && !tickersToLoad.includes(hoveredNode?.name)) {\n tickersToLoad.push(hoveredNode.name)\n }\n\n debouncedLoadSparklines(tickersToLoad, treemap.type)\n}\n\nlet _lastSparklinesRequest: CancelablePromise | null = null\nasync function loadSparklines(tickers: string[], mapType: string) {\n AppDispatcher.handleViewAction({\n type: ActionTypes.LOAD_SPARKLINES_STARTED,\n })\n _lastSparklinesRequest?.cancel?.()\n _lastSparklinesRequest = apiRequest(\n `${BASE_URL}/apiTODO`,\n { query: { t: tickers.join(',') } },\n true\n )\n\n try {\n const data = await _lastSparklinesRequest\n AppDispatcher.handleServerAction({\n type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\n data: data,\n })\n } catch (error) {\n // This just means we canceled the previous request\n if (_lastSparklinesRequest.aborted) return\n\n AppDispatcher.handleServerAction({\n type: ActionTypes.LOAD_SPARKLINES_FAILED,\n error,\n })\n }\n}\n\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\n\nconst actions = {\n setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\n if (!node) {\n AppDispatcher.handleViewAction({\n type: ActionTypes.RESET_SPARKLINE_DATA,\n })\n }\n\n AppDispatcher.handleViewAction({\n type: ActionTypes.SET_HOVERED_NODE,\n node,\n mapNodeId,\n })\n },\n\n // loadSparklineData(tickers: string[], mapType: MapTypeId) {\n // if (tickers.length > 0) {\n // debouncedLoadSparklines(tickers, mapType)\n // }\n // },\n\n // loadSparklinesCancel() {\n // _lastSparklinesRequest?.cancel?.()\n // },\n\n // resetSparklineData() {\n // AppDispatcher.handleViewAction({\n // type: ActionTypes.RESET_SPARKLINE_DATA,\n // })\n // },\n\n changeTranslate(treemap: Treemap, tx: number, ty: number) {\n treemap.zoom.translate([tx, ty])\n AppDispatcher.handleViewAction({\n type: ActionTypes.CHANGE_TRANSLATE,\n })\n },\n\n zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\n if (direction > 0) {\n const zoomLevel = treemap.getNextZoomLevel()\n if (zoomLevel !== treemap.zoom.scale()) {\n zoomIn(treemap, zoomLevel, offsetX, offsetY)\n }\n } else {\n const zoomLevel = treemap.getPreviousZoomLevel()\n if (zoomLevel !== treemap.zoom.scale()) {\n zoomOut(treemap, zoomLevel, offsetX, offsetY)\n }\n }\n },\n\n render() {\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\n },\n\n zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\n treemap.zoom.scale(1, { x: tx, y: ty })\n treemap.zoom.scale(scale, { x: tx, y: ty })\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\n },\n\n updateLayout(\n treemap: Treemap,\n props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\n ) {\n treemap.updateData(props)\n treemap.zoom.updateDimensions(props)\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\n\n // Update hovered node if any\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\n if (hoveredNode) {\n AppDispatcher.handleViewAction({\n type: ActionTypes.SET_HOVERED_NODE,\n node: treemap.nodes.find((node) => node.name === hoveredNode.name),\n mapNodeId: treemap.mapNodeId,\n })\n // updateVisibleSparklines(treemap)\n }\n },\n\n updatePerfData(treemap?: Treemap, data?: PerfData) {\n if (!treemap || !data) return\n\n treemap.updatePerf(data)\n AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\n\n updateVisibleSparklines(treemap)\n },\n\n _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\n AppDispatcher.handleViewAction({\n type: ActionTypes.SET_PUBLISH_CANVAS,\n getPublishCanvas,\n })\n },\n\n setupWidget() {\n AppDispatcher.handleViewAction({\n type: ActionTypes.SET_WIDGET,\n isWidget: true,\n })\n },\n}\n\nexport default actions\n","import { Dispatcher } from 'flux'\n\nimport { PayloadSources } from './constants'\n\nclass AppDispatcher extends Dispatcher {\n handleServerAction(action: any) {\n var payload = {\n source: PayloadSources.SERVER_ACTION,\n action: action,\n }\n //console.log(action, payload);\n this.dispatch(payload)\n }\n\n handleViewAction(action: any) {\n var payload = {\n source: PayloadSources.VIEW_ACTION,\n action: action,\n }\n //console.log(action, payload);\n this.dispatch(payload)\n }\n}\n\nconst dispatcher = new AppDispatcher()\nexport default dispatcher\n","import keyMirror from 'keymirror'\n\nconst ActionTypes = keyMirror({\n RENDER_TREEMAP: null,\n CHANGE_TRANSLATE: null,\n SET_HOVERED_NODE: null,\n\n LOAD_SPARKLINES_STARTED: null,\n LOAD_SPARKLINES_COMPLETED: null,\n LOAD_SPARKLINES_FAILED: null,\n RESET_SPARKLINE_DATA: null,\n\n INIT_STARTED: null,\n INIT_FAILED: null,\n\n UPDATE_DATA: null,\n\n SET_PUBLISH_CANVAS: null,\n\n SET_WIDGET: null,\n})\n\nconst PayloadSources = keyMirror({\n SERVER_ACTION: null,\n VIEW_ACTION: null,\n})\n\nexport { ActionTypes, PayloadSources }\n","import { EventEmitter } from 'events'\n\nclass Store extends EventEmitter {\n static CHANGE_EVENT = 'change'\n\n emitChange() {\n this.emit(Store.CHANGE_EVENT)\n }\n\n addChangeListener(callback: (...args: any[]) => void) {\n this.on(Store.CHANGE_EVENT, callback)\n }\n\n removeChangeListener(callback: (...args: any[]) => void) {\n this.removeListener(Store.CHANGE_EVENT, callback)\n }\n}\n\nexport default Store\n","import { MapDataNode } from '../types'\nimport AppDispatcher from './app-dispatcher'\nimport { ActionTypes } from './constants'\nimport Store from './store'\n\nlet _hoveredNode: MapDataNode\nlet _mapNodeId: string\nlet _sparklinesData: Record = {}\nlet _dataVersion: number\nlet _isWidget = false\nlet _getPublishCanvas: () => HTMLCanvasElement\n\nclass MapStore extends Store {\n getHoveredNode(mapNodeId: string) {\n if (mapNodeId === _mapNodeId) return _hoveredNode\n return undefined\n }\n\n getSparklines() {\n return _sparklinesData\n }\n\n getDataVersion() {\n return _dataVersion\n }\n\n isWidget() {\n return _isWidget\n }\n\n getPublishCanvas() {\n return _getPublishCanvas()\n }\n}\n\nvar mapStore = new MapStore()\n\n// @ts-ignore\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\n var action = payload.action\n\n switch (action.type) {\n case ActionTypes.RENDER_TREEMAP:\n mapStore.emitChange()\n break\n\n case ActionTypes.SET_HOVERED_NODE:\n if (action.node !== _hoveredNode) {\n _hoveredNode = action.node\n _mapNodeId = action.mapNodeId\n mapStore.emitChange()\n }\n break\n\n case ActionTypes.CHANGE_TRANSLATE:\n // @ts-ignore\n _hoveredNode = undefined\n mapStore.emitChange()\n break\n\n case ActionTypes.LOAD_SPARKLINES_STARTED:\n mapStore.emitChange()\n break\n\n case ActionTypes.LOAD_SPARKLINES_COMPLETED:\n _sparklinesData = { ..._sparklinesData, ...action.data }\n mapStore.emitChange()\n break\n\n case ActionTypes.RESET_SPARKLINE_DATA:\n case ActionTypes.LOAD_SPARKLINES_FAILED:\n _sparklinesData = {}\n mapStore.emitChange()\n break\n\n case ActionTypes.UPDATE_DATA:\n _dataVersion = action.version\n mapStore.emitChange()\n break\n\n case ActionTypes.SET_PUBLISH_CANVAS:\n _getPublishCanvas = action.getPublishCanvas\n mapStore.emitChange()\n break\n\n case ActionTypes.SET_WIDGET:\n _isWidget = action.isWidget\n mapStore.emitChange()\n break\n }\n})\n\nexport default mapStore\n","import { ReactNode } from 'react'\n\nexport enum MapTypeId {\n Sector = 'sec',\n World = 'geo',\n SectorFull = 'sec_all',\n ETF = 'etf',\n Screener = 'screener',\n Portfolio = 'portfolio',\n ETFHoldings = 'etf_holdings',\n}\n\nexport enum MapSubtypeId {\n IntradayPerf1m = 'i1',\n IntradayPerf2m = 'i2',\n IntradayPerf3m = 'i3',\n IntradayPerf5m = 'i5',\n IntradayPerf10m = 'i10',\n IntradayPerf15m = 'i15',\n IntradayPerf30m = 'i30',\n IntradayPerf1h = 'h',\n IntradayPerf2h = '2h',\n IntradayPerf4h = '4h',\n IntradayPerfAH = 'ah',\n DayPerf = 'd1',\n WeekPerf = 'w1',\n MonthPerf = 'w4',\n ThreeMonthPerf = 'w13',\n SixMonthPerf = 'w26',\n YearPerf = 'w52',\n YearToDatePerf = 'ytd',\n RelativeVolume = 'relvol',\n PriceToEarnings = 'pe',\n ForwardPriceToEearnings = 'fpe',\n PriceEarningsToGrowth = 'peg',\n PriceToSellsRatio = 'ps',\n PriceToBookRatio = 'pb',\n DividendYield = 'div',\n EPSGrowth5y = 'eps5y',\n FloatShort = 'short',\n AnalystRecommendation = 'rec',\n EarningsPerf = 'earnperf',\n EarningsDate = 'earndate',\n // Portfolio\n PortfolioGainPct = 'portfolioGainPct',\n PortfolioGainUsd = 'portfolioGainUsd',\n PortfolioChangePct = 'portfolioChangePct',\n PortfolioChangeUsd = 'portfolioChangeUsd',\n}\n\nexport enum ScaleId {\n IntradayReduced = 'intradayReduced',\n DayPerf = 'default',\n WeekPerf = '_5',\n MonthPerf = '_10',\n ThreeMonthPerf = '_15',\n SixMonthPerf = '_20',\n YearPerf = '_25',\n RelativeVolume = '_relvol',\n PriceToEarnings = '_pe',\n ForwardPriceToEearnings = '_fpe',\n PriceEarningsToGrowth = '_peg',\n PriceToSellsRatio = '_ps',\n PriceToBookRatio = '_pb',\n DividendYield = '_div',\n EPSGrowth5y = '_eps5y',\n FloatShort = '_short',\n AnalystRecommendation = '_rec',\n EarningsDate = '_earndate',\n // Portfolio\n PortfolioPct = '_portfolioPct',\n PortfolioUsd = '_portfolioUsd',\n}\n\nexport const enum NodeDepth {\n Root,\n Sector,\n Industry,\n Node,\n}\n\nexport interface MapDataRow {\n name: string\n perf?: number\n changePercentage?: number\n x: number\n y: number\n dx: number\n dy: number\n data: any\n depth: NodeDepth\n}\n\nexport interface MapDataRoot {\n name: string\n children: MapDataSector[]\n duplicateTickers: number\n hash: string\n}\n\nexport interface MapDataSector extends MapDataRow {\n children: MapDataIndustry[]\n parent: MapDataRoot\n}\n\nexport interface MapDataIndustry extends MapDataRow {\n children: MapDataNode[]\n parent: MapDataSector\n}\n\nexport interface MapDataNode extends MapDataRow {\n parent: MapDataIndustry\n additional?: string\n description: string\n perfText: string\n value: number\n}\n\nexport interface MapData {\n sectors: MapDataSector[]\n industries: MapDataIndustry[]\n nodes: MapDataNode[]\n}\n\nexport type PerfData = {\n nodes: Record | Array\n valueNodes: Record | Array\n currentPriceNodes: Record | Array\n additional: Record\n subtype: MapSubtypeId\n version?: number\n hash: string\n}\n\nexport interface MapSubtype {\n value: MapSubtypeId\n label: string\n scaleId: ScaleId\n tooltip: string\n countIndustryPerf: boolean\n countSectorPerf: boolean\n}\n\nexport interface MapType {\n name: string\n pageTitle: string\n nameShort?: string\n description: string\n type: MapTypeId\n subtypes: Array<{ items: MapSubtype[] }>\n}\n\nexport interface Scale {\n name: string\n tooltip: ReactNode\n id: ScaleId\n}\n\nexport enum PortfolioSymbolType {\n Stock = 'stock',\n Cash = 'cash',\n}\n\nexport type StockData = {\n symbol: string;\n description: string;\n name: string;\n marketCap: number;\n price: number;\n previousClose: number;\n sector: string;\n industry: string;\n};\n\nexport type StockChild = {\n name: string;\n description: string;\n price: number;\n previousClose: number;\n value: number;\n};\n\nexport type IndustryGroup = {\n name: string;\n children: StockChild[];\n};\n\nexport type SectorGroup = {\n name: string;\n children: IndustryGroup[];\n};","export enum ScreenerQuery {\n View = 'v',\n Signal = 's',\n Order = 'o',\n Tickers = 't',\n Filters = 'f',\n FilterTab = 'ft',\n MapSubtype = 'st',\n}\n\nexport enum ScreenerFilter {\n MarketCap = 'cap',\n Index = 'idx',\n Sector = 'sec',\n Industry = 'ind',\n AverageVolume = 'sh_avgvol',\n}\n\nexport enum ScreenerAddtionalQuery {\n ShowEtf = 'show_etf',\n}\n\nexport enum ScreenerView {\n Overview = 11,\n Maps = 71,\n Bubbles = 72,\n}\n\nexport function eventListenerRegister(el: HTMLElement, eventName: string, handler: (...args: any[]) => any) {\n el.addEventListener(eventName, handler)\n\n return () => {\n el.removeEventListener(eventName, handler)\n }\n}\n\nexport function textContent(el: HTMLElement) {\n return el.textContent || el.innerText\n}\n\nexport function ScreenerGetOptionsList(select: HTMLSelectElement) {\n const options = select.getAttribute('data-selected')?.split('|') ?? [],\n result = []\n for (var i = 0, len = options.length; i < len; i++) {\n var option = options[i]\n for (var j = 0; j < select.children.length; j++) {\n var optionEl = select.children[j] as HTMLOptionElement\n if (optionEl.value === option) {\n result.push({\n key: option,\n value: textContent(optionEl),\n })\n }\n }\n }\n return result\n}\n\nexport function ScreenerRenderCustomModal(select: any) {\n const filter = select.getAttribute('data-filter')\n const customWrapper = document.getElementById('fsm_' + filter) as HTMLElement\n if (customWrapper) {\n select.style.display = 'none'\n customWrapper.style.display = 'block'\n const input = document.getElementById('fsmi_' + filter) as HTMLInputElement\n const options = ScreenerGetOptionsList(select)\n const arr = []\n for (let i = 0, len = options.length; i < len; i++) {\n arr.push(options[i].value)\n }\n input.value = arr.join(', ')\n }\n}\n\nconst DATE_REGEX = /^[0-9]{2}[-][0-9]{2}[-][0-9]{4}/\n\nexport function getIsOptionDateRange(option: string) {\n if (!option.includes('x')) return false\n\n const [from, to] = option.split('x')\n const [isValidFromDate, isValidToDate] = [from, to].map((value) => {\n if (DATE_REGEX.test(value)) {\n return !Number.isNaN(new Date(value.replace(/-/g, '/')).getTime())\n }\n return false\n })\n\n return isValidFromDate || isValidToDate\n}\n\nexport function getInitialDateFromSelectedValues(selectedValues: string[]) {\n const initialDate = selectedValues.find(getIsOptionDateRange)\n\n if (initialDate) {\n return initialDate.split('x').map((date) => (DATE_REGEX.test(date) ? date.replace(/-/g, '/') : undefined))\n }\n}\n\nexport function dateRangeToFilterString({ from, to }: { from?: string; to?: string }) {\n return from || to ? `${from ?? ''}x${to ?? ''}`.replace(/\\//g, '-') : null\n}\n\n/**\n * Creates link for given view & subview and ignores any additional query params\n */\nexport function getQueryForView(view?: ScreenerView, allowedParams: string[] = [], baseQuery = window.location.search) {\n const query = new URLSearchParams(baseQuery)\n const allowList = [...allowedParams, ...Object.values(ScreenerQuery)]\n\n /**\n * Seems like `query` is a live property, so we can’t use `query.forEach` to delete,\n * so we need to copy keys before looping.\n * https://stackoverflow.com/questions/60522437\n */\n const keys = Array.from(query.keys())\n\n keys.forEach((key) => {\n if (!allowList.includes(key)) {\n query.delete(key)\n }\n })\n\n const [, originalView, settings = 0] = query.get(ScreenerQuery.View)?.match(/(\\d{2})(\\d)/) ?? []\n\n if (view ?? originalView) {\n query.set(ScreenerQuery.View, `${view ?? originalView}${settings}`)\n }\n\n return query\n}\n\n/**\n * Parse screener `f` query param to object\n */\nexport function parseScreenerFilters(baseQuery = window.location.search) {\n const query = new URLSearchParams(baseQuery)\n const filtersString = query.get(ScreenerQuery.Filters)\n\n if (!filtersString) return {}\n\n return Object.fromEntries(\n filtersString.split(',').map((f) => {\n const lastUnderscore = f.lastIndexOf('_')\n const key = f.substring(0, lastUnderscore)\n const value = f.substring(lastUnderscore + 1)\n return [key, value.split('|')]\n })\n )\n}\n\n/**\n * Stringify screener `f` query param\n */\nexport function stringifyScreenerFilters(filters: Record) {\n return Object.entries(filters)\n .filter(([, value]) => String(value).length > 0)\n .map(([key, value]) => `${key}_${value.join('|')}`)\n .join(',')\n}\n\nexport function rangesToFilter(\n ranges: {\n from: string\n to: string\n }[],\n rangeSuffixes?: string[],\n delimiter = 'x',\n rangeDelimiter = 'to'\n) {\n return ranges.reduce((filter, range, index) => {\n const { from, to } = range\n const rangeStr = from || to ? `${from}${rangeDelimiter}${to}${rangeSuffixes?.[index] ?? ''}` : ''\n\n let currentFilter = filter\n if (index > 0) currentFilter += delimiter\n return currentFilter + rangeStr\n }, '')\n}\n","import * as React from 'react'\n\nimport { ScreenerQuery, ScreenerView } from './screener/utils'\nimport { isMobile } from './shared/isMobile'\nimport { isStockFastRefreshAvailable } from './shared/isStockFastRefreshAvailable'\nimport { EXPANDED_MAP_BODY_CLASSS } from './constants/constants'\nimport { LEGEND_HEIGHT, MAP_MIN_HEIGHT, MAP_MIN_WIDTH } from './constants/generator'\nimport { Settings, SettingsSmall, SettingsSmallGeo } from './constants/settings'\nimport LayoutGenerator from './layout-generator'\nimport type Treemap from './treemap'\nimport {\n MapDataIndustry,\n MapDataNode,\n MapDataRoot,\n MapDataRow,\n MapDataSector,\n MapSubtypeId,\n MapTypeId,\n PerfData,\n PortfolioSymbolType,\n SectorGroup,\n StockData,\n} from './types'\nimport { isMarketOpen } from './header/utils'\n\nexport function getOffset(e: MouseEvent | React.MouseEvent) {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n\n return {\n offsetX: e.clientX - rect.left,\n offsetY: e.clientY - rect.top,\n }\n}\n\nexport function getIsSmall() {\n const query = new URLSearchParams(window.location.search)\n return query.get('settings') === 'small'\n}\n\nexport function getSettingsForMapType(type: MapTypeId, isSmall?: boolean) {\n if (isSmall) {\n if (type === MapTypeId.World) {\n return SettingsSmallGeo\n }\n return SettingsSmall\n }\n\n return Settings\n}\n\ntype DataRow = MapDataRow | MapDataRoot\n/**\n * We strip parents when serializing data for precomputed JSONs\n * but we need to restore them so that we can get them in treemap\n */\nexport function restoreDataKeys(\n data: T[],\n perfData: PerfData,\n parent?: any\n): T[] {\n\n return data.map((row) => {\n const newRow = {\n ...row,\n parent,\n value: (perfData.valueNodes as Record)[row.name],\n price: (perfData.currentPriceNodes as Record)[row.name],\n perf: (perfData.nodes as Record)[row.name],\n additional: perfData.additional[row.name],\n }\n\n newRow.children = row.children ? restoreDataKeys(row.children, perfData, newRow) : undefined\n\n return newRow\n })\n}\n\nexport function splitData(mapData: MapDataRoot) {\n let sectors: MapDataSector[] = []\n let industries: MapDataIndustry[] = []\n let nodes: MapDataNode[] = []\n\n mapData.children?.forEach((sector) => {\n sectors.push(sector)\n sector.children?.forEach((industry) => {\n industries.push(industry)\n industry.children?.forEach((company) => {\n if (!(company.dx < 1 || company.dy < 1)) {\n nodes.push(company)\n }\n })\n })\n })\n\n return { sectors, industries, nodes }\n}\n\nexport function getMapData(mapData: MapDataRoot, perfData: PerfData) {\n const [data] = restoreDataKeys([mapData], perfData)\n\n return splitData(data)\n}\nexport const formatMarketValue = (value: number) => {\n if (value >= 1e12) return `$${(value / 1e12).toFixed(1)}T`\n if (value >= 1e9) return `$${(value / 1e9).toFixed(1)}B`\n if (value >= 1e6) return `$${(value / 1e6).toFixed(1)}M`\n if (value >= 1e3) return `$${(value / 1e3).toFixed(1)}K`\n return `$${value}`\n}\n\n\nexport function getIndexMapData() {\n return import('./assets/base_data/sec.js' /* webpackChunkName: \"map_base_index\" */)\n}\n\nexport function getMapBaseData(mapType: MapTypeId) {\n \n // return {\n // \"name\": \"Root\",\n // \"children\": groupBySectorAndIndustry(stockArray)\n // }\n\n switch (mapType) {\n case MapTypeId.World:\n return import('./assets/base_data/sec.js' /* webpackChunkName: \"map_base_geo\" */)\n case MapTypeId.SectorFull:\n return import('./assets/base_data/sec.js' /* webpackChunkName: \"map_base_sec_all\" */)\n case MapTypeId.ETF:\n return import('./assets/base_data/sec.js' /* webpackChunkName: \"map_base_etf\" */)\n default:\n return import('./assets/base_data/sec.js' /* webpackChunkName: \"map_base_sec\" */)\n }\n}\nconst groupBySectorAndIndustry = (data: StockData[]): SectorGroup[] => {\n const grouped = data.reduce((acc: Record, stock) => {\n if (!stock.sector || !stock.industry) {\n return acc;\n }\n if (!acc[stock.sector]) {\n acc[stock.sector] = {\n name: stock.sector,\n children: [],\n };\n }\n\n let industryGroup = acc[stock.sector].children.find(\n (industry) => industry.name === stock.industry\n );\n\n if (!industryGroup) {\n industryGroup = {\n name: stock.industry,\n children: [],\n };\n acc[stock.sector].children.push(industryGroup);\n }\n\n industryGroup.children.push({\n name: stock.symbol,\n description: stock.name,\n value: stock.marketCap,\n previousClose: stock.previousClose,\n price: stock.price,\n });\n\n return acc;\n }, {});\n\n return Object.values(grouped);\n};\n\nfunction getSizeForExpandedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\n wrapper?.style.removeProperty('max-width')\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall, element.clientHeight)\n const elementHeight = Math.max(window.innerHeight - LEGEND_HEIGHT - 50, MAP_MIN_HEIGHT)\n\n // We don’t want the map to overflow the height\n if (size.height > elementHeight) {\n // const newWidth = LayoutGenerator.calculateWidth(elementHeight, type, isSmall)\n // const newHeight = LayoutGenerator.calculateHeight(newWidth, type, isSmall)\n\n size = {\n width: element.clientWidth,\n height: element.clientHeight - 27,\n }\n }\n\n if (wrapper) {\n wrapper.style.maxWidth = `${size.width}px`\n }\n\n return size\n}\n\nfunction getRatioSizeForWidth(width: number, type: MapTypeId, isSmall: boolean, height: number = 0) {\n const mapWidth = Math.max(width, MAP_MIN_WIDTH)\n const mapHeight = Math.max(height, MAP_MIN_HEIGHT)\n return {\n width: mapWidth,\n height: mapHeight,\n // height: LayoutGenerator.calculateHeight(mapWidth, type, isSmall),\n }\n}\n\nfunction getSizeRatioBasedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\n // Remove maxWidth if exiting expanded mode\n if (wrapper?.style.maxWidth) {\n wrapper.style.removeProperty('max-width')\n }\n\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall, element.clientHeight - 27)\n\n // Set height so that we know if scrollbars are visible\n element.style.height = `${size.height + LEGEND_HEIGHT}px`\n\n // Add a bit of padding if scrollbar is visible and map touches it\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n const isMediumScreen =\n window.innerWidth > 1430 &&\n window.innerWidth < 1450 &&\n !document.body.classList.contains('is-screener') &&\n !document.body.classList.contains('is-portfolio')\n if (isMediumScreen && scrollbarWidth > 0) {\n size = getRatioSizeForWidth(element.clientWidth - 10, type, isSmall, element.clientHeight - 30)\n\n // This means we would display a horizontal scrollbar, which we don’t want\n } else if (size.width !== element.clientWidth) {\n size = getRatioSizeForWidth(element.clientWidth, type, isSmall, element.clientHeight - 30)\n }\n\n element.style.removeProperty('height')\n\n return size\n}\n\n/**\n * Calculate size of the treemap based on w/h ratio and scrollbars visibility\n */\nexport function getSize(element: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\n const canvasWrapper = document.getElementById('canvas-wrapper')\n\n if (!element) {\n return { width: 1, height: 1 }\n }\n\n // Custom width using query param\n const query = new URLSearchParams(window.location.search)\n if (query.has('width')) {\n const width = Number(query.get('width'))\n const parsedRatio = query.has('ratio') ? parseFloat(query.get('ratio')!) : undefined\n const ratio = Number.isFinite(parsedRatio) ? parsedRatio : undefined\n return {\n width,\n height: LayoutGenerator.calculateHeight(width, type, isSmall, ratio),\n }\n }\n\n // Expanded map\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\n return getSizeForExpandedMap(element, canvasWrapper, type, isSmall)\n }\n\n if (type === MapTypeId.ETFHoldings) {\n return { height: element.clientHeight, width: element.clientWidth }\n }\n return getSizeRatioBasedMap(element, canvasWrapper, type, isSmall)\n}\n\n/**\n * Get treemap zoom levels based on env\n */\nexport function getDefaultZoomLevels() {\n if (isMobile()) {\n return [1, 1.5]\n }\n\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n return [1, 1.5, 2.25]\n }\n\n return [1, 1.5, 2.25, 3]\n}\n\nexport function parseInitDataAsPerf(data?: MapDataRoot): PerfData | undefined {\n if (!data) return\n\n const nodes: Record = {}\n const additional: Record = {}\n\n for (const sector of data.children) {\n for (const industry of sector.children) {\n for (const node of industry.children) {\n if (node.perf !== undefined) {\n nodes[node.name] = node.perf\n }\n if (node.additional !== undefined) {\n additional[node.name] = node.additional\n }\n }\n }\n }\n\n return {\n nodes,\n currentPriceNodes: {},\n valueNodes: {},\n additional,\n subtype: MapSubtypeId.DayPerf,\n version: 1,\n hash: data.hash,\n }\n}\n\nconst MAX_SPARKLINES = 120\nconst HOVER_TOP_ROW_HEIGHT = 100\nconst HOVER_BORDER_WIDTH = 4\nconst ROW_HEIGHT = 30\nconst ROW_HEIGHT_SMALL = 24\nconst ROW_HEIGHT_BREAKPOINT = 15\n\nexport function getVisibleTooltipNodes(node?: MapDataNode | null) {\n if (!node) return []\n\n const industryTickers = node.parent.children\n const isSmall = industryTickers.length > ROW_HEIGHT_BREAKPOINT\n const rowHeight = isSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT\n const visibleRows = Math.floor((window.innerHeight - HOVER_TOP_ROW_HEIGHT - 2 * HOVER_BORDER_WIDTH) / rowHeight)\n const visibleChildren = industryTickers\n .slice()\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\n .slice(0, Math.min(visibleRows, MAX_SPARKLINES))\n\n return visibleChildren\n}\n\nexport function onNodeClick({\n treemap,\n node,\n industry,\n sector,\n}: {\n treemap: Treemap\n node?: MapDataNode\n industry?: MapDataIndustry\n sector?: MapDataSector\n}) {\n if (node) {\n window.open(`/tickers/${node.name}/details`)\n return\n }\n\n const query = new URLSearchParams()\n query.set(ScreenerQuery.View, ScreenerView.Overview.toString())\n\n // Use ticker filter for ETFs\n if (treemap.type === MapTypeId.ETF) {\n let tickers: string[] = []\n if (industry) {\n tickers = industry.children.map((node) => node.name)\n } else if (sector) {\n tickers = sector.children.flatMap((industry) => industry.children.map((node) => node.name))\n }\n\n if (tickers.length) {\n query.set(ScreenerQuery.Tickers, tickers.join(','))\n window.open(`/tickers`)\n }\n\n return\n }\n\n if (industry) {\n const id = industry.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\n const filter = treemap.type === MapTypeId.World ? 'geo' : 'ind'\n\n query.set(ScreenerQuery.Filters, `${filter}_${id}`)\n window.open(`/tickers`)\n } else if (sector) {\n const id = sector.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\n\n query.set(ScreenerQuery.Filters, `sec_${id}`)\n window.open(`/tickers`)\n }\n}\n\nenum MapsPollingIntervalInMs {\n Free = 9000000,\n EliteStocksReduced = 120000,\n Elite = 60000,\n}\n\nexport function getMapsRefreshInterval({\n base = MapsPollingIntervalInMs.Elite,\n reduced = MapsPollingIntervalInMs.EliteStocksReduced,\n free = MapsPollingIntervalInMs.Free,\n}: { base?: number; reduced?: number; free?: number } = {}) {\n if (!isMarketOpen()) {\n return 0\n }\n const isPremium = true\n let customRefreshInterval = 900000\n // if (!isPremium) {\n // customRefreshInterval = free\n // } else if (!isStockFastRefreshAvailable()) {\n // customRefreshInterval = reduced\n // }\n\n return customRefreshInterval\n}\nexport function randomUUID() {\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\n const c = Number(substring)\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\n })\n}\n\nexport function getUuid() {\n return window.crypto?.randomUUID?.() ?? randomUUID()\n}\nexport function getSymbolType(symbol?: string) {\n if (symbol?.toUpperCase() === '$CASH') return PortfolioSymbolType.Cash\n\n return PortfolioSymbolType.Stock\n}"],"names":["module","exports","white","black","inherit","transparent","current","customApp","blue","gray","red","orange","amber","tangerine","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","Loading","_jsx","className","children","src","Loader","redGreenGradient","colors","nullColor","greenRedGradient","slice","reverse","redGradient","greenGradient","redGreenGradientBubbles","gradients","ScaleId","IntradayReduced","DayPerf","_5","_10","_15","_20","_25","_relvol","_pe","_fpe","_peg","_ps","_pb","_div","_eps5y","_short","_rec","_earndate","_portfolioPct","_portfolioUsd","gradientSmall","fontSizesWidths","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","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","Zoom","constructor","dimensions","zoomLevels","zoomElement","document","createElement","zoomSelection","d3","this","behavior","translateExtent","updateDimensions","width","height","extent","getTransform","scale","newZoom","mapCenter","Number","isFinite","call","scaleTo","translate","args","Array","isArray","translateBy","translateAbs","_ref","translateTo","scaleExtent","length","on","getNearestSize","currentZoom","arguments","undefined","nearestSize","len","level","fontFamily","_props$mapNodeId","countIndustryPerf","countSectorPerf","subtype","MapSubtypeId","isSmall","mapUtils","truncateNodeName","props","version","nodes","sectors","industries","zoom","colorScale","settings","type","dataHash","mapNodeId","data","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","getIsSmall","updateData","getScaleMinMax","id","PortfolioPct","PortfolioUsd","minValuePerf","Math","abs","node","_node$data$perfWeek","_node$data","perfWeek","maxValuePerf","_node$data$perfWeek2","_node$data2","perfMax","max","minValueNode","perf","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","linearScale","domain","range","min","value","round","getParentSector","parent","name","updatePerf","hash","nodeName","parentSector","updatedNode","find","_node$data3","sector","additional","_resetIndustryPerf","industry","weightedPriceSum","marketCapSum","stock","marketCap","everyStockUndefined","dx","dy","_getNodeTopOffset","MapTypeId","World","isSmallSecMap","Sector","leftPadding","padding","left","topPadding","top","header","isFirstNodeInIndustry","showIndustryHeader","LayoutGenerator","isNodeHeaderVisible","getNodeText","_node$additional","_this$settings$fontSi","_this$settings$fontSi2","fontSizes","scaleFontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","getLongestText","fontSizePadding","nodeNameLineHeight","stepFormat","scaleStepFormat","format","perfText","getSymbolType","PortfolioSymbolType","Cash","formatValue","toFixed","fontPairs","fontSizePairs","filter","allowedSize","includes","perfFontSize","perfLineHeight","textHeight","topOffset","fontSize","text","maxWidth","widths","_widths$text$i","substring","getZoomLevels","getNextZoomLevel","actualZoomLevel","getPreviousZoomLevel","getLastZoomLevel","_stepFormat$replace","_stepFormat","floatValue","parseFloat","absValue","replace","isPositiveScaleOnly","formated","concat","renderStockNode","context","fillStyle","fillRect","nodeText","save","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","offset","font","fillText","restore","getSpacingWithDefaults","spacing","_spacing$top","_spacing$right","_spacing$bottom","_spacing$left","right","bottom","renderIndustryHeader","_ref2","_config$height","_config$border","config","fill","parrentPadding","margin","strokeStyle","border","background","beginPath","moveTo","lineTo","stroke","renderNodeText","_ref3","color","fontWeight","toUpperCase","getNodeAtPosition","tx","ty","getSectorAtPosition","getIndustryAtPosition","formatPerf","treemap","CanvasHover","_hoveredNode$data$dat","_hoveredNode$data","_hoveredNode$data$dat2","hoveredNode","visibleNodes","setState","React","sparklineData","hoverRef","updateHoverPosition","debounce","clientX","clientY","hoverEl","virtualEl","getBoundingClientRect","computePosition","placement","middleware","mainAxis","flip","crossAxis","shift","then","Object","assign","style","handleMouseMove","event","addEventListener","removeEventListener","handleMapStoreChange","storeHoveredNode","MapStore","getHoveredNode","getVisibleTooltipNodes","prevState","addChangeListener","removeChangeListener","mapType","price","formattedMarketValue","formatMarketValue","title","backgroundColor","_jsxs","ref","classnames","invisible","position","transition","_Fragment","nameOverride","description","colSpan","map","_c$data$data$nameOver","_c$data","_c$data$data","boxover","tooltip","scaleMin","scaleMax","steps","diff","step","push","stepWidth","indexOf","Portfolio","ETFHoldings","index","minWidth","textShadow","toString","Canvas","super","state","initialized","_canvas","_hoverCanvas","_canvasContext","_hoverContext","_cache","mouseDown","lastPanX","lastPanY","animationFrameId","worldBackground","bind","componentDidMount","_onChange","mapActionCreators","_setOnPublish","_getPublishCanvas","_initialize","componentDidUpdate","renderFromCache","renderHover","_setCanvasSize","_updateCanvasCaches","_loadTreemapGeoBackground","componentWillUnmount","_this$_hoverCanvas$cu","_onWheel","render","alt","legend","hover","classNames","onMouseDown","_onMouseDown","onMouseMove","_onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","_createCache","drawImage","canvas","offsetX","offsetY","getOffset","nodeAtPosition","industryAtPosition","MapActionCreators","setHoveredNode","_this$props$onNodeCli","_this$props","sectorAtPosition","onNodeClick","preventDefault","deltaY","_onPanStart","pointers","_onPanMove","movementX","movementY","changeTranslate","_onPinch","offsetX1","target","offsetLeft","offsetParent","offsetY1","offsetTop","direction","_setCanvasContexts","canvasContext","getContext","isFirefoxDesktop","willReadFrequently","hoverContext","retinafy","zoomOnWheel","_createCacheWithPriority","hoverCanvas","hammertime","Hammer","get","set","enable","threshold","passive","_getTreemapGeoBackground","image","Promise","resolve","reject","Image","onload","onerror","loadImage","default","oldScale","oldTranslate","cacheCanvas","cacheContext","renderCanvas","callback","window","cancelAnimationFrame","remainingLevels","requestAnimationFrame","_queueUpdateCache","scales","currentScale","_hover$border","clearRect","apply","depth","NodeDepth","Industry","industryOffset","smallIndustryPadding","lineWidth","strokeRect","_hover$background","naturalWidth","naturalHeight","isLargeNode","isGeoMap","renderBackground","_treemap$settings$sec","renderSectorBorders","_treemap$settings$sec2","defaultProps","MapContext","setTreemap","setGenerator","useMapContext","MapContextProvider","generator","Provider","Map","isLoadingData","isFetchingPerf","prevTreemap","containerRef","hasRendered","setHasRendered","size","mapSettings","Treemap","getLayout","scaleId","label","updateTimeoutRef","setTimeout","layout","updateLayout","clearTimeout","containerElement","resize","throttle","QueryClientContext","queryOptions","client","_queryOptions$default","QueryClient","defaultOptions","queries","refetchOnWindowFocus","getQueryClient","QueryClientProvider","fallback","EXPANDED_MAP_BODY_CLASSS","FALLBACK_PERF_RESPONSE","currentPriceNodes","valueNodes","MAP_SUBTYPES_INTRADAY_BY_ID","IntradayPerf1m","IntradayPerf2m","IntradayPerf3m","IntradayPerf5m","IntradayPerf10m","IntradayPerf15m","IntradayPerf30m","IntradayPerf1h","IntradayPerf2h","IntradayPerf4h","IntradayPerfAH","MAP_SUBTYPES_INTERDAY_BY_ID","WeekPerf","MonthPerf","ThreeMonthPerf","SixMonthPerf","YearPerf","YearToDatePerf","MAP_SUBTYPES_GENERAL","RelativeVolume","PriceToEarnings","ForwardPriceToEearnings","PriceEarningsToGrowth","PriceToSellsRatio","PriceToBookRatio","DividendYield","EPSGrowth5y","FloatShort","AnalystRecommendation","EarningsPerf","EarningsDate","MAP_SUBTYPES_TIMEFRAMES","items","values","MAP_SUBTYPES_COMPANIES","MAP_SUBTYPES_ETF","MAP_TYPES","pageTitle","subtypes","SectorFull","nameShort","ETF","Screener","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","Settings","tailwindColors","SettingsSmall","SettingsSmallGeo","SettingsScreener","async","mapPerf","isPremarket","preMarketData","generateRandomHash","computeValues","apiRequest","BASE_URL","method","query","st","reduce","acc","symbol","changePercentage","result","currentPrice","currentValue","random","Expand","onExpand","getElementById","body","classList","contains","fullscreenElement","exitFullscreen","remove","add","requestFullscreen","catch","err","console","error","message","scrollTo","isMobile","isIpad","onClick","FontAwesomeIcon","icon","_faExpand","SaveImage","onSaveImage","mapStore","getPublishCanvas","canvasEl","ratio","getScaleRatio","textWidth","measureText","divider","toDataURL","drawShareMap","getFormattedDateString","link","href","currentDateTime","getDate","customFilename","download","click","_faDownload","linkClassName","_mapData$perfDataQuer","_MAP_TYPES$find","_subtypes$find","URLSearchParams","typeFromQuery","subtypeFromQuery","flatMap","useMapType","mapData","mapBaseData","initialPerf","fetchPerfData","api","queryClient","useQueryClient","dataVersion","prevType","perfData","setQueryData","baseDataQuery","useQuery","queryKey","queryFn","getMapBaseData","initialData","staleTime","Infinity","perfDataQuery","getQueryData","refetchInterval","restoredData","useMapData","initData","isNewSubtype","setIsNewSubtype","isFetching","isLoadingInitialBaseData","isLoading","isLoadingInitialPerf","isInitialLoading","isFetchingNewPerf","_node$dx","_node$dy","deltaX","x1","x0","y1","y0","constants","showHeader","minSectorHeight","filterVisibleNodes","arr","_node$children","isVisible","isNodeVisible","_getPadding","Root","_getHierarchySort","order","heightB","hasOwnProperty","_getHierarchy","sum","sort","_getTreemap","paddingFn","tile","paddingTop","paddingRight","paddingBottom","paddingLeft","getLayoutData","_this$layout","_generateSP500","descendants","forEach","_transformNode","_generateLayout","recountSectors","treemapHeight","calculateHeight","hierarchy","recalculateHeight","industryCount","_LayoutGenerator","smallIndustryGeoPadding","getSizeRatio","calculateWidth","ContentType","ThrowableError","Error","status","extra","isServerError","url","_ContentType","headers","options","throwOnAllErrors","controller","AbortController","requestUrl","requestOptions","ApplicationJson","localStorage","getItem","localStorageKey","token","cancelableRequest","fetch","signal","textResponse","response","responseContentType","Html","parsedResponse","contentType","ApplicationJsonUTF","FormUrlEncoded","JSON","parse","parseResponseForContentType","ok","statusText","rayId","Sentry","scope","setContext","cancel","abort","aborted","matchesAndroid","navigator","userAgent","match","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","matchesFirefox","isMobileDevice","test","_window$devicePixelRa","devicePixelRatio","_targetScale","_lastSparklinesRequest","debouncedLoadSparklines","tickers","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","join","handleServerAction","LOAD_SPARKLINES_COMPLETED","LOAD_SPARKLINES_FAILED","trailing","RESET_SPARKLINE_DATA","SET_HOVERED_NODE","CHANGE_TRANSLATE","zoomLevel","animate","RENDER_TREEMAP","zoomIn","zoomOut","zoomAndTranslate","updatePerfData","UPDATE_DATA","tickersToLoad","updateVisibleSparklines","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","isWidget","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","getSparklines","getDataVersion","dispatchToken","register","ScreenerQuery","ScreenerView","rect","currentTarget","location","search","getSettingsForMapType","restoreDataKeys","row","newRow","getRatioSizeForWidth","getSize","element","canvasWrapper","has","parsedRatio","wrapper","removeProperty","clientWidth","clientHeight","elementHeight","innerHeight","getSizeForExpandedMap","scrollbarWidth","innerWidth","documentElement","getSizeRatioBasedMap","getDefaultZoomLevels","parseInitDataAsPerf","MAX_SPARKLINES","HOVER_TOP_ROW_HEIGHT","HOVER_BORDER_WIDTH","ROW_HEIGHT","ROW_HEIGHT_SMALL","ROW_HEIGHT_BREAKPOINT","industryTickers","rowHeight","visibleRows","open","View","Overview","Tickers","toLowerCase","Filters","MapsPollingIntervalInMs","getMapsRefreshInterval","base","Elite","reduced","EliteStocksReduced","free","Free","isMarketOpen","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","Stock"],"sourceRoot":""}