{"version":3,"file":"743.bundle.58a76ef98d0f4120f602.js","mappings":"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GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,GAAI,EAAG,EAAG,KACX,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,EAAG,EAAG,KACZ,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,OAGpBC,IAAK,CACHH,KAAM,MACNI,UAAW,IACXF,OAAQ,CACN,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,GAAI,EAAG,KACX,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,GAAI,GAAI,KACZ,CAAC,EAAG,IAAK,GAAI,KACb,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,EAAG,IAAK,IAAK,KACd,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,IAAK,IAAK,KACf,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,OAGpBG,aAAc,CACZL,KAAM,iBACNI,UAAW,IACXF,OAAQ,CACN,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,GAAI,KACX,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,EAAG,EAAG,IAAK,KACZ,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,GAAI,EAAG,IAAK,KACb,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,EAAG,IAAK,KACd,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,IAAK,KACf,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,GAAI,KACd,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,OAGpBI,UAAW,CACTN,KAAM,cACNI,UAAW,IACXF,OAAQ,CACN,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,EAAG,EAAG,EAAG,KACV,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,EAAG,GAAI,KACZ,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,GAAI,GAAI,IAAK,KACd,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,IAAK,IAAK,IAAK,KAChB,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,GAAI,GAAI,KACb,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,GAAI,IAAK,GAAI,KACd,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,GAAI,KACf,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,IAAK,EAAG,KACd,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,EAAG,KACb,CAAC,IAAK,GAAI,E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AAU,MACVC,MAAO,IACPC,QAAS,MACTC,cACE,yIACFC,QAAS,MACTC,cAAe,KAEjB,CACEjD,KAAM,mBACNyC,gBAAiB,cACjBC,cAAe,IACfC,cACE,qEACFC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,0IACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,uBACNyC,gBAAiB,cACjBC,cAAe,IACfC,cACE,+EACFC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,4HACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,yBACNyC,gBAAiB,cACjBC,cAAe,IACfC,cACE,sGACFC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,iKACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,yBACNyC,gBAAiB,cACjBC,cAAe,KACfC,cACE,mGACFC,SAAU,MACVC,MAAO,IACPC,QAAS,MACTC,cACE,yKACFC,QAAS,MACTC,cAAe,KAEjB,CACEjD,KAAM,yBACNyC,gBAAiB,cACjBC,cAAe,IACfC,cAAe,yCACfC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,qFACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,SACNyC,gBAAiB,uBACjBC,cAAe,IACfC,cAAe,0DACfC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,gLACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,uBACNyC,gBAAiB,cACjBC,cAAe,IACfC,cACE,wGACFC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,qJACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,UACNyC,gBAAiB,uBACjBC,cAAe,IACfC,cAAe,sDACfC,SAAU,IACVC,MAAO,IACPC,QAAS,MACTC,cACE,0IACFC,QAAS,IACTC,cAAe,KAEjB,CACEjD,KAAM,SACNyC,gBAAiB,cACjBC,cAAe,KACfC,cAAe,mCACfC,SAAU,MACVC,MAAO,IACPC,QAAS,MACTC,cAAe,oDACfC,QAAS,MACTC,cAAe,KAEjB,CACEjD,KAAM,YACNyC,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AK2sC,KAAK09D,EAAIA,EAAIC,EAAIA,EAAIm5B,EAAIA,GAErE,OADamB,EAAS5kI,KAAK8kI,KAAKD,GAAa,GAC/Bx2H,CAChB,CC1EA,SAAS02H,GACPC,EACAC,GASA,MAAO,CAAE9lI,YAHWa,KAAKyE,IAAIwgI,EAAOD,GAAO,EAGrB5lI,cAFA4lI,EAAMC,EAAO,GAAK,EAG1C,CAaA,SAASC,GACP/lI,EACAC,GAQA,MAAO,CAAEC,MAHKD,EAAe,IAAOD,EAAc,GAAK,EAGvCG,MAFFF,EAAe,IAAOD,EAAc,GAAK,EAGzD,CC3CA,MAAMgmI,GAAa,IAAIzxH,IAOvB,SAAS0xH,GAAiBva,GACxBsa,GAAW3oI,IAAIquH,EAASwa,KAAMxa,EAChC,CAOA,SAAS,GAAY3xH,GACnB,OAAOisI,GAAW7oI,IAAIpD,EACxB,CAOA,SAASosI,KACP,OAAO9lI,MAAMmY,KAAKwtH,GAAWroI,OAC/B,CCzBA,YCJA,ICEIyoI,GAAYxqI,OAAOoiB,OAAO,MDFX,CAClB,CACCkoH,KAAM,QACNG,cAAe,CACd,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,EACA,IACA,GACA,IACA,EACA,GACA,IACA,IACA,IACA,GACA,EACA,IACA,IAEDC,YAAa,CACZ,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,KAGF,CACCC,WAAY,YACZL,KAAM,eACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,aACA,cACA,cACA,GACA,KACA,KACA,KACA,EACA,cACA,eACA,gBAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,0BACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,OACA,OACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,KACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,MACA,GACA,QACA,QACA,OACA,QACA,QACA,GACA,IACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,MACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,OACA,IACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,KACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,MACA,OACA,QACA,QACA,OACA,GACA,QACA,QACA,KACA,OACA,QACA,QACA,OACA,QACA,OACA,OACA,MACA,OACA,QACA,QACA,OACA,GACA,QACA,QACA,EACA,OACA,QACA,UAGF,CACCF,WAAY,YACZL,KAAM,eACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,cACA,eACA,cACA,GACA,KACA,KACA,KACA,EACA,aACA,cACA,gBAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,0BACNM,SAAU,CACT,QACA,EACA,GAEDC,UAAW,CACV,EACA,OACA,EACA,QACA,KACA,GACA,UACA,QACA,IACA,QACA,SACA,SACA,KACA,OACA,QACA,SACA,GACA,QACA,SACA,SACA,KACA,QACA,OACA,SACA,IACA,QACA,QACA,SACA,KACA,QACA,QACA,SACA,GACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,IACA,OACA,OACA,QACA,KACA,QACA,OACA,QACA,GACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,GACA,EACA,EACA,EACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,SACA,GACA,OACA,QACA,SACA,QACA,QACA,QACA,SACA,QACA,QACA,IACA,SACA,QACA,QACA,KACA,SACA,QACA,QACA,GACA,SACA,QACA,QACA,KACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,KACA,SACA,QACA,QACA,GACA,SACA,SACA,GACA,KACA,SACA,SACA,QACA,IACA,QACA,SACA,QACA,KACA,QACA,SACA,OACA,EACA,OACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,sBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,cACA,cACA,cACA,KACA,EACA,EACA,cACA,KACA,EACA,EACA,EACA,KACA,EACA,cACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,cACA,EACA,KACA,cACA,EACA,EACA,EACA,cACA,cACA,gBAGF,CACCF,WAAY,MACZL,KAAM,eACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,GACA,EACA,EACA,cACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,uBACNM,SAAU,CACT,EACA,cACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,GACA,cACA,EACA,EACA,GACA,cACA,cACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,QACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,YACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,OACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,OACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,OACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,OACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,OACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,wBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,KACA,EACA,EACA,cACA,KACA,EACA,cACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,0BACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,KACA,cACA,EACA,EACA,KACA,EACA,cACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,mBACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,QACA,QACA,IACA,EACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,OACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,GACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,OACA,IACA,QACA,QACA,QACA,GACA,OACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,SACZG,QAAS,mBACTR,KAAM,sBACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,QACA,QACA,QACA,IACA,OACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,OACA,GACA,QACA,OACA,QACA,IACA,QACA,GACA,QACA,GACA,QACA,OACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,OACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,OACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,GACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,OACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,sBACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,QACA,EACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,GACA,GACA,QACA,IACA,QACA,QACA,QACA,GACA,OACA,QACA,QACA,IACA,OACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,GACA,IACA,QACA,QACA,OACA,EACA,QACA,OACA,UAGF,CACCF,WAAY,MACZL,KAAM,sBACNM,SAAU,CACT,cACA,cACA,eAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,sBACNM,SAAU,CACT,cACA,cACA,eAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,wBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,EACA,cACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,uBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,cACA,cACA,aACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,EACA,cACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,wBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,EACA,EACA,cACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,iBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,eACA,eACA,cACA,EACA,cACA,cACA,iBAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,CACV,EACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,KACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,qBACNM,SAAU,CACT,EACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,GACA,cACA,EACA,aACA,cACA,gBAGF,CACCF,WAAY,MACZL,KAAM,MACNO,UAAW,EACT,EACD,EACA,EACA,OACC,QACD,EACA,EACA,GACC,QACD,EACA,EACA,GACC,QACD,GACA,EACA,GACA,QACA,EACA,EACA,EACA,QACA,EACA,EACA,EACA,EACA,GACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,UACNO,UAAW,EACT,EACD,EACA,EACA,GACC,GACD,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,sBACNO,UAAW,EACT,EACD,OACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,MACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,QACA,QACA,SACC,SACD,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,OACA,OACA,SACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,OACA,QACA,QACA,SACA,OACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,oBACNO,UAAW,EACT,EACD,EACA,EACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,QACC,QACD,EACA,OACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,SACD,QACA,OACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,UACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,OACA,QACA,QACA,SACA,OACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,aACNO,UAAW,EACT,EACD,QACA,SACA,OACC,OACD,QACA,SACA,SACC,OACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,cACNO,UAAW,EACT,EACD,MACA,MACA,OACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,GACA,MACA,QAGF,CACCF,WAAY,MACZL,KAAM,aACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,QACA,SACC,OACD,SACA,QACA,SACC,QACD,SACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,OACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,SACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,KACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,QACA,GACC,QACD,EACA,QACA,EACA,QACA,EACA,KACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,OACA,OACA,EACA,QACA,OACA,QACA,EACA,EACA,MACA,QACA,EACA,EACA,MACA,QACA,EACA,EACA,MACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,qBACNO,UAAW,EACT,EACD,WACA,EACA,YACC,OACD,OACA,SACA,GACC,OACD,MACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,OACA,GACC,QACD,QACA,QACA,EACA,UACA,QACA,QACA,EACA,QACA,KACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,sBACNO,UAAW,EACT,EACD,WACA,EACA,YACC,OACD,SACA,SACA,SACC,OACD,SACA,QACA,SACC,QACD,UACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,oBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,SACA,SACA,SACC,OACD,QACA,SACA,SACC,QACD,QACA,SACA,SACC,QACD,QACA,SACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,wBACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,MACA,QACA,SACC,OACD,QACA,QACA,QACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,MACA,SACC,QACD,QACA,QACA,QACA,UACA,OACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,qBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,SACA,UACC,OACD,QACA,SACA,UACC,QACD,QACA,SACA,SACC,QACD,QACA,SACA,SACC,QACD,MACA,SACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,sBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,SACA,SACC,OACD,QACA,SACA,SACC,QACD,QACA,SACA,SACC,QACD,QACA,SACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,eACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,SACA,QACC,OACD,QACA,SACA,SACC,QACD,OACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,wBACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,OACA,SACC,OACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,OACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,qBACNO,UAAW,EACT,EACD,WACA,EACA,YACC,OACD,SACA,SACA,SACC,OACD,SACA,SACA,SACC,QACD,SACA,QACA,QACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,QACA,UACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,qBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,EACA,QACA,GACC,OACD,EACA,OACA,GACC,QACD,EACA,QACA,GACC,QACD,EACA,OACA,GACC,QACD,EACA,QACA,GACC,QACD,EACA,QACA,GACC,QACD,QACA,QACA,EACA,UACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,uBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,EACA,QACA,UACC,OACD,EACA,QACA,SACC,QACD,EACA,QACA,QACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,QACA,UACA,SACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,YACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,EACA,QACA,SACC,OACD,EACA,QACA,SACC,QACD,EACA,OACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,QACA,UACA,SACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,QACA,EACA,QACA,OACA,EACA,EACA,QACA,QACA,EACA,EACA,QACA,QACA,EACA,EACA,QACA,QACA,EACA,EACA,QACA,QACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,oBACNO,UAAW,EACT,EACD,WACA,EACA,WACC,OACD,SACA,SACA,QACC,OACD,EACA,QACA,QACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,SACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,QACA,OACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,eACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,SACA,SACA,SACC,OACD,SACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,aACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,EACA,EACA,SACC,OACD,EACA,EACA,SACC,QACD,EACA,EACA,SACC,QACD,EACA,EACA,SACC,QACD,EACA,EACA,SACC,QACD,EACA,EACA,SACC,QACD,EACA,QACA,QACA,UACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,iBACNO,UAAW,EACT,EACD,SACA,EACA,YACC,OACD,QACA,SACA,SACC,OACD,QACA,SACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,kBACNO,UAAW,EACT,EACD,EACA,EACA,YACC,OACD,QACA,SACA,QACC,OACD,QACA,SACA,SACC,QACD,QACA,SACA,SACC,QACD,QACA,SACA,QACC,QACD,QACA,SACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,OACA,UAGF,CACCF,WAAY,MACZL,KAAM,UACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,EACA,SACC,OACD,QACA,EACA,SACC,QACD,QACA,EACA,QACC,QACD,QACA,EACA,SACC,QACD,QACA,EACA,SACC,QACD,QACA,EACA,SACC,QACD,QACA,EACA,QACA,UACA,EACA,SACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,OACA,QACA,QACA,EACA,OACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,aACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,EACA,SACC,OACD,QACA,EACA,SACC,QACD,QACA,EACA,SACC,QACD,QACA,EACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,GACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,cACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,SACA,UACC,OACD,QACA,SACA,UACC,QACD,QACA,SACA,UACC,QACD,QACA,SACA,UACC,QACD,QACA,QACA,UACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,kBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,EACA,GACC,OACD,QACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,OACA,EACA,GACC,QACD,QACA,EACA,GACC,QACD,QACA,EACA,EACA,UACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,QACA,QACA,EACA,OACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,iBACNO,UAAW,EACT,EACD,EACA,EACA,YACC,OACD,QACA,SACA,GACC,OACD,QACA,SACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,EACA,UACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,OACA,UACA,QACA,QACA,QACA,SACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,OACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,gBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,OACA,SACA,GACC,OACD,OACA,QACA,GACC,QACD,OACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,EACA,UACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,GACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,eACNO,UAAW,EACT,EACD,EACA,EACA,YACC,OACD,QACA,SACA,GACC,OACD,QACA,QACA,GACC,QACD,OACA,OACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,OACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,EACA,UACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,OACA,MACA,EACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,EACA,QACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,gBACNO,UAAW,EACT,EACD,UACA,EACA,YACC,OACD,OACA,SACA,GACC,OACD,QACA,SACA,GACC,QACD,QACA,QACA,GACC,QACD,QACA,QACA,GACC,QACD,OACA,QACA,GACC,QACD,MACA,QACA,GACC,QACD,QACA,QACA,EACA,UACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,SACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,gBACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,SACA,SACA,UACC,OACD,QACA,QACA,UACC,QACD,QACA,QACA,UACC,QACD,QACA,QACA,QACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,EACA,EACA,GACA,KAGF,CACCF,WAAY,MACZL,KAAM,cACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,OACA,UACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,cACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,cACNO,UAAW,EACT,EACD,EACA,EACA,GACC,OACD,SACA,SACA,UACC,OACD,OACA,OACA,QACC,QACD,QACA,QACA,SACC,QACD,OACA,OACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,UACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,QACA,OACA,SACC,OACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,KACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,QACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,IAGF,CACCF,WAAY,MACZL,KAAM,SACNO,UAAW,EACT,EACD,EACA,QACA,SACC,OACD,EACA,QACA,SACC,OACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,QACA,QACA,SACC,OACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,OACA,SACC,QACD,OACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,OACA,QACA,SACC,OACD,QACA,OACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,MACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,OACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,OACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,EACA,QACA,SACC,OACD,EACA,QACA,SACC,OACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,SACNO,UAAW,EACT,EACD,QACA,OACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,OACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,SACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,KACA,SACC,OACD,QACA,QACA,OACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,KACA,UACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,EACA,SAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,OACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,QACA,EACA,SACC,OACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,QACA,UACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,UACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,OACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,EACA,QACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,EACA,GACC,OACD,MACA,EACA,GACC,OACD,QACA,OACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,SAGF,CACCF,WAAY,MACZL,KAAM,SACNO,UAAW,EACT,EACD,GACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,OACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,EACA,EACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,SACNO,UAAW,EACT,EACD,QACA,EACA,QACC,OACD,QACA,EACA,QACC,OACD,QACA,KACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,MACA,EACA,EACA,EACA,KAGF,CACCF,WAAY,MACZL,KAAM,kBACNO,UAAW,EACT,EACD,EACA,GACA,OACA,EACA,OACA,OACA,SAGF,CACCF,WAAY,MACZL,KAAM,cACNO,UAAW,EACT,EACD,EACA,EACA,EACA,EACA,GACA,GACA,GACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,iBACNO,UAAW,EACT,EACD,QACA,SACA,GACC,QACD,OACA,QACA,QACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,OACD,OACA,OACA,QACA,UACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,YAGF,CACCF,WAAY,MACZL,KAAM,mBACNO,UAAW,EACT,EACD,SACA,EACA,SACC,OACD,QACA,SACA,QACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,EACA,QACA,OACA,UAGF,CACCF,WAAY,MACZL,KAAM,mBACNO,UAAW,EACT,EACD,SACA,QACA,SACC,OACD,SACA,QACA,SACC,OACD,SACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,oBACNO,UAAW,EACT,EACD,QACA,SACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,EACA,QACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,yBACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,MACA,EACA,SACC,OACD,QACA,SACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,WACNO,UAAW,EACT,EACD,QACA,QACA,SACC,KACD,QACA,QACA,SACC,IACD,QACA,QACA,SACC,KACD,QACA,QACA,SACC,GACD,QACA,QACA,SACC,KACD,QACA,MACA,SACC,IACD,QACA,QACA,SACC,KACD,QACA,QACA,QACA,EACA,QACA,OACA,QACA,KACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,KACA,QACA,QACA,OACA,IACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,EACA,QACA,SACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,EACA,QACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,mBACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,QACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,EACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,OACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,OACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,SACNO,UAAW,EACT,EACD,EACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,EACA,SAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,EACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,OACA,OACA,SACC,OACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,OACA,EACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,QACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,MACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,MACA,QACA,UACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,GACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,EACA,QACA,EACA,UAGF,CACCF,WAAY,MACZL,KAAM,yBACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,OACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,UACA,EACA,QACA,QACA,IAGF,CACCF,WAAY,MACZL,KAAM,6BACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,QACA,UACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,SACA,EACA,QACA,QACA,IAGF,CACCF,WAAY,MACZL,KAAM,uBACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,QACA,UACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,0BACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,aACNO,UAAW,EACT,EACD,EACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,YACNO,UAAW,EACT,EACD,QACA,QACA,GACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,KAGF,CACCF,WAAY,MACZL,KAAM,OACNO,UAAW,EACT,EACD,EACA,QACA,SACC,UACD,QACA,QACA,QACA,UACA,QACA,QACA,QACA,EACA,QACA,QACA,IAGF,CACCF,WAAY,MACZL,KAAM,YACNO,UAAW,EACT,EACD,QACA,EACA,SACC,OACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,EACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,WACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,UACA,SACC,OACD,QACA,SACA,SACC,QACD,OACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,QACA,UACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,UACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,iBACNO,UAAW,EACT,EACD,WACA,EACA,YACC,OACD,EACA,QACA,SACC,OACD,EACA,QACA,SACC,QACD,SACA,QACA,OACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,OACA,QACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,OACA,QACA,EACA,QACA,QACA,OACA,SACA,QACA,QACA,QACA,UACA,QACA,QACA,EACA,EACA,QACA,QACA,UACA,UACA,EACA,SACA,UACA,aAGF,CACCF,WAAY,MACZL,KAAM,iBACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,SACC,OACD,OACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,SACA,QACA,SACC,QACD,EACA,QACA,SACC,QACD,EACA,QACA,OACA,UACA,SACA,UACA,WACA,QACA,QACA,EACA,EACA,QACA,QACA,EACA,EACA,QACA,QACA,OACA,SACA,QACA,QACA,QACA,UACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,EACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZL,KAAM,MACNO,UAAW,EACT,EACD,EACA,EACA,GACC,QACD,EACA,EACA,GACC,QACD,EACA,EACA,EACA,EACA,EACA,EACA,EACA,OACA,EACA,EACA,EACA,OACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,CACCF,WAAY,MACZL,KAAM,UACNO,UAAW,EACT,EACD,QACA,QACA,SACC,OACD,QACA,QACA,QACC,OACD,QACA,QACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,OACA,SACC,QACD,OACA,QACA,SACC,QACD,QACA,QACA,SACC,QACD,QACA,OACA,QACA,UACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCJ,cAAe,CACd,EACA,EACA,EACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,EACA,kBACA,EACA,kBACA,kBACA,mBAEDH,KAAM,WACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,mBACA,mBACA,kBACA,mBACA,mBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,EACA,kBACA,EACA,EACA,kBACA,oBAEDH,KAAM,OACNM,SAAU,CACT,EACA,kBACA,qBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,iBACA,kBACA,kBACA,iBACA,EACA,kBACA,GACA,mBAEDH,KAAM,OACNM,SAAU,CACT,kBACA,GACA,oBAGF,CACCH,cAAe,CACd,kBACA,iBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,kBACA,mBAEDH,KAAM,QACNM,SAAU,CACT,mBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,iBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,mBACA,mBAEDH,KAAM,cACNM,SAAU,CACT,kBACA,mBACA,oBAGF,CACCH,cAAe,CACd,iBACA,kBACA,kBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,EACA,kBACA,mBACA,EACA,kBACA,EACA,kBACA,kBACA,mBAEDH,KAAM,SACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,mBAEDH,KAAM,sCACNM,SAAU,CACT,kBACA,EACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,mBAEDH,KAAM,sCACNM,SAAU,CACT,kBACA,EACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,qCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,qCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,qCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,qCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,IAEDH,KAAM,qCACNM,SAAU,CACT,kBACA,kBACA,KAGF,CACCH,cAAe,CACd,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,IAEDH,KAAM,qCACNM,SAAU,CACT,kBACA,kBACA,KAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,mBAEDH,KAAM,qCACNM,SAAU,CACT,GACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,EACA,EACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,iCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,iCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,EACA,EACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,iBACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,iBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,iBACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,iBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,EACA,EACA,kBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,iBACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,iBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,iBACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,iBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,EACA,EACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,EACA,EACA,kBACA,GACA,kBACA,mBAEDH,KAAM,gCACNM,SAAU,CACT,GACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,iBACA,iBACA,kBACA,mBACA,GACA,kBACA,EACA,kBACA,mBAEDH,KAAM,yCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,iBACA,iBACA,kBACA,mBACA,GACA,kBACA,EACA,kBACA,mBAEDH,KAAM,yCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,iBACA,iBACA,kBACA,mBACA,GACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,mBACA,GACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,iBACA,iBACA,kBACA,mBACA,GACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,mBACA,GACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,GACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,mBACA,GACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,GACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,mBACA,GACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,mBACA,kBACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,mBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,mBACA,kBACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,mBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,wCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,GACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,kBACA,EACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,GACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,GACA,kBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,GACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,GACA,kBACA,iBACA,kBACA,kBACA,mBAEDH,KAAM,mCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,EACA,EACA,kBACA,EACA,kBACA,kBACA,iBACA,kBACA,kBACA,iBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,mBACA,GACA,iBACA,mBACA,GACA,kBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,GACA,kBACA,qBAGF,CACCH,cAAe,CACd,EACA,EACA,kBACA,EACA,kBACA,kBACA,iBACA,kBACA,kBACA,iBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,mBACA,kBACA,kBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,kBACA,kBACA,qBAGF,CACCH,cAAe,CACd,EACA,EACA,kBACA,iBACA,kBACA,kBACA,iBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,mBACA,kBACA,kBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,kBACA,kBACA,qBAGF,CACCH,cAAe,CACd,EACA,EACA,kBACA,iBACA,kBACA,kBACA,iBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,mBACA,GACA,iBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,GACA,iBACA,qBAGF,CACCH,cAAe,CACd,EACA,EACA,kBACA,iBACA,kBACA,kBACA,iBACA,GACA,kBACA,kBACA,kBACA,mBACA,GACA,iBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,GACA,iBACA,qBAGF,CACCH,cAAe,CACd,EACA,EACA,kBACA,iBACA,kBACA,kBACA,iBACA,GACA,kBACA,GACA,kBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,GACA,kBACA,qBAGF,CACCH,cAAe,CACd,EACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,oBAEDH,KAAM,4CACNM,SAAU,CACT,kBACA,kBACA,qBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,mBACA,kBACA,kBACA,EACA,mBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,EACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,mBACA,mBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,mBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,mBACA,mBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,mBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,mBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,mBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,mBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,mBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,kBACA,mBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,oCACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,EACA,GACA,kBACA,kBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,mBACA,GACA,GACA,IAEDH,KAAM,4BACNM,SAAU,CACT,GACA,GACA,KAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,mBACA,kBACA,kBACA,kBACA,GACA,GACA,IAEDH,KAAM,2BACNM,SAAU,CACT,GACA,GACA,KAGF,CACCH,cAAe,CACd,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,0BACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,iBACA,kBACA,iBACA,kBACA,iBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,iBACA,EACA,kBACA,kBACA,kBACA,kBACA,GACA,GACA,GACA,IAEDH,KAAM,6BACNM,SAAU,CACT,GACA,GACA,KAGF,CACCH,cAAe,CACd,iBACA,kBACA,kBACA,kBACA,iBACA,kBACA,GACA,kBACA,kBACA,kBACA,iBACA,kBACA,iBACA,kBACA,kBACA,EACA,EACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAEDH,KAAM,6BACNM,SAAU,CACT,kBACA,kBACA,oBAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,EACA,kBACA,EACA,EACA,EACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,GACA,IAEDH,KAAM,0BACNM,SAAU,CACT,GACA,GACA,KAGF,CACCH,cAAe,CACd,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,iBACA,kBACA,GACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,kBACA,EACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,EACA,EACA,IAEDH,KAAM,4BACNM,SAAU,CACT,EACA,EACA,KAGF,CACCH,cAAe,CACd,kBACA,kBACA,kBACA,EACA,EACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,GACA,kBACA,kBACA,EACA,kBACA,mBAEDH,KAAM,0BACNM,SAAU,CACT,EACA,kBACA,oBAGF,CACCH,cAAe,CACd,EACA,EACA,EACA,EACA,QACA,EACA,EACA,QACA,GAEDH,KAAM,iBACNM,SAAU,CACT,QACA,EACA,UAGF,CACCH,cAAe,CACd,QACA,QACA,QACA,EACA,QACA,EACA,EACA,QACA,GAEDH,KAAM,kCACNM,SAAU,CACT,QACA,EACA,UAGF,CACCH,cAAe,CACd,kBACA,EACA,mBACA,kBACA,kBACA,kBACA,mBACA,kBACA,oBAEDH,KAAM,oCACNM,SAAU,CACT,QACA,EACA,UAGF,CACCD,WAAY,MACZG,QAAS,mBACTR,KAAM,mBACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,QACA,OACA,QACA,IACA,QACA,QACA,QACA,IACA,OACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,OACA,IACA,QACA,QACA,OACA,GACA,OACA,QACA,QACA,IACA,QACA,QACA,QACA,KACA,QACA,QACA,EACA,GACA,QACA,QACA,EACA,GACA,QACA,EACA,OACA,GACA,EACA,EACA,QACA,GACA,QACA,QACA,EACA,KACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,OACA,QACA,IACA,QACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,2CACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,QACA,GACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,GACA,QACA,GACA,QACA,OACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,OACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,OACA,QACA,GACA,QACA,OACA,QACA,IACA,EACA,EACA,EACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,OACA,GACA,QACA,QACA,OACA,IACA,QACA,OACA,OACA,IACA,QACA,QACA,OACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,kCACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,QACA,OACA,GACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,OACA,QACA,GACA,GACA,OACA,QACA,QACA,IACA,QACA,GACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,OACA,QACA,GACA,QACA,GACA,QACA,GACA,QACA,QACA,QACA,IACA,OACA,QACA,QACA,GACA,QACA,OACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,GACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,MACZG,QAAS,mBACTR,KAAM,YACNM,SAAU,CACT,IACA,EACA,GAEDC,UAAW,CACV,EACA,EACA,EACA,QACA,KACA,EACA,EACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,OACA,QACA,QACA,IACA,QACA,QACA,OACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,QACA,QACA,QACA,GACA,GACA,QACA,EACA,IACA,QACA,QACA,EACA,GACA,QACA,QACA,QACA,IACA,GACA,QACA,QACA,GACA,QACA,QACA,QACA,IACA,GACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,YACZL,KAAM,qBACNM,SAAU,CACT,EACA,EACA,GAEDG,OAAQ,4DACRC,QAAS,MACTF,QAAS,2CACTD,UAAW,CACV,EACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,MACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,GACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,YACZL,KAAM,uBACNM,SAAU,CACT,EACA,EACA,GAEDG,OAAQ,4DACRC,QAAS,MACTF,QAAS,2CACTD,UAAW,CACV,EACA,QACA,OACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,GACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,YACZL,KAAM,sBACNM,SAAU,CACT,EACA,EACA,GAEDG,OAAQ,4DACRC,QAAS,MACTF,QAAS,2CACTD,UAAW,CACV,EACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,OACA,GACA,QACA,OACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,GACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,OACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,EACA,QACA,QACA,UAGF,CACCF,WAAY,YACZL,KAAM,uBACNM,SAAU,CACT,EACA,EACA,GAEDG,OAAQ,4DACRC,QAAS,MACTF,QAAS,cACTD,UAAW,CACV,EACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,KACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,EACA,QACA,QACA,UAGF,CACCI,6BAA8B,EAC9BR,cAAe,CACd,IACA,GACA,GACA,EACA,EACA,EACA,IACA,EACA,EACA,GACA,GACA,EACA,IACA,EACA,EACA,EACA,IACA,IACA,GACA,GACA,GACA,IACA,IACA,EACA,EACA,IACA,IACA,GACA,EACA,EACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,EACA,IACA,IACA,IACA,GACA,GACA,GACA,EACA,GACA,EACA,EACA,EACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,EACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,EACA,IACA,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,EACA,EACA,IACA,EACA,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,IACA,IACA,IACA,IACA,EACA,EACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,EACA,IACA,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,IACA,EACA,IACA,IACA,EACA,EACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,EACA,EACA,IACA,EACA,GACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,GACA,IACA,EACA,GACA,IACA,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,GACA,EACA,IACA,EACA,IACA,IACA,IACA,EACA,IACA,EACA,EACA,IACA,EACA,EACA,IACA,EACA,EACA,GACA,EACA,EACA,IACA,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,GACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,GACA,GACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,GACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,GACA,IACA,EACA,IACA,IACA,EACA,IACA,IACA,EACA,IACA,EACA,EACA,KAEDC,YAAa,CACZ,EACA,KACA,EACA,IACA,EACA,KACA,EACA,KACA,EACA,KACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KAC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","sources":["webpack:///../../../node_modules/@cornerstonejs/core/src/enums/Events.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/RequestType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/ViewportType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/InterpolationType.ts","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/VolumeMapper/Constants.js","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/BlendModes.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/OrientationAxis.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/SharedArrayBufferModes.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/GeometryType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/ContourType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/VOILUTFunctionType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/DynamicOperatorType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/CalibrationTypes.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/enums/ViewportStatus.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/constants/cpuColormaps.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/constants/rendering.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/constants/epsilon.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/deepFreeze.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/constants/mprCameraValues.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/constants/viewportPresets.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/renderingEngineCache.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/eventTarget.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/invertRgbTransferFunction.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/createSigmoidRGBTransferFunction.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getVoiFromSigmoidRGBTransferFunction.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/createLinearRGBTransferFunction.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/scaleRgbTransferFunction.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/triggerEvent.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/uuidv4.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getMinMax.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getRuntimeId.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/imageIdToURI.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/calibratedPixelSpacingMetadataProvider.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/isEqual.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/isOpposite.ts","webpack:///../../../node_modules/detect-gpu/src/internal/blocklistedGPUS.ts","webpack:///../../../node_modules/detect-gpu/src/internal/cleanRenderer.ts","webpack:///../../../node_modules/detect-gpu/node_modules/webgl-constants/dist/webgl-constants.esm.js","webpack:///../../../node_modules/detect-gpu/src/internal/ssr.ts","webpack:///../../../node_modules/detect-gpu/src/internal/deviceInfo.ts","webpack:///../../../node_modules/detect-gpu/src/internal/getLevenshteinDistance.ts","webpack:///../../../node_modules/detect-gpu/src/internal/util.ts","webpack:///../../../node_modules/detect-gpu/src/internal/error.ts","webpack:///../../../node_modules/detect-gpu/src/index.ts","webpack:///../../../node_modules/detect-gpu/src/internal/getWebGLContext.ts","webpack:///../../../node_modules/detect-gpu/src/internal/deobfuscateRenderer.ts","webpack:///../../../node_modules/detect-gpu/src/internal/deobfuscateAppleGPU.ts","webpack:///../../../node_modules/detect-gpu/src/internal/getGPUVersion.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/getRenderingEngine.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/init.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/createUint8SharedArray.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/createFloat32SharedArray.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/createUInt16SharedArray.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/createInt16SharedArray.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/metaData.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getSpacingInNormalDirection.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getClosestImageId.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/cache/cache.ts","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/SceneGraph/ViewNode.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/SceneGraph/ViewNodeFactory.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ViewNodeFactory.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Camera.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Renderer.js","webpack:///../../../node_modules/@kitware/vtk.js/Filters/General/ClosedPolyLineToSurfaceFilter.js","webpack:///../../../node_modules/@kitware/vtk.js/Filters/Core/Cutter.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/BufferObject/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/BufferObject.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/CellArrayBufferObject.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Shader.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ShaderProgram.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/VertexArrayObject.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Helper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Texture/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/HalfFloat.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Texture.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ReplacementShaderMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkImageResliceMapperVS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkImageResliceMapperFS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ImageProperty/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ImageResliceMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ImageMapper/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkPolyDataVS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkPolyDataFS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ImageMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ImageSlice.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Volume.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Framebuffer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/VolumeProperty/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkVolumeVS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkVolumeFS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/VolumeMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/PixelSpaceCallbackMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ViewNodeFactory.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Camera.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/BindGroup.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ShaderModule.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ShaderCache.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Pipeline.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ShaderDescription.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Types.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/VertexInput.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/SimpleMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/FullScreenQuad.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/BufferManager/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Buffer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/IndexBuffer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/BufferManager.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/StorageBuffer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/UniformBuffer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Renderer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Sampler.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ImageMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ImageSlice.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Volume.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/PixelSpaceCallbackMapper.js","webpack:///../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/RenderWindow.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/SceneGraph/RenderPass.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/OrderIndependentTranslucentPass.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ForwardPass.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/HardwareSelector.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/SelectionNode/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/SelectionNode.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/HardwareSelector.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ShaderCache.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/TextureUnitManager.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/SceneGraph/RenderWindowViewNode.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/RenderWindow/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/RenderWindow/ContextProxy.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/RenderWindow.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Actor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Actor2D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/PolyDataMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Glyph3DMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/Skybox.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkSphereMapperVS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/SphereMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkStickMapperVS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/StickMapper.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLViewNodeFactory.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLRenderWindow.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/RenderWindowInteractor/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/RenderWindowInteractor.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/VolumeMapper.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkSharedVolumeMapper.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLTexture.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/vtkClasses/vtkSlabCamera.js","webpack:///../../../node_modules/@cornerstonejs/core/src/cache/classes/ImageVolume.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/isTypedArray.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/loaders/volumeLoader.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getTargetVolumeAndSpacingInNormalDir.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getVolumeActorCorners.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/indexWithinDimensions.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getVolumeViewportsContainingSameVolumes.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getViewportsWithVolumeId.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/transformWorldToIndex.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/requestPool/requestPoolManager.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/requestPool/imageLoadPoolManager.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/loaders/imageLoader.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/getOrCreateCanvas.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/isPTPrescaledWithSUV.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/renderToCanvasGPU.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/setDefaultViewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/validator.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getImageSize.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getImageFitScale.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/createViewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/transform.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/calculateTransform.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/now.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/setToPixelCoordinateSystem.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/doesImageNeedToBeRendered.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/initializeRenderCanvas.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/saveLastRendered.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/generateColorLUT.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedRGBAPixelDataToCanvasImageData.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedColorPixelDataToCanvasImageData.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/computeAutoVoi.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/lutMatches.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getLut.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/generateLut.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getModalityLut.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPET.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageData.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataRGBA.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/colors/lookupTable.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/colors/colormap.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPseudocolorLUT.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPseudocolorLUTPET.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/renderPseudoColorImage.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/drawImageSync.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/renderToCanvasCPU.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/loadImageToCanvas.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/worldToImageCoords.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/imageToWorldCoords.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getSliceRange.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getVolumeSliceRangeInfo.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getVolumeViewportScrollInfo.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/snapFocalPointToSlice.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getImageSliceDataForVolumeViewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/actorCheck.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getViewportsWithImageURI.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getClosestStackImageIndexForPoint.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/spatialRegistrationMetadataProvider.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/calculateViewportsSpatialRegistration.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getViewportImageCornersInWorld.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/hasNaNValues.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/applyPreset.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/deepMerge.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getScalingParameters.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getScalarDataType.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/getEnabledElement.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/getImageLegacy.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/planar.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/windowLevel.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/utilities/colormap.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/cache/index.ts","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps.json.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/VolumeProperty.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Volume.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/createVolumeMapper.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/setDefaultVolumeVOI.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/createVolumeActor.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/setVolumesForViewports.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/addVolumesToViewports.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/volumeNewImageEventDispatcher.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/Viewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/BaseVolumeViewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/VolumeViewport.ts","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/AbstractImageMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/AbstractImageMapper/helper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ImageMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ImageProperty.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ImageSlice.js","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/getTransform.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/canvasToPixel.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/pixelToCanvas.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/resize.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/fitToWindow.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/StackViewport.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/correctShift.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/cpuFallback/rendering/resetCamera.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/VolumeViewport3D.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/helpers/viewportTypeUsesCustomRenderingPipeline.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/RenderingEngine.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/RenderingEngine/index.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/requestPool/imageRetrievalPoolManager.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/Settings.ts","webpack:///../../../node_modules/d3-scale/src/init.js","webpack:///../../../node_modules/d3-scale/src/ordinal.js","webpack:///../../../node_modules/d3-scale/src/number.js","webpack:///../../../node_modules/d3-scale/src/continuous.js","webpack:///../../../node_modules/d3-scale/src/constant.js","webpack:///../../../node_modules/d3-format/src/formatDecimal.js","webpack:///../../../node_modules/d3-format/src/exponent.js","webpack:///../../../node_modules/d3-format/src/formatSpecifier.js","webpack:///../../../node_modules/d3-format/src/formatPrefixAuto.js","webpack:///../../../node_modules/d3-format/src/formatRounded.js","webpack:///../../../node_modules/d3-format/src/formatTypes.js","webpack:///../../../node_modules/d3-format/src/identity.js","webpack:///../../../node_modules/d3-format/src/locale.js","webpack:///../../../node_modules/d3-format/src/defaultLocale.js","webpack:///../../../node_modules/d3-format/src/formatGroup.js","webpack:///../../../node_modules/d3-format/src/formatNumerals.js","webpack:///../../../node_modules/d3-format/src/formatTrim.js","webpack:///../../../node_modules/d3-scale/src/tickFormat.js","webpack:///../../../node_modules/d3-format/src/precisionPrefix.js","webpack:///../../../node_modules/d3-format/src/precisionRound.js","webpack:///../../../node_modules/d3-format/src/precisionFixed.js","webpack:///../../../node_modules/d3-scale/src/linear.js","webpack:///../../../node_modules/d3-time/src/interval.js","webpack:///../../../node_modules/d3-time/src/millisecond.js","webpack:///../../../node_modules/d3-time/src/duration.js","webpack:///../../../node_modules/d3-time/src/second.js","webpack:///../../../node_modules/d3-time/src/minute.js","webpack:///../../../node_modules/d3-time/src/hour.js","webpack:///../../../node_modules/d3-time/src/day.js","webpack:///../../../node_modules/d3-time/src/week.js","webpack:///../../../node_modules/d3-time/src/month.js","webpack:///../../../node_modules/d3-time/src/year.js","webpack:///../../../node_modules/d3-time/src/ticks.js","webpack:///../../../node_modules/d3-time-format/src/locale.js","webpack:///../../../node_modules/d3-time-format/src/defaultLocale.js","webpack:///../../../node_modules/d3-time-format/src/isoFormat.js","webpack:///../../../node_modules/d3-time-format/src/isoParse.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/CubeAxesActor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/CubeAxesActor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper2D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkPolyData2DFS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/glsl/vtkPolyData2DVS.glsl.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Property2D/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/PolyDataMapper2D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ScalarBarActor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/ScalarBarActor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Actor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Actor2D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/CubeAxesActor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Property2D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/CellArrayMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/PolyDataMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/PolyDataMapper2D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/ScalarBarActor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/TextureView.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/WebGPU/Texture.js","webpack:///../../../node_modules/@cornerstonejs/core/src/cache/classes/Contour.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/cache/classes/ContourSet.ts","webpack:///../../../node_modules/@cornerstonejs/core/src/loaders/geometryLoader.ts","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/CellArray.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/DataArray.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/DataArray/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/LookupTable.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/Math/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/Math/index.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/MatrixBuilder.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/Points.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/ScalarsToColors.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/ScalarsToColors/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/BoundingBox.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/DataSetAttributes/FieldData.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/DataSetAttributes.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/DataSet/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/DataSet.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/DataSetAttributes/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/StructuredData/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/StructuredData.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/ImageData.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/PiecewiseFunction.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/Plane.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/Cell.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/CellLinks.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/CellTypes/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/CellTypes.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/Line/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/Line.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/PointSet.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/Triangle.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/PolyData.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/PolyData/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Filters/Sources/CubeSource.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/AbstractMapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/AbstractMapper3D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Actor.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Camera.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ColorTransferFunction/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/ColorTransferFunction.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper/Static.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper/CoincidentTopologyHelper.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Prop/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Prop.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Prop3D.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Property.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Property/Constants.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Light.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Viewport.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Renderer.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/Core/Texture.js","webpack:///../../../node_modules/@kitware/vtk.js/Rendering/OpenGL/HardwareSelector/Constants.js","webpack:///../../../node_modules/@babel/runtime/helpers/esm/construct.js","webpack:///../../../node_modules/@babel/runtime/helpers/esm/get.js","webpack:///../../../node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack:///../../../node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","webpack:///../../../node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/Core/ClassHierarchy.js","webpack:///../../../node_modules/@kitware/vtk.js/macros.js","webpack:///../../../node_modules/@kitware/vtk.js/vtk.js","webpack:///../../../node_modules/globalthis/implementation.browser.js","webpack:///../../../node_modules/globalthis/index.js","webpack:///../../../node_modules/globalthis/polyfill.js","webpack:///../../../node_modules/globalthis/shim.js","webpack:///../../../node_modules/spark-md5/spark-md5.js","webpack:///../../../node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack:///../../../node_modules/@babel/runtime/regenerator/index.js","webpack:///../../../node_modules/d3-array/src/ascending.js","webpack:///../../../node_modules/d3-array/src/descending.js","webpack:///../../../node_modules/d3-array/src/bisector.js","webpack:///../../../node_modules/d3-array/src/bisect.js","webpack:///../../../node_modules/d3-array/src/number.js","webpack:///../../../node_modules/d3-array/src/blur.js","webpack:///../../../node_modules/d3-array/src/array.js","webpack:///../../../node_modules/d3-array/src/ticks.js","webpack:///../../../node_modules/d3-array/src/shuffle.js","webpack:///../../../node_modules/d3-array/src/transpose.js","webpack:///../../../node_modules/d3-array/src/zip.js","webpack:///../../../node_modules/d3-array/src/min.js","webpack:///../../../node_modules/d3-color/src/define.js","webpack:///../../../node_modules/d3-color/src/color.js","webpack:///../../../node_modules/d3-color/src/math.js","webpack:///../../../node_modules/d3-color/src/lab.js","webpack:///../../../node_modules/d3-color/src/cubehelix.js","webpack:///../../../node_modules/d3-interpolate/src/basis.js","webpack:///../../../node_modules/d3-interpolate/src/constant.js","webpack:///../../../node_modules/d3-interpolate/src/color.js","webpack:///../../../node_modules/d3-interpolate/src/rgb.js","webpack:///../../../node_modules/d3-interpolate/src/basisClosed.js","webpack:///../../../node_modules/d3-interpolate/src/numberArray.js","webpack:///../../../node_modules/d3-interpolate/src/array.js","webpack:///../../../node_modules/d3-interpolate/src/date.js","webpack:///../../../node_modules/d3-interpolate/src/number.js","webpack:///../../../node_modules/d3-interpolate/src/object.js","webpack:///../../../node_modules/d3-interpolate/src/string.js","webpack:///../../../node_modules/d3-interpolate/src/value.js","webpack:///../../../node_modules/d3-interpolate/src/round.js","webpack:///../../../node_modules/d3-interpolate/src/transform/decompose.js","webpack:///../../../node_modules/d3-interpolate/src/transform/parse.js","webpack:///../../../node_modules/d3-interpolate/src/transform/index.js","webpack:///../../../node_modules/d3-interpolate/src/zoom.js","webpack:///../../../node_modules/d3-interpolate/src/hsl.js","webpack:///../../../node_modules/d3-interpolate/src/hcl.js","webpack:///../../../node_modules/d3-interpolate/src/cubehelix.js","webpack:///../../../node_modules/d3-interpolate/src/quantize.js"],"sourcesContent":["/**\n * Cornerstone Core events\n */\nenum Events {\n /**\n * ERROR CODES\n */\n\n /**\n * Error that is thrown when the ImageCache exceeds its max cache size.\n * This can happen for both volumes and stack images.\n */\n CACHE_SIZE_EXCEEDED = 'CACHE_SIZE_EXCEEDED',\n /**\n * Happens if an image (either a single image in stack viewport) or a slice\n * of a volume fails to load by the image/volume loaders.\n */\n IMAGE_LOAD_ERROR = 'IMAGE_LOAD_ERROR',\n\n /**\n * Triggers on the HTML element when the viewport camera changes.\n *\n * Make use of {@link EventTypes.CameraModifiedEvent | CameraModified Event Type } for typing your event listeners for CAMERA_MODIFIED event,\n * and see what event detail is included in {@link EventTypes.CameraModifiedEventDetail | CameraModified Event Detail }\n */\n CAMERA_MODIFIED = 'CORNERSTONE_CAMERA_MODIFIED',\n /**\n * Triggers on the HTML element when the viewport camera resets\n *\n * Make use of {@link EventTypes.CameraResetEvent | CameraReset Event Type } for typing your event listeners for CAMERA_RESET event,\n * and see what event detail is included in {@link EventTypes.CameraResetEventDetail | CameraReset Event Detail }\n */\n CAMERA_RESET = 'CORNERSTONE_CAMERA_RESET',\n /**\n * Triggers on the HTML element when viewport modifies its VOI\n *\n * Make use of {@link EventTypes.VoiModifiedEvent | VoiModified Event Type } for typing your event listeners for VOI_MODIFIED event,\n * and see what event detail is included in {@link EventTypes.VoiModifiedEventDetail | VoiModified Event Detail }\n */\n VOI_MODIFIED = 'CORNERSTONE_VOI_MODIFIED',\n /**\n * Triggers on the HTML element when viewport modifies its display area\n *\n * Make use of {@link EventTypes.DisplayAreaModifiedEvent | DisplayAreaModified Event Type } for typing your event listeners for DISPLAY_AREA_MODIFIED event,\n * and see what event detail is included in {@link EventTypes.DisplayAreaModifiedEventDetail | DisplayAreaModified Event Detail }\n */\n DISPLAY_AREA_MODIFIED = 'CORNERSTONE_DISPLAY_AREA_MODIFIED',\n /**\n * Triggers on the eventTarget when the element is disabled\n *\n * Make use of {@link EventTypes.ElementDisabledEvent | ElementDisabled Event Type } for typing your event listeners for ELEMENT_DISABLED event,\n * and see what event detail is included in {@link EventTypes.ElementDisabledEventDetail | ElementDisabled Event Detail }\n */\n ELEMENT_DISABLED = 'CORNERSTONE_ELEMENT_DISABLED',\n /**\n * Triggers on the eventTarget when the element is enabled\n *\n * Make use of {@link EventTypes.ElementEnabledEvent | ElementEnabled Event Type } for typing your event listeners for ELEMENT_ENABLED event,\n * and see what event detail is included in {@link EventTypes.ElementEnabledEventDetail | ElementEnabled Event Detail }\n */\n ELEMENT_ENABLED = 'CORNERSTONE_ELEMENT_ENABLED',\n /**\n * Triggers on the element when the image in the element has been rendered\n *\n * Make use of {@link EventTypes.ImageRenderedEvent | ImageRendered Event Type } for typing your event listeners for IMAGE_RENDERED event,\n * and see what event detail is included in {@link EventTypes.ImageRenderedEventDetail | ImageRendered Event Detail }\n */\n IMAGE_RENDERED = 'CORNERSTONE_IMAGE_RENDERED',\n /**\n * Triggers on the eventTarget when the image volume data is modified. This happens\n * in the streamingImageLoader when each frame is loaded and inserted into a volume.\n *\n *\n * Make use of {@link EventTypes.ImageVolumeModifiedEvent | ImageVolumeModified Event Type } for typing your event listeners for IMAGE_VOLUME_MODIFIED event,\n * and see what event detail is included in {@link EventTypes.ImageVolumeModifiedEventDetail | ImageVolumeModified Event Detail }\n */\n IMAGE_VOLUME_MODIFIED = 'CORNERSTONE_IMAGE_VOLUME_MODIFIED',\n /**\n * Triggers on the eventTarget when the image volume loading is completed and all\n * frames are loaded and inserted into a volume.\n *\n * Make use of {@link EventTypes.ImageVolumeLoadingCompletedEvent | ImageVolumeLoadingCompleted Event Type } for typing your\n * event listeners for IMAGE_VOLUME_LOADING_COMPLETED event, and see what event detail is included\n * in {@link EventTypes.ImageVolumeLoadingCompletedEventDetail | ImageVolumeLoadingCompleted Event Detail }\n */\n IMAGE_VOLUME_LOADING_COMPLETED = 'CORNERSTONE_IMAGE_VOLUME_LOADING_COMPLETED',\n /**\n * Triggers on the eventTarget when the image has successfully loaded by imageLoaders\n *\n * Make use of {@link EventTypes.ImageLoadedEvent | ImageLoaded Event Type } for typing your event listeners for IMAGE_LOADED event,\n * and see what event detail is included in {@link EventTypes.ImageLoadedEventDetail | ImageLoaded Event Detail }\n */\n IMAGE_LOADED = 'CORNERSTONE_IMAGE_LOADED',\n /**\n * Triggers on the eventTarget when the image has failed loading by imageLoaders\n *\n * Make use of {@link EventTypes.ImageLoadedFailedEvent | ImageLoadedFailed Event Type } for typing your event listeners for IMAGE_LOADED_FAILED event,\n * and see what event detail is included in {@link EventTypes.ImageLoadedFailedEventDetail | ImageLoadedFailed Event Detail }\n */\n IMAGE_LOAD_FAILED = 'CORNERSTONE_IMAGE_LOAD_FAILED',\n /**\n * Triggers on element when a new voluem is set on the volume viewport\n */\n VOLUME_VIEWPORT_NEW_VOLUME = 'CORNERSTONE_VOLUME_VIEWPORT_NEW_VOLUME',\n\n /**\n * Triggers on the eventTarget when the volume has successfully loaded by volumeLoaders\n *\n * Make use of {@link EventTypes.VolumeLoadedEvent | VolumeLoaded Event Type } for typing your event listeners for VOLUME_LOADED event,\n * and see what event detail is included in {@link EventTypes.VolumeLoadedEventDetail | VolumeLoaded Event Detail }\n */\n VOLUME_LOADED = 'CORNERSTONE_VOLUME_LOADED',\n /**\n * Triggers on the eventTarget when the image has failed loading by volumeLoaders\n *\n * Make use of {@link EventTypes.VolumeLoadedFailedEvent | VolumeLoadedFailed Event Type } for typing your event listeners for VOLUME_LOADED_FAILED event,\n * and see what event detail is included in {@link EventTypes.VolumeLoadedFailedEventDetail | VolumeLoadedFailed Event Detail }\n */\n VOLUME_LOADED_FAILED = 'CORNERSTONE_VOLUME_LOADED_FAILED',\n /**\n * Triggers on the eventTarget when an image is added to the image cache\n *\n * Make use of {@link EventTypes.ImageCacheImageAddedEvent | ImageCacheAdded Event Type } for typing your event listeners for IMAGE_CACHE_ADDED event,\n * and see what event detail is included in {@link EventTypes.ImageCacheImageAddedEventDetail | ImageCacheAdded Event Detail }\n */\n IMAGE_CACHE_IMAGE_ADDED = 'CORNERSTONE_IMAGE_CACHE_IMAGE_ADDED',\n /**\n * Triggers on the eventTarget when an image is removed from the image cache\n *\n * Make use of {@link EventTypes.ImageCacheImageRemovedEvent | ImageCacheRemoved Event Type } for typing your event listeners for IMAGE_CACHE_REMOVED event,\n * and see what event detail is included in {@link EventTypes.ImageCacheImageRemovedEventDetail | ImageCacheRemoved Event Detail }\n */\n IMAGE_CACHE_IMAGE_REMOVED = 'CORNERSTONE_IMAGE_CACHE_IMAGE_REMOVED',\n /**\n * Triggers on the eventTarget when a volume is added to the volume cache\n *\n * Make use of {@link EventTypes.VolumeCacheVolumeAddedEvent | VolumeCacheAdded Event Type } for typing your event listeners for VOLUME_CACHE_ADDED event,\n * and see what event detail is included in {@link EventTypes.VolumeCacheVolumeAddedEventDetail | VolumeCacheAdded Event Detail }\n */\n VOLUME_CACHE_VOLUME_ADDED = 'CORNERSTONE_VOLUME_CACHE_VOLUME_ADDED',\n /**\n * Triggers on the eventTarget when a volume is removed from the volume cache\n *\n * Make use of {@link EventTypes.VolumeCacheVolumeRemovedEvent | VolumeCacheRemoved Event Type } for typing your event listeners for VOLUME_CACHE_REMOVED event,\n * and see what event detail is included in {@link EventTypes.VolumeCacheVolumeRemovedEventDetail | VolumeCacheRemoved Event Detail }\n */\n VOLUME_CACHE_VOLUME_REMOVED = 'CORNERSTONE_VOLUME_CACHE_VOLUME_REMOVED',\n /**\n * Triggers on the element when a new image is set on the stackViewport\n *\n * Make use of {@link EventTypes.StackNewImageEvent | StackNewImage Event Type } for typing your event listeners for STACK_NEW_IMAGE event,\n * and see what event detail is included in {@link EventTypes.StackNewImageEventDetail | StackNewImage Event Detail }\n */\n STACK_NEW_IMAGE = 'CORNERSTONE_STACK_NEW_IMAGE',\n\n /**\n * Triggers on the element when a new image is set on the volumeViewport, this can be due to scrolling or other\n * tools that change the camera position or focal point.\n *\n * Make use of {@link EventTypes.VolumeNewImageEvent | VolumeNewImage Event Type } for typing your event listeners for VOLUME_NEW_IMAGE event,\n * and see what event detail is included in {@link EventTypes.VolumeNewImageEventDetail | VolumeNewImage Event Detail }\n */\n VOLUME_NEW_IMAGE = 'CORNERSTONE_VOLUME_NEW_IMAGE',\n\n /**\n * Triggers on the element when a new image is about to be set on the stackViewport, pre display\n *\n * Make use of {@link EventTypes.PreStackNewImageEvent | PreStackNewImage Event Type } for typing your event listeners for PRE_STACK_NEW_IMAGE event,\n * and see what event detail is included in {@link EventTypes.PreStackNewImageEventDetail | PreStackNewImage Event Detail }\n */\n PRE_STACK_NEW_IMAGE = 'CORNERSTONE_PRE_STACK_NEW_IMAGE',\n /**\n * Triggers on the element when the viewport's image has calibrated its pixel spacings\n *\n * Make use of {@link EventTypes.ImageSpacingCalibratedEvent | ImageSpacingCalibrated Event Type } for typing your event listeners for IMAGE_SPACING_CALIBRATED event,\n * and see what event detail is included in {@link EventTypes.ImageSpacingCalibratedEventDetail | ImageSpacingCalibrated Event Detail }\n */\n IMAGE_SPACING_CALIBRATED = 'CORNERSTONE_IMAGE_SPACING_CALIBRATED',\n /**\n * Triggers on the eventTarget when there is a progress in the image load process. Note: this event\n * is being used in the dicom-image-loader repository. See {@link https://github.com/cornerstonejs/cornerstoneDICOMImageLoader/blob/master/src/imageLoader/internal/xhrRequest.js | here}\n *\n * Make use of {@link EventTypes.ImageLoadProgress | ImageLoadProgress Event Type } for typing your event listeners for IMAGE_LOAD_PROGRESS event,\n * and see what event detail is included in {@link EventTypes.ImageLoadProgressEventDetail | ImageLoadProgress Event Detail }\n */\n IMAGE_LOAD_PROGRESS = 'CORNERSTONE_IMAGE_LOAD_PROGRESS',\n\n /**\n * Triggers on the event target when a new stack is set on its stack viewport.\n * Make use of {@link EventTypes.StackViewportNewStack | StackViewportNewStack Event Type } for typing your event listeners for STACK_VIEWPORT_NEW_STACK event,\n * and see what event detail is included in {@link EventTypes.StackViewportNewStackEventDetail | StackViewportNewStack Event Detail }\n */\n STACK_VIEWPORT_NEW_STACK = 'CORNERSTONE_STACK_VIEWPORT_NEW_STACK',\n\n /**\n * Triggers on the element when the underlying StackViewport is scrolled.\n * Make use of {@link EventTypes.StackViewportScroll | StackViewportScroll Event Type } for typing your event listeners for STACK_VIEWPORT_SCROLL event,\n * and see what event detail is included in {@link EventTypes.StackViewportScrollEventDetail | StackViewportScroll Event Detail }\n */\n STACK_VIEWPORT_SCROLL = 'CORNERSTONE_STACK_VIEWPORT_SCROLL',\n\n /**\n * Triggers on the eventTarget when a new geometry is added to the geometry cache\n */\n GEOMETRY_CACHE_GEOMETRY_ADDED = 'CORNERSTONE_GEOMETRY_CACHE_GEOMETRY_ADDED',\n\n /**\n * Triggers when the scroll function is called with a delta that is out of bounds.\n * This is usually for signaling that the user may want a different volume for partially loaded volumes which is meant to optimize memory.\n */\n VOLUME_SCROLL_OUT_OF_BOUNDS = 'CORNERSTONE_VOLUME_SCROLL_OUT_OF_BOUNDS',\n // IMAGE_CACHE_FULL = 'CORNERSTONE_IMAGE_CACHE_FULL',\n // PRE_RENDER = 'CORNERSTONE_PRE_RENDER',\n // ELEMENT_RESIZED = 'CORNERSTONE_ELEMENT_RESIZED',\n}\n\nexport default Events;\n","/**\n * Request types for requesting images from the imageLoadPoolManager\n */\nenum RequestType {\n /** Highest priority for loading*/\n Interaction = 'interaction',\n /** Second highest priority for loading*/\n Thumbnail = 'thumbnail',\n /** Lowest priority for loading*/\n Prefetch = 'prefetch',\n}\n\nexport default RequestType;\n","/**\n * ViewportType enum for cornerstone-render which defines the type of viewport.\n * It can be either STACK, PERSPECTIVE, ORTHOGRAPHIC.\n */\nenum ViewportType {\n /**\n * - Suitable for rendering a stack of images, that might or might not belong to the same image.\n * - Stack can include 2D images of different shapes, size and direction\n */\n STACK = 'stack',\n /**\n * - Suitable for rendering a volumetric data which is considered as one 3D image.\n * - Having a VolumeViewport enables Multi-planar reformation or reconstruction (MPR) by design, in which you can visualize the volume from various different orientations without addition of performance costs.\n */\n ORTHOGRAPHIC = 'orthographic',\n /** Perspective Viewport: Not Implemented yet */\n PERSPECTIVE = 'perspective',\n VOLUME_3D = 'volume3d',\n}\n\nexport default ViewportType;\n","/**\n * Interpolation types for image rendering\n */\nenum InterpolationType {\n /** nearest neighbor interpolation */\n NEAREST,\n /** linear interpolation - Default */\n LINEAR,\n /** */\n FAST_LINEAR,\n}\n\nexport default InterpolationType;\n","var BlendMode = {\n COMPOSITE_BLEND: 0,\n MAXIMUM_INTENSITY_BLEND: 1,\n MINIMUM_INTENSITY_BLEND: 2,\n AVERAGE_INTENSITY_BLEND: 3,\n ADDITIVE_INTENSITY_BLEND: 4,\n RADON_TRANSFORM_BLEND: 5\n};\nvar FilterMode = {\n OFF: 0,\n NORMALIZED: 1,\n RAW: 2\n};\nvar Constants = {\n BlendMode: BlendMode,\n FilterMode: FilterMode\n};\n\nexport { BlendMode, FilterMode, Constants as default };\n","import vtkConstants from '@kitware/vtk.js/Rendering/Core/VolumeMapper/Constants';\n\nconst { BlendMode } = vtkConstants;\n\n/**\n * Enums for blendModes for viewport images based on vtk.js\n *\n * It should be noted that if crosshairs are enabled and can modify the slab thickness,\n * then it will not show any difference unless MAXIMUM_INTENSITY_BLEND is set on the viewport\n * as the blend.\n */\nenum BlendModes {\n /** composite blending - suitable for compositing multiple images */\n COMPOSITE = BlendMode.COMPOSITE_BLEND,\n /** maximum intensity projection */\n MAXIMUM_INTENSITY_BLEND = BlendMode.MAXIMUM_INTENSITY_BLEND,\n /** minimum intensity projection */\n MINIMUM_INTENSITY_BLEND = BlendMode.MINIMUM_INTENSITY_BLEND,\n /** average intensity projection */\n AVERAGE_INTENSITY_BLEND = BlendMode.AVERAGE_INTENSITY_BLEND,\n}\n\nexport default BlendModes;\n","enum OrientationAxis {\n AXIAL = 'axial',\n CORONAL = 'coronal',\n SAGITTAL = 'sagittal',\n ACQUISITION = 'acquisition',\n}\n\nexport default OrientationAxis;\n","/**\n * SharedArrayBuffer Modes\n */\nenum SharedArrayBufferModes {\n TRUE = 'true',\n FALSE = 'false',\n /** use SharedArrayBuffer if avalaible */\n AUTO = 'auto',\n}\n\nexport default SharedArrayBufferModes;\n","enum GeometryType {\n CONTOUR = 'contour',\n}\n\nexport default GeometryType;\n","enum ContourType {\n CLOSED_PLANAR = 'CLOSED_PLANAR',\n OPEN_PLANAR = 'OPEN_PLANAR',\n}\n\nexport default ContourType;\n","/**\n * Interpolation types for image rendering\n */\nenum VOILUTFunctionType {\n LINEAR = 'LINEAR',\n SAMPLED_SIGMOID = 'SIGMOID', // SIGMOID is sampled in 1024 even steps so we call it SAMPLED_SIGMOID\n // EXACT_LINEAR = 'EXACT_LINEAR', TODO: Add EXACT_LINEAR option from DICOM NEMA\n}\n\nexport default VOILUTFunctionType;\n","/**\n * DynamicOperatorType enum for cornerstone-render which defines the operator to use for generateImageFromTimeData.\n * It can be either SUM, AVERAGE or SUBTRACT.\n */\nenum DynamicOperatorType {\n /** For summing the time frames. */\n SUM = 'SUM',\n /** For averaging the time frames. */\n AVERAGE = 'AVERAGE',\n /** For subtracting two time frames */\n SUBTRACT = 'SUBTRACT',\n}\n\nexport default DynamicOperatorType;\n","/**\n * Defines the calibration types available. These define how the units\n * for measurements are specified.\n */\nexport enum CalibrationTypes {\n /**\n * Not applicable means the units are directly defind by the underlying\n * hardware, such as CT and MR volumetric displays, so no special handling\n * or notification is required.\n */\n NOT_APPLICABLE = '',\n /**\n * ERMF is estimated radiographic magnification factor. This defines how\n * much the image is magnified at the detector as opposed to the location in\n * the body of interest. This occurs because the radiation beam is expanding\n * and effectively magnifies the image on the detector compared to where the\n * point of interest in the body is.\n * This suggests that measurements can be partially trusted, but the user\n * still needs to be aware that different depths within the body have differing\n * ERMF values, so precise measurements would still need to be manually calibrated.\n */\n ERMF = 'ERMF',\n /**\n * User calibration means that the user has provided a custom calibration\n * specifying how large the image data is. This type can occur on\n * volumetric images, eg for scout images that might have invalid spacing\n * tags.\n */\n USER = 'User',\n /**\n * A projection calibration means the raw detector size, without any\n * ERMF applied, meaning that the size in the body cannot be trusted and\n * that a calibration should be applied.\n * This is different from Error in that there is simply no magnification\n * factor applied as opposed to having multiple, inconsistent magnification\n * factors.\n */\n PROJECTION = 'Proj',\n /**\n * A region calibration is used for other types of images, typically\n * ultrasouunds where the distance in the image may mean something other than\n * physical distance, such as mV or Hz or some other measurement values.\n */\n REGION = 'Region',\n /**\n * Error is used to define mismatches between various units, such as when\n * there are two different ERMF values specified. This is an indication to\n * NOT trust the measurement values but to manually calibrate.\n */\n ERROR = 'Error',\n /** Uncalibrated image */\n UNCALIBRATED = 'Uncalibrated',\n}\n\nexport default CalibrationTypes;\n","enum ViewportStatus {\n /** Initial state before any volumes or stacks are available*/\n NO_DATA = 'noData',\n /** Stack/volumes are available but are in progress */\n LOADING = 'loading',\n /** Ready to be rendered */\n PRE_RENDER = 'preRender',\n /** In the midst of a resize */\n RESIZE = 'resize',\n /** Rendered image data */\n RENDERED = 'rendered',\n}\n\nexport default ViewportStatus;\n","import { CPUFallbackColormapsData } from '../types';\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palettes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nconst colormapsData: CPUFallbackColormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [\n [0, 0, 0, 255],\n [2, 0, 0, 255],\n [4, 0, 0, 255],\n [6, 0, 0, 255],\n [8, 0, 0, 255],\n [10, 0, 0, 255],\n [12, 0, 0, 255],\n [14, 0, 0, 255],\n [16, 0, 0, 255],\n [18, 0, 0, 255],\n [20, 0, 0, 255],\n [22, 0, 0, 255],\n [24, 0, 0, 255],\n [26, 0, 0, 255],\n [28, 0, 0, 255],\n [30, 0, 0, 255],\n [32, 0, 0, 255],\n [34, 0, 0, 255],\n [36, 0, 0, 255],\n [38, 0, 0, 255],\n [40, 0, 0, 255],\n [42, 0, 0, 255],\n [44, 0, 0, 255],\n [46, 0, 0, 255],\n [48, 0, 0, 255],\n [50, 0, 0, 255],\n [52, 0, 0, 255],\n [54, 0, 0, 255],\n [56, 0, 0, 255],\n [58, 0, 0, 255],\n [60, 0, 0, 255],\n [62, 0, 0, 255],\n [64, 0, 0, 255],\n [66, 0, 0, 255],\n [68, 0, 0, 255],\n [70, 0, 0, 255],\n [72, 0, 0, 255],\n [74, 0, 0, 255],\n [76, 0, 0, 255],\n [78, 0, 0, 255],\n [80, 0, 0, 255],\n [82, 0, 0, 255],\n [84, 0, 0, 255],\n [86, 0, 0, 255],\n [88, 0, 0, 255],\n [90, 0, 0, 255],\n [92, 0, 0, 255],\n [94, 0, 0, 255],\n [96, 0, 0, 255],\n [98, 0, 0, 255],\n [100, 0, 0, 255],\n [102, 0, 0, 255],\n [104, 0, 0, 255],\n [106, 0, 0, 255],\n [108, 0, 0, 255],\n [110, 0, 0, 255],\n [112, 0, 0, 255],\n [114, 0, 0, 255],\n [116, 0, 0, 255],\n [118, 0, 0, 255],\n [120, 0, 0, 255],\n [122, 0, 0, 255],\n [124, 0, 0, 255],\n [126, 0, 0, 255],\n [128, 0, 0, 255],\n [130, 0, 0, 255],\n [132, 0, 0, 255],\n [134, 0, 0, 255],\n [136, 0, 0, 255],\n [138, 0, 0, 255],\n [140, 0, 0, 255],\n [142, 0, 0, 255],\n [144, 0, 0, 255],\n [146, 0, 0, 255],\n [148, 0, 0, 255],\n [150, 0, 0, 255],\n [152, 0, 0, 255],\n [154, 0, 0, 255],\n [156, 0, 0, 255],\n [158, 0, 0, 255],\n [160, 0, 0, 255],\n [162, 0, 0, 255],\n [164, 0, 0, 255],\n [166, 0, 0, 255],\n [168, 0, 0, 255],\n [170, 0, 0, 255],\n [172, 0, 0, 255],\n [174, 0, 0, 255],\n [176, 0, 0, 255],\n [178, 0, 0, 255],\n [180, 0, 0, 255],\n [182, 0, 0, 255],\n [184, 0, 0, 255],\n [186, 0, 0, 255],\n [188, 0, 0, 255],\n [190, 0, 0, 255],\n [192, 0, 0, 255],\n [194, 0, 0, 255],\n [196, 0, 0, 255],\n [198, 0, 0, 255],\n [200, 0, 0, 255],\n [202, 0, 0, 255],\n [204, 0, 0, 255],\n [206, 0, 0, 255],\n [208, 0, 0, 255],\n [210, 0, 0, 255],\n [212, 0, 0, 255],\n [214, 0, 0, 255],\n [216, 0, 0, 255],\n [218, 0, 0, 255],\n [220, 0, 0, 255],\n [222, 0, 0, 255],\n [224, 0, 0, 255],\n [226, 0, 0, 255],\n [228, 0, 0, 255],\n [230, 0, 0, 255],\n [232, 0, 0, 255],\n [234, 0, 0, 255],\n [236, 0, 0, 255],\n [238, 0, 0, 255],\n [240, 0, 0, 255],\n [242, 0, 0, 255],\n [244, 0, 0, 255],\n [246, 0, 0, 255],\n [248, 0, 0, 255],\n [250, 0, 0, 255],\n [252, 0, 0, 255],\n [254, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 2, 0, 255],\n [255, 4, 0, 255],\n [255, 6, 0, 255],\n [255, 8, 0, 255],\n [255, 10, 0, 255],\n [255, 12, 0, 255],\n [255, 14, 0, 255],\n [255, 16, 0, 255],\n [255, 18, 0, 255],\n [255, 20, 0, 255],\n [255, 22, 0, 255],\n [255, 24, 0, 255],\n [255, 26, 0, 255],\n [255, 28, 0, 255],\n [255, 30, 0, 255],\n [255, 32, 0, 255],\n [255, 34, 0, 255],\n [255, 36, 0, 255],\n [255, 38, 0, 255],\n [255, 40, 0, 255],\n [255, 42, 0, 255],\n [255, 44, 0, 255],\n [255, 46, 0, 255],\n [255, 48, 0, 255],\n [255, 50, 0, 255],\n [255, 52, 0, 255],\n [255, 54, 0, 255],\n [255, 56, 0, 255],\n [255, 58, 0, 255],\n [255, 60, 0, 255],\n [255, 62, 0, 255],\n [255, 64, 0, 255],\n [255, 66, 0, 255],\n [255, 68, 0, 255],\n [255, 70, 0, 255],\n [255, 72, 0, 255],\n [255, 74, 0, 255],\n [255, 76, 0, 255],\n [255, 78, 0, 255],\n [255, 80, 0, 255],\n [255, 82, 0, 255],\n [255, 84, 0, 255],\n [255, 86, 0, 255],\n [255, 88, 0, 255],\n [255, 90, 0, 255],\n [255, 92, 0, 255],\n [255, 94, 0, 255],\n [255, 96, 0, 255],\n [255, 98, 0, 255],\n [255, 100, 0, 255],\n [255, 102, 0, 255],\n [255, 104, 0, 255],\n [255, 106, 0, 255],\n [255, 108, 0, 255],\n [255, 110, 0, 255],\n [255, 112, 0, 255],\n [255, 114, 0, 255],\n [255, 116, 0, 255],\n [255, 118, 0, 255],\n [255, 120, 0, 255],\n [255, 122, 0, 255],\n [255, 124, 0, 255],\n [255, 126, 0, 255],\n [255, 128, 4, 255],\n [255, 130, 8, 255],\n [255, 132, 12, 255],\n [255, 134, 16, 255],\n [255, 136, 20, 255],\n [255, 138, 24, 255],\n [255, 140, 28, 255],\n [255, 142, 32, 255],\n [255, 144, 36, 255],\n [255, 146, 40, 255],\n [255, 148, 44, 255],\n [255, 150, 48, 255],\n [255, 152, 52, 255],\n [255, 154, 56, 255],\n [255, 156, 60, 255],\n [255, 158, 64, 255],\n [255, 160, 68, 255],\n [255, 162, 72, 255],\n [255, 164, 76, 255],\n [255, 166, 80, 255],\n [255, 168, 84, 255],\n [255, 170, 88, 255],\n [255, 172, 92, 255],\n [255, 174, 96, 255],\n [255, 176, 100, 255],\n [255, 178, 104, 255],\n [255, 180, 108, 255],\n [255, 182, 112, 255],\n [255, 184, 116, 255],\n [255, 186, 120, 255],\n [255, 188, 124, 255],\n [255, 190, 128, 255],\n [255, 192, 132, 255],\n [255, 194, 136, 255],\n [255, 196, 140, 255],\n [255, 198, 144, 255],\n [255, 200, 148, 255],\n [255, 202, 152, 255],\n [255, 204, 156, 255],\n [255, 206, 160, 255],\n [255, 208, 164, 255],\n [255, 210, 168, 255],\n [255, 212, 172, 255],\n [255, 214, 176, 255],\n [255, 216, 180, 255],\n [255, 218, 184, 255],\n [255, 220, 188, 255],\n [255, 222, 192, 255],\n [255, 224, 196, 255],\n [255, 226, 200, 255],\n [255, 228, 204, 255],\n [255, 230, 208, 255],\n [255, 232, 212, 255],\n [255, 234, 216, 255],\n [255, 236, 220, 255],\n [255, 238, 224, 255],\n [255, 240, 228, 255],\n [255, 242, 232, 255],\n [255, 244, 236, 255],\n [255, 246, 240, 255],\n [255, 248, 244, 255],\n [255, 250, 248, 255],\n [255, 252, 252, 255],\n [255, 255, 255, 255],\n ],\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [\n [0, 0, 0, 255],\n [0, 2, 1, 255],\n [0, 4, 3, 255],\n [0, 6, 5, 255],\n [0, 8, 7, 255],\n [0, 10, 9, 255],\n [0, 12, 11, 255],\n [0, 14, 13, 255],\n [0, 16, 15, 255],\n [0, 18, 17, 255],\n [0, 20, 19, 255],\n [0, 22, 21, 255],\n [0, 24, 23, 255],\n [0, 26, 25, 255],\n [0, 28, 27, 255],\n [0, 30, 29, 255],\n [0, 32, 31, 255],\n [0, 34, 33, 255],\n [0, 36, 35, 255],\n [0, 38, 37, 255],\n [0, 40, 39, 255],\n [0, 42, 41, 255],\n [0, 44, 43, 255],\n [0, 46, 45, 255],\n [0, 48, 47, 255],\n [0, 50, 49, 255],\n [0, 52, 51, 255],\n [0, 54, 53, 255],\n [0, 56, 55, 255],\n [0, 58, 57, 255],\n [0, 60, 59, 255],\n [0, 62, 61, 255],\n [0, 65, 63, 255],\n [0, 67, 65, 255],\n [0, 69, 67, 255],\n [0, 71, 69, 255],\n [0, 73, 71, 255],\n [0, 75, 73, 255],\n [0, 77, 75, 255],\n [0, 79, 77, 255],\n [0, 81, 79, 255],\n [0, 83, 81, 255],\n [0, 85, 83, 255],\n [0, 87, 85, 255],\n [0, 89, 87, 255],\n [0, 91, 89, 255],\n [0, 93, 91, 255],\n [0, 95, 93, 255],\n [0, 97, 95, 255],\n [0, 99, 97, 255],\n [0, 101, 99, 255],\n [0, 103, 101, 255],\n [0, 105, 103, 255],\n [0, 107, 105, 255],\n [0, 109, 107, 255],\n [0, 111, 109, 255],\n [0, 113, 111, 255],\n [0, 115, 113, 255],\n [0, 117, 115, 255],\n [0, 119, 117, 255],\n [0, 121, 119, 255],\n [0, 123, 121, 255],\n [0, 125, 123, 255],\n [0, 128, 125, 255],\n [1, 126, 127, 255],\n [3, 124, 129, 255],\n [5, 122, 131, 255],\n [7, 120, 133, 255],\n [9, 118, 135, 255],\n [11, 116, 137, 255],\n [13, 114, 139, 255],\n [15, 112, 141, 255],\n [17, 110, 143, 255],\n [19, 108, 145, 255],\n [21, 106, 147, 255],\n [23, 104, 149, 255],\n [25, 102, 151, 255],\n [27, 100, 153, 255],\n [29, 98, 155, 255],\n [31, 96, 157, 255],\n [33, 94, 159, 255],\n [35, 92, 161, 255],\n [37, 90, 163, 255],\n [39, 88, 165, 255],\n [41, 86, 167, 255],\n [43, 84, 169, 255],\n [45, 82, 171, 255],\n [47, 80, 173, 255],\n [49, 78, 175, 255],\n [51, 76, 177, 255],\n [53, 74, 179, 255],\n [55, 72, 181, 255],\n [57, 70, 183, 255],\n [59, 68, 185, 255],\n [61, 66, 187, 255],\n [63, 64, 189, 255],\n [65, 63, 191, 255],\n [67, 61, 193, 255],\n [69, 59, 195, 255],\n [71, 57, 197, 255],\n [73, 55, 199, 255],\n [75, 53, 201, 255],\n [77, 51, 203, 255],\n [79, 49, 205, 255],\n [81, 47, 207, 255],\n [83, 45, 209, 255],\n [85, 43, 211, 255],\n [86, 41, 213, 255],\n [88, 39, 215, 255],\n [90, 37, 217, 255],\n [92, 35, 219, 255],\n [94, 33, 221, 255],\n [96, 31, 223, 255],\n [98, 29, 225, 255],\n [100, 27, 227, 255],\n [102, 25, 229, 255],\n [104, 23, 231, 255],\n [106, 21, 233, 255],\n [108, 19, 235, 255],\n [110, 17, 237, 255],\n [112, 15, 239, 255],\n [114, 13, 241, 255],\n [116, 11, 243, 255],\n [118, 9, 245, 255],\n [120, 7, 247, 255],\n [122, 5, 249, 255],\n [124, 3, 251, 255],\n [126, 1, 253, 255],\n [128, 0, 255, 255],\n [130, 2, 252, 255],\n [132, 4, 248, 255],\n [134, 6, 244, 255],\n [136, 8, 240, 255],\n [138, 10, 236, 255],\n [140, 12, 232, 255],\n [142, 14, 228, 255],\n [144, 16, 224, 255],\n [146, 18, 220, 255],\n [148, 20, 216, 255],\n [150, 22, 212, 255],\n [152, 24, 208, 255],\n [154, 26, 204, 255],\n [156, 28, 200, 255],\n [158, 30, 196, 255],\n [160, 32, 192, 255],\n [162, 34, 188, 255],\n [164, 36, 184, 255],\n [166, 38, 180, 255],\n [168, 40, 176, 255],\n [170, 42, 172, 255],\n [171, 44, 168, 255],\n [173, 46, 164, 255],\n [175, 48, 160, 255],\n [177, 50, 156, 255],\n [179, 52, 152, 255],\n [181, 54, 148, 255],\n [183, 56, 144, 255],\n [185, 58, 140, 255],\n [187, 60, 136, 255],\n [189, 62, 132, 255],\n [191, 64, 128, 255],\n [193, 66, 124, 255],\n [195, 68, 120, 255],\n [197, 70, 116, 255],\n [199, 72, 112, 255],\n [201, 74, 108, 255],\n [203, 76, 104, 255],\n [205, 78, 100, 255],\n [207, 80, 96, 255],\n [209, 82, 92, 255],\n [211, 84, 88, 255],\n [213, 86, 84, 255],\n [215, 88, 80, 255],\n [217, 90, 76, 255],\n [219, 92, 72, 255],\n [221, 94, 68, 255],\n [223, 96, 64, 255],\n [225, 98, 60, 255],\n [227, 100, 56, 255],\n [229, 102, 52, 255],\n [231, 104, 48, 255],\n [233, 106, 44, 255],\n [235, 108, 40, 255],\n [237, 110, 36, 255],\n [239, 112, 32, 255],\n [241, 114, 28, 255],\n [243, 116, 24, 255],\n [245, 118, 20, 255],\n [247, 120, 16, 255],\n [249, 122, 12, 255],\n [251, 124, 8, 255],\n [253, 126, 4, 255],\n [255, 128, 0, 255],\n [255, 130, 4, 255],\n [255, 132, 8, 255],\n [255, 134, 12, 255],\n [255, 136, 16, 255],\n [255, 138, 20, 255],\n [255, 140, 24, 255],\n [255, 142, 28, 255],\n [255, 144, 32, 255],\n [255, 146, 36, 255],\n [255, 148, 40, 255],\n [255, 150, 44, 255],\n [255, 152, 48, 255],\n [255, 154, 52, 255],\n [255, 156, 56, 255],\n [255, 158, 60, 255],\n [255, 160, 64, 255],\n [255, 162, 68, 255],\n [255, 164, 72, 255],\n [255, 166, 76, 255],\n [255, 168, 80, 255],\n [255, 170, 85, 255],\n [255, 172, 89, 255],\n [255, 174, 93, 255],\n [255, 176, 97, 255],\n [255, 178, 101, 255],\n [255, 180, 105, 255],\n [255, 182, 109, 255],\n [255, 184, 113, 255],\n [255, 186, 117, 255],\n [255, 188, 121, 255],\n [255, 190, 125, 255],\n [255, 192, 129, 255],\n [255, 194, 133, 255],\n [255, 196, 137, 255],\n [255, 198, 141, 255],\n [255, 200, 145, 255],\n [255, 202, 149, 255],\n [255, 204, 153, 255],\n [255, 206, 157, 255],\n [255, 208, 161, 255],\n [255, 210, 165, 255],\n [255, 212, 170, 255],\n [255, 214, 174, 255],\n [255, 216, 178, 255],\n [255, 218, 182, 255],\n [255, 220, 186, 255],\n [255, 222, 190, 255],\n [255, 224, 194, 255],\n [255, 226, 198, 255],\n [255, 228, 202, 255],\n [255, 230, 206, 255],\n [255, 232, 210, 255],\n [255, 234, 214, 255],\n [255, 236, 218, 255],\n [255, 238, 222, 255],\n [255, 240, 226, 255],\n [255, 242, 230, 255],\n [255, 244, 234, 255],\n [255, 246, 238, 255],\n [255, 248, 242, 255],\n [255, 250, 246, 255],\n [255, 252, 250, 255],\n [255, 255, 255, 255],\n ],\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [\n [0, 0, 0, 255],\n [0, 0, 2, 255],\n [0, 0, 4, 255],\n [0, 0, 6, 255],\n [0, 0, 8, 255],\n [0, 0, 10, 255],\n [0, 0, 12, 255],\n [0, 0, 14, 255],\n [0, 0, 16, 255],\n [0, 0, 17, 255],\n [0, 0, 19, 255],\n [0, 0, 21, 255],\n [0, 0, 23, 255],\n [0, 0, 25, 255],\n [0, 0, 27, 255],\n [0, 0, 29, 255],\n [0, 0, 31, 255],\n [0, 0, 33, 255],\n [0, 0, 35, 255],\n [0, 0, 37, 255],\n [0, 0, 39, 255],\n [0, 0, 41, 255],\n [0, 0, 43, 255],\n [0, 0, 45, 255],\n [0, 0, 47, 255],\n [0, 0, 49, 255],\n [0, 0, 51, 255],\n [0, 0, 53, 255],\n [0, 0, 55, 255],\n [0, 0, 57, 255],\n [0, 0, 59, 255],\n [0, 0, 61, 255],\n [0, 0, 63, 255],\n [0, 0, 65, 255],\n [0, 0, 67, 255],\n [0, 0, 69, 255],\n [0, 0, 71, 255],\n [0, 0, 73, 255],\n [0, 0, 75, 255],\n [0, 0, 77, 255],\n [0, 0, 79, 255],\n [0, 0, 81, 255],\n [0, 0, 83, 255],\n [0, 0, 84, 255],\n [0, 0, 86, 255],\n [0, 0, 88, 255],\n [0, 0, 90, 255],\n [0, 0, 92, 255],\n [0, 0, 94, 255],\n [0, 0, 96, 255],\n [0, 0, 98, 255],\n [0, 0, 100, 255],\n [0, 0, 102, 255],\n [0, 0, 104, 255],\n [0, 0, 106, 255],\n [0, 0, 108, 255],\n [0, 0, 110, 255],\n [0, 0, 112, 255],\n [0, 0, 114, 255],\n [0, 0, 116, 255],\n [0, 0, 117, 255],\n [0, 0, 119, 255],\n [0, 0, 121, 255],\n [0, 0, 123, 255],\n [0, 0, 125, 255],\n [0, 0, 127, 255],\n [0, 0, 129, 255],\n [0, 0, 131, 255],\n [0, 0, 133, 255],\n [0, 0, 135, 255],\n [0, 0, 137, 255],\n [0, 0, 139, 255],\n [0, 0, 141, 255],\n [0, 0, 143, 255],\n [0, 0, 145, 255],\n [0, 0, 147, 255],\n [0, 0, 149, 255],\n [0, 0, 151, 255],\n [0, 0, 153, 255],\n [0, 0, 155, 255],\n [0, 0, 157, 255],\n [0, 0, 159, 255],\n [0, 0, 161, 255],\n [0, 0, 163, 255],\n [0, 0, 165, 255],\n [0, 0, 167, 255],\n [3, 0, 169, 255],\n [6, 0, 171, 255],\n [9, 0, 173, 255],\n [12, 0, 175, 255],\n [15, 0, 177, 255],\n [18, 0, 179, 255],\n [21, 0, 181, 255],\n [24, 0, 183, 255],\n [26, 0, 184, 255],\n [29, 0, 186, 255],\n [32, 0, 188, 255],\n [35, 0, 190, 255],\n [38, 0, 192, 255],\n [41, 0, 194, 255],\n [44, 0, 196, 255],\n [47, 0, 198, 255],\n [50, 0, 200, 255],\n [52, 0, 197, 255],\n [55, 0, 194, 255],\n [57, 0, 191, 255],\n [59, 0, 188, 255],\n [62, 0, 185, 255],\n [64, 0, 182, 255],\n [66, 0, 179, 255],\n [69, 0, 176, 255],\n [71, 0, 174, 255],\n [74, 0, 171, 255],\n [76, 0, 168, 255],\n [78, 0, 165, 255],\n [81, 0, 162, 255],\n [83, 0, 159, 255],\n [85, 0, 156, 255],\n [88, 0, 153, 255],\n [90, 0, 150, 255],\n [93, 2, 144, 255],\n [96, 4, 138, 255],\n [99, 6, 132, 255],\n [102, 8, 126, 255],\n [105, 9, 121, 255],\n [108, 11, 115, 255],\n [111, 13, 109, 255],\n [114, 15, 103, 255],\n [116, 17, 97, 255],\n [119, 19, 91, 255],\n [122, 21, 85, 255],\n [125, 23, 79, 255],\n [128, 24, 74, 255],\n [131, 26, 68, 255],\n [134, 28, 62, 255],\n [137, 30, 56, 255],\n [140, 32, 50, 255],\n [143, 34, 47, 255],\n [146, 36, 44, 255],\n [149, 38, 41, 255],\n [152, 40, 38, 255],\n [155, 41, 35, 255],\n [158, 43, 32, 255],\n [161, 45, 29, 255],\n [164, 47, 26, 255],\n [166, 49, 24, 255],\n [169, 51, 21, 255],\n [172, 53, 18, 255],\n [175, 55, 15, 255],\n [178, 56, 12, 255],\n [181, 58, 9, 255],\n [184, 60, 6, 255],\n [187, 62, 3, 255],\n [190, 64, 0, 255],\n [194, 66, 0, 255],\n [198, 68, 0, 255],\n [201, 70, 0, 255],\n [205, 72, 0, 255],\n [209, 73, 0, 255],\n [213, 75, 0, 255],\n [217, 77, 0, 255],\n [221, 79, 0, 255],\n [224, 81, 0, 255],\n [228, 83, 0, 255],\n [232, 85, 0, 255],\n [236, 87, 0, 255],\n [240, 88, 0, 255],\n [244, 90, 0, 255],\n [247, 92, 0, 255],\n [251, 94, 0, 255],\n [255, 96, 0, 255],\n [255, 98, 3, 255],\n [255, 100, 6, 255],\n [255, 102, 9, 255],\n [255, 104, 12, 255],\n [255, 105, 15, 255],\n [255, 107, 18, 255],\n [255, 109, 21, 255],\n [255, 111, 24, 255],\n [255, 113, 26, 255],\n [255, 115, 29, 255],\n [255, 117, 32, 255],\n [255, 119, 35, 255],\n [255, 120, 38, 255],\n [255, 122, 41, 255],\n [255, 124, 44, 255],\n [255, 126, 47, 255],\n [255, 128, 50, 255],\n [255, 130, 53, 255],\n [255, 132, 56, 255],\n [255, 134, 59, 255],\n [255, 136, 62, 255],\n [255, 137, 65, 255],\n [255, 139, 68, 255],\n [255, 141, 71, 255],\n [255, 143, 74, 255],\n [255, 145, 76, 255],\n [255, 147, 79, 255],\n [255, 149, 82, 255],\n [255, 151, 85, 255],\n [255, 152, 88, 255],\n [255, 154, 91, 255],\n [255, 156, 94, 255],\n [255, 158, 97, 255],\n [255, 160, 100, 255],\n [255, 162, 103, 255],\n [255, 164, 106, 255],\n [255, 166, 109, 255],\n [255, 168, 112, 255],\n [255, 169, 115, 255],\n [255, 171, 118, 255],\n [255, 173, 121, 255],\n [255, 175, 124, 255],\n [255, 177, 126, 255],\n [255, 179, 129, 255],\n [255, 181, 132, 255],\n [255, 183, 135, 255],\n [255, 184, 138, 255],\n [255, 186, 141, 255],\n [255, 188, 144, 255],\n [255, 190, 147, 255],\n [255, 192, 150, 255],\n [255, 194, 153, 255],\n [255, 196, 156, 255],\n [255, 198, 159, 255],\n [255, 200, 162, 255],\n [255, 201, 165, 255],\n [255, 203, 168, 255],\n [255, 205, 171, 255],\n [255, 207, 174, 255],\n [255, 209, 176, 255],\n [255, 211, 179, 255],\n [255, 213, 182, 255],\n [255, 215, 185, 255],\n [255, 216, 188, 255],\n [255, 218, 191, 255],\n [255, 220, 194, 255],\n [255, 222, 197, 255],\n [255, 224, 200, 255],\n [255, 226, 203, 255],\n [255, 228, 206, 255],\n [255, 229, 210, 255],\n [255, 231, 213, 255],\n [255, 233, 216, 255],\n [255, 235, 219, 255],\n [255, 237, 223, 255],\n [255, 239, 226, 255],\n [255, 240, 229, 255],\n [255, 242, 232, 255],\n [255, 244, 236, 255],\n [255, 246, 239, 255],\n [255, 248, 242, 255],\n [255, 250, 245, 255],\n [255, 251, 249, 255],\n [255, 253, 252, 255],\n [255, 255, 255, 255],\n ],\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [0, 0, 0, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [96, 0, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 80, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [48, 48, 112, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [80, 80, 128, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [96, 96, 176, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [112, 112, 192, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [128, 128, 224, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 96, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [48, 144, 48, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [80, 192, 80, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [64, 224, 64, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [224, 224, 80, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 208, 96, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 176, 64, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [208, 144, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [192, 96, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [176, 48, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 0, 0, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n [255, 255, 255, 255],\n ],\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n blue: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n },\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [0.35, 0, 0],\n [0.66, 1, 1],\n [0.89, 1, 1],\n [1, 0.5, 0.5],\n ],\n green: [\n [0, 0, 0],\n [0.125, 0, 0],\n [0.375, 1, 1],\n [0.64, 1, 1],\n [0.91, 0, 0],\n [1, 0, 0],\n ],\n blue: [\n [0, 0.5, 0.5],\n [0.11, 1, 1],\n [0.34, 1, 1],\n [0.65, 0, 0],\n [1, 0, 0],\n ],\n },\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 1, 1],\n [0.15873, 1, 1],\n [0.174603, 0.96875, 0.96875],\n [0.333333, 0.03125, 0.03125],\n [0.349206, 0, 0],\n [0.666667, 0, 0],\n [0.68254, 0.03125, 0.03125],\n [0.84127, 0.96875, 0.96875],\n [0.857143, 1, 1],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [0.15873, 0.9375, 0.9375],\n [0.174603, 1, 1],\n [0.507937, 1, 1],\n [0.666667, 0.0625, 0.0625],\n [0.68254, 0, 0],\n [1, 0, 0],\n ],\n blue: [\n [0, 0, 0],\n [0.333333, 0, 0],\n [0.349206, 0.0625, 0.0625],\n [0.507937, 1, 1],\n [0.84127, 1, 1],\n [0.857143, 0.9375, 0.9375],\n [1, 0.09375, 0.09375],\n ],\n },\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0.0416, 0.0416],\n [0.365079, 1, 1],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [0.365079, 0, 0],\n [0.746032, 1, 1],\n [1, 1, 1],\n ],\n blue: [\n [0, 0, 0],\n [0.746032, 0, 0],\n [1, 1, 1],\n ],\n },\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n green: [\n [0, 1, 1],\n [1, 0, 0],\n ],\n blue: [\n [0, 1, 1],\n [1, 1, 1],\n ],\n },\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 1, 1],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n blue: [\n [0, 1, 1],\n [1, 0, 0],\n ],\n },\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n green: [\n [0, 0.5, 0.5],\n [1, 1, 1],\n ],\n blue: [\n [0, 0.4, 0.4],\n [1, 0.4, 0.4],\n ],\n },\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 1, 1],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n blue: [\n [0, 0, 0],\n [1, 0, 0],\n ],\n },\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [1, 0, 0],\n ],\n green: [\n [0, 0, 0],\n [1, 1, 1],\n ],\n blue: [\n [0, 1, 1],\n [1, 0.5, 0.5],\n ],\n },\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [0.746032, 0.652778, 0.652778],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [0.365079, 0.319444, 0.319444],\n [0.746032, 0.777778, 0.777778],\n [1, 1, 1],\n ],\n blue: [\n [0, 0, 0],\n [0.365079, 0.444444, 0.444444],\n [1, 1, 1],\n ],\n },\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [0.809524, 1, 1],\n [1, 1, 1],\n ],\n green: [\n [0, 0, 0],\n [1, 0.7812, 0.7812],\n ],\n blue: [\n [0, 0, 0],\n [1, 0.4975, 0.4975],\n ],\n },\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0, 0],\n [0.05, 0.4667, 0.4667],\n [0.1, 0.5333, 0.5333],\n [0.15, 0, 0],\n [0.2, 0, 0],\n [0.25, 0, 0],\n [0.3, 0, 0],\n [0.35, 0, 0],\n [0.4, 0, 0],\n [0.45, 0, 0],\n [0.5, 0, 0],\n [0.55, 0, 0],\n [0.6, 0, 0],\n [0.65, 0.7333, 0.7333],\n [0.7, 0.9333, 0.9333],\n [0.75, 1, 1],\n [0.8, 1, 1],\n [0.85, 1, 1],\n [0.9, 0.8667, 0.8667],\n [0.95, 0.8, 0.8],\n [1, 0.8, 0.8],\n ],\n green: [\n [0, 0, 0],\n [0.05, 0, 0],\n [0.1, 0, 0],\n [0.15, 0, 0],\n [0.2, 0, 0],\n [0.25, 0.4667, 0.4667],\n [0.3, 0.6, 0.6],\n [0.35, 0.6667, 0.6667],\n [0.4, 0.6667, 0.6667],\n [0.45, 0.6, 0.6],\n [0.5, 0.7333, 0.7333],\n [0.55, 0.8667, 0.8667],\n [0.6, 1, 1],\n [0.65, 1, 1],\n [0.7, 0.9333, 0.9333],\n [0.75, 0.8, 0.8],\n [0.8, 0.6, 0.6],\n [0.85, 0, 0],\n [0.9, 0, 0],\n [0.95, 0, 0],\n [1, 0.8, 0.8],\n ],\n blue: [\n [0, 0, 0],\n [0.05, 0.5333, 0.5333],\n [0.1, 0.6, 0.6],\n [0.15, 0.6667, 0.6667],\n [0.2, 0.8667, 0.8667],\n [0.25, 0.8667, 0.8667],\n [0.3, 0.8667, 0.8667],\n [0.35, 0.6667, 0.6667],\n [0.4, 0.5333, 0.5333],\n [0.45, 0, 0],\n [0.5, 0, 0],\n [0.55, 0, 0],\n [0.6, 0, 0],\n [0.65, 0, 0],\n [0.7, 0, 0],\n [0.75, 0, 0],\n [0.8, 0, 0],\n [0.85, 0, 0],\n [0.9, 0, 0],\n [0.95, 0, 0],\n [1, 0.8, 0.8],\n ],\n },\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0.2298057, 0.2298057],\n [0.03125, 0.26623388, 0.26623388],\n [0.0625, 0.30386891, 0.30386891],\n [0.09375, 0.342804478, 0.342804478],\n [0.125, 0.38301334, 0.38301334],\n [0.15625, 0.424369608, 0.424369608],\n [0.1875, 0.46666708, 0.46666708],\n [0.21875, 0.509635204, 0.509635204],\n [0.25, 0.552953156, 0.552953156],\n [0.28125, 0.596262162, 0.596262162],\n [0.3125, 0.639176211, 0.639176211],\n [0.34375, 0.681291281, 0.681291281],\n [0.375, 0.722193294, 0.722193294],\n [0.40625, 0.761464949, 0.761464949],\n [0.4375, 0.798691636, 0.798691636],\n [0.46875, 0.833466556, 0.833466556],\n [0.5, 0.865395197, 0.865395197],\n [0.53125, 0.897787179, 0.897787179],\n [0.5625, 0.924127593, 0.924127593],\n [0.59375, 0.944468518, 0.944468518],\n [0.625, 0.958852946, 0.958852946],\n [0.65625, 0.96732803, 0.96732803],\n [0.6875, 0.969954137, 0.969954137],\n [0.71875, 0.966811177, 0.966811177],\n [0.75, 0.958003065, 0.958003065],\n [0.78125, 0.943660866, 0.943660866],\n [0.8125, 0.923944917, 0.923944917],\n [0.84375, 0.89904617, 0.89904617],\n [0.875, 0.869186849, 0.869186849],\n [0.90625, 0.834620542, 0.834620542],\n [0.9375, 0.795631745, 0.795631745],\n [0.96875, 0.752534934, 0.752534934],\n [1, 0.705673158, 0.705673158],\n ],\n green: [\n [0, 0.298717966, 0.298717966],\n [0.03125, 0.353094838, 0.353094838],\n [0.0625, 0.406535296, 0.406535296],\n [0.09375, 0.458757618, 0.458757618],\n [0.125, 0.50941904, 0.50941904],\n [0.15625, 0.558148092, 0.558148092],\n [0.1875, 0.604562568, 0.604562568],\n [0.21875, 0.648280772, 0.648280772],\n [0.25, 0.688929332, 0.688929332],\n [0.28125, 0.726149107, 0.726149107],\n [0.3125, 0.759599947, 0.759599947],\n [0.34375, 0.788964712, 0.788964712],\n [0.375, 0.813952739, 0.813952739],\n [0.40625, 0.834302879, 0.834302879],\n [0.4375, 0.849786142, 0.849786142],\n [0.46875, 0.860207984, 0.860207984],\n [0.5, 0.86541021, 0.86541021],\n [0.53125, 0.848937047, 0.848937047],\n [0.5625, 0.827384882, 0.827384882],\n [0.59375, 0.800927443, 0.800927443],\n [0.625, 0.769767752, 0.769767752],\n [0.65625, 0.734132809, 0.734132809],\n [0.6875, 0.694266682, 0.694266682],\n [0.71875, 0.650421156, 0.650421156],\n [0.75, 0.602842431, 0.602842431],\n [0.78125, 0.551750968, 0.551750968],\n [0.8125, 0.49730856, 0.49730856],\n [0.84375, 0.439559467, 0.439559467],\n [0.875, 0.378313092, 0.378313092],\n [0.90625, 0.312874446, 0.312874446],\n [0.9375, 0.24128379, 0.24128379],\n [0.96875, 0.157246067, 0.157246067],\n [1, 0.01555616, 0.01555616],\n ],\n blue: [\n [0, 0.753683153, 0.753683153],\n [0.03125, 0.801466763, 0.801466763],\n [0.0625, 0.84495867, 0.84495867],\n [0.09375, 0.883725899, 0.883725899],\n [0.125, 0.917387822, 0.917387822],\n [0.15625, 0.945619588, 0.945619588],\n [0.1875, 0.968154911, 0.968154911],\n [0.21875, 0.98478814, 0.98478814],\n [0.25, 0.995375608, 0.995375608],\n [0.28125, 0.999836203, 0.999836203],\n [0.3125, 0.998151185, 0.998151185],\n [0.34375, 0.990363227, 0.990363227],\n [0.375, 0.976574709, 0.976574709],\n [0.40625, 0.956945269, 0.956945269],\n [0.4375, 0.931688648, 0.931688648],\n [0.46875, 0.901068838, 0.901068838],\n [0.5, 0.865395561, 0.865395561],\n [0.53125, 0.820880546, 0.820880546],\n [0.5625, 0.774508472, 0.774508472],\n [0.59375, 0.726736146, 0.726736146],\n [0.625, 0.678007945, 0.678007945],\n [0.65625, 0.628751763, 0.628751763],\n [0.6875, 0.579375448, 0.579375448],\n [0.71875, 0.530263762, 0.530263762],\n [0.75, 0.481775914, 0.481775914],\n [0.78125, 0.434243684, 0.434243684],\n [0.8125, 0.387970225, 0.387970225],\n [0.84375, 0.343229596, 0.343229596],\n [0.875, 0.300267182, 0.300267182],\n [0.90625, 0.259301199, 0.259301199],\n [0.9375, 0.220525627, 0.220525627],\n [0.96875, 0.184115123, 0.184115123],\n [1, 0.150232812, 0.150232812],\n ],\n },\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [\n [0, 0.9686274528503418, 0.9686274528503418],\n [0.125, 0.87058824300765991, 0.87058824300765991],\n [0.25, 0.7764706015586853, 0.7764706015586853],\n [0.375, 0.61960786581039429, 0.61960786581039429],\n [0.5, 0.41960784792900085, 0.41960784792900085],\n [0.625, 0.25882354378700256, 0.25882354378700256],\n [0.75, 0.12941177189350128, 0.12941177189350128],\n [0.875, 0.031372550874948502, 0.031372550874948502],\n [1, 0.031372550874948502, 0.031372550874948502],\n ],\n green: [\n [0, 0.9843137264251709, 0.9843137264251709],\n [0.125, 0.92156863212585449, 0.92156863212585449],\n [0.25, 0.85882353782653809, 0.85882353782653809],\n [0.375, 0.7921568751335144, 0.7921568751335144],\n [0.5, 0.68235296010971069, 0.68235296010971069],\n [0.625, 0.57254904508590698, 0.57254904508590698],\n [0.75, 0.44313725829124451, 0.44313725829124451],\n [0.875, 0.31764706969261169, 0.31764706969261169],\n [1, 0.18823529779911041, 0.18823529779911041],\n ],\n blue: [\n [0, 1, 1],\n [0.125, 0.9686274528503418, 0.9686274528503418],\n [0.25, 0.93725490570068359, 0.93725490570068359],\n [0.375, 0.88235294818878174, 0.88235294818878174],\n [0.5, 0.83921569585800171, 0.83921569585800171],\n [0.625, 0.7764706015586853, 0.7764706015586853],\n [0.75, 0.70980393886566162, 0.70980393886566162],\n [0.875, 0.61176472902297974, 0.61176472902297974],\n [1, 0.41960784792900085, 0.41960784792900085],\n ],\n },\n },\n};\n\nexport default colormapsData;\n","const RENDERING_DEFAULTS = {\n MINIMUM_SLAB_THICKNESS: 5e-2,\n MAXIMUM_RAY_DISTANCE: 1e6,\n};\n\nObject.freeze(RENDERING_DEFAULTS);\n\nexport default RENDERING_DEFAULTS;\n","const EPSILON = 1e-3;\n\nexport default EPSILON;\n","// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#examples\nfunction deepFreeze(object) {\n // Retrieve the property names defined on object\n const propNames = Object.getOwnPropertyNames(object);\n\n // Freeze properties before freezing self\n\n for (const name of propNames) {\n const value = object[name];\n\n if (value && typeof value === 'object') {\n deepFreeze(value);\n }\n }\n\n return Object.freeze(object);\n}\n\nexport default deepFreeze;\n","import deepFreeze from '../utilities/deepFreeze';\n\nconst MPR_CAMERA_VALUES = {\n axial: {\n viewPlaneNormal: [0, 0, -1],\n viewUp: [0, -1, 0],\n },\n sagittal: {\n viewPlaneNormal: [1, 0, 0],\n viewUp: [0, 0, 1],\n },\n coronal: {\n viewPlaneNormal: [0, -1, 0],\n viewUp: [0, 0, 1],\n },\n};\n\n// Note: Object.freeze is only shallow, so we need to deepFreeze\nconst mprCameraValues = deepFreeze(MPR_CAMERA_VALUES);\nexport default mprCameraValues;\n","import { ViewportPreset } from '../types';\n\nconst presets: ViewportPreset[] = [\n {\n name: 'CT-AAA',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '12 -3024 0 143.556 0 166.222 0.686275 214.389 0.696078 419.736 0.833333 3071 0.803922',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '24 -3024 0 0 0 143.556 0.615686 0.356863 0.184314 166.222 0.882353 0.603922 0.290196 214.389 1 1 1 419.736 1 0.937033 0.954531 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-AAA2',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '16 -3024 0 129.542 0 145.244 0.166667 157.02 0.5 169.918 0.627451 395.575 0.8125 1578.73 0.8125 3071 0.8125',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '32 -3024 0 0 0 129.542 0.54902 0.25098 0.14902 145.244 0.6 0.627451 0.843137 157.02 0.890196 0.47451 0.6 169.918 0.992157 0.870588 0.392157 395.575 1 0.886275 0.658824 1578.73 1 0.829256 0.957922 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Bone',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity: '8 -3024 0 -16.4458 0 641.385 0.715686 3071 0.705882',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '16 -3024 0 0 0 -16.4458 0.729412 0.254902 0.301961 641.385 0.905882 0.815686 0.552941 3071 1 1 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Bones',\n gradientOpacity: '4 0 1 985.12 1',\n specularPower: '1',\n scalarOpacity: '8 -1000 0 152.19 0 278.93 0.190476 952 0.2',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '20 -1000 0.3 0.3 1 -488 0.3 1 0.3 463.28 1 0 0 659.15 1 0.912535 0.0374849 953 1 0.3 0.3',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Cardiac',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '12 -3024 0 -77.6875 0 94.9518 0.285714 179.052 0.553571 260.439 0.848214 3071 0.875',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '24 -3024 0 0 0 -77.6875 0.54902 0.25098 0.14902 94.9518 0.882353 0.603922 0.290196 179.052 1 0.937033 0.954531 260.439 0.615686 0 0 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Cardiac2',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '12 -3024 0 42.8964 0 163.488 0.428571 277.642 0.776786 1587 0.754902 3071 0.754902',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '24 -3024 0 0 0 42.8964 0.54902 0.25098 0.14902 163.488 0.917647 0.639216 0.0588235 277.642 1 0.878431 0.623529 1587 1 1 1 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Cardiac3',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '14 -3024 0 -86.9767 0 45.3791 0.169643 139.919 0.589286 347.907 0.607143 1224.16 0.607143 3071 0.616071',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '28 -3024 0 0 0 -86.9767 0 0.25098 1 45.3791 1 0 0 139.919 1 0.894893 0.894893 347.907 1 1 0.25098 1224.16 1 1 1 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Chest-Contrast-Enhanced',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '10 -3024 0 67.0106 0 251.105 0.446429 439.291 0.625 3071 0.616071',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '20 -3024 0 0 0 67.0106 0.54902 0.25098 0.14902 251.105 0.882353 0.603922 0.290196 439.291 1 0.937033 0.954531 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Chest-Vessels',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity:\n '10 -3024 0 -1278.35 0 22.8277 0.428571 439.291 0.625 3071 0.616071',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '20 -3024 0 0 0 -1278.35 0.54902 0.25098 0.14902 22.8277 0.882353 0.603922 0.290196 439.291 1 0.937033 0.954531 3071 0.827451 0.658824 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Coronary-Arteries',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity:\n '12 -2048 0 136.47 0 159.215 0.258929 318.43 0.571429 478.693 0.776786 3661 1',\n specular: '0',\n shade: '0',\n ambient: '0.2',\n colorTransfer:\n '24 -2048 0 0 0 136.47 0 0 0 159.215 0.159804 0.159804 0.159804 318.43 0.764706 0.764706 0.764706 478.693 1 1 1 3661 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Coronary-Arteries-2',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity:\n '14 -2048 0 142.677 0 145.016 0.116071 192.174 0.5625 217.24 0.776786 384.347 0.830357 3661 0.830357',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '28 -2048 0 0 0 142.677 0 0 0 145.016 0.615686 0 0.0156863 192.174 0.909804 0.454902 0 217.24 0.972549 0.807843 0.611765 384.347 0.909804 0.909804 1 3661 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Coronary-Arteries-3',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '14 -2048 0 128.643 0 129.982 0.0982143 173.636 0.669643 255.884 0.857143 584.878 0.866071 3661 1',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '28 -2048 0 0 0 128.643 0 0 0 129.982 0.615686 0 0.0156863 173.636 0.909804 0.454902 0 255.884 0.886275 0.886275 0.886275 584.878 0.968627 0.968627 0.968627 3661 1 1 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Cropped-Volume-Bone',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity: '10 -2048 0 -451 0 -450 1 1050 1 3661 1',\n specular: '0',\n shade: '0',\n ambient: '0.2',\n colorTransfer:\n '20 -2048 0 0 0 -451 0 0 0 -450 0.0556356 0.0556356 0.0556356 1050 1 1 1 3661 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Fat',\n gradientOpacity: '6 0 1 985.12 1 988 1',\n specularPower: '1',\n scalarOpacity: '14 -1000 0 -100 0 -99 0.15 -60 0.15 -59 0 101.2 0 952 0',\n specular: '0',\n shade: '0',\n ambient: '0.2',\n colorTransfer:\n '36 -1000 0.3 0.3 1 -497.5 0.3 1 0.3 -99 0 0 1 -76.946 0 1 0 -65.481 0.835431 0.888889 0.0165387 83.89 1 0 0 463.28 1 0 0 659.15 1 0.912535 0.0374849 2952 1 0.300267 0.299886',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Liver-Vasculature',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity:\n '14 -2048 0 149.113 0 157.884 0.482143 339.96 0.660714 388.526 0.830357 1197.95 0.839286 3661 0.848214',\n specular: '0',\n shade: '0',\n ambient: '0.2',\n colorTransfer:\n '28 -2048 0 0 0 149.113 0 0 0 157.884 0.501961 0.25098 0 339.96 0.695386 0.59603 0.36886 388.526 0.854902 0.85098 0.827451 1197.95 1 1 1 3661 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Lung',\n gradientOpacity: '6 0 1 985.12 1 988 1',\n specularPower: '1',\n scalarOpacity: '12 -1000 0 -600 0 -599 0.15 -400 0.15 -399 0 2952 0',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '24 -1000 0.3 0.3 1 -600 0 0 1 -530 0.134704 0.781726 0.0724558 -460 0.929244 1 0.109473 -400 0.888889 0.254949 0.0240258 2952 1 0.3 0.3',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-MIP',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity: '8 -3024 0 -637.62 0 700 1 3071 1',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer: '16 -3024 0 0 0 -637.62 1 1 1 700 1 1 1 3071 1 1 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Muscle',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity:\n '10 -3024 0 -155.407 0 217.641 0.676471 419.736 0.833333 3071 0.803922',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '20 -3024 0 0 0 -155.407 0.54902 0.25098 0.14902 217.641 0.882353 0.603922 0.290196 419.736 1 0.937033 0.954531 3071 0.827451 0.658824 1',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'CT-Pulmonary-Arteries',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity:\n '14 -2048 0 -568.625 0 -364.081 0.0714286 -244.813 0.401786 18.2775 0.607143 447.798 0.830357 3592.73 0.839286',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '28 -2048 0 0 0 -568.625 0 0 0 -364.081 0.396078 0.301961 0.180392 -244.813 0.611765 0.352941 0.0705882 18.2775 0.843137 0.0156863 0.156863 447.798 0.752941 0.752941 0.752941 3592.73 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Soft-Tissue',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity: '10 -2048 0 -167.01 0 -160 1 240 1 3661 1',\n specular: '0',\n shade: '0',\n ambient: '0.2',\n colorTransfer:\n '20 -2048 0 0 0 -167.01 0 0 0 -160 0.0556356 0.0556356 0.0556356 240 1 1 1 3661 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'CT-Air',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '10',\n scalarOpacity: '8 -3024 0.705882 -900.0 0.715686 -500.0 0 3071 0',\n specular: '0.2',\n shade: '1',\n ambient: '0.1',\n colorTransfer:\n '16 -3024 1 1 1 -900.0 0.2 1.0 1.0 -500.0 0.3 0.3 1.0 3071 0 0 0 ',\n diffuse: '0.9',\n interpolation: '1',\n },\n {\n name: 'MR-Angio',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity:\n '12 -2048 0 151.354 0 158.279 0.4375 190.112 0.580357 200.873 0.732143 3661 0.741071',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '24 -2048 0 0 0 151.354 0 0 0 158.279 0.74902 0.376471 0 190.112 1 0.866667 0.733333 200.873 0.937255 0.937255 0.937255 3661 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'MR-Default',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity: '12 0 0 20 0 40 0.15 120 0.3 220 0.375 1024 0.5',\n specular: '0',\n shade: '1',\n ambient: '0.2',\n colorTransfer:\n '24 0 0 0 0 20 0.168627 0 0 40 0.403922 0.145098 0.0784314 120 0.780392 0.607843 0.380392 220 0.847059 0.835294 0.788235 1024 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'MR-MIP',\n gradientOpacity: '4 0 1 255 1',\n specularPower: '1',\n scalarOpacity: '8 0 0 98.3725 0 416.637 1 2800 1',\n specular: '0',\n shade: '0',\n ambient: '0.2',\n colorTransfer: '16 0 1 1 1 98.3725 1 1 1 416.637 1 1 1 2800 1 1 1',\n diffuse: '1',\n interpolation: '1',\n },\n {\n name: 'MR-T2-Brain',\n gradientOpacity: '4 0 1 160.25 1',\n specularPower: '40',\n scalarOpacity: '10 0 0 36.05 0 218.302 0.171429 412.406 1 641 1',\n specular: '0.5',\n shade: '1',\n ambient: '0.3',\n colorTransfer:\n '16 0 0 0 0 98.7223 0.956863 0.839216 0.192157 412.406 0 0.592157 0.807843 641 1 1 1',\n diffuse: '0.6',\n interpolation: '1',\n },\n {\n name: 'DTI-FA-Brain',\n gradientOpacity: '4 0 1 0.9950 1',\n specularPower: '40',\n scalarOpacity:\n '16 0 0 0 0 0.3501 0.0158 0.49379 0.7619 0.6419 1 0.9920 1 0.9950 0 0.9950 0',\n specular: '0.5',\n shade: '1',\n ambient: '0.3',\n colorTransfer:\n '28 0 1 0 0 0 1 0 0 0.24974 0.4941 1 0 0.49949 0 0.9882 1 0.7492 0.51764 0 1 0.9950 1 0 0 0.9950 1 0 0',\n diffuse: '0.9',\n interpolation: '1',\n },\n];\n\nexport default presets;\n","import type { IRenderingEngine } from '../types';\n\nconst cache = {};\n\nconst renderingEngineCache = {\n /**\n * Returns the `RenderingEngine` instance with the given `id`.\n *\n * @param id - The `id` of the `RenderingEngine` instance to fetch.\n * @returns The `RenderingEngine` instance.\n */\n get: (id: string): IRenderingEngine => {\n return cache[id];\n },\n /**\n * Adds the `RenderingEngine` instance to the cache.\n *\n * @param re - The `RenderingEngine` to add.\n */\n set: (re: IRenderingEngine): void => {\n const renderingEngineId = re.id;\n\n cache[renderingEngineId] = re;\n },\n /**\n * Deletes the `RenderingEngine` instance from the cache.\n *\n * @param id - The `id` of the `RenderingEngine` instance to delete.\n * @returns True if the delete was successful.\n */\n delete: (id: string) => {\n return delete cache[id];\n },\n\n getAll: (): Array => {\n const renderingEngineIds = Object.keys(cache);\n const renderingEngines = renderingEngineIds.map((id) => cache[id]);\n\n // sort the rendering engines so that the ones that start with _\n // are at the end of the array. The reason is for not breaking\n // the code that used getRenderingEngines(), but since we moved\n // the renderToCanvas utility to use GPU hence it needs a\n // rendering engine and we don't want to use the default one.\n renderingEngines.sort((a, b) => {\n if (a.id[0] === '_' && b.id[0] !== '_') {\n return 1;\n } else if (a.id[0] !== '_' && b.id[0] === '_') {\n return -1;\n } else {\n return 0;\n }\n });\n\n return renderingEngines;\n },\n};\n\nexport default renderingEngineCache;\n","/**\n * EventTarget - Provides the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface\n */\nclass CornerstoneEventTarget implements EventTarget {\n private listeners;\n\n constructor() {\n this.listeners = {};\n }\n\n public reset() {\n this.listeners = {};\n }\n\n public addEventListener(type, callback) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n\n // prevent multiple callbacks from firing\n if (this.listeners[type].indexOf(callback) !== -1) {\n return;\n }\n\n this.listeners[type].push(callback);\n }\n\n public removeEventListener(type, callback) {\n if (!this.listeners[type]) {\n return;\n }\n\n const stack = this.listeners[type];\n const stackLength = stack.length;\n\n for (let i = 0; i < stackLength; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n\n dispatchEvent(event) {\n if (!this.listeners[event.type]) {\n //console.warn(`Skipping dispatch since there are no listeners for ${event.type}`);\n return;\n }\n\n const stack = this.listeners[event.type].slice();\n const stackLength = stack.length;\n\n for (let i = 0; i < stackLength; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n}\n\n/**\n * EventTarget - Provides the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface\n */\nconst eventTarget = new CornerstoneEventTarget();\n\nexport default eventTarget;\n","/**\n * A utility that can be used to invert (in place) an RgbTransferFunction.\n *\n * @example\n * Grabbing a reference to the RGB Transfer function from the viewport:\n * ```\n * const rgbTransferFunction = viewport\n * .getActor()\n * .getProperty()\n * .getRGBTransferFunction(0);\n *\n * rgbTransferFunction.setRange(0, 5);\n *\n * invertRgbTransferFunction(rgbTransferFunction);\n * ```\n *\n * @see {@link https://kitware.github.io/vtk-js/api/Rendering_Core_ColorTransferFunction.html|VTK.js: ColorTransferFunction}\n * @param rgbTransferFunction\n */\nexport default function invertRgbTransferFunction(\n rgbTransferFunction: any\n): void {\n // cut in case there is no function at all\n if (!rgbTransferFunction) {\n return;\n }\n\n const size = rgbTransferFunction.getSize();\n\n for (let index = 0; index < size; index++) {\n const nodeValue1 = [];\n\n rgbTransferFunction.getNodeValue(index, nodeValue1);\n\n nodeValue1[1] = 1 - nodeValue1[1];\n nodeValue1[2] = 1 - nodeValue1[2];\n nodeValue1[3] = 1 - nodeValue1[3];\n\n rgbTransferFunction.setNodeValue(index, nodeValue1);\n }\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport { VOIRange } from '../types';\nimport { windowLevel as windowLevelUtil } from '.';\n\n/**\n * A utility that can be used to generate an Sigmoid RgbTransferFunction.\n * Sigmoid transfer functions are used in the dicom specification:\n * https://dicom.nema.org/medical/dicom/2018b/output/chtml/part03/sect_C.11.2.html\n *\n * @example\n * Setting an RGB Transfer function from the viewport:\n * ```\n * const sigmoidRGBTransferFunction = createSigmoidRGBTransferFunction(0, 255, { lower: 0, upper: 255} );\n * viewport\n * .getActor()\n * .getProperty()\n * .setRGBTransferFunction(0, sigmoidRGBTransferFunction);\n * ```\n *\n * @see {@link https://kitware.github.io/vtk-js/api/Rendering_Core_ColorTransferFunction.html|VTK.js: ColorTransferFunction}\n * @param rgbTransferFunction\n */\nexport default function createSigmoidRGBTransferFunction(\n voiRange: VOIRange,\n approximationNodes = 1024 // humans can precieve no more than 900 shades of gray doi: 10.1007/s10278-006-1052-3\n): vtkColorTransferFunction {\n const { windowWidth, windowCenter } = windowLevelUtil.toWindowLevel(\n voiRange.lower,\n voiRange.upper\n );\n\n // Function is defined by dicom spec\n // https://dicom.nema.org/medical/dicom/2018b/output/chtml/part03/sect_C.11.2.html\n const sigmoid = (x: number, wc: number, ww: number) => {\n return 1 / (1 + Math.exp((-4 * (x - wc)) / ww));\n };\n\n // This function is the analytical inverse of the dicom spec sigmoid function\n // for values y = [0, 1] exclusive. We use this to perform better sampling of\n // points for the LUT as some images can have 2^16 unique values. This method\n // can be deprecated if vtk supports LUTFunctions rather than look up tables\n // or if vtk supports logistic scale. It currently only supports linear and\n // log10 scaling which can be set on the vtkColorTransferFunction\n const logit = (y: number, wc: number, ww: number) => {\n return wc - (ww / 4) * Math.log((1 - y) / y);\n };\n\n // we slice out the first and last value to avoid 0 and 1 Infinity values\n const range = [...Array(approximationNodes + 2).keys()]\n .map((v) => v / (approximationNodes + 2))\n .slice(1, -1);\n const table = range.reduce((res, y) => {\n const x = logit(y, windowCenter, windowWidth);\n return res.concat(x, y, y, y, 0.5, 0.0);\n }, []);\n\n const cfun = vtkColorTransferFunction.newInstance();\n cfun.buildFunctionFromArray(\n vtkDataArray.newInstance({ values: table, numberOfComponents: 6 })\n );\n return cfun;\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\n\nexport default function getVoiFromSigmoidRGBTransferFunction(\n cfun: vtkColorTransferFunction\n): [number, number] {\n let cfunRange = [];\n // @ts-ignore: vtk d ts problem\n const [lower, upper] = cfun.getRange();\n cfun.getTable(lower, upper, 1024, cfunRange);\n cfunRange = cfunRange.filter((v, k) => k % 3 === 0);\n const cfunDomain = [...Array(1024).keys()].map((v, k) => {\n return lower + ((upper - lower) / (1024 - 1)) * k;\n });\n const y1 = cfunRange[256];\n const logy1 = Math.log((1 - y1) / y1);\n const x1 = cfunDomain[256];\n const y2 = cfunRange[256 * 3];\n const logy2 = Math.log((1 - y2) / y2);\n const x2 = cfunDomain[256 * 3];\n const ww = Math.round((4 * (x2 - x1)) / (logy1 - logy2));\n const wc = Math.round(x1 + (ww * logy1) / 4);\n return [Math.round(wc - ww / 2), Math.round(wc + ww / 2)];\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport { VOIRange } from '../types';\n\nexport default function createLinearRGBTransferFunction(\n voiRange: VOIRange\n): vtkColorTransferFunction {\n const cfun = vtkColorTransferFunction.newInstance();\n let lower = 0;\n let upper = 1024;\n if (\n voiRange &&\n voiRange.lower !== undefined &&\n voiRange.upper !== undefined\n ) {\n lower = voiRange.lower;\n upper = voiRange.upper;\n }\n cfun.addRGBPoint(lower, 0.0, 0.0, 0.0);\n cfun.addRGBPoint(upper, 1.0, 1.0, 1.0);\n\n return cfun;\n}\n","/**\n * A utility that can be used to scale (in place) an RgbTransferFunction. We\n * often use this to scale the transfer function based on a PET calculation.\n *\n * @example\n * Grabbing a reference to the RGB Transfer function from the viewport:\n * ```\n * const rgbTransferFunction = viewport\n * .getActor()\n * .getProperty()\n * .getRGBTransferFunction(0);\n *\n * scaleRgbTransferFunction(rgbTransferFunction, 2);\n * ```\n *\n * @see {@link https://kitware.github.io/vtk-js/api/Rendering_Core_ColorTransferFunction.html|VTK.js: ColorTransferFunction}\n * @param rgbTransferFunction\n * @param scalingFactor\n */\nexport default function scaleRGBTransferFunction(\n rgbTransferFunction: any,\n scalingFactor: number\n): void {\n const size = rgbTransferFunction.getSize();\n\n for (let index = 0; index < size; index++) {\n const nodeValue1 = [];\n\n rgbTransferFunction.getNodeValue(index, nodeValue1);\n\n nodeValue1[1] = nodeValue1[1] * scalingFactor;\n nodeValue1[2] = nodeValue1[2] * scalingFactor;\n nodeValue1[3] = nodeValue1[3] * scalingFactor;\n\n rgbTransferFunction.setNodeValue(index, nodeValue1);\n }\n}\n","import eventTarget from '../eventTarget';\n\n/**\n * Small utility to trigger a custom event for a given EventTarget.\n *\n * @example\n *\n * ```javascript\n * triggerEvent(element, Events.IMAGE_RENDERED, { element })\n * ```\n * or it can trigger event on the eventTarget itself\n *\n * ```javascript\n * triggerEvent(eventTarget, CSTOOLS_EVENTS.ANNOTATION_MODIFIED, { viewportId, annotationUID })\n * ```\n *\n * @param el - The element or EventTarget to trigger the event upon\n * @param type - The event type name\n * @param detail - The event detail to be sent\n * @returns false if event is cancelable and at least one of the event handlers\n * which received event called Event.preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent(\n el: EventTarget = eventTarget,\n type: string,\n detail: unknown = null\n): boolean {\n if (!type) {\n throw new Error('Event type was not defined');\n }\n\n const event = new CustomEvent(type, {\n detail,\n cancelable: true,\n });\n\n return el.dispatchEvent(event);\n}\n","// prettier-ignore\n// @ts-nocheck\n/**\n * Generates a unique id that has limited chance of collision\n *\n * @see {@link https://stackoverflow.com/a/2117523/1867984|StackOverflow: Source}\n * @returns a v4 compliant GUID\n */\nexport default function uuidv4(): string {\n return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>\n (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)\n );\n}\n","/**\n * Calculate the minimum and maximum values in an Array\n *\n * @param storedPixelData - The pixel data to calculate the min and max values for\n * @returns an object with two properties: min and max\n */\nexport default function getMinMax(storedPixelData: number[]): {\n min: number;\n max: number;\n} {\n // we always calculate the min max values since they are not always\n // present in DICOM and we don't want to trust them anyway as cornerstone\n // depends on us providing reliable values for these\n let min = storedPixelData[0];\n\n let max = storedPixelData[0];\n\n let storedPixel;\n const numPixels = storedPixelData.length;\n\n for (let index = 1; index < numPixels; index++) {\n storedPixel = storedPixelData[index];\n min = Math.min(min, storedPixel);\n max = Math.max(max, storedPixel);\n }\n\n return {\n min,\n max,\n };\n}\n","const LAST_RUNTIME_ID = Symbol('LastRuntimeId');\nconst GLOBAL_CONTEXT = {};\nconst DEFAULT_MAX = 0xffffffff; // Max 32-bit integer\nconst DEFAULT_SEPARATOR = '-';\n\n/**\n * Generate a unique numeric ID string valid during a single runtime session;\n *\n * @param context - An optional object to be used as context.\n * Defaults to a global context;\n * @param separator - The component separator. Defaults to \"-\";\n * @param max - The maximum component value. Defaults to 4294967295;\n * @returns The string representation of the the unique ID;\n */\nexport default function getRuntimeId(\n context?: unknown,\n separator?: string,\n max?: number\n): string {\n return getNextRuntimeId(\n // @ts-ignore\n context !== null && typeof context === 'object' ? context : GLOBAL_CONTEXT,\n LAST_RUNTIME_ID,\n (typeof max === 'number' && max > 0 ? max : DEFAULT_MAX) >>> 0\n ).join(typeof separator === 'string' ? separator : DEFAULT_SEPARATOR);\n}\n\n/*\n * Helpers\n */\n\nfunction getNextRuntimeId(\n context: Record>,\n symbol: symbol,\n max: number\n): Array {\n let idComponents = context[symbol];\n if (!(idComponents instanceof Array)) {\n idComponents = [0];\n Object.defineProperty(context, symbol, { value: idComponents });\n }\n for (let carry = true, i = 0; carry && i < idComponents.length; ++i) {\n let n = idComponents[i] | 0;\n if (n < max) {\n carry = false;\n n = n + 1;\n } else {\n n = 0;\n if (i + 1 === idComponents.length) {\n idComponents.push(0);\n }\n }\n idComponents[i] = n;\n }\n return idComponents;\n}\n","/**\n * Removes the data loader scheme from the imageId\n *\n * @param imageId - Image ID\n * @returns imageId without the data loader scheme\n */\nexport default function imageIdToURI(imageId: string): string {\n const colonIndex = imageId.indexOf(':');\n return imageId.substring(colonIndex + 1);\n}\n","import imageIdToURI from './imageIdToURI';\nimport { IImageCalibration } from '../types';\n\nconst state: Record = {}; // Calibrated pixel spacing per imageId\n\n/**\n * Simple metadataProvider object to store metadata for calibrated spacings.\n * This can be added via cornerstone.metaData.addProvider(...) in order to store\n * and return calibrated pixel spacings when metaData type is \"calibratedPixelSpacing\".\n */\nconst metadataProvider = {\n /**\n * Adds metadata for an imageId.\n * @param imageId - the imageId for the metadata to store\n * @param payload - the payload composed of new calibrated pixel spacings\n */\n add: (imageId: string, payload: IImageCalibration): void => {\n const imageURI = imageIdToURI(imageId);\n state[imageURI] = payload;\n },\n\n /**\n * Returns the metadata for an imageId if it exists.\n * @param type - the type of metadata to enquire about\n * @param imageId - the imageId to enquire about\n * @returns the calibrated pixel spacings for the imageId if it exists, otherwise undefined\n */\n get: (type: string, imageId: string): IImageCalibration => {\n if (type === 'calibratedPixelSpacing') {\n const imageURI = imageIdToURI(imageId);\n return state[imageURI];\n }\n },\n};\n\nexport default metadataProvider;\n","function areNumbersEqualWithTolerance(\n num1: number,\n num2: number,\n tolerance: number\n): boolean {\n return Math.abs(num1 - num2) <= tolerance;\n}\n\nfunction areArraysEqual(\n arr1: ArrayLike,\n arr2: ArrayLike,\n tolerance = 1e-5\n): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n for (let i = 0; i < arr1.length; i++) {\n if (!areNumbersEqualWithTolerance(arr1[i], arr2[i], tolerance)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isNumberType(value: any): value is number {\n return typeof value === 'number';\n}\n\nfunction isNumberArrayLike(value: any): value is ArrayLike {\n return 'length' in value && typeof value[0] === 'number';\n}\n\n/**\n * Returns whether two values are equal or not, based on epsilon comparison.\n * For array comparison, it does NOT strictly compare them but only compare its values.\n * It can compare array of numbers and also typed array. Otherwise it will just return false.\n *\n * @param v1 - The first value to compare\n * @param v2 - The second value to compare\n * @param tolerance - The acceptable tolerance, the default is 0.00001\n *\n * @returns True if the two values are within the tolerance levels.\n */\nexport default function isEqual(\n v1: ValueType,\n v2: ValueType,\n tolerance = 1e-5\n): boolean {\n // values must be the same type or not null\n if (typeof v1 !== typeof v2 || v1 === null || v2 === null) {\n return false;\n }\n\n if (isNumberType(v1) && isNumberType(v2)) {\n return areNumbersEqualWithTolerance(v1, v2, tolerance);\n }\n\n if (isNumberArrayLike(v1) && isNumberArrayLike(v2)) {\n return areArraysEqual(v1, v2, tolerance);\n }\n\n return false;\n}\n","import type Point3 from '../types/Point3';\n\n/**\n * returns equal if the two vec3s are opposite within the\n * given tolerance in each dimension.\n *\n * @param v1 - The first 3 vector\n * @param v2 - The second 3 vector.\n * @param tolerance - The acceptable tolerance.\n *\n * @returns True if the two values are within the tolerance levels.\n */\nexport default function isOpposite(\n v1: Point3,\n v2: Point3,\n tolerance = 1e-5\n): boolean {\n return (\n Math.abs(v1[0] + v2[0]) < tolerance &&\n Math.abs(v1[1] + v2[1]) < tolerance &&\n Math.abs(v1[2] + v2[2]) < tolerance\n );\n}\n","// GPU blocklist\n// SEE: https://chromium.googlesource.com/chromium/src/+/master/gpu/config/software_rendering_list.json\n// SEE: https://hg.mozilla.org/mozilla-central/raw-file/tip/services/settings/dumps/blocklists/gfx.json\nexport const BLOCKLISTED_GPUS = [\n 'geforce 320m',\n 'geforce 8600',\n 'geforce 8600m gt',\n 'geforce 8800 gs',\n 'geforce 8800 gt',\n 'geforce 9400',\n 'geforce 9400m g',\n 'geforce 9400m',\n 'geforce 9600m gt',\n 'geforce 9600m',\n 'geforce fx go5200',\n 'geforce gt 120',\n 'geforce gt 130',\n 'geforce gt 330m',\n 'geforce gtx 285',\n 'google swiftshader',\n 'intel g41',\n 'intel g45',\n 'intel gma 4500mhd',\n 'intel gma x3100',\n 'intel hd 3000',\n 'intel q45',\n 'legacy',\n 'mali-2',\n 'mali-3',\n 'mali-4',\n 'quadro fx 1500',\n 'quadro fx 4',\n 'quadro fx 5',\n 'radeon hd 2400',\n 'radeon hd 2600',\n 'radeon hd 4670',\n 'radeon hd 4850',\n 'radeon hd 4870',\n 'radeon hd 5670',\n 'radeon hd 5750',\n 'radeon hd 6290',\n 'radeon hd 6300',\n 'radeon hd 6310',\n 'radeon hd 6320',\n 'radeon hd 6490m',\n 'radeon hd 6630m',\n 'radeon hd 6750m',\n 'radeon hd 6770m',\n 'radeon hd 6970m',\n 'sgx 543',\n 'sgx543',\n];\n","const debug = false ? console.log : undefined;\n\nexport function cleanRenderer(renderer: string) {\n debug?.('cleanRenderer', { renderer });\n\n renderer = renderer\n .toLowerCase()\n // Strip off ANGLE() - for example:\n // 'ANGLE (NVIDIA TITAN Xp)' becomes 'NVIDIA TITAN Xp'':\n .replace(/^angle ?\\((.+)\\)*$/, '$1')\n // Strip off [number]gb & strip off direct3d and after - for example:\n // 'Radeon (TM) RX 470 Series Direct3D11 vs_5_0 ps_5_0' becomes\n // 'Radeon (TM) RX 470 Series'\n .replace(/\\s(\\d{1,2}gb|direct3d.+$)|\\(r\\)| \\([^)]+\\)$/g, '')\n // Strip out graphics API. The one Vulkan example we've seen includes\n // the GPU in parens after the Vulkan version so this also keeps that\n // eg. 'vulkan 1.2.175 (nvidia nvidia geforce gtx 970 (0x000013c2))'\n // becomes 'nvidia nvidia geforce gtx 970 (0x000013c2)'\n // `OpenGL 4.5.0` gets removed all together\n .replace(/(?:vulkan|opengl) \\d+\\.\\d+(?:\\.\\d+)?(?: \\((.*)\\))?/, '$1')\n\n debug?.('cleanRenderer - renderer cleaned to', { renderer });\n\n return renderer;\n};\n","/**\r\n * The following defined constants and descriptions are directly ported from https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\r\n *\r\n * Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/\r\n *\r\n * Contributors\r\n *\r\n * See: https://developer.mozilla.org/en-US/profiles/Sheppy\r\n * See: https://developer.mozilla.org/en-US/profiles/fscholz\r\n * See: https://developer.mozilla.org/en-US/profiles/AtiX\r\n * See: https://developer.mozilla.org/en-US/profiles/Sebastianz\r\n *\r\n * These constants are defined on the WebGLRenderingContext / WebGL2RenderingContext interface\r\n */\r\n// Clearing buffers\r\n// Constants passed to WebGLRenderingContext.clear() to clear buffer masks\r\n/**\r\n * Passed to clear to clear the current depth buffer\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\r\n/**\r\n * Passed to clear to clear the current stencil buffer\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\r\n/**\r\n * Passed to clear to clear the current color buffer\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\r\n// Rendering primitives\r\n// Constants passed to WebGLRenderingContext.drawElements() or WebGLRenderingContext.drawArrays() to specify what kind of primitive to render\r\n/**\r\n * Passed to drawElements or drawArrays to draw single points\r\n * @constant {number}\r\n */\r\nconst GL_POINTS = 0x0000;\r\n/**\r\n * Passed to drawElements or drawArrays to draw lines. Each vertex connects to the one after it\r\n * @constant {number}\r\n */\r\nconst GL_LINES = 0x0001;\r\n/**\r\n * Passed to drawElements or drawArrays to draw lines. Each set of two vertices is treated as a separate line segment\r\n * @constant {number}\r\n */\r\nconst GL_LINE_LOOP = 0x0002;\r\n/**\r\n * Passed to drawElements or drawArrays to draw a connected group of line segments from the first vertex to the last\r\n * @constant {number}\r\n */\r\nconst GL_LINE_STRIP = 0x0003;\r\n/**\r\n * Passed to drawElements or drawArrays to draw triangles. Each set of three vertices creates a separate triangle\r\n * @constant {number}\r\n */\r\nconst GL_TRIANGLES = 0x0004;\r\n/**\r\n * Passed to drawElements or drawArrays to draw a connected group of triangles\r\n * @constant {number}\r\n */\r\nconst GL_TRIANGLE_STRIP = 0x0005;\r\n/**\r\n * Passed to drawElements or drawArrays to draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan\r\n * @constant {number}\r\n */\r\nconst GL_TRIANGLE_FAN = 0x0006;\r\n// Blending modes\r\n// Constants passed to WebGLRenderingContext.blendFunc() or WebGLRenderingContext.blendFuncSeparate() to specify the blending mode (for both, RBG and alpha, or separately)\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to turn off a component\r\n * @constant {number}\r\n */\r\nconst GL_ZERO = 0;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to turn on a component\r\n * @constant {number}\r\n */\r\nconst GL_ONE = 1;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the source elements color\r\n * @constant {number}\r\n */\r\nconst GL_SRC_COLOR = 0x0300;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the source elements color\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_SRC_COLOR = 0x0301;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the source's alpha\r\n * @constant {number}\r\n */\r\nconst GL_SRC_ALPHA = 0x0302;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the source's alpha\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_SRC_ALPHA = 0x0303;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the destination's alpha\r\n * @constant {number}\r\n */\r\nconst GL_DST_ALPHA = 0x0304;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the destination's alpha\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_DST_ALPHA = 0x0305;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the destination's color\r\n * @constant {number}\r\n */\r\nconst GL_DST_COLOR = 0x0306;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the destination's color\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_DST_COLOR = 0x0307;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the minimum of source's alpha or one minus the destination's alpha\r\n * @constant {number}\r\n */\r\nconst GL_SRC_ALPHA_SATURATE = 0x0308;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify a constant color blend function\r\n * @constant {number}\r\n */\r\nconst GL_CONSTANT_COLOR = 0x8001;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify one minus a constant color blend function\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_CONSTANT_COLOR = 0x8002;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify a constant alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_CONSTANT_ALPHA = 0x8003;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify one minus a constant alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004;\r\n// Blending equations\r\n// Constants passed to WebGLRenderingContext.blendEquation() or WebGLRenderingContext.blendEquationSeparate() to control how the blending is calculated (for both, RBG and alpha, or separately)\r\n/**\r\n * Passed to blendEquation or blendEquationSeparate to set an addition blend function\r\n * @constant {number}\r\n */\r\nconst GL_FUNC_ADD = 0x8006;\r\n/**\r\n * Passed to blendEquation or blendEquationSeparate to specify a subtraction blend function (source - destination)\r\n * @constant {number}\r\n */\r\nconst GL_FUNC_SUBSTRACT = 0x800a;\r\n/**\r\n * Passed to blendEquation or blendEquationSeparate to specify a reverse subtraction blend function (destination - source)\r\n * @constant {number}\r\n */\r\nconst GL_FUNC_REVERSE_SUBTRACT = 0x800b;\r\n// Getting GL parameter information\r\n// Constants passed to WebGLRenderingContext.getParameter() to specify what information to return\r\n/**\r\n * Passed to getParameter to get the current RGB blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_EQUATION = 0x8009;\r\n/**\r\n * Passed to getParameter to get the current RGB blend function. Same as BLEND_EQUATION\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_EQUATION_RGB = 0x8009;\r\n/**\r\n * Passed to getParameter to get the current alpha blend function. Same as BLEND_EQUATION\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_EQUATION_ALPHA = 0x883d;\r\n/**\r\n * Passed to getParameter to get the current destination RGB blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_DST_RGB = 0x80c8;\r\n/**\r\n * Passed to getParameter to get the current source RGB blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_SRC_RGB = 0x80c9;\r\n/**\r\n * Passed to getParameter to get the current destination alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_DST_ALPHA = 0x80ca;\r\n/**\r\n * Passed to getParameter to get the current source alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_SRC_ALPHA = 0x80cb;\r\n/**\r\n * Passed to getParameter to return a the current blend color\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_COLOR = 0x8005;\r\n/**\r\n * Passed to getParameter to get the array buffer binding\r\n * @constant {number}\r\n */\r\nconst GL_ARRAY_BUFFER_BINDING = 0x8894;\r\n/**\r\n * Passed to getParameter to get the current element array buffer\r\n * @constant {number}\r\n */\r\nconst GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;\r\n/**\r\n * Passed to getParameter to get the current lineWidth (set by the lineWidth method)\r\n * @constant {number}\r\n */\r\nconst GL_LINE_WIDTH = 0x0b21;\r\n/**\r\n * Passed to getParameter to get the current size of a point drawn with gl.POINTS\r\n * @constant {number}\r\n */\r\nconst GL_ALIASED_POINT_SIZE_RANGE = 0x846d;\r\n/**\r\n * Passed to getParameter to get the range of available widths for a line. Returns a length-2 array with the lo value at 0, and hight at 1\r\n * @constant {number}\r\n */\r\nconst GL_ALIASED_LINE_WIDTH_RANGE = 0x846e;\r\n/**\r\n * Passed to getParameter to get the current value of cullFace. Should return FRONT, BACK, or FRONT_AND_BACK\r\n * @constant {number}\r\n */\r\nconst GL_CULL_FACE_MODE = 0x0b45;\r\n/**\r\n * Passed to getParameter to determine the current value of frontFace. Should return CW or CCW\r\n * @constant {number}\r\n */\r\nconst GL_FRONT_FACE = 0x0b46;\r\n/**\r\n * Passed to getParameter to return a length-2 array of floats giving the current depth range\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_RANGE = 0x0b70;\r\n/**\r\n * Passed to getParameter to determine if the depth write mask is enabled\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_WRITEMASK = 0x0b72;\r\n/**\r\n * Passed to getParameter to determine the current depth clear value\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_CLEAR_VALUE = 0x0b73;\r\n/**\r\n * Passed to getParameter to get the current depth function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_FUNC = 0x0b74;\r\n/**\r\n * Passed to getParameter to get the value the stencil will be cleared to\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_CLEAR_VALUE = 0x0b91;\r\n/**\r\n * Passed to getParameter to get the current stencil function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_FUNC = 0x0b92;\r\n/**\r\n * Passed to getParameter to get the current stencil fail function. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_FAIL = 0x0b94;\r\n/**\r\n * Passed to getParameter to get the current stencil fail function should the depth buffer test fail. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_PASS_DEPTH_FAIL = 0x0b95;\r\n/**\r\n * Passed to getParameter to get the current stencil fail function should the depth buffer test pass. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_PASS_DEPTH_PASS = 0x0b96;\r\n/**\r\n * Passed to getParameter to get the reference value used for stencil tests\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_REF = 0x0b97;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_VALUE_MASK = 0x0b93;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_WRITEMASK = 0x0b98;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_FUNC = 0x8800;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_FAIL = 0x8801;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_REF = 0x8ca3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_VALUE_MASK = 0x8ca4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_WRITEMASK = 0x8ca5;\r\n/**\r\n * Returns an Int32Array with four elements for the current viewport dimensions\r\n * @constant {number}\r\n */\r\nconst GL_VIEWPORT = 0x0ba2;\r\n/**\r\n * Returns an Int32Array with four elements for the current scissor box dimensions\r\n * @constant {number}\r\n */\r\nconst GL_SCISSOR_BOX = 0x0c10;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_CLEAR_VALUE = 0x0c22;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_WRITEMASK = 0x0c23;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_ALIGNMENT = 0x0cf5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_ALIGNMENT = 0x0d05;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_SIZE = 0x0d33;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VIEWPORT_DIMS = 0x0d3a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SUBPIXEL_BITS = 0x0d50;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RED_BITS = 0x0d52;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_GREEN_BITS = 0x0d53;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BLUE_BITS = 0x0d54;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ALPHA_BITS = 0x0d55;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_BITS = 0x0d56;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BITS = 0x0d57;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_POLYGON_OFFSET_UNITS = 0x2a00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_POLYGON_OFFSET_FACTOR = 0x8038;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_2D = 0x8069;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_BUFFERS = 0x80a8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLES = 0x80a9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_COVERAGE_VALUE = 0x80aa;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_COVERAGE_INVERT = 0x80ab;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_TEXTURE_FORMATS = 0x86a3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VENDOR = 0x1f00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERER = 0x1f01;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERSION = 0x1f02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8b9a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8b9b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BROWSER_DEFAULT_WEBGL = 0x9244;\r\n// Buffers\r\n// Constants passed to WebGLRenderingContext.bufferData(), WebGLRenderingContext.bufferSubData(), WebGLRenderingContext.bindBuffer(), or WebGLRenderingContext.getBufferParameter()\r\n/**\r\n * Passed to bufferData as a hint about whether the contents of the buffer are likely to be used often and not change often\r\n * @constant {number}\r\n */\r\nconst GL_STATIC_DRAW = 0x88e4;\r\n/**\r\n * Passed to bufferData as a hint about whether the contents of the buffer are likely to not be used often\r\n * @constant {number}\r\n */\r\nconst GL_STREAM_DRAW = 0x88e0;\r\n/**\r\n * Passed to bufferData as a hint about whether the contents of the buffer are likely to be used often and change often\r\n * @constant {number}\r\n */\r\nconst GL_DYNAMIC_DRAW = 0x88e8;\r\n/**\r\n * Passed to bindBuffer or bufferData to specify the type of buffer being used\r\n * @constant {number}\r\n */\r\nconst GL_ARRAY_BUFFER = 0x8892;\r\n/**\r\n * Passed to bindBuffer or bufferData to specify the type of buffer being used\r\n * @constant {number}\r\n */\r\nconst GL_ELEMENT_ARRAY_BUFFER = 0x8893;\r\n/**\r\n * Passed to getBufferParameter to get a buffer's size\r\n * @constant {number}\r\n */\r\nconst GL_BUFFER_SIZE = 0x8764;\r\n/**\r\n * Passed to getBufferParameter to get the hint for the buffer passed in when it was created\r\n * @constant {number}\r\n */\r\nconst GL_BUFFER_USAGE = 0x8765;\r\n// Vertex attributes\r\n// Constants passed to WebGLRenderingContext.getVertexAttrib()\r\n/**\r\n * Passed to getVertexAttrib to read back the current vertex attribute\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_VERTEX_ATTRIB = 0x8626;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889f;\r\n// Culling\r\n// Constants passed to WebGLRenderingContext.cullFace()\r\n/**\r\n * Passed to enable/disable to turn on/off culling. Can also be used with getParameter to find the current culling method\r\n * @constant {number}\r\n */\r\nconst GL_CULL_FACE = 0x0b44;\r\n/**\r\n * Passed to cullFace to specify that only front faces should be culled\r\n * @constant {number}\r\n */\r\nconst GL_FRONT = 0x0404;\r\n/**\r\n * Passed to cullFace to specify that only back faces should be culled\r\n * @constant {number}\r\n */\r\nconst GL_BACK = 0x0405;\r\n/**\r\n * Passed to cullFace to specify that front and back faces should be culled\r\n * @constant {number}\r\n */\r\nconst GL_FRONT_AND_BACK = 0x0408;\r\n// Enabling and disabling\r\n// Constants passed to WebGLRenderingContext.enable() or WebGLRenderingContext.disable()\r\n/**\r\n * Passed to enable/disable to turn on/off blending. Can also be used with getParameter to find the current blending method\r\n * @constant {number}\r\n */\r\nconst GL_BLEND = 0x0be2;\r\n/**\r\n * Passed to enable/disable to turn on/off the depth test. Can also be used with getParameter to query the depth test\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_TEST = 0x0b71;\r\n/**\r\n * Passed to enable/disable to turn on/off dithering. Can also be used with getParameter to find the current dithering method\r\n * @constant {number}\r\n */\r\nconst GL_DITHER = 0x0bd0;\r\n/**\r\n * Passed to enable/disable to turn on/off the polygon offset. Useful for rendering hidden-line images, decals, and or solids with highlighted edges. Can also be used with getParameter to query the scissor test\r\n * @constant {number}\r\n */\r\nconst GL_POLYGON_OFFSET_FILL = 0x8037;\r\n/**\r\n * Passed to enable/disable to turn on/off the alpha to coverage. Used in multi-sampling alpha channels\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809e;\r\n/**\r\n * Passed to enable/disable to turn on/off the sample coverage. Used in multi-sampling\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_COVERAGE = 0x80a0;\r\n/**\r\n * Passed to enable/disable to turn on/off the scissor test. Can also be used with getParameter to query the scissor test\r\n * @constant {number}\r\n */\r\nconst GL_SCISSOR_TEST = 0x0c11;\r\n/**\r\n * Passed to enable/disable to turn on/off the stencil test. Can also be used with getParameter to query the stencil test\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_TEST = 0x0b90;\r\n// Errors\r\n// Constants returned from WebGLRenderingContext.getError()\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_NO_ERROR = 0;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_ENUM = 0x0500;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_VALUE = 0x0501;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_OPERATION = 0x0502;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_OUT_OF_MEMORY = 0x0505;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_CONTEXT_LOST_WEBGL = 0x9242;\r\n// Front face directions\r\n// Constants passed to WebGLRenderingContext.frontFace()\r\n/**\r\n * Passed to frontFace to specify the front face of a polygon is drawn in the clockwise direction,\r\n * @constant {number}\r\n */\r\nconst GL_CW = 0x0900;\r\n/**\r\n * Passed to frontFace to specify the front face of a polygon is drawn in the counter clockwise direction\r\n * @constant {number}\r\n */\r\nconst GL_CCW = 0x0901;\r\n// Hints\r\n// Constants passed to WebGLRenderingContext.hint()\r\n/**\r\n * There is no preference for this behavior\r\n * @constant {number}\r\n */\r\nconst GL_DONT_CARE = 0x1100;\r\n/**\r\n * The most efficient behavior should be used\r\n * @constant {number}\r\n */\r\nconst GL_FASTEST = 0x1101;\r\n/**\r\n * The most correct or the highest quality option should be used\r\n * @constant {number}\r\n */\r\nconst GL_NICEST = 0x1102;\r\n/**\r\n * Hint for the quality of filtering when generating mipmap images with WebGLRenderingContext.generateMipmap()\r\n * @constant {number}\r\n */\r\nconst GL_GENERATE_MIPMAP_HINT = 0x8192;\r\n// Data types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BYTE = 0x1400;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_BYTE = 0x1401;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SHORT = 0x1402;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT = 0x1403;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT = 0x1404;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT = 0x1405;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT = 0x1406;\r\n// Pixel formats\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT = 0x1902;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ALPHA = 0x1906;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB = 0x1907;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA = 0x1908;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LUMINANCE = 0x1909;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LUMINANCE_ALPHA = 0x190a;\r\n// Pixel types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT_5_6_5 = 0x8363;\r\n// Shaders\r\n// Constants passed to WebGLRenderingContext.getShaderParameter()\r\n/**\r\n * Passed to createShader to define a fragment shader\r\n * @constant {number}\r\n */\r\nconst GL_FRAGMENT_SHADER = 0x8b30;\r\n/**\r\n * Passed to createShader to define a vertex shader\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_SHADER = 0x8b31;\r\n/**\r\n * Passed to getShaderParamter to get the status of the compilation. Returns false if the shader was not compiled. You can then query getShaderInfoLog to find the exact error\r\n * @constant {number}\r\n */\r\nconst GL_COMPILE_STATUS = 0x8b81;\r\n/**\r\n * Passed to getShaderParamter to determine if a shader was deleted via deleteShader. Returns true if it was, false otherwise\r\n * @constant {number}\r\n */\r\nconst GL_DELETE_STATUS = 0x8b80;\r\n/**\r\n * Passed to getProgramParameter after calling linkProgram to determine if a program was linked correctly. Returns false if there were errors. Use getProgramInfoLog to find the exact error\r\n * @constant {number}\r\n */\r\nconst GL_LINK_STATUS = 0x8b82;\r\n/**\r\n * Passed to getProgramParameter after calling validateProgram to determine if it is valid. Returns false if errors were found\r\n * @constant {number}\r\n */\r\nconst GL_VALIDATE_STATUS = 0x8b83;\r\n/**\r\n * Passed to getProgramParameter after calling attachShader to determine if the shader was attached correctly. Returns false if errors occurred\r\n * @constant {number}\r\n */\r\nconst GL_ATTACHED_SHADERS = 0x8b85;\r\n/**\r\n * Passed to getProgramParameter to get the number of attributes active in a program\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_ATTRIBUTES = 0x8b89;\r\n/**\r\n * Passed to getProgramParamter to get the number of uniforms active in a program\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_UNIFORMS = 0x8b86;\r\n/**\r\n * The maximum number of entries possible in the vertex attribute list\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_ATTRIBS = 0x8869;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8dfb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VARYING_VECTORS = 0x8dfc;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8b4d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8b4c;\r\n/**\r\n * Implementation dependent number of maximum texture units. At least 8\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8dfd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SHADER_TYPE = 0x8b4f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SHADING_LANGUAGE_VERSION = 0x8b8c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_PROGRAM = 0x8b8d;\r\n// Depth or stencil tests\r\n// Constants passed to WebGLRenderingContext.stencilFunc()\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn\r\n * @constant {number}\r\n */\r\nconst GL_NEVER = 0x0200;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn\r\n * @constant {number}\r\n */\r\nconst GL_ALWAYS = 0x0207;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value\r\n * @constant {number}\r\n */\r\nconst GL_LESS = 0x0201;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_EQUAL = 0x0202;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_LEQUAL = 0x0203;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value\r\n * @constant {number}\r\n */\r\nconst GL_GREATER = 0x0204;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_GEQUAL = 0x0206;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_NOTEQUAL = 0x0205;\r\n// Stencil actions\r\n// Constants passed to WebGLRenderingContext.stencilOp()\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_KEEP = 0x1e00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_REPLACE = 0x1e01;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INCR = 0x1e02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DECR = 0x1e03;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INVERT = 0x150a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INCR_WRAP = 0x8507;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DECR_WRAP = 0x8508;\r\n// Textures\r\n// Constants passed to WebGLRenderingContext.texParameteri(), WebGLRenderingContext.texParameterf(), WebGLRenderingContext.bindTexture(), WebGLRenderingContext.texImage2D(), and others\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NEAREST = 0x2600;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LINEAR = 0x2601;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NEAREST_MIPMAP_NEAREST = 0x2700;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LINEAR_MIPMAP_NEAREST = 0x2701;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NEAREST_MIPMAP_LINEAR = 0x2702;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LINEAR_MIPMAP_LINEAR = 0x2703;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAG_FILTER = 0x2800;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MIN_FILTER = 0x2801;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_WRAP_S = 0x2802;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_WRAP_T = 0x2803;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_2D = 0x0de1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE = 0x1702;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP = 0x8513;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_CUBE_MAP = 0x8514;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851c;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE0 = 0x84c0;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE1 = 0x84c1;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE2 = 0x84c2;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE3 = 0x84c3;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE4 = 0x84c4;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE5 = 0x84c5;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE6 = 0x84c6;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE7 = 0x84c7;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE8 = 0x84c8;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE9 = 0x84c9;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE10 = 0x84ca;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE11 = 0x84cb;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE12 = 0x84cc;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE13 = 0x84cd;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE14 = 0x84ce;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE15 = 0x84cf;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE16 = 0x84d0;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE17 = 0x84d1;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE18 = 0x84d2;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE19 = 0x84d3;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE20 = 0x84d4;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE21 = 0x84d5;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE22 = 0x84d6;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE23 = 0x84d7;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE24 = 0x84d8;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE25 = 0x84d9;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE26 = 0x84da;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE27 = 0x84db;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE28 = 0x84dc;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE29 = 0x84dd;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE30 = 0x84de;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE31 = 0x84df;\r\n/**\r\n * The current active texture unit\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_TEXTURE = 0x84e0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_REPEAT = 0x2901;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CLAMP_TO_EDGE = 0x812f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MIRRORED_REPEAT = 0x8370;\r\n// Uniform types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_VEC2 = 0x8b50;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_VEC3 = 0x8b51;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_VEC4 = 0x8b52;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_VEC2 = 0x8b53;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_VEC3 = 0x8b54;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_VEC4 = 0x8b55;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL = 0x8b56;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL_VEC2 = 0x8b57;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL_VEC3 = 0x8b58;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL_VEC4 = 0x8b59;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT2 = 0x8b5a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT3 = 0x8b5b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT4 = 0x8b5c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D = 0x8b5e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_CUBE = 0x8b60;\r\n// Shader precision-specified types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LOW_FLOAT = 0x8df0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MEDIUM_FLOAT = 0x8df1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_HIGH_FLOAT = 0x8df2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LOW_INT = 0x8df3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MEDIUM_INT = 0x8df4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_HIGH_INT = 0x8df5;\r\n// Framebuffers and renderbuffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER = 0x8d40;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER = 0x8d41;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA4 = 0x8056;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB5_A1 = 0x8057;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB565 = 0x8d62;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT16 = 0x81a5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_INDEX = 0x1901;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_INDEX8 = 0x8d48;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_STENCIL = 0x84f9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_WIDTH = 0x8d42;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_HEIGHT = 0x8d43;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8d44;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_RED_SIZE = 0x8d50;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_GREEN_SIZE = 0x8d51;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_BLUE_SIZE = 0x8d52;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_ALPHA_SIZE = 0x8d53;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_DEPTH_SIZE = 0x8d54;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_STENCIL_SIZE = 0x8d55;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8cd0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8cd1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8cd2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8cd3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT0 = 0x8ce0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_ATTACHMENT = 0x8d00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_ATTACHMENT = 0x8d20;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_STENCIL_ATTACHMENT = 0x821a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NONE = 0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_COMPLETE = 0x8cd5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8cd6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8cd7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8cd9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_UNSUPPORTED = 0x8cdd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_BINDING = 0x8ca6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_BINDING = 0x8ca7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_RENDERBUFFER_SIZE = 0x84e8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_FRAMEBUFFER_OPERATION = 0x0506;\r\n// Pixel storage modes\r\n// Constants passed to WebGLRenderingContext.pixelStorei()\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_FLIP_Y_WEBGL = 0x9240;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\r\n// Additional constants defined WebGL 2\r\n// These constants are defined on the WebGL2RenderingContext interface. All WebGL 1 constants are also available in a WebGL 2 context\r\n// Getting GL parameter information\r\n// Constants passed to WebGLRenderingContext.getParameter() to specify what information to return\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_READ_BUFFER = 0x0c02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_ROW_LENGTH = 0x0cf2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_SKIP_ROWS = 0x0cf3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_SKIP_PIXELS = 0x0cf4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_ROW_LENGTH = 0x0d02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_SKIP_ROWS = 0x0d03;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_SKIP_PIXELS = 0x0d04;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_3D = 0x806a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_SKIP_IMAGES = 0x806d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_IMAGE_HEIGHT = 0x806e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_3D_TEXTURE_SIZE = 0x8073;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ELEMENTS_VERTICES = 0x80e8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ELEMENTS_INDICES = 0x80e9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_LOD_BIAS = 0x84fd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8b49;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8b4a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88ff;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VARYING_COMPONENTS = 0x8b4b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8b8b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RASTERIZER_DISCARD = 0x8c89;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ARRAY_BINDING = 0x85b5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ELEMENT_INDEX = 0x8d6b;\r\n// Textures\r\n// Constants passed to WebGLRenderingContext.texParameteri(), WebGLRenderingContext.texParameterf(), WebGLRenderingContext.bindTexture(), WebGLRenderingContext.texImage2D(), and others\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RED = 0x1903;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8 = 0x8051;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8 = 0x8058;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB10_A2 = 0x8059;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_3D = 0x806f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_WRAP_R = 0x8072;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MIN_LOD = 0x813a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAX_LOD = 0x813b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BASE_LEVEL = 0x813c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAX_LEVEL = 0x813d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_COMPARE_MODE = 0x884c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_COMPARE_FUNC = 0x884d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SRGB = 0x8c40;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SRGB8 = 0x8c41;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SRGB8_ALPHA8 = 0x8c43;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COMPARE_REF_TO_TEXTURE = 0x884e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32F = 0x8814;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB32F = 0x8815;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA16F = 0x881a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB16F = 0x881b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_2D_ARRAY = 0x8c1a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_2D_ARRAY = 0x8c1d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R11F_G11F_B10F = 0x8c3a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB9_E5 = 0x8c3d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32UI = 0x8d70;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB32UI = 0x8d71;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA16UI = 0x8d76;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB16UI = 0x8d77;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8UI = 0x8d7c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8UI = 0x8d7d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32I = 0x8d82;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB32I = 0x8d83;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA16I = 0x8d88;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB16I = 0x8d89;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8I = 0x8d8e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8I = 0x8d8f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RED_INTEGER = 0x8d94;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB_INTEGER = 0x8d98;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA_INTEGER = 0x8d99;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8 = 0x8229;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8 = 0x822b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R16F = 0x822d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R32F = 0x822e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG16F = 0x822f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG32F = 0x8230;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8I = 0x8231;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8UI = 0x8232;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R16I = 0x8233;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R16UI = 0x8234;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R32I = 0x8235;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R32UI = 0x8236;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8I = 0x8237;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8UI = 0x8238;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG16I = 0x8239;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG16UI = 0x823a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG32I = 0x823b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG32UI = 0x823c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8_SNORM = 0x8f94;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8_SNORM = 0x8f95;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8_SNORM = 0x8f96;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8_SNORM = 0x8f97;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB10_A2UI = 0x906f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_IMMUTABLE_FORMAT = 0x912f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_IMMUTABLE_LEVELS = 0x82df;\r\n// Pixel types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8c3b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_5_9_9_9_REV = 0x8c3e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8dad;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_24_8 = 0x84fa;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_HALF_FLOAT = 0x140b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG = 0x8227;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG_INTEGER = 0x8228;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_2_10_10_10_REV = 0x8d9f;\r\n// Queries\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_QUERY = 0x8865;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT = 0x8866;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT_AVAILABLE = 0x8867;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ANY_SAMPLES_PASSED = 0x8c2f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8d6a;\r\n// Draw buffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_DRAW_BUFFERS = 0x8824;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER0 = 0x8825;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER1 = 0x8826;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER2 = 0x8827;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER3 = 0x8828;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER4 = 0x8829;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER5 = 0x882a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER6 = 0x882b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER7 = 0x882c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER8 = 0x882d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER9 = 0x882e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER10 = 0x882f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER11 = 0x8830;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER12 = 0x8831;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER13 = 0x8832;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER14 = 0x8833;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER15 = 0x8834;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COLOR_ATTACHMENTS = 0x8cdf;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT1 = 0x8ce1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT2 = 0x8ce2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT3 = 0x8ce3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT4 = 0x8ce4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT5 = 0x8ce5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT6 = 0x8ce6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT7 = 0x8ce7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT8 = 0x8ce8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT9 = 0x8ce9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT10 = 0x8cea;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT11 = 0x8ceb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT12 = 0x8cec;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT13 = 0x8ced;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT14 = 0x8cee;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT15 = 0x8cef;\r\n// Samplers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_3D = 0x8b5f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D_SHADOW = 0x8b62;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D_ARRAY = 0x8dc1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D_ARRAY_SHADOW = 0x8dc4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_CUBE_SHADOW = 0x8dc5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_2D = 0x8dca;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_3D = 0x8dcb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_CUBE = 0x8dcc;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_2D_ARRAY = 0x8dcf;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_2D = 0x8dd2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_3D = 0x8dd3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8dd4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8dd7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_SAMPLES = 0x8d57;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_BINDING = 0x8919;\r\n// Buffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_PACK_BUFFER = 0x88eb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_UNPACK_BUFFER = 0x88ec;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_PACK_BUFFER_BINDING = 0x88ed;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88ef;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_READ_BUFFER = 0x8f36;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_WRITE_BUFFER = 0x8f37;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_READ_BUFFER_BINDING = 0x8f36;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_WRITE_BUFFER_BINDING = 0x8f37;\r\n// Data types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT2X3 = 0x8b65;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT2X4 = 0x8b66;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT3X2 = 0x8b67;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT3X4 = 0x8b68;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT4X2 = 0x8b69;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT4X3 = 0x8b6a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_VEC2 = 0x8dc6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_VEC3 = 0x8dc7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_VEC4 = 0x8dc8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_NORMALIZED = 0x8c17;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SIGNED_NORMALIZED = 0x8f9c;\r\n// Vertex attributes\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88fd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88fe;\r\n// Transform feedback\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8c7f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8c80;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8c83;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8c84;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8c85;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8c88;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8c8a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8c8b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INTERLEAVED_ATTRIBS = 0x8c8c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SEPARATE_ATTRIBS = 0x8c8d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER = 0x8c8e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8c8f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK = 0x8e22;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_PAUSED = 0x8e23;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8e24;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BINDING = 0x8e25;\r\n// Framebuffers and renderbuffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_DEFAULT = 0x8218;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH24_STENCIL8 = 0x88f0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_FRAMEBUFFER_BINDING = 0x8ca6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_READ_FRAMEBUFFER = 0x8ca8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_FRAMEBUFFER = 0x8ca9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_READ_FRAMEBUFFER_BINDING = 0x8caa;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_SAMPLES = 0x8cab;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8cd4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8d56;\r\n// Uniforms\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER = 0x8a11;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_BINDING = 0x8a28;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_START = 0x8a29;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_SIZE = 0x8a2a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8a2b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8a2d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8a2e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8a2f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_UNIFORM_BLOCK_SIZE = 0x8a30;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8a31;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8a33;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8a34;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_UNIFORM_BLOCKS = 0x8a36;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_TYPE = 0x8a37;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_SIZE = 0x8a38;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_INDEX = 0x8a3a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_OFFSET = 0x8a3b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_ARRAY_STRIDE = 0x8a3c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_MATRIX_STRIDE = 0x8a3d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_IS_ROW_MAJOR = 0x8a3e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_BINDING = 0x8a3f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_DATA_SIZE = 0x8a40;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8a42;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8a43;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8a44;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8a46;\r\n// Sync objects\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_OBJECT_TYPE = 0x9112;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_CONDITION = 0x9113;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_STATUS = 0x9114;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_FLAGS = 0x9115;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_FENCE = 0x9116;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNALED = 0x9118;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SIGNALED = 0x9119;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ALREADY_SIGNALED = 0x911a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TIMEOUT_EXPIRED = 0x911b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CONDITION_SATISFIED = 0x911c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_WAIT_FAILED = 0x911d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001;\r\n// Miscellaneous constants\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR = 0x1800;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH = 0x1801;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL = 0x1802;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MIN = 0x8007;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX = 0x8008;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT24 = 0x81a6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STREAM_READ = 0x88e1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STREAM_COPY = 0x88e2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STATIC_READ = 0x88e5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STATIC_COPY = 0x88e6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DYNAMIC_READ = 0x88e9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DYNAMIC_COPY = 0x88ea;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT32F = 0x8cac;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH32F_STENCIL8 = 0x8cad;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_INDEX = 0xffffffff;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TIMEOUT_IGNORED = -1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247;\r\n// Constants defined in WebGL extensions\r\n// ANGLE_instanced_arrays\r\n// The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type\r\n/**\r\n * Describes the frequency divisor used for instanced rendering\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 0x88fe;\r\n// WEBGL_debug_renderer_info\r\n// The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes\r\n/**\r\n * Passed to getParameter to get the vendor string of the graphics driver\r\n * @constant {number}\r\n */\r\nconst GL_UNMASKED_VENDOR_WEBGL = 0x9245;\r\n/**\r\n * Passed to getParameter to get the renderer string of the graphics driver\r\n * @constant {number}\r\n */\r\nconst GL_UNMASKED_RENDERER_WEBGL = 0x9246;\r\n// EXT_texture_filter_anisotropic\r\n// The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF)\r\n/**\r\n * Returns the maximum available anisotropy\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84ff;\r\n/**\r\n * Passed to texParameter to set the desired maximum anisotropy for a texture\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84fe;\r\n// WEBGL_compressed_texture_s3tc\r\n// The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats\r\n/**\r\n * A DXT1-compressed image in an RGB image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83f0;\r\n/**\r\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83f1;\r\n/**\r\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83f2;\r\n/**\r\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3 compression in how the alpha compression is done\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83f3;\r\n// WEBGL_compressed_texture_s3tc_srgb\r\n// The WEBGL_compressed_texture_s3tc_srgb extension is part of the WebGL API and exposes four S3TC compressed texture formats for the sRGB colorspace\r\n/**\r\n * A DXT1-compressed image in an sRGB image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8c4c;\r\n/**\r\n * A DXT1-compressed image in an sRGB image format with a simple on/off alpha value\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8c4d;\r\n/**\r\n * A DXT3-compressed image in an sRGBA image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8c4e;\r\n/**\r\n * A DXT5-compressed image in an sRGBA image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8c4f;\r\n// WEBGL_compressed_texture_etc\r\n// The WEBGL_compressed_texture_etc extension is part of the WebGL API and exposes 10 ETC/EAC compressed texture formats\r\n/**\r\n * One-channel (red) unsigned format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_R11_EAC = 0x9270;\r\n/**\r\n * One-channel (red) signed format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SIGNED_R11_EAC = 0x9271;\r\n/**\r\n * Two-channel (red and green) unsigned format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RG11_EAC = 0x9272;\r\n/**\r\n * Two-channel (red and green) signed format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273;\r\n/**\r\n * Compresses RBG8 data with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB8_ETC2 = 0x9274;\r\n/**\r\n * Compresses RGBA8 data. The RGB part is encoded the same as RGB_ETC2, but the alpha part is encoded separately\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9275;\r\n/**\r\n * Compresses sRBG8 data with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ETC2 = 0x9276;\r\n/**\r\n * Compresses sRGBA8 data. The sRGB part is encoded the same as SRGB_ETC2, but the alpha part is encoded separately\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9277;\r\n/**\r\n * Similar to RGB8_ETC, but with ability to punch through the alpha channel, which means to make it completely opaque or transparent\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9278;\r\n/**\r\n * Similar to SRGB8_ETC, but with ability to punch through the alpha channel, which means to make it completely opaque or transparent\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9279;\r\n// WEBGL_compressed_texture_pvrtc\r\n// The WEBGL_compressed_texture_pvrtc extension is part of the WebGL API and exposes four PVRTC compressed texture formats\r\n/**\r\n * RGB compression in 4-bit mode. One block for each 4×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8c00;\r\n/**\r\n * RGBA compression in 4-bit mode. One block for each 4×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8c02;\r\n/**\r\n * RGB compression in 2-bit mode. One block for each 8×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8c01;\r\n/**\r\n * RGBA compression in 2-bit mode. One block for each 8×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8c03;\r\n// WEBGL_compressed_texture_etc1\r\n// The WEBGL_compressed_texture_etc1 extension is part of the WebGL API and exposes the ETC1 compressed texture format\r\n/**\r\n * Compresses 24-bit RGB data with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8d64;\r\n// WEBGL_compressed_texture_atc\r\n// The WEBGL_compressed_texture_atc extension is part of the WebGL API and exposes 3 ATC compressed texture formats. ATC is a proprietary compression algorithm for compressing textures on handheld devices\r\n/**\r\n * Compresses RGB textures with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_ATC_WEBGL = 0x8c92;\r\n/**\r\n * Compresses RGBA textures using explicit alpha encoding (useful when alpha transitions are sharp)\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8c92;\r\n/**\r\n * Compresses RGBA textures using interpolated alpha encoding (useful when alpha transitions are gradient)\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87ee;\r\n// WEBGL_compressed_texture_astc\r\n// The WEBGL_compressed_texture_astc extension is part of the WebGL API and exposes Adaptive Scalable Texture Compression (ASTC) compressed texture formats to WebGL\r\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\r\n// https://developer.nvidia.com/astc-texture-compression-for-game-assets\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 4x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_4X4_KHR = 0x93b0;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 5x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_5X4_KHR = 0x93b1;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 5x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_5X5_KHR = 0x93b2;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 6x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_6X5_KHR = 0x93b3;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 6x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_6X6_KHR = 0x93b4;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 8x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_8X5_KHR = 0x93b5;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 8x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_8X6_KHR = 0x93b6;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 8x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_8X8_KHR = 0x93b7;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X5_KHR = 0x93b8;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X6_KHR = 0x93b9;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X8_KHR = 0x93ba;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X10_KHR = 0x93bb;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 12x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_12X10_KHR = 0x93bc;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 12x12\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_12X12_KHR = 0x93bd;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 4x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR = 0x93d0;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 5x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR = 0x93d1;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 5x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR = 0x93d2;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 6x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR = 0x93d3;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 6x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR = 0x93d4;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR = 0x93d5;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR = 0x93d6;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR = 0x93d7;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR = 0x93d8;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR = 0x93d9;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR = 0x93da;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR = 0x93db;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 12x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR = 0x93dc;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 12x12\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR = 0x93dd;\r\n// WEBGL_depth_texture\r\n// The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures\r\n/**\r\n * Unsigned integer type for 24-bit depth texture data\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_24_8_WEBGL = 0x84fa;\r\n// OES_texture_half_float\r\n// The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components\r\n/**\r\n * Half floating-point type (16-bit)\r\n * @constant {number}\r\n */\r\nconst GL_HALF_FLOAT_OES = 0x8d61;\r\n// WEBGL_color_buffer_float\r\n// The WEBGL_color_buffer_float extension is part of the WebGL API and adds the ability to render to 32-bit floating-point color buffers\r\n/**\r\n * RGBA 32-bit floating-point color-renderable format\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32F_EXT = 0x8814;\r\n/**\r\n * RGB 32-bit floating-point color-renderable format\r\n * @constant {number}\r\n */\r\nconst GL_RGB32F_EXT = 0x8815;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT = 0x8211;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_NORMALIZED_EXT = 0x8c17;\r\n// EXT_blend_minmax\r\n// The EXT_blend_minmax extension is part of the WebGL API and extends blending capabilities by adding two new blend equations: the minimum or maximum color components of the source and destination colors\r\n/**\r\n * Produces the minimum color components of the source and destination colors\r\n * @constant {number}\r\n */\r\nconst GL_MIN_EXT = 0x8007;\r\n/**\r\n * Produces the maximum color components of the source and destination colors\r\n * @constant {number}\r\n */\r\nconst GL_MAX_EXT = 0x8008;\r\n// EXT_sRGB\r\n// The EXT_sRGB extension is part of the WebGL API and adds sRGB support to textures and framebuffer objects\r\n/**\r\n * Unsized sRGB format that leaves the precision up to the driver\r\n * @constant {number}\r\n */\r\nconst GL_SRGB_EXT = 0x8c40;\r\n/**\r\n * Unsized sRGB format with unsized alpha component\r\n * @constant {number}\r\n */\r\nconst GL_SRGB_ALPHA_EXT = 0x8c42;\r\n/**\r\n * Sized (8-bit) sRGB and alpha formats\r\n * @constant {number}\r\n */\r\nconst GL_SRGB8_ALPHA8_EXT = 0x8c43;\r\n/**\r\n * Returns the framebuffer color encoding\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210;\r\n// OES_standard_derivatives\r\n// The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth\r\n/**\r\n * Indicates the accuracy of the derivative calculation for the GLSL built-in functions: dFdx, dFdy, and fwidth\r\n * @constant {number}\r\n */\r\nconst GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8b8b;\r\n// WEBGL_draw_buffers\r\n// The WEBGL_draw_buffers extension is part of the WebGL API and enables a fragment shader to write to several textures, which is useful for deferred shading, for example\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT0_WEBGL = 0x8ce0;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT1_WEBGL = 0x8ce1;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT2_WEBGL = 0x8ce2;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT3_WEBGL = 0x8ce3;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT4_WEBGL = 0x8ce4;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT5_WEBGL = 0x8ce5;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT6_WEBGL = 0x8ce6;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT7_WEBGL = 0x8ce7;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT8_WEBGL = 0x8ce8;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT9_WEBGL = 0x8ce9;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT10_WEBGL = 0x8cea;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT11_WEBGL = 0x8ceb;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT12_WEBGL = 0x8cec;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT13_WEBGL = 0x8ced;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT14_WEBGL = 0x8cee;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT15_WEBGL = 0x8cef;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER0_WEBGL = 0x8825;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER1_WEBGL = 0x8826;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER2_WEBGL = 0x8827;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER3_WEBGL = 0x8828;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER4_WEBGL = 0x8829;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER5_WEBGL = 0x882a;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER6_WEBGL = 0x882b;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER7_WEBGL = 0x882c;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER8_WEBGL = 0x882d;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER9_WEBGL = 0x882e;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER10_WEBGL = 0x882f;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER11_WEBGL = 0x8830;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER12_WEBGL = 0x8831;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER13_WEBGL = 0x8832;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER14_WEBGL = 0x8833;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER15_WEBGL = 0x8834;\r\n/**\r\n * Maximum number of framebuffer color attachment points\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8cdf;\r\n/**\r\n * Maximum number of draw buffers\r\n * @constant {number}\r\n */\r\nconst GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824;\r\n// OES_vertex_array_object\r\n// The OES_vertex_array_object extension is part of the WebGL API and provides vertex array objects (VAOs) which encapsulate vertex array states. These objects keep pointers to vertex data and provide names for different sets of vertex data\r\n/**\r\n * The bound vertex array object (VAO)\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ARRAY_BINDING_OES = 0x85b5;\r\n// EXT_disjoint_timer_query\r\n// The EXT_disjoint_timer_query extension is part of the WebGL API and provides a way to measure the duration of a set of GL commands, without stalling the rendering pipeline\r\n/**\r\n * The number of bits used to hold the query result for the given target\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_COUNTER_BITS_EXT = 0x8864;\r\n/**\r\n * The currently active query\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_QUERY_EXT = 0x8865;\r\n/**\r\n * The query result\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT_EXT = 0x8866;\r\n/**\r\n * A Boolean indicating whether or not a query result is available\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867;\r\n/**\r\n * Elapsed time (in nanoseconds)\r\n * @constant {number}\r\n */\r\nconst GL_TIME_ELAPSED_EXT = 0x88bf;\r\n/**\r\n * The current time\r\n * @constant {number}\r\n */\r\nconst GL_TIMESTAMP_EXT = 0x8e28;\r\n/**\r\n * A Boolean indicating whether or not the GPU performed any disjoint operation\r\n * @constant {number}\r\n */\r\nconst GL_GPU_DISJOINT_EXT = 0x8fbb;\r\n// Constants defined in WebGL draft extensions\r\n// KHR_parallel_shader_compile\r\n// The KHR_parallel_shader_compile extension is part of the WebGL draft API and provides multithreaded asynchronous shader compilation\r\n/**\r\n * Query to determine if the compilation process is complete\r\n * @constant {number}\r\n */\r\nconst GL_COMPLETION_STATUS_KHR = 0x91b1;\n\nexport { GL_ACTIVE_ATTRIBUTES, GL_ACTIVE_TEXTURE, GL_ACTIVE_UNIFORMS, GL_ACTIVE_UNIFORM_BLOCKS, GL_ALIASED_LINE_WIDTH_RANGE, GL_ALIASED_POINT_SIZE_RANGE, GL_ALPHA, GL_ALPHA_BITS, GL_ALREADY_SIGNALED, GL_ALWAYS, GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE, GL_ARRAY_BUFFER, GL_ARRAY_BUFFER_BINDING, GL_ATTACHED_SHADERS, GL_BACK, GL_BLEND, GL_BLEND_COLOR, GL_BLEND_DST_ALPHA, GL_BLEND_DST_RGB, GL_BLEND_EQUATION, GL_BLEND_EQUATION_ALPHA, GL_BLEND_EQUATION_RGB, GL_BLEND_SRC_ALPHA, GL_BLEND_SRC_RGB, GL_BLUE_BITS, GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4, GL_BROWSER_DEFAULT_WEBGL, GL_BUFFER_SIZE, GL_BUFFER_USAGE, GL_BYTE, GL_CCW, GL_CLAMP_TO_EDGE, GL_COLOR, GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT0_WEBGL, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT10, GL_COLOR_ATTACHMENT10_WEBGL, GL_COLOR_ATTACHMENT11, GL_COLOR_ATTACHMENT11_WEBGL, GL_COLOR_ATTACHMENT12, GL_COLOR_ATTACHMENT12_WEBGL, GL_COLOR_ATTACHMENT13, GL_COLOR_ATTACHMENT13_WEBGL, GL_COLOR_ATTACHMENT14, GL_COLOR_ATTACHMENT14_WEBGL, GL_COLOR_ATTACHMENT15, GL_COLOR_ATTACHMENT15_WEBGL, GL_COLOR_ATTACHMENT1_WEBGL, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT2_WEBGL, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT3_WEBGL, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT4_WEBGL, GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT5_WEBGL, GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT6_WEBGL, GL_COLOR_ATTACHMENT7, GL_COLOR_ATTACHMENT7_WEBGL, GL_COLOR_ATTACHMENT8, GL_COLOR_ATTACHMENT8_WEBGL, GL_COLOR_ATTACHMENT9, GL_COLOR_ATTACHMENT9_WEBGL, GL_COLOR_BUFFER_BIT, GL_COLOR_CLEAR_VALUE, GL_COLOR_WRITEMASK, GL_COMPARE_REF_TO_TEXTURE, GL_COMPILE_STATUS, GL_COMPLETION_STATUS_KHR, GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_COMPRESSED_RGBA_ASTC_10X10_KHR, GL_COMPRESSED_RGBA_ASTC_10X5_KHR, GL_COMPRESSED_RGBA_ASTC_10X6_KHR, GL_COMPRESSED_RGBA_ASTC_10X8_KHR, GL_COMPRESSED_RGBA_ASTC_12X10_KHR, GL_COMPRESSED_RGBA_ASTC_12X12_KHR, GL_COMPRESSED_RGBA_ASTC_4X4_KHR, GL_COMPRESSED_RGBA_ASTC_5X4_KHR, GL_COMPRESSED_RGBA_ASTC_5X5_KHR, GL_COMPRESSED_RGBA_ASTC_6X5_KHR, GL_COMPRESSED_RGBA_ASTC_6X6_KHR, GL_COMPRESSED_RGBA_ASTC_8X5_KHR, GL_COMPRESSED_RGBA_ASTC_8X6_KHR, GL_COMPRESSED_RGBA_ASTC_8X8_KHR, GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL, GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_RGB_ATC_WEBGL, GL_COMPRESSED_RGB_ETC1_WEBGL, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_COMPRESSED_TEXTURE_FORMATS, GL_CONDITION_SATISFIED, GL_CONSTANT_ALPHA, GL_CONSTANT_COLOR, GL_CONTEXT_LOST_WEBGL, GL_COPY_READ_BUFFER, GL_COPY_READ_BUFFER_BINDING, GL_COPY_WRITE_BUFFER, GL_COPY_WRITE_BUFFER_BINDING, GL_CULL_FACE, GL_CULL_FACE_MODE, GL_CURRENT_PROGRAM, GL_CURRENT_QUERY, GL_CURRENT_QUERY_EXT, GL_CURRENT_VERTEX_ATTRIB, GL_CW, GL_DECR, GL_DECR_WRAP, GL_DELETE_STATUS, GL_DEPTH, GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8, GL_DEPTH_ATTACHMENT, GL_DEPTH_BITS, GL_DEPTH_BUFFER_BIT, GL_DEPTH_CLEAR_VALUE, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32F, GL_DEPTH_FUNC, GL_DEPTH_RANGE, GL_DEPTH_STENCIL, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH_TEST, GL_DEPTH_WRITEMASK, GL_DITHER, GL_DONT_CARE, GL_DRAW_BUFFER0, GL_DRAW_BUFFER0_WEBGL, GL_DRAW_BUFFER1, GL_DRAW_BUFFER10, GL_DRAW_BUFFER10_WEBGL, GL_DRAW_BUFFER11, GL_DRAW_BUFFER11_WEBGL, GL_DRAW_BUFFER12, GL_DRAW_BUFFER12_WEBGL, GL_DRAW_BUFFER13, GL_DRAW_BUFFER13_WEBGL, GL_DRAW_BUFFER14, GL_DRAW_BUFFER14_WEBGL, GL_DRAW_BUFFER15, GL_DRAW_BUFFER15_WEBGL, GL_DRAW_BUFFER1_WEBGL, GL_DRAW_BUFFER2, GL_DRAW_BUFFER2_WEBGL, GL_DRAW_BUFFER3, GL_DRAW_BUFFER3_WEBGL, GL_DRAW_BUFFER4, GL_DRAW_BUFFER4_WEBGL, GL_DRAW_BUFFER5, GL_DRAW_BUFFER5_WEBGL, GL_DRAW_BUFFER6, GL_DRAW_BUFFER6_WEBGL, GL_DRAW_BUFFER7, GL_DRAW_BUFFER7_WEBGL, GL_DRAW_BUFFER8, GL_DRAW_BUFFER8_WEBGL, GL_DRAW_BUFFER9, GL_DRAW_BUFFER9_WEBGL, GL_DRAW_FRAMEBUFFER, GL_DRAW_FRAMEBUFFER_BINDING, GL_DST_ALPHA, GL_DST_COLOR, GL_DYNAMIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_ELEMENT_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER_BINDING, GL_EQUAL, GL_FASTEST, GL_FLOAT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT_MAT2, GL_FLOAT_MAT2X3, GL_FLOAT_MAT2X4, GL_FLOAT_MAT3, GL_FLOAT_MAT3X2, GL_FLOAT_MAT3X4, GL_FLOAT_MAT4, GL_FLOAT_MAT4X2, GL_FLOAT_MAT4X3, GL_FLOAT_VEC2, GL_FLOAT_VEC3, GL_FLOAT_VEC4, GL_FRAGMENT_SHADER, GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT, GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, GL_FRAMEBUFFER_BINDING, GL_FRAMEBUFFER_COMPLETE, GL_FRAMEBUFFER_DEFAULT, GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS, GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE, GL_FRAMEBUFFER_UNSUPPORTED, GL_FRONT, GL_FRONT_AND_BACK, GL_FRONT_FACE, GL_FUNC_ADD, GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_SUBSTRACT, GL_GENERATE_MIPMAP_HINT, GL_GEQUAL, GL_GPU_DISJOINT_EXT, GL_GREATER, GL_GREEN_BITS, GL_HALF_FLOAT, GL_HALF_FLOAT_OES, GL_HIGH_FLOAT, GL_HIGH_INT, GL_IMPLEMENTATION_COLOR_READ_FORMAT, GL_IMPLEMENTATION_COLOR_READ_TYPE, GL_INCR, GL_INCR_WRAP, GL_INT, GL_INTERLEAVED_ATTRIBS, GL_INT_2_10_10_10_REV, GL_INT_SAMPLER_2D, GL_INT_SAMPLER_2D_ARRAY, GL_INT_SAMPLER_3D, GL_INT_SAMPLER_CUBE, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4, GL_INVALID_ENUM, GL_INVALID_FRAMEBUFFER_OPERATION, GL_INVALID_INDEX, GL_INVALID_OPERATION, GL_INVALID_VALUE, GL_INVERT, GL_KEEP, GL_LEQUAL, GL_LESS, GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINES, GL_LINE_LOOP, GL_LINE_STRIP, GL_LINE_WIDTH, GL_LINK_STATUS, GL_LOW_FLOAT, GL_LOW_INT, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_MAX, GL_MAX_3D_TEXTURE_SIZE, GL_MAX_ARRAY_TEXTURE_LAYERS, GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL, GL_MAX_COLOR_ATTACHMENTS, GL_MAX_COLOR_ATTACHMENTS_WEBGL, GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, GL_MAX_COMBINED_UNIFORM_BLOCKS, GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, GL_MAX_CUBE_MAP_TEXTURE_SIZE, GL_MAX_DRAW_BUFFERS, GL_MAX_DRAW_BUFFERS_WEBGL, GL_MAX_ELEMENTS_INDICES, GL_MAX_ELEMENTS_VERTICES, GL_MAX_ELEMENT_INDEX, GL_MAX_EXT, GL_MAX_FRAGMENT_INPUT_COMPONENTS, GL_MAX_FRAGMENT_UNIFORM_BLOCKS, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, GL_MAX_FRAGMENT_UNIFORM_VECTORS, GL_MAX_PROGRAM_TEXEL_OFFSET, GL_MAX_RENDERBUFFER_SIZE, GL_MAX_SAMPLES, GL_MAX_SERVER_WAIT_TIMEOUT, GL_MAX_TEXTURE_IMAGE_UNITS, GL_MAX_TEXTURE_LOD_BIAS, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, GL_MAX_TEXTURE_SIZE, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, GL_MAX_UNIFORM_BLOCK_SIZE, GL_MAX_UNIFORM_BUFFER_BINDINGS, GL_MAX_VARYING_COMPONENTS, GL_MAX_VARYING_VECTORS, GL_MAX_VERTEX_ATTRIBS, GL_MAX_VERTEX_OUTPUT_COMPONENTS, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, GL_MAX_VERTEX_UNIFORM_BLOCKS, GL_MAX_VERTEX_UNIFORM_COMPONENTS, GL_MAX_VERTEX_UNIFORM_VECTORS, GL_MAX_VIEWPORT_DIMS, GL_MEDIUM_FLOAT, GL_MEDIUM_INT, GL_MIN, GL_MIN_EXT, GL_MIN_PROGRAM_TEXEL_OFFSET, GL_MIRRORED_REPEAT, GL_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEVER, GL_NICEST, GL_NONE, GL_NOTEQUAL, GL_NO_ERROR, GL_OBJECT_TYPE, GL_ONE, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_COLOR, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_OUT_OF_MEMORY, GL_PACK_ALIGNMENT, GL_PACK_ROW_LENGTH, GL_PACK_SKIP_PIXELS, GL_PACK_SKIP_ROWS, GL_PIXEL_PACK_BUFFER, GL_PIXEL_PACK_BUFFER_BINDING, GL_PIXEL_UNPACK_BUFFER, GL_PIXEL_UNPACK_BUFFER_BINDING, GL_POINTS, GL_POLYGON_OFFSET_FACTOR, GL_POLYGON_OFFSET_FILL, GL_POLYGON_OFFSET_UNITS, GL_QUERY_COUNTER_BITS_EXT, GL_QUERY_RESULT, GL_QUERY_RESULT_AVAILABLE, GL_QUERY_RESULT_AVAILABLE_EXT, GL_QUERY_RESULT_EXT, GL_R11F_G11F_B10F, GL_R16F, GL_R16I, GL_R16UI, GL_R32F, GL_R32I, GL_R32UI, GL_R8, GL_R8I, GL_R8UI, GL_R8_SNORM, GL_RASTERIZER_DISCARD, GL_READ_BUFFER, GL_READ_FRAMEBUFFER, GL_READ_FRAMEBUFFER_BINDING, GL_RED, GL_RED_BITS, GL_RED_INTEGER, GL_RENDERBUFFER, GL_RENDERBUFFER_ALPHA_SIZE, GL_RENDERBUFFER_BINDING, GL_RENDERBUFFER_BLUE_SIZE, GL_RENDERBUFFER_DEPTH_SIZE, GL_RENDERBUFFER_GREEN_SIZE, GL_RENDERBUFFER_HEIGHT, GL_RENDERBUFFER_INTERNAL_FORMAT, GL_RENDERBUFFER_RED_SIZE, GL_RENDERBUFFER_SAMPLES, GL_RENDERBUFFER_STENCIL_SIZE, GL_RENDERBUFFER_WIDTH, GL_RENDERER, GL_REPEAT, GL_REPLACE, GL_RG, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG32F, GL_RG32I, GL_RG32UI, GL_RG8, GL_RG8I, GL_RG8UI, GL_RG8_SNORM, GL_RGB, GL_RGB10_A2, GL_RGB10_A2UI, GL_RGB16F, GL_RGB16I, GL_RGB16UI, GL_RGB32F, GL_RGB32F_EXT, GL_RGB32I, GL_RGB32UI, GL_RGB565, GL_RGB5_A1, GL_RGB8, GL_RGB8I, GL_RGB8UI, GL_RGB8_SNORM, GL_RGB9_E5, GL_RGBA, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32F, GL_RGBA32F_EXT, GL_RGBA32I, GL_RGBA32UI, GL_RGBA4, GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM, GL_RGBA_INTEGER, GL_RGB_INTEGER, GL_RG_INTEGER, GL_SAMPLER_2D, GL_SAMPLER_2D_ARRAY, GL_SAMPLER_2D_ARRAY_SHADOW, GL_SAMPLER_2D_SHADOW, GL_SAMPLER_3D, GL_SAMPLER_BINDING, GL_SAMPLER_CUBE, GL_SAMPLER_CUBE_SHADOW, GL_SAMPLES, GL_SAMPLE_ALPHA_TO_COVERAGE, GL_SAMPLE_BUFFERS, GL_SAMPLE_COVERAGE, GL_SAMPLE_COVERAGE_INVERT, GL_SAMPLE_COVERAGE_VALUE, GL_SCISSOR_BOX, GL_SCISSOR_TEST, GL_SEPARATE_ATTRIBS, GL_SHADER_TYPE, GL_SHADING_LANGUAGE_VERSION, GL_SHORT, GL_SIGNALED, GL_SIGNED_NORMALIZED, GL_SRC_ALPHA, GL_SRC_ALPHA_SATURATE, GL_SRC_COLOR, GL_SRGB, GL_SRGB8, GL_SRGB8_ALPHA8, GL_SRGB8_ALPHA8_EXT, GL_SRGB_ALPHA_EXT, GL_SRGB_EXT, GL_STATIC_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STENCIL, GL_STENCIL_ATTACHMENT, GL_STENCIL_BACK_FAIL, GL_STENCIL_BACK_FUNC, GL_STENCIL_BACK_PASS_DEPTH_FAIL, GL_STENCIL_BACK_PASS_DEPTH_PASS, GL_STENCIL_BACK_REF, GL_STENCIL_BACK_VALUE_MASK, GL_STENCIL_BACK_WRITEMASK, GL_STENCIL_BITS, GL_STENCIL_BUFFER_BIT, GL_STENCIL_CLEAR_VALUE, GL_STENCIL_FAIL, GL_STENCIL_FUNC, GL_STENCIL_INDEX, GL_STENCIL_INDEX8, GL_STENCIL_PASS_DEPTH_FAIL, GL_STENCIL_PASS_DEPTH_PASS, GL_STENCIL_REF, GL_STENCIL_TEST, GL_STENCIL_VALUE_MASK, GL_STENCIL_WRITEMASK, GL_STREAM_COPY, GL_STREAM_DRAW, GL_STREAM_READ, GL_SUBPIXEL_BITS, GL_SYNC_CONDITION, GL_SYNC_FENCE, GL_SYNC_FLAGS, GL_SYNC_FLUSH_COMMANDS_BIT, GL_SYNC_GPU_COMMANDS_COMPLETE, GL_SYNC_STATUS, GL_TEXTURE, GL_TEXTURE0, GL_TEXTURE1, GL_TEXTURE10, GL_TEXTURE11, GL_TEXTURE12, GL_TEXTURE13, GL_TEXTURE14, GL_TEXTURE15, GL_TEXTURE16, GL_TEXTURE17, GL_TEXTURE18, GL_TEXTURE19, GL_TEXTURE2, GL_TEXTURE20, GL_TEXTURE21, GL_TEXTURE22, GL_TEXTURE23, GL_TEXTURE24, GL_TEXTURE25, GL_TEXTURE26, GL_TEXTURE27, GL_TEXTURE28, GL_TEXTURE29, GL_TEXTURE3, GL_TEXTURE30, GL_TEXTURE31, GL_TEXTURE4, GL_TEXTURE5, GL_TEXTURE6, GL_TEXTURE7, GL_TEXTURE8, GL_TEXTURE9, GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_BINDING_2D, GL_TEXTURE_BINDING_2D_ARRAY, GL_TEXTURE_BINDING_3D, GL_TEXTURE_BINDING_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_IMMUTABLE_FORMAT, GL_TEXTURE_IMMUTABLE_LEVELS, GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MAX_ANISOTROPY_EXT, GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, GL_TIMEOUT_EXPIRED, GL_TIMEOUT_IGNORED, GL_TIMESTAMP_EXT, GL_TIME_ELAPSED_EXT, GL_TRANSFORM_FEEDBACK, GL_TRANSFORM_FEEDBACK_ACTIVE, GL_TRANSFORM_FEEDBACK_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER_MODE, GL_TRANSFORM_FEEDBACK_BUFFER_SIZE, GL_TRANSFORM_FEEDBACK_BUFFER_START, GL_TRANSFORM_FEEDBACK_PAUSED, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_TRANSFORM_FEEDBACK_VARYINGS, GL_TRIANGLES, GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_UNIFORM_ARRAY_STRIDE, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, GL_UNIFORM_BLOCK_BINDING, GL_UNIFORM_BLOCK_DATA_SIZE, GL_UNIFORM_BLOCK_INDEX, GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER, GL_UNIFORM_BUFFER, GL_UNIFORM_BUFFER_BINDING, GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, GL_UNIFORM_BUFFER_SIZE, GL_UNIFORM_BUFFER_START, GL_UNIFORM_IS_ROW_MAJOR, GL_UNIFORM_MATRIX_STRIDE, GL_UNIFORM_OFFSET, GL_UNIFORM_SIZE, GL_UNIFORM_TYPE, GL_UNMASKED_RENDERER_WEBGL, GL_UNMASKED_VENDOR_WEBGL, GL_UNPACK_ALIGNMENT, GL_UNPACK_COLORSPACE_CONVERSION_WEBGL, GL_UNPACK_FLIP_Y_WEBGL, GL_UNPACK_IMAGE_HEIGHT, GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL, GL_UNPACK_ROW_LENGTH, GL_UNPACK_SKIP_IMAGES, GL_UNPACK_SKIP_PIXELS, GL_UNPACK_SKIP_ROWS, GL_UNSIGNALED, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_INT_24_8_WEBGL, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_5_9_9_9_REV, GL_UNSIGNED_INT_SAMPLER_2D, GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, GL_UNSIGNED_INT_SAMPLER_3D, GL_UNSIGNED_INT_SAMPLER_CUBE, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED_EXT, GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_5_6_5, GL_VALIDATE_STATUS, GL_VENDOR, GL_VERSION, GL_VERTEX_ARRAY_BINDING, GL_VERTEX_ARRAY_BINDING_OES, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE, GL_VERTEX_ATTRIB_ARRAY_ENABLED, GL_VERTEX_ATTRIB_ARRAY_INTEGER, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, GL_VERTEX_ATTRIB_ARRAY_POINTER, GL_VERTEX_ATTRIB_ARRAY_SIZE, GL_VERTEX_ATTRIB_ARRAY_STRIDE, GL_VERTEX_ATTRIB_ARRAY_TYPE, GL_VERTEX_SHADER, GL_VIEWPORT, GL_WAIT_FAILED, GL_ZERO };\n","export const isSSR = typeof window === 'undefined';\n","import { isSSR } from './ssr';\n\nexport const deviceInfo = (() => {\n if (isSSR) {\n return;\n }\n\n const { userAgent, platform, maxTouchPoints } = window.navigator;\n\n const isIOS = /(iphone|ipod|ipad)/i.test(userAgent);\n\n // Workaround for ipadOS, force detection as tablet\n // SEE: https://github.com/lancedikson/bowser/issues/329\n // SEE: https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct\n const isIpad =\n platform === 'iPad' ||\n // @ts-expect-error window.MSStream is non standard\n (platform === 'MacIntel' && maxTouchPoints > 0 && !window.MSStream);\n\n const isAndroid = /android/i.test(userAgent);\n\n return {\n isIpad,\n isMobile: isAndroid || isIOS || isIpad,\n isSafari12: /Version\\/12.+Safari/.test(userAgent),\n };\n})();\n","// Caches\nconst array: number[] = [];\nconst charCodeCache: number[] = [];\n\n// Compute the difference (distance) between two strings\n// SEE: https://en.wikipedia.org/wiki/Levenshtein_distance\n// CREDIT: https://github.com/sindresorhus/leven (version 3.1.0)\nexport function getLevenshteinDistance(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n\n const swap = left;\n\n // Swapping the strings if `a` is longer than `b` so we know which one is the\n // shortest & which one is the longest\n if (left.length > right.length) {\n left = right;\n right = swap;\n }\n\n let leftLength = left.length;\n let rightLength = right.length;\n\n // Performing suffix trimming:\n // We can linearly drop suffix common to both strings since they\n // don't increase distance at all\n // Note: `~-` is the bitwise way to perform a `- 1` operation\n while (leftLength > 0 &&\n left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength)) {\n leftLength--;\n rightLength--;\n }\n\n // Performing prefix trimming\n // We can linearly drop prefix common to both strings since they\n // don't increase distance at all\n let start = 0;\n\n while (start < leftLength &&\n left.charCodeAt(start) === right.charCodeAt(start)) {\n start++;\n }\n\n leftLength -= start;\n rightLength -= start;\n\n if (leftLength === 0) {\n return rightLength;\n }\n\n let bCharCode;\n let result = 0;\n let temp;\n let temp2;\n let i = 0;\n let j = 0;\n\n while (i < leftLength) {\n charCodeCache[i] = left.charCodeAt(start + i);\n array[i] = ++i;\n }\n\n while (j < rightLength) {\n bCharCode = right.charCodeAt(start + j);\n temp = j++;\n result = j;\n\n for (i = 0; i < leftLength; i++) {\n temp2 = bCharCode === charCodeCache[i] ? temp : temp + 1;\n temp = array[i];\n // eslint-disable-next-line no-multi-assign\n result = array[i] =\n temp > result\n ? temp2 > result\n ? result + 1\n : temp2\n : temp2 > temp\n ? temp + 1\n : temp2;\n }\n }\n\n return result;\n}\n","export function isDefined(val: T | undefined | null | void): val is T {\n return val !== undefined && val !== null;\n}\n","export class OutdatedBenchmarksError extends Error {\n constructor(message?: string) {\n super(message); // 'Error' breaks prototype chain here\n Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain\n }\n}\n","// Data\nimport { version } from '../package.json';\n\n// Internal\nimport { BLOCKLISTED_GPUS } from './internal/blocklistedGPUS';\nimport { cleanRenderer } from './internal/cleanRenderer';\nimport { deobfuscateRenderer } from './internal/deobfuscateRenderer';\nimport { deviceInfo } from './internal/deviceInfo';\nimport { getLevenshteinDistance } from './internal/getLevenshteinDistance';\nimport { getGPUVersion } from './internal/getGPUVersion';\nimport { getWebGLContext } from './internal/getWebGLContext';\nimport { isSSR } from './internal/ssr';\nimport { isDefined } from './internal/util';\nimport { OutdatedBenchmarksError } from './internal/error';\n\n// Types\nexport interface GetGPUTier {\n /**\n * URL of directory where benchmark data is hosted.\n *\n * @default https://unpkg.com/detect-gpu@{version}/dist/benchmarks\n */\n benchmarksURL?: string;\n /**\n * Optionally pass in a WebGL context to avoid creating a temporary one\n * internally.\n */\n glContext?: WebGLRenderingContext | WebGL2RenderingContext;\n /**\n * Whether to fail if the system performance is low or if no hardware GPU is\n * available.\n *\n * @default false\n */\n failIfMajorPerformanceCaveat?: boolean;\n /**\n * Framerate per tier for mobile devices.\n *\n * @defaultValue [0, 15, 30, 60]\n */\n mobileTiers?: number[];\n /**\n * Framerate per tier for desktop devices.\n *\n * @defaultValue [0, 15, 30, 60]\n */\n desktopTiers?: number[];\n /**\n * Optionally override specific parameters. Used mainly for testing.\n */\n override?: {\n renderer?: string;\n /**\n * Override whether device is an iPad.\n */\n isIpad?: boolean;\n /**\n * Override whether device is a mobile device.\n */\n isMobile?: boolean;\n /**\n * Override device screen size.\n */\n screenSize?: { width: number; height: number };\n /**\n * Override how benchmark data is loaded\n */\n loadBenchmarks?: (file: string) => Promise;\n };\n}\n\nexport type TierType =\n | 'SSR'\n | 'WEBGL_UNSUPPORTED'\n | 'BLOCKLISTED'\n | 'FALLBACK'\n | 'BENCHMARK';\n\nexport type TierResult = {\n tier: number;\n type: TierType;\n isMobile?: boolean;\n fps?: number;\n gpu?: string;\n device?: string;\n};\n\nexport type ModelEntryScreen = [number, number, number, string | undefined];\n\nexport type ModelEntry = [string, string, 0 | 1, ModelEntryScreen[]];\n\nconst debug = false ? console.log : undefined;\n\nexport const getGPUTier = async ({\n mobileTiers = [0, 15, 30, 60],\n desktopTiers = [0, 15, 30, 60],\n override = {},\n glContext,\n failIfMajorPerformanceCaveat = false,\n benchmarksURL = `https://unpkg.com/detect-gpu@${version}/dist/benchmarks`,\n}: GetGPUTier = {}): Promise => {\n const queryCache: { [k: string]: Promise } = {};\n if (isSSR) {\n return {\n tier: 0,\n type: 'SSR',\n };\n }\n\n const {\n isIpad = !!deviceInfo?.isIpad,\n isMobile = !!deviceInfo?.isMobile,\n screenSize = window.screen,\n loadBenchmarks = async (file: string) => {\n const data: ModelEntry[] = await fetch(`${benchmarksURL}/${file}`).then(\n (response) => response.json()\n );\n\n // Remove version tag and check version is supported\n const version = parseInt(\n (data.shift() as unknown as string).split('.')[0],\n 10\n );\n if (version < 4) {\n throw new OutdatedBenchmarksError(\n 'Detect GPU benchmark data is out of date. Please update to version 4x'\n );\n }\n return data;\n },\n } = override;\n let { renderer } = override;\n const getGpuType = (renderer: string) => {\n const types = isMobile\n ? (['adreno', 'apple', 'mali-t', 'mali', 'nvidia', 'powervr'] as const)\n : (['intel', 'apple', 'amd', 'radeon', 'nvidia', 'geforce'] as const);\n for (const type of types) {\n if (renderer.includes(type)) {\n return type;\n }\n }\n };\n\n async function queryBenchmarks(renderer: string) {\n const type = getGpuType(renderer);\n if (!type) {\n return;\n }\n\n debug?.('queryBenchmarks - found type:', { type });\n\n const benchmarkFile = `${isMobile ? 'm' : 'd'}-${type}${\n isIpad ? '-ipad' : ''\n }.json`;\n\n const benchmark = (queryCache[benchmarkFile] =\n queryCache[benchmarkFile] ?? loadBenchmarks(benchmarkFile));\n let benchmarks: ModelEntry[];\n try {\n benchmarks = await benchmark;\n } catch (error) {\n if (error instanceof OutdatedBenchmarksError) {\n throw error;\n }\n debug?.(\"queryBenchmarks - couldn't load benchmark:\", { error });\n return;\n }\n\n const version = getGPUVersion(renderer);\n\n let matched = benchmarks.filter(\n ([, modelVersion]) => modelVersion === version\n );\n\n debug?.(\n `found ${matched.length} matching entries using version '${version}':`,\n\n matched.map(([model]) => model)\n );\n\n // If nothing matched, try comparing model names:\n if (!matched.length) {\n matched = benchmarks.filter(([model]) => model.includes(renderer));\n\n debug?.(\n `found ${matched.length} matching entries comparing model names`,\n {\n matched,\n }\n );\n }\n\n const matchCount = matched.length;\n\n if (matchCount === 0) {\n return;\n }\n\n // eslint-disable-next-line prefer-const\n let [gpu, , , fpsesByPixelCount] =\n matchCount > 1\n ? matched\n .map(\n (match) =>\n [match, getLevenshteinDistance(renderer, match[0])] as const\n )\n .sort(([, a], [, b]) => a - b)[0][0]\n : matched[0];\n\n debug?.(\n `${renderer} matched closest to ${gpu} with the following screen sizes`,\n JSON.stringify(fpsesByPixelCount)\n );\n\n let minDistance = Number.MAX_VALUE;\n let closest: ModelEntryScreen | undefined;\n const { devicePixelRatio } = window;\n const pixelCount =\n screenSize.width *\n devicePixelRatio *\n screenSize.height *\n devicePixelRatio;\n\n for (const match of fpsesByPixelCount) {\n const [width, height] = match;\n const entryPixelCount = width * height;\n const distance = Math.abs(pixelCount - entryPixelCount);\n\n if (distance < minDistance) {\n minDistance = distance;\n closest = match;\n }\n }\n\n if (!closest) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [, , fps, device] = closest!;\n\n return [minDistance, fps, gpu, device] as const;\n };\n\n const toResult = (\n tier: number,\n type: TierType,\n gpu?: string,\n fps?: number,\n device?: string\n ) => ({\n device,\n fps,\n gpu,\n isMobile,\n tier,\n type,\n });\n\n let renderers: string[];\n let rawRenderer = '';\n\n if (!renderer) {\n const gl =\n glContext ||\n getWebGLContext(deviceInfo?.isSafari12, failIfMajorPerformanceCaveat);\n\n if (!gl) {\n return toResult(0, 'WEBGL_UNSUPPORTED');\n }\n\n const debugRendererInfo = gl.getExtension('WEBGL_debug_renderer_info');\n\n if (debugRendererInfo) {\n renderer = gl.getParameter(debugRendererInfo.UNMASKED_RENDERER_WEBGL);\n }\n\n if (!renderer) {\n return toResult(1, 'FALLBACK');\n }\n\n rawRenderer = renderer;\n renderer = cleanRenderer(renderer);\n renderers = deobfuscateRenderer(gl, renderer, isMobile);\n } else {\n renderer = cleanRenderer(renderer);\n renderers = [renderer];\n }\n\n const results = (await Promise.all(renderers.map(queryBenchmarks)))\n .filter(isDefined)\n .sort(([aDis = Number.MAX_VALUE, aFps], [bDis = Number.MAX_VALUE, bFps]) =>\n aDis === bDis ? aFps - bFps : aDis - bDis\n );\n if (!results.length) {\n const blocklistedModel: string | undefined = BLOCKLISTED_GPUS.find(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (blocklistedModel) => renderer!.includes(blocklistedModel)\n );\n return blocklistedModel\n ? toResult(0, 'BLOCKLISTED', blocklistedModel)\n : toResult(1, 'FALLBACK', `${renderer} (${rawRenderer})`);\n }\n\n const [, fps, model, device] = results[0];\n\n if (fps === -1) {\n return toResult(0, 'BLOCKLISTED', model, fps, device);\n }\n\n const tiers = isMobile ? mobileTiers : desktopTiers;\n let tier = 0;\n\n for (let i = 0; i < tiers.length; i++) {\n if (fps >= tiers[i]) {\n tier = i;\n }\n }\n\n return toResult(tier, 'BENCHMARK', model, fps, device);\n};\n","export function getWebGLContext(isSafari12?: boolean,\n failIfMajorPerformanceCaveat = false) {\n const attributes: {\n alpha: boolean;\n antialias: boolean;\n depth: boolean;\n failIfMajorPerformanceCaveat: boolean;\n powerPreference?: string;\n stencil: boolean;\n } = {\n alpha: false,\n antialias: false,\n depth: false,\n failIfMajorPerformanceCaveat,\n powerPreference: 'high-performance',\n stencil: false,\n };\n\n // Workaround for Safari 12, which otherwise crashes with powerPreference set\n // to high-performance: https://github.com/pmndrs/detect-gpu/issues/5\n if (isSafari12) {\n delete attributes.powerPreference;\n }\n\n const canvas = window.document.createElement('canvas');\n\n const gl = (canvas.getContext('webgl', attributes) ||\n canvas.getContext(\n 'experimental-webgl',\n attributes\n )) as WebGLRenderingContext | null;\n\n return gl ?? undefined;\n}\n","// Internal\nimport { deobfuscateAppleGPU } from './deobfuscateAppleGPU';\n\nexport function deobfuscateRenderer(\n gl: WebGLRenderingContext | WebGL2RenderingContext,\n renderer: string,\n isMobileTier: boolean\n) {\n return renderer === 'apple gpu'\n ? deobfuscateAppleGPU(gl, renderer, isMobileTier)\n : [renderer];\n}\n","// Vendor\nimport {\n GL_ARRAY_BUFFER,\n GL_COLOR_BUFFER_BIT,\n GL_FLOAT,\n GL_FRAGMENT_SHADER,\n GL_RGBA,\n GL_STATIC_DRAW,\n GL_TRIANGLES,\n GL_UNSIGNED_BYTE,\n GL_VERTEX_SHADER,\n} from 'webgl-constants';\n\n// Internal\nimport { deviceInfo } from './deviceInfo';\n\nconst debug = false ? console.warn : undefined;\n\nexport function deobfuscateAppleGPU(\n gl: WebGLRenderingContext,\n renderer: string,\n isMobileTier: boolean\n) {\n if (!isMobileTier) {\n debug?.('Safari 14+ obfuscates its GPU type and version, using fallback');\n return [renderer];\n }\n const pixelId = calculateMagicPixelId(gl);\n const codeA = '801621810' as const;\n const codeB = '8016218135' as const;\n const codeC = '80162181161' as const;\n\n // All chipsets that support at least iOS 12:\n const possibleChipsets: [\n string,\n typeof codeA | typeof codeB | typeof codeC,\n number\n ][] = deviceInfo?.isIpad\n ? [\n // ['a4', 5], // ipad 1st gen\n // ['a5', 9], // ipad 2 / ipad mini 1st gen\n // ['a5x', 9], // ipad 3rd gen\n // ['a6x', 10], // ipad 4th gen\n ['a7', codeC, 12], // ipad air / ipad mini 2 / ipad mini 3\n ['a8', codeB, 15], // pad mini 4\n ['a8x', codeB, 15], // ipad air 2\n ['a9', codeB, 15], // ipad 5th gen\n ['a9x', codeB, 15], // pro 9.7 2016 / pro 12.9 2015\n ['a10', codeB, 15], // ipad 7th gen / ipad 6th gen\n ['a10x', codeB, 15], // pro 10.5 2017 / pro 12.9 2nd gen, 2017\n ['a12', codeA, 15], // ipad 8th gen / ipad air 3rd gen / ipad mini 5th gen\n ['a12x', codeA, 15], // pro 11 1st gen / pro 12.9 3rd gen\n ['a12z', codeA, 15], // pro 12.9 4th gen / pro 11 2nd gen\n ['a14', codeA, 15], // ipad air 4th gen\n ['m1', codeA, 15], // ipad pro 11 2nd gen / 12.9 5th gen\n ]\n : [\n // ['a4', 7], // 4 / ipod touch 4th gen\n // ['a5', 9], // 4S / ipod touch 5th gen\n // ['a6', 10], // 5 / 5C\n ['a7', codeC, 12], // 5S\n ['a8', codeB, 12], // 6 / 6 plus / ipod touch 6th gen\n ['a9', codeB, 15], // 6s / 6s plus/ se 1st gen\n ['a10', codeB, 15], // 7 / 7 plus / iPod Touch 7th gen\n ['a11', codeA, 15], // 8 / 8 plus / X\n ['a12', codeA, 15], // XS / XS Max / XR\n ['a13', codeA, 15], // 11 / 11 pro / 11 pro max / se 2nd gen\n ['a14', codeA, 15], // 12 / 12 mini / 12 pro / 12 pro max\n ];\n let chipsets: typeof possibleChipsets;\n\n // In iOS 14.x Apple started normalizing the outcome of this hack,\n // we use this fact to limit the list to devices that support ios 14+\n if (pixelId === '80162181255') {\n chipsets = possibleChipsets.filter(([, , iosVersion]) => iosVersion >= 14);\n } else {\n chipsets = possibleChipsets.filter(([, id]) => id === pixelId);\n // If nothing was found to match the pixel id, include all chipsets:\n if (!chipsets.length) {\n chipsets = possibleChipsets;\n }\n }\n const renderers = chipsets.map(([gpu]) => `apple ${gpu} gpu`);\n debug?.(\n `iOS 12.2+ obfuscates its GPU type and version, using closest matches: ${JSON.stringify(renderers)}`\n );\n return renderers;\n}\n\n// Apple GPU (iOS 12.2+, Safari 14+)\n// SEE: https://github.com/pmndrs/detect-gpu/issues/7\n// CREDIT: https://medium.com/@Samsy/detecting-apple-a10-iphone-7-to-a11-iphone-8-and-b019b8f0eb87\n// CREDIT: https://github.com/Samsy/appleGPUDetection/blob/master/index.js\nfunction calculateMagicPixelId(gl: WebGLRenderingContext) {\n const vertexShaderSource = /* glsl */ `\n precision highp float;\n attribute vec3 aPosition;\n varying float vvv;\n void main() {\n vvv = 0.31622776601683794;\n gl_Position = vec4(aPosition, 1.0);\n }\n `;\n\n const fragmentShaderSource = /* glsl */ `\n precision highp float;\n varying float vvv;\n void main() {\n vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * vvv;\n enc = fract(enc);\n enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);\n gl_FragColor = enc;\n }\n `;\n\n const vertexShader = gl.createShader(GL_VERTEX_SHADER);\n const fragmentShader = gl.createShader(GL_FRAGMENT_SHADER);\n const program = gl.createProgram();\n if (!(fragmentShader && vertexShader && program)) return;\n gl.shaderSource(vertexShader, vertexShaderSource);\n gl.shaderSource(fragmentShader, fragmentShaderSource);\n gl.compileShader(vertexShader);\n gl.compileShader(fragmentShader);\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n\n gl.detachShader(program, vertexShader);\n gl.detachShader(program, fragmentShader);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n gl.useProgram(program);\n\n const vertexArray = gl.createBuffer();\n gl.bindBuffer(GL_ARRAY_BUFFER, vertexArray);\n gl.bufferData(\n GL_ARRAY_BUFFER,\n new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]),\n GL_STATIC_DRAW\n );\n\n const aPosition = gl.getAttribLocation(program, 'aPosition');\n gl.vertexAttribPointer(aPosition, 3, GL_FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(aPosition);\n\n gl.clearColor(1, 1, 1, 1);\n gl.clear(GL_COLOR_BUFFER_BIT);\n gl.viewport(0, 0, 1, 1);\n gl.drawArrays(GL_TRIANGLES, 0, 3);\n\n const pixels = new Uint8Array(4);\n gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n\n gl.deleteProgram(program);\n gl.deleteBuffer(vertexArray);\n return pixels.join('');\n}\n","export function getGPUVersion(model: string) {\n model = model.replace(/\\([^)]+\\)/, '');\n\n const matches =\n // First set of digits\n model.match(/\\d+/) ||\n // If the renderer did not contain any numbers, match letters\n model.match(/(\\W|^)([A-Za-z]{1,3})(\\W|$)/g);\n\n // Remove any non-word characters and also remove 'amd' which could be matched\n // in the clause above\n return matches?.join('').replace(/\\W|amd/g, '') ?? '';\n}\n","import renderingEngineCache from './renderingEngineCache';\nimport type { IRenderingEngine } from '../types';\n\n/**\n * Method to retrieve a RenderingEngine by its unique identifier.\n *\n * @example\n * How to get a RenderingEngine that was created earlier:\n * ```javascript\n * import { RenderingEngine, getRenderingEngine } from 'vtkjs-viewport';\n *\n * const renderingEngine = new RenderingEngine('my-engine');\n *\n * // getting reference to rendering engine later...\n * const renderingEngine = getRenderingEngine('my-engine');\n * ```\n *\n * @param id - The identifier that was used to create the RenderingEngine\n * @returns the matching RenderingEngine, or `undefined` if there is no match\n * @public\n */\nexport function getRenderingEngine(id: string): IRenderingEngine | undefined {\n return renderingEngineCache.get(id);\n}\n\n/**\n * Get all the rendering engines that are currently registered\n * @returns An array of rendering engines.\n */\nexport function getRenderingEngines(): IRenderingEngine[] | undefined {\n return renderingEngineCache.getAll();\n}\n\nexport default getRenderingEngine;\n","import { getGPUTier } from 'detect-gpu';\nimport { SharedArrayBufferModes } from './enums';\nimport { getRenderingEngines } from './RenderingEngine/getRenderingEngine';\nlet csRenderInitialized = false;\nlet useSharedArrayBuffer = true;\nlet sharedArrayBufferMode = SharedArrayBufferModes.TRUE;\nimport { deepMerge } from './utilities';\nimport { Cornerstone3DConfig } from './types';\n// TODO: move sharedArrayBuffer into config.\n// TODO: change config into a class with methods to better control get/set\nconst defaultConfig: Cornerstone3DConfig = {\n gpuTier: undefined,\n detectGPUConfig: {},\n rendering: {\n useCPURendering: false,\n // GPU rendering options\n preferSizeOverAccuracy: false,\n useNorm16Texture: false, // _hasNorm16TextureSupport(),\n strictZSpacingForVolumeViewport: true,\n },\n // cache\n // ...\n};\n\nlet config: Cornerstone3DConfig = {\n gpuTier: undefined,\n detectGPUConfig: {},\n rendering: {\n useCPURendering: false,\n // GPU rendering options\n preferSizeOverAccuracy: false,\n useNorm16Texture: false, // _hasNorm16TextureSupport(),\n strictZSpacingForVolumeViewport: true,\n },\n // cache\n // ...\n};\n\nfunction _getGLContext(): RenderingContext {\n // Create canvas element. The canvas is not added to the\n // document itself, so it is never displayed in the\n // browser window.\n const canvas = document.createElement('canvas');\n // Get WebGLRenderingContext from canvas element.\n const gl =\n canvas.getContext('webgl2') ||\n canvas.getContext('webgl') ||\n canvas.getContext('experimental-webgl');\n\n return gl;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/By_example/Detect_WebGL\nfunction _hasActiveWebGLContext() {\n const gl = _getGLContext();\n\n // Check if the context is either WebGLRenderingContext or WebGL2RenderingContext\n return (\n gl instanceof WebGLRenderingContext || gl instanceof WebGL2RenderingContext\n );\n}\n\nfunction hasSharedArrayBuffer() {\n try {\n /*eslint-disable no-constant-condition */\n if (new SharedArrayBuffer(0)) {\n return true;\n } else {\n return false;\n }\n } catch {\n return false;\n }\n}\n\n// Todo: commenting this out until proper support for int16 textures\n// are added to browsers, current implementation is buggy\n// function _hasNorm16TextureSupport() {\n// const gl = _getGLContext();\n\n// if (gl) {\n// const ext = (gl as WebGL2RenderingContext).getExtension(\n// 'EXT_texture_norm16'\n// );\n\n// if (ext) {\n// return true;\n// }\n// }\n\n// return false;\n// }\n\n/**\n * Initialize the cornerstone-core. If the browser has a webgl context and\n * the detected gpu (by detect-gpu library) indicates the GPU is not low end we\n * will use webgl GPU rendering. Otherwise we will use cpu rendering.\n *\n * @param configuration - A configuration object\n * @returns A promise that resolves to true cornerstone has been initialized successfully.\n * @category Initialization\n */\nasync function init(configuration = config): Promise {\n if (csRenderInitialized) {\n return csRenderInitialized;\n }\n\n // merge configs\n config = deepMerge(defaultConfig, configuration);\n\n // gpuTier\n const hasWebGLContext = _hasActiveWebGLContext();\n if (!hasWebGLContext) {\n console.log('CornerstoneRender: GPU not detected, using CPU rendering');\n config.rendering.useCPURendering = true;\n } else {\n config.gpuTier =\n config.gpuTier || (await getGPUTier(config.detectGPUConfig));\n console.log(\n 'CornerstoneRender: Using detect-gpu to get the GPU benchmark:',\n config.gpuTier\n );\n if (config.gpuTier.tier < 1) {\n console.log(\n 'CornerstoneRender: GPU is not powerful enough, using CPU rendering'\n );\n config.rendering.useCPURendering = true;\n } else {\n console.log('CornerstoneRender: using GPU rendering');\n }\n }\n\n setUseSharedArrayBuffer(sharedArrayBufferMode);\n\n csRenderInitialized = true;\n return csRenderInitialized;\n}\n\n/**\n * It sets the useCPURenderingOnlyForDebugOrTests variable to the status value.\n * This only should be used for debugging or tests. DO NOT USE IT IF YOU ARE NOT\n * SURE WHAT YOU ARE DOING.\n * @param status - boolean\n * @category Initialization\n *\n */\nfunction setUseCPURendering(status: boolean): void {\n config.rendering.useCPURendering = status;\n csRenderInitialized = true;\n _updateRenderingPipelinesForAllViewports();\n}\n\nfunction setPreferSizeOverAccuracy(status: boolean): void {\n config.rendering.preferSizeOverAccuracy = status;\n csRenderInitialized = true;\n _updateRenderingPipelinesForAllViewports();\n}\n\n/**\n * Resets the cornerstone-core init state if it has been manually\n * initialized to force use the cpu rendering (e.g., for tests)\n * @category Initialization\n *\n */\nfunction resetUseCPURendering(): void {\n config.rendering.useCPURendering = !_hasActiveWebGLContext();\n _updateRenderingPipelinesForAllViewports();\n}\n\n/**\n * Returns whether or not we are using CPU rendering.\n * @returns true if we are using CPU rendering.\n * @category Initialization\n *\n */\nfunction getShouldUseCPURendering(): boolean {\n return config.rendering.useCPURendering;\n}\n\nfunction setUseSharedArrayBuffer(mode: SharedArrayBufferModes | boolean): void {\n if (mode == SharedArrayBufferModes.AUTO) {\n sharedArrayBufferMode = SharedArrayBufferModes.AUTO;\n const hasSharedBuffer = hasSharedArrayBuffer();\n if (!hasSharedBuffer) {\n useSharedArrayBuffer = false;\n console.warn(\n `CornerstoneRender: SharedArray Buffer not allowed, performance may be slower.\n Try ensuring page is cross-origin isolated to enable SharedArrayBuffer.`\n );\n } else {\n useSharedArrayBuffer = true;\n // eslint-disable-next-line no-console\n console.log('CornerstoneRender: using SharedArrayBuffer');\n }\n return;\n }\n\n if (mode == SharedArrayBufferModes.TRUE || mode == true) {\n sharedArrayBufferMode = SharedArrayBufferModes.TRUE;\n useSharedArrayBuffer = true;\n return;\n }\n\n if (mode == SharedArrayBufferModes.FALSE || mode == false) {\n sharedArrayBufferMode = SharedArrayBufferModes.FALSE;\n useSharedArrayBuffer = false;\n return;\n }\n}\n\nfunction resetUseSharedArrayBuffer(): void {\n setUseSharedArrayBuffer(sharedArrayBufferMode);\n}\n\nfunction getShouldUseSharedArrayBuffer(): boolean {\n return useSharedArrayBuffer;\n}\n\n/**\n *\n * Returns whether or not cornerstone-core has been initialized.\n * @returns true if the cornerstone render has been initialized.\n * @category Initialization\n *\n */\nfunction isCornerstoneInitialized(): boolean {\n return csRenderInitialized;\n}\n\n/**\n * This function returns a copy of the config object. This is used to prevent the\n * config object from being modified by other parts of the program.\n * @returns A copy of the config object.\n */\nfunction getConfiguration(): Cornerstone3DConfig {\n // return a copy\n // return JSON.parse(JSON.stringify(config));\n return config;\n}\n\nfunction setConfiguration(c: Cornerstone3DConfig) {\n config = c;\n _updateRenderingPipelinesForAllViewports();\n}\n\n/**\n * Update rendering pipelines for all viewports in all rendering engines.\n * @returns {void}\n * @category Initialization\n */\nfunction _updateRenderingPipelinesForAllViewports(): void {\n getRenderingEngines().forEach((engine) =>\n engine\n .getViewports()\n .forEach((viewport) => viewport.updateRenderingPipeline?.())\n );\n}\n\nexport {\n init,\n getShouldUseCPURendering,\n getShouldUseSharedArrayBuffer,\n isCornerstoneInitialized,\n setUseCPURendering,\n setUseSharedArrayBuffer,\n setPreferSizeOverAccuracy,\n resetUseCPURendering,\n resetUseSharedArrayBuffer,\n getConfiguration,\n setConfiguration,\n};\n","import global from '../global';\nimport { getShouldUseSharedArrayBuffer } from '../init';\n\n/**\n * A helper function that creates a new Float32Array that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createUint8SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Uint8Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createUint8SharedArray(length: number): Uint8Array {\n if (!getShouldUseSharedArrayBuffer()) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length);\n\n return new Uint8Array(sharedArrayBuffer);\n}\n\nexport default createUint8SharedArray;\n","import global from '../global';\nimport { getShouldUseSharedArrayBuffer } from '../init';\n\n/**\n * A helper function that creates a new Float32Array that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createFloat32SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Float32Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createFloat32SharedArray(length: number): Float32Array {\n if (!getShouldUseSharedArrayBuffer()) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length * 4);\n\n return new Float32Array(sharedArrayBuffer);\n}\n\nexport default createFloat32SharedArray;\n","import global from '../global';\n/**\n * A helper function that creates a new Uint16 that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createUint16SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Uint8Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createUint16SharedArray(length: number): Uint16Array {\n if (!window.crossOriginIsolated) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length * 2);\n\n return new Uint16Array(sharedArrayBuffer);\n}\n\nexport default createUint16SharedArray;\n","import global from '../global';\n/**\n * A helper function that creates a new Int16 that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createInt16SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Int8Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createInt16SharedArray(length: number): Int16Array {\n if (!window.crossOriginIsolated) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length * 2);\n\n return new Int16Array(sharedArrayBuffer);\n}\n\nexport default createInt16SharedArray;\n","// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nconst providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param provider - Metadata provider function\n * @param priority - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @category MetaData\n */\nexport function addProvider(\n provider: (type: string, query: any) => any,\n priority = 0\n): void {\n let i;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority,\n provider,\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param provider - Metadata provider function\n *\n * @category MetaData\n */\nexport function removeProvider(\n provider: (type: string, query: any) => { any }\n): void {\n for (let i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Removes all providers\n *\n * @category MetaData\n */\nexport function removeAllProviders(): void {\n while (providers.length > 0) {\n providers.pop();\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param type - The type of metadata requested from the metadata store\n * @param query - The query for the metadata store, often imageId\n *\n * @returns The metadata retrieved from the metadata store\n * @category MetaData\n */\nfunction getMetaData(type: string, query: string): any {\n // Invoke each provider in priority order until one returns something\n for (let i = 0; i < providers.length; i++) {\n const result = providers[i].provider(type, query);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexport { getMetaData as get };\n","import { vec3 } from 'gl-matrix';\nimport { IImageVolume, Point3 } from '../types';\n\n/**\n * Given an `imageVolume` and a normal direction (`viewPlaneNormal`), calculates\n * the spacing between voxels in the normal direction. If (`viewPlaneNormal`) is\n * parallel to one of the directions you will obtain the spacing in that direction.\n * Otherwise each of the `imageVolume`'s directions are projected onto the volume,\n * so that you obtain a spacing of the order of \"seeing a new set of voxels if the camera where to dolly\".\n *\n * @param imageVolume - The image volume to calculate the spacing in the normal direction.\n * @param viewPlaneNormal - The normal direction of the view plane.\n * @returns\n */\nexport default function getSpacingInNormalDirection(\n imageVolume: IImageVolume,\n viewPlaneNormal: Point3\n): number {\n const { direction, spacing } = imageVolume;\n\n // Calculate size of spacing vector in normal direction\n const iVector = direction.slice(0, 3) as Point3;\n const jVector = direction.slice(3, 6) as Point3;\n const kVector = direction.slice(6, 9) as Point3;\n\n const dotProducts = [\n vec3.dot(iVector, viewPlaneNormal),\n vec3.dot(jVector, viewPlaneNormal),\n vec3.dot(kVector, viewPlaneNormal),\n ];\n\n const projectedSpacing = vec3.create();\n\n vec3.set(\n projectedSpacing,\n dotProducts[0] * spacing[0],\n dotProducts[1] * spacing[1],\n dotProducts[2] * spacing[2]\n );\n\n const spacingInNormalDirection = vec3.length(projectedSpacing);\n\n return spacingInNormalDirection;\n}\n","import { vec3 } from 'gl-matrix';\nimport * as metaData from '../metaData';\nimport type { IImageVolume, Point3 } from '../types';\n\nimport getSpacingInNormalDirection from './getSpacingInNormalDirection';\nimport { EPSILON } from '../constants';\n\n/**\n * Given an image, a point in space and the viewPlaneNormal it returns the\n * closest imageId of the image volume that is within half voxel spacing\n * of the point in space.\n * @param imageVolume - The image volume\n * @param worldPos - The position in the world coordinate system (from mouse click)\n * @param viewPlaneNormal - The normal vector of the viewport\n *\n * @returns The imageId for the tool.\n */\nexport default function getClosestImageId(\n imageVolume: IImageVolume,\n worldPos: Point3,\n viewPlaneNormal: Point3\n): string {\n if (!imageVolume) {\n return;\n }\n\n const { direction, imageIds } = imageVolume;\n\n if (!imageIds || !imageIds.length) {\n return;\n }\n\n // 1. Get ScanAxis vector\n const kVector = direction.slice(6, 9);\n\n // 2. Check if scanAxis is not parallel to camera viewPlaneNormal\n const dotProducts = vec3.dot(kVector as Point3, viewPlaneNormal);\n\n // 2.a if imagePlane is not parallel to the camera: tool is not drawn on an\n // imaging plane, return\n if (Math.abs(dotProducts) < 1 - EPSILON) {\n return;\n }\n\n // 3. Calculate Spacing the in the normal direction, this will get used to\n // check whether we are withing a slice\n const spacingInNormalDirection = getSpacingInNormalDirection(\n imageVolume,\n viewPlaneNormal\n );\n\n const halfSpacingInNormalDirection = spacingInNormalDirection / 2;\n\n // 4. Iterate over all imageIds and check if the tool point (worldPos) is\n // withing one of the slices defined by an imageId\n let imageIdForTool;\n for (let i = 0; i < imageIds.length; i++) {\n const imageId = imageIds[i];\n\n // 4.a Get metadata for the imageId\n const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId);\n\n // 4.b Calculate the direction vector from annotation. point to the first voxel\n // of this image defined by imageId\n const dir = vec3.create();\n vec3.sub(dir, worldPos, imagePositionPatient);\n\n // 4.c Calculate the distance between the vector above and the viewplaneNormal\n // i.e., projected distance\n const dot = vec3.dot(dir, viewPlaneNormal);\n\n // 4.d If the distance is withing range, return the imageId\n if (Math.abs(dot) < halfSpacingInNormalDirection) {\n imageIdForTool = imageId;\n }\n }\n\n return imageIdForTool;\n}\n","import {\n ICache,\n IImage,\n IImageVolume,\n IGeometry,\n IImageLoadObject,\n IVolumeLoadObject,\n IGeometryLoadObject,\n ICachedImage,\n ICachedVolume,\n ICachedGeometry,\n EventTypes,\n} from '../types';\nimport { triggerEvent, imageIdToURI } from '../utilities';\nimport eventTarget from '../eventTarget';\nimport Events from '../enums/Events';\n\nconst ONE_GB = 1073741824;\n\n/**\n * Stores images, volumes and geometry.\n * There are two sizes - the max cache size, that controls the overal maximum\n * size, and the instance size, which controls how big any single object can\n * be. Defaults are 3 GB and 2 GB - 8 bytes (just enough to allow allocating it\n * without crashing).\n * The 3 gb is tuned to the chromium garbage collection cycle to allow image volumes\n * to be used/discarded.\n */\nclass Cache implements ICache {\n // used to store image data (2d)\n private readonly _imageCache = new Map(); // volatile space\n // used to store volume data (3d)\n private readonly _volumeCache = new Map(); // non-volatile space\n // Todo: contour for now, but will be used for surface, etc.\n private readonly _geometryCache: Map;\n\n private _imageCacheSize = 0;\n private _volumeCacheSize = 0;\n private _maxCacheSize = 3 * ONE_GB;\n private _maxInstanceSize = 2 * ONE_GB - 8;\n\n constructor() {\n // used to store object data (contour, surface, etc.)\n this._geometryCache = new Map();\n }\n\n /**\n * Set the maximum cache Size\n *\n * Maximum cache size should be set before adding the data. If set after,\n * and it is smaller than the current size, will cause issues.\n *\n * @param newMaxCacheSize - new maximum cache size\n *\n */\n public setMaxCacheSize = (newMaxCacheSize: number): void => {\n if (!newMaxCacheSize || typeof newMaxCacheSize !== 'number') {\n const errorMessage = `New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`;\n throw new Error(errorMessage);\n }\n\n this._maxCacheSize = newMaxCacheSize;\n };\n\n /**\n * Checks if there is enough space in the cache for requested byte size\n *\n * It returns false, if the sum of volatile (image) cache and unallocated cache\n * is less than the requested byteLength\n *\n * @param byteLength - byte length of requested byte size\n *\n * @returns - boolean indicating if there is enough space in the cache\n */\n public isCacheable = (byteLength: number): boolean => {\n if (byteLength > this._maxInstanceSize) {\n return false;\n }\n const unallocatedSpace = this.getBytesAvailable();\n const imageCacheSize = this._imageCacheSize;\n const availableSpace = unallocatedSpace + imageCacheSize;\n\n return availableSpace > byteLength;\n };\n\n /**\n * Returns maximum CacheSize allowed\n *\n * @returns maximum allowed cache size\n */\n public getMaxCacheSize = (): number => this._maxCacheSize;\n\n /**\n * Returns maximum size of a single instance (volume or single image)\n *\n * @returns maximum instance size\n */\n public getMaxInstanceSize = (): number => this._maxInstanceSize;\n\n /**\n * Returns current size of the cache\n *\n * @returns current size of the cache\n */\n public getCacheSize = (): number =>\n this._imageCacheSize + this._volumeCacheSize;\n\n /**\n * Returns the unallocated size of the cache\n *\n */\n public getBytesAvailable(): number {\n return this.getMaxCacheSize() - this.getCacheSize();\n }\n\n /**\n * Deletes the imageId from the image cache\n *\n * @param imageId - imageId\n *\n */\n private _decacheImage = (imageId: string) => {\n const { imageLoadObject } = this._imageCache.get(imageId);\n\n // Cancel any in-progress loading\n if (imageLoadObject.cancelFn) {\n imageLoadObject.cancelFn();\n }\n\n if (imageLoadObject.decache) {\n imageLoadObject.decache();\n }\n\n this._imageCache.delete(imageId);\n };\n\n /**\n * Deletes the volumeId from the volume cache\n *\n * @param volumeId - volumeId\n *\n */\n private _decacheVolume = (volumeId: string) => {\n const cachedVolume = this._volumeCache.get(volumeId);\n const { volumeLoadObject, volume } = cachedVolume;\n\n if (volume.cancelLoading) {\n volume.cancelLoading();\n }\n\n if (volume.imageData) {\n volume.imageData.delete();\n }\n\n if (volumeLoadObject.cancelFn) {\n // Cancel any in-progress loading\n volumeLoadObject.cancelFn();\n }\n\n if (volumeLoadObject.decache) {\n volumeLoadObject.decache();\n }\n\n this._volumeCache.delete(volumeId);\n };\n\n /**\n * Deletes all the images and volumes in the cache\n *\n * Relevant events are fired for each decached image (IMAGE_CACHE_IMAGE_REMOVED) and\n * the decached volume (VOLUME_CACHE_VOLUME_REMOVED).\n *\n * @fires Events.IMAGE_CACHE_IMAGE_REMOVED\n * @fires Events.VOLUME_CACHE_VOLUME_REMOVED\n *\n */\n public purgeCache = (): void => {\n const imageIterator = this._imageCache.keys();\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const { value: imageId, done } = imageIterator.next();\n\n if (done) {\n break;\n }\n\n this.removeImageLoadObject(imageId);\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId });\n }\n\n this.purgeVolumeCache();\n };\n\n /**\n * Deletes all the volumes in the cache\n */\n public purgeVolumeCache = (): void => {\n const volumeIterator = this._volumeCache.keys();\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const { value: volumeId, done } = volumeIterator.next();\n\n if (done) {\n break;\n }\n\n this.removeVolumeLoadObject(volumeId);\n\n triggerEvent(eventTarget, Events.VOLUME_CACHE_VOLUME_REMOVED, {\n volumeId,\n });\n }\n };\n\n /**\n * Purges the cache if necessary based on the requested number of bytes\n *\n * 1) it sorts the volatile (image) cache based on the most recent used images\n * and starts purging from the oldest ones.\n * Note: for a volume, if the volume-related image Ids is provided, it starts\n * by purging the none-related image Ids (those that are not related to the\n * current volume)\n * 2) For a volume, if we purge all images that won't be included in this volume and still\n * don't have enough unallocated space, purge images that will be included\n * in this volume until we have enough space. These will need to be\n * re-fetched, but we must do this not to straddle over the given memory\n * limit, even for a short time, as this may crash the application.\n *\n * @fires Events.IMAGE_CACHE_IMAGE_REMOVED\n *\n * @param numBytes - Number of bytes for the image/volume that is\n * going to be stored inside the cache\n * @param volumeImageIds - list of imageIds that correspond to the\n * volume whose numberOfBytes we want to store in the cache.\n * @returns bytesAvailable or undefined in purging cache\n * does not successfully make enough space for the requested number of bytes\n */\n public decacheIfNecessaryUntilBytesAvailable(\n numBytes: number,\n volumeImageIds?: Array\n ): number | undefined {\n let bytesAvailable = this.getBytesAvailable();\n\n // If max cache size has not been exceeded, do nothing\n if (bytesAvailable >= numBytes) {\n return bytesAvailable;\n }\n\n let cachedImages = Array.from(this._imageCache.values());\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare(a, b) {\n if (a.timeStamp > b.timeStamp) {\n return 1;\n }\n if (a.timeStamp < b.timeStamp) {\n return -1;\n }\n\n return 0;\n }\n\n cachedImages.sort(compare);\n let cachedImageIds = cachedImages.map((im) => im.imageId);\n\n let imageIdsToPurge = cachedImageIds;\n\n // if we are making space for a volume, we start by purging the imageIds\n // that are not related to the volume\n if (volumeImageIds) {\n imageIdsToPurge = cachedImageIds.filter(\n (id) => !volumeImageIds.includes(id)\n );\n }\n\n // Remove images (that are not related to the volume) from volatile cache\n // until the requested number of bytes become available\n for (const imageId of imageIdsToPurge) {\n this.removeImageLoadObject(imageId);\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId });\n\n bytesAvailable = this.getBytesAvailable();\n if (bytesAvailable >= numBytes) {\n return bytesAvailable;\n }\n }\n\n // Remove the imageIds (both volume related and not related)\n cachedImages = Array.from(this._imageCache.values());\n cachedImageIds = cachedImages.map((im) => im.imageId);\n\n // Remove volume-image Ids from volatile cache until the requested number of bytes\n // become available\n for (const imageId of cachedImageIds) {\n this.removeImageLoadObject(imageId);\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId });\n\n bytesAvailable = this.getBytesAvailable();\n if (bytesAvailable >= numBytes) {\n return bytesAvailable;\n }\n }\n\n // Technically we should not reach here, since isCacheable will throw an\n // error if unallocated + volatile (image) cache cannot fit the upcoming\n // number of bytes\n }\n\n /**\n * Puts a new image load object into the cache\n *\n * First, it creates a CachedImage object and put it inside the imageCache for\n * the imageId. After the imageLoadObject promise resolves to an image,\n * it: 1) adds the image into the correct CachedImage object 2) increments the\n * cache size, 3) triggers IMAGE_CACHE_IMAGE_ADDED 4) Purge the cache if\n * necessary -- if the cache size is greater than the maximum cache size, it\n * iterates over the imageCache and decache them one by one until the cache\n * size becomes less than the maximum allowed cache size\n *\n * @fires Events.IMAGE_CACHE_IMAGE_ADDED\n * @fires Events.CACHE_SIZE_EXCEEDED if the cache size exceeds the maximum\n *\n * @param imageId - ImageId for the image\n * @param imageLoadObject - The object that is loading or loaded the image\n */\n public putImageLoadObject(\n imageId: string,\n imageLoadObject: IImageLoadObject\n ): Promise {\n if (imageId === undefined) {\n throw new Error('putImageLoadObject: imageId must not be undefined');\n }\n\n if (imageLoadObject.promise === undefined) {\n throw new Error(\n 'putImageLoadObject: imageLoadObject.promise must not be undefined'\n );\n }\n\n if (this._imageCache.has(imageId)) {\n throw new Error('putImageLoadObject: imageId already in cache');\n }\n\n if (\n imageLoadObject.cancelFn &&\n typeof imageLoadObject.cancelFn !== 'function'\n ) {\n throw new Error(\n 'putImageLoadObject: imageLoadObject.cancel must be a function'\n );\n }\n\n const cachedImage: ICachedImage = {\n loaded: false,\n imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imageLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0,\n };\n\n this._imageCache.set(imageId, cachedImage);\n\n return imageLoadObject.promise\n .then((image: IImage) => {\n if (!this._imageCache.get(imageId)) {\n // If the image has been purged before being loaded, we stop here.\n console.warn(\n 'The image was purged from the cache before it completed loading.'\n );\n return;\n }\n\n if (Number.isNaN(image.sizeInBytes)) {\n throw new Error(\n 'putImageLoadObject: image.sizeInBytes must not be undefined'\n );\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error(\n 'putImageLoadObject: image.sizeInBytes is not a number'\n );\n }\n\n // check if there is enough space in unallocated + image Cache\n if (!this.isCacheable(image.sizeInBytes)) {\n throw new Error(Events.CACHE_SIZE_EXCEEDED);\n }\n\n // if there is, decache if necessary\n this.decacheIfNecessaryUntilBytesAvailable(image.sizeInBytes);\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n cachedImage.sizeInBytes = image.sizeInBytes;\n this._incrementImageCacheSize(cachedImage.sizeInBytes);\n const eventDetails: EventTypes.ImageCacheImageAddedEventDetail = {\n image: cachedImage,\n };\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_ADDED, eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n })\n .catch((error) => {\n // console.warn(error)\n this._imageCache.delete(imageId);\n throw error;\n });\n }\n\n /**\n * Returns the object that is loading a given imageId\n *\n * @param imageId - Image ID\n * @returns IImageLoadObject\n */\n public getImageLoadObject(imageId: string): IImageLoadObject {\n if (imageId === undefined) {\n throw new Error('getImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = this._imageCache.get(imageId);\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imageLoadObject;\n }\n\n /**\n * It checks the imageCache for the provided imageId, and returns true\n * if the image is loaded, false otherwise. Note, this only checks the imageCache\n * and does not check the volume cache.\n * @param imageId - image Id to check\n * @returns boolean\n */\n public isLoaded(imageId: string): boolean {\n const cachedImage = this._imageCache.get(imageId);\n\n if (!cachedImage) {\n return false;\n }\n\n return cachedImage.loaded;\n }\n\n /**\n * Returns the volume that contains the requested imageId. It will check the\n * imageIds inside the volume to find a match.\n *\n * @param imageId - ImageId\n * @returns - Volume object\n */\n public getVolumeContainingImageId(imageId: string): {\n volume: IImageVolume;\n imageIdIndex: number;\n } {\n const volumeIds = Array.from(this._volumeCache.keys());\n const imageIdToUse = imageIdToURI(imageId);\n\n for (const volumeId of volumeIds) {\n const cachedVolume = this._volumeCache.get(volumeId);\n const { volume } = cachedVolume;\n\n if (!volume?.imageIds?.length) {\n return;\n }\n\n const imageIdIndex = volume.getImageURIIndex(imageIdToUse);\n\n if (imageIdIndex > -1) {\n return { volume, imageIdIndex };\n }\n }\n }\n\n /**\n * Returns the cached image from the imageCache for the requested imageId.\n * It first strips the imageId to remove the data loading scheme.\n *\n * @param imageId - Image ID\n * @returns cached image\n */\n public getCachedImageBasedOnImageURI(\n imageId: string\n ): ICachedImage | undefined {\n const imageURIToUse = imageIdToURI(imageId);\n\n const cachedImageIds = Array.from(this._imageCache.keys());\n const foundImageId = cachedImageIds.find((imageId) => {\n return imageIdToURI(imageId) === imageURIToUse;\n });\n\n if (!foundImageId) {\n return;\n }\n\n return this._imageCache.get(foundImageId);\n }\n /**\n * Puts a new image load object into the cache\n *\n * First, it creates a CachedVolume object and put it inside the volumeCache for\n * the volumeId. After the volumeLoadObject promise resolves to a volume,\n * it: 1) adds the volume into the correct CachedVolume object inside volumeCache\n * 2) increments the cache size, 3) triggers VOLUME_CACHE_VOLUME_ADDED 4) Purge\n * the cache if necessary -- if the cache size is greater than the maximum cache size, it\n * iterates over the imageCache (not volumeCache) and decache them one by one\n * until the cache size becomes less than the maximum allowed cache size\n *\n * @fires Events.VOLUME_CACHE_VOLUME_ADDED\n *\n * @param volumeId - volumeId of the volume\n * @param volumeLoadObject - The object that is loading or loaded the volume\n */\n public putVolumeLoadObject(\n volumeId: string,\n volumeLoadObject: IVolumeLoadObject\n ): Promise {\n if (volumeId === undefined) {\n throw new Error('putVolumeLoadObject: volumeId must not be undefined');\n }\n if (volumeLoadObject.promise === undefined) {\n throw new Error(\n 'putVolumeLoadObject: volumeLoadObject.promise must not be undefined'\n );\n }\n if (this._volumeCache.has(volumeId)) {\n throw new Error(\n `putVolumeLoadObject: volumeId:${volumeId} already in cache`\n );\n }\n if (\n volumeLoadObject.cancelFn &&\n typeof volumeLoadObject.cancelFn !== 'function'\n ) {\n throw new Error(\n 'putVolumeLoadObject: volumeLoadObject.cancel must be a function'\n );\n }\n\n // todo: @Erik there are two loaded flags, one inside cachedVolume and the other\n // inside the volume.loadStatus.loaded, the actual all pixelData loaded is the\n // loadStatus one. This causes confusion\n const cachedVolume: ICachedVolume = {\n loaded: false,\n volumeId,\n volumeLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0,\n };\n\n this._volumeCache.set(volumeId, cachedVolume);\n\n return volumeLoadObject.promise\n .then((volume: IImageVolume) => {\n if (!this._volumeCache.get(volumeId)) {\n // If the image has been purged before being loaded, we stop here.\n console.warn(\n 'The image was purged from the cache before it completed loading.'\n );\n return;\n }\n\n if (Number.isNaN(volume.sizeInBytes)) {\n throw new Error(\n 'putVolumeLoadObject: volume.sizeInBytes must not be undefined'\n );\n }\n if (volume.sizeInBytes.toFixed === undefined) {\n throw new Error(\n 'putVolumeLoadObject: volume.sizeInBytes is not a number'\n );\n }\n\n // this.isCacheable is called at the volume loader, before requesting\n // the images of the volume\n\n this.decacheIfNecessaryUntilBytesAvailable(\n volume.sizeInBytes,\n // @ts-ignore: // todo ImageVolume does not have imageIds\n volume.imageIds\n );\n\n // cachedVolume.loaded = true\n cachedVolume.volume = volume;\n cachedVolume.sizeInBytes = volume.sizeInBytes;\n this._incrementVolumeCacheSize(cachedVolume.sizeInBytes);\n\n const eventDetails: EventTypes.VolumeCacheVolumeAddedEventDetail = {\n volume: cachedVolume,\n };\n\n triggerEvent(\n eventTarget,\n Events.VOLUME_CACHE_VOLUME_ADDED,\n eventDetails\n );\n })\n .catch((error) => {\n this._volumeCache.delete(volumeId);\n throw error;\n });\n }\n\n /**\n * Returns the object that is loading a given volumeId\n *\n * @param volumeId - Volume ID\n * @returns IVolumeLoadObject\n */\n public getVolumeLoadObject = (volumeId: string): IVolumeLoadObject => {\n if (volumeId === undefined) {\n throw new Error('getVolumeLoadObject: volumeId must not be undefined');\n }\n const cachedVolume = this._volumeCache.get(volumeId);\n\n if (cachedVolume === undefined) {\n return;\n }\n\n // Bump time stamp for cached volume (not used for anything for now)\n cachedVolume.timeStamp = Date.now();\n\n return cachedVolume.volumeLoadObject;\n };\n\n public getGeometry = (geometryId: string): IGeometry => {\n if (geometryId == null) {\n throw new Error('getGeometry: geometryId must not be undefined');\n }\n\n const cachedGeometry = this._geometryCache.get(geometryId);\n\n if (cachedGeometry === undefined) {\n return;\n }\n\n // Bump time stamp for cached geometry (not used for anything for now)\n cachedGeometry.timeStamp = Date.now();\n\n return cachedGeometry.geometry;\n };\n\n /**\n * Returns the volume associated with the volumeId\n *\n * @param volumeId - Volume ID\n * @returns Volume\n */\n public getVolume = (volumeId: string): IImageVolume => {\n if (volumeId === undefined) {\n throw new Error('getVolume: volumeId must not be undefined');\n }\n const cachedVolume = this._volumeCache.get(volumeId);\n\n if (cachedVolume === undefined) {\n return;\n }\n\n // Bump time stamp for cached volume (not used for anything for now)\n cachedVolume.timeStamp = Date.now();\n\n return cachedVolume.volume;\n };\n\n /**\n * Removes the image loader associated with a given Id from the cache\n *\n * It increases the cache size after removing the image.\n *\n * @fires Events.IMAGE_CACHE_IMAGE_REMOVED\n *\n * @param imageId - Image ID\n */\n public removeImageLoadObject = (imageId: string): void => {\n if (imageId === undefined) {\n throw new Error('removeImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = this._imageCache.get(imageId);\n\n if (cachedImage === undefined) {\n throw new Error(\n 'removeImageLoadObject: imageId was not present in imageCache'\n );\n }\n\n this._incrementImageCacheSize(-cachedImage.sizeInBytes);\n\n const eventDetails = {\n imageId,\n };\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, eventDetails);\n this._decacheImage(imageId);\n };\n\n /**\n * Removes the volume loader associated with a given Id from the cache\n *\n * It increases the cache size after removing the image.\n *\n * @fires Events.VOLUME_CACHE_VOLUME_REMOVED\n *\n * @param imageId - ImageId\n */\n public removeVolumeLoadObject = (volumeId: string): void => {\n if (volumeId === undefined) {\n throw new Error('removeVolumeLoadObject: volumeId must not be undefined');\n }\n const cachedVolume = this._volumeCache.get(volumeId);\n\n if (cachedVolume === undefined) {\n throw new Error(\n 'removeVolumeLoadObject: volumeId was not present in volumeCache'\n );\n }\n\n this._incrementVolumeCacheSize(-cachedVolume.sizeInBytes);\n\n const eventDetails = {\n volume: cachedVolume,\n volumeId,\n };\n\n triggerEvent(eventTarget, Events.VOLUME_CACHE_VOLUME_REMOVED, eventDetails);\n this._decacheVolume(volumeId);\n };\n\n putGeometryLoadObject = (\n geometryId: string,\n geometryLoadObject: IGeometryLoadObject\n ): Promise => {\n if (geometryId == undefined) {\n throw new Error(\n 'putGeometryLoadObject: geometryId must not be undefined'\n );\n }\n\n if (this._geometryCache.has(geometryId)) {\n throw new Error(\n 'putGeometryLoadObject: geometryId already present in geometryCache'\n );\n }\n\n const cachedGeometry: ICachedGeometry = {\n geometryId,\n geometryLoadObject,\n loaded: false,\n timeStamp: Date.now(),\n sizeInBytes: 0,\n };\n\n this._geometryCache.set(geometryId, cachedGeometry);\n\n return geometryLoadObject.promise\n .then((geometry: IGeometry) => {\n if (!this._geometryCache.has(geometryId)) {\n console.warn(\n 'putGeometryLoadObject: geometryId was removed from geometryCache'\n );\n return;\n }\n\n if (Number.isNaN(geometry.sizeInBytes)) {\n throw new Error(\n 'putGeometryLoadObject: geometry.sizeInBytes is not a number'\n );\n }\n\n // Todo: fix is cacheable\n\n cachedGeometry.loaded = true;\n cachedGeometry.geometry = geometry;\n cachedGeometry.sizeInBytes = geometry.sizeInBytes;\n\n // this._incrementGeometryCacheSize(geometry.sizeInBytes);\n\n const eventDetails = {\n geometry,\n geometryId,\n };\n\n triggerEvent(\n eventTarget,\n Events.GEOMETRY_CACHE_GEOMETRY_ADDED,\n eventDetails\n );\n\n return;\n })\n .catch((error) => {\n this._geometryCache.delete(geometryId);\n throw error;\n });\n };\n\n /**\n * Increases the image cache size with the provided increment\n *\n * @param increment - bytes length\n */\n private _incrementImageCacheSize = (increment: number) => {\n this._imageCacheSize += increment;\n };\n\n /**\n * Increases the cache size with the provided increment\n *\n * @param increment - bytes length\n */\n private _incrementVolumeCacheSize = (increment: number) => {\n this._volumeCacheSize += increment;\n };\n}\n\n/**\n * This module deals with Caching of images and volumes\n * The cache has two main components: a volatile portion for images and a\n * non-volatile portion for volumes. Individual 2D images are volatile and\n * will be replaced by new images hitting the cache. When you allocate volumes,\n * these are non-volatile and reserve a block of memory from the cache.\n * Volumes must be released manually.\n * We will have a shared block of memory allocated for the entire cache, e.g. 1GB\n * which will be shared for images and volumes.\n *\n * **When a new image is added:**\n * We check if there is enough unallocated + volatile space for the single image\n *\n * if so\n * - We allocate the image in image cache, and if necessary oldest images\n * are decached to match the maximumCacheSize criteria\n * - If a volume contains that imageId, copy it over using TypedArray's set method.\n * If no volumes contain the imageId, the image is fetched by image loaders\n *\n * If not (cache is mostly/completely full with volumes)\n * - throw that the cache does not have enough working space to allocate the image\n *\n *\n * **When a new volume is added:**\n * Check if there is enough unallocated + volatile space to allocate the volume:\n *\n * If so:\n * - Decache oldest images which won't be included in this volume until\n * we have enough free space for the volume\n * - If not enough space from previous space, decache images that will be included\n * in the volume until we have enough free space (These will need to be re-fetched,\n * but we must do this not to straddle over the given memory limit, even for a\n * short time, as this may crash the app)\n * - At this point, if any of the frames (indexed by imageId) are present in the volatile\n * image cache, copy these over to the volume now\n *\n * If not (cache is mostly/completely full with volumes),\n * - throw that the cache does not have enough working space to allocate the volume.\n *\n */\nconst cache = new Cache();\nexport default cache;\nexport { Cache }; // for documentation\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar PASS_TYPES = ['Build', 'Render']; // ----------------------------------------------------------------------------\n// vtkViewNode methods\n// ----------------------------------------------------------------------------\n\nfunction vtkViewNode(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkViewNode'); // Builds myself.\n\n publicAPI.build = function (prepass) {}; // Renders myself\n\n\n publicAPI.render = function (prepass) {};\n\n publicAPI.traverse = function (renderPass) {\n // we can choose to do special\n // traversal here based on pass\n var passTraversal = renderPass.getTraverseOperation();\n var fn = publicAPI[passTraversal];\n\n if (fn) {\n fn(renderPass);\n return;\n } // default traversal\n\n\n publicAPI.apply(renderPass, true);\n\n for (var index = 0; index < model.children.length; index++) {\n model.children[index].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.apply = function (renderPass, prepass) {\n var customRenderPass = publicAPI[renderPass.getOperation()];\n\n if (customRenderPass) {\n customRenderPass(prepass, renderPass);\n }\n };\n\n publicAPI.getViewNodeFor = function (dataObject) {\n if (model.renderable === dataObject) {\n return publicAPI;\n }\n\n for (var index = 0; index < model.children.length; ++index) {\n var child = model.children[index];\n var vn = child.getViewNodeFor(dataObject);\n\n if (vn) {\n return vn;\n }\n }\n\n return undefined;\n };\n\n publicAPI.getFirstAncestorOfType = function (type) {\n if (!model._parent) {\n return null;\n }\n\n if (model._parent.isA(type)) {\n return model._parent;\n }\n\n return model._parent.getFirstAncestorOfType(type);\n }; // add a missing node/child for the passed in renderables. This should\n // be called only in between prepareNodes and removeUnusedNodes\n\n\n publicAPI.addMissingNode = function (dobj) {\n if (!dobj) {\n return;\n }\n\n var result = model._renderableChildMap.get(dobj); // if found just mark as visited\n\n\n if (result !== undefined) {\n result.setVisited(true);\n } else {\n // otherwise create a node\n var newNode = publicAPI.createViewNode(dobj);\n\n if (newNode) {\n newNode.setParent(publicAPI);\n newNode.setVisited(true);\n\n model._renderableChildMap.set(dobj, newNode);\n\n model.children.push(newNode);\n }\n }\n }; // add missing nodes/children for the passed in renderables. This should\n // be called only in between prepareNodes and removeUnusedNodes\n\n\n publicAPI.addMissingNodes = function (dataObjs) {\n if (!dataObjs || !dataObjs.length) {\n return;\n }\n\n for (var index = 0; index < dataObjs.length; ++index) {\n var dobj = dataObjs[index];\n\n var result = model._renderableChildMap.get(dobj); // if found just mark as visited\n\n\n if (result !== undefined) {\n result.setVisited(true);\n } else {\n // otherwise create a node\n var newNode = publicAPI.createViewNode(dobj);\n\n if (newNode) {\n newNode.setParent(publicAPI);\n newNode.setVisited(true);\n\n model._renderableChildMap.set(dobj, newNode);\n\n model.children.push(newNode);\n }\n }\n }\n }; // ability to add children that have no renderable use in the same manner\n // as addMissingNodes This case is when a normal viewnode wants to\n // delegate passes to a helper or child that doeasn't map to a clear\n // renderable or any renderable\n\n\n publicAPI.addMissingChildren = function (children) {\n if (!children || !children.length) {\n return;\n }\n\n for (var index = 0; index < children.length; ++index) {\n var child = children[index];\n var cindex = model.children.indexOf(child);\n\n if (cindex === -1) {\n child.setParent(publicAPI);\n model.children.push(child);\n }\n\n child.setVisited(true);\n }\n };\n\n publicAPI.prepareNodes = function () {\n for (var index = 0; index < model.children.length; ++index) {\n model.children[index].setVisited(false);\n }\n };\n\n publicAPI.setVisited = function (val) {\n model.visited = val;\n };\n\n publicAPI.removeUnusedNodes = function () {\n var deleted = null;\n\n for (var index = 0; index < model.children.length; ++index) {\n var child = model.children[index];\n var visited = child.getVisited();\n\n if (!visited) {\n var renderable = child.getRenderable();\n\n if (renderable) {\n model._renderableChildMap.delete(renderable);\n }\n\n if (!deleted) {\n deleted = [];\n }\n\n deleted.push(child);\n child.delete();\n } else {\n child.setVisited(false);\n }\n }\n\n if (deleted) {\n // slow does alloc but not as common\n model.children = model.children.filter(function (el) {\n return !deleted.includes(el);\n });\n }\n };\n\n publicAPI.createViewNode = function (dataObj) {\n if (!model.myFactory) {\n vtkErrorMacro('Cannot create view nodes without my own factory');\n return null;\n }\n\n var ret = model.myFactory.createNode(dataObj);\n\n if (ret) {\n ret.setRenderable(dataObj);\n }\n\n return ret;\n };\n\n var parentDelete = publicAPI.delete;\n\n publicAPI.delete = function () {\n for (var i = 0; i < model.children.length; i++) {\n model.children[i].delete();\n }\n\n parentDelete();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _parent: null,\n renderable: null,\n myFactory: null,\n children: [],\n visited: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.event(publicAPI, model, 'event');\n model._renderableChildMap = new Map();\n macro.get(publicAPI, model, ['visited']);\n macro.setGet(publicAPI, model, ['_parent', 'renderable', 'myFactory']);\n macro.getArray(publicAPI, model, ['children']);\n macro.moveToProtected(publicAPI, model, ['parent']); // Object methods\n\n vtkViewNode(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\n\nvar newInstance = macro.newInstance(extend, 'vtkViewNode'); // ----------------------------------------------------------------------------\n\nvar vtkViewNode$1 = {\n newInstance: newInstance,\n extend: extend,\n PASS_TYPES: PASS_TYPES\n};\n\nexport { vtkViewNode$1 as default };\n","import macro from '../../macros.js';\n\n// vtkViewNodeFactory methods\n// ----------------------------------------------------------------------------\n\nfunction vtkViewNodeFactory(publicAPI, model) {\n // Make sure our overrides is just for our instance not shared with everyone...\n if (!model.overrides) {\n model.overrides = {};\n } // Set our className\n\n\n model.classHierarchy.push('vtkViewNodeFactory');\n\n publicAPI.createNode = function (dataObject) {\n if (dataObject.isDeleted()) {\n return null;\n }\n\n var cpt = 0;\n var className = dataObject.getClassName(cpt++);\n var isObject = false;\n var keys = Object.keys(model.overrides);\n\n while (className && !isObject) {\n if (keys.indexOf(className) !== -1) {\n isObject = true;\n } else {\n className = dataObject.getClassName(cpt++);\n }\n }\n\n if (!isObject) {\n return null;\n }\n\n var vn = model.overrides[className]();\n vn.setMyFactory(publicAPI);\n return vn;\n };\n\n publicAPI.registerOverride = function (className, func) {\n model.overrides[className] = func;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// overrides: {},\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model); // Object methods\n\n vtkViewNodeFactory(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkViewNodeFactory'); // ----------------------------------------------------------------------------\n\nvar vtkViewNodeFactory$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkViewNodeFactory$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNodeFactory$1 from '../SceneGraph/ViewNodeFactory.js';\n\nvar CLASS_MAPPING = Object.create(null);\nfunction registerOverride(className, fn) {\n CLASS_MAPPING[className] = fn;\n} // ----------------------------------------------------------------------------\n// vtkOpenGLViewNodeFactory methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLViewNodeFactory(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLViewNodeFactory');\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Static class mapping shared across instances\n\n model.overrides = CLASS_MAPPING; // Inheritance\n\n vtkViewNodeFactory$1.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLViewNodeFactory(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLViewNodeFactory'); // ----------------------------------------------------------------------------\n\nvar vtkViewNodeFactory = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkViewNodeFactory as default, extend, newInstance, registerOverride };\n","import { mat4, mat3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLCamera methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLCamera(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLCamera');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n }\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n model.context.viewport(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize);\n model.context.scissor(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize);\n }\n };\n\n publicAPI.translucentPass = publicAPI.opaquePass;\n publicAPI.zBufferPass = publicAPI.opaquePass;\n publicAPI.opaqueZBufferPass = publicAPI.opaquePass;\n publicAPI.volumePass = publicAPI.opaquePass;\n\n publicAPI.getKeyMatrices = function (ren) {\n // has the camera changed?\n if (ren !== model.lastRenderer || model._openGLRenderWindow.getMTime() > model.keyMatrixTime.getMTime() || publicAPI.getMTime() > model.keyMatrixTime.getMTime() || ren.getMTime() > model.keyMatrixTime.getMTime() || model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n mat4.copy(model.keyMatrices.wcvc, model.renderable.getViewMatrix());\n mat3.fromMat4(model.keyMatrices.normalMatrix, model.keyMatrices.wcvc);\n mat3.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.wcvc, model.keyMatrices.wcvc);\n\n var aspectRatio = model._openGLRenderer.getAspectRatio();\n\n mat4.copy(model.keyMatrices.vcpc, model.renderable.getProjectionMatrix(aspectRatio, -1, 1));\n mat4.transpose(model.keyMatrices.vcpc, model.keyMatrices.vcpc);\n mat4.multiply(model.keyMatrices.wcpc, model.keyMatrices.vcpc, model.keyMatrices.wcvc);\n model.keyMatrixTime.modified();\n model.lastRenderer = ren;\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n lastRenderer: null,\n keyMatrixTime: null,\n keyMatrices: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime); // values always get set by the get method\n\n model.keyMatrices = {\n normalMatrix: new Float64Array(9),\n vcpc: new Float64Array(16),\n wcvc: new Float64Array(16),\n wcpc: new Float64Array(16)\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context', 'keyMatrixTime']); // Object methods\n\n vtkOpenGLCamera(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkCamera = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkCamera', newInstance);\n\nexport { vtkCamera as default, extend, newInstance };\n","import { newInstance as newInstance$1, get, setGet, moveToProtected, vtkDebugMacro as vtkDebugMacro$1 } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkDebugMacro = vtkDebugMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLRenderer methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-bitwise */\n\nfunction vtkOpenGLRenderer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLRenderer'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n publicAPI.updateLights();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getActiveCamera());\n publicAPI.addMissingNodes(model.renderable.getViewPropsWithNestedProps());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.updateLights = function () {\n var count = 0;\n var lights = model.renderable.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n if (lights[index].getSwitch() > 0.0) {\n count++;\n }\n }\n\n if (!count) {\n vtkDebugMacro('No lights are on, creating one.');\n model.renderable.createLight();\n }\n\n return count;\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n var clearMask = 0;\n var gl = model.context;\n\n if (!model.renderable.getTransparent()) {\n model.context.clearColor(1.0, 0.0, 0.0, 1.0);\n clearMask |= gl.COLOR_BUFFER_BIT;\n }\n\n if (!model.renderable.getPreserveDepthBuffer()) {\n gl.clearDepth(1.0);\n clearMask |= gl.DEPTH_BUFFER_BIT;\n model.context.depthMask(true);\n }\n\n var ts = publicAPI.getTiledSizeAndOrigin();\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n gl.viewport(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n gl.colorMask(true, true, true, true);\n\n if (clearMask) {\n gl.clear(clearMask);\n }\n\n gl.enable(gl.DEPTH_TEST);\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n }; // Renders myself\n\n\n publicAPI.cameraPass = function (prepass) {\n if (prepass) {\n publicAPI.clear();\n }\n };\n\n publicAPI.getAspectRatio = function () {\n var size = model._parent.getSizeByReference();\n\n var viewport = model.renderable.getViewportByReference();\n return size[0] * (viewport[2] - viewport[0]) / ((viewport[3] - viewport[1]) * size[1]);\n };\n\n publicAPI.getTiledSizeAndOrigin = function () {\n var vport = model.renderable.getViewportByReference(); // if there is no window assume 0 1\n\n var tileViewPort = [0.0, 0.0, 1.0, 1.0]; // find the lower left corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu = vport[0] - tileViewPort[0];\n var vpv = vport[1] - tileViewPort[1]; // store the result as a pixel value\n\n var ndvp = model._parent.normalizedDisplayToDisplay(vpu, vpv);\n\n var lowerLeftU = Math.round(ndvp[0]);\n var lowerLeftV = Math.round(ndvp[1]); // find the upper right corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu2 = vport[2] - tileViewPort[0];\n var vpv2 = vport[3] - tileViewPort[1];\n\n var ndvp2 = model._parent.normalizedDisplayToDisplay(vpu2, vpv2); // now compute the size of the intersection of the viewport with the\n // current tile\n\n\n var usize = Math.round(ndvp2[0]) - lowerLeftU;\n var vsize = Math.round(ndvp2[1]) - lowerLeftV;\n\n if (usize < 0) {\n usize = 0;\n }\n\n if (vsize < 0) {\n vsize = 0;\n }\n\n return {\n usize: usize,\n vsize: vsize,\n lowerLeftU: lowerLeftU,\n lowerLeftV: lowerLeftV\n };\n };\n\n publicAPI.clear = function () {\n var clearMask = 0;\n var gl = model.context;\n\n if (!model.renderable.getTransparent()) {\n var background = model.renderable.getBackgroundByReference(); // renderable ensures that background has 4 entries.\n\n model.context.clearColor(background[0], background[1], background[2], background[3]);\n clearMask |= gl.COLOR_BUFFER_BIT;\n }\n\n if (!model.renderable.getPreserveDepthBuffer()) {\n gl.clearDepth(1.0);\n clearMask |= gl.DEPTH_BUFFER_BIT;\n model.context.depthMask(true);\n }\n\n gl.colorMask(true, true, true, true);\n var ts = publicAPI.getTiledSizeAndOrigin();\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n gl.viewport(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n\n if (clearMask) {\n gl.clear(clearMask);\n }\n\n gl.enable(gl.DEPTH_TEST);\n /* eslint-enable no-bitwise */\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.selector !== null) {\n model.selector.releaseGraphicsResources();\n }\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n // _openGLRenderWindow: null,\n selector: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Build VTK API\n\n get(publicAPI, model, ['shaderCache']);\n setGet(publicAPI, model, ['selector']);\n moveToProtected(publicAPI, model, ['openGLRenderWindow']); // Object methods\n\n vtkOpenGLRenderer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLRenderer'); // ----------------------------------------------------------------------------\n\nvar vtkRenderer = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkRenderer', newInstance);\n\nexport { vtkRenderer as default, extend, newInstance };\n","import _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport macro from '../../macros.js';\nimport vtkCellArray from '../../Common/Core/CellArray.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\n\nvar SegmentAgregator = /*#__PURE__*/function () {\n function SegmentAgregator() {\n _classCallCheck(this, SegmentAgregator);\n\n this.segmentMapping = {};\n this.segments = [null]; // to force first id to be 1\n\n this.faces = [];\n }\n\n _createClass(SegmentAgregator, [{\n key: \"addSegment\",\n value: function addSegment(segment) {\n var first = segment[0];\n var last = segment[segment.length - 1];\n\n if (first === last || segment.length < 2) {\n return;\n }\n\n var mappingFirst = this.segmentMapping[first];\n var mappingLast = this.segmentMapping[last];\n\n if (mappingFirst !== undefined && mappingLast !== undefined) {\n if (Math.abs(mappingFirst) === Math.abs(mappingLast)) {\n // This make a closing loop\n var idx = mappingFirst < mappingLast ? mappingLast : mappingFirst;\n var seg = this.segments[idx];\n\n if (mappingFirst > 0) {\n for (var i = 1; i < segment.length - 1; i++) {\n seg.push(segment[i]);\n }\n } else {\n for (var _i = 1; _i < segment.length - 1; _i++) {\n seg.unshift(segment[segment.length - 1 - _i]);\n }\n }\n\n this.faces.push(seg);\n this.segments[idx] = null;\n this.segmentMapping[first] = undefined;\n this.segmentMapping[last] = undefined;\n } else {\n // we need to merge segments\n // strategie:\n // => remove and add them again in special order to induce merge\n var idxHead = Math.abs(mappingFirst);\n var idxTail = Math.abs(mappingLast);\n var segHead = this.segments[idxHead];\n var segTail = this.segments[idxTail];\n this.segments[idxHead] = null;\n this.segments[idxTail] = null;\n this.segmentMapping[segHead[0]] = undefined;\n this.segmentMapping[segTail[0]] = undefined;\n this.segmentMapping[segHead[segHead.length - 1]] = undefined;\n this.segmentMapping[segTail[segTail.length - 1]] = undefined; // This will lead to a single segment\n\n this.addSegment(segment);\n this.addSegment(segHead);\n this.addSegment(segTail);\n }\n } else if (mappingFirst !== undefined) {\n if (mappingFirst > 0) {\n // The head of our segment match the tail of the existing one\n var _seg = this.segments[mappingFirst];\n\n for (var _i2 = 1; _i2 < segment.length; _i2++) {\n _seg.push(segment[_i2]);\n } // record new tail\n\n\n this.segmentMapping[last] = mappingFirst;\n } else {\n // our segment should be reverted and put on the front of the existing one\n var _seg2 = this.segments[-mappingFirst]; // record new head\n\n this.segmentMapping[last] = mappingFirst;\n\n for (var _i3 = 1; _i3 < segment.length; _i3++) {\n _seg2.unshift(segment[_i3]);\n }\n } // Erase used connection\n\n\n this.segmentMapping[first] = undefined;\n } else if (mappingLast !== undefined) {\n if (mappingLast > 0) {\n // The tail of our segment match the tail of the existing one\n var _seg3 = this.segments[mappingLast];\n\n for (var _i4 = 1; _i4 < segment.length; _i4++) {\n _seg3.push(segment[segment.length - 1 - _i4]);\n } // record new tail\n\n\n this.segmentMapping[first] = mappingLast;\n } else {\n // our segment should be reverted and put on the front of the existing one\n var _seg4 = this.segments[-mappingLast]; // record new head\n\n this.segmentMapping[first] = mappingLast;\n\n for (var _i5 = 1; _i5 < segment.length; _i5++) {\n _seg4.unshift(segment[segment.length - _i5 - 1]);\n }\n } // Erase used connection\n\n\n this.segmentMapping[last] = undefined;\n } else {\n // store segment for now\n var id = this.segments.length;\n this.segments.push(segment);\n this.segmentMapping[first] = -id;\n this.segmentMapping[last] = id;\n }\n }\n }]);\n\n return SegmentAgregator;\n}(); // ----------------------------------------------------------------------------\n// vtkClosedPolyLineToSurfaceFilter methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkClosedPolyLineToSurfaceFilter(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkClosedPolyLineToSurfaceFilter'); // --------------------------------------------------------------------------\n\n publicAPI.requestData = function (inData, outData) {\n // implement requestData\n var input = inData[0];\n\n if (!input) {\n vtkErrorMacro('Invalid or missing input');\n return;\n }\n\n var output = vtkPolyData.newInstance();\n output.shallowCopy(input); // Extract faces\n\n var agregator = new SegmentAgregator();\n var lines = input.getLines().getData();\n var offset = 0;\n\n while (offset < lines.length) {\n var lineSize = lines[offset++];\n var lineSegment = [];\n\n for (var i = 0; i < lineSize; i++) {\n lineSegment.push(lines[offset + i]);\n }\n\n agregator.addSegment(lineSegment);\n offset += lineSize;\n } // Create CellArray for polys\n\n\n var faces = agregator.faces;\n var cellArraySize = faces.length;\n\n for (var _i6 = 0; _i6 < faces.length; _i6++) {\n cellArraySize += faces[_i6].length;\n }\n\n var cellArray = new Uint16Array(cellArraySize);\n offset = 0;\n\n for (var _i7 = 0; _i7 < faces.length; _i7++) {\n var face = faces[_i7];\n cellArray[offset++] = face.length;\n\n for (var j = 0; j < face.length; j++) {\n cellArray[offset++] = face[j];\n }\n }\n\n output.setPolys(vtkCellArray.newInstance({\n values: cellArray,\n name: 'faces'\n }));\n outData[0] = output;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Make this a VTK object\n\n macro.obj(publicAPI, model); // Also make it an algorithm with one input and one output\n\n macro.algo(publicAPI, model, 1, 1); // Object specific methods\n\n vtkClosedPolyLineToSurfaceFilter(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkClosedPolyLineToSurfaceFilter'); // ----------------------------------------------------------------------------\n\nvar vtkClosedPolyLineToSurfaceFilter$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkClosedPolyLineToSurfaceFilter$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1, obj, algo, setGet, vtkErrorMacro as vtkErrorMacro$1, newTypedArrayFrom } from '../../macros.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1;\n\nfunction initPolyIterator(pd) {\n var polys = pd.getPolys().getData();\n var strips = pd.getStrips().getData();\n var it = {\n done: false,\n polyIdx: 0,\n stripIdx: 0,\n remainingStripLength: 0,\n // returns a single poly cell\n next: function next() {\n var ret = null;\n\n if (it.polyIdx < polys.length) {\n var cellSize = polys[it.polyIdx];\n var start = it.polyIdx + 1;\n var end = start + cellSize;\n it.polyIdx = end;\n ret = polys.subarray(start, end);\n } else if (it.stripIdx < strips.length) {\n if (it.remainingStripLength === 0) {\n it.remainingStripLength = strips[it.stripIdx] - 2; // sliding window of 3 points\n // stripIdx points to the last point in a triangle 3-tuple\n\n it.stripIdx += 3;\n }\n\n var _start = it.stripIdx - 2;\n\n var _end = it.stripIdx + 1;\n\n it.stripIdx++;\n it.remainingStripLength--;\n ret = strips.subarray(_start, _end);\n } else if (it.done) {\n throw new Error('Iterator is done');\n }\n\n it.done = it.polyIdx >= polys.length && it.stripIdx >= strips.length;\n return ret;\n }\n };\n return it;\n} // ----------------------------------------------------------------------------\n// vtkCutter methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkCutter(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCutter'); // Capture \"parentClass\" api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getMTime = function () {\n var mTime = superClass.getMTime();\n\n if (!model.cutFunction) {\n return mTime;\n }\n\n mTime = Math.max(mTime, model.cutFunction.getMTime());\n return mTime;\n };\n\n function dataSetCutter(input, output) {\n var points = input.getPoints();\n var pointsData = points.getData();\n var numPts = points.getNumberOfPoints();\n var newPointsData = [];\n var newLinesData = [];\n var newPolysData = [];\n\n if (!model.cutScalars || model.cutScalars.length < numPts) {\n model.cutScalars = new Float32Array(numPts);\n } // Loop over all points evaluating scalar function at each point\n\n\n var inOffset = 0;\n var outOffset = 0;\n\n while (inOffset < pointsData.length) {\n model.cutScalars[outOffset++] = model.cutFunction.evaluateFunction(pointsData[inOffset++], pointsData[inOffset++], pointsData[inOffset++]);\n }\n\n var crossedEdges = [];\n var x1 = new Array(3);\n var x2 = new Array(3); // Loop over all cells; get scalar values for all cell points\n // and process each cell.\n\n /* eslint-disable no-continue */\n\n var it = initPolyIterator(input);\n\n while (!it.done) {\n // cell contains the point IDs/indices\n var cell = it.next(); // Check that cells have at least 3 points\n\n if (cell.length <= 2) {\n continue;\n } // Get associated scalar of points that constitute the current cell\n\n\n var cellPointsScalars = [];\n var pointIndex = void 0;\n\n for (var i = 0; i < cell.length; i++) {\n pointIndex = cell[i];\n cellPointsScalars.push(model.cutScalars[pointIndex]);\n } // Check if all cell points are on same side (same side == cell not crossed by cut function)\n // TODO: won't work if one point scalar is = 0 ?\n\n\n var sideFirstPoint = cellPointsScalars[0] > 0;\n var allPointsSameSide = true;\n\n for (var _i = 1; _i < cellPointsScalars.length; _i++) {\n var sideCurrentPoint = cellPointsScalars[_i] > 0;\n\n if (sideCurrentPoint !== sideFirstPoint) {\n allPointsSameSide = false;\n break;\n }\n } // Go to next cell if cell is not crossed by cut function\n\n\n if (allPointsSameSide) {\n continue;\n } // Find and compute edges which intersect cells\n\n\n var intersectedEdgesList = [];\n\n for (var _i2 = 0; _i2 < cell.length; _i2++) {\n var idNext = _i2 + 1 === cell.length ? 0 : _i2 + 1; // Go to next edge if edge is not crossed\n // TODO: in most come cases, (numberOfPointsInCell - 1) or 0 edges of the cell\n // will be crossed, but if it crosses right at a point, it could be intersecting\n // with (numberOfPoints) or 1 edge(s). Do we account for that?\n\n var signPoint0 = cellPointsScalars[_i2] > 0;\n var signPoint1 = cellPointsScalars[idNext] > 0;\n\n if (signPoint1 === signPoint0) {\n continue;\n } // Compute preferred interpolation direction\n\n\n var e1 = _i2;\n var e2 = idNext;\n var deltaScalar = cellPointsScalars[e2] - cellPointsScalars[e1];\n\n if (deltaScalar <= 0) {\n e1 = idNext;\n e2 = _i2;\n deltaScalar *= -1;\n } // linear interpolation\n\n\n var t = 0.0;\n\n if (deltaScalar !== 0.0) {\n t = (model.cutValue - cellPointsScalars[e1]) / deltaScalar;\n } // points position\n\n\n var pointID1 = cell[e1];\n var pointID2 = cell[e2];\n x1[0] = pointsData[pointID1 * 3];\n x1[1] = pointsData[pointID1 * 3 + 1];\n x1[2] = pointsData[pointID1 * 3 + 2];\n x2[0] = pointsData[pointID2 * 3];\n x2[1] = pointsData[pointID2 * 3 + 1];\n x2[2] = pointsData[pointID2 * 3 + 2]; // Compute the intersected point on edge\n\n var computedIntersectedPoint = [x1[0] + t * (x2[0] - x1[0]), x1[1] + t * (x2[1] - x1[1]), x1[2] + t * (x2[2] - x1[2])]; // Keep track of it\n\n intersectedEdgesList.push({\n pointEdge1: pointID1,\n // id of one point of the edge\n pointEdge2: pointID2,\n // id of one point of the edge\n intersectedPoint: computedIntersectedPoint,\n // 3D coordinate of points that intersected edge\n newPointID: -1 // id of the intersected point when it will be added into vtkPoints\n\n });\n } // Add points into newPointList\n\n\n for (var _i3 = 0; _i3 < intersectedEdgesList.length; _i3++) {\n var intersectedEdge = intersectedEdgesList[_i3];\n var alreadyAdded = false; // Check if point/edge already added\n\n for (var j = 0; j < crossedEdges.length; j++) {\n var crossedEdge = crossedEdges[j];\n var sameEdge = intersectedEdge.pointEdge1 === crossedEdge.pointEdge1 && intersectedEdge.pointEdge2 === crossedEdge.pointEdge2;\n var samePoint = intersectedEdge.intersectedPoint[0] === crossedEdge.intersectedPoint[0] && intersectedEdge.intersectedPoint[1] === crossedEdge.intersectedPoint[1] && intersectedEdge.intersectedPoint[2] === crossedEdge.intersectedPoint[2];\n\n if (sameEdge || samePoint) {\n alreadyAdded = true;\n intersectedEdgesList[_i3].newPointID = crossedEdges[j].newPointID;\n break;\n }\n }\n\n if (!alreadyAdded) {\n newPointsData.push(intersectedEdge.intersectedPoint[0]);\n newPointsData.push(intersectedEdge.intersectedPoint[1]);\n newPointsData.push(intersectedEdge.intersectedPoint[2]);\n intersectedEdgesList[_i3].newPointID = newPointsData.length / 3 - 1;\n crossedEdges.push(intersectedEdgesList[_i3]);\n }\n } // Store cells\n\n\n var cellSize = intersectedEdgesList.length;\n\n if (cellSize === 2) {\n newLinesData.push(cellSize, intersectedEdgesList[0].newPointID, intersectedEdgesList[1].newPointID);\n } else if (cellSize > 2) {\n newPolysData.push(cellSize);\n intersectedEdgesList.forEach(function (edge) {\n newPolysData.push(edge.newPointID);\n });\n }\n } // Set points\n\n\n var outputPoints = output.getPoints();\n outputPoints.setData(newTypedArrayFrom(points.getDataType(), newPointsData), 3); // Set lines\n\n if (newLinesData.length !== 0) {\n output.getLines().setData(Uint16Array.from(newLinesData));\n } // Set polys\n\n\n if (newPolysData.length !== 0) {\n output.getPolys().setData(Uint16Array.from(newPolysData));\n }\n } // expose requestData\n\n\n publicAPI.requestData = function (inData, outData) {\n // implement requestData\n var input = inData[0];\n\n if (!input) {\n vtkErrorMacro('Invalid or missing input');\n return;\n }\n\n if (!model.cutFunction) {\n vtkErrorMacro('Missing cut function');\n return;\n }\n\n var output = vtkPolyData.newInstance();\n dataSetCutter(input, output);\n outData[0] = output;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n cutFunction: null,\n // support method with evaluateFunction method\n cutScalars: null,\n cutValue: 0.0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Make this a VTK object\n\n obj(publicAPI, model); // Also make it an algorithm with one input and one output\n\n algo(publicAPI, model, 1, 1); // Set implicit function use to cut the input data (is vtkPlane)\n\n setGet(publicAPI, model, ['cutFunction', 'cutValue']); // Object specific methods\n\n vtkCutter(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkCutter'); // ----------------------------------------------------------------------------\n\nvar vtkCutter$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCutter$1 as default, extend, newInstance };\n","var ObjectType = {\n ARRAY_BUFFER: 0,\n ELEMENT_ARRAY_BUFFER: 1,\n TEXTURE_BUFFER: 2\n};\nvar Constants = {\n ObjectType: ObjectType\n};\n\nexport { ObjectType, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './BufferObject/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar ObjectType = Constants.ObjectType; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nvar STATIC = {}; // ----------------------------------------------------------------------------\n// vtkOpenGLBufferObject methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLBufferObject(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLBufferObject'); // Class-specific private functions\n\n function convertType(type) {\n switch (type) {\n case ObjectType.ELEMENT_ARRAY_BUFFER:\n return model.context.ELEMENT_ARRAY_BUFFER;\n\n case ObjectType.TEXTURE_BUFFER:\n if ('TEXTURE_BUFFER' in model.context) {\n return model.context.TEXTURE_BUFFER;\n }\n\n /* eslint-disable no-fallthrough */\n // Intentional fallthrough in case there is no TEXTURE_BUFFER in WebGL\n\n case ObjectType.ARRAY_BUFFER:\n default:\n return model.context.ARRAY_BUFFER;\n\n /* eslint-enable no-fallthrough */\n }\n }\n\n var internalType = null;\n var internalHandle = null;\n var dirty = true;\n var error = ''; // Public API methods\n\n publicAPI.getType = function () {\n return internalType;\n };\n\n publicAPI.setType = function (value) {\n internalType = value;\n };\n\n publicAPI.getHandle = function () {\n return internalHandle;\n };\n\n publicAPI.isReady = function () {\n return dirty === false;\n };\n\n publicAPI.generateBuffer = function (type) {\n var objectTypeGL = convertType(type);\n\n if (internalHandle === null) {\n internalHandle = model.context.createBuffer();\n internalType = type;\n }\n\n return convertType(internalType) === objectTypeGL;\n };\n\n publicAPI.upload = function (data, type) {\n // buffer, size, type\n var alreadyGenerated = publicAPI.generateBuffer(type);\n\n if (!alreadyGenerated) {\n error = 'Trying to upload array buffer to incompatible buffer.';\n return false;\n }\n\n model.context.bindBuffer(convertType(internalType), internalHandle);\n model.context.bufferData(convertType(internalType), data, model.context.STATIC_DRAW);\n dirty = false;\n return true;\n };\n\n publicAPI.bind = function () {\n if (!internalHandle) {\n return false;\n }\n\n model.context.bindBuffer(convertType(internalType), internalHandle);\n return true;\n };\n\n publicAPI.release = function () {\n if (!internalHandle) {\n return false;\n }\n\n model.context.bindBuffer(convertType(internalType), null);\n return true;\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (internalHandle !== null) {\n model.context.bindBuffer(convertType(internalType), null);\n model.context.deleteBuffer(internalHandle);\n internalHandle = null;\n }\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n\n publicAPI.getError = function () {\n return error;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n objectType: ObjectType.ARRAY_BUFFER,\n // _openGLRenderWindow: null,\n context: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['_openGLRenderWindow']);\n macro.moveToProtected(publicAPI, model, ['openGLRenderWindow']);\n vtkOpenGLBufferObject(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkBufferObject = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkBufferObject as default, extend, newInstance };\n","import { vec3, mat4, quat } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport { ObjectType } from './BufferObject/Constants.js';\nimport { Representation } from '../Core/Property/Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// Static functions\n// ----------------------------------------------------------------------------\n\nfunction computeInverseShiftAndScaleMatrix(coordShift, coordScale) {\n var inverseScale = new Float64Array(3);\n vec3.inverse(inverseScale, coordScale);\n var matrix = new Float64Array(16);\n mat4.fromRotationTranslationScale(matrix, quat.create(), coordShift, inverseScale);\n return matrix;\n}\n\nfunction shouldApplyCoordShiftAndScale(coordShift, coordScale) {\n if (coordShift === null || coordScale === null) {\n return false;\n }\n\n return !(vec3.exactEquals(coordShift, [0, 0, 0]) && vec3.exactEquals(coordScale, [1, 1, 1]));\n} // ----------------------------------------------------------------------------\n// vtkOpenGLCellArrayBufferObject methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLCellArrayBufferObject(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLCellArrayBufferObject');\n publicAPI.setType(ObjectType.ARRAY_BUFFER);\n\n publicAPI.createVBO = function (cellArray, inRep, outRep, options) {\n var selectionMaps = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\n if (!cellArray.getData() || !cellArray.getData().length) {\n model.elementCount = 0;\n return 0;\n } // Figure out how big each block will be, currently 6 or 7 floats.\n\n\n model.blockSize = 3;\n model.vertexOffset = 0;\n model.normalOffset = 0;\n model.tCoordOffset = 0;\n model.tCoordComponents = 0;\n model.colorComponents = 0;\n model.colorOffset = 0;\n model.customData = [];\n var pointData = options.points.getData();\n var normalData = null;\n var tcoordData = null;\n var colorData = null;\n var colorComponents = options.colors ? options.colors.getNumberOfComponents() : 0;\n var textureComponents = options.tcoords ? options.tcoords.getNumberOfComponents() : 0; // the values of 4 below are because floats are 4 bytes\n\n if (options.normals) {\n model.normalOffset = 4 * model.blockSize;\n model.blockSize += 3;\n normalData = options.normals.getData();\n }\n\n if (options.customAttributes) {\n options.customAttributes.forEach(function (a) {\n if (a) {\n model.customData.push({\n data: a.getData(),\n offset: 4 * model.blockSize,\n components: a.getNumberOfComponents(),\n name: a.getName()\n });\n model.blockSize += a.getNumberOfComponents();\n }\n });\n }\n\n if (options.tcoords) {\n model.tCoordOffset = 4 * model.blockSize;\n model.tCoordComponents = textureComponents;\n model.blockSize += textureComponents;\n tcoordData = options.tcoords.getData();\n }\n\n if (options.colors) {\n model.colorComponents = options.colors.getNumberOfComponents();\n model.colorOffset = 0;\n colorData = options.colors.getData();\n\n if (!model.colorBO) {\n model.colorBO = vtkBufferObject.newInstance();\n }\n\n model.colorBO.setOpenGLRenderWindow(model._openGLRenderWindow);\n } else {\n model.colorBO = null;\n }\n\n model.stride = 4 * model.blockSize;\n var pointIdx = 0;\n var normalIdx = 0;\n var tcoordIdx = 0;\n var colorIdx = 0;\n var custIdx = 0;\n var cellCount = 0;\n var addAPoint;\n var cellBuilders = {\n // easy, every input point becomes an output point\n anythingToPoints: function anythingToPoints(numPoints, cellPts, offset) {\n for (var i = 0; i < numPoints; ++i) {\n addAPoint(cellPts[offset + i]);\n }\n },\n linesToWireframe: function linesToWireframe(numPoints, cellPts, offset) {\n // for lines we add a bunch of segments\n for (var i = 0; i < numPoints - 1; ++i) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + i + 1]);\n }\n },\n polysToWireframe: function polysToWireframe(numPoints, cellPts, offset) {\n // for polys we add a bunch of segments and close it\n if (numPoints > 2) {\n for (var i = 0; i < numPoints; ++i) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + (i + 1) % numPoints]);\n }\n }\n },\n stripsToWireframe: function stripsToWireframe(numPoints, cellPts, offset) {\n if (numPoints > 2) {\n // for strips we add a bunch of segments and close it\n for (var i = 0; i < numPoints - 1; ++i) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + i + 1]);\n }\n\n for (var _i = 0; _i < numPoints - 2; _i++) {\n addAPoint(cellPts[offset + _i]);\n addAPoint(cellPts[offset + _i + 2]);\n }\n }\n },\n polysToSurface: function polysToSurface(npts, cellPts, offset) {\n for (var i = 0; i < npts - 2; i++) {\n addAPoint(cellPts[offset + 0]);\n addAPoint(cellPts[offset + i + 1]);\n addAPoint(cellPts[offset + i + 2]);\n }\n },\n stripsToSurface: function stripsToSurface(npts, cellPts, offset) {\n for (var i = 0; i < npts - 2; i++) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + i + 1 + i % 2]);\n addAPoint(cellPts[offset + i + 1 + (i + 1) % 2]);\n }\n }\n };\n var cellCounters = {\n // easy, every input point becomes an output point\n anythingToPoints: function anythingToPoints(numPoints, cellPts) {\n return numPoints;\n },\n linesToWireframe: function linesToWireframe(numPoints, cellPts) {\n if (numPoints > 1) {\n return (numPoints - 1) * 2;\n }\n\n return 0;\n },\n polysToWireframe: function polysToWireframe(numPoints, cellPts) {\n if (numPoints > 2) {\n return numPoints * 2;\n }\n\n return 0;\n },\n stripsToWireframe: function stripsToWireframe(numPoints, cellPts) {\n if (numPoints > 2) {\n return numPoints * 4 - 6;\n }\n\n return 0;\n },\n polysToSurface: function polysToSurface(npts, cellPts) {\n if (npts > 2) {\n return (npts - 2) * 3;\n }\n\n return 0;\n },\n stripsToSurface: function stripsToSurface(npts, cellPts, offset) {\n if (npts > 2) {\n return (npts - 2) * 3;\n }\n\n return 0;\n }\n };\n var func = null;\n var countFunc = null;\n\n if (outRep === Representation.POINTS || inRep === 'verts') {\n func = cellBuilders.anythingToPoints;\n countFunc = cellCounters.anythingToPoints;\n } else if (outRep === Representation.WIREFRAME || inRep === 'lines') {\n func = cellBuilders[\"\".concat(inRep, \"ToWireframe\")];\n countFunc = cellCounters[\"\".concat(inRep, \"ToWireframe\")];\n } else {\n func = cellBuilders[\"\".concat(inRep, \"ToSurface\")];\n countFunc = cellCounters[\"\".concat(inRep, \"ToSurface\")];\n }\n\n var array = cellArray.getData();\n var size = array.length;\n var caboCount = 0;\n\n for (var index = 0; index < size;) {\n caboCount += countFunc(array[index], array);\n index += array[index] + 1;\n }\n\n var packedUCVBO = null;\n var packedVBO = new Float32Array(caboCount * model.blockSize);\n\n if (colorData) {\n packedUCVBO = new Uint8Array(caboCount * 4);\n }\n\n var vboidx = 0;\n var ucidx = 0; // Find out if shift scale should be used\n // Compute squares of diagonal size and distance from the origin\n\n var diagSq = 0.0;\n var distSq = 0.0;\n\n for (var i = 0; i < 3; ++i) {\n var range = options.points.getRange(i);\n var delta = range[1] - range[0];\n diagSq += delta * delta;\n var distShift = 0.5 * (range[1] + range[0]);\n distSq += distShift * distShift;\n }\n\n var useShiftAndScale = diagSq > 0 && (Math.abs(distSq) / diagSq > 1.0e6 || // If data is far from the origin relative to its size\n Math.abs(Math.log10(diagSq)) > 3.0 || // If the size is huge when not far from the origin\n diagSq === 0 && distSq > 1.0e6); // If data is a point, but far from the origin\n\n if (useShiftAndScale) {\n // Compute shift and scale vectors\n var coordShift = new Float64Array(3);\n var coordScale = new Float64Array(3);\n\n for (var _i2 = 0; _i2 < 3; ++_i2) {\n var _range = options.points.getRange(_i2);\n\n var _delta = _range[1] - _range[0];\n\n coordShift[_i2] = 0.5 * (_range[1] + _range[0]);\n coordScale[_i2] = _delta > 0 ? 1.0 / _delta : 1.0;\n }\n\n publicAPI.setCoordShiftAndScale(coordShift, coordScale);\n } else if (model.coordShiftAndScaleEnabled === true) {\n // Make sure to reset\n publicAPI.setCoordShiftAndScale(null, null);\n } // Initialize the structures used to keep track of point ids and cell ids for selectors\n\n\n if (selectionMaps) {\n if (!selectionMaps.points && !selectionMaps.cells) {\n selectionMaps.points = new Int32Array(caboCount);\n selectionMaps.cells = new Int32Array(caboCount);\n } else {\n var newPoints = new Int32Array(caboCount + selectionMaps.points.length);\n newPoints.set(selectionMaps.points);\n selectionMaps.points = newPoints;\n var newCells = new Int32Array(caboCount + selectionMaps.cells.length);\n newCells.set(selectionMaps.cells);\n selectionMaps.cells = newCells;\n }\n }\n\n var pointCount = options.vertexOffset;\n\n addAPoint = function addAPointFunc(i) {\n // Keep track of original point and cell ids, for selection\n if (selectionMaps) {\n selectionMaps.points[pointCount] = i;\n selectionMaps.cells[pointCount] = cellCount + options.cellOffset;\n }\n\n ++pointCount; // Vertices\n\n pointIdx = i * 3;\n\n if (!model.coordShiftAndScaleEnabled) {\n packedVBO[vboidx++] = pointData[pointIdx++];\n packedVBO[vboidx++] = pointData[pointIdx++];\n packedVBO[vboidx++] = pointData[pointIdx++];\n } else {\n // Apply shift and scale\n packedVBO[vboidx++] = (pointData[pointIdx++] - model.coordShift[0]) * model.coordScale[0];\n packedVBO[vboidx++] = (pointData[pointIdx++] - model.coordShift[1]) * model.coordScale[1];\n packedVBO[vboidx++] = (pointData[pointIdx++] - model.coordShift[2]) * model.coordScale[2];\n }\n\n if (normalData !== null) {\n if (options.haveCellNormals) {\n normalIdx = (cellCount + options.cellOffset) * 3;\n } else {\n normalIdx = i * 3;\n }\n\n packedVBO[vboidx++] = normalData[normalIdx++];\n packedVBO[vboidx++] = normalData[normalIdx++];\n packedVBO[vboidx++] = normalData[normalIdx++];\n }\n\n model.customData.forEach(function (attr) {\n custIdx = i * attr.components;\n\n for (var j = 0; j < attr.components; ++j) {\n packedVBO[vboidx++] = attr.data[custIdx++];\n }\n });\n\n if (tcoordData !== null) {\n tcoordIdx = i * textureComponents;\n\n for (var j = 0; j < textureComponents; ++j) {\n packedVBO[vboidx++] = tcoordData[tcoordIdx++];\n }\n }\n\n if (colorData !== null) {\n if (options.haveCellScalars) {\n colorIdx = (cellCount + options.cellOffset) * colorComponents;\n } else {\n colorIdx = i * colorComponents;\n }\n\n packedUCVBO[ucidx++] = colorData[colorIdx++];\n packedUCVBO[ucidx++] = colorData[colorIdx++];\n packedUCVBO[ucidx++] = colorData[colorIdx++];\n packedUCVBO[ucidx++] = colorComponents === 4 ? colorData[colorIdx++] : 255;\n }\n };\n\n for (var _index = 0; _index < size;) {\n func(array[_index], array, _index + 1);\n _index += array[_index] + 1;\n cellCount++;\n }\n\n model.elementCount = caboCount;\n publicAPI.upload(packedVBO, ObjectType.ARRAY_BUFFER);\n\n if (model.colorBO) {\n model.colorBOStride = 4;\n model.colorBO.upload(packedUCVBO, ObjectType.ARRAY_BUFFER);\n }\n\n return cellCount;\n };\n\n publicAPI.setCoordShiftAndScale = function (coordShift, coordScale) {\n if (coordShift !== null && (coordShift.constructor !== Float64Array || coordShift.length !== 3)) {\n vtkErrorMacro('Wrong type for coordShift, expected vec3 or null');\n return;\n }\n\n if (coordScale !== null && (coordScale.constructor !== Float64Array || coordScale.length !== 3)) {\n vtkErrorMacro('Wrong type for coordScale, expected vec3 or null');\n return;\n }\n\n if (model.coordShift === null || coordShift === null || !vec3.equals(coordShift, model.coordShift)) {\n model.coordShift = coordShift;\n }\n\n if (model.coordScale === null || coordScale === null || !vec3.equals(coordScale, model.coordScale)) {\n model.coordScale = coordScale;\n }\n\n model.coordShiftAndScaleEnabled = shouldApplyCoordShiftAndScale(model.coordShift, model.coordScale);\n\n if (model.coordShiftAndScaleEnabled) {\n model.inverseShiftAndScaleMatrix = computeInverseShiftAndScaleMatrix(model.coordShift, model.coordScale);\n } else {\n model.inverseShiftAndScaleMatrix = null;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n elementCount: 0,\n stride: 0,\n colorBOStride: 0,\n vertexOffset: 0,\n normalOffset: 0,\n tCoordOffset: 0,\n tCoordComponents: 0,\n colorOffset: 0,\n colorComponents: 0,\n tcoordBO: null,\n customData: [],\n coordShift: null,\n coordScale: null,\n coordShiftAndScaleEnabled: false,\n inverseShiftAndScaleMatrix: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkBufferObject.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['colorBO', 'elementCount', 'stride', 'colorBOStride', 'vertexOffset', 'normalOffset', 'tCoordOffset', 'tCoordComponents', 'colorOffset', 'colorComponents', 'customData']);\n macro.get(publicAPI, model, ['coordShift', 'coordScale', 'coordShiftAndScaleEnabled', 'inverseShiftAndScaleMatrix']); // Object specific methods\n\n vtkOpenGLCellArrayBufferObject(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkCellArrayBufferObject = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCellArrayBufferObject as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // export const SHADER_TYPES = ['Vertex', 'Fragment', 'Geometry', 'Unknown'];\n// ----------------------------------------------------------------------------\n// vtkShader methods\n// ----------------------------------------------------------------------------\n\nfunction vtkShader(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkShader');\n\n publicAPI.compile = function () {\n var stype = model.context.VERTEX_SHADER;\n\n if (!model.source || !model.source.length || model.shaderType === 'Unknown') {\n return false;\n } // Ensure we delete the previous shader if necessary.\n\n\n if (model.handle !== 0) {\n model.context.deleteShader(model.handle);\n model.handle = 0;\n }\n\n switch (model.shaderType) {\n // case vtkShader::Geometry:\n // type = GL_GEOMETRY_SHADER;\n // break;\n case 'Fragment':\n stype = model.context.FRAGMENT_SHADER;\n break;\n\n case 'Vertex':\n default:\n stype = model.context.VERTEX_SHADER;\n break;\n }\n\n model.handle = model.context.createShader(stype);\n model.context.shaderSource(model.handle, model.source);\n model.context.compileShader(model.handle);\n var isCompiled = model.context.getShaderParameter(model.handle, model.context.COMPILE_STATUS);\n\n if (!isCompiled) {\n var lastError = model.context.getShaderInfoLog(model.handle);\n vtkErrorMacro(\"Error compiling shader '\".concat(model.source, \"': \").concat(lastError));\n model.context.deleteShader(model.handle);\n model.handle = 0;\n return false;\n } // The shader compiled, store its handle and return success.\n\n\n return true;\n };\n\n publicAPI.cleanup = function () {\n if (model.shaderType === 'Unknown' || model.handle === 0) {\n return;\n }\n\n model.context.deleteShader(model.handle);\n model.handle = 0;\n model.dirty = true;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n shaderType: 'Unknown',\n source: '',\n error: '',\n handle: 0,\n dirty: false,\n context: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['shaderType', 'source', 'error', 'handle', 'context']); // Object methods\n\n vtkShader(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkShader'); // ----------------------------------------------------------------------------\n\nvar vtkShader$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkShader$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkShader from './Shader.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // perform in place string substitutions, indicate if a substitution was done\n// this is useful for building up shader strings which typically involve\n// lots of string substitutions. Return true if a substitution was done.\n\nfunction substitute(source, search, replace, all) {\n // We only accept strings or array of strings, typeof is faster than Array.isArray\n var replaceStr = typeof replace === 'string' ? replace : replace.join('\\n'); // We don't need to instantiate a RegExp if we don't want a global substitution.\n // In all other cases, we need to take the provided string or RegExp and\n // instantiate a new one to add the `g` flag.\n // Argument defaults are transpiled to slow `arguments`-based operations\n // better assume undefined as flag to know if the value is set or not\n\n var replaceSearch = all === false ? search : new RegExp(search, 'g');\n var resultstr = source.replace(replaceSearch, replaceStr);\n return {\n // If the result is different than the input, we did perform a replacement\n replace: resultstr !== replaceStr,\n result: resultstr\n };\n} // ----------------------------------------------------------------------------\n// vtkShaderProgram methods\n// ----------------------------------------------------------------------------\n\nfunction vtkShaderProgram(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkShaderProgram');\n\n publicAPI.compileShader = function () {\n if (!model.vertexShader.compile()) {\n vtkErrorMacro(model.vertexShader.getSource().split('\\n').map(function (line, index) {\n return \"\".concat(index, \": \").concat(line);\n }).join('\\n'));\n vtkErrorMacro(model.vertexShader.getError());\n return 0;\n }\n\n if (!model.fragmentShader.compile()) {\n vtkErrorMacro(model.fragmentShader.getSource().split('\\n').map(function (line, index) {\n return \"\".concat(index, \": \").concat(line);\n }).join('\\n'));\n vtkErrorMacro(model.fragmentShader.getError());\n return 0;\n } // skip geometry for now\n\n\n if (!publicAPI.attachShader(model.vertexShader)) {\n vtkErrorMacro(model.error);\n return 0;\n }\n\n if (!publicAPI.attachShader(model.fragmentShader)) {\n vtkErrorMacro(model.error);\n return 0;\n }\n\n if (!publicAPI.link()) {\n vtkErrorMacro(\"Links failed: \".concat(model.error));\n return 0;\n }\n\n publicAPI.setCompiled(true);\n return 1;\n };\n\n publicAPI.cleanup = function () {\n if (model.shaderType === 'Unknown' || model.handle === 0) {\n return;\n }\n\n model.context.deleteShader(model.handle);\n model.handle = 0;\n };\n\n publicAPI.bind = function () {\n if (!model.linked && !publicAPI.link()) {\n return false;\n }\n\n model.context.useProgram(model.handle);\n publicAPI.setBound(true);\n return true;\n };\n\n publicAPI.isBound = function () {\n return !!model.bound;\n };\n\n publicAPI.release = function () {\n model.context.useProgram(null);\n publicAPI.setBound(false);\n };\n\n publicAPI.setContext = function (ctx) {\n model.vertexShader.setContext(ctx);\n model.fragmentShader.setContext(ctx);\n model.geometryShader.setContext(ctx);\n };\n\n publicAPI.link = function () {\n if (model.linked) {\n return true;\n }\n\n if (model.handle === 0) {\n model.error = 'Program has not been initialized, and/or does not have shaders.';\n return false;\n } // clear out the list of uniforms used\n\n\n model.uniformLocs = {};\n model.context.linkProgram(model.handle);\n var isCompiled = model.context.getProgramParameter(model.handle, model.context.LINK_STATUS);\n\n if (!isCompiled) {\n var lastError = model.context.getProgramInfoLog(model.handle);\n vtkErrorMacro(\"Error linking shader \".concat(lastError));\n model.handle = 0;\n return false;\n }\n\n publicAPI.setLinked(true);\n model.attributeLocs = {};\n return true;\n };\n\n publicAPI.setUniformMatrix = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n var f32 = new Float32Array(v);\n model.context.uniformMatrix4fv(location, false, f32);\n return true;\n };\n\n publicAPI.setUniformMatrix3x3 = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n var f32 = new Float32Array(v);\n model.context.uniformMatrix3fv(location, false, f32);\n return true;\n };\n\n publicAPI.setUniformf = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1f(location, v);\n return true;\n };\n\n publicAPI.setUniformfv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1fv(location, v);\n return true;\n };\n\n publicAPI.setUniformi = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1i(location, v);\n return true;\n };\n\n publicAPI.setUniformiv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1iv(location, v);\n return true;\n };\n\n publicAPI.setUniform2f = function (name, v1, v2) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (v2 === undefined) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform2f(location, v1, v2);\n return true;\n };\n\n publicAPI.setUniform2fv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform2fv(location, v);\n return true;\n };\n\n publicAPI.setUniform2i = function (name, v1, v2) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (v2 === undefined) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform2i(location, v1, v2);\n return true;\n };\n\n publicAPI.setUniform2iv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform2iv(location, v);\n return true;\n };\n\n publicAPI.setUniform3f = function (name, a1, a2, a3) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (a3 === undefined) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform3f(location, a1, a2, a3);\n return true;\n };\n\n publicAPI.setUniform3fArray = function (name, a) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (!Array.isArray(a) || a.length !== 3) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform3f(location, a[0], a[1], a[2]);\n return true;\n };\n\n publicAPI.setUniform3fv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform3fv(location, v);\n return true;\n };\n\n publicAPI.setUniform3i = function (name) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var array = args; // allow an array passed as a single argument\n\n if (array.length === 1 && Array.isArray(array[0])) {\n array = array[0];\n }\n\n if (array.length !== 3) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform3i(location, array[0], array[1], array[2]);\n return true;\n };\n\n publicAPI.setUniform3iv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform3iv(location, v);\n return true;\n };\n\n publicAPI.setUniform4f = function (name) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n var array = args; // allow an array passed as a single argument\n\n if (array.length === 1 && Array.isArray(array[0])) {\n array = array[0];\n }\n\n if (array.length !== 4) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform4f(location, array[0], array[1], array[2], array[3]);\n return true;\n };\n\n publicAPI.setUniform4fv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform4fv(location, v);\n return true;\n };\n\n publicAPI.setUniform4i = function (name) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n var array = args; // allow an array passed as a single argument\n\n if (array.length === 1 && Array.isArray(array[0])) {\n array = array[0];\n }\n\n if (array.length !== 4) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform4i(location, array[0], array[1], array[2], array[3]);\n return true;\n };\n\n publicAPI.setUniform4iv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform4iv(location, v);\n return true;\n };\n\n publicAPI.findUniform = function (name) {\n if (!name || !model.linked) {\n return -1;\n } // see if we have cached the result\n\n\n var loc = model.uniformLocs[name];\n\n if (loc !== undefined) {\n return loc;\n }\n\n loc = model.context.getUniformLocation(model.handle, name);\n\n if (loc === null) {\n model.error = \"Uniform \".concat(name, \" not found in current shader program.\");\n model.uniformLocs[name] = -1;\n return -1;\n }\n\n model.uniformLocs[name] = loc;\n return loc;\n };\n\n publicAPI.isUniformUsed = function (name) {\n if (!name) {\n return false;\n } // see if we have cached the result\n\n\n var loc = model.uniformLocs[name];\n\n if (loc !== undefined) {\n return loc !== null;\n }\n\n if (!model.linked) {\n vtkErrorMacro('attempt to find uniform when the shader program is not linked');\n return false;\n }\n\n loc = model.context.getUniformLocation(model.handle, name);\n model.uniformLocs[name] = loc;\n\n if (loc === null) {\n return false;\n }\n\n return true;\n };\n\n publicAPI.isAttributeUsed = function (name) {\n if (!name) {\n return false;\n } // see if we have cached the result\n\n\n if (name in model.attributeLocs) {\n return true;\n }\n\n if (!model.linked) {\n vtkErrorMacro('attempt to find uniform when the shader program is not linked');\n return false;\n }\n\n var loc = model.context.getAttribLocation(model.handle, name);\n\n if (loc === -1) {\n return false;\n }\n\n model.attributeLocs[name] = loc;\n return true;\n };\n\n publicAPI.attachShader = function (shader) {\n if (shader.getHandle() === 0) {\n model.error = 'Shader object was not initialized, cannot attach it.';\n return false;\n }\n\n if (shader.getShaderType() === 'Unknown') {\n model.error = 'Shader object is of type Unknown and cannot be used.';\n return false;\n }\n\n if (model.handle === 0) {\n var thandle = model.context.createProgram();\n\n if (thandle === 0) {\n model.error = 'Could not create shader program.';\n return false;\n }\n\n model.handle = thandle;\n model.linked = false;\n }\n\n if (shader.getShaderType() === 'Vertex') {\n if (model.vertexShaderHandle !== 0) {\n model.comntext.detachShader(model.handle, model.vertexShaderHandle);\n }\n\n model.vertexShaderHandle = shader.getHandle();\n }\n\n if (shader.getShaderType() === 'Fragment') {\n if (model.fragmentShaderHandle !== 0) {\n model.context.detachShader(model.handle, model.fragmentShaderHandle);\n }\n\n model.fragmentShaderHandle = shader.getHandle();\n }\n\n model.context.attachShader(model.handle, shader.getHandle());\n publicAPI.setLinked(false);\n return true;\n };\n\n publicAPI.detachShader = function (shader) {\n if (shader.getHandle() === 0) {\n model.error = 'shader object was not initialized, cannot attach it.';\n return false;\n }\n\n if (shader.getShaderType() === 'Unknown') {\n model.error = 'Shader object is of type Unknown and cannot be used.';\n return false;\n }\n\n if (model.handle === 0) {\n model.error = 'This shader program has not been initialized yet.';\n }\n\n switch (shader.getShaderType()) {\n case 'Vertex':\n if (model.vertexShaderHandle !== shader.getHandle()) {\n model.error = 'The supplied shader was not attached to this program.';\n return false;\n }\n\n model.context.detachShader(model.handle, shader.getHandle());\n model.vertexShaderHandle = 0;\n model.linked = false;\n return true;\n\n case 'Fragment':\n if (model.fragmentShaderHandle !== shader.getHandle()) {\n model.error = 'The supplied shader was not attached to this program.';\n return false;\n }\n\n model.context.detachShader(model.handle, shader.getHandle());\n model.fragmentShaderHandle = 0;\n model.linked = false;\n return true;\n\n default:\n return false;\n }\n };\n\n publicAPI.setContext = function (ctx) {\n model.context = ctx;\n model.vertexShader.setContext(ctx);\n model.fragmentShader.setContext(ctx);\n model.geometryShader.setContext(ctx);\n };\n\n publicAPI.setLastCameraMTime = function (mtime) {\n model.lastCameraMTime = mtime;\n }; // publicAPI.enableAttributeArray = (name) => {\n // const location = publicAPI.findAttributeArray(name);\n // if (location === -1) {\n // model.error = `Could not enable attribute ${name} No such attribute.`;\n // return false;\n // }\n // model.context.enableVertexAttribArray(location);\n // return true;\n // };\n // publicAPI.disableAttributeArray = (name) => {\n // const location = publicAPI.findAttributeArray(name);\n // if (location === -1) {\n // model.error = `Could not enable attribute ${name} No such attribute.`;\n // return false;\n // }\n // model.context.disableVertexAttribArray(location);\n // return true;\n // };\n\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n vertexShaderHandle: 0,\n fragmentShaderHandle: 0,\n geometryShaderHandle: 0,\n vertexShader: null,\n fragmentShader: null,\n geometryShader: null,\n linked: false,\n bound: false,\n compiled: false,\n error: '',\n handle: 0,\n numberOfOutputs: 0,\n attributesLocs: null,\n uniformLocs: null,\n md5Hash: 0,\n context: null,\n lastCameraMTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Instantiate internal objects\n\n model.attributesLocs = {};\n model.uniformLocs = {};\n model.vertexShader = vtkShader.newInstance();\n model.vertexShader.setShaderType('Vertex');\n model.fragmentShader = vtkShader.newInstance();\n model.fragmentShader.setShaderType('Fragment');\n model.geometryShader = vtkShader.newInstance();\n model.geometryShader.setShaderType('Geometry'); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['lastCameraMTime']);\n macro.setGet(publicAPI, model, ['error', 'handle', 'compiled', 'bound', 'md5Hash', 'vertexShader', 'fragmentShader', 'geometryShader', 'linked']); // Object methods\n\n vtkShaderProgram(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\n\nvar newInstance = macro.newInstance(extend, 'vtkShaderProgram'); // ----------------------------------------------------------------------------\n\nvar vtkShaderProgram$1 = {\n newInstance: newInstance,\n extend: extend,\n substitute: substitute\n};\n\nexport { vtkShaderProgram$1 as default, substitute };\n","import macro from '../../macros.js';\nimport { ObjectType } from './BufferObject/Constants.js';\n\n// vtkOpenGLVertexArrayObject methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLVertexArrayObject(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLVertexArrayObject'); // Public API methods\n\n publicAPI.exposedMethod = function () {// This is a publicly exposed method of this object\n };\n\n publicAPI.initialize = function () {\n model.instancingExtension = null;\n\n if (!model._openGLRenderWindow.getWebgl2()) {\n model.instancingExtension = model.context.getExtension('ANGLE_instanced_arrays');\n }\n\n if (!model.forceEmulation && model._openGLRenderWindow && model._openGLRenderWindow.getWebgl2()) {\n model.extension = null;\n model.supported = true;\n model.handleVAO = model.context.createVertexArray();\n } else {\n model.extension = model.context.getExtension('OES_vertex_array_object'); // Start setting up VAO\n\n if (!model.forceEmulation && model.extension) {\n model.supported = true;\n model.handleVAO = model.extension.createVertexArrayOES();\n } else {\n model.supported = false;\n }\n }\n };\n\n publicAPI.isReady = function () {\n return (// We either probed and allocated a VAO, or are falling back as the current\n // hardware does not support VAOs.\n model.handleVAO !== 0 || model.supported === false\n );\n };\n\n publicAPI.bind = function () {\n // Either simply bind the VAO, or emulate behavior by binding all attributes.\n if (!publicAPI.isReady()) {\n publicAPI.initialize();\n }\n\n if (publicAPI.isReady() && model.supported) {\n if (model.extension) {\n model.extension.bindVertexArrayOES(model.handleVAO);\n } else {\n model.context.bindVertexArray(model.handleVAO);\n }\n } else if (publicAPI.isReady()) {\n var gl = model.context;\n\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n model.context.bindBuffer(gl.ARRAY_BUFFER, buff.buffer);\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n var matrixCount = attrIt.isMatrix ? attrIt.size : 1;\n\n for (var i = 0; i < matrixCount; ++i) {\n gl.enableVertexAttribArray(attrIt.index + i);\n gl.vertexAttribPointer(attrIt.index + i, attrIt.size, attrIt.type, attrIt.normalize, attrIt.stride, attrIt.offset + attrIt.stride * i / attrIt.size);\n\n if (attrIt.divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(attrIt.index + i, 1);\n } else {\n gl.vertexAttribDivisor(attrIt.index + i, 1);\n }\n }\n }\n }\n }\n }\n };\n\n publicAPI.release = function () {\n // Either simply release the VAO, or emulate behavior by releasing all attributes.\n if (publicAPI.isReady() && model.supported) {\n if (model.extension) {\n model.extension.bindVertexArrayOES(null);\n } else {\n model.context.bindVertexArray(null);\n }\n } else if (publicAPI.isReady()) {\n var gl = model.context;\n\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n model.context.bindBuffer(gl.ARRAY_BUFFER, buff.buffer);\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n var matrixCount = attrIt.isMatrix ? attrIt.size : 1;\n\n for (var i = 0; i < matrixCount; ++i) {\n gl.enableVertexAttribArray(attrIt.index + i);\n gl.vertexAttribPointer(attrIt.index + i, attrIt.size, attrIt.type, attrIt.normalize, attrIt.stride, attrIt.offset + attrIt.stride * i / attrIt.size);\n\n if (attrIt.divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(attrIt.index + i, 0);\n } else {\n gl.vertexAttribDivisor(attrIt.index + i, 0);\n }\n }\n\n gl.disableVertexAttribArray(attrIt.index + i);\n }\n }\n }\n }\n };\n\n publicAPI.shaderProgramChanged = function () {\n publicAPI.release();\n\n if (model.handleVAO) {\n if (model.extension) {\n model.extension.deleteVertexArrayOES(model.handleVAO);\n } else {\n model.context.deleteVertexArray(model.handleVAO);\n }\n }\n\n model.handleVAO = 0;\n model.handleProgram = 0;\n };\n\n publicAPI.releaseGraphicsResources = function () {\n publicAPI.shaderProgramChanged();\n\n if (model.handleVAO) {\n if (model.extension) {\n model.extension.deleteVertexArrayOES(model.handleVAO);\n } else {\n model.context.deleteVertexArray(model.handleVAO);\n }\n }\n\n model.handleVAO = 0;\n model.supported = true;\n model.handleProgram = 0;\n };\n\n publicAPI.addAttributeArray = function (program, buffer, name, offset, stride, elementType, elementTupleSize, normalize) {\n return publicAPI.addAttributeArrayWithDivisor(program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, 0, false);\n };\n\n publicAPI.addAttributeArrayWithDivisor = function (program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, divisor, isMatrix) {\n if (!program) {\n return false;\n } // Check the program is bound, and the buffer is valid.\n\n\n if (!program.isBound() || buffer.getHandle() === 0 || buffer.getType() !== ObjectType.ARRAY_BUFFER) {\n return false;\n } // Perform initialization if necessary, ensure program matches VAOs.\n\n\n if (model.handleProgram === 0) {\n model.handleProgram = program.getHandle();\n }\n\n if (!publicAPI.isReady()) {\n publicAPI.initialize();\n }\n\n if (!publicAPI.isReady() || model.handleProgram !== program.getHandle()) {\n return false;\n }\n\n var gl = model.context;\n var attribs = {};\n attribs.name = name;\n attribs.index = gl.getAttribLocation(model.handleProgram, name);\n attribs.offset = offset;\n attribs.stride = stride;\n attribs.type = elementType;\n attribs.size = elementTupleSize;\n attribs.normalize = normalize;\n attribs.isMatrix = isMatrix;\n attribs.divisor = divisor;\n\n if (attribs.Index === -1) {\n return false;\n } // Always make the call as even the first use wants the attrib pointer setting\n // up when we are emulating.\n\n\n buffer.bind();\n gl.enableVertexAttribArray(attribs.index);\n gl.vertexAttribPointer(attribs.index, attribs.size, attribs.type, attribs.normalize, attribs.stride, attribs.offset);\n\n if (divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(attribs.index, 1);\n } else {\n gl.vertexAttribDivisor(attribs.index, 1);\n }\n }\n\n attribs.buffer = buffer.getHandle(); // If vertex array objects are not supported then build up our list.\n\n if (!model.supported) {\n // find the buffer\n var buffFound = false;\n\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n\n if (buff.buffer === attribs.buffer) {\n buffFound = true;\n var found = false;\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n\n if (attrIt.name === name) {\n found = true;\n buff.attributes[iatt] = attribs;\n }\n }\n\n if (!found) {\n buff.attributes.push(attribs);\n }\n }\n }\n\n if (!buffFound) {\n model.buffers.push({\n buffer: attribs.buffer,\n attributes: [attribs]\n });\n }\n }\n\n return true;\n };\n\n publicAPI.addAttributeMatrixWithDivisor = function (program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, divisor) {\n // bind the first row of values\n var result = publicAPI.addAttributeArrayWithDivisor(program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, divisor, true);\n\n if (!result) {\n return result;\n }\n\n var gl = model.context;\n var index = gl.getAttribLocation(model.handleProgram, name);\n\n for (var i = 1; i < elementTupleSize; i++) {\n gl.enableVertexAttribArray(index + i);\n gl.vertexAttribPointer(index + i, elementTupleSize, elementType, normalize, stride, offset + stride * i / elementTupleSize);\n\n if (divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(index + i, 1);\n } else {\n gl.vertexAttribDivisor(index + i, 1);\n }\n }\n }\n\n return true;\n };\n\n publicAPI.removeAttributeArray = function (name) {\n if (!publicAPI.isReady() || model.handleProgram === 0) {\n return false;\n } // If we don't have real VAOs find the entry and remove it too.\n\n\n if (!model.supported) {\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n\n if (attrIt.name === name) {\n buff.attributes.splice(iatt, 1);\n\n if (!buff.attributes.length) {\n model.buffers.splice(ibuff, 1);\n }\n\n return true;\n }\n }\n }\n }\n\n return true;\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n forceEmulation: false,\n handleVAO: 0,\n handleProgram: 0,\n supported: true,\n buffers: null,\n context: null // _openGLRenderWindow: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Internal objects initialization\n\n model.buffers = []; // Object methods\n\n macro.obj(publicAPI, model); // Create get-only macros\n\n macro.get(publicAPI, model, ['supported']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['forceEmulation']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkOpenGLVertexArrayObject(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLVertexArrayObject'); // ----------------------------------------------------------------------------\n\nvar vtkVertexArrayObject = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkVertexArrayObject as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkCellArrayBufferObject from './CellArrayBufferObject.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkVertexArrayObject from './VertexArrayObject.js';\nimport { Representation } from '../Core/Property/Constants.js';\n\nvar primTypes = {\n Start: 0,\n Points: 0,\n Lines: 1,\n Tris: 2,\n TriStrips: 3,\n TrisEdges: 4,\n TriStripsEdges: 5,\n End: 6\n}; // ----------------------------------------------------------------------------\n// vtkOpenGLHelper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLHelper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLHelper');\n\n publicAPI.setOpenGLRenderWindow = function (win) {\n model.context = win.getContext();\n model.program.setContext(model.context);\n model.VAO.setOpenGLRenderWindow(win);\n model.CABO.setOpenGLRenderWindow(win);\n };\n\n publicAPI.releaseGraphicsResources = function (oglwin) {\n model.VAO.releaseGraphicsResources();\n model.CABO.releaseGraphicsResources();\n model.CABO.setElementCount(0);\n };\n\n publicAPI.drawArrays = function (ren, actor, rep, oglMapper) {\n // Are there any entries\n if (model.CABO.getElementCount()) {\n // are we drawing edges\n var mode = publicAPI.getOpenGLMode(rep);\n var wideLines = publicAPI.haveWideLines(ren, actor);\n var gl = model.context;\n var depthMask = gl.getParameter(gl.DEPTH_WRITEMASK);\n\n if (model.pointPicking) {\n gl.depthMask(false);\n }\n\n var drawingLines = mode === gl.LINES;\n\n if (drawingLines && wideLines) {\n publicAPI.updateShaders(ren, actor, oglMapper);\n gl.drawArraysInstanced(mode, 0, model.CABO.getElementCount(), 2 * Math.ceil(actor.getProperty().getLineWidth()));\n } else {\n gl.lineWidth(actor.getProperty().getLineWidth());\n publicAPI.updateShaders(ren, actor, oglMapper);\n gl.drawArrays(mode, 0, model.CABO.getElementCount()); // reset the line width\n\n gl.lineWidth(1);\n }\n\n var stride = (mode === gl.POINTS ? 1 : 0) || (mode === gl.LINES ? 2 : 3);\n\n if (model.pointPicking) {\n gl.depthMask(depthMask);\n }\n\n return model.CABO.getElementCount() / stride;\n }\n\n return 0;\n };\n\n publicAPI.getOpenGLMode = function (rep) {\n if (model.pointPicking) {\n return model.context.POINTS;\n }\n\n var type = model.primitiveType;\n\n if (rep === Representation.POINTS || type === primTypes.Points) {\n return model.context.POINTS;\n }\n\n if (rep === Representation.WIREFRAME || type === primTypes.Lines || type === primTypes.TrisEdges || type === primTypes.TriStripsEdges) {\n return model.context.LINES;\n }\n\n return model.context.TRIANGLES;\n };\n\n publicAPI.haveWideLines = function (ren, actor) {\n if (actor.getProperty().getLineWidth() > 1.0) {\n // we have wide lines, but the OpenGL implementation may\n // actually support them, check the range to see if we\n // really need have to implement our own wide lines\n if (model.CABO.getOpenGLRenderWindow()) {\n if (model.CABO.getOpenGLRenderWindow().getHardwareMaximumLineWidth() >= actor.getProperty().getLineWidth()) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n };\n\n publicAPI.getNeedToRebuildShaders = function (ren, actor, oglMapper) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // mapper modified (lighting complexity)\n if (oglMapper.getNeedToRebuildShaders(publicAPI, ren, actor) || publicAPI.getProgram() === 0 || publicAPI.getShaderSourceTime().getMTime() < oglMapper.getMTime() || publicAPI.getShaderSourceTime().getMTime() < actor.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateShaders = function (ren, actor, oglMapper) {\n // has something changed that would require us to recreate the shader?\n if (publicAPI.getNeedToRebuildShaders(ren, actor, oglMapper)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n oglMapper.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model.CABO.getOpenGLRenderWindow().getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n if (newShader !== publicAPI.getProgram()) {\n publicAPI.setProgram(newShader); // reset the VAO as the shader has changed\n\n publicAPI.getVAO().releaseGraphicsResources();\n }\n\n publicAPI.getShaderSourceTime().modified();\n } else {\n model.CABO.getOpenGLRenderWindow().getShaderCache().readyShaderProgram(publicAPI.getProgram());\n }\n\n publicAPI.getVAO().bind();\n oglMapper.setMapperShaderParameters(publicAPI, ren, actor);\n oglMapper.setPropertyShaderParameters(publicAPI, ren, actor);\n oglMapper.setCameraShaderParameters(publicAPI, ren, actor);\n oglMapper.setLightingShaderParameters(publicAPI, ren, actor);\n oglMapper.invokeShaderCallbacks(publicAPI, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (ren, actor, size) {\n if (publicAPI.haveWideLines(ren, actor)) {\n publicAPI.getProgram().setUniform2f('viewportSize', size.usize, size.vsize);\n var lineWidth = parseFloat(actor.getProperty().getLineWidth());\n var halfLineWidth = lineWidth / 2.0;\n publicAPI.getProgram().setUniformf('lineWidthStepSize', lineWidth / Math.ceil(lineWidth));\n publicAPI.getProgram().setUniformf('halfLineWidth', halfLineWidth);\n }\n\n if (model.primitiveType === primTypes.Points || actor.getProperty().getRepresentation() === Representation.POINTS) {\n publicAPI.getProgram().setUniformf('pointSize', actor.getProperty().getPointSize());\n } else if (model.pointPicking) {\n publicAPI.getProgram().setUniformf('pointSize', publicAPI.getPointPickingPrimitiveSize());\n }\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex; // Always set point size in case we need picking\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', ['//VTK::PositionVC::Dec', 'uniform float pointSize;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['//VTK::PositionVC::Impl', ' gl_PointSize = pointSize;'], false).result; // for lines, make sure we add the width code\n\n if (publicAPI.getOpenGLMode(actor.getProperty().getRepresentation()) === model.context.LINES && publicAPI.haveWideLines(ren, actor)) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', ['//VTK::PositionVC::Dec', 'uniform vec2 viewportSize;', 'uniform float lineWidthStepSize;', 'uniform float halfLineWidth;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['//VTK::PositionVC::Impl', ' if (halfLineWidth > 0.0)', ' {', ' float offset = float(gl_InstanceID / 2) * lineWidthStepSize - halfLineWidth;', ' vec4 tmpPos = gl_Position;', ' vec3 tmpPos2 = tmpPos.xyz / tmpPos.w;', ' tmpPos2.x = tmpPos2.x + 2.0 * mod(float(gl_InstanceID), 2.0) * offset / viewportSize[0];', ' tmpPos2.y = tmpPos2.y + 2.0 * mod(float(gl_InstanceID + 1), 2.0) * offset / viewportSize[1];', ' gl_Position = vec4(tmpPos2.xyz * tmpPos.w, tmpPos.w);', ' }']).result;\n }\n\n shaders.Vertex = VSSource;\n };\n\n publicAPI.getPointPickingPrimitiveSize = function () {\n if (model.primitiveType === primTypes.Points) {\n return 2;\n }\n\n if (model.primitiveType === primTypes.Lines) {\n return 4;\n }\n\n return 6;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n program: null,\n shaderSourceTime: null,\n VAO: null,\n attributeUpdateTime: null,\n CABO: null,\n primitiveType: 0,\n pointPicking: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n model.shaderSourceTime = {};\n macro.obj(model.shaderSourceTime);\n model.attributeUpdateTime = {};\n macro.obj(model.attributeUpdateTime);\n macro.setGet(publicAPI, model, ['program', 'shaderSourceTime', 'VAO', 'attributeUpdateTime', 'CABO', 'primitiveType', 'pointPicking']);\n model.program = vtkShaderProgram.newInstance();\n model.VAO = vtkVertexArrayObject.newInstance();\n model.CABO = vtkCellArrayBufferObject.newInstance(); // Object methods\n\n vtkOpenGLHelper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkHelper = {\n newInstance: newInstance,\n extend: extend,\n primTypes: primTypes\n};\n\nexport { vtkHelper as default, extend, newInstance, primTypes };\n","var Wrap = {\n CLAMP_TO_EDGE: 0,\n REPEAT: 1,\n MIRRORED_REPEAT: 2\n};\nvar Filter = {\n NEAREST: 0,\n LINEAR: 1,\n NEAREST_MIPMAP_NEAREST: 2,\n NEAREST_MIPMAP_LINEAR: 3,\n LINEAR_MIPMAP_NEAREST: 4,\n LINEAR_MIPMAP_LINEAR: 5\n};\nvar Constants = {\n Wrap: Wrap,\n Filter: Filter\n};\n\nexport { Filter, Wrap, Constants as default };\n","/* eslint-disable no-bitwise */\nvar floatView = new Float32Array(1);\nvar int32View = new Int32Array(floatView.buffer);\n/* eslint-disable no-bitwise */\n\n/* This method is faster than the OpenEXR implementation (very often\n * used, eg. in Ogre), with the additional benefit of rounding, inspired\n * by James Tursa?s half-precision code. */\n\nfunction toHalf(val) {\n floatView[0] = val;\n var x = int32View[0];\n var bits = x >> 16 & 0x8000;\n /* Get the sign */\n\n var m = x >> 12 & 0x07ff;\n /* Keep one extra bit for rounding */\n\n var e = x >> 23 & 0xff;\n /* Using int is faster here */\n\n /* If zero, or denormal, or exponent underflows too much for a denormal\n * half, return signed zero. */\n\n if (e < 103) {\n return bits;\n }\n /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */\n\n\n if (e > 142) {\n bits |= 0x7c00;\n /* If exponent was 0xff and one mantissa bit was set, it means NaN,\n * not Inf, so make sure we set one mantissa bit too. */\n\n bits |= (e === 255 ? 0 : 1) && x & 0x007fffff;\n return bits;\n }\n /* If exponent underflows but not too much, return a denormal */\n\n\n if (e < 113) {\n m |= 0x0800;\n /* Extra rounding may overflow and set mantissa to 0 and exponent\n * to 1, which is OK. */\n\n bits |= (m >> 114 - e) + (m >> 113 - e & 1);\n return bits;\n }\n\n bits |= e - 112 << 10 | m >> 1;\n /* Extra rounding. An overflow will set mantissa to 0 and increment\n * the exponent, which is OK. */\n\n bits += m & 1;\n return bits;\n}\n\nfunction fromHalf(h) {\n var s = (h & 0x8000) >> 15;\n var e = (h & 0x7c00) >> 10;\n var f = h & 0x03ff;\n\n if (e === 0) {\n return (s ? -1 : 1) * Math.pow(2, -14) * (f / Math.pow(2, 10));\n }\n\n if (e === 0x1f) {\n return f ? NaN : (s ? -1 : 1) * Infinity;\n }\n\n return (s ? -1 : 1) * Math.pow(2, e - 15) * (1 + f / Math.pow(2, 10));\n}\n\nvar HalfFloat = {\n fromHalf: fromHalf,\n toHalf: toHalf\n};\n\nexport { HalfFloat as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport Constants from './Texture/Constants.js';\nimport HalfFloat from '../../Common/Core/HalfFloat.js';\nimport { newInstance as newInstance$1, obj, set, setGet, get, moveToProtected, newTypedArray, vtkDebugMacro as vtkDebugMacro$1, vtkErrorMacro as vtkErrorMacro$1, vtkWarningMacro as vtkWarningMacro$1 } from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport { Q as isPowerOfTwo, M as nearestPowerOfTwo } from '../../Common/Core/Math/index.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Wrap = Constants.Wrap,\n Filter = Constants.Filter;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes;\nvar vtkDebugMacro = vtkDebugMacro$1,\n vtkErrorMacro = vtkErrorMacro$1,\n vtkWarningMacro = vtkWarningMacro$1;\nvar toHalf = HalfFloat.toHalf; // ----------------------------------------------------------------------------\n// vtkOpenGLTexture methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLTexture(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLTexture'); // Renders myself\n\n publicAPI.render = function () {\n var renWin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n if (renWin) {\n model._openGLRenderWindow = renWin;\n } else {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer'); // sync renderable properties\n\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n }\n\n model.context = model._openGLRenderWindow.getContext();\n\n if (model.renderable.getInterpolate()) {\n if (model.generateMipmap) {\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n } else {\n publicAPI.setMinificationFilter(Filter.LINEAR);\n }\n\n publicAPI.setMagnificationFilter(Filter.LINEAR);\n } else {\n publicAPI.setMinificationFilter(Filter.NEAREST);\n publicAPI.setMagnificationFilter(Filter.NEAREST);\n }\n\n if (model.renderable.getRepeat()) {\n publicAPI.setWrapR(Wrap.REPEAT);\n publicAPI.setWrapS(Wrap.REPEAT);\n publicAPI.setWrapT(Wrap.REPEAT);\n } // clear image if input data is set\n\n\n if (model.renderable.getInputData()) {\n model.renderable.setImage(null);\n } // create the texture if it is not done already\n\n\n if (!model.handle || model.renderable.getMTime() > model.textureBuildTime.getMTime()) {\n // if we have an Image\n if (model.renderable.getImage() !== null) {\n if (model.renderable.getInterpolate()) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n } // Have an Image which may not be complete\n\n\n if (model.renderable.getImage() && model.renderable.getImageLoaded()) {\n publicAPI.create2DFromImage(model.renderable.getImage());\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n }\n } // if we have a canvas\n\n\n if (model.renderable.getCanvas() !== null) {\n if (model.renderable.getInterpolate()) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n }\n\n var canvas = model.renderable.getCanvas();\n publicAPI.create2DFromRaw(canvas.width, canvas.height, 4, VtkDataTypes.UNSIGNED_CHAR, canvas, true);\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n } // if we have jsImageData\n\n\n if (model.renderable.getJsImageData() !== null) {\n var jsid = model.renderable.getJsImageData();\n\n if (model.renderable.getInterpolate()) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n }\n\n publicAPI.create2DFromRaw(jsid.width, jsid.height, 4, VtkDataTypes.UNSIGNED_CHAR, jsid.data, true);\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n } // if we have InputData\n\n\n var input = model.renderable.getInputData(0);\n\n if (input && input.getPointData().getScalars()) {\n var ext = input.getExtent();\n var inScalars = input.getPointData().getScalars(); // do we have a cube map? Six inputs\n\n var data = [];\n\n for (var i = 0; i < model.renderable.getNumberOfInputPorts(); ++i) {\n var indata = model.renderable.getInputData(i);\n var scalars = indata ? indata.getPointData().getScalars().getData() : null;\n\n if (scalars) {\n data.push(scalars);\n }\n }\n\n if (model.renderable.getInterpolate() && inScalars.getNumberOfComponents() === 4) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n }\n\n if (data.length % 6 === 0) {\n publicAPI.createCubeFromRaw(ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, inScalars.getNumberOfComponents(), inScalars.getDataType(), data);\n } else {\n publicAPI.create2DFromRaw(ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, inScalars.getNumberOfComponents(), inScalars.getDataType(), inScalars.getData());\n }\n\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n }\n }\n\n if (model.handle) {\n publicAPI.activate();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.destroyTexture = function () {\n // deactivate it first\n publicAPI.deactivate();\n\n if (model.context && model.handle) {\n model.context.deleteTexture(model.handle);\n }\n\n model.handle = 0;\n model.numberOfDimensions = 0;\n model.target = 0;\n model.components = 0;\n model.width = 0;\n model.height = 0;\n model.depth = 0;\n publicAPI.resetFormatAndType();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.createTexture = function () {\n // reuse the existing handle if we have one\n if (!model.handle) {\n model.handle = model.context.createTexture();\n\n if (model.target) {\n model.context.bindTexture(model.target, model.handle); // See: http://www.openmodel.context..org/wiki/Common_Mistakes#Creating_a_complete_texture\n // turn off mip map filter or set the base and max level correctly. here\n // both are done.\n\n model.context.texParameteri(model.target, model.context.TEXTURE_MIN_FILTER, publicAPI.getOpenGLFilterMode(model.minificationFilter));\n model.context.texParameteri(model.target, model.context.TEXTURE_MAG_FILTER, publicAPI.getOpenGLFilterMode(model.magnificationFilter));\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_S, publicAPI.getOpenGLWrapMode(model.wrapS));\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_T, publicAPI.getOpenGLWrapMode(model.wrapT));\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_R, publicAPI.getOpenGLWrapMode(model.wrapR));\n }\n\n model.context.bindTexture(model.target, null);\n }\n }\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.getTextureUnit = function () {\n if (model._openGLRenderWindow) {\n return model._openGLRenderWindow.getTextureUnitForTexture(publicAPI);\n }\n\n return -1;\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.activate = function () {\n // activate a free texture unit for this texture\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.bind();\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.deactivate = function () {\n if (model._openGLRenderWindow) {\n model._openGLRenderWindow.deactivateTexture(publicAPI);\n }\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.releaseGraphicsResources = function (rwin) {\n if (rwin && model.handle) {\n rwin.activateTexture(publicAPI);\n rwin.deactivateTexture(publicAPI);\n model.context.deleteTexture(model.handle);\n model.handle = 0;\n model.numberOfDimensions = 0;\n model.target = 0;\n model.internalFormat = 0;\n model.format = 0;\n model.openGLDataType = 0;\n model.components = 0;\n model.width = 0;\n model.height = 0;\n model.depth = 0;\n }\n\n if (model.shaderProgram) {\n model.shaderProgram.releaseGraphicsResources(rwin);\n model.shaderProgram = null;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.bind = function () {\n model.context.bindTexture(model.target, model.handle);\n\n if (model.autoParameters && publicAPI.getMTime() > model.sendParametersTime.getMTime()) {\n publicAPI.sendParameters();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.isBound = function () {\n var result = false;\n\n if (model.context && model.handle) {\n var target = 0;\n\n switch (model.target) {\n case model.context.TEXTURE_2D:\n target = model.context.TEXTURE_BINDING_2D;\n break;\n\n default:\n vtkWarningMacro('impossible case');\n break;\n }\n\n var oid = model.context.getIntegerv(target);\n result = oid === model.handle;\n }\n\n return result;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.sendParameters = function () {\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_S, publicAPI.getOpenGLWrapMode(model.wrapS));\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_T, publicAPI.getOpenGLWrapMode(model.wrapT));\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_R, publicAPI.getOpenGLWrapMode(model.wrapR));\n }\n\n model.context.texParameteri(model.target, model.context.TEXTURE_MIN_FILTER, publicAPI.getOpenGLFilterMode(model.minificationFilter));\n model.context.texParameteri(model.target, model.context.TEXTURE_MAG_FILTER, publicAPI.getOpenGLFilterMode(model.magnificationFilter));\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.context.texParameteri(model.target, model.context.TEXTURE_BASE_LEVEL, model.baseLevel);\n model.context.texParameteri(model.target, model.context.TEXTURE_MAX_LEVEL, model.maxLevel);\n } // model.context.texParameterf(model.target, model.context.TEXTURE_MIN_LOD, model.minLOD);\n // model.context.texParameterf(model.target, model.context.TEXTURE_MAX_LOD, model.maxLOD);\n\n\n model.sendParametersTime.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getInternalFormat = function (vtktype, numComps) {\n if (!model._forceInternalFormat) {\n model.internalFormat = publicAPI.getDefaultInternalFormat(vtktype, numComps);\n }\n\n if (!model.internalFormat) {\n vtkDebugMacro(\"Unable to find suitable internal format for T=\".concat(vtktype, \" NC= \").concat(numComps));\n }\n\n return model.internalFormat;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getDefaultInternalFormat = function (vtktype, numComps) {\n var result = 0; // try default next\n\n result = model._openGLRenderWindow.getDefaultTextureInternalFormat(vtktype, numComps, model.oglNorm16Ext, model.useHalfFloat);\n\n if (result) {\n return result;\n }\n\n if (!result) {\n vtkDebugMacro('Unsupported internal texture type!');\n vtkDebugMacro(\"Unable to find suitable internal format for T=\".concat(vtktype, \" NC= \").concat(numComps));\n }\n\n return result;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setInternalFormat = function (iFormat) {\n model._forceInternalFormat = true;\n\n if (iFormat !== model.internalFormat) {\n model.internalFormat = iFormat;\n publicAPI.modified();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getFormat = function (vtktype, numComps) {\n model.format = publicAPI.getDefaultFormat(vtktype, numComps);\n return model.format;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getDefaultFormat = function (vtktype, numComps) {\n if (model._openGLRenderWindow.getWebgl2()) {\n switch (numComps) {\n case 1:\n return model.context.RED;\n\n case 2:\n return model.context.RG;\n\n case 3:\n return model.context.RGB;\n\n case 4:\n return model.context.RGBA;\n\n default:\n return model.context.RGB;\n }\n } else {\n // webgl1\n switch (numComps) {\n case 1:\n return model.context.LUMINANCE;\n\n case 2:\n return model.context.LUMINANCE_ALPHA;\n\n case 3:\n return model.context.RGB;\n\n case 4:\n return model.context.RGBA;\n\n default:\n return model.context.RGB;\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.resetFormatAndType = function () {\n model.format = 0;\n model.internalFormat = 0;\n model._forceInternalFormat = false;\n model.openGLDataType = 0;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getDefaultDataType = function (vtkScalarType) {\n // DON'T DEAL with VTK_CHAR as this is platform dependent.\n if (model._openGLRenderWindow.getWebgl2()) {\n switch (vtkScalarType) {\n // case VtkDataTypes.SIGNED_CHAR:\n // return model.context.BYTE;\n case VtkDataTypes.UNSIGNED_CHAR:\n return model.context.UNSIGNED_BYTE;\n // prefer norm16 since that is accurate compared to\n // half float which is not\n\n case model.oglNorm16Ext && !model.useHalfFloat && VtkDataTypes.SHORT:\n return model.context.SHORT;\n\n case model.oglNorm16Ext && !model.useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:\n return model.context.UNSIGNED_SHORT;\n // use half float type\n\n case model.useHalfFloat && VtkDataTypes.SHORT:\n return model.context.HALF_FLOAT;\n\n case model.useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:\n return model.context.HALF_FLOAT;\n // case VtkDataTypes.INT:\n // return model.context.INT;\n // case VtkDataTypes.UNSIGNED_INT:\n // return model.context.UNSIGNED_INT;\n\n case VtkDataTypes.FLOAT:\n case VtkDataTypes.VOID: // used for depth component textures.\n\n default:\n return model.context.FLOAT;\n }\n }\n\n switch (vtkScalarType) {\n // case VtkDataTypes.SIGNED_CHAR:\n // return model.context.BYTE;\n case VtkDataTypes.UNSIGNED_CHAR:\n return model.context.UNSIGNED_BYTE;\n // case VtkDataTypes.SHORT:\n // return model.context.SHORT;\n // case VtkDataTypes.UNSIGNED_SHORT:\n // return model.context.UNSIGNED_SHORT;\n // case VtkDataTypes.INT:\n // return model.context.INT;\n // case VtkDataTypes.UNSIGNED_INT:\n // return model.context.UNSIGNED_INT;\n\n case VtkDataTypes.FLOAT:\n case VtkDataTypes.VOID: // used for depth component textures.\n\n default:\n if (model.context.getExtension('OES_texture_float') && model.context.getExtension('OES_texture_float_linear')) {\n return model.context.FLOAT;\n }\n\n {\n var halfFloat = model.context.getExtension('OES_texture_half_float');\n\n if (halfFloat && model.context.getExtension('OES_texture_half_float_linear')) {\n return halfFloat.HALF_FLOAT_OES;\n }\n }\n return model.context.UNSIGNED_BYTE;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getOpenGLDataType = function (vtkScalarType) {\n var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!model.openGLDataType || forceUpdate) {\n model.openGLDataType = publicAPI.getDefaultDataType(vtkScalarType);\n }\n\n return model.openGLDataType;\n };\n\n publicAPI.getShiftAndScale = function () {\n var shift = 0.0;\n var scale = 1.0; // for all float type internal formats\n\n switch (model.openGLDataType) {\n case model.context.BYTE:\n scale = 127.5;\n shift = scale - 128.0;\n break;\n\n case model.context.UNSIGNED_BYTE:\n scale = 255.0;\n shift = 0.0;\n break;\n\n case model.context.SHORT:\n scale = 32767.5;\n shift = scale - 32768.0;\n break;\n\n case model.context.UNSIGNED_SHORT:\n scale = 65536.0;\n shift = 0.0;\n break;\n\n case model.context.INT:\n scale = 2147483647.5;\n shift = scale - 2147483648.0;\n break;\n\n case model.context.UNSIGNED_INT:\n scale = 4294967295.0;\n shift = 0.0;\n break;\n\n case model.context.FLOAT:\n }\n\n return {\n shift: shift,\n scale: scale\n };\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getOpenGLFilterMode = function (emode) {\n switch (emode) {\n case Filter.NEAREST:\n return model.context.NEAREST;\n\n case Filter.LINEAR:\n return model.context.LINEAR;\n\n case Filter.NEAREST_MIPMAP_NEAREST:\n return model.context.NEAREST_MIPMAP_NEAREST;\n\n case Filter.NEAREST_MIPMAP_LINEAR:\n return model.context.NEAREST_MIPMAP_LINEAR;\n\n case Filter.LINEAR_MIPMAP_NEAREST:\n return model.context.LINEAR_MIPMAP_NEAREST;\n\n case Filter.LINEAR_MIPMAP_LINEAR:\n return model.context.LINEAR_MIPMAP_LINEAR;\n\n default:\n return model.context.NEAREST;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getOpenGLWrapMode = function (vtktype) {\n switch (vtktype) {\n case Wrap.CLAMP_TO_EDGE:\n return model.context.CLAMP_TO_EDGE;\n\n case Wrap.REPEAT:\n return model.context.REPEAT;\n\n case Wrap.MIRRORED_REPEAT:\n return model.context.MIRRORED_REPEAT;\n\n default:\n return model.context.CLAMP_TO_EDGE;\n }\n }; //----------------------------------------------------------------------------\n\n\n function updateArrayDataType(dataType, data) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var pixData = [];\n var pixCount = model.width * model.height * model.components;\n\n if (depth) {\n pixCount *= model.depth;\n } // if the opengl data type is float\n // then the data array must be float\n\n\n if (dataType !== VtkDataTypes.FLOAT && model.openGLDataType === model.context.FLOAT) {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx]) {\n var dataArrayToCopy = data[idx].length > pixCount ? data[idx].subarray(0, pixCount) : data[idx];\n pixData.push(new Float32Array(dataArrayToCopy));\n } else {\n pixData.push(null);\n }\n }\n } // if the opengl data type is ubyte\n // then the data array must be u8, we currently simply truncate the data\n\n\n if (dataType !== VtkDataTypes.UNSIGNED_CHAR && model.openGLDataType === model.context.UNSIGNED_BYTE) {\n for (var _idx = 0; _idx < data.length; _idx++) {\n if (data[_idx]) {\n var _dataArrayToCopy = data[_idx].length > pixCount ? data[_idx].subarray(0, pixCount) : data[_idx];\n\n pixData.push(new Uint8Array(_dataArrayToCopy));\n } else {\n pixData.push(null);\n }\n }\n } // if the opengl data type is half float\n // then the data array must be u16\n\n\n var halfFloat = false;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n halfFloat = model.openGLDataType === model.context.HALF_FLOAT;\n } else {\n var halfFloatExt = model.context.getExtension('OES_texture_half_float');\n halfFloat = halfFloatExt && model.openGLDataType === halfFloatExt.HALF_FLOAT_OES;\n }\n\n if (halfFloat) {\n for (var _idx2 = 0; _idx2 < data.length; _idx2++) {\n if (data[_idx2]) {\n var newArray = new Uint16Array(pixCount);\n var src = data[_idx2];\n\n for (var i = 0; i < pixCount; i++) {\n newArray[i] = toHalf(src[i]);\n }\n\n pixData.push(newArray);\n } else {\n pixData.push(null);\n }\n }\n } // The output has to be filled\n\n\n if (pixData.length === 0) {\n for (var _i = 0; _i < data.length; _i++) {\n pixData.push(data[_i]);\n }\n }\n\n return pixData;\n } //----------------------------------------------------------------------------\n\n\n function scaleTextureToHighestPowerOfTwo(data) {\n if (model._openGLRenderWindow.getWebgl2()) {\n // No need if webGL2\n return data;\n }\n\n var pixData = [];\n var width = model.width;\n var height = model.height;\n var numComps = model.components;\n\n if (data && (!isPowerOfTwo(width) || !isPowerOfTwo(height))) {\n // Scale up the texture to the next highest power of two dimensions.\n var halfFloat = model.context.getExtension('OES_texture_half_float');\n var newWidth = nearestPowerOfTwo(width);\n var newHeight = nearestPowerOfTwo(height);\n var pixCount = newWidth * newHeight * model.components;\n\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx] !== null) {\n var newArray = null;\n var jFactor = height / newHeight;\n var iFactor = width / newWidth;\n var usingHalf = false;\n\n if (model.openGLDataType === model.context.FLOAT) {\n newArray = new Float32Array(pixCount);\n } else if (halfFloat && model.openGLDataType === halfFloat.HALF_FLOAT_OES) {\n newArray = new Uint16Array(pixCount);\n usingHalf = true;\n } else {\n newArray = new Uint8Array(pixCount);\n }\n\n for (var j = 0; j < newHeight; j++) {\n var joff = j * newWidth * numComps;\n var jidx = j * jFactor;\n var jlow = Math.floor(jidx);\n var jhi = Math.ceil(jidx);\n\n if (jhi >= height) {\n jhi = height - 1;\n }\n\n var jmix = jidx - jlow;\n var jmix1 = 1.0 - jmix;\n jlow = jlow * width * numComps;\n jhi = jhi * width * numComps;\n\n for (var i = 0; i < newWidth; i++) {\n var ioff = i * numComps;\n var iidx = i * iFactor;\n var ilow = Math.floor(iidx);\n var ihi = Math.ceil(iidx);\n\n if (ihi >= width) {\n ihi = width - 1;\n }\n\n var imix = iidx - ilow;\n ilow *= numComps;\n ihi *= numComps;\n\n for (var c = 0; c < numComps; c++) {\n if (usingHalf) {\n newArray[joff + ioff + c] = HalfFloat.toHalf(HalfFloat.fromHalf(data[idx][jlow + ilow + c]) * jmix1 * (1.0 - imix) + HalfFloat.fromHalf(data[idx][jlow + ihi + c]) * jmix1 * imix + HalfFloat.fromHalf(data[idx][jhi + ilow + c]) * jmix * (1.0 - imix) + HalfFloat.fromHalf(data[idx][jhi + ihi + c]) * jmix * imix);\n } else {\n newArray[joff + ioff + c] = data[idx][jlow + ilow + c] * jmix1 * (1.0 - imix) + data[idx][jlow + ihi + c] * jmix1 * imix + data[idx][jhi + ilow + c] * jmix * (1.0 - imix) + data[idx][jhi + ihi + c] * jmix * imix;\n }\n }\n }\n }\n\n pixData.push(newArray);\n model.width = newWidth;\n model.height = newHeight;\n } else {\n pixData.push(null);\n }\n }\n } // The output has to be filled\n\n\n if (pixData.length === 0) {\n for (var _i2 = 0; _i2 < data.length; _i2++) {\n pixData.push(data[_i2]);\n }\n }\n\n return pixData;\n } //----------------------------------------------------------------------------\n\n\n function useTexStorage(dataType) {\n if (model._openGLRenderWindow) {\n var _model$renderable;\n\n if (model.resizable || (_model$renderable = model.renderable) !== null && _model$renderable !== void 0 && _model$renderable.getResizable()) {\n // Cannot use texStorage if the texture is supposed to be resizable.\n return false;\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n var webGLInfo = model._openGLRenderWindow.getGLInformations();\n\n if (webGLInfo.RENDERER.value.match(/WebKit/gi) && navigator.platform.match(/Mac/gi) && model.oglNorm16Ext && (dataType === VtkDataTypes.UNSIGNED_SHORT || dataType === VtkDataTypes.SHORT)) {\n // Cannot use texStorage with EXT_texture_norm16 textures on Mac M1 GPU.\n // No errors reported but the texture is unusable.\n return false;\n } // Use texStorage for WebGL2\n\n\n return true;\n }\n\n return false;\n }\n\n return false;\n } //----------------------------------------------------------------------------\n\n\n publicAPI.create2DFromRaw = function (width, height, numComps, dataType, data) {\n var flip = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(dataType, true);\n publicAPI.getInternalFormat(dataType, numComps);\n publicAPI.getFormat(dataType, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_2D;\n model.components = numComps;\n model.width = width;\n model.height = height;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Create an array of texture with one texture\n\n var dataArray = [data];\n var pixData = updateArrayDataType(dataType, dataArray);\n var scaledData = scaleTextureToHighestPowerOfTwo(pixData); // Source texture data from the PBO.\n\n model.context.pixelStorei(model.context.UNPACK_FLIP_Y_WEBGL, flip);\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataType)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (scaledData[0] != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, scaledData[0]);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, scaledData[0]);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n } // always reset the flip\n\n\n if (flip) {\n model.context.pixelStorei(model.context.UNPACK_FLIP_Y_WEBGL, false);\n }\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.createCubeFromRaw = function (width, height, numComps, dataType, data) {\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(dataType);\n publicAPI.getInternalFormat(dataType, numComps);\n publicAPI.getFormat(dataType, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_CUBE_MAP;\n model.components = numComps;\n model.width = width;\n model.height = height;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n model.maxLevel = data.length / 6 - 1;\n publicAPI.createTexture();\n publicAPI.bind();\n var pixData = updateArrayDataType(dataType, data);\n var scaledData = scaleTextureToHighestPowerOfTwo(pixData); // invert the data because opengl is messed up with cube maps\n // and uses the old renderman standard with Y going down\n // even though it is completely at odds with OpenGL standards\n\n var invertedData = [];\n var widthLevel = model.width;\n var heightLevel = model.height;\n\n for (var i = 0; i < scaledData.length; i++) {\n if (i % 6 === 0 && i !== 0) {\n widthLevel /= 2;\n heightLevel /= 2;\n }\n\n invertedData[i] = newTypedArray(dataType, heightLevel * widthLevel * model.components);\n\n for (var y = 0; y < heightLevel; ++y) {\n var row1 = y * widthLevel * model.components;\n var row2 = (heightLevel - y - 1) * widthLevel * model.components;\n invertedData[i].set(scaledData[i].slice(row2, row2 + widthLevel * model.components), row1);\n }\n } // Source texture data from the PBO.\n\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataType)) {\n model.context.texStorage2D(model.target, 6, model.internalFormat, model.width, model.height);\n } // We get the 6 images\n\n\n for (var _i3 = 0; _i3 < 6; _i3++) {\n // For each mipmap level\n var j = 0;\n var w = model.width;\n var h = model.height;\n\n while (w >= 1 && h >= 1) {\n // In webgl 1, all levels need to be defined. So if the latest level size is\n // 8x8, we have to add 3 more null textures (4x4, 2x2, 1x1)\n // In webgl 2, the attribute maxLevel will be use.\n var tempData = null;\n\n if (j <= model.maxLevel) {\n tempData = invertedData[6 * j + _i3];\n }\n\n if (useTexStorage(dataType)) {\n if (tempData != null) {\n model.context.texSubImage2D(model.context.TEXTURE_CUBE_MAP_POSITIVE_X + _i3, j, 0, 0, w, h, model.format, model.openGLDataType, tempData);\n }\n } else {\n model.context.texImage2D(model.context.TEXTURE_CUBE_MAP_POSITIVE_X + _i3, j, model.internalFormat, w, h, 0, model.format, model.openGLDataType, tempData);\n }\n\n j++;\n w /= 2;\n h /= 2;\n }\n } // generateMipmap must not be called here because we manually upload all levels\n // if it is called, all levels will be overwritten\n\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.createDepthFromRaw = function (width, height, dataType, data) {\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(dataType);\n model.format = model.context.DEPTH_COMPONENT;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n if (dataType === VtkDataTypes.FLOAT) {\n model.internalFormat = model.context.DEPTH_COMPONENT32F;\n } else {\n model.internalFormat = model.context.DEPTH_COMPONENT16;\n }\n } else {\n model.internalFormat = model.context.DEPTH_COMPONENT;\n }\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_2D;\n model.components = 1;\n model.width = width;\n model.height = height;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataType)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (data != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, data);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, data);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.create2DFromImage = function (image) {\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(VtkDataTypes.UNSIGNED_CHAR);\n publicAPI.getInternalFormat(VtkDataTypes.UNSIGNED_CHAR, 4);\n publicAPI.getFormat(VtkDataTypes.UNSIGNED_CHAR, 4);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_2D;\n model.components = 4;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1); // Scale up the texture to the next highest power of two dimensions (if needed) and flip y.\n\n var needNearestPowerOfTwo = !model._openGLRenderWindow.getWebgl2() && (!isPowerOfTwo(image.width) || !isPowerOfTwo(image.height));\n var canvas = document.createElement('canvas');\n canvas.width = needNearestPowerOfTwo ? nearestPowerOfTwo(image.width) : image.width;\n canvas.height = needNearestPowerOfTwo ? nearestPowerOfTwo(image.height) : image.height;\n model.width = canvas.width;\n model.height = canvas.height;\n var ctx = canvas.getContext('2d');\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);\n var safeImage = canvas;\n\n if (useTexStorage(VtkDataTypes.UNSIGNED_CHAR)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (safeImage != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, safeImage);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, safeImage);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n }; // Compute scale and offset per component from min and max per component\n\n\n function computeScaleOffsets(min, max, numComps) {\n var offset = new Array(numComps);\n var scale = new Array(numComps);\n\n for (var c = 0; c < numComps; ++c) {\n offset[c] = min[c];\n scale[c] = max[c] - min[c] || 1.0;\n }\n\n return {\n scale: scale,\n offset: offset\n };\n } // HalfFloat only represents numbers between [-2048, 2048] exactly accurate,\n // for numbers outside of this range there is a precision limitation\n\n\n function hasExactHalfFloat(offset, scale) {\n // Per Component\n for (var c = 0; c < offset.length; c++) {\n var min = offset[c];\n var max = scale[c] + min;\n\n if (min < -2048 || min > 2048 || max < -2048 || max > 2048) {\n return false;\n }\n }\n\n return true;\n }\n\n function setUseHalfFloat(dataType, offset, scale, preferSizeOverAccuracy) {\n publicAPI.getOpenGLDataType(dataType);\n var useHalfFloat = false;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n useHalfFloat = model.openGLDataType === model.context.HALF_FLOAT;\n } else {\n var halfFloatExt = model.context.getExtension('OES_texture_half_float');\n useHalfFloat = halfFloatExt && model.openGLDataType === halfFloatExt.HALF_FLOAT_OES;\n } // Don't consider halfFloat and convert back to Float when the range of data does not generate an accurate halfFloat\n // AND it is not preferable to have a smaller texture than an exact texture.\n\n\n var isHalfFloat = useHalfFloat && (hasExactHalfFloat(offset, scale) || preferSizeOverAccuracy);\n model.useHalfFloat = isHalfFloat;\n }\n\n function processDataArray(dataArray, preferSizeOverAccuracy) {\n var numComps = dataArray.getNumberOfComponents();\n var dataType = dataArray.getDataType();\n var data = dataArray.getData(); // Compute min max from array\n // Using the vtkDataArray.getRange() enables caching\n\n var minArray = new Array(numComps);\n var maxArray = new Array(numComps);\n\n for (var c = 0; c < numComps; ++c) {\n var _dataArray$getRange = dataArray.getRange(c),\n _dataArray$getRange2 = _slicedToArray(_dataArray$getRange, 2),\n min = _dataArray$getRange2[0],\n max = _dataArray$getRange2[1];\n\n minArray[c] = min;\n maxArray[c] = max;\n }\n\n var scaleOffsets = computeScaleOffsets(minArray, maxArray, numComps); // preferSizeOverAccuracy will override norm16 due to bug with norm16 implementation\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1408247\n\n setUseHalfFloat(dataType, scaleOffsets.offset, scaleOffsets.scale, preferSizeOverAccuracy); // since our default is to use half float, in case that we can't use it\n // we need to use another type\n\n if (!model.useHalfFloat) {\n publicAPI.getOpenGLDataType(dataType, true);\n }\n\n return {\n numComps: numComps,\n dataType: dataType,\n data: data,\n scaleOffsets: scaleOffsets\n };\n }\n\n publicAPI.create2DFilterableFromRaw = function (width, height, numberOfComponents, dataType, values) {\n var preferSizeOverAccuracy = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n return publicAPI.create2DFilterableFromDataArray(width, height, vtkDataArray.newInstance({\n numberOfComponents: numberOfComponents,\n dataType: dataType,\n values: values\n }), preferSizeOverAccuracy);\n };\n\n publicAPI.create2DFilterableFromDataArray = function (width, height, dataArray) {\n var preferSizeOverAccuracy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n var _processDataArray = processDataArray(dataArray, preferSizeOverAccuracy),\n numComps = _processDataArray.numComps,\n dataType = _processDataArray.dataType,\n data = _processDataArray.data;\n\n publicAPI.create2DFromRaw(width, height, numComps, dataType, data);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.create3DFromRaw = function (width, height, depth, numComps, dataType, data) {\n // Permit OpenGLDataType to be half float, if applicable, for 3D\n publicAPI.getOpenGLDataType(dataType); // Now determine the texture parameters using the arguments.\n\n publicAPI.getInternalFormat(dataType, numComps);\n publicAPI.getFormat(dataType, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_3D;\n model.components = numComps;\n model.width = width;\n model.height = height;\n model.depth = depth;\n model.numberOfDimensions = 3;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Create an array of texture with one texture\n\n var dataArray = [data];\n var is3DArray = true;\n var pixData = updateArrayDataType(dataType, dataArray, is3DArray);\n var scaledData = scaleTextureToHighestPowerOfTwo(pixData); // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1); // openGLDataType\n\n if (useTexStorage(dataType)) {\n model.context.texStorage3D(model.target, 1, model.internalFormat, model.width, model.height, model.depth);\n\n if (scaledData[0] != null) {\n model.context.texSubImage3D(model.target, 0, 0, 0, 0, model.width, model.height, model.depth, model.format, model.openGLDataType, scaledData[0]);\n }\n } else {\n model.context.texImage3D(model.target, 0, model.internalFormat, model.width, model.height, model.depth, 0, model.format, model.openGLDataType, scaledData[0]);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n // This method simulates a 3D texture using 2D\n // Prefer create3DFilterableFromDataArray to enable caching of min and max values\n\n\n publicAPI.create3DFilterableFromRaw = function (width, height, depth, numberOfComponents, dataType, values) {\n var preferSizeOverAccuracy = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n return publicAPI.create3DFilterableFromDataArray(width, height, depth, vtkDataArray.newInstance({\n numberOfComponents: numberOfComponents,\n dataType: dataType,\n values: values\n }), preferSizeOverAccuracy);\n }; //----------------------------------------------------------------------------\n // This method create a 3D texture from dimensions and a DataArray\n\n\n publicAPI.create3DFilterableFromDataArray = function (width, height, depth, dataArray) {\n var preferSizeOverAccuracy = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var _processDataArray2 = processDataArray(dataArray, preferSizeOverAccuracy),\n numComps = _processDataArray2.numComps,\n dataType = _processDataArray2.dataType,\n data = _processDataArray2.data,\n scaleOffsets = _processDataArray2.scaleOffsets;\n\n var numPixelsIn = width * height * depth;\n var offset = [];\n var scale = [];\n\n for (var c = 0; c < numComps; ++c) {\n offset[c] = 0.0;\n scale[c] = 1.0;\n } // store the information, we will need it later\n // offset and scale are the offset and scale required to get\n // the texture value back to data values ala\n // data = texture * scale + offset\n // and texture = (data - offset)/scale\n\n\n model.volumeInfo = {\n scale: scale,\n offset: offset,\n dataComputedScale: scaleOffsets.scale,\n dataComputedOffset: scaleOffsets.offset,\n width: width,\n height: height,\n depth: depth\n }; // Create a copy of scale and offset to avoid aliasing issues\n // Original is read only, copy is read/write\n // Use the copy as volumeInfo.scale and volumeInfo.offset\n\n var scaleOffsetsCopy = structuredClone(scaleOffsets); // WebGL2 path, we have 3d textures etc\n\n if (model._openGLRenderWindow.getWebgl2()) {\n if (model.oglNorm16Ext && !model.useHalfFloat && dataType === VtkDataTypes.SHORT) {\n for (var _c = 0; _c < numComps; ++_c) {\n model.volumeInfo.scale[_c] = 32767.0;\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n }\n\n if (model.oglNorm16Ext && !model.useHalfFloat && dataType === VtkDataTypes.UNSIGNED_SHORT) {\n for (var _c2 = 0; _c2 < numComps; ++_c2) {\n model.volumeInfo.scale[_c2] = 65535.0;\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n }\n\n if (dataType === VtkDataTypes.FLOAT || model.useHalfFloat && (dataType === VtkDataTypes.SHORT || dataType === VtkDataTypes.UNSIGNED_SHORT)) {\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n }\n\n if (dataType === VtkDataTypes.UNSIGNED_CHAR) {\n for (var _c3 = 0; _c3 < numComps; ++_c3) {\n model.volumeInfo.scale[_c3] = 255.0;\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n } // otherwise convert to float\n\n\n var _newArray = new Float32Array(numPixelsIn * numComps); // use computed scale and offset\n\n\n model.volumeInfo.offset = scaleOffsetsCopy.offset;\n model.volumeInfo.scale = scaleOffsetsCopy.scale;\n var count = 0;\n var scaleInverse = scaleOffsetsCopy.scale.map(function (s) {\n return 1 / s;\n });\n\n for (var i = 0; i < numPixelsIn; i++) {\n for (var nc = 0; nc < numComps; nc++) {\n _newArray[count] = (data[count] - scaleOffsetsCopy.offset[nc]) * scaleInverse[nc];\n count++;\n }\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, VtkDataTypes.FLOAT, _newArray);\n } // not webgl2, deal with webgl1, no 3d textures\n // and maybe no float textures\n\n\n var volCopyData = function volCopyData(outArray, outIdx, inValue, smin, smax) {\n outArray[outIdx] = inValue;\n };\n\n var dataTypeToUse = VtkDataTypes.UNSIGNED_CHAR; // unsigned char gets used as is\n\n if (dataType === VtkDataTypes.UNSIGNED_CHAR) {\n for (var _c4 = 0; _c4 < numComps; ++_c4) {\n scaleOffsetsCopy.offset[_c4] = 0.0;\n scaleOffsetsCopy.scale[_c4] = 255.0;\n }\n } else if (model.context.getExtension('OES_texture_float') && model.context.getExtension('OES_texture_float_linear')) {\n // use float textures scaled to 0.0 to 1.0\n dataTypeToUse = VtkDataTypes.FLOAT;\n\n volCopyData = function volCopyData(outArray, outIdx, inValue, soffset, sscale) {\n outArray[outIdx] = (inValue - soffset) / sscale;\n };\n } else {\n // worst case, scale data to uchar\n dataTypeToUse = VtkDataTypes.UNSIGNED_CHAR;\n\n volCopyData = function volCopyData(outArray, outIdx, inValue, soffset, sscale) {\n outArray[outIdx] = 255.0 * (inValue - soffset) / sscale;\n };\n } // Now determine the texture parameters using the arguments.\n\n\n publicAPI.getOpenGLDataType(dataTypeToUse);\n publicAPI.getInternalFormat(dataTypeToUse, numComps);\n publicAPI.getFormat(dataTypeToUse, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n } // have to pack this 3D texture into pot 2D texture\n\n\n model.target = model.context.TEXTURE_2D;\n model.components = numComps;\n model.depth = 1;\n model.numberOfDimensions = 2; // MAX_TEXTURE_SIZE gives the max dimensions that can be supported by the GPU,\n // but it doesn't mean it will fit in memory. If we have to use a float data type\n // or 4 components, there are good chances that the texture size will blow up\n // and could not fit in the GPU memory. Use a smaller texture size in that case,\n // which will force a downsampling of the dataset.\n // That problem does not occur when using webGL2 since we can pack the data in\n // denser textures based on our data type.\n // TODO: try to fit in the biggest supported texture, catch the gl error if it\n // does not fix (OUT_OF_MEMORY), then attempt with smaller texture\n\n var maxTexDim = model.context.getParameter(model.context.MAX_TEXTURE_SIZE);\n\n if (maxTexDim > 4096 && (dataTypeToUse === VtkDataTypes.FLOAT || numComps >= 3)) {\n maxTexDim = 4096;\n } // compute estimate for XY subsample\n\n\n var xstride = 1;\n var ystride = 1;\n\n if (numPixelsIn > maxTexDim * maxTexDim) {\n xstride = Math.ceil(Math.sqrt(numPixelsIn / (maxTexDim * maxTexDim)));\n ystride = xstride;\n }\n\n var targetWidth = Math.sqrt(numPixelsIn) / xstride;\n targetWidth = nearestPowerOfTwo(targetWidth); // determine X reps\n\n var xreps = Math.floor(targetWidth * xstride / width);\n var yreps = Math.ceil(depth / xreps);\n var targetHeight = nearestPowerOfTwo(height * yreps / ystride);\n model.width = targetWidth;\n model.height = targetHeight;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // store the information, we will need it later\n\n model.volumeInfo.xreps = xreps;\n model.volumeInfo.yreps = yreps;\n model.volumeInfo.xstride = xstride;\n model.volumeInfo.ystride = ystride;\n model.volumeInfo.offset = scaleOffsetsCopy.offset;\n model.volumeInfo.scale = scaleOffsetsCopy.scale; // OK stuff the data into the 2d TEXTURE\n // first allocate the new texture\n\n var newArray;\n var pixCount = targetWidth * targetHeight * numComps;\n\n if (dataTypeToUse === VtkDataTypes.FLOAT) {\n newArray = new Float32Array(pixCount);\n } else {\n newArray = new Uint8Array(pixCount);\n } // then stuff the data into it, nothing fancy right now\n // for stride\n\n\n var outIdx = 0;\n var tileWidth = Math.floor(width / xstride);\n var tileHeight = Math.floor(height / ystride);\n\n for (var yRep = 0; yRep < yreps; yRep++) {\n var xrepsThisRow = Math.min(xreps, depth - yRep * xreps);\n var outXContIncr = numComps * (model.width - xrepsThisRow * Math.floor(width / xstride));\n\n for (var tileY = 0; tileY < tileHeight; tileY++) {\n for (var xRep = 0; xRep < xrepsThisRow; xRep++) {\n var inOffset = numComps * ((yRep * xreps + xRep) * width * height + ystride * tileY * width);\n\n for (var tileX = 0; tileX < tileWidth; tileX++) {\n // copy value\n for (var _nc = 0; _nc < numComps; _nc++) {\n volCopyData(newArray, outIdx, data[inOffset + xstride * tileX * numComps + _nc], scaleOffsetsCopy.offset[_nc], scaleOffsetsCopy.scale[_nc]);\n outIdx++;\n }\n }\n }\n\n outIdx += outXContIncr;\n }\n } // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataTypeToUse)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (newArray != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, newArray);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, newArray);\n }\n\n publicAPI.deactivate();\n return true;\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getMaximumTextureSize = function (ctx) {\n if (ctx && ctx.isCurrent()) {\n return ctx.getIntegerv(ctx.MAX_TEXTURE_SIZE);\n }\n\n return -1;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n _openGLRenderWindow: null,\n _forceInternalFormat: false,\n context: null,\n handle: 0,\n sendParametersTime: null,\n textureBuildTime: null,\n numberOfDimensions: 0,\n target: 0,\n format: 0,\n openGLDataType: 0,\n components: 0,\n width: 0,\n height: 0,\n depth: 0,\n autoParameters: true,\n wrapS: Wrap.CLAMP_TO_EDGE,\n wrapT: Wrap.CLAMP_TO_EDGE,\n wrapR: Wrap.CLAMP_TO_EDGE,\n minificationFilter: Filter.NEAREST,\n magnificationFilter: Filter.NEAREST,\n minLOD: -1000.0,\n maxLOD: 1000.0,\n baseLevel: 0,\n maxLevel: 1000,\n generateMipmap: false,\n // use half float by default, but it will get set\n // to false if the context does not support it or\n // the voxel intensity range is out of the accurate\n // range of half float\n useHalfFloat: true,\n oglNorm16Ext: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.sendParametersTime = {};\n obj(model.sendParametersTime, {\n mtime: 0\n });\n model.textureBuildTime = {};\n obj(model.textureBuildTime, {\n mtime: 0\n }); // Build VTK API\n\n set(publicAPI, model, ['format', 'openGLDataType']);\n setGet(publicAPI, model, ['keyMatrixTime', 'minificationFilter', 'magnificationFilter', 'wrapS', 'wrapT', 'wrapR', 'generateMipmap', 'oglNorm16Ext']);\n get(publicAPI, model, ['width', 'height', 'volumeInfo', 'components', 'handle', 'target']);\n moveToProtected(publicAPI, model, ['openGLRenderWindow']); // Object methods\n\n vtkOpenGLTexture(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLTexture'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLTexture$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants); // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkTexture', newInstance);\n\nexport { vtkOpenGLTexture$1 as default, extend, newInstance };\n","import vtkShaderProgram from './ShaderProgram.js';\n\nfunction implementReplaceShaderCoincidentOffset(publicAPI, model) {\n\n publicAPI.replaceShaderCoincidentOffset = function (shaders, ren, actor) {\n var cp = publicAPI.getCoincidentParameters(ren, actor); // if we need an offset handle it here\n // The value of .000016 is suitable for depth buffers\n // of at least 16 bit depth. We do not query the depth\n // right now because we would need some mechanism to\n // cache the result taking into account FBO changes etc.\n\n if (cp && (cp.factor !== 0.0 || cp.offset !== 0.0)) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Coincident::Dec', ['uniform float cfactor;', 'uniform float coffset;']).result;\n\n if (model.context.getExtension('EXT_frag_depth')) {\n if (cp.factor !== 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', ['float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));', '//VTK::UniformFlow::Impl'], false).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepthEXT = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;').result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepthEXT = gl_FragCoord.z + 0.000016*coffset;').result;\n }\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n if (cp.factor !== 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', ['float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));', '//VTK::UniformFlow::Impl'], false).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepth = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;').result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepth = gl_FragCoord.z + 0.000016*coffset;').result;\n }\n }\n\n shaders.Fragment = FSSource;\n }\n };\n}\n\nfunction implementBuildShadersWithReplacements(publicAPI, model) {\n\n publicAPI.applyShaderReplacements = function (shaders, viewSpec, pre) {\n var shaderReplacements = null;\n\n if (viewSpec) {\n shaderReplacements = viewSpec.ShaderReplacements;\n }\n\n if (shaderReplacements) {\n for (var i = 0; i < shaderReplacements.length; i++) {\n var currReplacement = shaderReplacements[i];\n\n if (pre && currReplacement.replaceFirst || !pre && !currReplacement.replaceFirst) {\n var shaderType = currReplacement.shaderType;\n var ssrc = shaders[shaderType];\n var substituteRes = vtkShaderProgram.substitute(ssrc, currReplacement.originalValue, currReplacement.replacementValue, currReplacement.replaceAll);\n shaders[shaderType] = substituteRes.result;\n }\n }\n }\n };\n\n publicAPI.buildShaders = function (shaders, ren, actor) {\n publicAPI.getReplacedShaderTemplate(shaders, ren, actor);\n model.lastRenderPassShaderReplacement = model.currentRenderPass ? model.currentRenderPass.getShaderReplacement() : null; // apply any renderPassReplacements\n\n if (model.lastRenderPassShaderReplacement) {\n model.lastRenderPassShaderReplacement(shaders);\n }\n\n var openGLSpec = model.renderable.getViewSpecificProperties().OpenGL; // user specified pre replacements\n\n publicAPI.applyShaderReplacements(shaders, openGLSpec, true);\n publicAPI.replaceShaderValues(shaders, ren, actor); // user specified post replacements\n\n publicAPI.applyShaderReplacements(shaders, openGLSpec);\n };\n\n publicAPI.getReplacedShaderTemplate = function (shaders, ren, actor) {\n var openGLSpecProp = model.renderable.getViewSpecificProperties().OpenGL;\n publicAPI.getShaderTemplate(shaders, ren, actor);\n var vertexShaderCode = shaders.Vertex;\n\n if (openGLSpecProp) {\n var vertexSpecProp = openGLSpecProp.VertexShaderCode;\n\n if (vertexSpecProp !== undefined && vertexSpecProp !== '') {\n vertexShaderCode = vertexSpecProp;\n }\n }\n\n shaders.Vertex = vertexShaderCode;\n var fragmentShaderCode = shaders.Fragment;\n\n if (openGLSpecProp) {\n var fragmentSpecProp = openGLSpecProp.FragmentShaderCode;\n\n if (fragmentSpecProp !== undefined && fragmentSpecProp !== '') {\n fragmentShaderCode = fragmentSpecProp;\n }\n }\n\n shaders.Fragment = fragmentShaderCode;\n var geometryShaderCode = shaders.Geometry;\n\n if (openGLSpecProp) {\n var geometrySpecProp = openGLSpecProp.GeometryShaderCode;\n\n if (geometrySpecProp !== undefined) {\n geometryShaderCode = geometrySpecProp;\n }\n }\n\n shaders.Geometry = geometryShaderCode;\n };\n}\n\nvar vtkReplacementShaderMapper = {\n implementReplaceShaderCoincidentOffset: implementReplaceShaderCoincidentOffset,\n implementBuildShadersWithReplacements: implementBuildShadersWithReplacements\n};\n\nexport { vtkReplacementShaderMapper as default };\n","var vtkImageResliceMapperVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkImageResliceMapperVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\n// all variables that represent positions or directions have a suffix\\n// indicating the coordinate system they are in. The possible values are\\n// MC - Model coordinates\\n// WC - World coordinates\\n// VC - View coordinates\\n// DC - Display coordinates\\n// TC - Texture coordinates\\n\\n// frag position in VC\\n//VTK::PositionVC::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\nvoid main()\\n{\\n //VTK::PositionVC::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Picking::Impl\\n}\\n\";\n\nexport { vtkImageResliceMapperVS as v };\n","var vtkImageResliceMapperFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkImageResliceMapperFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// Template for the gpu image mapper fragment shader\\n\\n// VC position of this fragment\\n//VTK::PositionVC::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// handle coincident offsets\\n//VTK::Coincident::Dec\\n\\n//VTK::ZBuffer::Dec\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\nvoid main()\\n{\\n // VC position of this fragment. This should not branch/return/discard.\\n //VTK::PositionVC::Impl\\n\\n // Place any calls that require uniform flow (e.g. dFdx) here.\\n //VTK::UniformFlow::Impl\\n\\n // Set gl_FragDepth here (gl_FragCoord.z by default)\\n //VTK::Depth::Impl\\n\\n // Early depth peeling abort:\\n //VTK::DepthPeeling::PreColor\\n\\n //VTK::TCoord::Impl\\n\\n if (gl_FragData[0].a <= 0.0)\\n {\\n discard;\\n }\\n\\n //VTK::DepthPeeling::Impl\\n\\n //VTK::Picking::Impl\\n\\n // handle coincident offsets\\n //VTK::Coincident::Impl\\n\\n //VTK::ZBuffer::Impl\\n\\n //VTK::RenderPassFragmentShader::Impl\\n}\\n\";\n\nexport { vtkImageResliceMapperFS as v };\n","var InterpolationType = {\n NEAREST: 0,\n LINEAR: 1\n};\nvar InterpolationType$1 = {\n InterpolationType: InterpolationType\n};\n\nexport { InterpolationType, InterpolationType$1 as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport { newInstance as newInstance$1, obj, get, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport { mat4, vec3 } from 'gl-matrix';\nimport vtkClosedPolyLineToSurfaceFilter from '../../Filters/General/ClosedPolyLineToSurfaceFilter.js';\nimport vtkCubeSource from '../../Filters/Sources/CubeSource.js';\nimport vtkCutter from '../../Filters/Core/Cutter.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkHelper from './Helper.js';\nimport { f as vtkMath } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkPlane from '../../Common/DataModel/Plane.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { v as vtkImageResliceMapperVS } from './glsl/vtkImageResliceMapperVS.glsl.js';\nimport { v as vtkImageResliceMapperFS } from './glsl/vtkImageResliceMapperFS.glsl.js';\nimport InterpolationType from '../Core/ImageProperty/Constants.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport { Filter } from './Texture/Constants.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// helper methods\n// ----------------------------------------------------------------------------\n\nfunction computeFnToString(property, fn, numberOfComponents) {\n var pwfun = fn.apply(property);\n\n if (pwfun) {\n var iComps = property.getIndependentComponents();\n return \"\".concat(property.getMTime(), \"-\").concat(iComps, \"-\").concat(numberOfComponents);\n }\n\n return '0';\n}\n\nfunction safeMatrixMultiply(matrixArray, matrixType, tmpMat) {\n matrixType.identity(tmpMat);\n return matrixArray.reduce(function (res, matrix, index) {\n if (index === 0) {\n return matrix ? matrixType.copy(res, matrix) : matrixType.identity(res);\n }\n\n return matrix ? matrixType.multiply(res, res, matrix) : res;\n }, tmpMat);\n} // ----------------------------------------------------------------------------\n// vtkOpenGLImageResliceMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLImageResliceMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLImageResliceMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.currentRenderPass = null;\n model._openGLImageSlice = publicAPI.getFirstAncestorOfType('vtkOpenGLImageSlice');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n\n var ren = model._openGLRenderer.getRenderable();\n\n model._openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera());\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n\n if (!model.openGLTexture) {\n model.openGLTexture = vtkOpenGLTexture.newInstance();\n }\n\n model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.pwfTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n };\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.currentRenderPass = renderPass;\n publicAPI.render();\n }\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n model.haveSeenDepthRequest = true;\n model.renderDepth = true;\n publicAPI.render();\n model.renderDepth = false;\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.getCoincidentParameters = function (ren, actor) {\n if (model.renderable.getResolveCoincidentTopology()) {\n return model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n }\n\n return null;\n }; // Renders myself\n\n\n publicAPI.render = function () {\n var actor = model._openGLImageSlice.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent({\n type: 'StartEvent'\n });\n model.renderable.update();\n model.currentInput = model.renderable.getInputData();\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n }\n\n publicAPI.updateResliceGeometry();\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n publicAPI.invokeEvent({\n type: 'EndEvent'\n });\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n // make sure the BOs are up to date\n publicAPI.updateBufferObjects(ren, actor);\n var iType = actor.getProperty().getInterpolationType();\n\n if (iType === InterpolationType.NEAREST) {\n model.openGLTexture.setMinificationFilter(Filter.NEAREST);\n model.openGLTexture.setMagnificationFilter(Filter.NEAREST);\n model.colorTexture.setMinificationFilter(Filter.NEAREST);\n model.colorTexture.setMagnificationFilter(Filter.NEAREST);\n model.pwfTexture.setMinificationFilter(Filter.NEAREST);\n model.pwfTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n model.openGLTexture.setMinificationFilter(Filter.LINEAR);\n model.openGLTexture.setMagnificationFilter(Filter.LINEAR);\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n model.pwfTexture.setMinificationFilter(Filter.LINEAR);\n model.pwfTexture.setMagnificationFilter(Filter.LINEAR);\n } // No buffer objects bound.\n\n\n model.lastBoundBO = null;\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var gl = model.context; // render the texture\n\n model.openGLTexture.activate();\n model.colorTexture.activate();\n model.pwfTexture.activate(); // update shaders if required\n\n publicAPI.updateShaders(model.tris, ren, actor); // Finally draw\n\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n model.openGLTexture.deactivate();\n model.colorTexture.deactivate();\n model.pwfTexture.deactivate();\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {};\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffer objects if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n return model.VBOBuildTime.getMTime() < publicAPI.getMTime() || model.VBOBuildTime.getMTime() < actor.getMTime() || model.VBOBuildTime.getMTime() < model.renderable.getMTime() || model.VBOBuildTime.getMTime() < actor.getProperty().getMTime() || model.VBOBuildTime.getMTime() < model.currentInput.getMTime() || model.VBOBuildTime.getMTime() < model.resliceGeom.getMTime();\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var _image$getPointData;\n\n var image = model.currentInput;\n\n if (!image) {\n return;\n }\n\n var scalars = (_image$getPointData = image.getPointData()) === null || _image$getPointData === void 0 ? void 0 : _image$getPointData.getScalars();\n\n if (!scalars) {\n return;\n }\n\n var numComp = scalars.getNumberOfComponents();\n\n if (!model._externalOpenGLTexture) {\n var _toString = \"\".concat(image.getMTime(), \"A\").concat(scalars.getMTime());\n\n if (model.openGLTextureString !== _toString) {\n // Build the image scalar texture\n var dims = image.getDimensions(); // Use norm16 for the 3D texture if the extension is available\n\n model.openGLTexture.getOglNorm16Ext(model.context.getExtension('EXT_texture_norm16'));\n model.openGLTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.openGLTexture.resetFormatAndType();\n model.openGLTexture.create3DFilterableFromDataArray(dims[0], dims[1], dims[2], scalars);\n model.openGLTextureString = _toString;\n }\n }\n\n var ppty = actor.getProperty();\n var iComps = ppty.getIndependentComponents();\n var numIComps = iComps ? numComp : 1;\n var textureHeight = iComps ? 2 * numIComps : 1;\n var cfunToString = computeFnToString(ppty, ppty.getRGBTransferFunction, numIComps);\n\n if (model.colorTextureString !== cfunToString) {\n var cWidth = 1024;\n var cSize = cWidth * textureHeight * 3;\n var cTable = new Uint8Array(cSize);\n var cfun = ppty.getRGBTransferFunction();\n\n if (cfun) {\n var tmpTable = new Float32Array(cWidth * 3);\n\n for (var c = 0; c < numIComps; c++) {\n cfun = ppty.getRGBTransferFunction(c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, tmpTable, 1);\n\n if (iComps) {\n for (var i = 0; i < cWidth * 3; i++) {\n cTable[c * cWidth * 6 + i] = 255.0 * tmpTable[i];\n cTable[c * cWidth * 6 + i + cWidth * 3] = 255.0 * tmpTable[i];\n }\n } else {\n for (var _i = 0; _i < cWidth * 3; _i++) {\n cTable[c * cWidth * 6 + _i] = 255.0 * tmpTable[_i];\n }\n }\n }\n\n model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.colorTexture.resetFormatAndType();\n model.colorTexture.create2DFromRaw(cWidth, textureHeight, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n } else {\n for (var _i2 = 0; _i2 < cWidth * 3; ++_i2) {\n cTable[_i2] = 255.0 * _i2 / ((cWidth - 1) * 3);\n cTable[_i2 + 1] = 255.0 * _i2 / ((cWidth - 1) * 3);\n cTable[_i2 + 2] = 255.0 * _i2 / ((cWidth - 1) * 3);\n }\n\n model.colorTexture.create2DFromRaw(cWidth, 1, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n }\n\n model.colorTextureString = cfunToString;\n } // Build piecewise function buffer. This buffer is used either\n // for component weighting or opacity, depending on whether we're\n // rendering components independently or not.\n\n\n var pwfunToString = computeFnToString(ppty, ppty.getPiecewiseFunction, numIComps);\n\n if (model.pwfTextureString !== pwfunToString) {\n var pwfWidth = 1024;\n var pwfSize = pwfWidth * textureHeight;\n var pwfTable = new Uint8Array(pwfSize);\n var pwfun = ppty.getPiecewiseFunction(); // support case where pwfun is added/removed\n\n model.pwfTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.pwfTexture.resetFormatAndType();\n\n if (pwfun) {\n var pwfFloatTable = new Float32Array(pwfSize);\n\n var _tmpTable = new Float32Array(pwfWidth);\n\n for (var _c = 0; _c < numIComps; ++_c) {\n pwfun = ppty.getPiecewiseFunction(_c);\n\n if (pwfun === null) {\n // Piecewise constant max if no function supplied for this component\n pwfFloatTable.fill(1.0);\n } else {\n var pwfRange = pwfun.getRange();\n pwfun.getTable(pwfRange[0], pwfRange[1], pwfWidth, _tmpTable, 1); // adjust for sample distance etc\n\n if (iComps) {\n for (var _i3 = 0; _i3 < pwfWidth; _i3++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i3] = _tmpTable[_i3];\n pwfFloatTable[_c * pwfWidth * 2 + _i3 + pwfWidth] = _tmpTable[_i3];\n }\n } else {\n for (var _i4 = 0; _i4 < pwfWidth; _i4++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i4] = _tmpTable[_i4];\n }\n }\n }\n }\n\n model.pwfTexture.create2DFromRaw(pwfWidth, textureHeight, 1, VtkDataTypes.FLOAT, pwfFloatTable);\n } else {\n // default is opaque\n pwfTable.fill(255.0);\n model.pwfTexture.create2DFromRaw(pwfWidth, 1, 1, VtkDataTypes.UNSIGNED_CHAR, pwfTable);\n }\n\n model.pwfTextureString = pwfunToString;\n }\n\n var vboString = \"\".concat(model.resliceGeom.getMTime(), \"A\").concat(model.renderable.getSlabThickness());\n\n if (!model.tris.getCABO().getElementCount() || model.VBOBuildString !== vboString) {\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: model.resliceGeom.getPoints().getData()\n });\n points.setName('points');\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: model.resliceGeom.getPolys().getData()\n });\n var options = {\n points: points,\n cellOffset: 0\n };\n\n if (model.renderable.getSlabThickness() > 0.0) {\n var n = model.resliceGeom.getPointData().getNormals();\n\n if (!n) {\n vtkErrorMacro('Slab mode requested without normals');\n } else {\n options.normals = n;\n }\n }\n\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, options);\n }\n\n model.VBOBuildString = vboString;\n model.VBOBuildTime.modified();\n };\n\n publicAPI.updateShaders = function (cellBO, ren, actor) {\n model.lastBoundBO = cellBO; // has something changed that would require us to recreate the shader?\n\n if (publicAPI.getNeedToRebuildShaders(cellBO, ren, actor)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n publicAPI.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n\n if (newShader !== cellBO.getProgram()) {\n cellBO.setProgram(newShader); // reset the VAO as the shader has changed\n\n cellBO.getVAO().releaseGraphicsResources();\n }\n\n cellBO.getShaderSourceTime().modified();\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(cellBO.getProgram());\n }\n\n cellBO.getVAO().bind();\n publicAPI.setMapperShaderParameters(cellBO, ren, actor);\n publicAPI.setCameraShaderParameters(cellBO, ren, actor);\n publicAPI.setPropertyShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n // Set the 3D texture\n if (program.isUniformUsed('texture1')) {\n program.setUniformi('texture1', model.openGLTexture.getTextureUnit());\n } // Set the plane vertex attributes\n\n\n if (program.isAttributeUsed('vertexWC')) {\n if (!cellBO.getVAO().addAttributeArray(program, cellBO.getCABO(), 'vertexWC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexWC in shader VAO.');\n }\n } // If we are doing slab mode, we need normals\n\n\n if (program.isAttributeUsed('normalWC')) {\n if (!cellBO.getVAO().addAttributeArray(program, cellBO.getCABO(), 'normalWC', cellBO.getCABO().getNormalOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting normalWC in shader VAO.');\n }\n }\n\n if (program.isUniformUsed('slabThickness')) {\n program.setUniformf('slabThickness', model.renderable.getSlabThickness());\n }\n\n if (program.isUniformUsed('spacing')) {\n program.setUniform3fv('spacing', model.currentInput.getSpacing());\n }\n\n if (program.isUniformUsed('slabType')) {\n program.setUniformi('slabType', model.renderable.getSlabType());\n }\n\n if (program.isUniformUsed('slabType')) {\n program.setUniformi('slabType', model.renderable.getSlabType());\n }\n\n if (program.isUniformUsed('slabTrapezoid')) {\n program.setUniformi('slabTrapezoid', model.renderable.getSlabTrapezoidIntegration());\n }\n\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null; // Set the world->texture matrix\n\n if (program.isUniformUsed('WCTCMatrix')) {\n var image = model.currentInput;\n mat4.identity(model.tmpMat4);\n var bounds = image.getBounds();\n var sc = [bounds[1] - bounds[0], bounds[3] - bounds[2], bounds[5] - bounds[4]];\n var o = [bounds[0], bounds[2], bounds[4]];\n var q = [0, 0, 0, 1];\n mat4.fromRotationTranslationScale(model.tmpMat4, q, o, sc);\n mat4.invert(model.tmpMat4, model.tmpMat4);\n\n if (inverseShiftScaleMatrix) {\n mat4.multiply(model.tmpMat4, model.tmpMat4, inverseShiftScaleMatrix);\n }\n\n program.setUniformMatrix('WCTCMatrix', model.tmpMat4);\n }\n\n cellBO.getAttributeUpdateTime().modified();\n } // Depth request\n\n\n if (model.haveSeenDepthRequest) {\n cellBO.getProgram().setUniformi('depthRequest', model.renderDepth ? 1 : 0);\n } // handle coincident\n\n\n if (cellBO.getProgram().isUniformUsed('coffset')) {\n var cp = publicAPI.getCoincidentParameters(ren, actor);\n cellBO.getProgram().setUniformf('coffset', cp.offset); // cfactor isn't always used when coffset is.\n\n if (cellBO.getProgram().isUniformUsed('cfactor')) {\n cellBO.getProgram().setUniformf('cfactor', cp.factor);\n }\n }\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n // [WMVP]C == {world, model, view, projection} coordinates\n // e.g. WCPC == world to projection coordinate transformation\n var keyMats = model._openGLCamera.getKeyMatrices(ren);\n\n var actMats = model._openGLImageSlice.getKeyMatrices();\n\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var program = cellBO.getProgram();\n\n if (program.isUniformUsed('MCPCMatrix')) {\n mat4.identity(model.tmpMat4);\n program.setUniformMatrix('MCPCMatrix', safeMatrixMultiply([keyMats.wcpc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n\n if (program.isUniformUsed('MCVCMatrix')) {\n mat4.identity(model.tmpMat4);\n program.setUniformMatrix('MCVCMatrix', safeMatrixMultiply([keyMats.wcvc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n program.setUniformf('opacity', opacity); // Component mix\n // Independent components: Mixed according to component weights\n // Dependent components: Mixed using the following logic:\n // - 2 comps => LA\n // - 3 comps => RGB + opacity from pwf\n // - 4 comps => RGBA\n\n var numComp = model.openGLTexture.getComponents();\n var iComps = ppty.getIndependentComponents();\n\n if (iComps) {\n for (var i = 0; i < numComp; ++i) {\n program.setUniformf(\"mix\".concat(i), ppty.getComponentWeight(i));\n }\n } // Color opacity map\n\n\n var volInfo = model.openGLTexture.getVolumeInfo(); // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n for (var _i5 = 0; _i5 < numComp; _i5++) {\n var cw = ppty.getColorWindow();\n var cl = ppty.getColorLevel();\n var target = iComps ? _i5 : 0;\n var cfun = ppty.getRGBTransferFunction(target);\n\n if (cfun && ppty.getUseLookupTableScalarRange()) {\n var cRange = cfun.getRange();\n cw = cRange[1] - cRange[0];\n cl = 0.5 * (cRange[1] + cRange[0]);\n }\n\n var scale = volInfo.scale[_i5] / cw;\n var shift = (volInfo.offset[_i5] - cl) / cw + 0.5;\n program.setUniformf(\"cshift\".concat(_i5), shift);\n program.setUniformf(\"cscale\".concat(_i5), scale);\n }\n\n var texColorUnit = model.colorTexture.getTextureUnit();\n program.setUniformi('colorTexture1', texColorUnit); // pwf shift/scale\n\n for (var _i6 = 0; _i6 < numComp; _i6++) {\n var pwfScale = 1.0;\n var pwfShift = 0.0;\n\n var _target = iComps ? _i6 : 0;\n\n var pwfun = ppty.getPiecewiseFunction(_target);\n\n if (pwfun) {\n var pwfRange = pwfun.getRange();\n var length = pwfRange[1] - pwfRange[0];\n var mid = 0.5 * (pwfRange[0] + pwfRange[1]);\n pwfScale = volInfo.scale[_i6] / length;\n pwfShift = (volInfo.offset[_i6] - mid) / length + 0.5;\n }\n\n program.setUniformf(\"pwfshift\".concat(_i6), pwfShift);\n program.setUniformf(\"pwfscale\".concat(_i6), pwfScale);\n }\n\n var texOpacityUnit = model.pwfTexture.getTextureUnit();\n program.setUniformi('pwfTexture1', texOpacityUnit); // Background color\n\n program.setUniform4fv('backgroundColor', model.renderable.getBackgroundColor());\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n // render pass shader replacement changed\n var tNumComp = model.openGLTexture.getComponents();\n var iComp = actor.getProperty().getIndependentComponents();\n var slabTh = model.renderable.getSlabThickness();\n var slabType = model.renderable.getSlabType();\n var slabTrap = model.renderable.getSlabTrapezoidIntegration(); // has the render pass shader replacement changed? Two options\n\n var needRebuild = false;\n\n if (!model.currentRenderPass && model.lastRenderPassShaderReplacement || model.currentRenderPass && model.currentRenderPass.getShaderReplacement() !== model.lastRenderPassShaderReplacement) {\n needRebuild = true;\n }\n\n if (needRebuild || model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || cellBO.getProgram() === 0 || model.lastTextureComponents !== tNumComp || model.lastIndependentComponents !== iComp || model.lastSlabThickness !== slabTh || model.lastSlabType !== slabType || model.lastSlabTrapezoidIntegration !== slabTrap) {\n model.lastHaveSeenDepthRequest = model.haveSeenDepthRequest;\n model.lastTextureComponents = tNumComp;\n model.lastIndependentComponents = iComp;\n model.lastSlabThickness = slabTh;\n model.lastSlabType = slabType;\n model.lastSlabTrapezoidIntegration = slabTrap;\n return true;\n }\n\n return false;\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkImageResliceMapperVS;\n shaders.Fragment = vtkImageResliceMapperFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n publicAPI.replaceShaderTCoord(shaders, ren, actor);\n publicAPI.replaceShaderPositionVC(shaders, ren, actor);\n\n if (model.haveSeenDepthRequest) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', 'uniform int depthRequest;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float iz = floor(gl_FragCoord.z*65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n shaders.Fragment = FSSource;\n }\n\n publicAPI.replaceShaderCoincidentOffset(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderTCoord = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var tcoordVSDec = ['uniform mat4 WCTCMatrix;', 'out vec3 fragTexCoord;'];\n var slabThickness = model.renderable.getSlabThickness();\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', tcoordVSDec).result;\n var tcoordVSImpl = ['fragTexCoord = (WCTCMatrix * vertexWC).xyz;'];\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', tcoordVSImpl).result;\n var tNumComp = model.openGLTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n var tcoordFSDec = ['in vec3 fragTexCoord;', 'uniform highp sampler3D texture1;', 'uniform mat4 WCTCMatrix;', // color shift and scale\n 'uniform float cshift0;', 'uniform float cscale0;', // pwf shift and scale\n 'uniform float pwfshift0;', 'uniform float pwfscale0;', // color and pwf textures\n 'uniform sampler2D colorTexture1;', 'uniform sampler2D pwfTexture1;', // opacity\n 'uniform float opacity;', // background color\n 'uniform vec4 backgroundColor;'];\n\n if (iComps) {\n for (var comp = 1; comp < tNumComp; comp++) {\n tcoordFSDec = tcoordFSDec.concat([// color shift and scale\n \"uniform float cshift\".concat(comp, \";\"), \"uniform float cscale\".concat(comp, \";\"), // weighting shift and scale\n \"uniform float pwfshift\".concat(comp, \";\"), \"uniform float pwfscale\".concat(comp, \";\")]);\n } // the heights defined below are the locations\n // for the up to four components of the tfuns\n // the tfuns have a height of 2XnumComps pixels so the\n // values are computed to hit the middle of the two rows\n // for that component\n\n\n switch (tNumComp) {\n case 1:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', '#define height0 0.5']);\n break;\n\n case 2:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', 'uniform float mix1;', '#define height0 0.25', '#define height1 0.75']);\n break;\n\n case 3:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', '#define height0 0.17', '#define height1 0.5', '#define height2 0.83']);\n break;\n\n case 4:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', 'uniform float mix3;', '#define height0 0.125', '#define height1 0.375', '#define height2 0.625', '#define height3 0.875']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n }\n\n if (slabThickness > 0.0) {\n tcoordFSDec = tcoordFSDec.concat(['uniform vec3 spacing;', 'uniform float slabThickness;', 'uniform int slabType;', 'uniform int slabTrapezoid;']);\n tcoordFSDec = tcoordFSDec.concat(['vec4 compositeValue(vec4 currVal, vec4 valToComp, int trapezoid)', '{', ' vec4 retVal = vec4(1.0);', ' if (slabType == 0) // min', ' {', ' retVal = min(currVal, valToComp);', ' }', ' else if (slabType == 1) // max', ' {', ' retVal = max(currVal, valToComp);', ' }', ' else if (slabType == 3) // sum', ' {', ' retVal = currVal + (trapezoid > 0 ? 0.5 * valToComp : valToComp); ', ' }', ' else // mean', ' {', ' retVal = currVal + (trapezoid > 0 ? 0.5 * valToComp : valToComp); ', ' }', ' return retVal;', '}']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', tcoordFSDec).result;\n var tcoordFSImpl = ['if (any(greaterThan(fragTexCoord, vec3(1.0))) || any(lessThan(fragTexCoord, vec3(0.0))))', '{', ' // set the background color and exit', ' gl_FragData[0] = backgroundColor;', ' return;', '}', 'vec4 tvalue = texture(texture1, fragTexCoord);'];\n\n if (slabThickness > 0.0) {\n tcoordFSImpl = tcoordFSImpl.concat(['// Get the first and last samples', 'int numSlices = 1;', 'vec3 normalxspacing = normalWCVSOutput * spacing * 0.5;', 'float distTraveled = length(normalxspacing);', 'int trapezoid = 0;', 'while (distTraveled < slabThickness * 0.5)', '{', ' distTraveled += length(normalxspacing);', ' float fnumSlices = float(numSlices);', ' if (distTraveled > slabThickness * 0.5)', ' {', ' // Before stepping outside the slab, sample at the boundaries', ' normalxspacing = normalWCVSOutput * slabThickness * 0.5 / fnumSlices;', ' trapezoid = slabTrapezoid;', ' }', ' vec3 fragTCoordNeg = (WCTCMatrix * vec4(vertexWCVSOutput.xyz - fnumSlices * normalxspacing, 1.0)).xyz;', ' if (!any(greaterThan(fragTCoordNeg, vec3(1.0))) && !any(lessThan(fragTCoordNeg, vec3(0.0))))', ' {', ' vec4 newVal = texture(texture1, fragTCoordNeg);', ' tvalue = compositeValue(tvalue, newVal, trapezoid);', ' numSlices += 1;', ' }', ' vec3 fragTCoordPos = (WCTCMatrix * vec4(vertexWCVSOutput.xyz + fnumSlices * normalxspacing, 1.0)).xyz;', ' if (!any(greaterThan(fragTCoordNeg, vec3(1.0))) && !any(lessThan(fragTCoordNeg, vec3(0.0))))', ' {', ' vec4 newVal = texture(texture1, fragTCoordPos);', ' tvalue = compositeValue(tvalue, newVal, trapezoid);', ' numSlices += 1;', ' }', '}', '// Finally, if slab type is *mean*, divide the sum by the numSlices', 'if (slabType == 2)', '{', ' tvalue = tvalue / float(numSlices);', '}']);\n }\n\n if (iComps) {\n var rgba = ['r', 'g', 'b', 'a'];\n\n for (var _comp = 0; _comp < tNumComp; ++_comp) {\n tcoordFSImpl = tcoordFSImpl.concat([\"vec3 tcolor\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(colorTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * cscale\").concat(_comp, \" + cshift\").concat(_comp, \", height\").concat(_comp, \")).rgb;\"), \"float compWeight\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(pwfTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * pwfscale\").concat(_comp, \" + pwfshift\").concat(_comp, \", height\").concat(_comp, \")).r;\")]);\n }\n\n switch (tNumComp) {\n case 1:\n tcoordFSImpl = tcoordFSImpl.concat(['gl_FragData[0] = vec4(tcolor0.rgb, compWeight0 * opacity);']);\n break;\n\n case 2:\n tcoordFSImpl = tcoordFSImpl.concat(['float weightSum = compWeight0 + compWeight1;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum))), opacity);']);\n break;\n\n case 3:\n tcoordFSImpl = tcoordFSImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum))), opacity);']);\n break;\n\n case 4:\n tcoordFSImpl = tcoordFSImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2 + compWeight3;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum)) + (tcolor3.rgb * (compWeight3 / weightSum))), opacity);']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n } else {\n // dependent components\n switch (tNumComp) {\n case 1:\n tcoordFSImpl = tcoordFSImpl.concat(['// Dependent components', 'float intensity = tvalue.r;', 'vec3 tcolor = texture2D(colorTexture1, vec2(intensity * cscale0 + cshift0, 0.5)).rgb;', 'float scalarOpacity = texture2D(pwfTexture1, vec2(intensity * pwfscale0 + pwfshift0, 0.5)).r;', 'gl_FragData[0] = vec4(tcolor, scalarOpacity * opacity);']);\n break;\n\n case 2:\n tcoordFSImpl = tcoordFSImpl.concat(['float intensity = tvalue.r*cscale0 + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(intensity, 0.5)).rgb, pwfscale0*tvalue.g + pwfshift0);']);\n break;\n\n case 3:\n tcoordFSImpl = tcoordFSImpl.concat(['vec4 tcolor = cscale0*tvalue + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, opacity);']);\n break;\n\n default:\n tcoordFSImpl = tcoordFSImpl.concat(['vec4 tcolor = cscale0*tvalue + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, tcolor.a);']);\n }\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', tcoordFSImpl).result;\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n shaders.Geometry = GSSource;\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var slabThickness = model.renderable.getSlabThickness();\n var posVCVSDec = ['attribute vec4 vertexWC;']; // Add a unique hash to the shader to ensure that the shader program is unique to this mapper.\n\n posVCVSDec = posVCVSDec.concat([\"//\".concat(publicAPI.getMTime()).concat(model.resliceGeomUpdateString)]);\n\n if (slabThickness > 0.0) {\n posVCVSDec = posVCVSDec.concat(['attribute vec3 normalWC;', 'varying vec3 normalWCVSOutput;', 'varying vec4 vertexWCVSOutput;']);\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', posVCVSDec).result;\n var posVCVSImpl = ['gl_Position = MCPCMatrix * vertexWC;'];\n\n if (slabThickness > 0.0) {\n posVCVSImpl = posVCVSImpl.concat(['normalWCVSOutput = normalWC;', 'vertexWCVSOutput = vertexWC;']);\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', posVCVSImpl).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;', 'uniform mat4 MCVCMatrix;']).result;\n var posVCFSDec = [];\n\n if (slabThickness > 0.0) {\n posVCFSDec = posVCFSDec.concat(['varying vec3 normalWCVSOutput;', 'varying vec4 vertexWCVSOutput;']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', posVCFSDec).result;\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n function isVectorAxisAligned(n) {\n vtkMath.normalize(n);\n var tmpN = [0, 0, 0];\n\n for (var i = 0; i < 3; ++i) {\n vec3.zero(tmpN);\n tmpN[i] = 1.0;\n var dotP = vtkMath.dot(n, tmpN);\n\n if (dotP < -0.999 || dotP > 0.999) {\n return [true, i];\n }\n }\n\n return [false, 2];\n }\n\n publicAPI.updateResliceGeometry = function () {\n var resGeomString = '';\n var image = model.currentInput;\n var imageBounds = image === null || image === void 0 ? void 0 : image.getBounds(); // Orthogonal slicing by default\n\n var orthoSlicing = true;\n var orthoAxis = 2;\n\n if (model.renderable.getSlicePolyData()) {\n resGeomString = resGeomString.concat(\"PolyData\".concat(model.renderable.getSlicePolyData().getMTime()));\n } else if (model.renderable.getSlicePlane()) {\n resGeomString = resGeomString.concat(\"Plane\".concat(model.renderable.getSlicePlane().getMTime()));\n\n if (image) {\n resGeomString = resGeomString.concat(\"Image\".concat(image.getMTime()));\n } // Check to see if we can bypass oblique slicing related bounds computation\n\n\n var _isVectorAxisAligned = isVectorAxisAligned(model.renderable.getSlicePlane().getNormal());\n\n var _isVectorAxisAligned2 = _slicedToArray(_isVectorAxisAligned, 2);\n\n orthoSlicing = _isVectorAxisAligned2[0];\n orthoAxis = _isVectorAxisAligned2[1];\n } else {\n var _model$renderable$get;\n\n // Create a default slice plane here\n var plane = vtkPlane.newInstance();\n plane.setNormal(0, 0, 1);\n var bds = [0, 1, 0, 1, 0, 1];\n\n if (image) {\n bds = imageBounds;\n }\n\n plane.setOrigin(bds[0], bds[2], 0.5 * (bds[5] + bds[4]));\n model.renderable.setSlicePlane(plane);\n resGeomString = resGeomString.concat(\"Plane\".concat((_model$renderable$get = model.renderable.getSlicePlane()) === null || _model$renderable$get === void 0 ? void 0 : _model$renderable$get.getMTime()));\n\n if (image) {\n resGeomString = resGeomString.concat(\"Image\".concat(image.getMTime()));\n }\n }\n\n if (!model.resliceGeom || model.resliceGeomUpdateString !== resGeomString) {\n if (model.renderable.getSlicePolyData()) {\n model.resliceGeom = model.renderable.getSlicePolyData();\n } else if (model.renderable.getSlicePlane()) {\n var bounds = image ? imageBounds : [0, 1, 0, 1, 0, 1];\n\n if (!orthoSlicing) {\n var cube = vtkCubeSource.newInstance();\n cube.setCenter(0.5 * (bounds[0] + bounds[1]), 0.5 * (bounds[2] + bounds[3]), 0.5 * (bounds[4] + bounds[5]));\n cube.setXLength(bounds[1] - bounds[0]);\n cube.setYLength(bounds[3] - bounds[2]);\n cube.setZLength(bounds[5] - bounds[4]);\n var cutter = vtkCutter.newInstance();\n cutter.setInputConnection(cube.getOutputPort());\n cutter.setCutFunction(model.renderable.getSlicePlane());\n var pds = vtkClosedPolyLineToSurfaceFilter.newInstance();\n pds.setInputConnection(cutter.getOutputPort());\n pds.update();\n model.resliceGeom = pds.getOutputData(); // The above method does not generate point normals\n // Set it manually here.\n\n var n = model.renderable.getSlicePlane().getNormal();\n var npts = model.resliceGeom.getNumberOfPoints();\n vtkMath.normalize(n);\n var normalsData = new Float32Array(npts * 3);\n\n for (var i = 0; i < npts; ++i) {\n normalsData[3 * i] = n[0];\n normalsData[3 * i + 1] = n[1];\n normalsData[3 * i + 2] = n[2];\n }\n\n var normals = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: normalsData,\n name: 'Normals'\n });\n model.resliceGeom.getPointData().setNormals(normals);\n } else {\n var ptsArray = new Float32Array(12);\n var o = model.renderable.getSlicePlane().getOrigin();\n var otherAxes = [(orthoAxis + 1) % 3, (orthoAxis + 2) % 3].sort();\n var ptIdx = 0;\n\n for (var _i7 = 0; _i7 < 2; ++_i7) {\n for (var j = 0; j < 2; ++j) {\n ptsArray[ptIdx + orthoAxis] = o[orthoAxis];\n ptsArray[ptIdx + otherAxes[0]] = bounds[2 * otherAxes[0] + j];\n ptsArray[ptIdx + otherAxes[1]] = bounds[2 * otherAxes[1] + _i7];\n ptIdx += 3;\n }\n }\n\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n\n var _n = model.renderable.getSlicePlane().getNormal();\n\n vtkMath.normalize(_n);\n\n var _normalsData = new Float32Array(12);\n\n for (var _i8 = 0; _i8 < 4; ++_i8) {\n _normalsData[3 * _i8] = _n[0];\n _normalsData[3 * _i8 + 1] = _n[1];\n _normalsData[3 * _i8 + 2] = _n[2];\n }\n\n if (!model.resliceGeom) {\n model.resliceGeom = vtkPolyData.newInstance();\n }\n\n model.resliceGeom.getPoints().setData(ptsArray, 3);\n model.resliceGeom.getPolys().setData(cellArray, 1);\n\n var _normals = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: _normalsData,\n name: 'Normals'\n });\n\n model.resliceGeom.getPointData().setNormals(_normals);\n model.resliceGeom.modified();\n }\n } else {\n vtkErrorMacro('Something went wrong.', 'A default slice plane should have been created in the beginning of', 'updateResliceGeometry.');\n }\n\n model.resliceGeomUpdateString = resGeomString;\n }\n };\n\n publicAPI.setOpenGLTexture = function (oglTex) {\n if (oglTex) {\n model.openGLTexture = oglTex;\n model._externalOpenGLTexture = true;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n VBOBuildTime: {},\n VBOBuildString: null,\n haveSeenDepthRequest: false,\n lastHaveSeenDepthRequest: false,\n lastIndependentComponents: false,\n lastTextureComponents: 0,\n lastSlabThickness: 0,\n lastSlabTrapezoidIntegration: 0,\n lastSlabType: -1,\n openGLTexture: null,\n openGLTextureString: null,\n colorTextureString: null,\n pwfTextureString: null,\n resliceGeom: null,\n resliceGeomUpdateString: null,\n tris: null,\n colorTexture: null,\n pwfTexture: null,\n _externalOpenGLTexture: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.tris = vtkHelper.newInstance();\n model.openGLTexture = vtkOpenGLTexture.newInstance();\n model.colorTexture = vtkOpenGLTexture.newInstance();\n model.pwfTexture = vtkOpenGLTexture.newInstance();\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime); // model.modelToView = mat4.identity(new Float64Array(16));\n\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n get(publicAPI, model, ['openGLTexture']); // Object methods\n\n vtkOpenGLImageResliceMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLImageResliceMapper'); // ----------------------------------------------------------------------------\n\nvar vtkImageResliceMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkImageResliceMapper', newInstance);\n\nexport { vtkImageResliceMapper as default, extend, newInstance };\n","var SlicingMode = {\n NONE: -1,\n I: 0,\n J: 1,\n K: 2,\n X: 3,\n Y: 4,\n Z: 5\n};\nvar Constants = {\n SlicingMode: SlicingMode\n};\n\nexport { SlicingMode, Constants as default };\n","var vtkPolyDataVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyDataVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\nattribute vec4 vertexMC;\\n\\n// frag position in VC\\n//VTK::PositionVC::Dec\\n\\n// optional normal declaration\\n//VTK::Normal::Dec\\n\\n// extra lighting parameters\\n//VTK::Light::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\nvoid main()\\n{\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Clip::Impl\\n\\n //VTK::PrimID::Impl\\n\\n //VTK::PositionVC::Impl\\n\\n //VTK::Light::Impl\\n\\n //VTK::Picking::Impl\\n}\\n\";\n\nexport { vtkPolyDataVS as v };\n","var vtkPolyDataFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyDataFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// Template for the polydata mappers fragment shader\\n\\nuniform int PrimitiveIDOffset;\\n\\n// VC position of this fragment\\n//VTK::PositionVC::Dec\\n\\n// optional color passed in from the vertex shader, vertexColor\\n//VTK::Color::Dec\\n\\n// optional surface normal declaration\\n//VTK::Normal::Dec\\n\\n// extra lighting parameters\\n//VTK::Light::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// Depth Peeling Support\\n//VTK::DepthPeeling::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\n// handle coincident offsets\\n//VTK::Coincident::Dec\\n\\n//VTK::ZBuffer::Dec\\n\\nvoid main()\\n{\\n // VC position of this fragment. This should not branch/return/discard.\\n //VTK::PositionVC::Impl\\n\\n // Place any calls that require uniform flow (e.g. dFdx) here.\\n //VTK::UniformFlow::Impl\\n\\n // Set gl_FragDepth here (gl_FragCoord.z by default)\\n //VTK::Depth::Impl\\n\\n // Early depth peeling abort:\\n //VTK::DepthPeeling::PreColor\\n\\n // Apple Bug\\n //VTK::PrimID::Impl\\n\\n //VTK::Clip::Impl\\n\\n //VTK::Color::Impl\\n\\n // Generate the normal if we are not passed in one\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Light::Impl\\n\\n if (gl_FragData[0].a <= 0.0)\\n {\\n discard;\\n }\\n\\n //VTK::DepthPeeling::Impl\\n\\n //VTK::Picking::Impl\\n\\n // handle coincident offsets\\n //VTK::Coincident::Impl\\n\\n //VTK::ZBuffer::Impl\\n\\n //VTK::RenderPassFragmentShader::Impl\\n}\\n\";\n\nexport { vtkPolyDataFS as v };\n","import { mat4 } from 'gl-matrix';\nimport Constants from '../Core/ImageMapper/Constants.js';\nimport { newInstance as newInstance$1, setGet, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport vtkHelper from './Helper.js';\nimport { u as uninitializeBounds } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { Filter, Wrap } from './Texture/Constants.js';\nimport { InterpolationType } from '../Core/ImageProperty/Constants.js';\nimport { v as vtkPolyDataVS } from './glsl/vtkPolyDataVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar SlicingMode = Constants.SlicingMode; // ----------------------------------------------------------------------------\n// helper methods\n// ----------------------------------------------------------------------------\n\nfunction computeFnToString(property, fn, numberOfComponents) {\n var pwfun = fn.apply(property);\n\n if (pwfun) {\n var iComps = property.getIndependentComponents();\n return \"\".concat(property.getMTime(), \"-\").concat(iComps, \"-\").concat(numberOfComponents);\n }\n\n return '0';\n} // ----------------------------------------------------------------------------\n// vtkOpenGLImageMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLImageMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLImageMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.currentRenderPass = null;\n model.openGLImageSlice = publicAPI.getFirstAncestorOfType('vtkOpenGLImageSlice');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.pwfTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n\n var ren = model._openGLRenderer.getRenderable();\n\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera()); // is slice set by the camera\n\n if (model.renderable.isA('vtkImageMapper') && model.renderable.getSliceAtFocalPoint()) {\n model.renderable.setSliceFromCamera(ren.getActiveCamera());\n }\n }\n };\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.currentRenderPass = renderPass;\n publicAPI.render();\n }\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n model.haveSeenDepthRequest = true;\n model.renderDepth = true;\n publicAPI.render();\n model.renderDepth = false;\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.getCoincidentParameters = function (ren, actor) {\n if (model.renderable.getResolveCoincidentTopology()) {\n return model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n }\n\n return null;\n }; // Renders myself\n\n\n publicAPI.render = function () {\n var actor = model.openGLImageSlice.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkPolyDataVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', [' gl_Position = MCPCMatrix * vertexMC;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', 'tcoordVCVSOutput = tcoordMC;').result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', 'attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;').result;\n var tNumComp = model.openGLTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n var tcoordDec = ['varying vec2 tcoordVCVSOutput;', // color shift and scale\n 'uniform float cshift0;', 'uniform float cscale0;', // pwf shift and scale\n 'uniform float pwfshift0;', 'uniform float pwfscale0;', 'uniform sampler2D texture1;', 'uniform sampler2D colorTexture1;', 'uniform sampler2D pwfTexture1;', 'uniform float opacity;'];\n\n if (iComps) {\n for (var comp = 1; comp < tNumComp; comp++) {\n tcoordDec = tcoordDec.concat([// color shift and scale\n \"uniform float cshift\".concat(comp, \";\"), \"uniform float cscale\".concat(comp, \";\"), // weighting shift and scale\n \"uniform float pwfshift\".concat(comp, \";\"), \"uniform float pwfscale\".concat(comp, \";\")]);\n } // the heights defined below are the locations\n // for the up to four components of the tfuns\n // the tfuns have a height of 2XnumComps pixels so the\n // values are computed to hit the middle of the two rows\n // for that component\n\n\n switch (tNumComp) {\n case 1:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', '#define height0 0.5']);\n break;\n\n case 2:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', 'uniform float mix1;', '#define height0 0.25', '#define height1 0.75']);\n break;\n\n case 3:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', '#define height0 0.17', '#define height1 0.5', '#define height2 0.83']);\n break;\n\n case 4:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', 'uniform float mix3;', '#define height0 0.125', '#define height1 0.375', '#define height2 0.625', '#define height3 0.875']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', tcoordDec).result;\n\n if (iComps) {\n var rgba = ['r', 'g', 'b', 'a'];\n var tcoordImpl = ['vec4 tvalue = texture2D(texture1, tcoordVCVSOutput);'];\n\n for (var _comp = 0; _comp < tNumComp; _comp++) {\n tcoordImpl = tcoordImpl.concat([\"vec3 tcolor\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(colorTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * cscale\").concat(_comp, \" + cshift\").concat(_comp, \", height\").concat(_comp, \")).rgb;\"), \"float compWeight\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(pwfTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * pwfscale\").concat(_comp, \" + pwfshift\").concat(_comp, \", height\").concat(_comp, \")).r;\")]);\n }\n\n switch (tNumComp) {\n case 1:\n tcoordImpl = tcoordImpl.concat(['gl_FragData[0] = vec4(tcolor0.rgb, opacity);']);\n break;\n\n case 2:\n tcoordImpl = tcoordImpl.concat(['float weightSum = compWeight0 + compWeight1;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum))), opacity);']);\n break;\n\n case 3:\n tcoordImpl = tcoordImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum))), opacity);']);\n break;\n\n case 4:\n tcoordImpl = tcoordImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2 + compWeight3;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum)) + (tcolor3.rgb * (compWeight3 / weightSum))), opacity);']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', tcoordImpl).result;\n } else {\n // dependent components\n switch (tNumComp) {\n case 1:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['float intensity = texture2D(texture1, tcoordVCVSOutput).r;', 'vec3 tcolor = texture2D(colorTexture1, vec2(intensity * cscale0 + cshift0, 0.5)).rgb;', 'float scalarOpacity = texture2D(pwfTexture1, vec2(intensity * pwfscale0 + pwfshift0, 0.5)).r;', 'gl_FragData[0] = vec4(tcolor, scalarOpacity * opacity);']).result;\n break;\n\n case 2:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', 'float intensity = tcolor.r*cscale0 + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(intensity, 0.5)).rgb, pwfscale0*tcolor.g + pwfshift0);']).result;\n break;\n\n case 3:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['vec4 tcolor = cscale0*texture2D(texture1, tcoordVCVSOutput.st) + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, opacity);']).result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['vec4 tcolor = cscale0*texture2D(texture1, tcoordVCVSOutput.st) + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, tcolor.a);']).result;\n }\n }\n\n if (model.haveSeenDepthRequest) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', 'uniform int depthRequest;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float iz = floor(gl_FragCoord.z*65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n publicAPI.replaceShaderClip(shaders, ren, actor);\n publicAPI.replaceShaderCoincidentOffset(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderClip = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n\n if (numClipPlanes > 6) {\n vtkErrorMacro$1('OpenGL has a limit of 6 clipping planes');\n numClipPlanes = 6;\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', 'uniform vec4 clipPlanes[6];', 'varying float clipDistancesVSOutput[6];']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Impl', ['for (int planeNum = 0; planeNum < 6; planeNum++)', ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' clipDistancesVSOutput[planeNum] = dot(clipPlanes[planeNum], vertexMC);', ' }']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', 'varying float clipDistancesVSOutput[6];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Impl', ['for (int planeNum = 0; planeNum < 6; planeNum++)', ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' if (clipDistancesVSOutput[planeNum] < 0.0) discard;', ' }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n // render pass shader replacement changed\n var tNumComp = model.openGLTexture.getComponents();\n var iComp = actor.getProperty().getIndependentComponents(); // has the render pass shader replacement changed? Two options\n\n var needRebuild = false;\n\n if (!model.currentRenderPass && model.lastRenderPassShaderReplacement || model.currentRenderPass && model.currentRenderPass.getShaderReplacement() !== model.lastRenderPassShaderReplacement) {\n needRebuild = true;\n }\n\n if (needRebuild || model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || cellBO.getProgram() === 0 || model.lastTextureComponents !== tNumComp || model.lastIndependentComponents !== iComp) {\n model.lastHaveSeenDepthRequest = model.haveSeenDepthRequest;\n model.lastTextureComponents = tNumComp;\n model.lastIndependentComponents = iComp;\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateShaders = function (cellBO, ren, actor) {\n model.lastBoundBO = cellBO; // has something changed that would require us to recreate the shader?\n\n if (publicAPI.getNeedToRebuildShaders(cellBO, ren, actor)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n publicAPI.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n\n if (newShader !== cellBO.getProgram()) {\n cellBO.setProgram(newShader); // reset the VAO as the shader has changed\n\n cellBO.getVAO().releaseGraphicsResources();\n }\n\n cellBO.getShaderSourceTime().modified();\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(cellBO.getProgram());\n }\n\n cellBO.getVAO().bind();\n publicAPI.setMapperShaderParameters(cellBO, ren, actor);\n publicAPI.setCameraShaderParameters(cellBO, ren, actor);\n publicAPI.setPropertyShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (cellBO.getProgram().isAttributeUsed('vertexMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'vertexMC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexMC in shader VAO.');\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('tcoordMC') && cellBO.getCABO().getTCoordOffset()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'tcoordMC', cellBO.getCABO().getTCoordOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getTCoordComponents(), model.context.FALSE)) {\n vtkErrorMacro('Error setting tcoordMC in shader VAO.');\n }\n }\n\n cellBO.getAttributeUpdateTime().modified();\n }\n\n var texUnit = model.openGLTexture.getTextureUnit();\n cellBO.getProgram().setUniformi('texture1', texUnit);\n var numComp = model.openGLTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n\n if (iComps) {\n for (var i = 0; i < numComp; i++) {\n cellBO.getProgram().setUniformf(\"mix\".concat(i), actor.getProperty().getComponentWeight(i));\n }\n }\n\n var oglShiftScale = model.openGLTexture.getShiftAndScale(); // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n for (var _i = 0; _i < numComp; _i++) {\n var cw = actor.getProperty().getColorWindow();\n var cl = actor.getProperty().getColorLevel();\n var target = iComps ? _i : 0;\n var cfun = actor.getProperty().getRGBTransferFunction(target);\n\n if (cfun && actor.getProperty().getUseLookupTableScalarRange()) {\n var cRange = cfun.getRange();\n cw = cRange[1] - cRange[0];\n cl = 0.5 * (cRange[1] + cRange[0]);\n }\n\n var scale = oglShiftScale.scale / cw;\n var shift = (oglShiftScale.shift - cl) / cw + 0.5;\n cellBO.getProgram().setUniformf(\"cshift\".concat(_i), shift);\n cellBO.getProgram().setUniformf(\"cscale\".concat(_i), scale);\n } // pwf shift/scale\n\n\n for (var _i2 = 0; _i2 < numComp; _i2++) {\n var pwfScale = 1.0;\n var pwfShift = 0.0;\n\n var _target = iComps ? _i2 : 0;\n\n var pwfun = actor.getProperty().getPiecewiseFunction(_target);\n\n if (pwfun) {\n var pwfRange = pwfun.getRange();\n var length = pwfRange[1] - pwfRange[0];\n var mid = 0.5 * (pwfRange[0] + pwfRange[1]);\n pwfScale = oglShiftScale.scale / length;\n pwfShift = (oglShiftScale.shift - mid) / length + 0.5;\n }\n\n cellBO.getProgram().setUniformf(\"pwfshift\".concat(_i2), pwfShift);\n cellBO.getProgram().setUniformf(\"pwfscale\".concat(_i2), pwfScale);\n }\n\n if (model.haveSeenDepthRequest) {\n cellBO.getProgram().setUniformi('depthRequest', model.renderDepth ? 1 : 0);\n } // handle coincident\n\n\n if (cellBO.getProgram().isUniformUsed('coffset')) {\n var cp = publicAPI.getCoincidentParameters(ren, actor);\n cellBO.getProgram().setUniformf('coffset', cp.offset); // cfactor isn't always used when coffset is.\n\n if (cellBO.getProgram().isUniformUsed('cfactor')) {\n cellBO.getProgram().setUniformf('cfactor', cp.factor);\n }\n }\n\n var texColorUnit = model.colorTexture.getTextureUnit();\n cellBO.getProgram().setUniformi('colorTexture1', texColorUnit);\n var texOpacityUnit = model.pwfTexture.getTextureUnit();\n cellBO.getProgram().setUniformi('pwfTexture1', texOpacityUnit);\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n // add all the clipping planes\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n\n if (numClipPlanes > 6) {\n vtkErrorMacro$1('OpenGL has a limit of 6 clipping planes');\n numClipPlanes = 6;\n }\n\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var mat = inverseShiftScaleMatrix ? mat4.copy(model.imagematinv, actor.getMatrix()) : actor.getMatrix();\n\n if (inverseShiftScaleMatrix) {\n mat4.transpose(mat, mat);\n mat4.multiply(mat, mat, inverseShiftScaleMatrix);\n mat4.transpose(mat, mat);\n } // transform crop plane normal with transpose(inverse(worldToIndex))\n\n\n mat4.transpose(model.imagemat, model.currentInput.getIndexToWorld());\n mat4.multiply(model.imagematinv, mat, model.imagemat);\n var planeEquations = [];\n\n for (var _i3 = 0; _i3 < numClipPlanes; _i3++) {\n var planeEquation = [];\n model.renderable.getClippingPlaneInDataCoords(model.imagematinv, _i3, planeEquation);\n\n for (var j = 0; j < 4; j++) {\n planeEquations.push(planeEquation[j]);\n }\n }\n\n cellBO.getProgram().setUniformi('numClipPlanes', numClipPlanes);\n cellBO.getProgram().setUniform4fv('clipPlanes', planeEquations);\n }\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var actMats = model.openGLImageSlice.getKeyMatrices();\n var image = model.currentInput;\n var i2wmat4 = image.getIndexToWorld();\n mat4.multiply(model.imagemat, actMats.mcwc, i2wmat4);\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n mat4.multiply(model.imagemat, keyMats.wcpc, model.imagemat);\n\n if (cellBO.getCABO().getCoordShiftAndScaleEnabled()) {\n var inverseShiftScaleMat = cellBO.getCABO().getInverseShiftAndScaleMatrix();\n mat4.multiply(model.imagemat, model.imagemat, inverseShiftScaleMat);\n }\n\n program.setUniformMatrix('MCPCMatrix', model.imagemat);\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n program.setUniformf('opacity', opacity);\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n // make sure the BOs are up to date\n publicAPI.updateBufferObjects(ren, actor); // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n model.lastBoundBO = null;\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var gl = model.context; // activate the texture\n\n model.openGLTexture.activate();\n model.colorTexture.activate();\n model.pwfTexture.activate(); // draw polygons\n\n if (model.tris.getCABO().getElementCount()) {\n // First we do the triangles, update the shader, set uniforms, etc.\n publicAPI.updateShaders(model.tris, ren, actor);\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n }\n\n model.openGLTexture.deactivate();\n model.colorTexture.deactivate();\n model.pwfTexture.deactivate();\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {};\n\n publicAPI.renderPiece = function (ren, actor) {\n // Make sure that we have been properly initialized.\n // if (ren.getRenderWindow().checkAbortStatus()) {\n // return;\n // }\n publicAPI.invokeEvent({\n type: 'StartEvent'\n });\n model.renderable.update();\n model.currentInput = model.renderable.getCurrentImage();\n publicAPI.invokeEvent({\n type: 'EndEvent'\n });\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.computeBounds = function (ren, actor) {\n if (!publicAPI.getInput()) {\n uninitializeBounds(model.bounds);\n return;\n }\n\n model.bounds = publicAPI.getInput().getBounds();\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n if (model.VBOBuildTime.getMTime() < publicAPI.getMTime() || model.VBOBuildTime.getMTime() < actor.getMTime() || model.VBOBuildTime.getMTime() < model.renderable.getMTime() || model.VBOBuildTime.getMTime() < actor.getProperty().getMTime() || model.VBOBuildTime.getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var image = model.currentInput;\n\n if (!image) {\n return;\n }\n\n var imgScalars = image.getPointData() && image.getPointData().getScalars();\n\n if (!imgScalars) {\n return;\n }\n\n var dataType = imgScalars.getDataType();\n var numComp = imgScalars.getNumberOfComponents();\n var actorProperty = actor.getProperty(); // set interpolation on the texture based on property setting\n\n var iType = actorProperty.getInterpolationType();\n\n if (iType === InterpolationType.NEAREST) {\n model.colorTexture.setMinificationFilter(Filter.NEAREST);\n model.colorTexture.setMagnificationFilter(Filter.NEAREST);\n model.pwfTexture.setMinificationFilter(Filter.NEAREST);\n model.pwfTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n model.pwfTexture.setMinificationFilter(Filter.LINEAR);\n model.pwfTexture.setMagnificationFilter(Filter.LINEAR);\n }\n\n var iComps = actorProperty.getIndependentComponents();\n var numIComps = iComps ? numComp : 1;\n var textureHeight = iComps ? 2 * numIComps : 1;\n var cfunToString = computeFnToString(actorProperty, actorProperty.getRGBTransferFunction, numIComps);\n\n if (model.colorTextureString !== cfunToString) {\n var cWidth = 1024;\n var cSize = cWidth * textureHeight * 3;\n var cTable = new Uint8Array(cSize);\n var cfun = actorProperty.getRGBTransferFunction();\n\n if (cfun) {\n var tmpTable = new Float32Array(cWidth * 3);\n\n for (var c = 0; c < numIComps; c++) {\n cfun = actorProperty.getRGBTransferFunction(c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, tmpTable, 1);\n\n if (iComps) {\n for (var i = 0; i < cWidth * 3; i++) {\n cTable[c * cWidth * 6 + i] = 255.0 * tmpTable[i];\n cTable[c * cWidth * 6 + i + cWidth * 3] = 255.0 * tmpTable[i];\n }\n } else {\n for (var _i4 = 0; _i4 < cWidth * 3; _i4++) {\n cTable[c * cWidth * 6 + _i4] = 255.0 * tmpTable[_i4];\n }\n }\n }\n\n model.colorTexture.create2DFromRaw(cWidth, textureHeight, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n } else {\n for (var _i5 = 0; _i5 < cWidth * 3; ++_i5) {\n cTable[_i5] = 255.0 * _i5 / ((cWidth - 1) * 3);\n cTable[_i5 + 1] = 255.0 * _i5 / ((cWidth - 1) * 3);\n cTable[_i5 + 2] = 255.0 * _i5 / ((cWidth - 1) * 3);\n }\n\n model.colorTexture.create2DFromRaw(cWidth, 1, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n }\n\n model.colorTextureString = cfunToString;\n } // Build piecewise function buffer. This buffer is used either\n // for component weighting or opacity, depending on whether we're\n // rendering components independently or not.\n\n\n var pwfunToString = computeFnToString(actorProperty, actorProperty.getPiecewiseFunction, numIComps);\n\n if (model.pwfTextureString !== pwfunToString) {\n var pwfWidth = 1024;\n var pwfSize = pwfWidth * textureHeight;\n var pwfTable = new Uint8Array(pwfSize);\n var pwfun = actorProperty.getPiecewiseFunction(); // support case where pwfun is added/removed\n\n model.pwfTexture.resetFormatAndType();\n\n if (pwfun) {\n var pwfFloatTable = new Float32Array(pwfSize);\n\n var _tmpTable = new Float32Array(pwfWidth);\n\n for (var _c = 0; _c < numIComps; ++_c) {\n pwfun = actorProperty.getPiecewiseFunction(_c);\n\n if (pwfun === null) {\n // Piecewise constant max if no function supplied for this component\n pwfFloatTable.fill(1.0);\n } else {\n var pwfRange = pwfun.getRange();\n pwfun.getTable(pwfRange[0], pwfRange[1], pwfWidth, _tmpTable, 1); // adjust for sample distance etc\n\n if (iComps) {\n for (var _i6 = 0; _i6 < pwfWidth; _i6++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i6] = _tmpTable[_i6];\n pwfFloatTable[_c * pwfWidth * 2 + _i6 + pwfWidth] = _tmpTable[_i6];\n }\n } else {\n for (var _i7 = 0; _i7 < pwfWidth; _i7++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i7] = _tmpTable[_i7];\n }\n }\n }\n }\n\n model.pwfTexture.create2DFromRaw(pwfWidth, textureHeight, 1, VtkDataTypes.FLOAT, pwfFloatTable);\n } else {\n // default is opaque\n pwfTable.fill(255.0);\n model.pwfTexture.create2DFromRaw(pwfWidth, 1, 1, VtkDataTypes.UNSIGNED_CHAR, pwfTable);\n }\n\n model.pwfTextureString = pwfunToString;\n } // Find what IJK axis and what direction to slice along\n\n\n var _model$renderable$get = model.renderable.getClosestIJKAxis(),\n ijkMode = _model$renderable$get.ijkMode; // Find the IJK slice\n\n\n var slice = model.renderable.getSlice();\n\n if (ijkMode !== model.renderable.getSlicingMode()) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n slice = model.renderable.getSliceAtPosition(slice);\n } // Use sub-Slice number/offset if mapper being used is vtkImageArrayMapper,\n // since this mapper uses a collection of vtkImageData (and not just a single vtkImageData).\n\n\n var nSlice = model.renderable.isA('vtkImageArrayMapper') ? model.renderable.getSubSlice() // get subSlice of the current (possibly multi-frame) image\n : Math.round(slice); // Find sliceOffset\n\n var ext = image.getExtent();\n var sliceOffset;\n\n if (ijkMode === SlicingMode.I) {\n sliceOffset = nSlice - ext[0];\n }\n\n if (ijkMode === SlicingMode.J) {\n sliceOffset = nSlice - ext[2];\n }\n\n if (ijkMode === SlicingMode.K || ijkMode === SlicingMode.NONE) {\n sliceOffset = nSlice - ext[4];\n } // rebuild the VBO if the data has changed\n\n\n var toString = \"\".concat(slice, \"A\").concat(image.getMTime(), \"A\").concat(imgScalars.getMTime(), \"B\").concat(publicAPI.getMTime(), \"C\").concat(model.renderable.getSlicingMode(), \"D\").concat(actor.getProperty().getInterpolationType());\n\n if (model.VBOBuildString !== toString) {\n var _model$renderable$get2, _model$renderable;\n\n // Build the VBOs\n var dims = image.getDimensions();\n\n if (iType === InterpolationType.NEAREST) {\n if (new Set([1, 3, 4]).has(numComp) && dataType === VtkDataTypes.UNSIGNED_CHAR && !iComps) {\n model.openGLTexture.setGenerateMipmap(true);\n model.openGLTexture.setMinificationFilter(Filter.NEAREST);\n } else {\n model.openGLTexture.setMinificationFilter(Filter.NEAREST);\n }\n\n model.openGLTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n if (numComp === 4 && dataType === VtkDataTypes.UNSIGNED_CHAR && !iComps) {\n model.openGLTexture.setGenerateMipmap(true);\n model.openGLTexture.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n } else {\n model.openGLTexture.setMinificationFilter(Filter.LINEAR);\n }\n\n model.openGLTexture.setMagnificationFilter(Filter.LINEAR);\n }\n\n model.openGLTexture.setWrapS(Wrap.CLAMP_TO_EDGE);\n model.openGLTexture.setWrapT(Wrap.CLAMP_TO_EDGE);\n var sliceSize = dims[0] * dims[1] * numComp;\n var ptsArray = new Float32Array(12);\n var tcoordArray = new Float32Array(8);\n\n for (var _i8 = 0; _i8 < 4; _i8++) {\n tcoordArray[_i8 * 2] = _i8 % 2 ? 1.0 : 0.0;\n tcoordArray[_i8 * 2 + 1] = _i8 > 1 ? 1.0 : 0.0;\n } // Determine depth position of the slicing plane in the scene.\n // Slicing modes X, Y, and Z use a continuous axis position, whereas\n // slicing modes I, J, and K should use discrete positions.\n\n\n var sliceDepth = [SlicingMode.X, SlicingMode.Y, SlicingMode.Z].includes(model.renderable.getSlicingMode()) ? slice : nSlice;\n var spatialExt = image.getSpatialExtent();\n var basicScalars = imgScalars.getData();\n var scalars = null; // Get right scalars according to slicing mode\n\n if (ijkMode === SlicingMode.I) {\n scalars = new basicScalars.constructor(dims[2] * dims[1] * numComp);\n var id = 0;\n\n for (var k = 0; k < dims[2]; k++) {\n for (var j = 0; j < dims[1]; j++) {\n var bsIdx = (sliceOffset + j * dims[0] + k * dims[0] * dims[1]) * numComp;\n id = (k * dims[1] + j) * numComp;\n scalars.set(basicScalars.subarray(bsIdx, bsIdx + numComp), id);\n }\n }\n\n dims[0] = dims[1];\n dims[1] = dims[2];\n ptsArray[0] = sliceDepth;\n ptsArray[1] = spatialExt[2];\n ptsArray[2] = spatialExt[4];\n ptsArray[3] = sliceDepth;\n ptsArray[4] = spatialExt[3];\n ptsArray[5] = spatialExt[4];\n ptsArray[6] = sliceDepth;\n ptsArray[7] = spatialExt[2];\n ptsArray[8] = spatialExt[5];\n ptsArray[9] = sliceDepth;\n ptsArray[10] = spatialExt[3];\n ptsArray[11] = spatialExt[5];\n } else if (ijkMode === SlicingMode.J) {\n scalars = new basicScalars.constructor(dims[2] * dims[0] * numComp);\n var _id = 0;\n\n for (var _k = 0; _k < dims[2]; _k++) {\n for (var _i9 = 0; _i9 < dims[0]; _i9++) {\n var _bsIdx = (_i9 + sliceOffset * dims[0] + _k * dims[0] * dims[1]) * numComp;\n\n _id = (_k * dims[0] + _i9) * numComp;\n scalars.set(basicScalars.subarray(_bsIdx, _bsIdx + numComp), _id);\n }\n }\n\n dims[1] = dims[2];\n ptsArray[0] = spatialExt[0];\n ptsArray[1] = sliceDepth;\n ptsArray[2] = spatialExt[4];\n ptsArray[3] = spatialExt[1];\n ptsArray[4] = sliceDepth;\n ptsArray[5] = spatialExt[4];\n ptsArray[6] = spatialExt[0];\n ptsArray[7] = sliceDepth;\n ptsArray[8] = spatialExt[5];\n ptsArray[9] = spatialExt[1];\n ptsArray[10] = sliceDepth;\n ptsArray[11] = spatialExt[5];\n } else if (ijkMode === SlicingMode.K || ijkMode === SlicingMode.NONE) {\n scalars = basicScalars.subarray(sliceOffset * sliceSize, (sliceOffset + 1) * sliceSize);\n ptsArray[0] = spatialExt[0];\n ptsArray[1] = spatialExt[2];\n ptsArray[2] = sliceDepth;\n ptsArray[3] = spatialExt[1];\n ptsArray[4] = spatialExt[2];\n ptsArray[5] = sliceDepth;\n ptsArray[6] = spatialExt[0];\n ptsArray[7] = spatialExt[3];\n ptsArray[8] = sliceDepth;\n ptsArray[9] = spatialExt[1];\n ptsArray[10] = spatialExt[3];\n ptsArray[11] = sliceDepth;\n } else {\n vtkErrorMacro('Reformat slicing not yet supported.');\n }\n\n model.openGLTexture.create2DFilterableFromRaw(dims[0], dims[1], numComp, imgScalars.getDataType(), scalars, (_model$renderable$get2 = (_model$renderable = model.renderable).getPreferSizeOverAccuracy) === null || _model$renderable$get2 === void 0 ? void 0 : _model$renderable$get2.call(_model$renderable));\n model.openGLTexture.activate();\n model.openGLTexture.sendParameters();\n model.openGLTexture.deactivate();\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var tcoords = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoordArray\n });\n tcoords.setName('tcoords');\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n tcoords: tcoords,\n cellOffset: 0\n });\n model.VBOBuildTime.modified();\n model.VBOBuildString = toString;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n VBOBuildTime: 0,\n VBOBuildString: null,\n openGLTexture: null,\n tris: null,\n imagemat: null,\n imagematinv: null,\n colorTexture: null,\n pwfTexture: null,\n lastHaveSeenDepthRequest: false,\n haveSeenDepthRequest: false,\n lastTextureComponents: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.tris = vtkHelper.newInstance();\n model.openGLTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n model.colorTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n model.pwfTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n model.imagemat = mat4.identity(new Float64Array(16));\n model.imagematinv = mat4.identity(new Float64Array(16)); // Build VTK API\n\n setGet(publicAPI, model, []);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime); // Object methods\n\n vtkOpenGLImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLImageMapper'); // ----------------------------------------------------------------------------\n\nvar vtkImageMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkAbstractImageMapper', newInstance);\n\nexport { vtkImageMapper as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLImageSlice methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLImageSlice(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLImageSlice'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.traverseZBufferPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.traverseOpaqueZBufferPass = function (renderPass) {\n return publicAPI.traverseOpaquePass(renderPass);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.zBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n };\n\n publicAPI.opaqueZBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n model.context.depthMask(!prepass);\n };\n\n publicAPI.getKeyMatrices = function () {\n // has the actor changed?\n if (model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n mat4.copy(model.keyMatrices.mcwc, model.renderable.getMatrix());\n mat4.transpose(model.keyMatrices.mcwc, model.keyMatrices.mcwc);\n model.keyMatrixTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n keyMatrixTime: null,\n keyMatrices: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n mcwc: mat4.identity(new Float64Array(16))\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLImageSlice(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLImageSlice'); // ----------------------------------------------------------------------------\n\nvar vtkImageSlice = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkImageSlice', newInstance);\n\nexport { vtkImageSlice as default, extend, newInstance };\n","import { mat4, mat3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLVolume methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLVolume(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLVolume'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n renderPass.incrementVolumeCount();\n }\n };\n\n publicAPI.traverseVolumePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children[0].traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // Renders myself\n\n\n publicAPI.volumePass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n model.context.depthMask(!prepass);\n };\n\n publicAPI.getKeyMatrices = function () {\n // has the actor changed?\n if (model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n model.renderable.computeMatrix();\n mat4.copy(model.MCWCMatrix, model.renderable.getMatrix());\n mat4.transpose(model.MCWCMatrix, model.MCWCMatrix);\n\n if (model.renderable.getIsIdentity()) {\n mat3.identity(model.normalMatrix);\n } else {\n mat3.fromMat4(model.normalMatrix, model.MCWCMatrix);\n mat3.invert(model.normalMatrix, model.normalMatrix);\n }\n\n model.keyMatrixTime.modified();\n }\n\n return {\n mcwc: model.MCWCMatrix,\n normalMatrix: model.normalMatrix\n };\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// context: null,\n // keyMatrixTime: null,\n // normalMatrix: null,\n // MCWCMatrix: null,\n // _openGLRenderWindow: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n }); // always set by getter\n\n model.normalMatrix = new Float64Array(9);\n model.MCWCMatrix = new Float64Array(16); // Build VTK API\n\n setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLVolume(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLVolume'); // ----------------------------------------------------------------------------\n\nvar vtkVolume = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkVolume', newInstance);\n\nexport { vtkVolume as default, extend, newInstance };\n","import { newInstance as newInstance$1, obj, vtkErrorMacro, getArray } from '../../macros.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport { Filter } from './Texture/Constants.js';\n\n// vtkFramebuffer methods\n// ----------------------------------------------------------------------------\n\nfunction vtkFramebuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkFramebuffer');\n\n publicAPI.getBothMode = function () {\n return model.context.FRAMEBUFFER;\n }; // publicAPI.getDrawMode = () => model.context.DRAW_FRAMEBUFFER;\n // publicAPI.getReadMode = () => model.context.READ_FRAMEBUFFER;\n\n\n publicAPI.saveCurrentBindingsAndBuffers = function (modeIn) {\n var mode = typeof modeIn !== 'undefined' ? modeIn : publicAPI.getBothMode();\n publicAPI.saveCurrentBindings(mode);\n publicAPI.saveCurrentBuffers(mode);\n };\n\n publicAPI.saveCurrentBindings = function (modeIn) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling saveCurrentBindings');\n return;\n }\n\n var gl = model.context;\n model.previousDrawBinding = gl.getParameter(model.context.FRAMEBUFFER_BINDING);\n model.previousActiveFramebuffer = model._openGLRenderWindow.getActiveFramebuffer();\n };\n\n publicAPI.saveCurrentBuffers = function (modeIn) {// noop on webgl 1\n };\n\n publicAPI.restorePreviousBindingsAndBuffers = function (modeIn) {\n var mode = typeof modeIn !== 'undefined' ? modeIn : publicAPI.getBothMode();\n publicAPI.restorePreviousBindings(mode);\n publicAPI.restorePreviousBuffers(mode);\n };\n\n publicAPI.restorePreviousBindings = function (modeIn) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling restorePreviousBindings');\n return;\n }\n\n var gl = model.context;\n gl.bindFramebuffer(gl.FRAMEBUFFER, model.previousDrawBinding);\n\n model._openGLRenderWindow.setActiveFramebuffer(model.previousActiveFramebuffer);\n };\n\n publicAPI.restorePreviousBuffers = function (modeIn) {// currently a noop on webgl1\n };\n\n publicAPI.bind = function () {\n var modeArg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var mode = modeArg;\n\n if (mode === null) {\n mode = model.context.FRAMEBUFFER;\n }\n\n model.context.bindFramebuffer(mode, model.glFramebuffer);\n\n for (var i = 0; i < model.colorBuffers.length; i++) {\n model.colorBuffers[i].bind();\n }\n\n model._openGLRenderWindow.setActiveFramebuffer(publicAPI);\n };\n\n publicAPI.create = function (width, height) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling create');\n return;\n }\n\n model.glFramebuffer = model.context.createFramebuffer();\n model.glFramebuffer.width = width;\n model.glFramebuffer.height = height;\n };\n\n publicAPI.setColorBuffer = function (texture) {\n var attachment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var gl = model.context;\n\n if (!gl) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling setColorBuffer');\n return;\n }\n\n var glAttachment = gl.COLOR_ATTACHMENT0;\n\n if (attachment > 0) {\n if (model._openGLRenderWindow.getWebgl2()) {\n glAttachment += attachment;\n } else {\n vtkErrorMacro('Using multiple framebuffer attachments requires WebGL 2');\n return;\n }\n }\n\n model.colorBuffers[attachment] = texture;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachment, gl.TEXTURE_2D, texture.getHandle(), 0);\n };\n\n publicAPI.removeColorBuffer = function () {\n var attachment = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var gl = model.context;\n\n if (!gl) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling removeColorBuffer');\n return;\n }\n\n var glAttachment = gl.COLOR_ATTACHMENT0;\n\n if (attachment > 0) {\n if (model._openGLRenderWindow.getWebgl2()) {\n glAttachment += attachment;\n } else {\n vtkErrorMacro('Using multiple framebuffer attachments requires WebGL 2');\n return;\n }\n }\n\n gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachment, gl.TEXTURE_2D, null, 0);\n model.colorBuffers = model.colorBuffers.splice(attachment, 1);\n };\n\n publicAPI.setDepthBuffer = function (texture) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling setDepthBuffer');\n return;\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n var gl = model.context;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, texture.getHandle(), 0);\n } else {\n vtkErrorMacro('Attaching depth buffer textures to fbo requires WebGL 2');\n }\n };\n\n publicAPI.removeDepthBuffer = function () {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling removeDepthBuffer');\n return;\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n var gl = model.context;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, null, 0);\n } else {\n vtkErrorMacro('Attaching depth buffer textures to framebuffers requires WebGL 2');\n }\n };\n\n publicAPI.getGLFramebuffer = function () {\n return model.glFramebuffer;\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.glFramebuffer) {\n model.context.deleteFramebuffer(model.glFramebuffer);\n }\n };\n\n publicAPI.getSize = function () {\n var size = [0, 0];\n\n if (model.glFramebuffer !== null) {\n size[0] = model.glFramebuffer.width;\n size[1] = model.glFramebuffer.height;\n }\n\n return size;\n };\n\n publicAPI.populateFramebuffer = function () {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling populateFrameBuffer');\n return;\n }\n\n publicAPI.bind();\n var gl = model.context;\n var texture = vtkOpenGLTexture.newInstance();\n texture.setOpenGLRenderWindow(model._openGLRenderWindow);\n texture.setMinificationFilter(Filter.LINEAR);\n texture.setMagnificationFilter(Filter.LINEAR);\n texture.create2DFromRaw(model.glFramebuffer.width, model.glFramebuffer.height, 4, VtkDataTypes.UNSIGNED_CHAR, null);\n publicAPI.setColorBuffer(texture); // for now do not count on having a depth buffer texture\n // as they are not standard webgl 1\n\n model.depthTexture = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, model.depthTexture);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, model.glFramebuffer.width, model.glFramebuffer.height);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, model.depthTexture);\n }; // For backwards compatibility. Use getColorBuffers()[0] going forward.\n\n\n publicAPI.getColorTexture = function () {\n return model.colorBuffers[0];\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _openGLRenderWindow: null,\n glFramebuffer: null,\n colorBuffers: null,\n depthTexture: null,\n previousDrawBinding: 0,\n previousReadBinding: 0,\n previousDrawBuffer: 0,\n previousReadBuffer: 0,\n previousActiveFramebuffer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n obj(publicAPI, model);\n\n if (model.colorBuffers) {\n vtkErrorMacro('you cannot initialize colorBuffers through the constructor. You should call setColorBuffer() instead.');\n }\n\n model.colorBuffers = [];\n getArray(publicAPI, model, ['colorBuffers']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkFramebuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkFramebuffer'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLFramebuffer = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkOpenGLFramebuffer as default, extend, newInstance };\n","var InterpolationType = {\n NEAREST: 0,\n LINEAR: 1,\n FAST_LINEAR: 2\n};\nvar OpacityMode = {\n FRACTIONAL: 0,\n PROPORTIONAL: 1\n};\nvar Constants = {\n InterpolationType: InterpolationType,\n OpacityMode: OpacityMode\n};\n\nexport { InterpolationType, OpacityMode, Constants as default };\n","var vtkVolumeVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyDataVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\nattribute vec4 vertexDC;\\n\\nvarying vec3 vertexVCVSOutput;\\nuniform mat4 PCVCMatrix;\\n\\nuniform float dcxmin;\\nuniform float dcxmax;\\nuniform float dcymin;\\nuniform float dcymax;\\n\\nvoid main()\\n{\\n // dcsmall is the device coords reduced to the\\n // x y area covered by the volume\\n vec4 dcsmall = vec4(\\n dcxmin + 0.5 * (vertexDC.x + 1.0) * (dcxmax - dcxmin),\\n dcymin + 0.5 * (vertexDC.y + 1.0) * (dcymax - dcymin),\\n vertexDC.z,\\n vertexDC.w);\\n vec4 vcpos = PCVCMatrix * dcsmall;\\n vertexVCVSOutput = vcpos.xyz/vcpos.w;\\n gl_Position = dcsmall;\\n}\\n\";\n\nexport { vtkVolumeVS as v };\n","var vtkVolumeFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkVolumeFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// Template for the volume mappers fragment shader\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\nvarying vec3 vertexVCVSOutput;\\n\\n// first declare the settings from the mapper\\n// that impact the code paths in here\\n\\n// always set vtkNumComponents 1,2,3,4\\n//VTK::NumComponents\\n\\n// possibly define vtkTrilinearOn\\n//VTK::TrilinearOn\\n\\n// possibly define vtkIndependentComponents\\n//VTK::IndependentComponentsOn\\n\\n// possibly define any \\\"proportional\\\" components\\n//VTK::vtkProportionalComponents\\n\\n// Define the blend mode to use\\n#define vtkBlendMode //VTK::BlendMode\\n\\n// Possibly define vtkImageLabelOutlineOn\\n//VTK::ImageLabelOutlineOn\\n\\n#ifdef vtkImageLabelOutlineOn\\nuniform int outlineThickness;\\nuniform float outlineOpacity;\\nuniform float vpWidth;\\nuniform float vpHeight;\\nuniform float vpOffsetX;\\nuniform float vpOffsetY;\\nuniform mat4 PCWCMatrix;\\nuniform mat4 vWCtoIDX;\\n#endif\\n\\n// define vtkLightComplexity\\n//VTK::LightComplexity\\n#if vtkLightComplexity > 0\\nuniform float vSpecularPower;\\nuniform float vAmbient;\\nuniform float vDiffuse;\\nuniform float vSpecular;\\n//VTK::Light::Dec\\n#endif\\n\\n//VTK::VolumeShadowOn\\n//VTK::SurfaceShadowOn\\n//VTK::localAmbientOcclusionOn\\n//VTK::LAO::Dec\\n//VTK::VolumeShadow::Dec\\n\\n// define vtkComputeNormalFromOpacity\\n//VTK::vtkComputeNormalFromOpacity\\n\\n// possibly define vtkGradientOpacityOn\\n//VTK::GradientOpacityOn\\n#ifdef vtkGradientOpacityOn\\nuniform float goscale0;\\nuniform float goshift0;\\nuniform float gomin0;\\nuniform float gomax0;\\n#if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\\nuniform float goscale1;\\nuniform float goshift1;\\nuniform float gomin1;\\nuniform float gomax1;\\n#if vtkNumComponents >= 3\\nuniform float goscale2;\\nuniform float goshift2;\\nuniform float gomin2;\\nuniform float gomax2;\\n#endif\\n#if vtkNumComponents >= 4\\nuniform float goscale3;\\nuniform float goshift3;\\nuniform float gomin3;\\nuniform float gomax3;\\n#endif\\n#endif\\n#endif\\n\\n// if you want to see the raw tiled\\n// data in webgl1 uncomment the following line\\n// #define debugtile\\n\\n// camera values\\nuniform float camThick;\\nuniform float camNear;\\nuniform float camFar;\\nuniform int cameraParallel;\\n\\n// values describing the volume geometry\\nuniform vec3 vOriginVC;\\nuniform vec3 vSpacing;\\nuniform ivec3 volumeDimensions; // 3d texture dimensions\\nuniform vec3 vPlaneNormal0;\\nuniform float vPlaneDistance0;\\nuniform vec3 vPlaneNormal1;\\nuniform float vPlaneDistance1;\\nuniform vec3 vPlaneNormal2;\\nuniform float vPlaneDistance2;\\nuniform vec3 vPlaneNormal3;\\nuniform float vPlaneDistance3;\\nuniform vec3 vPlaneNormal4;\\nuniform float vPlaneDistance4;\\nuniform vec3 vPlaneNormal5;\\nuniform float vPlaneDistance5;\\n\\n//VTK::ClipPlane::Dec\\n\\n// opacity and color textures\\nuniform sampler2D otexture;\\nuniform float oshift0;\\nuniform float oscale0;\\nuniform sampler2D ctexture;\\nuniform float cshift0;\\nuniform float cscale0;\\n\\n// jitter texture\\nuniform sampler2D jtexture;\\n\\n// some 3D texture values\\nuniform float sampleDistance;\\nuniform vec3 vVCToIJK;\\n\\n// the heights defined below are the locations\\n// for the up to four components of the tfuns\\n// the tfuns have a height of 2XnumComps pixels so the\\n// values are computed to hit the middle of the two rows\\n// for that component\\n#ifdef vtkIndependentComponentsOn\\n#if vtkNumComponents == 2\\nuniform float mix0;\\nuniform float mix1;\\n#define height0 0.25\\n#define height1 0.75\\n#endif\\n#if vtkNumComponents == 3\\nuniform float mix0;\\nuniform float mix1;\\nuniform float mix2;\\n#define height0 0.17\\n#define height1 0.5\\n#define height2 0.83\\n#endif\\n#if vtkNumComponents == 4\\nuniform float mix0;\\nuniform float mix1;\\nuniform float mix2;\\nuniform float mix3;\\n#define height0 0.125\\n#define height1 0.375\\n#define height2 0.625\\n#define height3 0.875\\n#endif\\n#endif\\n\\n#if vtkNumComponents >= 2\\nuniform float oshift1;\\nuniform float oscale1;\\nuniform float cshift1;\\nuniform float cscale1;\\n#endif\\n#if vtkNumComponents >= 3\\nuniform float oshift2;\\nuniform float oscale2;\\nuniform float cshift2;\\nuniform float cscale2;\\n#endif\\n#if vtkNumComponents >= 4\\nuniform float oshift3;\\nuniform float oscale3;\\nuniform float cshift3;\\nuniform float cscale3;\\n#endif\\n\\nuniform vec4 ipScalarRangeMin;\\nuniform vec4 ipScalarRangeMax;\\n\\n// declaration for intermixed geometry\\n//VTK::ZBuffer::Dec\\n\\n//=======================================================================\\n// global and custom variables (a temporary section before photorealistics rendering module is complete)\\nvec3 rayDirVC;\\nfloat sampleDistanceISVS;\\nfloat sampleDistanceIS;\\n\\n#define SQRT3 1.7321\\n#define INV4PI 0.0796\\n#define EPSILON 0.001\\n#define PI 3.1415\\n#define PI2 9.8696\\n\\n//=======================================================================\\n// Webgl2 specific version of functions\\n#if __VERSION__ == 300\\n\\nuniform highp sampler3D texture1;\\n\\nvec4 getTextureValue(vec3 pos)\\n{\\n vec4 tmp = texture(texture1, pos);\\n#if vtkNumComponents == 1\\n tmp.a = tmp.r;\\n#endif\\n#if vtkNumComponents == 2\\n tmp.a = tmp.g;\\n#endif\\n#if vtkNumComponents == 3\\n tmp.a = length(tmp.rgb);\\n#endif\\n return tmp;\\n}\\n\\n//=======================================================================\\n// WebGL1 specific version of functions\\n#else\\n\\nuniform sampler2D texture1;\\n\\nuniform float texWidth;\\nuniform float texHeight;\\nuniform int xreps;\\nuniform int xstride;\\nuniform int ystride;\\n\\n// if computing trilinear values from multiple z slices\\n#ifdef vtkTrilinearOn\\nvec4 getTextureValue(vec3 ijk)\\n{\\n float zoff = 1.0/float(volumeDimensions.z);\\n vec4 val1 = getOneTextureValue(ijk);\\n vec4 val2 = getOneTextureValue(vec3(ijk.xy, ijk.z + zoff));\\n\\n float indexZ = float(volumeDimensions)*ijk.z;\\n float zmix = indexZ - floor(indexZ);\\n\\n return mix(val1, val2, zmix);\\n}\\n\\nvec4 getOneTextureValue(vec3 ijk)\\n#else // nearest or fast linear\\nvec4 getTextureValue(vec3 ijk)\\n#endif\\n{\\n vec3 tdims = vec3(volumeDimensions);\\n\\n#ifdef debugtile\\n vec2 tpos = vec2(ijk.x, ijk.y);\\n vec4 tmp = texture2D(texture1, tpos);\\n tmp.a = 1.0;\\n\\n#else\\n int z = int(ijk.z * tdims.z);\\n int yz = z / xreps;\\n int xz = z - yz*xreps;\\n\\n int tileWidth = volumeDimensions.x/xstride;\\n int tileHeight = volumeDimensions.y/ystride;\\n\\n xz *= tileWidth;\\n yz *= tileHeight;\\n\\n float ni = float(xz) + (ijk.x*float(tileWidth));\\n float nj = float(yz) + (ijk.y*float(tileHeight));\\n\\n vec2 tpos = vec2(ni/texWidth, nj/texHeight);\\n\\n vec4 tmp = texture2D(texture1, tpos);\\n\\n#if vtkNumComponents == 1\\n tmp.a = tmp.r;\\n#endif\\n#if vtkNumComponents == 2\\n tmp.g = tmp.a;\\n#endif\\n#if vtkNumComponents == 3\\n tmp.a = length(tmp.rgb);\\n#endif\\n#endif\\n\\n return tmp;\\n}\\n\\n// End of Webgl1 specific code\\n//=======================================================================\\n#endif\\n\\n//=======================================================================\\n// transformation between VC and IS space\\n\\n// convert vector position from idx to vc\\n#if vtkLightComplexity > 0\\nvec3 IStoVC(vec3 posIS){\\n vec3 posVC = posIS / vVCToIJK;\\n return posVC.x * vPlaneNormal0 +\\n posVC.y * vPlaneNormal2 +\\n posVC.z * vPlaneNormal4 +\\n vOriginVC;\\n}\\n\\n// convert vector position from vc to idx\\nvec3 VCtoIS(vec3 posVC){\\n posVC = posVC - vOriginVC;\\n posVC = vec3(\\n dot(posVC, vPlaneNormal0),\\n dot(posVC, vPlaneNormal2),\\n dot(posVC, vPlaneNormal4));\\n return posVC * vVCToIJK;\\n}\\n#endif\\n\\n//Rotate vector to view coordinate\\n#if (vtkLightComplexity > 0) || (defined vtkGradientOpacityOn)\\nvoid rotateToViewCoord(inout vec3 dirIS){\\n dirIS.xyz =\\n dirIS.x * vPlaneNormal0 +\\n dirIS.y * vPlaneNormal2 +\\n dirIS.z * vPlaneNormal4;\\n}\\n\\n//Rotate vector to idx coordinate\\nvec3 rotateToIDX(vec3 dirVC){\\n vec3 dirIS;\\n dirIS.xyz = vec3(\\n dot(dirVC, vPlaneNormal0),\\n dot(dirVC, vPlaneNormal2),\\n dot(dirVC, vPlaneNormal4));\\n return dirIS;\\n}\\n#endif\\n\\n//=======================================================================\\n// Given a normal compute the gradient opacity factors\\nfloat computeGradientOpacityFactor(\\n float normalMag, float goscale, float goshift, float gomin, float gomax)\\n{\\n#if defined(vtkGradientOpacityOn)\\n return clamp(normalMag * goscale + goshift, gomin, gomax);\\n#else\\n return 1.0;\\n#endif\\n}\\n\\n//=======================================================================\\n// compute the normal and gradient magnitude for a position, uses forward difference\\n#if (vtkLightComplexity > 0) || (defined vtkGradientOpacityOn)\\n #ifdef vtkComputeNormalFromOpacity\\n #ifdef vtkGradientOpacityOn\\n vec4 computeNormalForDensity(vec3 pos, float scalar, vec3 tstep, out mat3 scalarInterp, out vec3 secondaryGradientMag)\\n {\\n vec4 result;\\n scalarInterp[0][0] = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a;\\n scalarInterp[0][1] = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a;\\n scalarInterp[0][2] = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a;\\n // look up scalar values for computing secondary gradient\\n scalarInterp[1][0] = getTextureValue(pos + vec3(2.0*tstep.x, 0.0, 0.0)).a;\\n scalarInterp[1][1] = getTextureValue(pos + vec3(0.0, 2.0*tstep.y, 0.0)).a;\\n scalarInterp[1][2] = getTextureValue(pos + vec3(0.0, 0.0, 2.0*tstep.z)).a;\\n scalarInterp[2][0] = getTextureValue(pos + vec3(tstep.x, tstep.y, 0.0)).a;\\n scalarInterp[2][1] = getTextureValue(pos + vec3(tstep.x, 0.0, tstep.z)).a;\\n scalarInterp[2][2] = getTextureValue(pos + vec3(0.0, tstep.y, tstep.z)).a;\\n result.x = scalarInterp[0][0] - scalar;\\n result.y = scalarInterp[0][1] - scalar;\\n result.z = scalarInterp[0][2] - scalar;\\n // divide by spacing\\n result.xyz /= vSpacing;\\n result.w = length(result.xyz);\\n rotateToViewCoord(result.xyz);\\n secondaryGradientMag.x = length(vec3(scalarInterp[1][0] - scalarInterp[0][0],\\n scalarInterp[2][0] - scalarInterp[0][0],\\n scalarInterp[2][1] - scalarInterp[0][0]) / vSpacing);\\n secondaryGradientMag.y = length(vec3(scalarInterp[2][0] - scalarInterp[0][1],\\n scalarInterp[1][1] - scalarInterp[0][1],\\n scalarInterp[2][2] - scalarInterp[0][1]) / vSpacing);\\n secondaryGradientMag.z = length(vec3(scalarInterp[2][1] - scalarInterp[0][2],\\n scalarInterp[2][2] - scalarInterp[0][2],\\n scalarInterp[1][2] - scalarInterp[0][2]) / vSpacing);\\n if (length(result.xyz) > 0.0) {\\n return vec4(normalize(result.xyz),result.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n\\n vec4 computeDensityNormal(float scalar, float gradientMag, mat3 scalarInterp, vec3 secondaryGradientMag)\\n {\\n vec4 opacityG;\\n vec3 opacityInterp = vec3(0.0);\\n float opacity = texture2D(otexture, vec2(scalar * oscale0 + oshift0, 0.5)).r;\\n if (gradientMag >= 0.0){\\n opacity *= computeGradientOpacityFactor(gradientMag, goscale0, goshift0, gomin0, gomax0);\\n }\\n opacityInterp.x = texture2D(otexture, vec2(scalarInterp[0][0] * oscale0 + oshift0, 0.5)).r;\\n if (secondaryGradientMag.x >= 0.0){\\n opacityInterp.x *= computeGradientOpacityFactor(secondaryGradientMag.x, goscale0, goshift0, gomin0, gomax0);\\n }\\n\\n opacityInterp.y = texture2D(otexture, vec2(scalarInterp[0][1] * oscale0 + oshift0, 0.5)).r;\\n if (secondaryGradientMag.y >= 0.0){\\n opacityInterp.y *= computeGradientOpacityFactor(secondaryGradientMag.y, goscale0, goshift0, gomin0, gomax0);\\n }\\n\\n opacityInterp.z = texture2D(otexture, vec2(scalarInterp[0][2] * oscale0 + oshift0, 0.5)).r;\\n if (secondaryGradientMag.z >= 0.0){\\n opacityInterp.z *= computeGradientOpacityFactor(secondaryGradientMag.z, goscale0, goshift0, gomin0, gomax0);\\n }\\n\\n opacityG.xyz = opacityInterp - vec3(opacity,opacity,opacity);\\n // divide by spacing\\n opacityG.xyz /= vSpacing;\\n opacityG.w = length(opacityG.xyz);\\n rotateToViewCoord(opacityG.xyz);\\n if (length(opacityG.xyz) > 0.0) {\\n return vec4(normalize(opacityG.xyz),opacityG.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n\\n #else\\n //if gradient opacity not on but using density gradient\\n vec4 computeDensityNormal(float scalar, vec3 scalarInterp)\\n {\\n vec4 opacityG;\\n float opacity = texture2D(otexture, vec2(scalar * oscale0 + oshift0, 0.5)).r;\\n opacityG.x = texture2D(otexture, vec2(scalarInterp.x * oscale0 + oshift0, 0.5)).r - opacity;\\n opacityG.y = texture2D(otexture, vec2(scalarInterp.y * oscale0 + oshift0, 0.5)).r - opacity;\\n opacityG.z = texture2D(otexture, vec2(scalarInterp.z * oscale0 + oshift0, 0.5)).r - opacity;\\n // divide by spacing\\n opacityG.xyz /= vSpacing;\\n opacityG.w = length(opacityG.xyz);\\n // rotate to View Coords\\n rotateToViewCoord(opacityG.xyz);\\n if (length(opacityG.xyz) > 0.0) {\\n return vec4(normalize(opacityG.xyz),opacityG.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n vec4 computeNormalForDensity(vec3 pos, float scalar, vec3 tstep, out vec3 scalarInterp)\\n {\\n vec4 result;\\n scalarInterp.x = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a;\\n scalarInterp.y = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a;\\n scalarInterp.z = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a;\\n result.x = scalarInterp.x - scalar;\\n result.y = scalarInterp.y - scalar;\\n result.z = scalarInterp.z - scalar;\\n // divide by spacing\\n result.xyz /= vSpacing;\\n result.w = length(result.xyz);\\n // rotate to View Coords\\n rotateToViewCoord(result.xyz);\\n if (length(result.xyz) > 0.0) {\\n return vec4(normalize(result.xyz),result.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n #endif\\n #endif\\n // compute scalar density\\n vec4 computeNormal(vec3 pos, float scalar, vec3 tstep)\\n {\\n vec4 result;\\n result.x = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a - scalar;\\n result.y = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a - scalar;\\n result.z = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a - scalar;\\n // divide by spacing\\n result.xyz /= vSpacing;\\n result.w = length(result.xyz);\\n if (result.w > 0.0){\\n // rotate to View Coords\\n rotateToViewCoord(result.xyz);\\n return vec4(normalize(result.xyz),result.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n#endif\\n\\n#ifdef vtkImageLabelOutlineOn\\nvec3 fragCoordToIndexSpace(vec4 fragCoord) {\\n vec4 pcPos = vec4(\\n (fragCoord.x / vpWidth - vpOffsetX - 0.5) * 2.0,\\n (fragCoord.y / vpHeight - vpOffsetY - 0.5) * 2.0,\\n (fragCoord.z - 0.5) * 2.0,\\n 1.0);\\n\\n vec4 worldCoord = PCWCMatrix * pcPos;\\n vec4 vertex = (worldCoord/worldCoord.w);\\n\\n vec3 index = (vWCtoIDX * vertex).xyz;\\n\\n // half voxel fix for labelmapOutline\\n return (index + vec3(0.5)) / vec3(volumeDimensions);\\n}\\n#endif\\n\\n//=======================================================================\\n// compute the normals and gradient magnitudes for a position\\n// for independent components\\nmat4 computeMat4Normal(vec3 pos, vec4 tValue, vec3 tstep)\\n{\\n mat4 result;\\n vec4 distX = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)) - tValue;\\n vec4 distY = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)) - tValue;\\n vec4 distZ = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)) - tValue;\\n\\n // divide by spacing\\n distX /= vSpacing.x;\\n distY /= vSpacing.y;\\n distZ /= vSpacing.z;\\n\\n mat3 rot;\\n rot[0] = vPlaneNormal0;\\n rot[1] = vPlaneNormal2;\\n rot[2] = vPlaneNormal4;\\n\\n#if !defined(vtkComponent0Proportional)\\n result[0].xyz = vec3(distX.r, distY.r, distZ.r);\\n result[0].a = length(result[0].xyz);\\n result[0].xyz *= rot;\\n if (result[0].w > 0.0)\\n {\\n result[0].xyz /= result[0].w;\\n }\\n#endif\\n\\n// optionally compute the 2nd component\\n#if vtkNumComponents >= 2 && !defined(vtkComponent1Proportional)\\n result[1].xyz = vec3(distX.g, distY.g, distZ.g);\\n result[1].a = length(result[1].xyz);\\n result[1].xyz *= rot;\\n if (result[1].w > 0.0)\\n {\\n result[1].xyz /= result[1].w;\\n }\\n#endif\\n\\n// optionally compute the 3rd component\\n#if vtkNumComponents >= 3 && !defined(vtkComponent2Proportional)\\n result[2].xyz = vec3(distX.b, distY.b, distZ.b);\\n result[2].a = length(result[2].xyz);\\n result[2].xyz *= rot;\\n if (result[2].w > 0.0)\\n {\\n result[2].xyz /= result[2].w;\\n }\\n#endif\\n\\n// optionally compute the 4th component\\n#if vtkNumComponents >= 4 && !defined(vtkComponent3Proportional)\\n result[3].xyz = vec3(distX.a, distY.a, distZ.a);\\n result[3].a = length(result[3].xyz);\\n result[3].xyz *= rot;\\n if (result[3].w > 0.0)\\n {\\n result[3].xyz /= result[3].w;\\n }\\n#endif\\n\\n return result;\\n}\\n\\n//=======================================================================\\n// global shadow - secondary ray\\n#if defined(VolumeShadowOn) || defined(localAmbientOcclusionOn)\\nfloat random()\\n{\\n float rand = fract(sin(dot(gl_FragCoord.xy,vec2(12.9898,78.233)))*43758.5453123);\\n float jitter=texture2D(jtexture,gl_FragCoord.xy/32.).r;\\n uint pcg_state = floatBitsToUint(jitter);\\n uint state = pcg_state;\\n pcg_state = pcg_state * uint(747796405) + uint(2891336453);\\n uint word = ((state >> ((state >> uint(28)) + uint(4))) ^ state) * uint(277803737);\\n return (float((((word >> uint(22)) ^ word) >> 1 ))/float(2147483647) + rand)/2.0;\\n}\\n#endif\\n\\n#ifdef VolumeShadowOn\\n// henyey greenstein phase function\\nfloat phase_function(float cos_angle)\\n{\\n // divide by 2.0 instead of 4pi to increase intensity\\n return ((1.0-anisotropy2)/pow(1.0+anisotropy2-2.0*anisotropy*cos_angle, 1.5))/2.0;\\n}\\n\\n// Computes the intersection between a ray and a box\\nstruct Hit\\n{\\n float tmin;\\n float tmax;\\n};\\n\\nstruct Ray\\n{\\n vec3 origin;\\n vec3 dir;\\n vec3 invDir;\\n};\\n\\nbool BBoxIntersect(vec3 boundMin, vec3 boundMax, const Ray r, out Hit hit)\\n{\\n vec3 tbot = r.invDir * (boundMin - r.origin);\\n vec3 ttop = r.invDir * (boundMax - r.origin);\\n vec3 tmin = min(ttop, tbot);\\n vec3 tmax = max(ttop, tbot);\\n vec2 t = max(tmin.xx, tmin.yz);\\n float t0 = max(t.x, t.y);\\n t = min(tmax.xx, tmax.yz);\\n float t1 = min(t.x, t.y);\\n hit.tmin = t0;\\n hit.tmax = t1;\\n return t1 > max(t0,0.0);\\n}\\n\\n// As BBoxIntersect requires the inverse of the ray coords,\\n// this function is used to avoid numerical issues\\nvoid safe_0_vector(inout Ray ray)\\n{\\n if(abs(ray.dir.x) < EPSILON) ray.dir.x = sign(ray.dir.x) * EPSILON;\\n if(abs(ray.dir.y) < EPSILON) ray.dir.y = sign(ray.dir.y) * EPSILON;\\n if(abs(ray.dir.z) < EPSILON) ray.dir.z = sign(ray.dir.z) * EPSILON;\\n}\\n\\nfloat volume_shadow(vec3 posIS, vec3 lightDirNormIS)\\n{\\n float shadow = 1.0;\\n float opacity = 0.0;\\n\\n // modify sample distance with a random number between 1.5 and 3.0\\n float sampleDistanceISVS_jitter = sampleDistanceISVS * mix(1.5, 3.0, random());\\n float opacityPrev = texture2D(otexture, vec2(getTextureValue(posIS).r * oscale0 + oshift0, 0.5)).r;\\n\\n // in case the first sample near surface has a very tiled light ray, we need to offset start position\\n posIS += sampleDistanceISVS_jitter * lightDirNormIS;\\n\\n // compute the start and end points for the ray\\n Ray ray;\\n Hit hit;\\n ray.origin = posIS;\\n ray.dir = lightDirNormIS;\\n safe_0_vector(ray);\\n ray.invDir = 1.0/ray.dir;\\n\\n if(!BBoxIntersect(vec3(0.0),vec3(1.0), ray, hit))\\n {\\n return 1.0;\\n }\\n float maxdist = hit.tmax;\\n\\n // interpolate shadow ray length between: 1 unit of sample distance in IS to SQRT3, based on globalIlluminationReach\\n float maxgi = mix(sampleDistanceISVS_jitter,SQRT3,giReach);\\n maxdist = min(maxdist,maxgi);\\n if(maxdist < EPSILON) {\\n return 1.0;\\n }\\n\\n // support gradient opacity\\n #ifdef vtkGradientOpacityOn\\n vec4 normal;\\n #endif\\n\\n float current_dist = 0.0;\\n float current_step = length(sampleDistanceISVS_jitter * lightDirNormIS);\\n float clamped_step = 0.0;\\n\\n vec4 scalar = vec4(0.0);\\n while(current_dist < maxdist)\\n {\\n scalar = getTextureValue(posIS);\\n opacity = texture2D(otexture, vec2(scalar.r * oscale0 + oshift0, 0.5)).r;\\n #ifdef vtkGradientOpacityOn\\n normal = computeNormal(posIS, scalar.a, vec3(1.0/vec3(volumeDimensions)));\\n opacity *= computeGradientOpacityFactor(normal.w, goscale0, goshift0, gomin0, gomax0);\\n #endif\\n shadow *= 1.0 - opacity;\\n\\n // optimization: early termination\\n if (shadow < EPSILON){\\n return 0.0;\\n }\\n\\n clamped_step = min(maxdist - current_dist, current_step);\\n posIS += clamped_step * lightDirNormIS;\\n current_dist += current_step;\\n }\\n\\n return shadow;\\n}\\n\\nvec3 applyShadowRay(vec3 tColor, vec3 posIS, vec3 viewDirectionVC)\\n{\\n vec3 vertLight = vec3(0.0);\\n vec3 secondary_contrib = vec3(0.0);\\n // here we assume only positional light, no effect of cones\\n for (int i = 0; i < lightNum; i++)\\n {\\n #if(vtkLightComplexity==3)\\n if (lightPositional[i] == 1){\\n vertLight = lightPositionVC[i] - IStoVC(posIS);\\n }else{\\n vertLight = - lightDirectionVC[i];\\n }\\n #else\\n vertLight = - lightDirectionVC[i];\\n #endif\\n // here we assume achromatic light, only intensity\\n float dDotL = dot(viewDirectionVC, normalize(vertLight));\\n // isotropic scatter returns 0.5 instead of 1/4pi to increase intensity\\n float phase_attenuation = 0.5;\\n if (abs(anisotropy) > EPSILON){\\n phase_attenuation = phase_function(dDotL);\\n }\\n float vol_shadow = volume_shadow(posIS, normalize(rotateToIDX(vertLight)));\\n secondary_contrib += tColor * vDiffuse * lightColor[i] * vol_shadow * phase_attenuation;\\n secondary_contrib += tColor * vAmbient;\\n }\\n return secondary_contrib;\\n}\\n#endif\\n\\n//=======================================================================\\n// local ambient occlusion\\n#ifdef localAmbientOcclusionOn\\nvec3 sample_direction_uniform(int i)\\n{\\n float rand = random() * 0.5;\\n float theta = PI2 * (kernelSample[i][0] + rand);\\n float phi = acos(2.0 * (kernelSample[i][1] + rand) -1.0) / 2.5;\\n return normalize(vec3(cos(theta)*sin(phi), sin(theta)*sin(phi), cos(phi)));\\n}\\n\\n// return a matrix that transform startDir into z axis; startDir should be normalized\\nmat3 zBaseRotationalMatrix(vec3 startDir){\\n vec3 axis = cross(startDir, vec3(0.0,0.0,1.0));\\n float cosA = startDir.z;\\n float k = 1.0 / (1.0 + cosA);\\n mat3 matrix = mat3((axis.x * axis.x * k) + cosA, (axis.y * axis.x * k) - axis.z, (axis.z * axis.x * k) + axis.y,\\n (axis.x * axis.y * k) + axis.z, (axis.y * axis.y * k) + cosA, (axis.z * axis.y * k) - axis.x,\\n (axis.x * axis.z * k) - axis.y, (axis.y * axis.z * k) + axis.x, (axis.z * axis.z * k) + cosA);\\n return matrix;\\n}\\n\\nfloat computeLAO(vec3 posIS, float op, vec3 lightDir, vec4 normal){\\n // apply LAO only at selected locations, otherwise return full brightness\\n if (normal.w > 0.0 && op > 0.05){\\n float total_transmittance = 0.0;\\n mat3 inverseRotateBasis = inverse(zBaseRotationalMatrix(normalize(-normal.xyz)));\\n vec3 currPos, randomDirStep;\\n float weight, transmittance, opacity;\\n for (int i = 0; i < kernelSize; i++)\\n {\\n randomDirStep = inverseRotateBasis * sample_direction_uniform(i) * sampleDistanceIS;\\n weight = 1.0 - dot(normalize(lightDir), normalize(randomDirStep));\\n currPos = posIS;\\n transmittance = 1.0;\\n for (int j = 0; j < kernelRadius ; j++){\\n currPos += randomDirStep;\\n // check if it's at clipping plane, if so return full brightness\\n if (all(greaterThan(currPos, vec3(EPSILON))) && all(lessThan(currPos,vec3(1.0-EPSILON)))){\\n opacity = texture2D(otexture, vec2(getTextureValue(currPos).r * oscale0 + oshift0, 0.5)).r;\\n #ifdef vtkGradientOpacityOn\\n opacity *= computeGradientOpacityFactor(normal.w, goscale0, goshift0, gomin0, gomax0);\\n #endif\\n transmittance *= 1.0 - opacity;\\n }\\n else{\\n break;\\n }\\n }\\n total_transmittance += transmittance / float(kernelRadius) * weight;\\n\\n // early termination if fully translucent\\n if (total_transmittance > 1.0 - EPSILON){\\n return 1.0;\\n }\\n }\\n // average transmittance and reduce variance\\n return clamp(total_transmittance / float(kernelSize), 0.3, 1.0);\\n } else {\\n return 1.0;\\n }\\n}\\n#endif\\n\\n//=======================================================================\\n// surface light contribution\\n#if vtkLightComplexity > 0\\n void applyLighting(inout vec3 tColor, vec4 normal)\\n {\\n vec3 diffuse = vec3(0.0, 0.0, 0.0);\\n vec3 specular = vec3(0.0, 0.0, 0.0);\\n float df, sf = 0.0;\\n for (int i = 0; i < lightNum; i++){\\n df = abs(dot(normal.rgb, -lightDirectionVC[i]));\\n diffuse += df * lightColor[i];\\n sf = pow( abs(dot(lightHalfAngleVC[i],normal.rgb)), vSpecularPower);\\n specular += sf * lightColor[i];\\n }\\n tColor.rgb = tColor.rgb*(diffuse*vDiffuse + vAmbient) + specular*vSpecular;\\n }\\n #ifdef SurfaceShadowOn\\n #if vtkLightComplexity < 3\\n vec3 applyLightingDirectional(vec3 posIS, vec4 tColor, vec4 normal)\\n {\\n // everything in VC\\n vec3 diffuse = vec3(0.0);\\n vec3 specular = vec3(0.0);\\n #ifdef localAmbientOcclusionOn\\n vec3 ambient = vec3(0.0);\\n #endif\\n vec3 vertLightDirection;\\n for (int i = 0; i < lightNum; i++){\\n float ndotL,vdotR;\\n vertLightDirection = lightDirectionVC[i];\\n ndotL = dot(normal.xyz, vertLightDirection);\\n if (ndotL < 0.0 && twoSidedLighting)\\n {\\n ndotL = -ndotL;\\n }\\n if (ndotL > 0.0)\\n {\\n diffuse += ndotL * lightColor[i];\\n //specular\\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\\n if (vdotR > 0.0)\\n {\\n specular += pow(vdotR, vSpecularPower) * lightColor[i];\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\\n #endif\\n }\\n #ifdef localAmbientOcclusionOn\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient * ambient) + specular*vSpecular;\\n #else\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient) + specular*vSpecular;\\n #endif\\n }\\n #else\\n vec3 applyLightingPositional(vec3 posIS, vec4 tColor, vec4 normal, vec3 posVC)\\n {\\n // everything in VC\\n vec3 diffuse = vec3(0.0);\\n vec3 specular = vec3(0.0);\\n #ifdef localAmbientOcclusionOn\\n vec3 ambient = vec3(0.0);\\n #endif\\n vec3 vertLightDirection;\\n for (int i = 0; i < lightNum; i++){\\n float distance,attenuation,ndotL,vdotR;\\n vec3 lightDir;\\n if (lightPositional[i] == 1){\\n lightDir = lightDirectionVC[i];\\n vertLightDirection = posVC - lightPositionVC[i];\\n distance = length(vertLightDirection);\\n vertLightDirection = normalize(vertLightDirection);\\n attenuation = 1.0 / (lightAttenuation[i].x\\n + lightAttenuation[i].y * distance\\n + lightAttenuation[i].z * distance * distance);\\n // per OpenGL standard cone angle is 90 or less for a spot light\\n if (lightConeAngle[i] <= 90.0){\\n float coneDot = dot(vertLightDirection, lightDir);\\n if (coneDot >= cos(radians(lightConeAngle[i]))){ // if inside cone\\n attenuation = attenuation * pow(coneDot, lightExponent[i]);\\n }\\n else {\\n attenuation = 0.0;\\n }\\n }\\n ndotL = dot(normal.xyz, vertLightDirection);\\n if (ndotL < 0.0 && twoSidedLighting)\\n {\\n ndotL = -ndotL;\\n }\\n if (ndotL > 0.0)\\n {\\n diffuse += ndotL * attenuation * lightColor[i];\\n //specular\\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\\n if (vdotR > 0.0)\\n {\\n specular += pow(vdotR, vSpecularPower) * attenuation * lightColor[i];\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\\n #endif\\n } else {\\n vertLightDirection = lightDirectionVC[i];\\n ndotL = dot(normal.xyz, vertLightDirection);\\n if (ndotL < 0.0 && twoSidedLighting)\\n {\\n ndotL = -ndotL;\\n }\\n if (ndotL > 0.0)\\n {\\n diffuse += ndotL * lightColor[i];\\n //specular\\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\\n if (vdotR > 0.0)\\n {\\n specular += pow(vdotR, vSpecularPower) * lightColor[i];\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\\n #endif\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient * ambient) + specular*vSpecular;\\n #else\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient) + specular*vSpecular;\\n #endif\\n }\\n #endif\\n #endif\\n#endif\\n\\n//=======================================================================\\n// Given a texture value compute the color and opacity\\n//\\nvec4 getColorForValue(vec4 tValue, vec3 posIS, vec3 tstep)\\n{\\n#ifdef vtkImageLabelOutlineOn\\n vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord); // pos in texture space\\n vec4 centerValue = getTextureValue(centerPosIS);\\n bool pixelOnBorder = false;\\n vec4 tColor = texture2D(ctexture, vec2(centerValue.r * cscale0 + cshift0, 0.5));\\n\\n // Get alpha of segment from opacity function.\\n tColor.a = texture2D(otexture, vec2(centerValue.r * oscale0 + oshift0, 0.5)).r;\\n\\n // Only perform outline check on fragments rendering voxels that aren't invisible.\\n // Saves a bunch of needless checks on the background.\\n // TODO define epsilon when building shader?\\n if (float(tColor.a) > 0.01) {\\n for (int i = -outlineThickness; i <= outlineThickness; i++) {\\n for (int j = -outlineThickness; j <= outlineThickness; j++) {\\n if (i == 0 || j == 0) {\\n continue;\\n }\\n\\n vec4 neighborPixelCoord = vec4(gl_FragCoord.x + float(i),\\n gl_FragCoord.y + float(j),\\n gl_FragCoord.z, gl_FragCoord.w);\\n\\n vec3 neighborPosIS = fragCoordToIndexSpace(neighborPixelCoord);\\n vec4 value = getTextureValue(neighborPosIS);\\n\\n // If any of my neighbours are not the same value as I\\n // am, this means I am on the border of the segment.\\n // We can break the loops\\n if (any(notEqual(value, centerValue))) {\\n pixelOnBorder = true;\\n break;\\n }\\n }\\n\\n if (pixelOnBorder == true) {\\n break;\\n }\\n }\\n\\n // If I am on the border, I am displayed at full opacity\\n if (pixelOnBorder == true) {\\n tColor.a = outlineOpacity;\\n }\\n }\\n\\n#else\\n // compute the normal and gradient magnitude if needed\\n // We compute it as a vec4 if possible otherwise a mat4\\n //\\n vec4 goFactor = vec4(1.0,1.0,1.0,1.0);\\n\\n // compute the normal vectors as needed\\n #if (vtkLightComplexity > 0) || defined(vtkGradientOpacityOn)\\n #if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\\n mat4 normalMat = computeMat4Normal(posIS, tValue, tstep);\\n #if !defined(vtkComponent0Proportional)\\n vec4 normal0 = normalMat[0];\\n #endif\\n #if !defined(vtkComponent1Proportional)\\n vec4 normal1 = normalMat[1];\\n #endif\\n #if vtkNumComponents > 2\\n #if !defined(vtkComponent2Proportional)\\n vec4 normal2 = normalMat[2];\\n #endif\\n #if vtkNumComponents > 3\\n #if !defined(vtkComponent3Proportional)\\n vec4 normal3 = normalMat[3];\\n #endif\\n #endif\\n #endif\\n #else\\n vec4 normalLight;\\n #ifdef vtkComputeNormalFromOpacity\\n #ifdef vtkGradientOpacityOn\\n mat3 scalarInterp;\\n vec3 secondaryGradientMag;\\n vec4 normal0 = computeNormalForDensity(posIS, tValue.a, tstep, scalarInterp, secondaryGradientMag);\\n normalLight = computeDensityNormal(tValue.a, normal0.w, scalarInterp,secondaryGradientMag);\\n if (length(normalLight) == 0.0){\\n normalLight = normal0;\\n }\\n #else\\n vec3 scalarInterp;\\n vec4 normal0 = computeNormalForDensity(posIS, tValue.a, tstep, scalarInterp);\\n if (length(normal0)>0.0){\\n normalLight = computeDensityNormal(tValue.a,scalarInterp);\\n if (length(normalLight)==0.0){\\n normalLight = normal0;\\n }\\n }\\n #endif\\n #else\\n vec4 normal0 = computeNormal(posIS, tValue.a, tstep);\\n normalLight = normal0;\\n #endif\\n #endif\\n #endif\\n\\n // compute gradient opacity factors as needed\\n #if defined(vtkGradientOpacityOn)\\n #if !defined(vtkComponent0Proportional)\\n goFactor.x =\\n computeGradientOpacityFactor(normal0.a, goscale0, goshift0, gomin0, gomax0);\\n #endif\\n #if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\\n #if !defined(vtkComponent1Proportional)\\n goFactor.y =\\n computeGradientOpacityFactor(normal1.a, goscale1, goshift1, gomin1, gomax1);\\n #endif\\n #if vtkNumComponents > 2\\n #if !defined(vtkComponent2Proportional)\\n goFactor.z =\\n computeGradientOpacityFactor(normal2.a, goscale2, goshift2, gomin2, gomax2);\\n #endif\\n #if vtkNumComponents > 3\\n #if !defined(vtkComponent3Proportional)\\n goFactor.w =\\n computeGradientOpacityFactor(normal3.a, goscale3, goshift3, gomin3, gomax3);\\n #endif\\n #endif\\n #endif\\n #endif\\n #endif\\n\\n // single component is always independent\\n #if vtkNumComponents == 1\\n vec4 tColor = texture2D(ctexture, vec2(tValue.r * cscale0 + cshift0, 0.5));\\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\\n if (tColor.a < EPSILON){\\n return vec4(0.0);\\n }\\n #endif\\n\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\\n vec4 tColor = mix0*texture2D(ctexture, vec2(tValue.r * cscale0 + cshift0, height0));\\n #if !defined(vtkComponent0Proportional)\\n tColor.a = goFactor.x*mix0*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, height0)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, height0)).r;\\n tColor *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix0));\\n #endif\\n\\n vec3 tColor1 = mix1*texture2D(ctexture, vec2(tValue.g * cscale1 + cshift1, height1)).rgb;\\n #if !defined(vtkComponent1Proportional)\\n tColor.a += goFactor.y*mix1*texture2D(otexture, vec2(tValue.g * oscale1 + oshift1, height1)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.g * oscale1 + oshift1, height1)).r;\\n tColor1 *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix1));\\n #endif\\n\\n #if vtkNumComponents >= 3\\n vec3 tColor2 = mix2*texture2D(ctexture, vec2(tValue.b * cscale2 + cshift2, height2)).rgb;\\n #if !defined(vtkComponent2Proportional)\\n tColor.a += goFactor.z*mix2*texture2D(otexture, vec2(tValue.b * oscale2 + oshift2, height2)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.b * oscale2 + oshift2, height2)).r;\\n tColor2 *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix2));\\n #endif\\n\\n #if vtkNumComponents >= 4\\n vec3 tColor3 = mix3*texture2D(ctexture, vec2(tValue.a * cscale3 + cshift3, height3)).rgb;\\n #if !defined(vtkComponent3Proportional)\\n tColor.a += goFactor.w*mix3*texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, height3)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, height3)).r;\\n tColor3 *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix3));\\n #endif\\n #endif\\n #endif\\n #else // then not independent\\n\\n #if vtkNumComponents == 2\\n float lum = tValue.r * cscale0 + cshift0;\\n float alpha = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale1 + oshift1, 0.5)).r;\\n vec4 tColor = vec4(lum, lum, lum, alpha);\\n #endif\\n #if vtkNumComponents == 3\\n vec4 tColor;\\n tColor.r = tValue.r * cscale0 + cshift0;\\n tColor.g = tValue.g * cscale1 + cshift1;\\n tColor.b = tValue.b * cscale2 + cshift2;\\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale0 + oshift0, 0.5)).r;\\n #endif\\n #if vtkNumComponents == 4\\n vec4 tColor;\\n tColor.r = tValue.r * cscale0 + cshift0;\\n tColor.g = tValue.g * cscale1 + cshift1;\\n tColor.b = tValue.b * cscale2 + cshift2;\\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, 0.5)).r;\\n #endif\\n #endif // dependent\\n\\n // apply lighting if requested as appropriate\\n #if vtkLightComplexity > 0\\n #if !defined(vtkComponent0Proportional)\\n #if vtkNumComponents == 1\\n #ifdef SurfaceShadowOn\\n #if vtkLightComplexity < 3\\n vec3 tColorS = applyLightingDirectional(posIS, tColor, normalLight);\\n #else\\n vec3 tColorS = applyLightingPositional(posIS, tColor, normalLight, IStoVC(posIS));\\n #endif\\n #endif\\n\\n #ifdef VolumeShadowOn\\n vec3 tColorVS = applyShadowRay(tColor.rgb, posIS, rayDirVC);\\n #ifdef SurfaceShadowOn\\n float vol_coef = volumetricScatteringBlending * (1.0 - tColor.a / 2.0) * (1.0 - atan(normalLight.w) * INV4PI);\\n tColor.rgb = (1.0-vol_coef) * tColorS + vol_coef * tColorVS;\\n #else\\n tColor.rgb = tColorVS;\\n #endif\\n #else\\n tColor.rgb = tColorS;\\n #endif\\n\\n #else\\n applyLighting(tColor.rgb, normal0);\\n #endif\\n #endif\\n\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\\n #if !defined(vtkComponent1Proportional)\\n applyLighting(tColor1, normal1);\\n #endif\\n #if vtkNumComponents >= 3\\n #if !defined(vtkComponent2Proportional)\\n applyLighting(tColor2, normal2);\\n #endif\\n #if vtkNumComponents >= 4\\n #if !defined(vtkComponent3Proportional)\\n applyLighting(tColor3, normal3);\\n #endif\\n #endif\\n #endif\\n #endif\\n #endif\\n\\n// perform final independent blend as needed\\n#if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\\n tColor.rgb += tColor1;\\n#if vtkNumComponents >= 3\\n tColor.rgb += tColor2;\\n#if vtkNumComponents >= 4\\n tColor.rgb += tColor3;\\n#endif\\n#endif\\n#endif\\n\\n#endif\\nreturn tColor;\\n}\\n\\nbool valueWithinScalarRange(vec4 val, vec4 min, vec4 max) {\\n bool withinRange = false;\\n #if vtkNumComponents == 1\\n if (val.r >= min.r && val.r <= max.r) {\\n withinRange = true;\\n }\\n #endif\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents == 2\\n if (val.r >= min.r && val.r <= max.r &&\\n val.g >= min.g && val.g <= max.g) {\\n withinRange = true;\\n }\\n #endif\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 3\\n if (all(greaterThanEqual(val, ipScalarRangeMin)) &&\\n all(lessThanEqual(val, ipScalarRangeMax))) {\\n withinRange = true;\\n }\\n #endif\\n return withinRange;\\n}\\n\\n//=======================================================================\\n// Apply the specified blend mode operation along the ray's path.\\n//\\nvoid applyBlend(vec3 posIS, vec3 endIS, vec3 tdims)\\n{\\n vec3 tstep = 1.0/tdims;\\n\\n // start slightly inside and apply some jitter\\n vec3 delta = endIS - posIS;\\n vec3 stepIS = normalize(delta)*sampleDistanceIS;\\n float raySteps = length(delta)/sampleDistanceIS;\\n\\n // avoid 0.0 jitter\\n float jitter = 0.01 + 0.99*texture2D(jtexture, gl_FragCoord.xy/32.0).r;\\n float stepsTraveled = jitter;\\n\\n // local vars for the loop\\n vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\\n vec4 tValue;\\n vec4 tColor;\\n\\n // if we have less than one step then pick the middle point\\n // as our value\\n // if (raySteps <= 1.0)\\n // {\\n // posIS = (posIS + endIS)*0.5;\\n // }\\n\\n // Perform initial step at the volume boundary\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n #if vtkBlendMode == 0 // COMPOSITE_BLEND\\n // now map through opacity and color\\n tColor = getColorForValue(tValue, posIS, tstep);\\n\\n // handle very thin volumes\\n if (raySteps <= 1.0)\\n {\\n tColor.a = 1.0 - pow(1.0 - tColor.a, raySteps);\\n gl_FragData[0] = tColor;\\n return;\\n }\\n\\n tColor.a = 1.0 - pow(1.0 - tColor.a, jitter);\\n color = vec4(tColor.rgb*tColor.a, tColor.a);\\n posIS += (jitter*stepIS);\\n\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // now map through opacity and color\\n tColor = getColorForValue(tValue, posIS, tstep);\\n\\n float mix = (1.0 - color.a);\\n\\n // this line should not be needed but nvidia seems to not handle\\n // the break correctly on windows/chrome 58 angle\\n //mix = mix * sign(max(raySteps - stepsTraveled - 1.0, 0.0));\\n\\n color = color + vec4(tColor.rgb*tColor.a, tColor.a)*mix;\\n stepsTraveled++;\\n posIS += stepIS;\\n if (color.a > 0.99) { color.a = 1.0; break; }\\n }\\n\\n if (color.a < 0.99 && (raySteps - stepsTraveled) > 0.0)\\n {\\n posIS = endIS;\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // now map through opacity and color\\n tColor = getColorForValue(tValue, posIS, tstep);\\n tColor.a = 1.0 - pow(1.0 - tColor.a, raySteps - stepsTraveled);\\n\\n float mix = (1.0 - color.a);\\n color = color + vec4(tColor.rgb*tColor.a, tColor.a)*mix;\\n }\\n\\n gl_FragData[0] = vec4(color.rgb/color.a, color.a);\\n #endif\\n #if vtkBlendMode == 1 || vtkBlendMode == 2\\n // MAXIMUM_INTENSITY_BLEND || MINIMUM_INTENSITY_BLEND\\n // Find maximum/minimum intensity along the ray.\\n\\n // Define the operation we will use (min or max)\\n #if vtkBlendMode == 1\\n #define OP max\\n #else\\n #define OP min\\n #endif\\n\\n // If the clipping range is shorter than the sample distance\\n // we can skip the sampling loop along the ray.\\n if (raySteps <= 1.0)\\n {\\n gl_FragData[0] = getColorForValue(tValue, posIS, tstep);\\n return;\\n }\\n\\n vec4 value = tValue;\\n posIS += (jitter*stepIS);\\n\\n // Sample along the ray until MaximumSamplesValue,\\n // ending slightly inside the total distance\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n // If we have reached the last step, break\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // Update the maximum value if necessary\\n value = OP(tValue, value);\\n\\n // Otherwise, continue along the ray\\n stepsTraveled++;\\n posIS += stepIS;\\n }\\n\\n // Perform the last step along the ray using the\\n // residual distance\\n posIS = endIS;\\n tValue = getTextureValue(posIS);\\n value = OP(tValue, value);\\n\\n // Now map through opacity and color\\n gl_FragData[0] = getColorForValue(value, posIS, tstep);\\n #endif\\n #if vtkBlendMode == 3 || vtkBlendMode == 4 //AVERAGE_INTENSITY_BLEND || ADDITIVE_BLEND\\n vec4 sum = vec4(0.);\\n\\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\\n sum += tValue;\\n }\\n\\n if (raySteps <= 1.0) {\\n gl_FragData[0] = getColorForValue(sum, posIS, tstep);\\n return;\\n }\\n\\n posIS += (jitter*stepIS);\\n\\n // Sample along the ray until MaximumSamplesValue,\\n // ending slightly inside the total distance\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n // If we have reached the last step, break\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // One can control the scalar range by setting the AverageIPScalarRange to disregard scalar values, not in the range of interest, from the average computation.\\n // Notes:\\n // - We are comparing all values in the texture to see if any of them\\n // are outside of the scalar range. In the future we might want to allow\\n // scalar ranges for each component.\\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\\n // Sum the values across each step in the path\\n sum += tValue;\\n }\\n stepsTraveled++;\\n posIS += stepIS;\\n }\\n\\n // Perform the last step along the ray using the\\n // residual distance\\n posIS = endIS;\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // One can control the scalar range by setting the IPScalarRange to disregard scalar values, not in the range of interest, from the average computation\\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\\n sum += tValue;\\n\\n stepsTraveled++;\\n }\\n\\n #if vtkBlendMode == 3 // Average\\n sum /= vec4(stepsTraveled, stepsTraveled, stepsTraveled, 1.0);\\n #endif\\n\\n gl_FragData[0] = getColorForValue(sum, posIS, tstep);\\n #endif\\n #if vtkBlendMode == 5 // RADON\\n float normalizedRayIntensity = 1.0;\\n\\n // handle very thin volumes\\n if (raySteps <= 1.0)\\n {\\n tValue = getTextureValue(posIS);\\n normalizedRayIntensity = normalizedRayIntensity - sampleDistance*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\\n gl_FragData[0] = texture2D(ctexture, vec2(normalizedRayIntensity, 0.5));\\n return;\\n }\\n\\n posIS += (jitter*stepIS);\\n\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar value\\n tValue = getTextureValue(posIS);\\n\\n // Convert scalar value to normalizedRayIntensity coefficient and accumulate normalizedRayIntensity\\n normalizedRayIntensity = normalizedRayIntensity - sampleDistance*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\\n\\n posIS += stepIS;\\n stepsTraveled++;\\n }\\n\\n // map normalizedRayIntensity to color\\n gl_FragData[0] = texture2D(ctexture, vec2(normalizedRayIntensity , 0.5));\\n\\n #endif\\n}\\n\\n//=======================================================================\\n// Compute a new start and end point for a given ray based\\n// on the provided bounded clipping plane (aka a rectangle)\\nvoid getRayPointIntersectionBounds(\\n vec3 rayPos, vec3 rayDir,\\n vec3 planeDir, float planeDist,\\n inout vec2 tbounds, vec3 vPlaneX, vec3 vPlaneY,\\n float vSize1, float vSize2)\\n{\\n float result = dot(rayDir, planeDir);\\n if (abs(result) < 1e-6)\\n {\\n return;\\n }\\n result = -1.0 * (dot(rayPos, planeDir) + planeDist) / result;\\n vec3 xposVC = rayPos + rayDir*result;\\n vec3 vxpos = xposVC - vOriginVC;\\n vec2 vpos = vec2(\\n dot(vxpos, vPlaneX),\\n dot(vxpos, vPlaneY));\\n\\n // on some apple nvidia systems this does not work\\n // if (vpos.x < 0.0 || vpos.x > vSize1 ||\\n // vpos.y < 0.0 || vpos.y > vSize2)\\n // even just\\n // if (vpos.x < 0.0 || vpos.y < 0.0)\\n // fails\\n // so instead we compute a value that represents in and out\\n //and then compute the return using this value\\n float xcheck = max(0.0, vpos.x * (vpos.x - vSize1)); // 0 means in bounds\\n float check = sign(max(xcheck, vpos.y * (vpos.y - vSize2))); // 0 means in bounds, 1 = out\\n\\n tbounds = mix(\\n vec2(min(tbounds.x, result), max(tbounds.y, result)), // in value\\n tbounds, // out value\\n check); // 0 in 1 out\\n}\\n\\n//=======================================================================\\n// given a\\n// - ray direction (rayDir)\\n// - starting point (vertexVCVSOutput)\\n// - bounding planes of the volume\\n// - optionally depth buffer values\\n// - far clipping plane\\n// compute the start/end distances of the ray we need to cast\\nvec2 computeRayDistances(vec3 rayDir, vec3 tdims)\\n{\\n vec2 dists = vec2(100.0*camFar, -1.0);\\n\\n vec3 vSize = vSpacing*tdims;\\n\\n // all this is in View Coordinates\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal0, vPlaneDistance0, dists, vPlaneNormal2, vPlaneNormal4,\\n vSize.y, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal1, vPlaneDistance1, dists, vPlaneNormal2, vPlaneNormal4,\\n vSize.y, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal2, vPlaneDistance2, dists, vPlaneNormal0, vPlaneNormal4,\\n vSize.x, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal3, vPlaneDistance3, dists, vPlaneNormal0, vPlaneNormal4,\\n vSize.x, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal4, vPlaneDistance4, dists, vPlaneNormal0, vPlaneNormal2,\\n vSize.x, vSize.y);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal5, vPlaneDistance5, dists, vPlaneNormal0, vPlaneNormal2,\\n vSize.x, vSize.y);\\n\\n //VTK::ClipPlane::Impl\\n\\n // do not go behind front clipping plane\\n dists.x = max(0.0,dists.x);\\n\\n // do not go PAST far clipping plane\\n float farDist = -camThick/rayDir.z;\\n dists.y = min(farDist,dists.y);\\n\\n // Do not go past the zbuffer value if set\\n // This is used for intermixing opaque geometry\\n //VTK::ZBuffer::Impl\\n\\n return dists;\\n}\\n\\n//=======================================================================\\n// Compute the index space starting position (pos) and end\\n// position\\n//\\nvoid computeIndexSpaceValues(out vec3 pos, out vec3 endPos, vec3 rayDir, vec2 dists)\\n{\\n // compute starting and ending values in volume space\\n pos = vertexVCVSOutput + dists.x*rayDir;\\n pos = pos - vOriginVC;\\n // convert to volume basis and origin\\n pos = vec3(\\n dot(pos, vPlaneNormal0),\\n dot(pos, vPlaneNormal2),\\n dot(pos, vPlaneNormal4));\\n\\n endPos = vertexVCVSOutput + dists.y*rayDir;\\n endPos = endPos - vOriginVC;\\n endPos = vec3(\\n dot(endPos, vPlaneNormal0),\\n dot(endPos, vPlaneNormal2),\\n dot(endPos, vPlaneNormal4));\\n\\n float delta = length(endPos - pos);\\n\\n pos *= vVCToIJK;\\n endPos *= vVCToIJK;\\n\\n float delta2 = length(endPos - pos);\\n sampleDistanceIS = sampleDistance*delta2/delta;\\n #ifdef VolumeShadowOn\\n sampleDistanceISVS = sampleDistanceIS * volumeShadowSamplingDistFactor;\\n #endif\\n}\\n\\nvoid main()\\n{\\n\\n if (cameraParallel == 1)\\n {\\n // Camera is parallel, so the rayDir is just the direction of the camera.\\n rayDirVC = vec3(0.0, 0.0, -1.0);\\n } else {\\n // camera is at 0,0,0 so rayDir for perspective is just the vc coord\\n rayDirVC = normalize(vertexVCVSOutput);\\n }\\n\\n vec3 tdims = vec3(volumeDimensions);\\n\\n // compute the start and end points for the ray\\n vec2 rayStartEndDistancesVC = computeRayDistances(rayDirVC, tdims);\\n\\n // do we need to composite? aka does the ray have any length\\n // If not, bail out early\\n if (rayStartEndDistancesVC.y <= rayStartEndDistancesVC.x)\\n {\\n discard;\\n }\\n\\n // IS = Index Space\\n vec3 posIS;\\n vec3 endIS;\\n computeIndexSpaceValues(posIS, endIS, rayDirVC, rayStartEndDistancesVC);\\n\\n // Perform the blending operation along the ray\\n applyBlend(posIS, endIS, tdims);\\n}\\n\";\n\nexport { vtkVolumeFS as v };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1, obj, setGet, chain, vtkWarningMacro as vtkWarningMacro$1, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport { mat4, mat3, vec3 } from 'gl-matrix';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport vtkHelper from './Helper.js';\nimport { u as uninitializeBounds } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkVertexArrayObject from './VertexArrayObject.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { Wrap, Filter } from './Texture/Constants.js';\nimport { InterpolationType, OpacityMode } from '../Core/VolumeProperty/Constants.js';\nimport { BlendMode } from '../Core/VolumeMapper/Constants.js';\nimport { v as vtkVolumeVS } from './glsl/vtkVolumeVS.glsl.js';\nimport { v as vtkVolumeFS } from './glsl/vtkVolumeFS.glsl.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkWarningMacro = vtkWarningMacro$1,\n vtkErrorMacro = vtkErrorMacro$1; // TODO: Do we want this in some shared utility? Shouldwe just use lodash.isEqual\n\nfunction arrayEquals(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n} // ----------------------------------------------------------------------------\n// vtkOpenGLVolumeMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLVolumeMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLVolumeMapper');\n\n publicAPI.buildPass = function () {\n model.zBufferTexture = null;\n }; // ohh someone is doing a zbuffer pass, use that for\n // intermixed volume rendering\n\n\n publicAPI.zBufferPass = function (prepass, renderPass) {\n if (prepass) {\n var zbt = renderPass.getZBufferTexture();\n\n if (zbt !== model.zBufferTexture) {\n model.zBufferTexture = zbt;\n }\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass, renderPass) {\n return publicAPI.zBufferPass(prepass, renderPass);\n }; // Renders myself\n\n\n publicAPI.volumePass = function (prepass, renderPass) {\n if (prepass) {\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.jitterTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.framebuffer.setOpenGLRenderWindow(model._openGLRenderWindow); // Per Component?\n\n model.scalarTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.opacityTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.openGLVolume = publicAPI.getFirstAncestorOfType('vtkOpenGLVolume');\n var actor = model.openGLVolume.getRenderable();\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n\n var ren = model._openGLRenderer.getRenderable();\n\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera());\n publicAPI.renderPiece(ren, actor);\n }\n };\n\n publicAPI.buildShaders = function (shaders, ren, actor) {\n publicAPI.getShaderTemplate(shaders, ren, actor);\n publicAPI.replaceShaderValues(shaders, ren, actor);\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkVolumeVS;\n shaders.Fragment = vtkVolumeFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment; // define some values in the shader\n\n var iType = actor.getProperty().getInterpolationType();\n\n if (iType === InterpolationType.LINEAR) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TrilinearOn', '#define vtkTrilinearOn').result;\n }\n\n var vtkImageLabelOutline = actor.getProperty().getUseLabelOutline();\n\n if (vtkImageLabelOutline === true) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ImageLabelOutlineOn', '#define vtkImageLabelOutlineOn').result;\n }\n\n var numComp = model.scalarTexture.getComponents();\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::NumComponents', \"#define vtkNumComponents \".concat(numComp)).result;\n var iComps = actor.getProperty().getIndependentComponents();\n\n if (iComps) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::IndependentComponentsOn', '#define vtkIndependentComponentsOn').result; // Define any proportional components\n\n var proportionalComponents = [];\n\n for (var nc = 0; nc < numComp; nc++) {\n if (actor.getProperty().getOpacityMode(nc) === OpacityMode.PROPORTIONAL) {\n proportionalComponents.push(\"#define vtkComponent\".concat(nc, \"Proportional\"));\n }\n }\n\n if (proportionalComponents.length > 0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::vtkProportionalComponents', proportionalComponents.join('\\n')).result;\n }\n } // WebGL only supports loops over constants\n // and does not support while loops so we\n // have to hard code how many steps/samples to take\n // We do a break so most systems will gracefully\n // early terminate, but it is always possible\n // a system will execute every step regardless\n\n\n var ext = model.currentInput.getSpatialExtent();\n var spc = model.currentInput.getSpacing();\n var vsize = new Float64Array(3);\n vec3.set(vsize, (ext[1] - ext[0]) * spc[0], (ext[3] - ext[2]) * spc[1], (ext[5] - ext[4]) * spc[2]);\n var maxSamples = vec3.length(vsize) / model.renderable.getSampleDistance();\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::MaximumSamplesValue', \"\".concat(Math.ceil(maxSamples))).result; // set light complexity\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::LightComplexity', \"#define vtkLightComplexity \".concat(model.lastLightComplexity)).result; // set shadow blending flag\n\n if (model.lastLightComplexity > 0) {\n if (model.renderable.getVolumetricScatteringBlending() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::VolumeShadowOn', \"#define VolumeShadowOn\").result;\n }\n\n if (model.renderable.getVolumetricScatteringBlending() < 1.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::SurfaceShadowOn', \"#define SurfaceShadowOn\").result;\n }\n\n if (model.renderable.getLocalAmbientOcclusion() && actor.getProperty().getAmbient() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::localAmbientOcclusionOn', \"#define localAmbientOcclusionOn\").result;\n }\n } // if using gradient opacity define that\n\n\n model.gopacity = actor.getProperty().getUseGradientOpacity(0);\n\n for (var _nc = 1; iComps && !model.gopacity && _nc < numComp; ++_nc) {\n if (actor.getProperty().getUseGradientOpacity(_nc)) {\n model.gopacity = true;\n }\n }\n\n if (model.gopacity) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::GradientOpacityOn', '#define vtkGradientOpacityOn').result;\n } // set normal from density\n\n\n if (model.renderable.getComputeNormalFromOpacity()) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::vtkComputeNormalFromOpacity', \"#define vtkComputeNormalFromOpacity\").result;\n } // if we have a ztexture then declare it and use it\n\n\n if (model.zBufferTexture !== null) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', ['uniform sampler2D zBufferTexture;', 'uniform float vpWidth;', 'uniform float vpHeight;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['vec4 depthVec = texture2D(zBufferTexture, vec2(gl_FragCoord.x / vpWidth, gl_FragCoord.y/vpHeight));', 'float zdepth = (depthVec.r*256.0 + depthVec.g)/257.0;', 'zdepth = zdepth * 2.0 - 1.0;', 'if (cameraParallel == 0) {', 'zdepth = -2.0 * camFar * camNear / (zdepth*(camFar-camNear)-(camFar+camNear)) - camNear;}', 'else {', 'zdepth = (zdepth + 1.0) * 0.5 * (camFar - camNear);}\\n', 'zdepth = -zdepth/rayDir.z;', 'dists.y = min(zdepth,dists.y);']).result;\n } // Set the BlendMode approach\n\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::BlendMode', \"\".concat(model.renderable.getBlendMode())).result;\n shaders.Fragment = FSSource;\n publicAPI.replaceShaderLight(shaders, ren, actor);\n publicAPI.replaceShaderClippingPlane(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderLight = function (shaders, ren, actor) {\n if (model.lastLightComplexity === 0) {\n return;\n }\n\n var FSSource = shaders.Fragment; // check for shadow maps - not implemented yet, skip\n // const shadowFactor = '';\n // to-do: single out the case when complexity = 1\n // only account for lights that are switched on\n\n var lightNum = 0;\n ren.getLights().forEach(function (light) {\n if (light.getSwitch()) {\n lightNum += 1;\n }\n });\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', [\"uniform int lightNum;\", \"uniform bool twoSidedLighting;\", \"uniform vec3 lightColor[\".concat(lightNum, \"];\"), \"uniform vec3 lightDirectionVC[\".concat(lightNum, \"]; // normalized\"), \"uniform vec3 lightHalfAngleVC[\".concat(lightNum, \"];\"), '//VTK::Light::Dec'], false).result; // support any number of lights\n\n if (model.lastLightComplexity === 3) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', [\"uniform vec3 lightPositionVC[\".concat(lightNum, \"];\"), \"uniform vec3 lightAttenuation[\".concat(lightNum, \"];\"), \"uniform float lightConeAngle[\".concat(lightNum, \"];\"), \"uniform float lightExponent[\".concat(lightNum, \"];\"), \"uniform int lightPositional[\".concat(lightNum, \"];\")], false).result;\n }\n\n if (model.renderable.getVolumetricScatteringBlending() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::VolumeShadow::Dec', [\"uniform float volumetricScatteringBlending;\", \"uniform float giReach;\", \"uniform float volumeShadowSamplingDistFactor;\", \"uniform float anisotropy;\", \"uniform float anisotropy2;\"], false).result;\n }\n\n if (model.renderable.getLocalAmbientOcclusion() && actor.getProperty().getAmbient() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::LAO::Dec', [\"uniform int kernelRadius;\", \"uniform vec2 kernelSample[\".concat(model.renderable.getLAOKernelRadius(), \"];\"), \"uniform int kernelSize;\"], false).result;\n }\n\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderClippingPlane = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment;\n\n if (model.renderable.getClippingPlanes().length > 0) {\n var clipPlaneSize = model.renderable.getClippingPlanes().length;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ClipPlane::Dec', [\"uniform vec3 vClipPlaneNormals[6];\", \"uniform float vClipPlaneDistances[6];\", '//VTK::ClipPlane::Dec'], false).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ClipPlane::Impl', [\"for(int i = 0; i < \".concat(clipPlaneSize, \"; i++) {\"), ' float rayDirRatio = dot(rayDir, vClipPlaneNormals[i]);', ' float equationResult = dot(vertexVCVSOutput, vClipPlaneNormals[i]) + vClipPlaneDistances[i];', ' if (rayDirRatio == 0.0)', ' {', ' if (equationResult < 0.0) dists.x = dists.y;', ' continue;', ' }', ' float result = -1.0 * equationResult / rayDirRatio;', ' if (rayDirRatio < 0.0) dists.y = min(dists.y, result);', ' else dists.x = max(dists.x, result);', '}', '//VTK::ClipPlane::Impl'], false).result;\n }\n\n shaders.Fragment = FSSource;\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // do we need lighting?\n var lightComplexity = 0;\n\n if (actor.getProperty().getShade() && model.renderable.getBlendMode() === BlendMode.COMPOSITE_BLEND) {\n // consider the lighting complexity to determine which case applies\n // simple headlight, Light Kit, the whole feature set of VTK\n lightComplexity = 0;\n model.numberOfLights = 0;\n ren.getLights().forEach(function (light) {\n var status = light.getSwitch();\n\n if (status > 0) {\n model.numberOfLights++;\n\n if (lightComplexity === 0) {\n lightComplexity = 1;\n }\n }\n\n if (lightComplexity === 1 && (model.numberOfLights > 1 || light.getIntensity() !== 1.0 || !light.lightTypeIsHeadLight())) {\n lightComplexity = 2;\n }\n\n if (lightComplexity < 3 && light.getPositional()) {\n lightComplexity = 3;\n }\n });\n }\n\n var needRebuild = false;\n\n if (model.lastLightComplexity !== lightComplexity) {\n model.lastLightComplexity = lightComplexity;\n needRebuild = true;\n }\n\n var numComp = model.scalarTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n var usesProportionalComponents = false;\n var proportionalComponents = [];\n\n if (iComps) {\n // Define any proportional components\n for (var nc = 0; nc < numComp; nc++) {\n proportionalComponents.push(actor.getProperty().getOpacityMode(nc));\n }\n\n if (proportionalComponents.length > 0) {\n usesProportionalComponents = true;\n }\n }\n\n var ext = model.currentInput.getSpatialExtent();\n var spc = model.currentInput.getSpacing();\n var vsize = new Float64Array(3);\n vec3.set(vsize, (ext[1] - ext[0]) * spc[0], (ext[3] - ext[2]) * spc[1], (ext[5] - ext[4]) * spc[2]);\n var maxSamples = vec3.length(vsize) / model.renderable.getSampleDistance();\n var state = {\n interpolationType: actor.getProperty().getInterpolationType(),\n useLabelOutline: actor.getProperty().getUseLabelOutline(),\n numComp: numComp,\n usesProportionalComponents: usesProportionalComponents,\n iComps: iComps,\n maxSamples: maxSamples,\n useGradientOpacity: actor.getProperty().getUseGradientOpacity(0),\n blendMode: model.renderable.getBlendMode(),\n proportionalComponents: proportionalComponents\n }; // We only need to rebuild the shader if one of these variables has changed,\n // since they are used in the shader template replacement step.\n\n if (!model.previousState || model.previousState.interpolationType !== state.interpolationType || model.previousState.useLabelOutline !== state.useLabelOutline || model.previousState.numComp !== state.numComp || model.previousState.usesProportionalComponents !== state.usesProportionalComponents || model.previousState.iComps !== state.iComps || model.previousState.maxSamples !== state.maxSamples || model.previousState.useGradientOpacity !== state.useGradientOpacity || model.previousState.blendMode !== state.blendMode || !arrayEquals(model.previousState.proportionalComponents, state.proportionalComponents)) {\n model.previousState = _objectSpread({}, state);\n return true;\n } // has something changed that would require us to recreate the shader?\n\n\n if (cellBO.getProgram() === 0 || needRebuild || model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || !!model.lastZBufferTexture !== !!model.zBufferTexture || cellBO.getShaderSourceTime().getMTime() < publicAPI.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime()) {\n model.lastZBufferTexture = model.zBufferTexture;\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateShaders = function (cellBO, ren, actor) {\n model.lastBoundBO = cellBO; // has something changed that would require us to recreate the shader?\n\n if (publicAPI.getNeedToRebuildShaders(cellBO, ren, actor)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n publicAPI.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n\n if (newShader !== cellBO.getProgram()) {\n cellBO.setProgram(newShader); // reset the VAO as the shader has changed\n\n cellBO.getVAO().releaseGraphicsResources();\n }\n\n cellBO.getShaderSourceTime().modified();\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(cellBO.getProgram());\n }\n\n cellBO.getVAO().bind();\n publicAPI.setMapperShaderParameters(cellBO, ren, actor);\n publicAPI.setCameraShaderParameters(cellBO, ren, actor);\n publicAPI.setPropertyShaderParameters(cellBO, ren, actor);\n publicAPI.getClippingPlaneShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n var program = cellBO.getProgram();\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (program.isAttributeUsed('vertexDC')) {\n if (!cellBO.getVAO().addAttributeArray(program, cellBO.getCABO(), 'vertexDC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in shader VAO.');\n }\n }\n\n cellBO.getAttributeUpdateTime().modified();\n }\n\n program.setUniformi('texture1', model.scalarTexture.getTextureUnit());\n program.setUniformf('sampleDistance', model.renderable.getSampleDistance());\n var volInfo = model.scalarTexture.getVolumeInfo();\n var ipScalarRange = model.renderable.getIpScalarRange();\n var minVals = [];\n var maxVals = [];\n\n for (var i = 0; i < 4; i++) {\n // convert iprange from 0-1 into data range values\n minVals[i] = ipScalarRange[0] * volInfo.dataComputedScale[i] + volInfo.dataComputedOffset[i];\n maxVals[i] = ipScalarRange[1] * volInfo.dataComputedScale[i] + volInfo.dataComputedOffset[i]; // convert data ranges into texture values\n\n minVals[i] = (minVals[i] - volInfo.offset[i]) / volInfo.scale[i];\n maxVals[i] = (maxVals[i] - volInfo.offset[i]) / volInfo.scale[i];\n }\n\n program.setUniform4f('ipScalarRangeMin', minVals[0], minVals[1], minVals[2], minVals[3]);\n program.setUniform4f('ipScalarRangeMax', maxVals[0], maxVals[1], maxVals[2], maxVals[3]); // if we have a zbuffer texture then set it\n\n if (model.zBufferTexture !== null) {\n program.setUniformi('zBufferTexture', model.zBufferTexture.getTextureUnit());\n var size = model._useSmallViewport ? [model._smallViewportWidth, model._smallViewportHeight] : model._openGLRenderWindow.getFramebufferSize();\n program.setUniformf('vpWidth', size[0]);\n program.setUniformf('vpHeight', size[1]);\n }\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n // // [WMVP]C == {world, model, view, projection} coordinates\n // // E.g., WCPC == world to projection coordinate transformation\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var actMats = model.openGLVolume.getKeyMatrices();\n mat4.multiply(model.modelToView, keyMats.wcvc, actMats.mcwc);\n var program = cellBO.getProgram();\n var cam = model.openGLCamera.getRenderable();\n var crange = cam.getClippingRange();\n program.setUniformf('camThick', crange[1] - crange[0]);\n program.setUniformf('camNear', crange[0]);\n program.setUniformf('camFar', crange[1]);\n var bounds = model.currentInput.getBounds();\n var dims = model.currentInput.getDimensions(); // compute the viewport bounds of the volume\n // we will only render those fragments.\n\n var pos = new Float64Array(3);\n var dir = new Float64Array(3);\n var dcxmin = 1.0;\n var dcxmax = -1.0;\n var dcymin = 1.0;\n var dcymax = -1.0;\n\n for (var i = 0; i < 8; ++i) {\n vec3.set(pos, bounds[i % 2], bounds[2 + Math.floor(i / 2) % 2], bounds[4 + Math.floor(i / 4)]);\n vec3.transformMat4(pos, pos, model.modelToView);\n\n if (!cam.getParallelProjection()) {\n vec3.normalize(dir, pos); // now find the projection of this point onto a\n // nearZ distance plane. Since the camera is at 0,0,0\n // in VC the ray is just t*pos and\n // t is -nearZ/dir.z\n // intersection becomes pos.x/pos.z\n\n var t = -crange[0] / pos[2];\n vec3.scale(pos, dir, t);\n } // now convert to DC\n\n\n vec3.transformMat4(pos, pos, keyMats.vcpc);\n dcxmin = Math.min(pos[0], dcxmin);\n dcxmax = Math.max(pos[0], dcxmax);\n dcymin = Math.min(pos[1], dcymin);\n dcymax = Math.max(pos[1], dcymax);\n }\n\n program.setUniformf('dcxmin', dcxmin);\n program.setUniformf('dcxmax', dcxmax);\n program.setUniformf('dcymin', dcymin);\n program.setUniformf('dcymax', dcymax);\n\n if (program.isUniformUsed('cameraParallel')) {\n program.setUniformi('cameraParallel', cam.getParallelProjection());\n }\n\n var ext = model.currentInput.getSpatialExtent();\n var spc = model.currentInput.getSpacing();\n var vsize = new Float64Array(3);\n vec3.set(vsize, (ext[1] - ext[0]) * spc[0], (ext[3] - ext[2]) * spc[1], (ext[5] - ext[4]) * spc[2]);\n program.setUniform3f('vSpacing', spc[0], spc[1], spc[2]);\n vec3.set(pos, ext[0], ext[2], ext[4]);\n model.currentInput.indexToWorldVec3(pos, pos);\n vec3.transformMat4(pos, pos, model.modelToView);\n program.setUniform3f('vOriginVC', pos[0], pos[1], pos[2]); // apply the image directions\n\n var i2wmat4 = model.currentInput.getIndexToWorld();\n mat4.multiply(model.idxToView, model.modelToView, i2wmat4);\n mat3.multiply(model.idxNormalMatrix, keyMats.normalMatrix, actMats.normalMatrix);\n mat3.multiply(model.idxNormalMatrix, model.idxNormalMatrix, model.currentInput.getDirectionByReference());\n var maxSamples = vec3.length(vsize) / model.renderable.getSampleDistance();\n\n if (maxSamples > model.renderable.getMaximumSamplesPerRay()) {\n vtkWarningMacro(\"The number of steps required \".concat(Math.ceil(maxSamples), \" is larger than the\\n specified maximum number of steps \").concat(model.renderable.getMaximumSamplesPerRay(), \".\\n Please either change the\\n volumeMapper sampleDistance or its maximum number of samples.\"));\n }\n\n var vctoijk = new Float64Array(3);\n vec3.set(vctoijk, 1.0, 1.0, 1.0);\n vec3.divide(vctoijk, vctoijk, vsize);\n program.setUniform3f('vVCToIJK', vctoijk[0], vctoijk[1], vctoijk[2]);\n program.setUniform3i('volumeDimensions', dims[0], dims[1], dims[2]);\n\n if (!model._openGLRenderWindow.getWebgl2()) {\n var volInfo = model.scalarTexture.getVolumeInfo();\n program.setUniformf('texWidth', model.scalarTexture.getWidth());\n program.setUniformf('texHeight', model.scalarTexture.getHeight());\n program.setUniformi('xreps', volInfo.xreps);\n program.setUniformi('xstride', volInfo.xstride);\n program.setUniformi('ystride', volInfo.ystride);\n } // map normals through normal matrix\n // then use a point on the plane to compute the distance\n\n\n var normal = new Float64Array(3);\n var pos2 = new Float64Array(3);\n\n for (var _i = 0; _i < 6; ++_i) {\n switch (_i) {\n case 1:\n vec3.set(normal, -1.0, 0.0, 0.0);\n vec3.set(pos2, ext[0], ext[2], ext[4]);\n break;\n\n case 2:\n vec3.set(normal, 0.0, 1.0, 0.0);\n vec3.set(pos2, ext[1], ext[3], ext[5]);\n break;\n\n case 3:\n vec3.set(normal, 0.0, -1.0, 0.0);\n vec3.set(pos2, ext[0], ext[2], ext[4]);\n break;\n\n case 4:\n vec3.set(normal, 0.0, 0.0, 1.0);\n vec3.set(pos2, ext[1], ext[3], ext[5]);\n break;\n\n case 5:\n vec3.set(normal, 0.0, 0.0, -1.0);\n vec3.set(pos2, ext[0], ext[2], ext[4]);\n break;\n\n case 0:\n default:\n vec3.set(normal, 1.0, 0.0, 0.0);\n vec3.set(pos2, ext[1], ext[3], ext[5]);\n break;\n }\n\n vec3.transformMat3(normal, normal, model.idxNormalMatrix);\n vec3.transformMat4(pos2, pos2, model.idxToView);\n var dist = -1.0 * vec3.dot(pos2, normal); // we have the plane in view coordinates\n // specify the planes in view coordinates\n\n program.setUniform3f(\"vPlaneNormal\".concat(_i), normal[0], normal[1], normal[2]);\n program.setUniformf(\"vPlaneDistance\".concat(_i), dist);\n }\n\n if (actor.getProperty().getUseLabelOutline()) {\n var image = model.currentInput;\n var worldToIndex = image.getWorldToIndex();\n program.setUniformMatrix('vWCtoIDX', worldToIndex);\n var camera = ren.getActiveCamera();\n\n var _camera$getClippingRa = camera.getClippingRange(),\n _camera$getClippingRa2 = _slicedToArray(_camera$getClippingRa, 2),\n cRange0 = _camera$getClippingRa2[0],\n cRange1 = _camera$getClippingRa2[1];\n\n var distance = camera.getDistance(); // set the clipping range to be model.distance and model.distance + 0.1\n // since we use the in the keyMats.wcpc (world to projection) matrix\n // the projection matrix calculation relies on the clipping range to be\n // set correctly. This is done inside the interactorStyleMPRSlice which\n // limits use cases where the interactor style is not used.\n\n camera.setClippingRange(distance, distance + 0.1);\n var labelOutlineKeyMats = model.openGLCamera.getKeyMatrices(ren); // Get the projection coordinate to world coordinate transformation matrix.\n\n mat4.invert(model.projectionToWorld, labelOutlineKeyMats.wcpc); // reset the clipping range since the keyMats are cached\n\n camera.setClippingRange(cRange0, cRange1); // to re compute the matrices for the current camera and cache them\n\n model.openGLCamera.getKeyMatrices(ren);\n program.setUniformMatrix('PCWCMatrix', model.projectionToWorld);\n var size = publicAPI.getRenderTargetSize();\n program.setUniformf('vpWidth', size[0]);\n program.setUniformf('vpHeight', size[1]);\n var offset = publicAPI.getRenderTargetOffset();\n program.setUniformf('vpOffsetX', offset[0] / size[0]);\n program.setUniformf('vpOffsetY', offset[1] / size[1]);\n }\n\n mat4.invert(model.projectionToView, keyMats.vcpc);\n program.setUniformMatrix('PCVCMatrix', model.projectionToView); // handle lighting values\n\n if (model.lastLightComplexity === 0) {\n return;\n }\n\n var lightNum = 0;\n var lightColor = [];\n var lightDir = [];\n var halfAngle = [];\n ren.getLights().forEach(function (light) {\n var status = light.getSwitch();\n\n if (status > 0) {\n var dColor = light.getColor();\n var intensity = light.getIntensity();\n lightColor[0 + lightNum * 3] = dColor[0] * intensity;\n lightColor[1 + lightNum * 3] = dColor[1] * intensity;\n lightColor[2 + lightNum * 3] = dColor[2] * intensity;\n var ldir = light.getDirection();\n vec3.set(normal, ldir[0], ldir[1], ldir[2]);\n vec3.transformMat3(normal, normal, keyMats.normalMatrix); // in view coordinat\n\n vec3.normalize(normal, normal);\n lightDir[0 + lightNum * 3] = normal[0];\n lightDir[1 + lightNum * 3] = normal[1];\n lightDir[2 + lightNum * 3] = normal[2]; // camera DOP is 0,0,-1.0 in VC\n\n halfAngle[0 + lightNum * 3] = -0.5 * normal[0];\n halfAngle[1 + lightNum * 3] = -0.5 * normal[1];\n halfAngle[2 + lightNum * 3] = -0.5 * (normal[2] - 1.0);\n lightNum++;\n }\n });\n program.setUniformi('twoSidedLighting', ren.getTwoSidedLighting());\n program.setUniformi('lightNum', lightNum);\n program.setUniform3fv('lightColor', lightColor);\n program.setUniform3fv('lightDirectionVC', lightDir);\n program.setUniform3fv('lightHalfAngleVC', halfAngle);\n\n if (model.lastLightComplexity === 3) {\n lightNum = 0;\n var lightPositionVC = [];\n var lightAttenuation = [];\n var lightConeAngle = [];\n var lightExponent = [];\n var lightPositional = [];\n ren.getLights().forEach(function (light) {\n var status = light.getSwitch();\n\n if (status > 0) {\n var attenuation = light.getAttenuationValues();\n lightAttenuation[0 + lightNum * 3] = attenuation[0];\n lightAttenuation[1 + lightNum * 3] = attenuation[1];\n lightAttenuation[2 + lightNum * 3] = attenuation[2];\n lightExponent[lightNum] = light.getExponent();\n lightConeAngle[lightNum] = light.getConeAngle();\n lightPositional[lightNum] = light.getPositional();\n var lp = light.getTransformedPosition();\n vec3.transformMat4(lp, lp, model.modelToView);\n lightPositionVC[0 + lightNum * 3] = lp[0];\n lightPositionVC[1 + lightNum * 3] = lp[1];\n lightPositionVC[2 + lightNum * 3] = lp[2];\n lightNum += 1;\n }\n });\n program.setUniform3fv('lightPositionVC', lightPositionVC);\n program.setUniform3fv('lightAttenuation', lightAttenuation);\n program.setUniformfv('lightConeAngle', lightConeAngle);\n program.setUniformfv('lightExponent', lightExponent);\n program.setUniformiv('lightPositional', lightPositional);\n }\n\n if (model.renderable.getVolumetricScatteringBlending() > 0.0) {\n program.setUniformf('giReach', model.renderable.getGlobalIlluminationReach());\n program.setUniformf('volumetricScatteringBlending', model.renderable.getVolumetricScatteringBlending());\n program.setUniformf('volumeShadowSamplingDistFactor', model.renderable.getVolumeShadowSamplingDistFactor());\n program.setUniformf('anisotropy', model.renderable.getAnisotropy());\n program.setUniformf('anisotropy2', Math.pow(model.renderable.getAnisotropy(), 2.0));\n }\n\n if (model.renderable.getLocalAmbientOcclusion() && actor.getProperty().getAmbient() > 0.0) {\n var ks = model.renderable.getLAOKernelSize();\n program.setUniformi('kernelSize', ks);\n var kernelSample = [];\n\n for (var _i2 = 0; _i2 < ks; _i2++) {\n kernelSample[_i2 * 2] = Math.random() * 0.5;\n kernelSample[_i2 * 2 + 1] = Math.random() * 0.5;\n }\n\n program.setUniform2fv('kernelSample', kernelSample);\n program.setUniformi('kernelRadius', model.renderable.getLAOKernelRadius());\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n program.setUniformi('ctexture', model.colorTexture.getTextureUnit());\n program.setUniformi('otexture', model.opacityTexture.getTextureUnit());\n program.setUniformi('jtexture', model.jitterTexture.getTextureUnit());\n var volInfo = model.scalarTexture.getVolumeInfo();\n var vprop = actor.getProperty(); // set the component mix when independent\n\n var numComp = model.scalarTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n\n if (iComps && numComp >= 2) {\n for (var i = 0; i < numComp; i++) {\n program.setUniformf(\"mix\".concat(i), actor.getProperty().getComponentWeight(i));\n }\n } // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n\n for (var _i3 = 0; _i3 < numComp; _i3++) {\n var target = iComps ? _i3 : 0;\n var sscale = volInfo.scale[_i3];\n var ofun = vprop.getScalarOpacity(target);\n var oRange = ofun.getRange();\n var oscale = sscale / (oRange[1] - oRange[0]);\n var oshift = (volInfo.offset[_i3] - oRange[0]) / (oRange[1] - oRange[0]);\n program.setUniformf(\"oshift\".concat(_i3), oshift);\n program.setUniformf(\"oscale\".concat(_i3), oscale);\n var cfun = vprop.getRGBTransferFunction(target);\n var cRange = cfun.getRange();\n var cshift = (volInfo.offset[_i3] - cRange[0]) / (cRange[1] - cRange[0]);\n var cScale = sscale / (cRange[1] - cRange[0]);\n program.setUniformf(\"cshift\".concat(_i3), cshift);\n program.setUniformf(\"cscale\".concat(_i3), cScale);\n }\n\n if (model.gopacity) {\n if (iComps) {\n for (var nc = 0; nc < numComp; ++nc) {\n var _sscale = volInfo.scale[nc];\n var useGO = vprop.getUseGradientOpacity(nc);\n\n if (useGO) {\n var gomin = vprop.getGradientOpacityMinimumOpacity(nc);\n var gomax = vprop.getGradientOpacityMaximumOpacity(nc);\n program.setUniformf(\"gomin\".concat(nc), gomin);\n program.setUniformf(\"gomax\".concat(nc), gomax);\n var goRange = [vprop.getGradientOpacityMinimumValue(nc), vprop.getGradientOpacityMaximumValue(nc)];\n program.setUniformf(\"goscale\".concat(nc), _sscale * (gomax - gomin) / (goRange[1] - goRange[0]));\n program.setUniformf(\"goshift\".concat(nc), -goRange[0] * (gomax - gomin) / (goRange[1] - goRange[0]) + gomin);\n } else {\n program.setUniformf(\"gomin\".concat(nc), 1.0);\n program.setUniformf(\"gomax\".concat(nc), 1.0);\n program.setUniformf(\"goscale\".concat(nc), 0.0);\n program.setUniformf(\"goshift\".concat(nc), 1.0);\n }\n }\n } else {\n var _sscale2 = volInfo.scale[numComp - 1];\n\n var _gomin = vprop.getGradientOpacityMinimumOpacity(0);\n\n var _gomax = vprop.getGradientOpacityMaximumOpacity(0);\n\n program.setUniformf('gomin0', _gomin);\n program.setUniformf('gomax0', _gomax);\n var _goRange = [vprop.getGradientOpacityMinimumValue(0), vprop.getGradientOpacityMaximumValue(0)];\n program.setUniformf('goscale0', _sscale2 * (_gomax - _gomin) / (_goRange[1] - _goRange[0]));\n program.setUniformf('goshift0', -_goRange[0] * (_gomax - _gomin) / (_goRange[1] - _goRange[0]) + _gomin);\n }\n }\n\n var vtkImageLabelOutline = actor.getProperty().getUseLabelOutline();\n\n if (vtkImageLabelOutline === true) {\n var labelOutlineThickness = actor.getProperty().getLabelOutlineThickness();\n var labelOutlineOpacity = actor.getProperty().getLabelOutlineOpacity();\n program.setUniformi('outlineThickness', labelOutlineThickness);\n program.setUniformf('outlineOpacity', labelOutlineOpacity);\n }\n\n if (model.lastLightComplexity > 0) {\n program.setUniformf('vAmbient', vprop.getAmbient());\n program.setUniformf('vDiffuse', vprop.getDiffuse());\n program.setUniformf('vSpecular', vprop.getSpecular());\n program.setUniformf('vSpecularPower', vprop.getSpecularPower());\n }\n };\n\n publicAPI.getClippingPlaneShaderParameters = function (cellBO, ren, actor) {\n if (model.renderable.getClippingPlanes().length > 0) {\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var clipPlaneNormals = [];\n var clipPlaneDistances = [];\n var clipPlanes = model.renderable.getClippingPlanes();\n var clipPlaneSize = clipPlanes.length;\n\n for (var i = 0; i < clipPlaneSize; ++i) {\n var clipPlaneNormal = clipPlanes[i].getNormal();\n var clipPlanePos = clipPlanes[i].getOrigin();\n vec3.transformMat3(clipPlaneNormal, clipPlaneNormal, keyMats.normalMatrix);\n vec3.transformMat4(clipPlanePos, clipPlanePos, keyMats.wcvc);\n var clipPlaneDist = -1.0 * vec3.dot(clipPlanePos, clipPlaneNormal);\n clipPlaneNormals.push(clipPlaneNormal[0]);\n clipPlaneNormals.push(clipPlaneNormal[1]);\n clipPlaneNormals.push(clipPlaneNormal[2]);\n clipPlaneDistances.push(clipPlaneDist);\n }\n\n var program = cellBO.getProgram();\n program.setUniform3fv(\"vClipPlaneNormals\", clipPlaneNormals);\n program.setUniformfv(\"vClipPlaneDistances\", clipPlaneDistances);\n }\n }; // unsubscribe from our listeners\n\n\n publicAPI.delete = chain(function () {\n if (model._animationRateSubscription) {\n model._animationRateSubscription.unsubscribe();\n\n model._animationRateSubscription = null;\n }\n }, publicAPI.delete);\n\n publicAPI.getRenderTargetSize = function () {\n if (model._useSmallViewport) {\n return [model._smallViewportWidth, model._smallViewportHeight];\n }\n\n var _model$_openGLRendere = model._openGLRenderer.getTiledSizeAndOrigin(),\n usize = _model$_openGLRendere.usize,\n vsize = _model$_openGLRendere.vsize;\n\n return [usize, vsize];\n };\n\n publicAPI.getRenderTargetOffset = function () {\n var _model$_openGLRendere2 = model._openGLRenderer.getTiledSizeAndOrigin(),\n lowerLeftU = _model$_openGLRendere2.lowerLeftU,\n lowerLeftV = _model$_openGLRendere2.lowerLeftV;\n\n return [lowerLeftU, lowerLeftV];\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n var rwi = ren.getVTKWindow().getInteractor();\n model._useSmallViewport = false;\n\n if (rwi.isAnimating() && model._lastScale > 1.5) {\n model._useSmallViewport = true;\n }\n\n if (!model._animationRateSubscription) {\n // when the animation frame rate changes recompute the scale factor\n model._animationRateSubscription = rwi.onAnimationFrameRateUpdate(function () {\n if (model.renderable.getAutoAdjustSampleDistances()) {\n var frate = rwi.getRecentAnimationFrameRate();\n var adjustment = rwi.getDesiredUpdateRate() / frate; // only change if we are off by 15%\n\n if (adjustment > 1.15 || adjustment < 0.85) {\n model._lastScale *= adjustment;\n } // clamp scale to some reasonable values.\n // Below 1.5 we will just be using full resolution as that is close enough\n // Above 400 seems like a lot so we limit to that 1/20th per axis\n\n\n if (model._lastScale > 400) {\n model._lastScale = 400;\n }\n\n if (model._lastScale < 1.5) {\n model._lastScale = 1.5;\n }\n } else {\n model._lastScale = model.renderable.getImageSampleDistance() * model.renderable.getImageSampleDistance();\n }\n\n var size = model._openGLRenderWindow.getFramebufferSize();\n\n model._smallViewportWidth = Math.ceil(size[0] / Math.sqrt(model._lastScale));\n model._smallViewportHeight = Math.ceil(size[1] / Math.sqrt(model._lastScale));\n });\n } // use/create/resize framebuffer if needed\n\n\n if (model._useSmallViewport) {\n var size = model._openGLRenderWindow.getFramebufferSize(); // adjust viewportSize to always be at most the dest fo size\n\n\n if (model._smallViewportHeight > size[1]) {\n model._smallViewportHeight = size[1];\n }\n\n if (model._smallViewportWidth > size[0]) {\n model._smallViewportWidth = size[0];\n }\n\n model.framebuffer.saveCurrentBindingsAndBuffers();\n\n if (model.framebuffer.getGLFramebuffer() === null) {\n model.framebuffer.create(size[0], size[1]);\n model.framebuffer.populateFramebuffer();\n } else {\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.create(size[0], size[1]);\n model.framebuffer.populateFramebuffer();\n }\n }\n\n model.framebuffer.bind();\n var gl = model.context;\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n gl.colorMask(true, true, true, true);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, model._smallViewportWidth, model._smallViewportHeight);\n model.fvp = [model._smallViewportWidth / size[0], model._smallViewportHeight / size[1]];\n }\n\n model.context.disable(model.context.DEPTH_TEST); // make sure the BOs are up to date\n\n publicAPI.updateBufferObjects(ren, actor); // set interpolation on the texture based on property setting\n\n var iType = actor.getProperty().getInterpolationType();\n\n if (iType === InterpolationType.NEAREST) {\n model.scalarTexture.setMinificationFilter(Filter.NEAREST);\n model.scalarTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n model.scalarTexture.setMinificationFilter(Filter.LINEAR);\n model.scalarTexture.setMagnificationFilter(Filter.LINEAR);\n } // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n\n model.lastBoundBO = null; // if we have a zbuffer texture then activate it\n\n if (model.zBufferTexture !== null) {\n model.zBufferTexture.activate();\n }\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var gl = model.context; // render the texture\n\n model.scalarTexture.activate();\n model.opacityTexture.activate();\n model.colorTexture.activate();\n model.jitterTexture.activate();\n publicAPI.updateShaders(model.tris, ren, actor); // First we do the triangles, update the shader, set uniforms, etc.\n // for (let i = 0; i < 11; ++i) {\n // gl.drawArrays(gl.TRIANGLES, 66 * i, 66);\n // }\n\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n model.scalarTexture.deactivate();\n model.colorTexture.deactivate();\n model.opacityTexture.deactivate();\n model.jitterTexture.deactivate();\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {\n // if we have a zbuffer texture then deactivate it\n if (model.zBufferTexture !== null) {\n model.zBufferTexture.deactivate();\n }\n\n if (model._useSmallViewport) {\n // now copy the framebuffer with the volume into the\n // regular buffer\n model.framebuffer.restorePreviousBindingsAndBuffers();\n\n if (model.copyShader === null) {\n model.copyShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(['//VTK::System::Dec', 'attribute vec4 vertexDC;', 'uniform vec2 tfactor;', 'varying vec2 tcoord;', 'void main() { tcoord = vec2(vertexDC.x*0.5 + 0.5, vertexDC.y*0.5 + 0.5) * tfactor; gl_Position = vertexDC; }'].join('\\n'), ['//VTK::System::Dec', '//VTK::Output::Dec', 'uniform sampler2D texture1;', 'varying vec2 tcoord;', 'void main() { gl_FragData[0] = texture2D(texture1,tcoord); }'].join('\\n'), '');\n var program = model.copyShader;\n model.copyVAO = vtkVertexArrayObject.newInstance();\n model.copyVAO.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.tris.getCABO().bind();\n\n if (!model.copyVAO.addAttributeArray(program, model.tris.getCABO(), 'vertexDC', model.tris.getCABO().getVertexOffset(), model.tris.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in copy shader VAO.');\n }\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(model.copyShader);\n }\n\n var size = model._openGLRenderWindow.getFramebufferSize();\n\n model.context.viewport(0, 0, size[0], size[1]); // activate texture\n\n var tex = model.framebuffer.getColorTexture();\n tex.activate();\n model.copyShader.setUniformi('texture', tex.getTextureUnit());\n model.copyShader.setUniform2f('tfactor', model.fvp[0], model.fvp[1]);\n var gl = model.context;\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); // render quad\n\n model.context.drawArrays(model.context.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n tex.deactivate();\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n }\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent({\n type: 'StartEvent'\n });\n model.renderable.update();\n model.currentInput = model.renderable.getInputData();\n publicAPI.invokeEvent({\n type: 'EndEvent'\n });\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.computeBounds = function (ren, actor) {\n if (!publicAPI.getInput()) {\n uninitializeBounds(model.Bounds);\n return;\n }\n\n model.bounds = publicAPI.getInput().getBounds();\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n if (model.VBOBuildTime.getMTime() < publicAPI.getMTime() || model.VBOBuildTime.getMTime() < actor.getMTime() || model.VBOBuildTime.getMTime() < model.renderable.getMTime() || model.VBOBuildTime.getMTime() < actor.getProperty().getMTime() || model.VBOBuildTime.getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var image = model.currentInput;\n\n if (!image) {\n return;\n }\n\n var scalars = image.getPointData() && image.getPointData().getScalars();\n\n if (!scalars) {\n return;\n }\n\n var vprop = actor.getProperty();\n\n if (!model.jitterTexture.getHandle()) {\n var oTable = new Uint8Array(32 * 32);\n\n for (var i = 0; i < 32 * 32; ++i) {\n oTable[i] = 255.0 * Math.random();\n }\n\n model.jitterTexture.setMinificationFilter(Filter.LINEAR);\n model.jitterTexture.setMagnificationFilter(Filter.LINEAR);\n model.jitterTexture.create2DFromRaw(32, 32, 1, VtkDataTypes.UNSIGNED_CHAR, oTable);\n }\n\n var numComp = scalars.getNumberOfComponents();\n var iComps = vprop.getIndependentComponents();\n var numIComps = iComps ? numComp : 1; // rebuild opacity tfun?\n\n var toString = \"\".concat(vprop.getMTime());\n\n if (model.opacityTextureString !== toString) {\n var oWidth = 1024;\n var oSize = oWidth * 2 * numIComps;\n var ofTable = new Float32Array(oSize);\n var tmpTable = new Float32Array(oWidth);\n\n for (var c = 0; c < numIComps; ++c) {\n var ofun = vprop.getScalarOpacity(c);\n var opacityFactor = model.renderable.getSampleDistance() / vprop.getScalarOpacityUnitDistance(c);\n var oRange = ofun.getRange();\n ofun.getTable(oRange[0], oRange[1], oWidth, tmpTable, 1); // adjust for sample distance etc\n\n for (var _i4 = 0; _i4 < oWidth; ++_i4) {\n ofTable[c * oWidth * 2 + _i4] = 1.0 - Math.pow(1.0 - tmpTable[_i4], opacityFactor);\n ofTable[c * oWidth * 2 + _i4 + oWidth] = ofTable[c * oWidth * 2 + _i4];\n }\n }\n\n model.opacityTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.opacityTexture.setMinificationFilter(Filter.LINEAR);\n model.opacityTexture.setMagnificationFilter(Filter.LINEAR); // use float texture where possible because we really need the resolution\n // for this table. Errors in low values of opacity accumulate to\n // visible artifacts. High values of opacity quickly terminate without\n // artifacts.\n\n if (model._openGLRenderWindow.getWebgl2() || model.context.getExtension('OES_texture_float') && model.context.getExtension('OES_texture_float_linear')) {\n model.opacityTexture.create2DFromRaw(oWidth, 2 * numIComps, 1, VtkDataTypes.FLOAT, ofTable);\n } else {\n var _oTable = new Uint8Array(oSize);\n\n for (var _i5 = 0; _i5 < oSize; ++_i5) {\n _oTable[_i5] = 255.0 * ofTable[_i5];\n }\n\n model.opacityTexture.create2DFromRaw(oWidth, 2 * numIComps, 1, VtkDataTypes.UNSIGNED_CHAR, _oTable);\n }\n\n model.opacityTextureString = toString;\n } // rebuild color tfun?\n\n\n toString = \"\".concat(vprop.getMTime());\n\n if (model.colorTextureString !== toString) {\n var cWidth = 1024;\n var cSize = cWidth * 2 * numIComps * 3;\n var cTable = new Uint8Array(cSize);\n\n var _tmpTable = new Float32Array(cWidth * 3);\n\n for (var _c = 0; _c < numIComps; ++_c) {\n var cfun = vprop.getRGBTransferFunction(_c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, _tmpTable, 1);\n\n for (var _i6 = 0; _i6 < cWidth * 3; ++_i6) {\n cTable[_c * cWidth * 6 + _i6] = 255.0 * _tmpTable[_i6];\n cTable[_c * cWidth * 6 + _i6 + cWidth * 3] = 255.0 * _tmpTable[_i6];\n }\n }\n\n model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n model.colorTexture.create2DFromRaw(cWidth, 2 * numIComps, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n model.colorTextureString = toString;\n } // rebuild the scalarTexture if the data has changed\n\n\n toString = \"\".concat(image.getMTime());\n\n if (model.scalarTextureString !== toString) {\n // Build the textures\n var dims = image.getDimensions(); // Use norm16 for scalar texture if the extension is available\n\n model.scalarTexture.setOglNorm16Ext(model.context.getExtension('EXT_texture_norm16'));\n model.scalarTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.scalarTexture.resetFormatAndType();\n model.scalarTexture.create3DFilterableFromDataArray(dims[0], dims[1], dims[2], scalars, model.renderable.getPreferSizeOverAccuracy());\n model.scalarTextureString = toString;\n }\n\n if (!model.tris.getCABO().getElementCount()) {\n // build the CABO\n var ptsArray = new Float32Array(12);\n\n for (var _i7 = 0; _i7 < 4; _i7++) {\n ptsArray[_i7 * 3] = _i7 % 2 * 2 - 1.0;\n ptsArray[_i7 * 3 + 1] = _i7 > 1 ? 1.0 : -1.0;\n ptsArray[_i7 * 3 + 2] = -1.0;\n }\n\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2; // const dim = 12.0;\n // const ptsArray = new Float32Array(3 * dim * dim);\n // for (let i = 0; i < dim; i++) {\n // for (let j = 0; j < dim; j++) {\n // const offset = ((i * dim) + j) * 3;\n // ptsArray[offset] = (2.0 * (i / (dim - 1.0))) - 1.0;\n // ptsArray[offset + 1] = (2.0 * (j / (dim - 1.0))) - 1.0;\n // ptsArray[offset + 2] = -1.0;\n // }\n // }\n // const cellArray = new Uint16Array(8 * (dim - 1) * (dim - 1));\n // for (let i = 0; i < dim - 1; i++) {\n // for (let j = 0; j < dim - 1; j++) {\n // const offset = 8 * ((i * (dim - 1)) + j);\n // cellArray[offset] = 3;\n // cellArray[offset + 1] = (i * dim) + j;\n // cellArray[offset + 2] = (i * dim) + 1 + j;\n // cellArray[offset + 3] = ((i + 1) * dim) + 1 + j;\n // cellArray[offset + 4] = 3;\n // cellArray[offset + 5] = (i * dim) + j;\n // cellArray[offset + 6] = ((i + 1) * dim) + 1 + j;\n // cellArray[offset + 7] = ((i + 1) * dim) + j;\n // }\n // }\n\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n cellOffset: 0\n });\n }\n\n model.VBOBuildTime.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n VBOBuildTime: null,\n scalarTexture: null,\n scalarTextureString: null,\n opacityTexture: null,\n opacityTextureString: null,\n colorTexture: null,\n colorTextureString: null,\n jitterTexture: null,\n tris: null,\n framebuffer: null,\n copyShader: null,\n copyVAO: null,\n lastXYF: 1.0,\n targetXYF: 1.0,\n zBufferTexture: null,\n lastZBufferTexture: null,\n lastLightComplexity: 0,\n fullViewportTime: 1.0,\n idxToView: null,\n idxNormalMatrix: null,\n modelToView: null,\n projectionToView: null,\n avgWindowArea: 0.0,\n avgFrameTime: 0.0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime, {\n mtime: 0\n });\n model.tris = vtkHelper.newInstance();\n model.scalarTexture = vtkOpenGLTexture.newInstance();\n model.opacityTexture = vtkOpenGLTexture.newInstance();\n model.colorTexture = vtkOpenGLTexture.newInstance();\n model.jitterTexture = vtkOpenGLTexture.newInstance();\n model.jitterTexture.setWrapS(Wrap.REPEAT);\n model.jitterTexture.setWrapT(Wrap.REPEAT);\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n model.idxToView = mat4.identity(new Float64Array(16));\n model.idxNormalMatrix = mat3.identity(new Float64Array(9));\n model.modelToView = mat4.identity(new Float64Array(16));\n model.projectionToView = mat4.identity(new Float64Array(16));\n model.projectionToWorld = mat4.identity(new Float64Array(16));\n model._lastScale = 1.0; // Build VTK API\n\n setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLVolumeMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLVolumeMapper'); // ----------------------------------------------------------------------------\n\nvar vtkVolumeMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkVolumeMapper', newInstance);\n\nexport { vtkVolumeMapper as default, extend, newInstance };\n","import { newInstance as newInstance$1, vtkDebugMacro as vtkDebugMacro$1 } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// import { mat4, vec3 } from 'gl-matrix';\nvar vtkDebugMacro = vtkDebugMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLPixelSpaceCallbackMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLPixelSpaceCallbackMapper(publicAPI, model) {\n model.classHierarchy.push('vtkOpenGLPixelSpaceCallbackMapper');\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n\n var aspectRatio = model._openGLRenderer.getAspectRatio();\n\n var camera = model._openGLRenderer ? model._openGLRenderer.getRenderable().getActiveCamera() : null;\n\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n var texels = null;\n\n if (model.renderable.getUseZValues()) {\n var zbt = renderPass.getZBufferTexture();\n var width = Math.floor(zbt.getWidth());\n var height = Math.floor(zbt.getHeight());\n\n var gl = model._openGLRenderWindow.getContext();\n\n zbt.bind(); // Here we need to use vtkFramebuffer to save current settings (bindings/buffers)\n\n var fb = renderPass.getFramebuffer();\n\n if (!fb) {\n vtkDebugMacro('No framebuffer to save/restore');\n } else {\n // save framebuffer settings\n fb.saveCurrentBindingsAndBuffers();\n }\n\n var framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, zbt.getHandle(), 0);\n\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {\n texels = new Uint8Array(width * height * 4);\n gl.viewport(0, 0, width, height);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, texels);\n } // Now we need to restore framebuffer bindings/buffers\n\n\n if (fb) {\n fb.restorePreviousBindingsAndBuffers();\n }\n\n gl.deleteFramebuffer(framebuffer);\n }\n\n model.renderable.invokeCallback(model.renderable.getInputData(), camera, aspectRatio, tsize, texels);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (model.renderable.getUseZValues()) {\n renderPass.requestDepth();\n }\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLPixelSpaceCallbackMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLPixelSpaceCallbackMapper'); // ----------------------------------------------------------------------------\n\nvar vtkPixelSpaceCallbackMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkPixelSpaceCallbackMapper', newInstance);\n\nexport { vtkPixelSpaceCallbackMapper as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNodeFactory from '../SceneGraph/ViewNodeFactory.js';\n\nvar CLASS_MAPPING = Object.create(null);\nfunction registerOverride(className, fn) {\n CLASS_MAPPING[className] = fn;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUViewNodeFactory methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUViewNodeFactory(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUViewNodeFactory');\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Static class mapping shared across instances\n\n model.overrides = CLASS_MAPPING; // Inheritance\n\n vtkViewNodeFactory.extend(publicAPI, model, initialValues); // Object methods\n\n vtkWebGPUViewNodeFactory(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUViewNodeFactory'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUViewNodeFactory$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUViewNodeFactory$1 as default, extend, newInstance, registerOverride };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUCamera methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUCamera(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUCamera');\n\n publicAPI.getProjectionMatrix = function (outMat, aspect, cRange, windowCenter) {\n mat4.identity(outMat);\n\n if (model.renderable.getParallelProjection()) {\n // set up a rectangular parallelipiped\n var parallelScale = model.renderable.getParallelScale();\n var width = parallelScale * aspect;\n var height = parallelScale;\n var xmin = (windowCenter[0] - 1.0) * width;\n var xmax = (windowCenter[0] + 1.0) * width;\n var ymin = (windowCenter[1] - 1.0) * height;\n var ymax = (windowCenter[1] + 1.0) * height;\n var xr = 1.0 / (xmax - xmin);\n var yr = 1.0 / (ymax - ymin);\n outMat[0] = 2.0 * xr;\n outMat[5] = 2.0 * yr;\n outMat[10] = 1.0 / (cRange[1] - cRange[0]);\n outMat[12] = (xmax + xmin) * xr;\n outMat[13] = (ymax + ymin) * yr;\n outMat[14] = cRange[1] / (cRange[1] - cRange[0]);\n } else {\n var tmp = Math.tan(Math.PI * model.renderable.getViewAngle() / 360.0);\n\n var _width;\n\n var _height;\n\n if (model.renderable.getUseHorizontalViewAngle() === true) {\n _width = cRange[0] * tmp;\n _height = cRange[0] * tmp / aspect;\n } else {\n _width = cRange[0] * tmp * aspect;\n _height = cRange[0] * tmp;\n }\n\n var _xmin = (windowCenter[0] - 1.0) * _width;\n\n var _xmax = (windowCenter[0] + 1.0) * _width;\n\n var _ymin = (windowCenter[1] - 1.0) * _height;\n\n var _ymax = (windowCenter[1] + 1.0) * _height;\n\n outMat[0] = 2.0 * cRange[0] / (_xmax - _xmin);\n outMat[5] = 2.0 * cRange[0] / (_ymax - _ymin);\n outMat[12] = (_xmin + _xmax) / (_xmax - _xmin);\n outMat[13] = (_ymin + _ymax) / (_ymax - _ymin);\n outMat[10] = 0.0;\n outMat[14] = cRange[0];\n outMat[11] = -1.0;\n outMat[15] = 0.0;\n }\n };\n\n publicAPI.convertToOpenGLDepth = function (val) {\n if (model.renderable.getParallelProjection()) {\n return 1.0 - val;\n }\n\n var cRange = model.renderable.getClippingRangeByReference();\n var zval = -cRange[0] / val;\n zval = (cRange[0] + cRange[1]) / (cRange[1] - cRange[0]) + 2.0 * cRange[0] * cRange[1] / (zval * (cRange[1] - cRange[0]));\n return 0.5 * zval + 0.5;\n };\n\n publicAPI.getKeyMatrices = function (webGPURenderer) {\n // has the camera changed?\n var ren = webGPURenderer.getRenderable();\n var webGPURenderWindow = webGPURenderer.getParent();\n\n if (Math.max(webGPURenderWindow.getMTime(), publicAPI.getMTime(), ren.getMTime(), model.renderable.getMTime(), webGPURenderer.getStabilizedTime()) > model.keyMatrixTime.getMTime()) {\n var wcvc = model.renderable.getViewMatrix();\n mat4.copy(model.keyMatrices.normalMatrix, wcvc); // zero out translation\n\n model.keyMatrices.normalMatrix[3] = 0.0;\n model.keyMatrices.normalMatrix[7] = 0.0;\n model.keyMatrices.normalMatrix[11] = 0.0;\n mat4.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.wcvc, wcvc);\n var center = webGPURenderer.getStabilizedCenterByReference();\n mat4.translate(model.keyMatrices.scvc, model.keyMatrices.wcvc, center);\n var aspectRatio = webGPURenderer.getAspectRatio();\n var cRange = model.renderable.getClippingRangeByReference();\n publicAPI.getProjectionMatrix(model.keyMatrices.vcpc, aspectRatio, cRange, model.renderable.getWindowCenterByReference());\n mat4.multiply(model.keyMatrices.scpc, model.keyMatrices.vcpc, model.keyMatrices.scvc);\n mat4.invert(model.keyMatrices.pcsc, model.keyMatrices.scpc);\n model.keyMatrixTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n keyMatrixTime: null,\n keyMatrices: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n macro.obj(model.keyMatrixTime); // values always get set by the get method\n\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n vcpc: new Float64Array(16),\n pcsc: new Float64Array(16),\n wcvc: new Float64Array(16),\n scpc: new Float64Array(16),\n scvc: new Float64Array(16)\n }; // Build VTK API\n\n macro.setGet(publicAPI, model, ['keyMatrixTime']); // Object methods\n\n vtkWebGPUCamera(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkCamera', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n// vtkWebGPUBindGroup methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUBindGroup(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUBindGroup');\n\n publicAPI.setBindables = function (bindables) {\n // is there a difference between the old and new list?\n if (model.bindables.length === bindables.length) {\n var allMatch = true;\n\n for (var i = 0; i < model.bindables.length; i++) {\n if (model.bindables[i] !== bindables[i]) {\n allMatch = false;\n }\n }\n\n if (allMatch) {\n return;\n }\n } // there is a difference\n\n\n model.bindables = bindables;\n publicAPI.modified();\n };\n\n publicAPI.getBindGroupLayout = function (device) {\n var entries = [];\n\n for (var i = 0; i < model.bindables.length; i++) {\n var entry = model.bindables[i].getBindGroupLayoutEntry();\n entry.binding = i;\n entries.push(entry);\n }\n\n return device.getBindGroupLayout({\n entries: entries\n });\n };\n\n publicAPI.getBindGroup = function (device) {\n // check mtime\n var mtime = publicAPI.getMTime();\n\n for (var i = 0; i < model.bindables.length; i++) {\n var tm = model.bindables[i].getBindGroupTime().getMTime();\n mtime = tm > mtime ? tm : mtime;\n }\n\n if (mtime < model.bindGroupTime.getMTime()) {\n return model.bindGroup;\n }\n\n var entries = [];\n\n for (var _i = 0; _i < model.bindables.length; _i++) {\n var entry = model.bindables[_i].getBindGroupEntry();\n\n entry.binding = _i;\n entries.push(entry);\n }\n\n model.bindGroup = device.getHandle().createBindGroup({\n layout: publicAPI.getBindGroupLayout(device),\n entries: entries,\n label: model.label\n });\n model.bindGroupTime.modified();\n return model.bindGroup;\n };\n\n publicAPI.getShaderCode = function (pipeline) {\n var lines = [];\n var bgroup = pipeline.getBindGroupLayoutCount(model.label);\n\n for (var i = 0; i < model.bindables.length; i++) {\n lines.push(model.bindables[i].getShaderCode(i, bgroup));\n }\n\n return lines.join('\\n');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n label: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.bindables = [];\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n macro.get(publicAPI, model, ['bindGroupTime', 'handle', 'sizeInBytes', 'usage']);\n macro.setGet(publicAPI, model, ['label', 'device', 'arrayInformation']);\n vtkWebGPUBindGroup(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUBindGroup$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUBindGroup$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n// vtkWebGPUShaderModule methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUShaderModule(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUShaderModule');\n\n publicAPI.initialize = function (device, shaderDesc) {\n model.device = device; // console.log(shaderDesc.getCode());\n\n model.handle = model.device.getHandle().createShaderModule({\n code: shaderDesc.getCode()\n });\n }; // publicAPI.setLastCameraMTime = (mtime) => {\n // model.lastCameraMTime = mtime;\n // };\n\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['lastCameraMTime']);\n macro.setGet(publicAPI, model, ['device', 'handle']); // Object methods\n\n vtkWebGPUShaderModule(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUShaderModule'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUShaderModule$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUShaderModule$1 as default };\n","import macro from '../../macros.js';\nimport vtkWebGPUShaderModule from './ShaderModule.js';\n\n// this is useful for building up shader strings which typically involve\n// lots of string substitutions. Return true if a substitution was done.\n\nfunction substitute(source, search, replace) {\n var all = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var replaceStr = Array.isArray(replace) ? replace.join('\\n') : replace;\n var replaced = false;\n\n if (source.search(search) !== -1) {\n replaced = true;\n }\n\n var gflag = '';\n\n if (all) {\n gflag = 'g';\n }\n\n var regex = new RegExp(search, gflag);\n var resultstr = source.replace(regex, replaceStr);\n return {\n replace: replaced,\n result: resultstr\n };\n} // ----------------------------------------------------------------------------\n// vtkWebGPUShaderCache methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUShaderCache(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUShaderCache');\n\n publicAPI.getShaderModule = function (shaderDesc) {\n // has it already been created?\n var sType = shaderDesc.getType();\n var sHash = shaderDesc.getHash();\n\n var keys = model._shaderModules.keys();\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key.getHash() === sHash && key.getType() === sType) {\n return model._shaderModules.get(key);\n }\n } // console.log(JSON.stringify(shaderDesc));\n\n\n var sm = vtkWebGPUShaderModule.newInstance();\n sm.initialize(model.device, shaderDesc);\n\n model._shaderModules.set(shaderDesc, sm);\n\n return sm;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n shaderModules: null,\n device: null,\n window: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Internal objects\n\n model._shaderModules = new Map(); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['device', 'window']); // Object methods\n\n vtkWebGPUShaderCache(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUShaderCache'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUShaderCache$1 = {\n newInstance: newInstance,\n extend: extend,\n substitute: substitute\n};\n\nexport { vtkWebGPUShaderCache$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1, obj, get, setGet } from '../../macros.js';\n\n// vtkWebGPUPipeline methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPipeline(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUPipeline');\n\n publicAPI.getShaderDescriptions = function () {\n return model.shaderDescriptions;\n };\n\n publicAPI.initialize = function (device, hash) {\n // start with the renderencoder settings\n model.pipelineDescription = model.renderEncoder.getPipelineSettings();\n model.pipelineDescription.primitive.topology = model.topology;\n model.pipelineDescription.vertex = model.vertexState;\n model.pipelineDescription.label = hash; // add in bind group layouts\n\n var bindGroupLayouts = [];\n\n for (var i = 0; i < model.layouts.length; i++) {\n bindGroupLayouts.push(model.layouts[i].layout);\n }\n\n model.pipelineLayout = device.getHandle().createPipelineLayout({\n bindGroupLayouts: bindGroupLayouts\n });\n model.pipelineDescription.layout = model.pipelineLayout;\n\n for (var _i = 0; _i < model.shaderDescriptions.length; _i++) {\n var sd = model.shaderDescriptions[_i];\n var sm = device.getShaderModule(sd);\n\n if (sd.getType() === 'vertex') {\n model.pipelineDescription.vertex.module = sm.getHandle();\n model.pipelineDescription.vertex.entryPoint = 'main';\n }\n\n if (sd.getType() === 'fragment') {\n model.pipelineDescription.fragment.module = sm.getHandle();\n model.pipelineDescription.fragment.entryPoint = 'main';\n }\n }\n\n model.handle = device.getHandle().createRenderPipeline(model.pipelineDescription);\n };\n\n publicAPI.getShaderDescription = function (stype) {\n for (var i = 0; i < model.shaderDescriptions.length; i++) {\n if (model.shaderDescriptions[i].getType() === stype) return model.shaderDescriptions[i];\n }\n\n return null;\n };\n\n publicAPI.addBindGroupLayout = function (bindGroup) {\n if (!bindGroup) {\n return;\n }\n\n model.layouts.push({\n layout: bindGroup.getBindGroupLayout(model.device),\n label: bindGroup.getLabel()\n });\n };\n\n publicAPI.getBindGroupLayout = function (idx) {\n return model.layouts[idx].layout;\n };\n\n publicAPI.getBindGroupLayoutCount = function (llabel) {\n for (var i = 0; i < model.layouts.length; i++) {\n if (model.layouts[i].label === llabel) {\n return i;\n }\n }\n\n return 0;\n };\n\n publicAPI.bindVertexInput = function (renderEncoder, vInput) {\n vInput.bindBuffers(renderEncoder);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n handle: null,\n layouts: null,\n renderEncoder: null,\n shaderDescriptions: null,\n vertexState: null,\n topology: null,\n pipelineDescription: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n obj(publicAPI, model);\n model.layouts = [];\n model.shaderDescriptions = [];\n get(publicAPI, model, ['handle', 'pipelineDescription']);\n setGet(publicAPI, model, ['device', 'renderEncoder', 'topology', 'vertexState']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkWebGPUPipeline(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUPipeline'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUPipeline$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUPipeline$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\n\n// vtkWebGPUShaderDescription methods\n// ----------------------------------------------------------------------------\n// shader description\n\nfunction vtkWebGPUShaderDescription(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUShaderDescription');\n\n publicAPI.hasOutput = function (name) {\n return model.outputNames.includes(name);\n };\n\n publicAPI.addOutput = function (type, name) {\n var interpolation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n model.outputTypes.push(type);\n model.outputNames.push(name);\n model.outputInterpolations.push(interpolation);\n };\n\n publicAPI.addBuiltinOutput = function (type, name) {\n model.builtinOutputTypes.push(type);\n model.builtinOutputNames.push(name);\n };\n\n publicAPI.addBuiltinInput = function (type, name) {\n model.builtinInputTypes.push(type);\n model.builtinInputNames.push(name);\n }; // perform shader replacements for the input and outputs\n // of this shader. That includes vertex inputs if specified\n\n\n publicAPI.replaceShaderCode = function (priorStage, vertexInput) {\n var inputImpl = [];\n var iodec = [];\n\n if (vertexInput) {\n inputImpl.push(vertexInput.getShaderCode());\n }\n\n if (priorStage || model.builtinInputNames.length) {\n var inputStruct = [];\n inputStruct.push(\"struct \".concat(model.type, \"Input\\n{\"));\n\n if (priorStage) {\n var inputNames = priorStage.getOutputNamesByReference();\n var inputTypes = priorStage.getOutputTypesByReference();\n var inputInterpolations = priorStage.getOutputInterpolationsByReference();\n\n for (var i = 0; i < inputNames.length; i++) {\n if (inputInterpolations[i] !== undefined) {\n inputStruct.push(\" @location(\".concat(i, \") @interpolate(\").concat(inputInterpolations[i], \") \").concat(inputNames[i], \" : \").concat(inputTypes[i], \",\"));\n } else {\n inputStruct.push(\" @location(\".concat(i, \") \").concat(inputNames[i], \" : \").concat(inputTypes[i], \",\"));\n }\n }\n }\n\n for (var _i = 0; _i < model.builtinInputNames.length; _i++) {\n inputStruct.push(\" \".concat(model.builtinInputNames[_i], \" : \").concat(model.builtinInputTypes[_i], \",\"));\n }\n\n if (inputStruct.length > 1) {\n inputStruct.push('};');\n iodec = inputStruct;\n inputImpl[inputImpl.length - 1] += ',';\n inputImpl.push(\"input: \".concat(model.type, \"Input\"));\n }\n }\n\n if (inputImpl.length) {\n model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Input', inputImpl).result;\n }\n\n if (model.outputNames.length + model.builtinOutputNames.length) {\n var outputStruct = [\"struct \".concat(model.type, \"Output\\n{\")];\n\n for (var _i2 = 0; _i2 < model.outputNames.length; _i2++) {\n if (model.outputInterpolations[_i2] !== undefined) {\n outputStruct.push(\" @location(\".concat(_i2, \") @interpolate(\").concat(model.outputInterpolations[_i2], \") \").concat(model.outputNames[_i2], \" : \").concat(model.outputTypes[_i2], \",\"));\n } else {\n outputStruct.push(\" @location(\".concat(_i2, \") \").concat(model.outputNames[_i2], \" : \").concat(model.outputTypes[_i2], \",\"));\n }\n }\n\n for (var _i3 = 0; _i3 < model.builtinOutputNames.length; _i3++) {\n outputStruct.push(\" \".concat(model.builtinOutputNames[_i3], \" : \").concat(model.builtinOutputTypes[_i3], \",\"));\n }\n\n outputStruct.push('};');\n iodec = iodec.concat(outputStruct);\n model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Output', [\"-> \".concat(model.type, \"Output\")]).result;\n }\n\n model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Dec', iodec).result;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n type: null,\n // 'vertex' or 'fragment'\n hash: null,\n code: null,\n outputNames: null,\n outputTypes: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n model.outputNames = [];\n model.outputTypes = [];\n model.outputInterpolations = [];\n model.builtinOutputNames = [];\n model.builtinOutputTypes = [];\n model.builtinInputNames = [];\n model.builtinInputTypes = []; // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['type', 'hash', 'code']);\n macro.getArray(publicAPI, model, ['outputTypes', 'outputNames', 'outputInterpolations']); // Object methods\n\n vtkWebGPUShaderDescription(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUShaderDescription'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUShaderDescription$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUShaderDescription$1 as default, extend, newInstance };\n","import { vtkErrorMacro } from '../../macros.js';\n\n// vtkWebGPUDevice static functions\n//\n// WebGPU uses types in a many places and calls, and often those types\n// need to be associated with byte sizes, alignments, native arrays etc.\n// The folowing methods are designed to help vtk.js introspect those types.\n// WebGPU currently tends to use multiple type formats:\n// - buffer types such as float32x4\n// - shader types suchs as vec4\n// - texture types such as rgba32float\n// ----------------------------------------------------------------------------\n// see https://gpuweb.github.io/gpuweb/#texture-formats\n// for possible formats, there are a lot of them\n\nvar textureDetails = {\n // 8-bit formats\n r8unorm: {\n numComponents: 1,\n nativeType: Uint8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'float'\n },\n r8snorm: {\n numComponents: 1,\n nativeType: Int8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'float'\n },\n r8uint: {\n numComponents: 1,\n nativeType: Uint8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'uint'\n },\n r8sint: {\n numComponents: 1,\n nativeType: Int8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'sint'\n },\n // 16-bit formats\n r16uint: {\n numComponents: 1,\n nativeType: Uint16Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'uint'\n },\n r16sint: {\n numComponents: 1,\n nativeType: Int16Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'sint'\n },\n r16float: {\n numComponents: 1,\n nativeType: Float32Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'float'\n },\n rg8unorm: {\n numComponents: 2,\n nativeType: Uint8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'float'\n },\n rg8snorm: {\n numComponents: 2,\n nativeType: Int8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'float'\n },\n rg8uint: {\n numComponents: 2,\n nativeType: Uint8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'uint'\n },\n rg8sint: {\n numComponents: 2,\n nativeType: Int8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'sint'\n },\n // 32-bit formats\n r32uint: {\n numComponents: 1,\n nativeType: Uint32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'uint'\n },\n r32sint: {\n numComponents: 1,\n nativeType: Int32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'sint'\n },\n r32float: {\n numComponents: 1,\n nativeType: Float32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'unfilterable-float'\n },\n rg16uint: {\n numComponents: 2,\n nativeType: Uint16Array,\n stride: 4,\n elementSize: 2,\n sampleType: 'uint'\n },\n rg16sint: {\n numComponents: 2,\n nativeType: Int16Array,\n stride: 4,\n elementSize: 2,\n sampleType: 'sint'\n },\n rg16float: {\n numComponents: 2,\n nativeType: Float32Array,\n stride: 4,\n elementSize: 2,\n sampleType: 'float'\n },\n rgba8unorm: {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n 'rgba8unorm-srgb': {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n rgba8snorm: {\n numComponents: 4,\n nativeType: Int8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n rgba8uint: {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'uint'\n },\n rgba8sint: {\n numComponents: 4,\n nativeType: Int8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'sint'\n },\n bgra8unorm: {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n 'bgra8unorm-srgb': {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n // Packed 32-bit formats\n rgb9e5ufloat: {\n numComponents: 4,\n nativeType: Uint32Array,\n stride: 4,\n sampleType: 'float'\n },\n rgb10a2unorm: {\n numComponents: 4,\n nativeType: Uint32Array,\n stride: 4,\n sampleType: 'float'\n },\n rg11b10ufloat: {\n numComponents: 4,\n nativeType: Float32Array,\n stride: 4,\n sampleType: 'float'\n },\n // 64-bit formats\n rg32uint: {\n numComponents: 2,\n nativeType: Uint32Array,\n stride: 8,\n elementSize: 4,\n sampleType: 'uint'\n },\n rg32sint: {\n numComponents: 2,\n nativeType: Int32Array,\n stride: 8,\n elementSize: 4,\n sampleType: 'sint'\n },\n rg32float: {\n numComponents: 2,\n nativeType: Float32Array,\n stride: 8,\n elementSize: 4,\n sampleType: 'unfilterable-float'\n },\n rgba16uint: {\n numComponents: 4,\n nativeType: Uint16Array,\n stride: 8,\n elementSize: 2,\n sampleType: 'uint'\n },\n rgba16sint: {\n numComponents: 4,\n nativeType: Int16Array,\n stride: 8,\n elementSize: 2,\n sampleType: 'sint'\n },\n rgba16float: {\n numComponents: 4,\n nativeType: Float32Array,\n stride: 8,\n elementSize: 2,\n sampleType: 'float'\n },\n // 128-bit formats\n rgba32uint: {\n numComponents: 4,\n nativeType: Uint32Array,\n stride: 16,\n elementSize: 4,\n sampleType: 'uint'\n },\n rgba32sint: {\n numComponents: 4,\n nativeType: Int32Array,\n stride: 16,\n elementSize: 4,\n sampleType: 'sint'\n },\n rgba32float: {\n numComponents: 4,\n nativeType: Float32Array,\n stride: 16,\n elementSize: 4,\n sampleType: 'unfilterable-float'\n },\n // Depth and stencil formats\n stencil8: {\n numComponents: 1,\n nativeType: Uint8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'uint'\n },\n depth16unorm: {\n numComponents: 1,\n nativeType: Uint16Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'depth'\n },\n depth24plus: {\n numComponents: 1,\n nativeType: Uint32Array,\n stride: 4,\n elementSize: 3,\n sampleType: 'depth'\n },\n 'depth24plus-stencil8': {\n numComponents: 2,\n nativeType: Uint32Array,\n stride: 4,\n sampleType: 'mixed'\n },\n depth32float: {\n numComponents: 1,\n nativeType: Float32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'depth'\n }\n};\n\nfunction getDetailsFromTextureFormat(format) {\n if (!format || format.length < 6) return 0;\n\n if (format in textureDetails === true) {\n return textureDetails[format];\n }\n\n vtkErrorMacro(\"unknown format \".concat(format));\n return null;\n} // see https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat\n// for possible formats\n\n\nfunction getByteStrideFromBufferFormat(format) {\n if (!format || format.length < 5) return 0; // options are x2, x3, x4 or nothing\n\n var numComp = 1;\n\n if (format[format.length - 2] === 'x') {\n numComp = Number(format[format.length - 1]);\n }\n\n var sizeStart = numComp === 1 ? format.length - 1 : format.length - 3; // options are 8, 16, 32 resulting in 8, 6, 2 as the last char\n // plugged into the formula below gives 1, 2, 4 respectively\n\n var num = Number(format[sizeStart]);\n\n if (Number.isNaN(num)) {\n vtkErrorMacro(\"unknown format \".concat(format));\n return 0;\n }\n\n var typeSize = 5 - num / 2;\n return numComp * typeSize;\n} // see https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat\n// for possible formats\n\n\nfunction getNumberOfComponentsFromBufferFormat(format) {\n if (!format || format.length < 5) return 0; // options are x2, x3, x4 or nothing\n\n var numComp = 1;\n\n if (format[format.length - 2] === 'x') {\n numComp = Number(format[format.length - 1]);\n }\n\n return numComp;\n} // see https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat\n// for possible formats\n\n\nfunction getNativeTypeFromBufferFormat(format) {\n if (!format || format.length < 5) return 0; // raw types are Uint Int or Float as follows\n\n var result;\n\n if (format[0] === 'f') {\n result = 'Float';\n } else if (format[0] === 's') {\n result = 'Int';\n } else if (format[0] === 'u') {\n result = 'Uint';\n } else {\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n } // options are 8, 16, 32 resulting in 8, 6, 2 as the last char\n // plugged into the formula below gives 1, 2, 4 respectively\n\n\n var base = format.split('x')[0];\n var num = Number(base[base.length - 1]);\n\n if (Number.isNaN(num)) {\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n }\n\n result += 8 * (5 - num / 2);\n result += 'Array';\n return result;\n}\n\nfunction getShaderTypeFromBufferFormat(format) {\n var dataType;\n\n if (format[0] === 'f' || format[1] === 'n') {\n dataType = 'f32';\n } else if (format[0] === 's' && format[1] === 'i') {\n dataType = 'i32';\n } else if (format[0] === 'u' && format[1] === 'i') {\n dataType = 'u32';\n } else {\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n } // options are x2, x3, x4 or nothing\n\n\n var numComp = 1;\n\n if (format[format.length - 2] === 'x') {\n numComp = Number(format[format.length - 1]);\n }\n\n if (numComp === 4) return \"vec4<\".concat(dataType, \">\");\n if (numComp === 3) return \"vec3<\".concat(dataType, \">\");\n if (numComp === 2) return \"vec2<\".concat(dataType, \">\");\n return dataType;\n}\n\nfunction getByteStrideFromShaderFormat(format) {\n if (!format) return 0;\n var numComp = 1;\n\n if (format.substring(0, 3) === 'vec') {\n numComp = Number(format[3]);\n } else if (format.substring(0, 3) === 'mat') {\n numComp = format[3] * format[5];\n }\n\n var typeSize = 4;\n return numComp * typeSize;\n}\n\nfunction getNativeTypeFromShaderFormat(format) {\n if (!format) return undefined;\n if (format.includes('f32')) return 'Float32Array';\n if (format.includes('i32')) return 'Int32Array';\n if (format.includes('u32')) return 'Uint32Array';\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n}\n\nvar vtkWebGPUTypes = {\n getDetailsFromTextureFormat: getDetailsFromTextureFormat,\n getByteStrideFromBufferFormat: getByteStrideFromBufferFormat,\n getNumberOfComponentsFromBufferFormat: getNumberOfComponentsFromBufferFormat,\n getNativeTypeFromBufferFormat: getNativeTypeFromBufferFormat,\n getShaderTypeFromBufferFormat: getShaderTypeFromBufferFormat,\n getByteStrideFromShaderFormat: getByteStrideFromShaderFormat,\n getNativeTypeFromShaderFormat: getNativeTypeFromShaderFormat\n};\n\nexport { vtkWebGPUTypes as default };\n","import { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkWebGPUTypes from './Types.js';\n\nfunction arraysEqual(a, b) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n\n for (var i = 0; i < a.length; ++i) {\n if (!b.includes(a[i])) return false;\n }\n\n return true;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUVertexInput methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUVertexInput(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUVertexInput');\n\n publicAPI.addBuffer = function (buffer, inames) {\n var stepMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'vertex';\n var names = inames;\n\n if (!Array.isArray(names)) {\n names = [names];\n } // only add if it is a new setting\n\n\n for (var i = 0; i < model.inputs.length; i++) {\n if (arraysEqual(model.inputs[i].names, names)) {\n if (model.inputs[i].buffer === buffer) {\n return;\n }\n\n model.inputs[i].buffer = buffer;\n return;\n }\n } // when adding a new entry, make sure we sort the array\n // as the order is important to the shader and must always\n // be the same, so alphabetical is an easy option\n\n\n model.inputs.push({\n buffer: buffer,\n stepMode: stepMode,\n names: names\n });\n model.inputs = model.inputs.sort(function (v1, v2) {\n if (v1.names[0] < v2.names[0]) {\n return -1;\n }\n\n if (v1.names[0] > v2.names[0]) {\n return 1;\n }\n\n return 0;\n });\n };\n\n publicAPI.removeBufferIfPresent = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n model.inputs.splice(i, 1);\n }\n }\n };\n\n publicAPI.getBuffer = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n return model.inputs[i].buffer;\n }\n }\n\n return null;\n };\n\n publicAPI.hasAttribute = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n return true;\n }\n }\n\n return false;\n };\n\n publicAPI.getAttributeTime = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n return model.inputs[i].buffer.getSourceTime();\n }\n }\n\n return 0;\n };\n\n publicAPI.getShaderCode = function () {\n var result = '';\n var nameCount = 0;\n\n for (var i = 0; i < model.inputs.length; i++) {\n for (var nm = 0; nm < model.inputs[i].names.length; nm++) {\n var arrayInfo = model.inputs[i].buffer.getArrayInformation()[nm];\n var type = vtkWebGPUTypes.getShaderTypeFromBufferFormat(arrayInfo.format);\n\n if (nameCount > 0) {\n result += ',\\n';\n }\n\n result = \"\".concat(result, \" @location(\").concat(nameCount, \") \").concat(model.inputs[i].names[nm], \" : \").concat(type);\n nameCount++;\n }\n }\n\n return result;\n };\n\n publicAPI.getVertexInputInformation = function () {\n var info = {};\n\n if (model.inputs.length) {\n var vertexBuffers = [];\n var nameCount = 0;\n\n for (var i = 0; i < model.inputs.length; i++) {\n var buf = model.inputs[i].buffer;\n var buffer = {\n arrayStride: buf.getStrideInBytes(),\n stepMode: model.inputs[i].stepMode,\n attributes: []\n };\n var arrayInfo = buf.getArrayInformation();\n\n for (var nm = 0; nm < model.inputs[i].names.length; nm++) {\n buffer.attributes.push({\n shaderLocation: nameCount,\n offset: arrayInfo[nm].offset,\n format: arrayInfo[nm].format\n });\n nameCount++;\n }\n\n vertexBuffers.push(buffer);\n }\n\n info.buffers = vertexBuffers;\n }\n\n return info;\n };\n\n publicAPI.bindBuffers = function (renderEncoder) {\n for (var i = 0; i < model.inputs.length; i++) {\n renderEncoder.setVertexBuffer(i, model.inputs[i].buffer.getHandle());\n }\n\n if (model.indexBuffer) {\n renderEncoder.setIndexBuffer(model.indexBuffer.getHandle(), model.indexBuffer.getArrayInformation()[0].format);\n }\n };\n\n publicAPI.getReady = function () {};\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.created) {\n model.inputs = [];\n model.bindingDescriptions = [];\n model.attributeDescriptions = [];\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n inputs: null,\n bindingDescriptions: false,\n attributeDescriptions: null,\n indexBuffer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n obj(publicAPI, model);\n model.bindingDescriptions = [];\n model.attributeDescriptions = [];\n model.inputs = [];\n setGet(publicAPI, model, ['created', 'device', 'handle', 'indexBuffer']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkWebGPUVertexInput(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUVertexInput'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUVertexInput$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUVertexInput$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport vtkWebGPUBindGroup from './BindGroup.js';\nimport vtkWebGPUPipeline from './Pipeline.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUShaderDescription from './ShaderDescription.js';\nimport vtkWebGPUVertexInput from './VertexInput.js';\n\nvar vtkWebGPUSimpleMapperVS = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::Normal::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@vertex\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : vertexOutput;\\n\\n // var vertex: vec4 = vertexBC;\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Select::Impl\\n\\n //VTK::Position::Impl\\n\\n return output;\\n}\\n\";\nvar vtkWebGPUSimpleMapperFS = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::Normal::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : fragmentOutput;\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::Light::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Select::Impl\\n\\n // var computedColor:vec4 = vec4(1.0,0.5,0.5,1.0);\\n\\n //VTK::RenderEncoder::Impl\\n return output;\\n}\\n\"; // ----------------------------------------------------------------------------\n// vtkWebGPUSimpleMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUSimpleMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUSimpleMapper');\n\n publicAPI.generateShaderDescriptions = function (hash, pipeline, vertexInput) {\n // create the shader descriptions\n var vDesc = vtkWebGPUShaderDescription.newInstance({\n type: 'vertex',\n hash: hash,\n code: model.vertexShaderTemplate\n });\n var fDesc = vtkWebGPUShaderDescription.newInstance({\n type: 'fragment',\n hash: hash,\n code: model.fragmentShaderTemplate\n }); // add them to the pipeline\n\n var sdrs = pipeline.getShaderDescriptions();\n sdrs.push(vDesc);\n sdrs.push(fDesc); // look for replacements to invoke\n\n var scode = model.vertexShaderTemplate + model.fragmentShaderTemplate; // eslint-disable-next-line prefer-regex-literals\n\n var re = new RegExp('//VTK::[^:]*::', 'g');\n var unique = scode.match(re).filter(function (v, i, a) {\n return a.indexOf(v) === i;\n });\n var fnames = unique.map(function (v) {\n return \"replaceShader\".concat(v.substring(7, v.length - 2));\n }); // now invoke shader replacement functions\n\n for (var i = 0; i < fnames.length; i++) {\n var fname = fnames[i];\n\n if (fname !== 'replaceShaderIOStructs' && model.shaderReplacements.has(fname)) {\n model.shaderReplacements.get(fname)(hash, pipeline, vertexInput);\n }\n } // always replace the IOStructs last as other replacement funcs may\n // add inputs or outputs\n\n\n publicAPI.replaceShaderIOStructs(hash, pipeline, vertexInput); // console.log(vDesc.getCode());\n // console.log(fDesc.getCode());\n };\n\n publicAPI.replaceShaderIOStructs = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.replaceShaderCode(null, vertexInput);\n var fDesc = pipeline.getShaderDescription('fragment');\n fDesc.replaceShaderCode(vDesc);\n };\n\n publicAPI.replaceShaderRenderEncoder = function (hash, pipeline, vertexInput) {\n model.renderEncoder.replaceShaderCode(pipeline);\n };\n\n model.shaderReplacements.set('replaceShaderRenderEncoder', publicAPI.replaceShaderRenderEncoder);\n\n publicAPI.replaceShaderRenderer = function (hash, pipeline, vertexInput) {\n if (!model.WebGPURenderer) {\n return;\n }\n\n var ubocode = model.WebGPURenderer.getBindGroup().getShaderCode(pipeline);\n var vDesc = pipeline.getShaderDescription('vertex');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Renderer::Dec', [ubocode]).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Renderer::Dec', [ubocode]).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderRenderer', publicAPI.replaceShaderRenderer);\n\n publicAPI.replaceShaderMapper = function (hash, pipeline, vertexInput) {\n var ubocode = model.bindGroup.getShaderCode(pipeline);\n var vDesc = pipeline.getShaderDescription('vertex');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Mapper::Dec', [ubocode]).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n fDesc.addBuiltinInput('bool', '@builtin(front_facing) frontFacing');\n code = fDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Mapper::Dec', [ubocode]).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderMapper', publicAPI.replaceShaderMapper);\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' output.Position = rendererUBO.SCPCMatrix*vertexBC;']).result;\n vDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addOutput('vec2', 'tcoordVS');\n };\n\n model.shaderReplacements.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);\n\n publicAPI.addTextureView = function (view) {\n // is it already there?\n if (model.textureViews.includes(view)) {\n return;\n }\n\n model.textureViews.push(view);\n }; // do everything required for this mapper to be rerady to draw\n // but do not bind or do the actual draw commands as the pipeline\n // is not neccessarily bound yet\n\n\n publicAPI.prepareToDraw = function (renderEncoder) {\n model.renderEncoder = renderEncoder; // do anything needed to get our input data up to date\n\n publicAPI.updateInput(); // make sure buffers are created and up to date\n\n publicAPI.updateBuffers(); // update bindings and bind groups/layouts\n // does not acutally bind them, that is done in draw(...)\n\n publicAPI.updateBindings(); // update the pipeline, includes computing the hash, and if needed\n // creating the pipeline, shader code etc\n\n publicAPI.updatePipeline();\n };\n\n publicAPI.updateInput = function () {};\n\n publicAPI.updateBuffers = function () {};\n\n publicAPI.updateBindings = function () {\n // bindings can change without a pipeline change\n // as long as their layout remains the same.\n // That is why this is done even when the pipeline\n // hash doesn't change.\n model.bindGroup.setBindables(publicAPI.getBindables());\n };\n\n publicAPI.computePipelineHash = function () {};\n\n publicAPI.registerDrawCallback = function (encoder) {\n encoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n };\n\n publicAPI.prepareAndDraw = function (encoder) {\n publicAPI.prepareToDraw(encoder);\n encoder.setPipeline(model.pipeline);\n publicAPI.draw(encoder);\n }; // do the rest of the calls required to draw this mapper\n // at this point the command encouder and pipeline are\n // created and bound\n\n\n publicAPI.draw = function (renderEncoder) {\n var pipeline = renderEncoder.getBoundPipeline(); // bind the mapper bind group\n\n renderEncoder.activateBindGroup(model.bindGroup);\n\n if (model.WebGPURenderer) {\n model.WebGPURenderer.bindUBO(renderEncoder);\n } // bind the vertex input\n\n\n pipeline.bindVertexInput(renderEncoder, model.vertexInput);\n var indexBuffer = model.vertexInput.getIndexBuffer();\n\n if (indexBuffer) {\n renderEncoder.drawIndexed(indexBuffer.getIndexCount(), model.numberOfInstances, 0, 0, 0);\n } else {\n renderEncoder.draw(model.numberOfVertices, model.numberOfInstances, 0, 0);\n }\n };\n\n publicAPI.getBindables = function () {\n var bindables = _toConsumableArray(model.additionalBindables);\n\n if (model.UBO) {\n bindables.push(model.UBO);\n }\n\n if (model.SSBO) {\n bindables.push(model.SSBO);\n } // add texture BindGroupLayouts\n\n\n for (var t = 0; t < model.textureViews.length; t++) {\n bindables.push(model.textureViews[t]);\n var samp = model.textureViews[t].getSampler();\n\n if (samp) {\n bindables.push(samp);\n }\n }\n\n return bindables;\n };\n\n publicAPI.updatePipeline = function () {\n publicAPI.computePipelineHash();\n model.pipeline = model.device.getPipeline(model.pipelineHash); // build the pipeline if needed\n\n if (!model.pipeline) {\n model.pipeline = vtkWebGPUPipeline.newInstance();\n model.pipeline.setDevice(model.device);\n\n if (model.WebGPURenderer) {\n model.pipeline.addBindGroupLayout(model.WebGPURenderer.getBindGroup());\n }\n\n model.pipeline.addBindGroupLayout(model.bindGroup);\n publicAPI.generateShaderDescriptions(model.pipelineHash, model.pipeline, model.vertexInput);\n model.pipeline.setTopology(model.topology);\n model.pipeline.setRenderEncoder(model.renderEncoder);\n model.pipeline.setVertexState(model.vertexInput.getVertexInputInformation());\n model.device.createPipeline(model.pipelineHash, model.pipeline);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n additionalBindables: undefined,\n bindGroup: null,\n device: null,\n fragmentShaderTemplate: null,\n numberOfInstances: 1,\n numberOfVertices: 0,\n pipelineHash: null,\n shaderReplacements: null,\n SSBO: null,\n textureViews: null,\n topology: 'triangle-list',\n UBO: null,\n vertexShaderTemplate: null,\n WebGPURenderer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.textureViews = [];\n model.vertexInput = vtkWebGPUVertexInput.newInstance();\n model.bindGroup = vtkWebGPUBindGroup.newInstance({\n label: 'mapperBG'\n });\n model.additionalBindables = [];\n model.fragmentShaderTemplate = model.fragmentShaderTemplate || vtkWebGPUSimpleMapperFS;\n model.vertexShaderTemplate = model.vertexShaderTemplate || vtkWebGPUSimpleMapperVS;\n model.shaderReplacements = new Map(); // Build VTK API\n\n macro.get(publicAPI, model, ['pipeline', 'vertexInput']);\n macro.setGet(publicAPI, model, ['additionalBindables', 'device', 'fragmentShaderTemplate', 'interpolate', 'numberOfInstances', 'numberOfVertices', 'pipelineHash', 'shaderReplacements', 'SSBO', 'textureViews', 'topology', 'UBO', 'vertexShaderTemplate', 'WebGPURenderer']); // Object methods\n\n vtkWebGPUSimpleMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUSimpleMapper'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUSimpleMapper$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUSimpleMapper$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUSimpleMapper from './SimpleMapper.js';\n\n// vtkWebGPUFullScreenQuad methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUFullScreenQuad(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUFullScreenQuad');\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n vDesc.addOutput('vec4', 'vertexVC');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', ['output.tcoordVS = vec2(vertexBC.x * 0.5 + 0.5, 1.0 - vertexBC.y * 0.5 - 0.5);', 'output.Position = vec4(vertexBC, 1.0);', 'output.vertexVC = vec4(vertexBC, 1);']).result;\n vDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.updateBuffers = function () {\n var buff = model.device.getBufferManager().getFullScreenQuadBuffer();\n model.vertexInput.addBuffer(buff, ['vertexBC']);\n model.numberOfVertices = 6;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkWebGPUSimpleMapper.extend(publicAPI, model, initialValues); // Object methods\n\n vtkWebGPUFullScreenQuad(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUFullScreenQuad'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUFullScreenQuad$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUFullScreenQuad$1 as default, extend, newInstance };\n","var BufferUsage = {\n Verts: 0,\n Lines: 1,\n Triangles: 2,\n Strips: 3,\n LinesFromStrips: 4,\n LinesFromTriangles: 5,\n Points: 6,\n UniformArray: 7,\n PointArray: 8,\n NormalsFromPoints: 9,\n Texture: 10,\n RawVertex: 11,\n Storage: 12,\n Index: 13\n};\nvar PrimitiveTypes = {\n Start: 0,\n Points: 0,\n Lines: 1,\n Triangles: 2,\n TriangleStrips: 3,\n TriangleEdges: 4,\n TriangleStripEdges: 5,\n End: 6\n};\nvar Constants = {\n BufferUsage: BufferUsage,\n PrimitiveTypes: PrimitiveTypes\n};\n\nexport { BufferUsage, PrimitiveTypes, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './BufferManager/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nvar forwarded = ['getMappedRange', 'mapAsync', 'unmap'];\n\nfunction bufferSubData(device, destBuffer, destOffset, srcArrayBuffer) {\n var byteCount = srcArrayBuffer.byteLength;\n var srcBuffer = device.createBuffer({\n size: byteCount,\n\n /* eslint-disable no-undef */\n usage: GPUBufferUsage.COPY_SRC,\n\n /* eslint-enable no-undef */\n mappedAtCreation: true\n });\n var arrayBuffer = srcBuffer.getMappedRange(0, byteCount);\n new Uint8Array(arrayBuffer).set(new Uint8Array(srcArrayBuffer)); // memcpy\n\n srcBuffer.unmap();\n var encoder = device.createCommandEncoder();\n encoder.copyBufferToBuffer(srcBuffer, 0, destBuffer, destOffset, byteCount);\n var commandBuffer = encoder.finish();\n var queue = device.queue;\n queue.submit([commandBuffer]);\n srcBuffer.destroy();\n} // ----------------------------------------------------------------------------\n// vtkWebGPUBufferManager methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUBuffer');\n\n publicAPI.create = function (sizeInBytes, usage) {\n model.handle = model.device.getHandle().createBuffer({\n size: sizeInBytes,\n usage: usage,\n label: model.label\n });\n model.sizeInBytes = sizeInBytes;\n model.usage = usage;\n };\n\n publicAPI.write = function (data) {\n bufferSubData(model.device.getHandle(), model.handle, 0, data.buffer);\n };\n\n publicAPI.createAndWrite = function (data, usage) {\n model.handle = model.device.getHandle().createBuffer({\n size: data.byteLength,\n usage: usage,\n mappedAtCreation: true,\n label: model.label\n });\n model.sizeInBytes = data.byteLength;\n model.usage = usage;\n new Uint8Array(model.handle.getMappedRange()).set(new Uint8Array(data.buffer)); // memcpy\n\n model.handle.unmap();\n }; // simple forwarders\n\n\n var _loop = function _loop(i) {\n publicAPI[forwarded[i]] = function () {\n var _model$handle;\n\n return (_model$handle = model.handle)[forwarded[i]].apply(_model$handle, arguments);\n };\n };\n\n for (var i = 0; i < forwarded.length; i++) {\n _loop(i);\n }\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n sizeInBytes: 0,\n strideInBytes: 0,\n arrayInformation: null,\n usage: null,\n label: null,\n sourceTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['handle', 'sizeInBytes', 'usage']);\n macro.setGet(publicAPI, model, ['strideInBytes', 'device', 'arrayInformation', 'label', 'sourceTime']);\n vtkWebGPUBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUBuffer$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkWebGPUBuffer$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport macro from '../../macros.js';\nimport Constants from './BufferManager/Constants.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkWebGPUBuffer from './Buffer.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Representation = vtkProperty.Representation;\nvar PrimitiveTypes = Constants.PrimitiveTypes; // Simulate a small map of pointId to flatId for a cell. The original code\n// used a map and was 2.6x slower (4.7 to 1.9 seconds). Using two fixed\n// length arrays with a count is so much faster even with the required for\n// loops and if statements. This only works as we know the usage is\n// restricted to clear(), set() get() and has() so the count is always\n// incrmenting except for clear where it goes back to 0. Performance\n// improvement is probably due to this appoach not hitting the heap but wow\n// it is so much faster. Code that adds to these vectors checks against 9 to\n// make sure there is room. Switching to test against vec.length -1 results\n// in a small performance hit, so if you change 10, search for 9 in this\n// small class and change those as well.\n\nvar _LimitedMap = /*#__PURE__*/function () {\n function _LimitedMap() {\n _classCallCheck(this, _LimitedMap);\n\n this.keys = new Uint32Array(10);\n this.values = new Uint32Array(10);\n this.count = 0;\n }\n\n _createClass(_LimitedMap, [{\n key: \"clear\",\n value: function clear() {\n this.count = 0;\n }\n }, {\n key: \"has\",\n value: function has(key) {\n for (var i = 0; i < this.count; i++) {\n if (this.keys[i] === key) {\n return true;\n }\n }\n\n return undefined;\n }\n }, {\n key: \"get\",\n value: function get(key) {\n for (var i = 0; i < this.count; i++) {\n if (this.keys[i] === key) {\n return this.values[i];\n }\n }\n\n return undefined;\n }\n }, {\n key: \"set\",\n value: function set(key, value) {\n if (this.count < 9) {\n this.keys[this.count] = key;\n this.values[this.count++] = value;\n }\n }\n }]);\n\n return _LimitedMap;\n}();\n\nfunction getPrimitiveName(primType) {\n switch (primType) {\n case PrimitiveTypes.Points:\n return 'points';\n\n case PrimitiveTypes.Lines:\n return 'lines';\n\n case PrimitiveTypes.Triangles:\n case PrimitiveTypes.TriangleEdges:\n return 'polys';\n\n case PrimitiveTypes.TriangleStripEdges:\n case PrimitiveTypes.TriangleStrips:\n return 'strips';\n\n default:\n return '';\n }\n}\n\nfunction _getOrAddFlatId(state, ptId, cellId) {\n var flatId = state.pointIdToFlatId[ptId];\n\n if (flatId < 0) {\n flatId = state.flatId;\n state.pointIdToFlatId[ptId] = flatId;\n state.flatIdToPointId[state.flatId] = ptId;\n state.flatIdToCellId[state.flatId] = cellId;\n state.flatId++;\n }\n\n return flatId;\n}\n\nfunction fillCell(ptIds, cellId, state) {\n var numPtIds = ptIds.length; // are any points already marked for this cell? If so use that as the provoking point\n\n for (var ptIdx = 0; ptIdx < numPtIds; ptIdx++) {\n var _ptId = ptIds[ptIdx];\n\n if (state.cellProvokedMap.has(_ptId)) {\n state.ibo[state.iboId++] = state.cellProvokedMap.get(_ptId); // insert remaining ptIds (they do not need to provoke)\n\n for (var ptIdx2 = ptIdx + 1; ptIdx2 < ptIdx + numPtIds; ptIdx2++) {\n _ptId = ptIds[ptIdx2 % numPtIds];\n\n var _flatId = _getOrAddFlatId(state, _ptId, cellId); // add to ibo\n\n\n state.ibo[state.iboId++] = _flatId;\n } // all done now\n\n\n return;\n }\n } // else have any of the points not been used yet? (not in provokedPointIds)\n\n\n for (var _ptIdx = 0; _ptIdx < numPtIds; _ptIdx++) {\n var _ptId2 = ptIds[_ptIdx];\n\n if (!state.provokedPointIds[_ptId2]) {\n var _flatId2 = _getOrAddFlatId(state, _ptId2, cellId); // mark provoking and add to ibo\n\n\n state.provokedPointIds[_ptId2] = 1;\n state.cellProvokedMap.set(_ptId2, _flatId2); // when provoking always set the cellId as an original non-provoking value\n // will have been stored and we need to overwrite that\n\n state.flatIdToCellId[_flatId2] = cellId;\n state.ibo[state.iboId++] = _flatId2; // insert remaining ptIds (they do not need to provoke)\n\n for (var _ptIdx2 = _ptIdx + 1; _ptIdx2 < _ptIdx + numPtIds; _ptIdx2++) {\n _ptId2 = ptIds[_ptIdx2 % numPtIds];\n _flatId2 = _getOrAddFlatId(state, _ptId2, cellId); // add to ibo\n\n state.ibo[state.iboId++] = _flatId2;\n } // all done now\n\n\n return;\n }\n } // if we got here then none of the ptIds could be used to provoke\n // so just duplicate the first one\n\n\n var ptId = ptIds[0];\n var flatId = state.flatId;\n state.cellProvokedMap.set(ptId, flatId);\n state.flatIdToPointId[state.flatId] = ptId;\n state.flatIdToCellId[state.flatId] = cellId;\n state.flatId++; // add to ibo\n\n state.ibo[state.iboId++] = flatId; // insert remaining ptIds (they do not need to provoke)\n\n for (var _ptIdx3 = 1; _ptIdx3 < numPtIds; _ptIdx3++) {\n ptId = ptIds[_ptIdx3];\n flatId = _getOrAddFlatId(state, ptId, cellId); // add to ibo\n\n state.ibo[state.iboId++] = flatId;\n }\n}\n\nfunction countCell(ptIds, cellId, state) {\n var numPtIds = ptIds.length;\n state.iboSize += numPtIds; // are any points already marked for this cell? If so use that as the provoking point\n\n for (var ptIdx = 0; ptIdx < numPtIds; ptIdx++) {\n var ptId = ptIds[ptIdx];\n\n if (state.cellProvokedMap.has(ptId)) {\n return;\n }\n } // else have any of the points not been used yet? (not in provokedPointIds)\n\n\n for (var _ptIdx4 = 0; _ptIdx4 < numPtIds; _ptIdx4++) {\n var _ptId3 = ptIds[_ptIdx4];\n\n if (!state.provokedPointIds[_ptId3]) {\n state.provokedPointIds[_ptId3] = 1;\n state.cellProvokedMap.set(_ptId3, 1);\n return;\n }\n } // if we got here then none of the ptIds could be used to provoke\n\n\n state.cellProvokedMap.set(ptIds[0], 1);\n state.extraPoints++;\n}\n\nvar processCell;\n\nvar _single = new Uint32Array(1);\n\nvar _double = new Uint32Array(2);\n\nvar _triple = new Uint32Array(3);\n\nvar _indexCellBuilders = {\n // easy, every input point becomes an output point\n anythingToPoints: function anythingToPoints(numPoints, cellPts, offset, cellId, state) {\n for (var i = 0; i < numPoints; ++i) {\n _single[0] = cellPts[offset + i];\n processCell(_single, cellId, state);\n }\n },\n linesToWireframe: function linesToWireframe(numPoints, cellPts, offset, cellId, state) {\n // for lines we add a bunch of segments\n for (var i = 0; i < numPoints - 1; ++i) {\n _double[0] = cellPts[offset + i];\n _double[1] = cellPts[offset + i + 1];\n processCell(_double, cellId, state);\n }\n },\n polysToWireframe: function polysToWireframe(numPoints, cellPts, offset, cellId, state) {\n // for polys we add a bunch of segments and close it\n if (numPoints > 2) {\n for (var i = 0; i < numPoints; ++i) {\n _double[0] = cellPts[offset + i];\n _double[1] = cellPts[offset + (i + 1) % numPoints];\n processCell(_double, cellId, state);\n }\n }\n },\n stripsToWireframe: function stripsToWireframe(numPoints, cellPts, offset, cellId, state) {\n if (numPoints > 2) {\n // for strips we add a bunch of segments and close it\n for (var i = 0; i < numPoints - 1; ++i) {\n _double[0] = cellPts[offset + i];\n _double[1] = cellPts[offset + i + 1];\n processCell(_double, cellId, state);\n }\n\n for (var _i = 0; _i < numPoints - 2; _i++) {\n _double[0] = cellPts[offset + _i];\n _double[1] = cellPts[offset + _i + 2];\n processCell(_double, cellId, state);\n }\n }\n },\n polysToSurface: function polysToSurface(npts, cellPts, offset, cellId, state) {\n for (var i = 0; i < npts - 2; i++) {\n _triple[0] = cellPts[offset];\n _triple[1] = cellPts[offset + i + 1];\n _triple[2] = cellPts[offset + i + 2];\n processCell(_triple, cellId, state);\n }\n },\n stripsToSurface: function stripsToSurface(npts, cellPts, offset, cellId, state) {\n for (var i = 0; i < npts - 2; i++) {\n _triple[0] = cellPts[offset + i];\n _triple[1] = cellPts[offset + i + 1 + i % 2];\n _triple[2] = cellPts[offset + i + 1 + (i + 1) % 2];\n processCell(_triple, cellId, state);\n }\n }\n}; // ----------------------------------------------------------------------------\n// vtkWebGPUIndexBufferManager methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUIndexBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUIndexBuffer');\n\n publicAPI.buildIndexBuffer = function (req) {\n var cellArray = req.cells;\n var primitiveType = req.primitiveType;\n var representation = req.representation;\n var cellOffset = req.cellOffset;\n var array = cellArray.getData();\n var cellArraySize = array.length;\n var inRepName = getPrimitiveName(primitiveType);\n var numPts = req.numberOfPoints;\n var state = {\n provokedPointIds: new Uint8Array(numPts),\n // size is good\n extraPoints: 0,\n iboSize: 0,\n flatId: 0,\n iboId: 0,\n cellProvokedMap: new _LimitedMap()\n };\n var func = null;\n\n if (representation === Representation.POINTS || primitiveType === PrimitiveTypes.Points) {\n func = _indexCellBuilders.anythingToPoints;\n } else if (representation === Representation.WIREFRAME || primitiveType === PrimitiveTypes.Lines) {\n func = _indexCellBuilders[\"\".concat(inRepName, \"ToWireframe\")];\n } else {\n func = _indexCellBuilders[\"\".concat(inRepName, \"ToSurface\")];\n } // first we count how many extra provoking points we need\n\n\n processCell = countCell;\n var cellId = cellOffset || 0;\n\n for (var cellArrayIndex = 0; cellArrayIndex < cellArraySize;) {\n state.cellProvokedMap.clear();\n func(array[cellArrayIndex], array, cellArrayIndex + 1, cellId, state);\n cellArrayIndex += array[cellArrayIndex] + 1;\n cellId++;\n } // then we allocate the remaining structures\n // (we pick the best size to save space and transfer costs)\n\n\n if (numPts <= 0xffff) {\n state.flatIdToPointId = new Uint16Array(numPts + state.extraPoints);\n } else {\n state.flatIdToPointId = new Uint32Array(numPts + state.extraPoints);\n }\n\n if (numPts + state.extraPoints < 0x8fff) {\n state.pointIdToFlatId = new Int16Array(numPts);\n } else {\n state.pointIdToFlatId = new Int32Array(numPts);\n }\n\n if (numPts + state.extraPoints <= 0xffff) {\n state.ibo = new Uint16Array(state.iboSize);\n req.format = 'uint16';\n } else {\n state.ibo = new Uint32Array(state.iboSize);\n req.format = 'uint32';\n }\n\n if (cellId <= 0xffff) {\n state.flatIdToCellId = new Uint16Array(numPts + state.extraPoints);\n } else {\n state.flatIdToCellId = new Uint32Array(numPts + state.extraPoints);\n }\n\n state.pointIdToFlatId.fill(-1);\n state.provokedPointIds.fill(0); // and fill them in\n\n processCell = fillCell;\n cellId = cellOffset || 0;\n\n for (var _cellArrayIndex = 0; _cellArrayIndex < cellArraySize;) {\n state.cellProvokedMap.clear();\n func(array[_cellArrayIndex], array, _cellArrayIndex + 1, cellId, state);\n _cellArrayIndex += array[_cellArrayIndex] + 1;\n cellId++;\n }\n\n delete state.provokedPointIds;\n delete state.pointIdToFlatId; // store the results we need\n\n req.nativeArray = state.ibo;\n model.flatIdToPointId = state.flatIdToPointId;\n model.flatIdToCellId = state.flatIdToCellId;\n model.flatSize = state.flatId;\n model.indexCount = state.iboId;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n flatIdToPointId: null,\n flatIdToCellId: null,\n flatSize: 0,\n indexCount: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkWebGPUBuffer.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['flatIdToPointId', 'flatIdToCellId', 'flatSize', 'indexCount']);\n vtkWebGPUIndexBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUIndexBuffer$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkWebGPUIndexBuffer$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1, obj, setGet, vtkErrorMacro as vtkErrorMacro$1, newTypedArray } from '../../macros.js';\nimport { j as cross, l as normalize } from '../../Common/Core/Math/index.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkWebGPUBuffer from './Buffer.js';\nimport vtkWebGPUIndexBuffer from './IndexBuffer.js';\nimport vtkWebGPUTypes from './Types.js';\nimport Constants from './BufferManager/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar BufferUsage = Constants.BufferUsage;\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes; // the webgpu constants all show up as undefined\n\n/* eslint-disable no-undef */\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nvar STATIC = {};\n\nfunction _getFormatForDataArray(dataArray) {\n var format;\n\n switch (dataArray.getDataType()) {\n case VtkDataTypes.UNSIGNED_CHAR:\n format = 'uint8';\n break;\n\n case VtkDataTypes.FLOAT:\n format = 'float32';\n break;\n\n case VtkDataTypes.UNSIGNED_INT:\n format = 'uint32';\n break;\n\n case VtkDataTypes.INT:\n format = 'sint32';\n break;\n\n case VtkDataTypes.DOUBLE:\n format = 'float32';\n break;\n\n case VtkDataTypes.UNSIGNED_SHORT:\n format = 'uint16';\n break;\n\n case VtkDataTypes.SHORT:\n format = 'sin16';\n break;\n\n default:\n format = 'float32';\n break;\n }\n\n switch (dataArray.getNumberOfComponents()) {\n case 2:\n format += 'x2';\n break;\n\n case 3:\n // only 32bit types support x3\n if (!format.includes('32')) {\n vtkErrorMacro(\"unsupported x3 type for \".concat(format));\n }\n\n format += 'x3';\n break;\n\n case 4:\n format += 'x4';\n break;\n }\n\n return format;\n}\n\nfunction packArray(indexBuffer, inArrayData, numComp, outputType, options) {\n var result = {};\n var flatSize = indexBuffer.getFlatSize();\n\n if (!flatSize) {\n return result;\n } // setup shift and scale\n\n\n var shift = [0.0, 0.0, 0.0, 0.0];\n\n if (options.shift) {\n if (options.shift.length) {\n shift = options.shift;\n } else {\n shift.fill(options.shift);\n }\n }\n\n var scale = [1.0, 1.0, 1.0, 1.0];\n\n if (options.scale) {\n if (options.scale.length) {\n scale = options.scale;\n } else {\n scale.fill(options.scale);\n }\n }\n\n var packExtra = Object.prototype.hasOwnProperty.call(options, 'packExtra') ? options.packExtra : false;\n var addAPoint;\n var vboidx = 0;\n var stride = numComp + (packExtra ? 1 : 0);\n var packedVBO = newTypedArray(outputType, flatSize * stride); // pick the right function based on point versus cell data\n\n var flatIdMap = indexBuffer.getFlatIdToPointId();\n\n if (options.cellData) {\n flatIdMap = indexBuffer.getFlatIdToCellId();\n } // add data based on number of components\n\n\n if (numComp === 1) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n };\n } else if (numComp === 2) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n };\n } else if (numComp === 3 && !packExtra) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n packedVBO[vboidx++] = scale[2] * inArrayData[i + 2] + shift[2];\n };\n } else if (numComp === 3 && packExtra) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n packedVBO[vboidx++] = scale[2] * inArrayData[i + 2] + shift[2];\n packedVBO[vboidx++] = scale[3] * 1.0 + shift[3];\n };\n } else if (numComp === 4) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n packedVBO[vboidx++] = scale[2] * inArrayData[i + 2] + shift[2];\n packedVBO[vboidx++] = scale[3] * inArrayData[i + 3] + shift[3];\n };\n } // for each entry in the flat array process it\n\n\n for (var index = 0; index < flatSize; index++) {\n var inArrayId = numComp * flatIdMap[index];\n addAPoint(inArrayId);\n }\n\n result.nativeArray = packedVBO;\n return result;\n}\n\nfunction getNormal(pointData, i0, i1, i2) {\n var v1 = [pointData[i2 * 3] - pointData[i1 * 3], pointData[i2 * 3 + 1] - pointData[i1 * 3 + 1], pointData[i2 * 3 + 2] - pointData[i1 * 3 + 2]];\n var v2 = [pointData[i0 * 3] - pointData[i1 * 3], pointData[i0 * 3 + 1] - pointData[i1 * 3 + 1], pointData[i0 * 3 + 2] - pointData[i1 * 3 + 2]];\n var result = [];\n cross(v1, v2, result);\n normalize(result);\n return result;\n}\n\nfunction generateNormals(cellArray, pointArray) {\n var pointData = pointArray.getData();\n var cellArrayData = cellArray.getData();\n\n if (!cellArrayData || !pointData) {\n return null;\n } // return a cellArray of normals\n\n\n var packedVBO = new Int8Array(cellArray.getNumberOfCells() * 4);\n var size = cellArrayData.length;\n var vboidx = 0;\n\n for (var index = 0; index < size;) {\n var normal = getNormal(pointData, cellArrayData[index + 1], cellArrayData[index + 2], cellArrayData[index + 3]);\n packedVBO[vboidx++] = 127 * normal[0];\n packedVBO[vboidx++] = 127 * normal[1];\n packedVBO[vboidx++] = 127 * normal[2];\n packedVBO[vboidx++] = 127;\n index += cellArrayData[index] + 1;\n }\n\n return packedVBO;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUBufferManager methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUBufferManager(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUBufferManager');\n\n function _createBuffer(req) {\n // if a dataArray is provided set the nativeArray\n if (req.dataArray && !req.nativeArray) {\n req.nativeArray = req.dataArray.getData();\n }\n\n var buffer;\n var gpuUsage; // handle index buffers\n\n if (req.usage === BufferUsage.Index) {\n // todo change to FlattenedIndex to be more clear\n buffer = vtkWebGPUIndexBuffer.newInstance({\n label: req.label\n });\n buffer.setDevice(model.device);\n /* eslint-disable no-bitwise */\n\n gpuUsage = GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST;\n /* eslint-enable no-bitwise */\n\n buffer.buildIndexBuffer(req);\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n buffer.setArrayInformation([{\n format: req.format\n }]);\n } // create one if not done already\n\n\n if (!buffer) {\n buffer = vtkWebGPUBuffer.newInstance({\n label: req.label\n });\n buffer.setDevice(model.device);\n } // handle uniform buffers\n\n\n if (req.usage === BufferUsage.UniformArray) {\n /* eslint-disable no-bitwise */\n gpuUsage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;\n /* eslint-enable no-bitwise */\n\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n } // handle storage buffers\n\n\n if (req.usage === BufferUsage.Storage) {\n /* eslint-disable no-bitwise */\n gpuUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST;\n /* eslint-enable no-bitwise */\n\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n } // handle textures\n\n\n if (req.usage === BufferUsage.Texture) {\n /* eslint-disable no-bitwise */\n gpuUsage = GPUBufferUsage.COPY_SRC;\n /* eslint-enable no-bitwise */\n\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n } // all of the below types that have gpuUsage = VERTEX require format\n // to be provided.\n // handle point data\n\n\n if (req.usage === BufferUsage.PointArray) {\n gpuUsage = GPUBufferUsage.VERTEX;\n var arrayType = vtkWebGPUTypes.getNativeTypeFromBufferFormat(req.format);\n var result = packArray(req.indexBuffer, req.dataArray.getData(), req.dataArray.getNumberOfComponents(), arrayType, {\n packExtra: req.packExtra,\n shift: req.shift,\n scale: req.scale,\n cellData: req.cellData,\n cellOffset: req.cellOffset\n });\n buffer.createAndWrite(result.nativeArray, gpuUsage);\n buffer.setStrideInBytes(vtkWebGPUTypes.getByteStrideFromBufferFormat(req.format));\n buffer.setArrayInformation([{\n offset: 0,\n format: req.format,\n interpolation: req.cellData ? 'flat' : 'perspective'\n }]);\n } // handle normals from points, snorm8x4\n\n\n if (req.usage === BufferUsage.NormalsFromPoints) {\n gpuUsage = GPUBufferUsage.VERTEX;\n\n var _arrayType = vtkWebGPUTypes.getNativeTypeFromBufferFormat(req.format);\n\n var normals = generateNormals(req.cells, req.dataArray);\n\n var _result = packArray(req.indexBuffer, normals, 4, _arrayType, {\n cellData: true\n });\n\n buffer.createAndWrite(_result.nativeArray, gpuUsage);\n buffer.setStrideInBytes(vtkWebGPUTypes.getByteStrideFromBufferFormat(req.format));\n buffer.setArrayInformation([{\n offset: 0,\n format: req.format,\n interpolation: 'flat'\n }]);\n }\n\n if (req.usage === BufferUsage.RawVertex) {\n gpuUsage = GPUBufferUsage.VERTEX;\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n buffer.setStrideInBytes(vtkWebGPUTypes.getByteStrideFromBufferFormat(req.format));\n buffer.setArrayInformation([{\n offset: 0,\n format: req.format\n }]);\n }\n\n buffer.setSourceTime(req.time);\n return buffer;\n } // is the buffer already present?\n\n\n publicAPI.hasBuffer = function (hash) {\n return model.device.hasCachedObject(hash);\n };\n\n publicAPI.getBuffer = function (req) {\n // if we have a source the get/create/cache the buffer\n if (req.hash) {\n return model.device.getCachedObject(req.hash, _createBuffer, req);\n }\n\n return _createBuffer(req);\n };\n\n publicAPI.getBufferForPointArray = function (dataArray, indexBuffer) {\n var format = _getFormatForDataArray(dataArray);\n\n var buffRequest = {\n hash: \"\".concat(dataArray.getMTime(), \"I\").concat(indexBuffer.getMTime()).concat(format),\n usage: BufferUsage.PointArray,\n format: format,\n dataArray: dataArray,\n indexBuffer: indexBuffer\n };\n return publicAPI.getBuffer(buffRequest);\n };\n\n publicAPI.getFullScreenQuadBuffer = function () {\n if (model.fullScreenQuadBuffer) {\n return model.fullScreenQuadBuffer;\n }\n\n model.fullScreenQuadBuffer = vtkWebGPUBuffer.newInstance();\n model.fullScreenQuadBuffer.setDevice(model.device); // prettier-ignore\n\n var array = new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0]);\n model.fullScreenQuadBuffer.createAndWrite(array, GPUBufferUsage.VERTEX);\n model.fullScreenQuadBuffer.setStrideInBytes(12);\n model.fullScreenQuadBuffer.setArrayInformation([{\n offset: 0,\n format: 'float32x3'\n }]);\n return model.fullScreenQuadBuffer;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n fullScreenQuadBuffer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n obj(publicAPI, model);\n setGet(publicAPI, model, ['device']);\n vtkWebGPUBufferManager(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUBufferManager$1 = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkWebGPUBufferManager$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUTypes from './Types.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkWebGPUStorageBuffer - similar to the UniformBuffer class\n// but YOU are responsible for layout issues and alignment.\n// The order you add entries is the order they will be layed out\n// in memory. But you must follow layout rules.\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkWebGPUStorageBuffer methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUStorageBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUStorageBuffer');\n\n publicAPI.addEntry = function (name, type) {\n if (model._bufferEntryNames.has(name)) {\n vtkErrorMacro(\"entry named \".concat(name, \" already exists\"));\n return;\n }\n\n model._bufferEntryNames.set(name, model.bufferEntries.length);\n\n var sizeInBytes = vtkWebGPUTypes.getByteStrideFromShaderFormat(type);\n model.bufferEntries.push({\n name: name,\n type: type,\n sizeInBytes: sizeInBytes,\n offset: model.sizeInBytes,\n nativeType: vtkWebGPUTypes.getNativeTypeFromShaderFormat(type)\n });\n model.sizeInBytes += sizeInBytes;\n };\n\n publicAPI.send = function (device) {\n if (!model._buffer) {\n var req = {\n nativeArray: model.Float32Array,\n usage: BufferUsage.Storage,\n label: model.label\n };\n model._buffer = device.getBufferManager().getBuffer(req);\n model.bindGroupTime.modified();\n\n model._sendTime.modified();\n\n return;\n }\n\n device.getHandle().queue.writeBuffer(model._buffer.getHandle(), 0, model.arrayBuffer, 0, model.sizeInBytes * model.numberOfInstances);\n\n model._sendTime.modified();\n };\n\n publicAPI.createView = function (type) {\n if (type in model === false) {\n if (!model.arrayBuffer) {\n model.arrayBuffer = new ArrayBuffer(model.sizeInBytes * model.numberOfInstances);\n }\n\n model[type] = macro.newTypedArray(type, model.arrayBuffer);\n }\n };\n\n publicAPI.setValue = function (name, instance, val) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n view[(entry.offset + instance * model.sizeInBytes) / view.BYTES_PER_ELEMENT] = val;\n };\n\n publicAPI.setArray = function (name, instance, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var ioffset = (entry.offset + instance * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var i = 0; i < arr.length; i++) {\n view[ioffset + i] = arr[i];\n }\n };\n\n publicAPI.setAllInstancesFromArray = function (name, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var numComponents = arr.length / model.numberOfInstances;\n\n for (var inst = 0; inst < model.numberOfInstances; inst++) {\n var ioffset = (entry.offset + inst * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var i = 0; i < numComponents; i++) {\n view[ioffset + i] = arr[inst * numComponents + i];\n }\n }\n };\n\n publicAPI.setAllInstancesFromArrayColorToFloat = function (name, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var numComponents = arr.length / model.numberOfInstances;\n\n for (var inst = 0; inst < model.numberOfInstances; inst++) {\n var ioffset = (entry.offset + inst * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var i = 0; i < numComponents; i++) {\n view[ioffset + i] = arr[inst * numComponents + i] / 255.0;\n }\n }\n };\n\n publicAPI.setAllInstancesFromArray3x3To4x4 = function (name, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var numComponents = 9;\n\n for (var inst = 0; inst < model.numberOfInstances; inst++) {\n var ioffset = (entry.offset + inst * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var j = 0; j < 3; j++) {\n for (var i = 0; i < 3; i++) {\n view[ioffset + j * 4 + i] = arr[inst * numComponents + j * 3 + i];\n }\n }\n }\n };\n\n publicAPI.getSendTime = function () {\n return model._sendTime.getMTime();\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n var lines = [\"struct \".concat(model.label, \"StructEntry\\n{\")];\n\n for (var i = 0; i < model.bufferEntries.length; i++) {\n var entry = model.bufferEntries[i];\n lines.push(\" \".concat(entry.name, \": \").concat(entry.type, \",\"));\n }\n\n lines.push(\"\\n};\\nstruct \".concat(model.label, \"Struct\\n{\\n values: array<\").concat(model.label, \"StructEntry>,\\n};\\n@binding(\").concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": \").concat(model.label, \"Struct;\\n\"));\n return lines.join('\\n');\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: {\n buffer: model._buffer.getHandle()\n }\n };\n return foo;\n };\n\n publicAPI.clearData = function () {\n model.numberOfInstances = 0;\n model.sizeInBytes = 0;\n model.bufferEntries = [];\n model._bufferEntryNames = new Map();\n model._buffer = null;\n delete model.arrayBuffer;\n delete model.Float32Array;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bufferEntries: null,\n bufferEntryNames: null,\n sizeInBytes: 0,\n label: null,\n numberOfInstances: 1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model); // Internal objects\n\n model._bufferEntryNames = new Map();\n model.bufferEntries = [];\n model._sendTime = {};\n macro.obj(model._sendTime, {\n mtime: 0\n });\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n }); // default SSBO desc\n\n model.bindGroupLayoutEntry = model.bindGroupLayoutEntry || {\n buffer: {\n type: 'read-only-storage'\n }\n };\n macro.get(publicAPI, model, ['bindGroupTime']);\n macro.setGet(publicAPI, model, ['device', 'bindGroupLayoutEntry', 'label', 'numberOfInstances', 'sizeInBytes']); // Object methods\n\n vtkWebGPUStorageBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUStorageBuffer'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUStorageBuffer$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUStorageBuffer$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUTypes from './Types.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkWebGPUUniformBuffer methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUUniformBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUUniformBuffer');\n\n publicAPI.addEntry = function (name, type) {\n if (model._bufferEntryNames.has(name)) {\n vtkErrorMacro(\"entry named \".concat(name, \" already exists\"));\n return;\n }\n\n model.sortDirty = true;\n\n model._bufferEntryNames.set(name, model.bufferEntries.length);\n\n model.bufferEntries.push({\n name: name,\n type: type,\n sizeInBytes: vtkWebGPUTypes.getByteStrideFromShaderFormat(type),\n offset: -1,\n nativeType: vtkWebGPUTypes.getNativeTypeFromShaderFormat(type),\n packed: false\n });\n }; // UBOs have layout rules in terms of how memory is aligned so we\n // have to be careful how we order the entries. For example a vec4\n // must be aligned on a 16 byte offset, etc. See\n // https://gpuweb.github.io/gpuweb/wgsl/#memory-layouts\n // for more details. Right now you can create a situation that would fail\n // in the future we could add dummy spacer entries where needed to\n // handle alignment issues\n\n\n publicAPI.sortBufferEntries = function () {\n if (!model.sortDirty) {\n return;\n }\n\n var currOffset = 0;\n var newEntries = []; // compute the max alignment, this is required as WebGPU defines a UBO to have\n // a size that is a multiple of the maxAlignment\n\n var maxAlignment = 4;\n\n for (var i = 0; i < model.bufferEntries.length; i++) {\n var entry = model.bufferEntries[i];\n\n if (entry.sizeInBytes % 16 === 0) {\n maxAlignment = Math.max(16, maxAlignment);\n }\n\n if (entry.sizeInBytes % 8 === 0) {\n maxAlignment = Math.max(8, maxAlignment);\n }\n } // pack anything whose size is a multiple of 16 bytes first\n // this includes a couple types that don't require 16 byte alignment\n // such as mat2x2 but that is OK\n\n\n for (var _i = 0; _i < model.bufferEntries.length; _i++) {\n var _entry = model.bufferEntries[_i];\n\n if (_entry.packed === false && _entry.sizeInBytes % 16 === 0) {\n _entry.packed = true;\n _entry.offset = currOffset;\n newEntries.push(_entry);\n currOffset += _entry.sizeInBytes;\n }\n } // now it gets tough, we have the following common types (f32, i32, u32)\n // - vec2 8 byte size, 8 byte alignment\n // - vec3 12 byte size, 16 byte alignment\n // - f32 4 byte size, 4 byte alignment\n // try adding 12 byte, 4 byte pairs\n\n\n for (var _i2 = 0; _i2 < model.bufferEntries.length; _i2++) {\n var _entry2 = model.bufferEntries[_i2];\n\n if (_entry2.packed === false && _entry2.sizeInBytes === 12) {\n for (var i2 = 0; i2 < model.bufferEntries.length; i2++) {\n var entry2 = model.bufferEntries[i2];\n\n if (entry2.packed === false && entry2.sizeInBytes === 4) {\n _entry2.packed = true;\n _entry2.offset = currOffset;\n newEntries.push(_entry2);\n currOffset += _entry2.sizeInBytes;\n entry2.packed = true;\n entry2.offset = currOffset;\n newEntries.push(entry2);\n currOffset += entry2.sizeInBytes;\n break;\n }\n }\n }\n } // try adding 8 byte, 8 byte pairs\n\n\n for (var _i3 = 0; _i3 < model.bufferEntries.length; _i3++) {\n var _entry3 = model.bufferEntries[_i3];\n\n if (!_entry3.packed && _entry3.sizeInBytes % 8 === 0) {\n for (var _i4 = _i3 + 1; _i4 < model.bufferEntries.length; _i4++) {\n var _entry4 = model.bufferEntries[_i4];\n\n if (!_entry4.packed && _entry4.sizeInBytes % 8 === 0) {\n _entry3.packed = true;\n _entry3.offset = currOffset;\n newEntries.push(_entry3);\n currOffset += _entry3.sizeInBytes;\n _entry4.packed = true;\n _entry4.offset = currOffset;\n newEntries.push(_entry4);\n currOffset += _entry4.sizeInBytes;\n break;\n }\n }\n }\n } // try adding 8 byte, 4 byte 4 byte triplets\n\n\n for (var _i5 = 0; _i5 < model.bufferEntries.length; _i5++) {\n var _entry5 = model.bufferEntries[_i5];\n\n if (!_entry5.packed && _entry5.sizeInBytes % 8 === 0) {\n var found = false;\n\n for (var _i6 = 0; !found && _i6 < model.bufferEntries.length; _i6++) {\n var _entry6 = model.bufferEntries[_i6];\n\n if (!_entry6.packed && _entry6.sizeInBytes === 4) {\n for (var i3 = _i6 + 1; i3 < model.bufferEntries.length; i3++) {\n var entry3 = model.bufferEntries[i3];\n\n if (!entry3.packed && entry3.sizeInBytes === 4) {\n _entry5.packed = true;\n _entry5.offset = currOffset;\n newEntries.push(_entry5);\n currOffset += _entry5.sizeInBytes;\n _entry6.packed = true;\n _entry6.offset = currOffset;\n newEntries.push(_entry6);\n currOffset += _entry6.sizeInBytes;\n entry3.packed = true;\n entry3.offset = currOffset;\n newEntries.push(entry3);\n currOffset += entry3.sizeInBytes;\n found = true;\n break;\n }\n }\n }\n }\n }\n } // Add anything remaining that is larger than 4 bytes and hope we get lucky.\n // Likely if there is more than one item added here it will result\n // in a failed UBO\n\n\n for (var _i7 = 0; _i7 < model.bufferEntries.length; _i7++) {\n var _entry7 = model.bufferEntries[_i7];\n\n if (!_entry7.packed && _entry7.sizeInBytes > 4) {\n _entry7.packed = true;\n _entry7.offset = currOffset;\n newEntries.push(_entry7);\n currOffset += _entry7.sizeInBytes;\n }\n } // finally add remaining 4 byte items\n\n\n for (var _i8 = 0; _i8 < model.bufferEntries.length; _i8++) {\n var _entry8 = model.bufferEntries[_i8];\n\n if (!_entry8.packed) {\n _entry8.packed = true;\n _entry8.offset = currOffset;\n newEntries.push(_entry8);\n currOffset += _entry8.sizeInBytes;\n }\n } // update entries and entryNames\n\n\n model.bufferEntries = newEntries;\n\n model._bufferEntryNames.clear();\n\n for (var _i9 = 0; _i9 < model.bufferEntries.length; _i9++) {\n model._bufferEntryNames.set(model.bufferEntries[_i9].name, _i9);\n }\n\n model.sizeInBytes = currOffset;\n model.sizeInBytes = maxAlignment * Math.ceil(model.sizeInBytes / maxAlignment);\n model.sortDirty = false;\n };\n\n publicAPI.sendIfNeeded = function (device) {\n if (!model.UBO) {\n var req = {\n nativeArray: model.Float32Array,\n usage: BufferUsage.UniformArray,\n label: model.label\n };\n model.UBO = device.getBufferManager().getBuffer(req);\n model.bindGroupTime.modified();\n model.sendDirty = false;\n } // send data down if needed\n\n\n if (model.sendDirty) {\n device.getHandle().queue.writeBuffer(model.UBO.getHandle(), 0, model.arrayBuffer, 0, model.sizeInBytes);\n model.sendDirty = false;\n } // always updated as mappers depend on this time\n // it is more of a sentIfNeededTime\n\n\n model.sendTime.modified();\n };\n\n publicAPI.createView = function (type) {\n if (type in model === false) {\n if (!model.arrayBuffer) {\n model.arrayBuffer = new ArrayBuffer(model.sizeInBytes);\n }\n\n model[type] = macro.newTypedArray(type, model.arrayBuffer);\n }\n };\n\n publicAPI.setValue = function (name, val) {\n publicAPI.sortBufferEntries();\n\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n\n if (entry.lastValue !== val) {\n view[entry.offset / view.BYTES_PER_ELEMENT] = val;\n model.sendDirty = true;\n }\n\n entry.lastValue = val;\n };\n\n publicAPI.setArray = function (name, arr) {\n publicAPI.sortBufferEntries();\n\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var changed = false;\n\n for (var i = 0; i < arr.length; i++) {\n if (!entry.lastValue || entry.lastValue[i] !== arr[i]) {\n view[entry.offset / view.BYTES_PER_ELEMENT + i] = arr[i];\n changed = true;\n }\n }\n\n if (changed) {\n model.sendDirty = true;\n entry.lastValue = _toConsumableArray(arr);\n }\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: {\n buffer: model.UBO.getHandle()\n }\n };\n return foo;\n };\n\n publicAPI.getSendTime = function () {\n return model.sendTime.getMTime();\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n // sort the entries\n publicAPI.sortBufferEntries();\n var lines = [\"struct \".concat(model.label, \"Struct\\n{\")];\n\n for (var i = 0; i < model.bufferEntries.length; i++) {\n var entry = model.bufferEntries[i];\n lines.push(\" \".concat(entry.name, \": \").concat(entry.type, \",\"));\n }\n\n lines.push(\"};\\n@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": \").concat(model.label, \"Struct;\"));\n return lines.join('\\n');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bufferEntries: null,\n bufferEntryNames: null,\n sizeInBytes: 0,\n label: null,\n bindGroupLayoutEntry: null,\n bindGroupEntry: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model); // Internal objects\n\n model._bufferEntryNames = new Map();\n model.bufferEntries = []; // default UBO desc\n\n model.bindGroupLayoutEntry = model.bindGroupLayoutEntry || {\n buffer: {\n type: 'uniform'\n }\n };\n model.sendTime = {};\n macro.obj(model.sendTime, {\n mtime: 0\n });\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n model.sendDirty = true;\n model.sortDirty = true;\n macro.get(publicAPI, model, ['binding', 'bindGroupTime']);\n macro.setGet(publicAPI, model, ['bindGroupLayoutEntry', 'device', 'label', 'sizeInBytes']); // Object methods\n\n vtkWebGPUUniformBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUUniformBuffer'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUUniformBuffer$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUUniformBuffer$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, get, getArray, setGet, vtkDebugMacro as vtkDebugMacro$1 } from '../../macros.js';\nimport { r as radiansFromDegrees } from '../../Common/Core/Math/index.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport vtkWebGPUBindGroup from './BindGroup.js';\nimport vtkWebGPUFullScreenQuad from './FullScreenQuad.js';\nimport vtkWebGPUStorageBuffer from './StorageBuffer.js';\nimport vtkWebGPUUniformBuffer from './UniformBuffer.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkDebugMacro = vtkDebugMacro$1;\nvar clearFragColorTemplate = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output: fragmentOutput;\\n\\n var computedColor: vec4 = mapperUBO.BackgroundColor;\\n\\n //VTK::RenderEncoder::Impl\\n return output;\\n}\\n\";\nvar clearFragTextureTemplate = \"\\nfn vecToRectCoord(dir: vec3) -> vec2 {\\n var tau: f32 = 6.28318530718;\\n var pi: f32 = 3.14159265359;\\n var out: vec2 = vec2(0.0);\\n\\n out.x = atan2(dir.z, dir.x) / tau;\\n out.x += 0.5;\\n\\n var phix: f32 = length(vec2(dir.x, dir.z));\\n out.y = atan2(dir.y, phix) / pi + 0.5;\\n\\n return out;\\n}\\n\\n//VTK::Renderer::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output: fragmentOutput;\\n\\n var tcoord: vec4 = vec4(input.vertexVC.xy, -1, 1);\\n var V: vec4 = normalize(mapperUBO.FSQMatrix * tcoord); // vec2((input.tcoordVS.x - 0.5) * 2, -(input.tcoordVS.y - 0.5) * 2);\\n // textureSampleLevel gets rid of some ugly artifacts\\n var background = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, vecToRectCoord(V.xyz), 0);\\n var computedColor: vec4 = vec4(background.rgb, 1);\\n\\n //VTK::RenderEncoder::Impl\\n return output;\\n}\\n\";\n\nvar _fsqClearMat4 = new Float64Array(16);\n\nvar _tNormalMat4 = new Float64Array(16); // Light type index gives either 0, 1, or 2 which indicates what type of light there is.\n// While technically, there are only spot and directional lights, within the CellArrayMapper\n// there is a third, positional light. It is technically just a variant of a spot light with\n// a cone angle of 90 or above, however certain calculations can be skipped if it is treated\n// separately.\n// The mappings are shown below:\n// 0 -> positional light\n// 1 -> directional light\n// 2 -> spot light\n\n\nfunction getLightTypeIndex(light) {\n if (light.getPositional()) {\n if (light.getConeAngle() >= 90) {\n return 0;\n }\n\n return 2;\n }\n\n return 1;\n} // ----------------------------------------------------------------------------\n// vtkWebGPURenderer methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-bitwise */\n\n\nfunction vtkWebGPURenderer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPURenderer'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model.camera = model.renderable.getActiveCamera();\n publicAPI.updateLights();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.camera);\n publicAPI.addMissingNodes(model.renderable.getViewPropsWithNestedProps());\n publicAPI.removeUnusedNodes();\n model.webgpuCamera = publicAPI.getViewNodeFor(model.camera);\n publicAPI.updateStabilizedMatrix();\n }\n };\n\n publicAPI.updateStabilizedMatrix = function () {\n // This method is designed to help with floating point\n // issues when rendering datasets that push the limits of\n // resolutions on float.\n //\n // One of the most common cases is when the dataset is located far\n // away from the origin relative to the clipping range we are looking\n // at. For that case we want to perform the floating point sensitive\n // multiplications on the CPU in double. To this end we want the\n // vertex rendering ops to look something like\n //\n // Compute shifted points and load those into the VBO\n // pointCoordsSC = WorldToStabilizedMatrix * pointCoords;\n //\n // In the vertex shader do the following\n // positionVC = StabilizedToDeviceMatrix * ModelToStabilizedMatrix*vertexIn;\n //\n // We use two matrices because it is expensive to change the\n // WorldToStabilized matrix as we have to reupload all pointCoords\n // So that matrix (MCSCMatrix) is fairly static, the Stabilized to\n // Device matrix is the one that gets updated every time the camera\n // changes.\n //\n // The basic idea is that we should translate the data so that\n // when the center of the view frustum moves a lot\n // we recenter it. The center of the view frustum is roughly\n // camPos + dirOfProj*(far + near)*0.5\n var clipRange = model.camera.getClippingRange();\n var pos = model.camera.getPositionByReference();\n var dop = model.camera.getDirectionOfProjectionByReference();\n var center = [];\n var offset = [];\n vec3.scale(offset, dop, 0.5 * (clipRange[0] + clipRange[1]));\n vec3.add(center, pos, offset);\n vec3.sub(offset, center, model.stabilizedCenter);\n var length = vec3.len(offset);\n\n if (length / (clipRange[1] - clipRange[0]) > model.recenterThreshold) {\n model.stabilizedCenter = center;\n model.stabilizedTime.modified();\n }\n };\n\n publicAPI.updateLights = function () {\n var count = 0;\n var lights = model.renderable.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n if (lights[index].getSwitch() > 0.0) {\n count++;\n }\n }\n\n if (!count) {\n vtkDebugMacro('No lights are on, creating one.');\n model.renderable.createLight();\n }\n\n return count;\n };\n\n publicAPI.updateUBO = function () {\n // make sure the data is up to date\n // has the camera changed?\n var utime = model.UBO.getSendTime();\n\n if (model._parent.getMTime() > utime || publicAPI.getMTime() > utime || model.camera.getMTime() > utime || model.renderable.getMTime() > utime) {\n var _model$renderable$get;\n\n var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);\n model.UBO.setArray('WCVCMatrix', keyMats.wcvc);\n model.UBO.setArray('SCPCMatrix', keyMats.scpc);\n model.UBO.setArray('PCSCMatrix', keyMats.pcsc);\n model.UBO.setArray('SCVCMatrix', keyMats.scvc);\n model.UBO.setArray('VCPCMatrix', keyMats.vcpc);\n model.UBO.setArray('WCVCNormals', keyMats.normalMatrix);\n model.UBO.setValue('LightCount', model.renderable.getLights().length);\n model.UBO.setValue('MaxEnvironmentMipLevel', (_model$renderable$get = model.renderable.getEnvironmentTexture()) === null || _model$renderable$get === void 0 ? void 0 : _model$renderable$get.getMipLevel());\n model.UBO.setValue('BackgroundDiffuseStrength', model.renderable.getEnvironmentTextureDiffuseStrength());\n model.UBO.setValue('BackgroundSpecularStrength', model.renderable.getEnvironmentTextureSpecularStrength());\n var tsize = publicAPI.getYInvertedTiledSizeAndOrigin();\n model.UBO.setArray('viewportSize', [tsize.usize, tsize.vsize]);\n model.UBO.setValue('cameraParallel', model.camera.getParallelProjection());\n\n var device = model._parent.getDevice();\n\n model.UBO.sendIfNeeded(device);\n }\n };\n\n publicAPI.updateSSBO = function () {\n var lights = model.renderable.getLights();\n var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);\n var lightTimeString = \"\".concat(model.renderable.getMTime());\n\n for (var i = 0; i < lights.length; i++) {\n lightTimeString += lights[i].getMTime();\n }\n\n if (lightTimeString !== model.lightTimeString) {\n var lightPosArray = new Float32Array(lights.length * 4);\n var lightDirArray = new Float32Array(lights.length * 4);\n var lightColorArray = new Float32Array(lights.length * 4);\n var lightTypeArray = new Float32Array(lights.length * 4);\n\n for (var _i = 0; _i < lights.length; _i++) {\n var offset = _i * 4; // Position\n\n var viewCoordinatePosition = lights[_i].getPosition();\n\n vec3.transformMat4(viewCoordinatePosition, viewCoordinatePosition, keyMats.wcvc); // viewCoordinatePosition\n\n lightPosArray[offset] = viewCoordinatePosition[0];\n lightPosArray[offset + 1] = viewCoordinatePosition[1];\n lightPosArray[offset + 2] = viewCoordinatePosition[2];\n lightPosArray[offset + 3] = 0; // Rotation (All are negative to correct for -Z being forward)\n\n lightDirArray[offset] = -lights[_i].getDirection()[0];\n lightDirArray[offset + 1] = -lights[_i].getDirection()[1];\n lightDirArray[offset + 2] = -lights[_i].getDirection()[2];\n lightDirArray[offset + 3] = 0; // Color\n\n lightColorArray[offset] = lights[_i].getColor()[0];\n lightColorArray[offset + 1] = lights[_i].getColor()[1];\n lightColorArray[offset + 2] = lights[_i].getColor()[2];\n lightColorArray[offset + 3] = lights[_i].getIntensity() * 5; // arbitrary multiplication to fix the dullness of low value PBR lights\n // Type\n\n lightTypeArray[offset] = getLightTypeIndex(lights[_i]); // Type\n\n lightTypeArray[offset + 1] = Math.cos(radiansFromDegrees(lights[_i].getConeAngle())); // Inner Phi, should probably do some check on these to make sure they dont excede limits\n\n lightTypeArray[offset + 2] = Math.cos(radiansFromDegrees(lights[_i].getConeAngle() + lights[_i].getConeFalloff())); // Outer Phi\n\n lightTypeArray[offset + 3] = 0;\n } // Im not sure how correct this is, but this is what the example does\n // https://kitware.github.io/vtk-js/api/Rendering_WebGPU_VolumePassFSQ.html\n\n\n model.SSBO.clearData();\n model.SSBO.setNumberOfInstances(lights.length);\n model.SSBO.addEntry('LightPos', 'vec4'); // Position\n\n model.SSBO.addEntry('LightDir', 'vec4'); // Direction\n\n model.SSBO.addEntry('LightColor', 'vec4'); // Color (r, g, b, intensity)\n\n model.SSBO.addEntry('LightData', 'vec4'); // Other data (type, etc, etc, etc)\n\n model.SSBO.setAllInstancesFromArray('LightPos', lightPosArray);\n model.SSBO.setAllInstancesFromArray('LightDir', lightDirArray);\n model.SSBO.setAllInstancesFromArray('LightColor', lightColorArray);\n model.SSBO.setAllInstancesFromArray('LightData', lightTypeArray);\n\n var device = model._parent.getDevice();\n\n model.SSBO.send(device);\n }\n\n model.lightTimeString = lightTimeString;\n };\n\n publicAPI.scissorAndViewport = function (encoder) {\n var tsize = publicAPI.getYInvertedTiledSizeAndOrigin();\n encoder.getHandle().setViewport(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize, 0.0, 1.0); // set scissor\n\n encoder.getHandle().setScissorRect(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize);\n };\n\n publicAPI.bindUBO = function (renderEncoder) {\n renderEncoder.activateBindGroup(model.bindGroup);\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n model.renderEncoder.begin(model._parent.getCommandEncoder());\n publicAPI.updateUBO();\n publicAPI.updateSSBO();\n } else {\n publicAPI.scissorAndViewport(model.renderEncoder);\n publicAPI.clear();\n model.renderEncoder.end();\n }\n };\n\n publicAPI.clear = function () {\n var _model$backgroundTex;\n\n if (model.renderable.getTransparent() || model.suppressClear) {\n return;\n }\n\n var device = model._parent.getDevice(); // Normal Solid Color\n\n\n if (!model.clearFSQ) {\n model.clearFSQ = vtkWebGPUFullScreenQuad.newInstance();\n model.clearFSQ.setDevice(device);\n model.clearFSQ.setPipelineHash('clearfsq');\n model.clearFSQ.setFragmentShaderTemplate(clearFragColorTemplate);\n var ubo = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n ubo.addEntry('FSQMatrix', 'mat4x4');\n ubo.addEntry('BackgroundColor', 'vec4');\n model.clearFSQ.setUBO(ubo);\n model.backgroundTex = model.renderable.getEnvironmentTexture();\n } // Textured Background\n\n\n if (model.clearFSQ.getPipelineHash() !== 'clearfsqwithtexture' && model.renderable.getUseEnvironmentTextureAsBackground() && (_model$backgroundTex = model.backgroundTex) !== null && _model$backgroundTex !== void 0 && _model$backgroundTex.getImageLoaded()) {\n model.clearFSQ.setFragmentShaderTemplate(clearFragTextureTemplate);\n\n var _ubo = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n\n _ubo.addEntry('FSQMatrix', 'mat4x4');\n\n _ubo.addEntry('BackgroundColor', 'vec4');\n\n model.clearFSQ.setUBO(_ubo);\n var environmentTextureHash = device.getTextureManager().getTextureForVTKTexture(model.backgroundTex);\n\n if (environmentTextureHash.getReady()) {\n var tview = environmentTextureHash.createView(\"EnvironmentTexture\");\n model.clearFSQ.setTextureViews([tview]);\n model.backgroundTexLoaded = true;\n var interpolate = model.backgroundTex.getInterpolate() ? 'linear' : 'nearest';\n tview.addSampler(device, {\n addressModeU: 'repeat',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'repeat',\n minFilter: interpolate,\n magFilter: interpolate,\n mipmapFilter: 'linear'\n });\n }\n\n model.clearFSQ.setPipelineHash('clearfsqwithtexture');\n } else if (model.clearFSQ.getPipelineHash() === 'clearfsqwithtexture' && !model.renderable.getUseEnvironmentTextureAsBackground()) {\n // In case the mode is changed at runtime\n model.clearFSQ = vtkWebGPUFullScreenQuad.newInstance();\n model.clearFSQ.setDevice(device);\n model.clearFSQ.setPipelineHash('clearfsq');\n model.clearFSQ.setFragmentShaderTemplate(clearFragColorTemplate);\n\n var _ubo2 = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n\n _ubo2.addEntry('FSQMatrix', 'mat4x4');\n\n _ubo2.addEntry('BackgroundColor', 'vec4');\n\n model.clearFSQ.setUBO(_ubo2);\n }\n\n var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);\n var background = model.renderable.getBackgroundByReference();\n model.clearFSQ.getUBO().setArray('BackgroundColor', background);\n mat4.transpose(_tNormalMat4, keyMats.normalMatrix);\n mat4.mul(_fsqClearMat4, keyMats.scvc, keyMats.pcsc);\n mat4.mul(_fsqClearMat4, _tNormalMat4, _fsqClearMat4);\n model.clearFSQ.getUBO().setArray('FSQMatrix', _fsqClearMat4);\n model.clearFSQ.getUBO().sendIfNeeded(device);\n model.clearFSQ.prepareAndDraw(model.renderEncoder);\n };\n\n publicAPI.translucentPass = function (prepass) {\n if (prepass) {\n model.renderEncoder.begin(model._parent.getCommandEncoder());\n } else {\n publicAPI.scissorAndViewport(model.renderEncoder);\n model.renderEncoder.end();\n }\n };\n\n publicAPI.volumeDepthRangePass = function (prepass) {\n if (prepass) {\n model.renderEncoder.begin(model._parent.getCommandEncoder());\n } else {\n publicAPI.scissorAndViewport(model.renderEncoder);\n model.renderEncoder.end();\n }\n };\n\n publicAPI.getAspectRatio = function () {\n var size = model._parent.getSizeByReference();\n\n var viewport = model.renderable.getViewportByReference();\n return size[0] * (viewport[2] - viewport[0]) / ((viewport[3] - viewport[1]) * size[1]);\n };\n\n publicAPI.convertToOpenGLDepth = function (val) {\n return model.webgpuCamera.convertToOpenGLDepth(val);\n };\n\n publicAPI.getYInvertedTiledSizeAndOrigin = function () {\n var res = publicAPI.getTiledSizeAndOrigin();\n\n var size = model._parent.getSizeByReference();\n\n res.lowerLeftV = size[1] - res.vsize - res.lowerLeftV;\n return res;\n };\n\n publicAPI.getTiledSizeAndOrigin = function () {\n var vport = model.renderable.getViewportByReference(); // if there is no window assume 0 1\n\n var tileViewPort = [0.0, 0.0, 1.0, 1.0]; // find the lower left corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu = vport[0] - tileViewPort[0];\n var vpv = vport[1] - tileViewPort[1]; // store the result as a pixel value\n\n var ndvp = model._parent.normalizedDisplayToDisplay(vpu, vpv);\n\n var lowerLeftU = Math.round(ndvp[0]);\n var lowerLeftV = Math.round(ndvp[1]); // find the upper right corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu2 = vport[2] - tileViewPort[0];\n var vpv2 = vport[3] - tileViewPort[1];\n\n var ndvp2 = model._parent.normalizedDisplayToDisplay(vpu2, vpv2); // now compute the size of the intersection of the viewport with the\n // current tile\n\n\n var usize = Math.round(ndvp2[0]) - lowerLeftU;\n var vsize = Math.round(ndvp2[1]) - lowerLeftV;\n\n if (usize < 0) {\n usize = 0;\n }\n\n if (vsize < 0) {\n vsize = 0;\n }\n\n return {\n usize: usize,\n vsize: vsize,\n lowerLeftU: lowerLeftU,\n lowerLeftV: lowerLeftV\n };\n };\n\n publicAPI.getPropFromID = function (id) {\n for (var i = 0; i < model.children.length; i++) {\n var res = model.children[i].getPropID ? model.children[i].getPropID() : -1;\n\n if (res === id) {\n return model.children[i];\n }\n }\n\n return null;\n };\n\n publicAPI.getStabilizedTime = function () {\n return model.stabilizedTime.getMTime();\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.selector !== null) {\n model.selector.releaseGraphicsResources();\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bindGroup: null,\n selector: null,\n renderEncoder: null,\n recenterThreshold: 20.0,\n suppressClear: false,\n stabilizedCenter: [0.0, 0.0, 0.0]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // UBO\n\n model.UBO = vtkWebGPUUniformBuffer.newInstance({\n label: 'rendererUBO'\n });\n model.UBO.addEntry('WCVCMatrix', 'mat4x4');\n model.UBO.addEntry('SCPCMatrix', 'mat4x4');\n model.UBO.addEntry('PCSCMatrix', 'mat4x4');\n model.UBO.addEntry('SCVCMatrix', 'mat4x4');\n model.UBO.addEntry('VCPCMatrix', 'mat4x4');\n model.UBO.addEntry('WCVCNormals', 'mat4x4');\n model.UBO.addEntry('viewportSize', 'vec2');\n model.UBO.addEntry('LightCount', 'i32');\n model.UBO.addEntry('MaxEnvironmentMipLevel', 'f32');\n model.UBO.addEntry('BackgroundDiffuseStrength', 'f32');\n model.UBO.addEntry('BackgroundSpecularStrength', 'f32');\n model.UBO.addEntry('cameraParallel', 'u32'); // SSBO (Light data)\n\n model.SSBO = vtkWebGPUStorageBuffer.newInstance({\n label: 'rendererLightSSBO'\n });\n model.lightTimeString = '';\n model.bindGroup = vtkWebGPUBindGroup.newInstance({\n label: 'rendererBG'\n });\n model.bindGroup.setBindables([model.UBO, model.SSBO]);\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n model.stabilizedTime = {};\n obj(model.stabilizedTime, {\n mtime: 0\n }); // Build VTK API\n\n get(publicAPI, model, ['bindGroup', 'stabilizedTime']);\n getArray(publicAPI, model, ['stabilizedCenter']);\n setGet(publicAPI, model, ['renderEncoder', 'selector', 'suppressClear', 'UBO']); // Object methods\n\n vtkWebGPURenderer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPURenderer'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkRenderer', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n/* eslint-disable no-bitwise */\n// ----------------------------------------------------------------------------\n// vtkWebGPUSampler methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUSampler(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUSampler');\n\n publicAPI.create = function (device) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n model.device = device;\n model.options.addressModeU = options.addressModeU ? options.addressModeU : 'clamp-to-edge';\n model.options.addressModeV = options.addressModeV ? options.addressModeV : 'clamp-to-edge';\n model.options.addressModeW = options.addressModeW ? options.addressModeW : 'clamp-to-edge';\n model.options.magFilter = options.magFilter ? options.magFilter : 'nearest';\n model.options.minFilter = options.minFilter ? options.minFilter : 'nearest';\n model.options.mipmapFilter = options.mipmapFilter ? options.mipmapFilter : 'nearest';\n model.options.label = model.label;\n model.handle = model.device.getHandle().createSampler(model.options);\n model.bindGroupTime.modified();\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n var result = \"@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": sampler;\");\n return result;\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: model.handle\n };\n return foo;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n label: null,\n options: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.options = {};\n model.bindGroupLayoutEntry = {\n /* eslint-disable no-undef */\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\n /* eslint-enable no-undef */\n sampler: {// type: 'filtering',\n }\n };\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n macro.get(publicAPI, model, ['bindGroupTime', 'handle', 'options']);\n macro.setGet(publicAPI, model, ['bindGroupLayoutEntry', 'device', 'label']);\n vtkWebGPUSampler(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUSampler$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUSampler$1 as default, extend, newInstance };\n","import { mat4, vec4 } from 'gl-matrix';\nimport Constants from '../Core/ImageMapper/Constants.js';\nimport { newInstance as newInstance$1, obj } from '../../macros.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUFullScreenQuad from './FullScreenQuad.js';\nimport vtkWebGPUUniformBuffer from './UniformBuffer.js';\nimport vtkWebGPUSampler from './Sampler.js';\nimport { InterpolationType } from '../Core/ImageProperty/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar SlicingMode = Constants.SlicingMode;\nvar imgFragTemplate = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Image::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output: fragmentOutput;\\n\\n //VTK::Image::Sample\\n\\n // var computedColor: vec4 = vec4(1.0,0.7, 0.5, 1.0);\\n\\n//VTK::RenderEncoder::Impl\\n\\n return output;\\n}\\n\"; // ----------------------------------------------------------------------------\n// helper methods\n// ----------------------------------------------------------------------------\n\nfunction computeFnToString(property, fn, numberOfComponents) {\n var pwfun = fn.apply(property);\n\n if (pwfun) {\n var iComps = property.getIndependentComponents();\n return \"\".concat(property.getMTime(), \"-\").concat(iComps, \"-\").concat(numberOfComponents);\n }\n\n return '0';\n} // ----------------------------------------------------------------------------\n// vtkWebGPUImageMapper methods\n// ----------------------------------------------------------------------------\n\n\nvar tmpMat4 = new Float64Array(16);\nvar tmp2Mat4 = new Float64Array(16);\nvar tmp3Mat4 = new Float64Array(16);\nvar ptsArray1 = new Float64Array(4);\nvar ptsArray2 = new Float64Array(4);\n\nfunction vtkWebGPUImageMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUImageMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPUImageSlice = publicAPI.getFirstAncestorOfType('vtkWebGPUImageSlice');\n model.WebGPURenderer = model.WebGPUImageSlice.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n model.device = model.WebGPURenderWindow.getDevice();\n var ren = model.WebGPURenderer.getRenderable(); // is slice set by the camera\n\n if (model.renderable.getSliceAtFocalPoint()) {\n model.renderable.setSliceFromCamera(ren.getActiveCamera());\n }\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.render = function () {\n model.renderable.update();\n model.currentInput = model.renderable.getInputData();\n publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());\n model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n };\n\n publicAPI.computePipelineHash = function () {\n var ext = model.currentInput.getExtent();\n\n if (ext[0] === ext[1] || ext[2] === ext[3] || ext[4] === ext[5]) {\n model.dimensions = 2;\n model.pipelineHash = 'img2';\n } else {\n model.dimensions = 3;\n model.pipelineHash = 'img3';\n }\n };\n\n publicAPI.updateUBO = function () {\n var utime = model.UBO.getSendTime();\n var actor = model.WebGPUImageSlice.getRenderable();\n var volMapr = actor.getMapper();\n\n if (publicAPI.getMTime() > utime || model.renderable.getMTime() > utime || actor.getProperty().getMTime() > utime) {\n // compute the SCTCMatrix\n var image = volMapr.getInputData();\n var center = model.WebGPURenderer.getStabilizedCenterByReference();\n mat4.identity(tmpMat4);\n mat4.translate(tmpMat4, tmpMat4, center); // tmpMat4 is now SC->World\n\n var mcwcmat = actor.getMatrix();\n mat4.transpose(tmp2Mat4, mcwcmat);\n mat4.invert(tmp2Mat4, tmp2Mat4); // tmp2Mat4 is now world to model\n\n mat4.multiply(tmpMat4, tmp2Mat4, tmpMat4); // tmp4Mat is now SC->Model\n // the method on the data is world to index but the volume is in\n // model coordinates so really in this context it is model to index\n\n var modelToIndex = image.getWorldToIndex();\n mat4.multiply(tmpMat4, modelToIndex, tmpMat4); // tmpMat4 is now SC -> Index, save this as we need it later\n\n mat4.invert(tmp3Mat4, tmpMat4); // need translation and scale\n\n mat4.fromTranslation(tmp2Mat4, [0.5, 0.5, 0.5]);\n mat4.multiply(tmpMat4, tmp2Mat4, tmpMat4);\n var dims = image.getDimensions();\n mat4.identity(tmp2Mat4);\n mat4.scale(tmp2Mat4, tmp2Mat4, [1.0 / dims[0], 1.0 / dims[1], 1.0 / dims[2]]);\n mat4.multiply(tmpMat4, tmp2Mat4, tmpMat4); // tmpMat4 is now SC -> Tcoord\n\n model.UBO.setArray('SCTCMatrix', tmpMat4); // need to compute the plane here in world coordinates\n // then pass that down in the UBO\n\n var ext = model.currentInput.getExtent(); // Find what IJK axis and what direction to slice along\n\n var _model$renderable$get = model.renderable.getClosestIJKAxis(),\n ijkMode = _model$renderable$get.ijkMode; // Find the IJK slice\n\n\n var nSlice = model.renderable.getSlice();\n\n if (ijkMode !== model.renderable.getSlicingMode()) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = model.renderable.getSliceAtPosition(nSlice);\n }\n\n var axis0 = 2;\n var axis1 = 0;\n var axis2 = 1;\n\n if (ijkMode === SlicingMode.I) {\n axis0 = 0;\n axis1 = 1;\n axis2 = 2;\n } else if (ijkMode === SlicingMode.J) {\n axis0 = 1;\n axis1 = 2;\n axis2 = 0;\n }\n\n ptsArray1[axis0] = nSlice;\n ptsArray1[axis1] = ext[axis1 * 2] - 0.5;\n ptsArray1[axis2] = ext[axis2 * 2] - 0.5;\n ptsArray1[3] = 1.0;\n vec4.transformMat4(ptsArray1, ptsArray1, tmp3Mat4);\n model.UBO.setArray('Origin', ptsArray1);\n ptsArray2[axis0] = nSlice;\n ptsArray2[axis1] = ext[axis1 * 2 + 1] + 0.5;\n ptsArray2[axis2] = ext[axis2 * 2] - 0.5;\n ptsArray2[3] = 1.0;\n vec4.transformMat4(ptsArray2, ptsArray2, tmp3Mat4);\n vec4.subtract(ptsArray2, ptsArray2, ptsArray1);\n ptsArray2[3] = 1.0;\n model.UBO.setArray('Axis1', ptsArray2);\n ptsArray2[axis0] = nSlice;\n ptsArray2[axis1] = ext[axis1 * 2] - 0.5;\n ptsArray2[axis2] = ext[axis2 * 2 + 1] + 0.5;\n ptsArray2[3] = 1.0;\n vec4.transformMat4(ptsArray2, ptsArray2, tmp3Mat4);\n vec4.subtract(ptsArray2, ptsArray2, ptsArray1);\n ptsArray2[3] = 1.0;\n model.UBO.setArray('Axis2', ptsArray2); // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n var cScale = [1, 1, 1, 1];\n var cShift = [0, 0, 0, 0];\n var tView = model.textureViews[0];\n var tScale = tView.getTexture().getScale();\n var numComp = tView.getTexture().getNumberOfComponents();\n var iComps = false; // todo handle independent?\n\n for (var i = 0; i < numComp; i++) {\n var cw = actor.getProperty().getColorWindow();\n var cl = actor.getProperty().getColorLevel();\n var target = iComps ? i : 0;\n var cfun = actor.getProperty().getRGBTransferFunction(target);\n\n if (cfun) {\n var cRange = cfun.getRange();\n cw = cRange[1] - cRange[0];\n cl = 0.5 * (cRange[1] + cRange[0]);\n }\n\n cScale[i] = tScale / cw;\n cShift[i] = -cl / cw + 0.5;\n }\n\n model.UBO.setArray('cScale', cScale);\n model.UBO.setArray('cShift', cShift);\n model.UBO.sendIfNeeded(model.device);\n }\n };\n\n publicAPI.updateLUTImage = function () {\n var actorProperty = model.WebGPUImageSlice.getRenderable().getProperty();\n var tView = publicAPI.getTextureViews()[0];\n tView.getTexture().getNumberOfComponents();\n\n var numIComps = 1;\n var cfunToString = computeFnToString(actorProperty, actorProperty.getRGBTransferFunction, numIComps);\n\n if (model.colorTextureString !== cfunToString) {\n model.numRows = numIComps;\n var colorArray = new Uint8Array(model.numRows * 2 * model.rowLength * 4);\n var cfun = actorProperty.getRGBTransferFunction();\n\n if (cfun) {\n var tmpTable = new Float32Array(model.rowLength * 3);\n\n for (var c = 0; c < numIComps; c++) {\n cfun = actorProperty.getRGBTransferFunction(c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], model.rowLength, tmpTable, 1);\n\n {\n for (var _i = 0; _i < model.rowLength; _i++) {\n var _idx = c * model.rowLength * 8 + _i * 4;\n\n colorArray[_idx] = 255.0 * tmpTable[_i * 3];\n colorArray[_idx + 1] = 255.0 * tmpTable[_i * 3 + 1];\n colorArray[_idx + 2] = 255.0 * tmpTable[_i * 3 + 2];\n colorArray[_idx + 3] = 255.0;\n\n for (var _j = 0; _j < 4; _j++) {\n colorArray[_idx + model.rowLength * 4 + _j] = colorArray[_idx + _j];\n }\n }\n }\n }\n } else {\n for (var _i2 = 0; _i2 < model.rowLength; ++_i2) {\n var grey = 255.0 * _i2 / (model.rowLength - 1);\n colorArray[_i2 * 4] = grey;\n colorArray[_i2 * 4 + 1] = grey;\n colorArray[_i2 * 4 + 2] = grey;\n colorArray[_i2 * 4 + 3] = 255.0;\n\n for (var _j2 = 0; _j2 < 4; _j2++) {\n colorArray[_i2 * 4 + model.rowLength * 4 + _j2] = colorArray[_i2 * 4 + _j2];\n }\n }\n }\n\n {\n var treq = {\n nativeArray: colorArray,\n width: model.rowLength,\n height: model.numRows * 2,\n depth: 1,\n format: 'rgba8unorm'\n };\n var newTex = model.device.getTextureManager().getTexture(treq);\n var tview = newTex.createView('tfunTexture');\n model.textureViews[1] = tview;\n }\n model.colorTextureString = cfunToString;\n }\n };\n\n var superClassUpdateBuffers = publicAPI.updateBuffers;\n\n publicAPI.updateBuffers = function () {\n superClassUpdateBuffers();\n var newTex = model.device.getTextureManager().getTextureForImageData(model.currentInput);\n var tViews = model.textureViews;\n\n if (!tViews[0] || tViews[0].getTexture() !== newTex) {\n var tview = newTex.createView('imgTexture');\n tViews[0] = tview;\n }\n\n publicAPI.updateLUTImage();\n publicAPI.updateUBO(); // set interpolation on the texture based on property setting\n\n var actorProperty = model.WebGPUImageSlice.getRenderable().getProperty();\n var iType = actorProperty.getInterpolationType() === InterpolationType.NEAREST ? 'nearest' : 'linear';\n\n if (!model.clampSampler || iType !== model.clampSampler.getOptions().minFilter) {\n model.clampSampler = vtkWebGPUSampler.newInstance({\n label: 'clampSampler'\n });\n model.clampSampler.create(model.device, {\n minFilter: iType,\n magFilter: iType\n });\n model.additionalBindables = [model.clampSampler];\n }\n };\n\n var sr = publicAPI.getShaderReplacements();\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n var code = vDesc.getCode();\n var lines = ['var pos: vec4 = mapperUBO.Origin +', ' (vertexBC.x * 0.5 + 0.5) * mapperUBO.Axis1 + (vertexBC.y * 0.5 + 0.5) * mapperUBO.Axis2;', 'pos.w = 1.0;'];\n\n if (model.dimensions === 2) {\n lines.push('var tcoord : vec2 = (mapperUBO.SCTCMatrix * pos).xy;');\n } else {\n lines.push('var tcoord : vec3 = (mapperUBO.SCTCMatrix * pos).xyz;');\n }\n\n lines.push('output.tcoordVS = tcoord;', 'output.Position = rendererUBO.SCPCMatrix * pos;');\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', lines).result;\n vDesc.setCode(code);\n };\n\n sr.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n\n if (model.dimensions === 2) {\n vDesc.addOutput('vec2', 'tcoordVS');\n } else {\n vDesc.addOutput('vec3', 'tcoordVS');\n }\n };\n\n sr.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);\n\n publicAPI.replaceShaderImage = function (hash, pipeline, vertexInput) {\n var fDesc = pipeline.getShaderDescription('fragment');\n var code = fDesc.getCode();\n\n if (model.dimensions === 3) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Image::Sample', [\" var computedColor: vec4 =\", \" textureSampleLevel(imgTexture, clampSampler, input.tcoordVS, 0.0);\", \"//VTK::Image::Sample\"]).result;\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Image::Sample', [\" var computedColor: vec4 =\", \" textureSampleLevel(imgTexture, clampSampler, input.tcoordVS, 0.0);\", \"//VTK::Image::Sample\"]).result;\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Image::Sample', [\" var coord: vec2 =\", \" vec2(computedColor.r * mapperUBO.cScale.r + mapperUBO.cShift.r, 0.5);\", \" computedColor = textureSampleLevel(tfunTexture, clampSampler, coord, 0.0);\"]).result;\n fDesc.setCode(code);\n };\n\n sr.set('replaceShaderImage', publicAPI.replaceShaderImage);\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n rowLength: 1024\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkWebGPUFullScreenQuad.extend(publicAPI, model, initialValues);\n publicAPI.setFragmentShaderTemplate(imgFragTemplate);\n model.UBO = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n model.UBO.addEntry('SCTCMatrix', 'mat4x4');\n model.UBO.addEntry('Origin', 'vec4');\n model.UBO.addEntry('Axis2', 'vec4');\n model.UBO.addEntry('Axis1', 'vec4');\n model.UBO.addEntry('cScale', 'vec4');\n model.UBO.addEntry('cShift', 'vec4');\n model.lutBuildTime = {};\n obj(model.lutBuildTime, {\n mtime: 0\n });\n model.imagemat = mat4.identity(new Float64Array(16));\n model.imagematinv = mat4.identity(new Float64Array(16));\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime); // Object methods\n\n vtkWebGPUImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUImageMapper'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkImageMapper', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, get } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUImageSlice methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUImageSlice(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUImageSlice'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow');\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.getBufferShift = function (wgpuRen) {\n publicAPI.getKeyMatrices(wgpuRen);\n return model.bufferShift;\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n model.renderable.computeMatrix();\n var mcwc = model.renderable.getMatrix(); // compute the net shift\n\n var center = wgpuRen.getStabilizedCenterByReference();\n model.bufferShift[0] = mcwc[3] - center[0];\n model.bufferShift[1] = mcwc[7] - center[1];\n model.bufferShift[2] = mcwc[11] - center[2];\n mat4.transpose(model.keyMatrices.bcwc, mcwc);\n\n if (model.renderable.getIsIdentity()) {\n mat4.identity(model.keyMatrices.normalMatrix);\n } else {\n // we use bcwc BEFORE the translate below (just to get transposed mcvc)\n mat4.copy(model.keyMatrices.normalMatrix, model.keyMatrices.bcwc); // zero out translation\n\n model.keyMatrices.normalMatrix[3] = 0.0;\n model.keyMatrices.normalMatrix[7] = 0.0;\n model.keyMatrices.normalMatrix[11] = 0.0;\n mat4.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n } // only meed the buffer shift to get to world\n\n\n mat4.translate(model.keyMatrices.bcwc, model.keyMatrices.bcwc, [-model.bufferShift[0], -model.bufferShift[1], -model.bufferShift[2]]); // to get to stabilized we also need the center\n\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bufferShift: undefined,\n keyMatrixTime: null,\n keyMatrices: null,\n propID: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n mcwc: mat4.identity(new Float64Array(16))\n };\n model.bufferShift = [0, 0, 0, 0];\n get(publicAPI, model, ['propID', 'keyMatricesTime']); // Object methods\n\n vtkWebGPUImageSlice(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUImageSlice'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkImageSlice', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUVolume methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUVolume(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUVolume'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow'); // for the future if we support hardware selection of volumes\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n model.renderable.getMapper().update();\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.renderable.getMapper().getBounds();\n\n if (!bds || bds.length !== 6 || bds[0] > bds[1]) {\n return;\n }\n\n renderPass.addVolume(publicAPI);\n }\n }; // used in the method below\n\n\n var idx = new Float64Array(3);\n var vout = new Float64Array(3);\n\n publicAPI.getBoundingCubePoints = function (result, offset) {\n var input = model.renderable.getMapper().getInputData();\n\n if (!input) {\n return;\n }\n\n var extent = input.getExtent();\n var m = model.renderable.getMatrix();\n var count = 0;\n\n for (var iz = 4; iz < 6; iz++) {\n idx[2] = extent[iz];\n\n for (var iy = 2; iy < 4; iy++) {\n idx[1] = extent[iy];\n\n for (var ix = 0; ix < 2; ix++) {\n idx[0] = extent[ix];\n input.indexToWorld(idx, vout);\n var poffset = offset + count * 3;\n result[poffset++] = m[0] * vout[0] + m[1] * vout[1] + m[2] * vout[2] + m[3];\n result[poffset++] = m[4] * vout[0] + m[5] * vout[1] + m[6] * vout[2] + m[7];\n result[poffset++] = m[8] * vout[0] + m[9] * vout[1] + m[10] * vout[2] + m[11];\n count++;\n }\n }\n }\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n model.renderable.computeMatrix();\n var mcwc = model.renderable.getMatrix(); // compute the net shift\n\n var center = wgpuRen.getStabilizedCenterByReference();\n mat4.transpose(model.keyMatrices.bcwc, mcwc); // to get to stabilized we also need the center\n\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n propID: undefined,\n keyMatricesTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n macro.obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n macro.get(publicAPI, model, ['propID', 'keyMatricesTime']); // Object methods\n\n vtkWebGPUVolume(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUVolume'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkVolume', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUPixelSpaceCallbackMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPixelSpaceCallbackMapper(publicAPI, model) {\n model.classHierarchy.push('vtkWebGPUPixelSpaceCallbackMapper');\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n var aspectRatio = model.WebGPURenderer.getAspectRatio();\n var camera = model.WebGPURenderer ? model.WebGPURenderer.getRenderable().getActiveCamera() : null;\n var tsize = model.WebGPURenderer.getTiledSizeAndOrigin();\n var texels = null;\n\n if (model.renderable.getUseZValues()) ;\n\n model.renderable.invokeCallback(model.renderable.getInputData(), camera, aspectRatio, tsize, texels);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Object methods\n\n vtkWebGPUPixelSpaceCallbackMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUPixelSpaceCallbackMapper'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkPixelSpaceCallbackMapper', newInstance);\n\nexport { index as default, extend, newInstance };\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","import macro from '../../macros.js';\n\nvar DEFAULT_VIEW_API = navigator.gpu ? 'WebGPU' : 'WebGL';\nvar VIEW_CONSTRUCTORS = Object.create(null); // ----------------------------------------------------------------------------\n// static methods\n// ----------------------------------------------------------------------------\n\nfunction registerViewConstructor(name, constructor) {\n VIEW_CONSTRUCTORS[name] = constructor;\n}\nfunction listViewAPIs() {\n return Object.keys(VIEW_CONSTRUCTORS);\n}\nfunction newAPISpecificView(name) {\n var initialValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return VIEW_CONSTRUCTORS[name] && VIEW_CONSTRUCTORS[name](initialValues);\n} // ----------------------------------------------------------------------------\n// vtkRenderWindow methods\n// ----------------------------------------------------------------------------\n\nfunction vtkRenderWindow(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderWindow'); // Add renderer\n\n publicAPI.addRenderer = function (renderer) {\n if (publicAPI.hasRenderer(renderer)) {\n return;\n }\n\n renderer.setRenderWindow(publicAPI);\n model.renderers.push(renderer); // for (this->Renderers->InitTraversal(rsit);\n // (aren = this->Renderers->GetNextRenderer(rsit)); )\n // {\n // aren->SetAllocatedRenderTime\n // (1.0/(this->DesiredUpdateRate*this->Renderers->GetNumberOfItems()));\n // }\n\n publicAPI.modified();\n }; // Remove renderer\n\n\n publicAPI.removeRenderer = function (renderer) {\n model.renderers = model.renderers.filter(function (r) {\n return r !== renderer;\n });\n publicAPI.modified();\n };\n\n publicAPI.hasRenderer = function (ren) {\n return model.renderers.indexOf(ren) !== -1;\n }; // get an API specific view of this data\n\n\n publicAPI.newAPISpecificView = function (name) {\n var initialValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return newAPISpecificView(name || model.defaultViewAPI, initialValues);\n }; // Add renderer\n\n\n publicAPI.addView = function (view) {\n if (publicAPI.hasView(view)) {\n return;\n }\n\n view.setRenderable(publicAPI);\n\n model._views.push(view);\n\n publicAPI.modified();\n }; // Remove renderer\n\n\n publicAPI.removeView = function (view) {\n model._views = model._views.filter(function (r) {\n return r !== view;\n });\n publicAPI.modified();\n };\n\n publicAPI.hasView = function (view) {\n return model._views.indexOf(view) !== -1;\n }; // handle any pre render initializations\n\n\n publicAPI.preRender = function () {\n model.renderers.forEach(function (ren) {\n // make sure we have a camera\n if (!ren.isActiveCameraCreated()) {\n ren.resetCamera();\n }\n });\n };\n\n publicAPI.render = function () {\n publicAPI.preRender();\n\n if (model.interactor) {\n model.interactor.render();\n } else {\n model._views.forEach(function (view) {\n return view.traverseAllPasses();\n });\n }\n };\n\n publicAPI.getStatistics = function () {\n var results = {\n propCount: 0,\n invisiblePropCount: 0\n };\n model.renderers.forEach(function (ren) {\n var props = ren.getViewProps();\n props.forEach(function (prop) {\n if (prop.getVisibility()) {\n results.propCount += 1;\n var mpr = prop.getMapper && prop.getMapper();\n\n if (mpr && mpr.getPrimitiveCount) {\n var pcount = mpr.getPrimitiveCount();\n Object.keys(pcount).forEach(function (keyName) {\n if (!results[keyName]) {\n results[keyName] = 0;\n }\n\n results[keyName] += pcount[keyName];\n });\n }\n } else {\n results.invisiblePropCount += 1;\n }\n });\n });\n results.str = Object.keys(results).map(function (keyName) {\n return \"\".concat(keyName, \": \").concat(results[keyName]);\n }).join('\\n');\n return results;\n };\n\n publicAPI.captureImages = function () {\n var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'image/png';\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n macro.setImmediate(publicAPI.render);\n return model._views.map(function (view) {\n return view.captureNextImage ? view.captureNextImage(format, opts) : undefined;\n }).filter(function (i) {\n return !!i;\n });\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n defaultViewAPI: DEFAULT_VIEW_API,\n renderers: [],\n views: [],\n interactor: null,\n neverRendered: true,\n numberOfLayers: 1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['interactor', 'numberOfLayers', '_views', 'defaultViewAPI']);\n macro.get(publicAPI, model, ['neverRendered']);\n macro.getArray(publicAPI, model, ['renderers']);\n macro.moveToProtected(publicAPI, model, ['views']);\n macro.event(publicAPI, model, 'completion'); // Object methods\n\n vtkRenderWindow(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderWindow'); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindow$1 = {\n newInstance: newInstance,\n extend: extend,\n registerViewConstructor: registerViewConstructor,\n listViewAPIs: listViewAPIs,\n newAPISpecificView: newAPISpecificView\n};\n\nexport { vtkRenderWindow$1 as default, extend, listViewAPIs, newAPISpecificView, newInstance, registerViewConstructor };\n","import macro from '../../macros.js';\n\nfunction vtkRenderPass(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderPass');\n\n publicAPI.getOperation = function () {\n return model.currentOperation;\n };\n\n publicAPI.setCurrentOperation = function (val) {\n model.currentOperation = val;\n model.currentTraverseOperation = \"traverse\".concat(macro.capitalize(model.currentOperation));\n };\n\n publicAPI.getTraverseOperation = function () {\n return model.currentTraverseOperation;\n }; // by default this class will traverse all of its\n // preDelegateOperations, then call its delegate render passes\n // the traverse all of its postDelegateOperations\n // any of those three arrays can be empty\n\n\n publicAPI.traverse = function (viewNode) {\n var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (model.deleted) {\n return;\n } // we just render our delegates in order\n\n\n model._currentParent = parent;\n model.preDelegateOperations.forEach(function (val) {\n publicAPI.setCurrentOperation(val);\n viewNode.traverse(publicAPI);\n });\n model.delegates.forEach(function (val) {\n val.traverse(viewNode, publicAPI);\n });\n model.postDelegateOperations.forEach(function (val) {\n publicAPI.setCurrentOperation(val);\n viewNode.traverse(publicAPI);\n });\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n delegates: [],\n currentOperation: null,\n preDelegateOperations: [],\n postDelegateOperations: [],\n currentParent: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['currentOperation']);\n macro.setGet(publicAPI, model, ['delegates', '_currentParent', 'preDelegateOperations', 'postDelegateOperations']);\n macro.moveToProtected(publicAPI, model, ['currentParent']); // Object methods\n\n vtkRenderPass(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderPass'); // ----------------------------------------------------------------------------\n\nvar vtkRenderPass$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkRenderPass$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkRenderPass from '../SceneGraph/RenderPass.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkHelper from './Helper.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkVertexArrayObject from './VertexArrayObject.js';\n\nvar Representation = vtkProperty.Representation;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n\nfunction translucentShaderReplacement(shaders) {\n var substituteRes = vtkShaderProgram.substitute(shaders.Fragment, '//VTK::RenderPassFragmentShader::Impl', \"\\n float weight = gl_FragData[0].a * pow(max(1.1 - gl_FragCoord.z, 0.0), 2.0);\\n gl_FragData[0] = vec4(gl_FragData[0].rgb*weight, gl_FragData[0].a);\\n gl_FragData[1].r = weight;\\n \", false);\n shaders.Fragment = substituteRes.result;\n}\n\nvar oitpFragTemplate = \"//VTK::System::Dec\\n\\nin vec2 tcoord;\\n\\nuniform sampler2D translucentRTexture;\\nuniform sampler2D translucentRGBATexture;\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\nvoid main()\\n{\\n vec4 t1Color = texture(translucentRGBATexture, tcoord);\\n float t2Color = texture(translucentRTexture, tcoord).r;\\n gl_FragData[0] = vec4(t1Color.rgb/max(t2Color,0.01), 1.0 - t1Color.a);\\n}\\n\";\n\nfunction vtkOpenGLOrderIndependentTranslucentPass(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLOrderIndependentTranslucentPass'); // build vertices etc\n\n publicAPI.createVertexBuffer = function () {\n // 4 corner points in clipping space in order (x, y, z) where z is always set to -1\n // prettier-ignore\n var ptsArray = new Float32Array([-1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1]); // 4 corresponding corner points in texture space in order (x, y)\n\n var tcoordArray = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]); // a square defined as cell relation ship in order (cell_size, v1, v2, v3, v4)\n\n var cellArray = new Uint16Array([4, 0, 1, 3, 2]);\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var tcoords = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoordArray\n });\n tcoords.setName('tcoords');\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n tcoords: tcoords,\n cellOffset: 0\n });\n model.VBOBuildTime.modified();\n };\n\n publicAPI.createFramebuffer = function (viewNode) {\n var _model$framebuffer;\n\n var size = viewNode.getSize();\n var gl = viewNode.getContext();\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n model.framebuffer.setOpenGLRenderWindow(viewNode);\n\n (_model$framebuffer = model.framebuffer).create.apply(_model$framebuffer, _toConsumableArray(size));\n\n model.framebuffer.saveCurrentBindingsAndBuffers();\n model.framebuffer.bind();\n model.translucentRGBATexture = vtkOpenGLTexture.newInstance();\n model.translucentRGBATexture.setInternalFormat(gl.RGBA16F);\n model.translucentRGBATexture.setFormat(gl.RGBA);\n model.translucentRGBATexture.setOpenGLDataType(gl.HALF_FLOAT);\n model.translucentRGBATexture.setOpenGLRenderWindow(viewNode);\n model.translucentRGBATexture.create2DFromRaw(size[0], size[1], 4, 'Float32Array', null);\n model.translucentRTexture = vtkOpenGLTexture.newInstance();\n model.translucentRTexture.setInternalFormat(gl.R16F);\n model.translucentRTexture.setFormat(gl.RED);\n model.translucentRTexture.setOpenGLDataType(gl.HALF_FLOAT);\n model.translucentRTexture.setOpenGLRenderWindow(viewNode);\n model.translucentRTexture.create2DFromRaw(size[0], size[1], 1, 'Float32Array', null);\n model.translucentZTexture = vtkOpenGLTexture.newInstance();\n model.translucentZTexture.setOpenGLRenderWindow(viewNode);\n model.translucentZTexture.createDepthFromRaw(size[0], size[1], 'Float32Array', null);\n model.framebuffer.setColorBuffer(model.translucentRGBATexture, 0);\n model.framebuffer.setColorBuffer(model.translucentRTexture, 1);\n model.framebuffer.setDepthBuffer(model.translucentZTexture);\n };\n\n publicAPI.createCopyShader = function (viewNode) {\n model.copyShader = viewNode.getShaderCache().readyShaderProgramArray(['//VTK::System::Dec', 'attribute vec4 vertexDC;', 'attribute vec2 tcoordTC;', 'varying vec2 tcoord;', 'void main() { tcoord = tcoordTC; gl_Position = vertexDC; }'].join('\\n'), oitpFragTemplate, '');\n };\n\n publicAPI.createVBO = function (viewNode) {\n var gl = viewNode.getContext();\n model.tris.setOpenGLRenderWindow(viewNode);\n publicAPI.createVertexBuffer();\n var program = model.copyShader; // prepare the vertex and triangle data for the image plane to render to\n\n model.tris.getCABO().bind();\n\n if (!model.copyVAO.addAttributeArray(program, model.tris.getCABO(), 'vertexDC', model.tris.getCABO().getVertexOffset(), model.tris.getCABO().getStride(), gl.FLOAT, 3, gl.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in copy shader VAO.');\n }\n\n if (!model.copyVAO.addAttributeArray(program, model.tris.getCABO(), 'tcoordTC', model.tris.getCABO().getTCoordOffset(), model.tris.getCABO().getStride(), gl.FLOAT, 2, gl.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in copy shader VAO.');\n }\n };\n\n publicAPI.traverse = function (viewNode, renNode, forwardPass) {\n if (model.deleted) {\n return;\n }\n\n var size = viewNode.getSize();\n var gl = viewNode.getContext(); // if we lack the webgl2 and half floatsupport just do\n // basic alpha blending\n\n model._supported = false;\n\n if (renNode.getSelector() || !gl || !viewNode.getWebgl2() || !gl.getExtension('EXT_color_buffer_half_float') && !gl.getExtension('EXT_color_buffer_float')) {\n publicAPI.setCurrentOperation('translucentPass');\n renNode.traverse(publicAPI);\n return;\n }\n\n model._supported = true; // prepare framebuffer // allocate framebuffer if needed and bind it\n\n if (model.framebuffer === null) {\n publicAPI.createFramebuffer(viewNode);\n } else {\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize === null || fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.releaseGraphicsResources();\n model.translucentRGBATexture.releaseGraphicsResources(viewNode);\n model.translucentRTexture.releaseGraphicsResources(viewNode);\n model.translucentZTexture.releaseGraphicsResources(viewNode);\n publicAPI.createFramebuffer(viewNode);\n } else {\n // store framebuffer bindings to restore them later\n model.framebuffer.saveCurrentBindingsAndBuffers();\n model.framebuffer.bind();\n }\n }\n\n gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]);\n gl.clearBufferfv(gl.DEPTH, 0, [1.0]);\n gl.colorMask(false, false, false, false); // rerender the opaque pass to set the depth buffer\n // TODO remove when webgl1 is deprecated and instead\n // have the forward pass use a texture backed zbuffer\n\n if (forwardPass.getOpaqueActorCount() > 0) {\n // Don't use zBufferPass as it will also render the depth of translucent actors\n forwardPass.setCurrentOperation('opaqueZBufferPass');\n renNode.traverse(forwardPass);\n }\n\n gl.colorMask(true, true, true, true);\n gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]); // make sure to clear the entire framebuffer as we will\n // be blitting the entire thing all of it needs good initial values\n\n gl.viewport(0, 0, size[0], size[1]);\n gl.scissor(0, 0, size[0], size[1]);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]);\n gl.clearBufferfv(gl.COLOR, 1, [0.0, 0.0, 0.0, 0.0]);\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND); // basic gist is we accumulate color into RGB We compute final opacity\n // into A We store accumulated opacity into R of the R texture.\n\n gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ZERO, gl.ONE_MINUS_SRC_ALPHA); // now do the translucent rendering\n\n publicAPI.setCurrentOperation('translucentPass');\n renNode.traverse(publicAPI);\n gl.drawBuffers([gl.NONE]);\n model.framebuffer.restorePreviousBindingsAndBuffers(); // gl.drawBuffers([gl.BACK]);\n // make sure the copy shader is ready\n\n if (model.copyShader === null) {\n publicAPI.createCopyShader(viewNode);\n } else {\n viewNode.getShaderCache().readyShaderProgram(model.copyShader);\n } // make sure we have a VAO\n\n\n if (!model.copyVAO) {\n model.copyVAO = vtkVertexArrayObject.newInstance();\n model.copyVAO.setOpenGLRenderWindow(viewNode);\n }\n\n model.copyVAO.bind(); // make sure the VBO is up to date\n\n if (model.VBOBuildTime.getMTime() < publicAPI.getMTime()) {\n publicAPI.createVBO(viewNode);\n }\n\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n gl.depthFunc(gl.ALWAYS);\n gl.viewport(0, 0, size[0], size[1]);\n gl.scissor(0, 0, size[0], size[1]); // activate texture\n\n model.translucentRGBATexture.activate();\n model.copyShader.setUniformi('translucentRGBATexture', model.translucentRGBATexture.getTextureUnit());\n model.translucentRTexture.activate();\n model.copyShader.setUniformi('translucentRTexture', model.translucentRTexture.getTextureUnit()); // render quad\n\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n gl.depthMask(true);\n gl.depthFunc(gl.LEQUAL);\n model.translucentRGBATexture.deactivate();\n model.translucentRTexture.deactivate();\n };\n\n publicAPI.getShaderReplacement = function () {\n if (model._supported) {\n return translucentShaderReplacement;\n }\n\n return null;\n };\n\n publicAPI.releaseGraphicsResources = function (viewNode) {\n if (model.framebuffer) {\n model.framebuffer.releaseGraphicsResources(viewNode);\n model.framebuffer = null;\n }\n\n if (model.translucentRGBATexture) {\n model.translucentRGBATexture.releaseGraphicsResources(viewNode);\n model.translucentRGBATexture = null;\n }\n\n if (model.translucentRTexture) {\n model.translucentRTexture.releaseGraphicsResources(viewNode);\n model.translucentRTexture = null;\n }\n\n if (model.translucentZTexture) {\n model.translucentZTexture.releaseGraphicsResources(viewNode);\n model.translucentZTexture = null;\n }\n\n if (model.copyVAO) {\n model.copyVAO.releaseGraphicsResources(viewNode);\n model.copyVAO = null;\n }\n\n if (model.copyShader) {\n model.copyShader.releaseGraphicsResources(viewNode);\n model.copyShader = null;\n }\n\n if (model.tris) {\n model.tris.releaseGraphicsResources(viewNode);\n model.tris = null;\n }\n\n publicAPI.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n framebuffer: null,\n copyShader: null,\n tris: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkRenderPass.extend(publicAPI, model, initialValues);\n model.VBOBuildTime = {};\n macro.obj(model.VBOBuildTime, {\n mtime: 0\n });\n model.tris = vtkHelper.newInstance();\n macro.get(publicAPI, model, ['framebuffer']); // Object methods\n\n vtkOpenGLOrderIndependentTranslucentPass(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLOrderIndependentTranslucentPass'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLOrderIndependentTranslucentPass$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkOpenGLOrderIndependentTranslucentPass$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkRenderPass from '../SceneGraph/RenderPass.js';\nimport vtkOpenGLOrderIndependentTranslucentPass from './OrderIndependentTranslucentPass.js';\n\nfunction vtkForwardPass(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkForwardPass'); // this pass implements a forward rendering pipeline\n // if both volumes and opaque geometry are present\n // it will mix the two together by capturing a zbuffer\n // first\n\n publicAPI.traverse = function (viewNode) {\n var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (model.deleted) {\n return;\n } // we just render our delegates in order\n\n\n model._currentParent = parent; // build\n\n publicAPI.setCurrentOperation('buildPass');\n viewNode.traverse(publicAPI);\n var numlayers = viewNode.getRenderable().getNumberOfLayers(); // iterate over renderers\n\n var renderers = viewNode.getChildren();\n\n for (var i = 0; i < numlayers; i++) {\n for (var index = 0; index < renderers.length; index++) {\n var renNode = renderers[index];\n var ren = viewNode.getRenderable().getRenderers()[index];\n\n if (ren.getDraw() && ren.getLayer() === i) {\n // check for both opaque and volume actors\n model.opaqueActorCount = 0;\n model.translucentActorCount = 0;\n model.volumeCount = 0;\n model.overlayActorCount = 0;\n publicAPI.setCurrentOperation('queryPass');\n renNode.traverse(publicAPI); // do we need to capture a zbuffer?\n\n if ((model.opaqueActorCount > 0 || model.translucentActorCount > 0) && model.volumeCount > 0 || model.depthRequested) {\n var size = viewNode.getFramebufferSize(); // make sure the framebuffer is setup\n\n if (model.framebuffer === null) {\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n }\n\n model.framebuffer.setOpenGLRenderWindow(viewNode);\n model.framebuffer.saveCurrentBindingsAndBuffers();\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize === null || fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.create(size[0], size[1]);\n model.framebuffer.populateFramebuffer();\n }\n\n model.framebuffer.bind(); // opaqueZBufferPass only renders opaque actors\n // zBufferPass renders both translucent and opaque actors\n // we want to be able to pick translucent actors\n\n publicAPI.setCurrentOperation('zBufferPass');\n renNode.traverse(publicAPI);\n model.framebuffer.restorePreviousBindingsAndBuffers(); // reset now that we have done it\n\n model.depthRequested = false;\n }\n\n publicAPI.setCurrentOperation('cameraPass');\n renNode.traverse(publicAPI);\n\n if (model.opaqueActorCount > 0) {\n publicAPI.setCurrentOperation('opaquePass');\n renNode.traverse(publicAPI);\n }\n\n if (model.translucentActorCount > 0) {\n if (!model.translucentPass) {\n model.translucentPass = vtkOpenGLOrderIndependentTranslucentPass.newInstance();\n }\n\n model.translucentPass.traverse(viewNode, renNode, publicAPI);\n }\n\n if (model.volumeCount > 0) {\n publicAPI.setCurrentOperation('volumePass');\n renNode.traverse(publicAPI);\n }\n\n if (model.overlayActorCount > 0) {\n publicAPI.setCurrentOperation('overlayPass');\n renNode.traverse(publicAPI);\n }\n }\n }\n }\n };\n\n publicAPI.getZBufferTexture = function () {\n if (model.framebuffer) {\n return model.framebuffer.getColorTexture();\n }\n\n return null;\n };\n\n publicAPI.requestDepth = function () {\n model.depthRequested = true;\n };\n\n publicAPI.incrementOpaqueActorCount = function () {\n return model.opaqueActorCount++;\n };\n\n publicAPI.incrementTranslucentActorCount = function () {\n return model.translucentActorCount++;\n };\n\n publicAPI.incrementVolumeCount = function () {\n return model.volumeCount++;\n };\n\n publicAPI.incrementOverlayActorCount = function () {\n return model.overlayActorCount++;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n opaqueActorCount: 0,\n translucentActorCount: 0,\n volumeCount: 0,\n overlayActorCount: 0,\n framebuffer: null,\n depthRequested: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkRenderPass.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['framebuffer', 'opaqueActorCount', 'translucentActorCount', 'volumeCount']); // Object methods\n\n vtkForwardPass(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkForwardPass'); // ----------------------------------------------------------------------------\n\nvar vtkForwardPass$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkForwardPass$1 as default, extend, newInstance };\n","import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport macro from '../../macros.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\n\nvar FieldAssociations = vtkDataSet.FieldAssociations; // ----------------------------------------------------------------------------\n// vtkHardwareSelector methods\n// ----------------------------------------------------------------------------\n\nfunction vtkHardwareSelector(publicAPI, model) {\n model.classHierarchy.push('vtkHardwareSelector'); // get the source data that is used for generating a selection. This\n // must be called at least once before calling generateSelection. In\n // raster based backends this method will capture the buffers. You can\n // call this once and then make multiple calls to generateSelection.\n\n publicAPI.getSourceDataAsync = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(renderer, fx1, fy1, fx2, fy2) {\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }();\n\n publicAPI.selectAsync = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(renderer, fx1, fy1, fx2, fy2) {\n var srcData;\n return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return publicAPI.getSourceDataAsync(renderer, fx1, fy1, fx2, fy2);\n\n case 2:\n srcData = _context2.sent;\n\n if (!srcData) {\n _context2.next = 5;\n break;\n }\n\n return _context2.abrupt(\"return\", srcData.generateSelection(fx1, fy1, fx2, fy2));\n\n case 5:\n return _context2.abrupt(\"return\", []);\n\n case 6:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function (_x6, _x7, _x8, _x9, _x10) {\n return _ref2.apply(this, arguments);\n };\n }();\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n fieldAssociation: FieldAssociations.FIELD_ASSOCIATION_CELLS,\n captureZValues: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['fieldAssociation', 'captureZValues']); // Object methods\n\n vtkHardwareSelector(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkHardwareSelector'); // ----------------------------------------------------------------------------\n\nvar vtkHardwareSelector$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkHardwareSelector$1 as default, extend, newInstance };\n","/**\n * The (primary) property that describes the content of a selection\n * node's data. Other auxiliary description properties follow.\n * GLOBALIDS means that the selection list contains values from the\n * vtkDataSetAttribute array of the same name.\n * PEDIGREEIDS means that the selection list contains values from the\n * vtkDataSetAttribute array of the same name.\n * VALUES means the the selection list contains values from an\n * arbitrary attribute array (ignores any globalids attribute)\n * INDICES means that the selection list contains indexes into the\n * cell or point arrays.\n * FRUSTUM means the set of points and cells inside a frustum\n * LOCATIONS means the set of points and cells near a set of positions\n * THRESHOLDS means the points and cells with values within a set of ranges\n * getContentType() returns -1 if the content type is not set.\n */\n// Specify how data arrays can be used by data objects\nvar SelectionContent = {\n GLOBALIDS: 0,\n PEDIGREEIDS: 1,\n VALUES: 2,\n INDICES: 3,\n FRUSTUM: 4,\n LOCATIONS: 5,\n THRESHOLDS: 6,\n BLOCKS: 7,\n QUERY: 8\n};\nvar SelectionField = {\n CELL: 0,\n POINT: 1,\n FIELD: 2,\n VERTEX: 3,\n EDGE: 4,\n ROW: 5\n};\nvar Constants = {\n SelectionContent: SelectionContent,\n SelectionField: SelectionField\n};\n\nexport { SelectionContent, SelectionField, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './SelectionNode/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// vtkSelectionNode methods\n// ----------------------------------------------------------------------------\n\nfunction vtkSelectionNode(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkSelectionNode');\n\n publicAPI.getBounds = function () {\n return model.points.getBounds();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n contentType: -1,\n fieldType: -1,\n properties: null,\n selectionList: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n model.properties = {};\n macro.setGet(publicAPI, model, ['contentType', 'fieldType', 'properties', 'selectionList']); // Object specific methods\n\n vtkSelectionNode(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkSelectionNode'); // ----------------------------------------------------------------------------\n\nvar vtkSelectionNode$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkSelectionNode$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport macro from '../../macros.js';\nimport Constants from './HardwareSelector/Constants.js';\nimport vtkHardwareSelector$1 from '../Core/HardwareSelector.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkSelectionNode from '../../Common/DataModel/SelectionNode.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar PassTypes = Constants.PassTypes;\nvar SelectionContent = vtkSelectionNode.SelectionContent,\n SelectionField = vtkSelectionNode.SelectionField;\nvar FieldAssociations = vtkDataSet.FieldAssociations;\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar idOffset = 1;\n\nfunction getInfoHash(info) {\n return \"\".concat(info.propID, \" \").concat(info.compositeID);\n}\n\nfunction getAlpha(xx, yy, pb, area) {\n if (!pb) {\n return 0;\n }\n\n var offset = (yy * (area[2] - area[0] + 1) + xx) * 4;\n return pb[offset + 3];\n}\n\nfunction convert(xx, yy, pb, area) {\n if (!pb) {\n return 0;\n }\n\n var offset = (yy * (area[2] - area[0] + 1) + xx) * 4;\n var r = pb[offset];\n var g = pb[offset + 1];\n var b = pb[offset + 2];\n return (b * 256 + g) * 256 + r;\n}\n\nfunction getID(low24, high8) {\n /* eslint-disable no-bitwise */\n var val = high8;\n val <<= 24;\n val |= low24;\n return val;\n /* eslint-enable no-bitwise */\n}\n\nfunction getPixelInformationWithData(buffdata, inDisplayPosition, maxDistance, outSelectedPosition) {\n // Base case\n var maxDist = maxDistance < 0 ? 0 : maxDistance;\n\n if (maxDist === 0) {\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n\n if (inDisplayPosition[0] < buffdata.area[0] || inDisplayPosition[0] > buffdata.area[2] || inDisplayPosition[1] < buffdata.area[1] || inDisplayPosition[1] > buffdata.area[3]) {\n return null;\n } // offset inDisplayPosition based on the lower-left-corner of the Area.\n\n\n var displayPosition = [inDisplayPosition[0] - buffdata.area[0], inDisplayPosition[1] - buffdata.area[1]];\n var actorid = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ACTOR_PASS], buffdata.area);\n\n if (actorid <= 0 || actorid - idOffset >= buffdata.props.length) {\n // the pixel did not hit any actor.\n return null;\n }\n\n var _info = {};\n _info.valid = true;\n _info.propID = actorid - idOffset;\n _info.prop = buffdata.props[_info.propID];\n var compositeID = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.COMPOSITE_INDEX_PASS], buffdata.area);\n\n if (compositeID < 0 || compositeID > 0xffffff) {\n compositeID = 0;\n }\n\n _info.compositeID = compositeID - idOffset;\n\n if (buffdata.captureZValues) {\n var offset = (displayPosition[1] * (buffdata.area[2] - buffdata.area[0] + 1) + displayPosition[0]) * 4;\n _info.zValue = (256 * buffdata.zBuffer[offset] + buffdata.zBuffer[offset + 1]) / 65535.0;\n _info.displayPosition = inDisplayPosition;\n }\n\n if (buffdata.pixBuffer[PassTypes.ID_LOW24]) {\n if (getAlpha(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ID_LOW24], buffdata.area) === 0.0) {\n return _info;\n }\n }\n\n var low24 = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ID_LOW24], buffdata.area);\n var high24 = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ID_HIGH24], buffdata.area);\n _info.attributeID = getID(low24, high24);\n return _info;\n } // Iterate over successively growing boxes.\n // They recursively call the base case to handle single pixels.\n\n\n var dispPos = [inDisplayPosition[0], inDisplayPosition[1]];\n var curPos = [0, 0];\n var info = getPixelInformationWithData(buffdata, inDisplayPosition, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n\n for (var dist = 1; dist < maxDist; ++dist) {\n // Vertical sides of box.\n for (var y = dispPos[1] > dist ? dispPos[1] - dist : 0; y <= dispPos[1] + dist; ++y) {\n curPos[1] = y;\n\n if (dispPos[0] >= dist) {\n curPos[0] = dispPos[0] - dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[0] = dispPos[0] + dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n } // Horizontal sides of box.\n\n\n for (var x = dispPos[0] >= dist ? dispPos[0] - (dist - 1) : 0; x <= dispPos[0] + (dist - 1); ++x) {\n curPos[0] = x;\n\n if (dispPos[1] >= dist) {\n curPos[1] = dispPos[1] - dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[1] = dispPos[1] + dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n } // nothing hit.\n\n\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n return null;\n} //-----------------------------------------------------------------------------\n\n\nfunction convertSelection(fieldassociation, dataMap, captureZValues, renderer, openGLRenderWindow) {\n var sel = [];\n var count = 0;\n dataMap.forEach(function (value, key) {\n var child = vtkSelectionNode.newInstance();\n child.setContentType(SelectionContent.INDICES);\n\n switch (fieldassociation) {\n case FieldAssociations.FIELD_ASSOCIATION_CELLS:\n child.setFieldType(SelectionField.CELL);\n break;\n\n case FieldAssociations.FIELD_ASSOCIATION_POINTS:\n child.setFieldType(SelectionField.POINT);\n break;\n\n default:\n vtkErrorMacro('Unknown field association');\n }\n\n child.getProperties().propID = value.info.propID;\n child.getProperties().prop = value.info.prop;\n child.getProperties().compositeID = value.info.compositeID;\n child.getProperties().attributeID = value.info.attributeID;\n child.getProperties().pixelCount = value.pixelCount;\n\n if (captureZValues) {\n child.getProperties().displayPosition = [value.info.displayPosition[0], value.info.displayPosition[1], value.info.zValue];\n child.getProperties().worldPosition = openGLRenderWindow.displayToWorld(value.info.displayPosition[0], value.info.displayPosition[1], value.info.zValue, renderer);\n }\n\n child.setSelectionList(value.attributeIDs);\n sel[count] = child;\n count++;\n });\n return sel;\n} //----------------------------------------------------------------------------\n\n\nfunction generateSelectionWithData(buffdata, fx1, fy1, fx2, fy2) {\n var x1 = Math.floor(fx1);\n var y1 = Math.floor(fy1);\n var x2 = Math.floor(fx2);\n var y2 = Math.floor(fy2);\n var dataMap = new Map();\n var outSelectedPosition = [0, 0];\n\n for (var yy = y1; yy <= y2; yy++) {\n for (var xx = x1; xx <= x2; xx++) {\n var pos = [xx, yy];\n var info = getPixelInformationWithData(buffdata, pos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n var hash = getInfoHash(info);\n\n if (!dataMap.has(hash)) {\n dataMap.set(hash, {\n info: info,\n pixelCount: 1,\n attributeIDs: [info.attributeID]\n });\n } else {\n var dmv = dataMap.get(hash);\n dmv.pixelCount++;\n\n if (buffdata.captureZValues) {\n if (info.zValue < dmv.info.zValue) {\n dmv.info = info;\n }\n }\n\n if (dmv.attributeIDs.indexOf(info.attributeID) === -1) {\n dmv.attributeIDs.push(info.attributeID);\n }\n }\n }\n }\n }\n\n return convertSelection(buffdata.fieldAssociation, dataMap, buffdata.captureZValues, buffdata.renderer, buffdata.openGLRenderWindow);\n} // ----------------------------------------------------------------------------\n// vtkOpenGLHardwareSelector methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLHardwareSelector(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLHardwareSelector'); //----------------------------------------------------------------------------\n\n publicAPI.releasePixBuffers = function () {\n model.rawPixBuffer = [];\n model.pixBuffer = [];\n model.zBuffer = null;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.beginSelection = function () {\n model._openGLRenderer = model._openGLRenderWindow.getViewNodeFor(model._renderer);\n model.maxAttributeId = 0;\n\n var size = model._openGLRenderWindow.getSize();\n\n if (!model.framebuffer) {\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n model.framebuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.framebuffer.saveCurrentBindingsAndBuffers();\n model.framebuffer.create(size[0], size[1]); // this calls model.framebuffer.bind()\n\n model.framebuffer.populateFramebuffer();\n } else {\n model.framebuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.framebuffer.saveCurrentBindingsAndBuffers();\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.create(size[0], size[1]); // this calls model.framebuffer.bind()\n\n model.framebuffer.populateFramebuffer();\n } else {\n model.framebuffer.bind();\n }\n }\n\n model._openGLRenderer.clear();\n\n model._openGLRenderer.setSelector(publicAPI);\n\n model.hitProps = {};\n model.propPixels = {};\n model.props = [];\n publicAPI.releasePixBuffers();\n\n if (model.fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n var gl = model._openGLRenderWindow.getContext();\n\n var originalBlending = gl.isEnabled(gl.BLEND);\n gl.disable(gl.BLEND);\n\n model._openGLRenderWindow.traverseAllPasses();\n\n if (originalBlending) {\n gl.enable(gl.BLEND);\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.endSelection = function () {\n model.hitProps = {};\n\n model._openGLRenderer.setSelector(null);\n\n model.framebuffer.restorePreviousBindingsAndBuffers();\n };\n\n publicAPI.preCapturePass = function () {\n var gl = model._openGLRenderWindow.getContext(); // Disable blending\n\n\n model.originalBlending = gl.isEnabled(gl.BLEND);\n gl.disable(gl.BLEND);\n };\n\n publicAPI.postCapturePass = function () {\n var gl = model._openGLRenderWindow.getContext(); // Restore blending if it was enabled prior to the capture\n\n\n if (model.originalBlending) {\n gl.enable(gl.BLEND);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.select = function () {\n var sel = null;\n\n if (publicAPI.captureBuffers()) {\n sel = publicAPI.generateSelection(model.area[0], model.area[1], model.area[2], model.area[3]);\n publicAPI.releasePixBuffers();\n }\n\n return sel;\n };\n\n publicAPI.getSourceDataAsync = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(renderer, fx1, fy1, fx2, fy2) {\n var size, result;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // assign the renderer\n model._renderer = renderer; // set area to all if no arguments provided\n\n if (fx1 === undefined) {\n size = model._openGLRenderWindow.getSize();\n publicAPI.setArea(0, 0, size[0] - 1, size[1] - 1);\n } else {\n publicAPI.setArea(fx1, fy1, fx2, fy2);\n } // just do capture buffers and package up the result\n\n\n if (publicAPI.captureBuffers()) {\n _context.next = 4;\n break;\n }\n\n return _context.abrupt(\"return\", false);\n\n case 4:\n result = {\n area: _toConsumableArray(model.area),\n pixBuffer: _toConsumableArray(model.pixBuffer),\n captureZValues: model.captureZValues,\n zBuffer: model.zBuffer,\n props: _toConsumableArray(model.props),\n fieldAssociation: model.fieldAssociation,\n renderer: renderer,\n openGLRenderWindow: model._openGLRenderWindow\n };\n\n result.generateSelection = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return generateSelectionWithData.apply(void 0, [result].concat(args));\n };\n\n return _context.abrupt(\"return\", result);\n\n case 7:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }(); //----------------------------------------------------------------------------\n\n\n publicAPI.captureBuffers = function () {\n if (!model._renderer || !model._openGLRenderWindow) {\n vtkErrorMacro('Renderer and view must be set before calling Select.');\n return false;\n }\n\n model._openGLRenderer = model._openGLRenderWindow.getViewNodeFor(model._renderer); // todo revisit making selection part of core\n // then we can do this in core\n\n model._openGLRenderWindow.getRenderable().preRender(); // int rgba[4];\n // rwin.getColorBufferSizes(rgba);\n // if (rgba[0] < 8 || rgba[1] < 8 || rgba[2] < 8) {\n // vtkErrorMacro(\"Color buffer depth must be at least 8 bit. \"\n // \"Currently: \" << rgba[0] << \", \" << rgba[1] << \", \" < 0x00ffffff;\n }\n\n if (model.fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_CELLS) {\n return model.maximumCellId > 0x00ffffff;\n }\n }\n\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.savePixelBuffer = function (passNo) {\n model.pixBuffer[passNo] = model._openGLRenderWindow.getPixelData(model.area[0], model.area[1], model.area[2], model.area[3]);\n\n if (!model.rawPixBuffer[passNo]) {\n var size = (model.area[2] - model.area[0] + 1) * (model.area[3] - model.area[1] + 1) * 4;\n model.rawPixBuffer[passNo] = new Uint8Array(size);\n model.rawPixBuffer[passNo].set(model.pixBuffer[passNo]);\n }\n\n if (passNo === PassTypes.ACTOR_PASS) {\n if (model.captureZValues) {\n var rpasses = model._openGLRenderWindow.getRenderPasses();\n\n if (typeof rpasses[0].requestDepth === 'function' && typeof rpasses[0].getFramebuffer === 'function') {\n var fb = rpasses[0].getFramebuffer();\n fb.saveCurrentBindingsAndBuffers();\n fb.bind();\n model.zBuffer = model._openGLRenderWindow.getPixelData(model.area[0], model.area[1], model.area[2], model.area[3]);\n fb.restorePreviousBindingsAndBuffers();\n }\n }\n\n publicAPI.buildPropHitList(model.rawPixBuffer[passNo]);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.buildPropHitList = function (pixelbuffer) {\n var offset = 0;\n\n for (var yy = 0; yy <= model.area[3] - model.area[1]; yy++) {\n for (var xx = 0; xx <= model.area[2] - model.area[0]; xx++) {\n var val = convert(xx, yy, pixelbuffer, model.area);\n\n if (val > 0) {\n val--;\n\n if (!(val in model.hitProps)) {\n model.hitProps[val] = true;\n model.propPixels[val] = [];\n }\n\n model.propPixels[val].push(offset * 4);\n }\n\n ++offset;\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.renderProp = function (prop) {\n if (model.currentPass === PassTypes.ACTOR_PASS) {\n publicAPI.setPropColorValueFromInt(model.props.length + idOffset);\n model.props.push(prop);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.renderCompositeIndex = function (index) {\n if (model.currentPass === PassTypes.COMPOSITE_INDEX_PASS) {\n publicAPI.setPropColorValueFromInt(index + idOffset);\n }\n }; //----------------------------------------------------------------------------\n // TODO: make inline\n\n\n publicAPI.renderAttributeId = function (attribid) {\n if (attribid < 0) {\n // negative attribid is valid. It happens when rendering higher order\n // elements where new points are added for rendering smooth surfaces.\n return;\n }\n\n model.maxAttributeId = attribid > model.maxAttributeId ? attribid : model.maxAttributeId; // if (model.currentPass < PassTypes.ID_LOW24) {\n // return; // useless...\n // }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.passTypeToString = function (type) {\n return macro.enumToString(PassTypes, type);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.isPropHit = function (id) {\n return Boolean(model.hitProps[id]);\n };\n\n publicAPI.setPropColorValueFromInt = function (val) {\n model.propColorValue[0] = val % 256 / 255.0;\n model.propColorValue[1] = Math.floor(val / 256) % 256 / 255.0;\n model.propColorValue[2] = Math.floor(val / 65536) % 256 / 255.0;\n }; // info has\n // valid\n // propId\n // prop\n // compositeID\n // attributeID\n //----------------------------------------------------------------------------\n\n\n publicAPI.getPixelInformation = function (inDisplayPosition, maxDistance, outSelectedPosition) {\n // Base case\n var maxDist = maxDistance < 0 ? 0 : maxDistance;\n\n if (maxDist === 0) {\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n\n if (inDisplayPosition[0] < model.area[0] || inDisplayPosition[0] > model.area[2] || inDisplayPosition[1] < model.area[1] || inDisplayPosition[1] > model.area[3]) {\n return null;\n } // offset inDisplayPosition based on the lower-left-corner of the Area.\n\n\n var displayPosition = [inDisplayPosition[0] - model.area[0], inDisplayPosition[1] - model.area[1]];\n var actorid = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ACTOR_PASS], model.area);\n\n if (actorid <= 0 || actorid - idOffset >= model.props.length) {\n // the pixel did not hit any actor.\n return null;\n }\n\n var _info2 = {};\n _info2.valid = true;\n _info2.propID = actorid - idOffset;\n _info2.prop = model.props[_info2.propID];\n var compositeID = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.COMPOSITE_INDEX_PASS], model.area);\n\n if (compositeID < 0 || compositeID > 0xffffff) {\n compositeID = 0;\n }\n\n _info2.compositeID = compositeID - idOffset;\n\n if (model.captureZValues) {\n var offset = (displayPosition[1] * (model.area[2] - model.area[0] + 1) + displayPosition[0]) * 4;\n _info2.zValue = (256 * model.zBuffer[offset] + model.zBuffer[offset + 1]) / 65535.0;\n _info2.displayPosition = inDisplayPosition;\n } // Skip attribute ids if alpha is zero (missed)\n\n\n if (model.pixBuffer[PassTypes.ID_LOW24]) {\n if (getAlpha(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ID_LOW24], model.area) === 0.0) {\n return _info2;\n }\n }\n\n var low24 = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ID_LOW24], model.area);\n var high24 = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ID_HIGH24], model.area);\n _info2.attributeID = getID(low24, high24);\n return _info2;\n } // Iterate over successively growing boxes.\n // They recursively call the base case to handle single pixels.\n\n\n var dispPos = [inDisplayPosition[0], inDisplayPosition[1]];\n var curPos = [0, 0];\n var info = publicAPI.getPixelInformation(inDisplayPosition, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n\n for (var dist = 1; dist < maxDist; ++dist) {\n // Vertical sides of box.\n for (var y = dispPos[1] > dist ? dispPos[1] - dist : 0; y <= dispPos[1] + dist; ++y) {\n curPos[1] = y;\n\n if (dispPos[0] >= dist) {\n curPos[0] = dispPos[0] - dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[0] = dispPos[0] + dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n } // Horizontal sides of box.\n\n\n for (var x = dispPos[0] >= dist ? dispPos[0] - (dist - 1) : 0; x <= dispPos[0] + (dist - 1); ++x) {\n curPos[0] = x;\n\n if (dispPos[1] >= dist) {\n curPos[1] = dispPos[1] - dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[1] = dispPos[1] + dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n } // nothing hit.\n\n\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n return null;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.generateSelection = function (fx1, fy1, fx2, fy2) {\n var x1 = Math.floor(fx1);\n var y1 = Math.floor(fy1);\n var x2 = Math.floor(fx2);\n var y2 = Math.floor(fy2);\n var dataMap = new Map();\n var outSelectedPosition = [0, 0];\n\n for (var yy = y1; yy <= y2; yy++) {\n for (var xx = x1; xx <= x2; xx++) {\n var pos = [xx, yy];\n var info = publicAPI.getPixelInformation(pos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n var hash = getInfoHash(info);\n\n if (!dataMap.has(hash)) {\n dataMap.set(hash, {\n info: info,\n pixelCount: 1,\n attributeIDs: [info.attributeID]\n });\n } else {\n var dmv = dataMap.get(hash);\n dmv.pixelCount++;\n\n if (model.captureZValues) {\n if (info.zValue < dmv.info.zValue) {\n dmv.info = info;\n }\n }\n\n if (dmv.attributeIDs.indexOf(info.attributeID) === -1) {\n dmv.attributeIDs.push(info.attributeID);\n }\n }\n }\n }\n }\n\n return convertSelection(model.fieldAssociation, dataMap, model.captureZValues, model._renderer, model._openGLRenderWindow);\n };\n\n publicAPI.getRawPixelBuffer = function (passNo) {\n return model.rawPixBuffer[passNo];\n };\n\n publicAPI.getPixelBuffer = function (passNo) {\n return model.pixBuffer[passNo];\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.attach = function (w, r) {\n model._openGLRenderWindow = w;\n model._renderer = r;\n }; // override\n\n\n var superSetArea = publicAPI.setArea;\n\n publicAPI.setArea = function () {\n if (superSetArea.apply(void 0, arguments)) {\n model.area[0] = Math.floor(model.area[0]);\n model.area[1] = Math.floor(model.area[1]);\n model.area[2] = Math.floor(model.area[2]);\n model.area[3] = Math.floor(model.area[3]);\n return true;\n }\n\n return false;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n area: undefined,\n // _renderer: null,\n // _openGLRenderWindow: null,\n // _openGLRenderer: null,\n currentPass: -1,\n propColorValue: null,\n props: null,\n maximumPointId: 0,\n maximumCellId: 0,\n idOffset: 1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkHardwareSelector$1.extend(publicAPI, model, initialValues);\n model.propColorValue = [0, 0, 0];\n model.props = [];\n\n if (!model.area) {\n model.area = [0, 0, 0, 0];\n }\n\n macro.setGetArray(publicAPI, model, ['area'], 4);\n macro.setGet(publicAPI, model, ['_renderer', 'currentPass', '_openGLRenderWindow', 'maximumPointId', 'maximumCellId']);\n macro.setGetArray(publicAPI, model, ['propColorValue'], 3);\n macro.moveToProtected(publicAPI, model, ['renderer', 'openGLRenderWindow']);\n macro.event(publicAPI, model, 'event'); // Object methods\n\n vtkOpenGLHardwareSelector(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLHardwareSelector'); // ----------------------------------------------------------------------------\n\nvar vtkHardwareSelector = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkHardwareSelector as default, extend, newInstance };\n","import Md5 from 'spark-md5';\nimport macro from '../../macros.js';\nimport vtkShaderProgram from './ShaderProgram.js';\n\nvar SET_GET_FIELDS = ['lastShaderBound', 'context', '_openGLRenderWindow']; // ----------------------------------------------------------------------------\n// vtkShaderCache methods\n// ----------------------------------------------------------------------------\n\nfunction vtkShaderCache(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkShaderCache');\n\n publicAPI.replaceShaderValues = function (VSSource, FSSource, GSSource) {\n // first handle renaming any Fragment shader inputs\n // if we have a geometry shader. By default fragment shaders\n // assume their inputs come from a Vertex Shader. When we\n // have a Geometry shader we rename the frament shader inputs\n // to come from the geometry shader\n var nFSSource = FSSource;\n\n if (GSSource.length > 0) {\n nFSSource = vtkShaderProgram.substitute(nFSSource, 'VSOut', 'GSOut').result;\n }\n\n var gl2 = model._openGLRenderWindow.getWebgl2();\n\n var fragDepthString = '\\n';\n var version = '#version 100\\n';\n\n if (gl2) {\n version = '#version 300 es\\n' + '#define attribute in\\n' + '#define textureCube texture\\n' + '#define texture2D texture\\n' + '#define textureCubeLod textureLod\\n' + '#define texture2DLod textureLod\\n';\n } else {\n model.context.getExtension('OES_standard_derivatives');\n\n if (model.context.getExtension('EXT_frag_depth')) {\n fragDepthString = '#extension GL_EXT_frag_depth : enable\\n';\n }\n\n if (model.context.getExtension('EXT_shader_texture_lod')) {\n fragDepthString += '#extension GL_EXT_shader_texture_lod : enable\\n' + '#define textureCubeLod textureCubeLodEXT\\n' + '#define texture2DLod texture2DLodEXT';\n }\n }\n\n nFSSource = vtkShaderProgram.substitute(nFSSource, '//VTK::System::Dec', [\"\".concat(version, \"\\n\"), gl2 ? '' : '#extension GL_OES_standard_derivatives : enable\\n', fragDepthString, '#ifdef GL_FRAGMENT_PRECISION_HIGH', 'precision highp float;', 'precision highp int;', '#else', 'precision mediump float;', 'precision mediump int;', '#endif']).result;\n var nVSSource = vtkShaderProgram.substitute(VSSource, '//VTK::System::Dec', [\"\".concat(version, \"\\n\"), '#ifdef GL_FRAGMENT_PRECISION_HIGH', 'precision highp float;', 'precision highp int;', '#else', 'precision mediump float;', 'precision mediump int;', '#endif']).result;\n\n if (gl2) {\n nVSSource = vtkShaderProgram.substitute(nVSSource, 'varying', 'out').result;\n nFSSource = vtkShaderProgram.substitute(nFSSource, 'varying', 'in').result;\n var shaderOutputs = '';\n var outputCount = 0;\n\n while (nFSSource.includes(\"gl_FragData[\".concat(outputCount, \"]\"))) {\n nFSSource = vtkShaderProgram.substitute(nFSSource, \"gl_FragData\\\\[\".concat(outputCount, \"\\\\]\"), \"fragOutput\".concat(outputCount)).result;\n shaderOutputs += \"layout(location = \".concat(outputCount, \") out vec4 fragOutput\").concat(outputCount, \";\\n\");\n outputCount++;\n }\n\n nFSSource = vtkShaderProgram.substitute(nFSSource, '//VTK::Output::Dec', shaderOutputs).result;\n } // nFSSource = ShaderProgram.substitute(nFSSource, 'gl_FragData\\\\[0\\\\]',\n // 'gl_FragColor').result;\n\n\n var nGSSource = vtkShaderProgram.substitute(GSSource, '//VTK::System::Dec', version).result;\n return {\n VSSource: nVSSource,\n FSSource: nFSSource,\n GSSource: nGSSource\n };\n }; // return NULL if there is an issue\n\n\n publicAPI.readyShaderProgramArray = function (vertexCode, fragmentCode, geometryCode) {\n var data = publicAPI.replaceShaderValues(vertexCode, fragmentCode, geometryCode);\n var shader = publicAPI.getShaderProgram(data.VSSource, data.FSSource, data.GSSource);\n return publicAPI.readyShaderProgram(shader);\n };\n\n publicAPI.readyShaderProgram = function (shader) {\n if (!shader) {\n return null;\n } // compile if needed\n\n\n if (!shader.getCompiled() && !shader.compileShader()) {\n return null;\n } // bind if needed\n\n\n if (!publicAPI.bindShader(shader)) {\n return null;\n }\n\n return shader;\n };\n\n publicAPI.getShaderProgram = function (vertexCode, fragmentCode, geometryCode) {\n // compute the MD5 and the check the map\n var hashInput = \"\".concat(vertexCode).concat(fragmentCode).concat(geometryCode);\n var result = Md5.hash(hashInput); // does it already exist?\n\n if (!(result in model.shaderPrograms)) {\n // create one\n var sps = vtkShaderProgram.newInstance();\n sps.setContext(model.context);\n sps.getVertexShader().setSource(vertexCode);\n sps.getFragmentShader().setSource(fragmentCode);\n\n if (geometryCode) {\n sps.getGeometryShader().setSource(geometryCode);\n }\n\n sps.setMd5Hash(result);\n model.shaderPrograms[result] = sps;\n return sps;\n }\n\n return model.shaderPrograms[result];\n };\n\n publicAPI.releaseGraphicsResources = function (win) {\n // NOTE:\n // In the current implementation as of October 26th, if a shader\n // program is created by ShaderCache then it should make sure\n // that it releases the graphics resources used by these programs.\n // It is not wisely for callers to do that since then they would\n // have to loop over all the programs were in use and invoke\n // release graphics resources individually.\n publicAPI.releaseCurrentShader();\n Object.keys(model.shaderPrograms).map(function (key) {\n return model.shaderPrograms[key];\n }).forEach(function (sp) {\n return sp.releaseGraphicsResources(win);\n });\n };\n\n publicAPI.releaseGraphicsResources = function () {\n // release prior shader\n if (model.astShaderBound) {\n model.lastShaderBound.release();\n model.lastShaderBound = null;\n }\n };\n\n publicAPI.bindShader = function (shader) {\n if (model.lastShaderBound === shader) {\n return 1;\n } // release prior shader\n\n\n if (model.lastShaderBound) {\n model.lastShaderBound.release();\n }\n\n shader.bind();\n model.lastShaderBound = shader;\n return 1;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n lastShaderBound: null,\n shaderPrograms: null,\n context: null // _openGLRenderWindow: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Internal objects\n\n model.shaderPrograms = {}; // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, SET_GET_FIELDS);\n macro.moveToProtected(publicAPI, model, ['openGLRenderWindow']); // Object methods\n\n vtkShaderCache(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkShaderCache'); // ----------------------------------------------------------------------------\n\nvar vtkShaderCache$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkShaderCache$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkOpenGLTextureUnitManager methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLTextureUnitManager(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLTextureUnitManager'); // ----------------------------------------------------------------------------\n // Description:\n // Delete the allocation table and check if it is not called before\n // all the texture units have been released.\n\n publicAPI.deleteTable = function () {\n for (var i = 0; i < model.numberOfTextureUnits; ++i) {\n if (model.textureUnits[i] === true) {\n vtkErrorMacro('some texture units were not properly released');\n }\n }\n\n model.textureUnits = [];\n model.numberOfTextureUnits = 0;\n }; // ----------------------------------------------------------------------------\n\n\n publicAPI.setContext = function (ctx) {\n if (model.context !== ctx) {\n if (model.context !== 0) {\n publicAPI.deleteTable();\n }\n\n model.context = ctx;\n\n if (model.context) {\n model.numberOfTextureUnits = ctx.getParameter(ctx.MAX_TEXTURE_IMAGE_UNITS);\n\n for (var i = 0; i < model.numberOfTextureUnits; ++i) {\n model.textureUnits[i] = false;\n }\n }\n\n publicAPI.modified();\n }\n }; // ----------------------------------------------------------------------------\n // Description:\n // Reserve a texture unit. It returns its number.\n // It returns -1 if the allocation failed (because there are no more\n // texture units left).\n // \\post valid_result: result==-1 || result>=0 && resultGetNumberOfTextureUnits())\n // \\post allocated: result==-1 || this->IsAllocated(result)\n\n\n publicAPI.allocate = function () {\n for (var i = 0; i < model.numberOfTextureUnits; i++) {\n if (!publicAPI.isAllocated(i)) {\n model.textureUnits[i] = true;\n return i;\n }\n }\n\n return -1;\n };\n\n publicAPI.allocateUnit = function (unit) {\n if (publicAPI.isAllocated(unit)) {\n return -1;\n }\n\n model.textureUnits[unit] = true;\n return unit;\n }; // ----------------------------------------------------------------------------\n // Description:\n // Tell if texture unit `textureUnitId' is already allocated.\n // \\pre valid_id_range : textureUnitId>=0 && textureUnitIdGetNumberOfTextureUnits()\n\n\n publicAPI.isAllocated = function (textureUnitId) {\n return model.textureUnits[textureUnitId];\n }; // ----------------------------------------------------------------------------\n // Description:\n // Release a texture unit.\n // \\pre valid_id: textureUnitId>=0 && textureUnitIdGetNumberOfTextureUnits()\n // \\pre allocated_id: this->IsAllocated(textureUnitId)\n\n\n publicAPI.free = function (val) {\n model.textureUnits[val] = false;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n numberOfTextureUnits: 0,\n textureUnits: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n model.textureUnits = []; // Build VTK API\n\n macro.get(publicAPI, model, ['numberOfTextureUnits']);\n macro.setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLTextureUnitManager(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLTextureUnitManager'); // ----------------------------------------------------------------------------\n\nvar vtkTextureUnitManager = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkTextureUnitManager as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNode from './ViewNode.js';\n\n// vtkRenderWindowViewNode is intended to be a superclass for all api specific\n// RenderWindows. It is intended to define a common API that can be invoked\n// upon an api specific render window and provide some common method\n// implementations. If your application requires communicating with an api specific\n// view try to limit such interactions to methods defined in this class.\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkRenderWindowViewNode methods\n// ----------------------------------------------------------------------------\n\nfunction vtkRenderWindowViewNode(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderWindowViewNode');\n\n publicAPI.getViewNodeFactory = function () {\n return null;\n };\n\n publicAPI.getAspectRatio = function () {\n return model.size[0] / model.size[1];\n };\n\n publicAPI.getAspectRatioForRenderer = function (renderer) {\n var viewport = renderer.getViewportByReference();\n return model.size[0] * (viewport[2] - viewport[0]) / ((viewport[3] - viewport[1]) * model.size[1]);\n };\n\n publicAPI.isInViewport = function (x, y, viewport) {\n var vCoords = viewport.getViewportByReference();\n var size = publicAPI.getFramebufferSize();\n\n if (vCoords[0] * size[0] <= x && vCoords[2] * size[0] >= x && vCoords[1] * size[1] <= y && vCoords[3] * size[1] >= y) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.getViewportSize = function (viewport) {\n var vCoords = viewport.getViewportByReference();\n var size = publicAPI.getFramebufferSize();\n return [(vCoords[2] - vCoords[0]) * size[0], (vCoords[3] - vCoords[1]) * size[1]];\n };\n\n publicAPI.getViewportCenter = function (viewport) {\n var size = publicAPI.getViewportSize(viewport);\n return [size[0] * 0.5, size[1] * 0.5];\n };\n\n publicAPI.displayToNormalizedDisplay = function (x, y, z) {\n var size = publicAPI.getFramebufferSize();\n return [x / size[0], y / size[1], z];\n };\n\n publicAPI.normalizedDisplayToDisplay = function (x, y, z) {\n var size = publicAPI.getFramebufferSize();\n return [x * size[0], y * size[1], z];\n };\n\n publicAPI.worldToView = function (x, y, z, renderer) {\n return renderer.worldToView(x, y, z);\n };\n\n publicAPI.viewToWorld = function (x, y, z, renderer) {\n return renderer.viewToWorld(x, y, z);\n };\n\n publicAPI.worldToDisplay = function (x, y, z, renderer) {\n var val = renderer.worldToView(x, y, z);\n var dims = publicAPI.getViewportSize(renderer);\n var val2 = renderer.viewToProjection(val[0], val[1], val[2], dims[0] / dims[1]);\n var val3 = renderer.projectionToNormalizedDisplay(val2[0], val2[1], val2[2]);\n return publicAPI.normalizedDisplayToDisplay(val3[0], val3[1], val3[2]);\n };\n\n publicAPI.displayToWorld = function (x, y, z, renderer) {\n var val = publicAPI.displayToNormalizedDisplay(x, y, z);\n var val2 = renderer.normalizedDisplayToProjection(val[0], val[1], val[2]);\n var dims = publicAPI.getViewportSize(renderer);\n var val3 = renderer.projectionToView(val2[0], val2[1], val2[2], dims[0] / dims[1]);\n return renderer.viewToWorld(val3[0], val3[1], val3[2]);\n };\n\n publicAPI.normalizedDisplayToViewport = function (x, y, z, renderer) {\n var vCoords = renderer.getViewportByReference();\n vCoords = publicAPI.normalizedDisplayToDisplay(vCoords[0], vCoords[1], 0.0);\n var coords = publicAPI.normalizedDisplayToDisplay(x, y, z);\n return [coords[0] - vCoords[0] - 0.5, coords[1] - vCoords[1] - 0.5, z];\n };\n\n publicAPI.viewportToNormalizedViewport = function (x, y, z, renderer) {\n var size = publicAPI.getViewportSize(renderer);\n\n if (size && size[0] !== 0 && size[1] !== 0) {\n return [x / (size[0] - 1.0), y / (size[1] - 1.0), z];\n }\n\n return [x, y, z];\n };\n\n publicAPI.normalizedViewportToViewport = function (x, y, z, renderer) {\n var size = publicAPI.getViewportSize(renderer);\n return [x * (size[0] - 1.0), y * (size[1] - 1.0), z];\n };\n\n publicAPI.displayToLocalDisplay = function (x, y, z) {\n var size = publicAPI.getFramebufferSize();\n return [x, size[1] - y - 1, z];\n };\n\n publicAPI.viewportToNormalizedDisplay = function (x, y, z, renderer) {\n var vCoords = renderer.getViewportByReference();\n vCoords = publicAPI.normalizedDisplayToDisplay(vCoords[0], vCoords[1], 0.0);\n var x2 = x + vCoords[0] + 0.5;\n var y2 = y + vCoords[1] + 0.5;\n return publicAPI.displayToNormalizedDisplay(x2, y2, z);\n };\n\n publicAPI.getComputedDevicePixelRatio = function () {\n return model.size[0] / publicAPI.getContainerSize()[0];\n };\n\n publicAPI.getContainerSize = function () {\n macro.vtkErrorMacro('not implemented');\n };\n\n publicAPI.getPixelData = function (x1, y1, x2, y2) {\n macro.vtkErrorMacro('not implemented');\n };\n\n publicAPI.createSelector = function () {\n macro.vtkErrorMacro('not implemented');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n size: undefined,\n selector: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n if (!model.size) {\n model.size = [300, 300];\n }\n\n macro.getArray(publicAPI, model, ['size'], 2);\n macro.get(publicAPI, model, ['selector']); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Object methods\n\n vtkRenderWindowViewNode(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderWindowViewNode'); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindowViewNode$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkRenderWindowViewNode$1 as default, extend, newInstance };\n","var XrSessionTypes = {\n HmdVR: 0,\n // Head-mounted display (HMD), two-camera virtual reality session\n MobileAR: 1,\n // Mobile device, single-camera augmented reality session\n LookingGlassVR: 2 // Looking Glass hologram display, N-camera virtual reality session\n\n};\nvar Constants = {\n XrSessionTypes: XrSessionTypes\n};\n\nexport { XrSessionTypes, Constants as default };\n","// This is used to access the underlying 3D context\nvar GET_UNDERLYING_CONTEXT = '__getUnderlyingContext';\nfunction createContextProxyHandler() {\n var cache = new Map();\n var getParameterHandler = {\n apply: function apply(target, gl, args) {\n if (cache.has(args[0])) {\n return cache.get(args[0]);\n }\n\n return target.apply(gl, args);\n }\n }; // only supports single-value setters\n\n function cachedSetterHandler(key) {\n return {\n apply: function apply(target, gl, args) {\n cache.set(key, args[0]);\n return target.apply(gl, args);\n }\n };\n } // When a property is accessed on the webgl context proxy,\n // it's accessed is intercepted. If the property name matches\n // any of the keys of `propHandlers`, then that handler is called\n // with the following arguments: (gl, prop, receiver, propValue)\n // - gl (WebGL2RenderingContext): the underlying webgl context\n // - propName (string): the property name\n // - receiver (Proxy): the webgl context proxy\n // - propValue (unknown): the value of `gl[propName]`\n\n\n var propHandlers = Object.create(null); // Sets getParameter(property) as a cached getter proxy.\n // propValue.bind(gl) is to avoid Illegal Invocation errors.\n\n propHandlers.getParameter = function (gl, prop, receiver, propValue) {\n return new Proxy(propValue.bind(gl), getParameterHandler);\n }; // Sets depthMask(flag) as a cached setter proxy.\n\n\n propHandlers.depthMask = function (gl, prop, receiver, propValue) {\n return new Proxy(propValue.bind(gl), cachedSetterHandler(gl.DEPTH_WRITEMASK));\n };\n\n return {\n get: function get(gl, prop, receiver) {\n if (prop === GET_UNDERLYING_CONTEXT) return function () {\n return gl;\n };\n var value = Reflect.get(gl, prop, gl);\n\n if (value instanceof Function) {\n // prevents Illegal Invocation errors\n value = value.bind(gl);\n }\n\n var propHandler = propHandlers[prop];\n\n if (propHandler) {\n return propHandler(gl, prop, receiver, value);\n }\n\n return value;\n }\n };\n}\nvar ContextProxy = {\n createContextProxyHandler: createContextProxyHandler\n};\n\nexport { GET_UNDERLYING_CONTEXT, createContextProxyHandler, ContextProxy as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport macro from '../../macros.js';\nimport { registerViewConstructor } from '../Core/RenderWindow.js';\nimport vtkForwardPass from './ForwardPass.js';\nimport vtkHardwareSelector from './HardwareSelector.js';\nimport vtkShaderCache from './ShaderCache.js';\nimport vtkTextureUnitManager from './TextureUnitManager.js';\nimport vtkViewNodeFactory from './ViewNodeFactory.js';\nimport vtkRenderPass from '../SceneGraph/RenderPass.js';\nimport vtkRenderWindowViewNode from '../SceneGraph/RenderWindowViewNode.js';\nimport Constants from './RenderWindow/Constants.js';\nimport { createContextProxyHandler, GET_UNDERLYING_CONTEXT } from './RenderWindow/ContextProxy.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro,\n vtkErrorMacro = macro.vtkErrorMacro;\nvar XrSessionTypes = Constants.XrSessionTypes;\nvar SCREENSHOT_PLACEHOLDER = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%'\n};\nvar DEFAULT_RESET_FACTORS = {\n vr: {\n rescaleFactor: 1.0,\n translateZ: -0.7 // 0.7 m forward from the camera\n\n },\n ar: {\n rescaleFactor: 0.25,\n // scale down AR for viewing comfort by default\n translateZ: -0.5 // 0.5 m forward from the camera\n\n }\n};\n\nfunction checkRenderTargetSupport(gl, format, type) {\n // create temporary frame buffer and texture\n var framebuffer = gl.createFramebuffer();\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, format, 2, 2, 0, format, type, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); // check frame buffer status\n\n var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); // clean up\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n return status === gl.FRAMEBUFFER_COMPLETE;\n} // ----------------------------------------------------------------------------\n// Monitor the usage of GL context across vtkOpenGLRenderWindow instances\n// ----------------------------------------------------------------------------\n\n\nvar GL_CONTEXT_COUNT = 0;\nvar GL_CONTEXT_LISTENERS = [];\n\nfunction createGLContext() {\n GL_CONTEXT_COUNT++;\n GL_CONTEXT_LISTENERS.forEach(function (cb) {\n return cb(GL_CONTEXT_COUNT);\n });\n}\n\nfunction deleteGLContext() {\n GL_CONTEXT_COUNT--;\n GL_CONTEXT_LISTENERS.forEach(function (cb) {\n return cb(GL_CONTEXT_COUNT);\n });\n}\n\nfunction pushMonitorGLContextCount(cb) {\n GL_CONTEXT_LISTENERS.push(cb);\n}\nfunction popMonitorGLContextCount(cb) {\n return GL_CONTEXT_LISTENERS.pop();\n}\n\nfunction _preventDefault(e) {\n e.preventDefault();\n} // ----------------------------------------------------------------------------\n// vtkOpenGLRenderWindow methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLRenderWindow(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLRenderWindow');\n var cachingContextHandler = createContextProxyHandler();\n\n publicAPI.getViewNodeFactory = function () {\n return model.myFactory;\n }; // prevent default context lost handler\n\n\n model.canvas.addEventListener('webglcontextlost', _preventDefault, false);\n model.canvas.addEventListener('webglcontextrestored', publicAPI.restoreContext, false); // Cache the value here as calling it on each frame is expensive\n\n var isImmersiveVrSupported = navigator.xr !== undefined && navigator.xr.isSessionSupported('immersive-vr'); // Auto update style\n\n var previousSize = [0, 0];\n\n function updateWindow() {\n // Canvas size\n if (model.renderable) {\n if (model.size[0] !== previousSize[0] || model.size[1] !== previousSize[1]) {\n previousSize[0] = model.size[0];\n previousSize[1] = model.size[1];\n model.canvas.setAttribute('width', model.size[0]);\n model.canvas.setAttribute('height', model.size[1]);\n }\n } // ImageStream size\n\n\n if (model.viewStream) {\n // If same size that's a NoOp\n model.viewStream.setSize(model.size[0], model.size[1]);\n } // Offscreen ?\n\n\n model.canvas.style.display = model.useOffScreen ? 'none' : 'block'; // Cursor type\n\n if (model.el) {\n model.el.style.cursor = model.cursorVisibility ? model.cursor : 'none';\n } // Invalidate cached DOM container size\n\n\n model.containerSize = null;\n }\n\n publicAPI.onModified(updateWindow); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNodes(model.renderable.getRenderersByReference());\n publicAPI.removeUnusedNodes();\n publicAPI.initialize();\n model.children.forEach(function (child) {\n child.setOpenGLRenderWindow(publicAPI);\n });\n }\n };\n\n publicAPI.initialize = function () {\n if (!model.initialized) {\n model.context = publicAPI.get3DContext();\n model.textureUnitManager = vtkTextureUnitManager.newInstance();\n model.textureUnitManager.setContext(model.context);\n model.shaderCache.setContext(model.context); // initialize blending for transparency\n\n var gl = model.context;\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n model.initialized = true;\n }\n };\n\n publicAPI.makeCurrent = function () {\n model.context.makeCurrent();\n };\n\n publicAPI.setContainer = function (el) {\n if (model.el && model.el !== el) {\n if (model.canvas.parentNode !== model.el) {\n vtkErrorMacro('Error: canvas parent node does not match container');\n } // Remove canvas from previous container\n\n\n model.el.removeChild(model.canvas); // If the renderer has previously added\n // a background image, remove it from the DOM.\n\n if (model.el.contains(model.bgImage)) {\n model.el.removeChild(model.bgImage);\n }\n }\n\n if (model.el !== el) {\n model.el = el;\n\n if (model.el) {\n model.el.appendChild(model.canvas); // If the renderer is set to use a background\n // image, attach it to the DOM.\n\n if (model.useBackgroundImage) {\n model.el.appendChild(model.bgImage);\n }\n } // Trigger modified()\n\n\n publicAPI.modified();\n }\n };\n\n publicAPI.getContainer = function () {\n return model.el;\n };\n\n publicAPI.getContainerSize = function () {\n if (!model.containerSize && model.el) {\n var _model$el$getBounding = model.el.getBoundingClientRect(),\n width = _model$el$getBounding.width,\n height = _model$el$getBounding.height;\n\n model.containerSize = [width, height];\n }\n\n return model.containerSize || model.size;\n };\n\n publicAPI.getFramebufferSize = function () {\n if (model.activeFramebuffer) {\n return model.activeFramebuffer.getSize();\n }\n\n return model.size;\n };\n\n publicAPI.getPixelData = function (x1, y1, x2, y2) {\n var pixels = new Uint8Array((x2 - x1 + 1) * (y2 - y1 + 1) * 4);\n model.context.readPixels(x1, y1, x2 - x1 + 1, y2 - y1 + 1, model.context.RGBA, model.context.UNSIGNED_BYTE, pixels);\n return pixels;\n };\n\n publicAPI.get3DContext = function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n preserveDrawingBuffer: false,\n depth: true,\n alpha: true,\n powerPreference: 'high-performance'\n };\n var result = null; // Do we have webxr support\n\n if (isImmersiveVrSupported) {\n publicAPI.invokeHaveVRDisplay();\n }\n\n var webgl2Supported = typeof WebGL2RenderingContext !== 'undefined';\n model.webgl2 = false;\n\n if (model.defaultToWebgl2 && webgl2Supported) {\n result = model.canvas.getContext('webgl2', options);\n\n if (result) {\n model.webgl2 = true;\n vtkDebugMacro('using webgl2');\n }\n }\n\n if (!result) {\n vtkDebugMacro('using webgl1');\n result = model.canvas.getContext('webgl', options) || model.canvas.getContext('experimental-webgl', options);\n }\n\n return new Proxy(result, cachingContextHandler);\n }; // Request an XR session on the user device with WebXR,\n // typically in response to a user request such as a button press\n\n\n publicAPI.startXR = function (xrSessionType) {\n if (navigator.xr === undefined) {\n throw new Error('WebXR is not available');\n }\n\n model.xrSessionType = xrSessionType !== undefined ? xrSessionType : XrSessionTypes.HmdVR;\n var isAR = xrSessionType === XrSessionTypes.MobileAR;\n var sessionType = isAR ? 'immersive-ar' : 'immersive-vr';\n\n if (!navigator.xr.isSessionSupported(sessionType)) {\n if (isAR) {\n throw new Error('Device does not support AR session');\n } else {\n throw new Error('VR display is not available');\n }\n }\n\n if (model.xrSession === null) {\n navigator.xr.requestSession(sessionType).then(publicAPI.enterXR, function () {\n throw new Error('Failed to create XR session!');\n });\n } else {\n throw new Error('XR Session already exists!');\n }\n }; // When an XR session is available, set up the XRWebGLLayer\n // and request the first animation frame for the device\n\n\n publicAPI.enterXR = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(xrSession) {\n var gl, glLayer;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n model.xrSession = xrSession;\n model.oldCanvasSize = model.size.slice();\n\n if (!(model.xrSession !== null)) {\n _context.next = 15;\n break;\n }\n\n gl = publicAPI.get3DContext();\n _context.next = 6;\n return gl.makeXRCompatible();\n\n case 6:\n glLayer = new global.XRWebGLLayer(model.xrSession, // constructor needs unproxied context\n gl[GET_UNDERLYING_CONTEXT]());\n publicAPI.setSize(glLayer.framebufferWidth, glLayer.framebufferHeight);\n model.xrSession.updateRenderState({\n baseLayer: glLayer\n });\n model.xrSession.requestReferenceSpace('local').then(function (refSpace) {\n model.xrReferenceSpace = refSpace;\n });\n publicAPI.resetXRScene();\n model.renderable.getInteractor().switchToXRAnimation();\n model.xrSceneFrame = model.xrSession.requestAnimationFrame(publicAPI.xrRender);\n _context.next = 16;\n break;\n\n case 15:\n throw new Error('Failed to enter VR with a null xrSession.');\n\n case 16:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }();\n\n publicAPI.resetXRScene = function () {\n var inputRescaleFactor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_RESET_FACTORS.vr.rescaleFactor;\n var inputTranslateZ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_RESET_FACTORS.vr.translateZ;\n // Adjust world-to-physical parameters for different modalities\n // Default parameter values are for HMD VR\n var rescaleFactor = inputRescaleFactor;\n var translateZ = inputTranslateZ;\n var isXrSessionAR = model.xrSessionType === XrSessionTypes.MobileAR;\n\n if (isXrSessionAR && rescaleFactor === DEFAULT_RESET_FACTORS.vr.rescaleFactor) {\n // Scale down by default in AR\n rescaleFactor = DEFAULT_RESET_FACTORS.ar.rescaleFactor;\n }\n\n if (isXrSessionAR && translateZ === DEFAULT_RESET_FACTORS.vr.translateZ) {\n // Default closer to the camera in AR\n translateZ = DEFAULT_RESET_FACTORS.ar.translateZ;\n }\n\n var ren = model.renderable.getRenderers()[0];\n ren.resetCamera();\n var camera = ren.getActiveCamera();\n var physicalScale = camera.getPhysicalScale();\n var physicalTranslation = camera.getPhysicalTranslation();\n physicalScale /= rescaleFactor;\n translateZ *= physicalScale;\n physicalTranslation[2] += translateZ;\n camera.setPhysicalScale(physicalScale);\n camera.setPhysicalTranslation(physicalTranslation); // Clip at 0.1m, 100.0m in physical space by default\n\n camera.setClippingRange(0.1 * physicalScale, 100.0 * physicalScale);\n };\n\n publicAPI.stopXR = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {\n var gl, ren;\n return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(navigator.xr === undefined)) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 2:\n if (!(model.xrSession !== null)) {\n _context2.next = 10;\n break;\n }\n\n model.xrSession.cancelAnimationFrame(model.xrSceneFrame);\n model.renderable.getInteractor().returnFromXRAnimation();\n gl = publicAPI.get3DContext();\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n _context2.next = 9;\n return model.xrSession.end().catch(function (error) {\n if (!(error instanceof DOMException)) {\n throw error;\n }\n });\n\n case 9:\n model.xrSession = null;\n\n case 10:\n if (model.oldCanvasSize !== undefined) {\n publicAPI.setSize.apply(publicAPI, _toConsumableArray(model.oldCanvasSize));\n } // Reset to default canvas\n\n\n ren = model.renderable.getRenderers()[0];\n ren.getActiveCamera().setProjectionMatrix(null);\n ren.resetCamera();\n ren.setViewport(0.0, 0, 1.0, 1.0);\n publicAPI.traverseAllPasses();\n\n case 16:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n publicAPI.xrRender = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(t, frame) {\n var xrSession, xrPose, gl, glLayer, ren;\n return _regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n xrSession = frame.session;\n model.renderable.getInteractor().updateXRGamepads(xrSession, frame, model.xrReferenceSpace);\n model.xrSceneFrame = model.xrSession.requestAnimationFrame(publicAPI.xrRender);\n xrPose = frame.getViewerPose(model.xrReferenceSpace);\n\n if (xrPose) {\n gl = publicAPI.get3DContext();\n\n if (model.xrSessionType === XrSessionTypes.MobileAR && model.oldCanvasSize !== undefined) {\n gl.canvas.width = model.oldCanvasSize[0];\n gl.canvas.height = model.oldCanvasSize[1];\n }\n\n glLayer = xrSession.renderState.baseLayer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.clear(gl.DEPTH_BUFFER_BIT);\n publicAPI.setSize(glLayer.framebufferWidth, glLayer.framebufferHeight); // get the first renderer\n\n ren = model.renderable.getRenderers()[0]; // Do a render pass for each eye\n\n xrPose.views.forEach(function (view, index) {\n var viewport = glLayer.getViewport(view); // TODO: Appropriate handling for AR passthrough on HMDs\n // with two eyes will require further investigation.\n\n if (model.xrSessionType === XrSessionTypes.HmdVR) {\n if (view.eye === 'left') {\n ren.setViewport(0, 0, 0.5, 1.0);\n } else if (view.eye === 'right') {\n ren.setViewport(0.5, 0, 1.0, 1.0);\n } else {\n // No handling for non-eye viewport\n return;\n }\n } else if (model.xrSessionType === XrSessionTypes.LookingGlassVR) {\n var startX = viewport.x / glLayer.framebufferWidth;\n var startY = viewport.y / glLayer.framebufferHeight;\n var endX = (viewport.x + viewport.width) / glLayer.framebufferWidth;\n var endY = (viewport.y + viewport.height) / glLayer.framebufferHeight;\n ren.setViewport(startX, startY, endX, endY);\n } else {\n ren.setViewport(0, 0, 1, 1);\n }\n\n ren.getActiveCamera().computeViewParametersFromPhysicalMatrix(view.transform.inverse.matrix);\n ren.getActiveCamera().setProjectionMatrix(view.projectionMatrix);\n publicAPI.traverseAllPasses();\n }); // Reset scissorbox before any subsequent rendering to external displays\n // on frame end, such as rendering to a Looking Glass display.\n\n gl.scissor(0, 0, glLayer.framebufferWidth, glLayer.framebufferHeight);\n gl.disable(gl.SCISSOR_TEST);\n }\n\n case 5:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3);\n }));\n\n return function (_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n }();\n\n publicAPI.restoreContext = function () {\n var rp = vtkRenderPass.newInstance();\n rp.setCurrentOperation('Release');\n rp.traverse(publicAPI, null);\n };\n\n publicAPI.activateTexture = function (texture) {\n // Only add if it isn't already there\n var result = model._textureResourceIds.get(texture);\n\n if (result !== undefined) {\n model.context.activeTexture(model.context.TEXTURE0 + result);\n return;\n }\n\n var activeUnit = publicAPI.getTextureUnitManager().allocate();\n\n if (activeUnit < 0) {\n vtkErrorMacro('Hardware does not support the number of textures defined.');\n return;\n }\n\n model._textureResourceIds.set(texture, activeUnit);\n\n model.context.activeTexture(model.context.TEXTURE0 + activeUnit);\n };\n\n publicAPI.deactivateTexture = function (texture) {\n // Only deactivate if it isn't already there\n var result = model._textureResourceIds.get(texture);\n\n if (result !== undefined) {\n publicAPI.getTextureUnitManager().free(result);\n\n model._textureResourceIds.delete(texture);\n }\n };\n\n publicAPI.getTextureUnitForTexture = function (texture) {\n var result = model._textureResourceIds.get(texture);\n\n if (result !== undefined) {\n return result;\n }\n\n return -1;\n };\n\n publicAPI.getDefaultTextureInternalFormat = function (vtktype, numComps) {\n var oglNorm16Ext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var useHalfFloat = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (model.webgl2) {\n switch (vtktype) {\n case VtkDataTypes.UNSIGNED_CHAR:\n switch (numComps) {\n case 1:\n return model.context.R8;\n\n case 2:\n return model.context.RG8;\n\n case 3:\n return model.context.RGB8;\n\n case 4:\n default:\n return model.context.RGBA8;\n }\n\n case oglNorm16Ext && !useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:\n switch (numComps) {\n case 1:\n return oglNorm16Ext.R16_EXT;\n\n case 2:\n return oglNorm16Ext.RG16_EXT;\n\n case 3:\n return oglNorm16Ext.RGB16_EXT;\n\n case 4:\n default:\n return oglNorm16Ext.RGBA16_EXT;\n }\n\n // prioritize norm16 over float\n\n case oglNorm16Ext && !useHalfFloat && VtkDataTypes.SHORT:\n switch (numComps) {\n case 1:\n return oglNorm16Ext.R16_SNORM_EXT;\n\n case 2:\n return oglNorm16Ext.RG16_SNORM_EXT;\n\n case 3:\n return oglNorm16Ext.RGB16_SNORM_EXT;\n\n case 4:\n default:\n return oglNorm16Ext.RGBA16_SNORM_EXT;\n }\n\n case VtkDataTypes.FLOAT:\n default:\n switch (numComps) {\n case 1:\n return model.context.R16F;\n\n case 2:\n return model.context.RG16F;\n\n case 3:\n return model.context.RGB16F;\n\n case 4:\n default:\n return model.context.RGBA16F;\n }\n\n }\n } // webgl1 only supports four types\n\n\n switch (numComps) {\n case 1:\n return model.context.LUMINANCE;\n\n case 2:\n return model.context.LUMINANCE_ALPHA;\n\n case 3:\n return model.context.RGB;\n\n case 4:\n default:\n return model.context.RGBA;\n }\n };\n\n publicAPI.setBackgroundImage = function (img) {\n model.bgImage.src = img.src;\n };\n\n publicAPI.setUseBackgroundImage = function (value) {\n model.useBackgroundImage = value; // Add or remove the background image from the\n // DOM as specified.\n\n if (model.useBackgroundImage && !model.el.contains(model.bgImage)) {\n model.el.appendChild(model.bgImage);\n } else if (!model.useBackgroundImage && model.el.contains(model.bgImage)) {\n model.el.removeChild(model.bgImage);\n }\n };\n\n function getCanvasDataURL() {\n var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : model.imageFormat;\n // Copy current canvas to not modify the original\n var temporaryCanvas = document.createElement('canvas');\n var temporaryContext = temporaryCanvas.getContext('2d');\n temporaryCanvas.width = model.canvas.width;\n temporaryCanvas.height = model.canvas.height;\n temporaryContext.drawImage(model.canvas, 0, 0); // Get current client rect to place canvas\n\n var mainBoundingClientRect = model.canvas.getBoundingClientRect();\n var renderWindow = model.renderable;\n var renderers = renderWindow.getRenderers();\n renderers.forEach(function (renderer) {\n var viewProps = renderer.getViewProps();\n viewProps.forEach(function (viewProp) {\n // Check if the prop has a container that should have canvas\n if (viewProp.getContainer) {\n var container = viewProp.getContainer();\n var canvasList = container.getElementsByTagName('canvas'); // Go throughout all canvas and copy it into temporary main canvas\n\n for (var i = 0; i < canvasList.length; i++) {\n var currentCanvas = canvasList[i];\n var boundingClientRect = currentCanvas.getBoundingClientRect();\n var newXPosition = boundingClientRect.x - mainBoundingClientRect.x;\n var newYPosition = boundingClientRect.y - mainBoundingClientRect.y;\n temporaryContext.drawImage(currentCanvas, newXPosition, newYPosition);\n }\n }\n });\n });\n var screenshot = temporaryCanvas.toDataURL(format);\n temporaryCanvas.remove();\n publicAPI.invokeImageReady(screenshot);\n }\n\n publicAPI.captureNextImage = function () {\n var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'image/png';\n\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref4$resetCamera = _ref4.resetCamera,\n resetCamera = _ref4$resetCamera === void 0 ? false : _ref4$resetCamera,\n _ref4$size = _ref4.size,\n size = _ref4$size === void 0 ? null : _ref4$size,\n _ref4$scale = _ref4.scale,\n scale = _ref4$scale === void 0 ? 1 : _ref4$scale;\n\n if (model.deleted) {\n return null;\n }\n\n model.imageFormat = format;\n var previous = model.notifyStartCaptureImage;\n model.notifyStartCaptureImage = true;\n model._screenshot = {\n size: !!size || scale !== 1 ? size || model.size.map(function (val) {\n return val * scale;\n }) : null\n };\n return new Promise(function (resolve, reject) {\n var subscription = publicAPI.onImageReady(function (imageURL) {\n if (model._screenshot.size === null) {\n model.notifyStartCaptureImage = previous;\n subscription.unsubscribe();\n\n if (model._screenshot.placeHolder) {\n // resize the main canvas back to its original size and show it\n model.size = model._screenshot.originalSize; // process the resize\n\n publicAPI.modified(); // restore the saved camera parameters, if applicable\n\n if (model._screenshot.cameras) {\n model._screenshot.cameras.forEach(function (_ref5) {\n var restoreParamsFn = _ref5.restoreParamsFn,\n arg = _ref5.arg;\n return restoreParamsFn(arg);\n });\n } // Trigger a render at the original size\n\n\n publicAPI.traverseAllPasses(); // Remove and clean up the placeholder, revealing the original\n\n model.el.removeChild(model._screenshot.placeHolder);\n\n model._screenshot.placeHolder.remove();\n\n model._screenshot = null;\n }\n\n resolve(imageURL);\n } else {\n // Create a placeholder image overlay while we resize and render\n var tmpImg = document.createElement('img');\n tmpImg.style = SCREENSHOT_PLACEHOLDER;\n tmpImg.src = imageURL;\n model._screenshot.placeHolder = model.el.appendChild(tmpImg); // hide the main canvas\n\n model.canvas.style.display = 'none'; // remember the main canvas original size, then resize it\n\n model._screenshot.originalSize = model.size;\n model.size = model._screenshot.size;\n model._screenshot.size = null; // process the resize\n\n publicAPI.modified();\n\n if (resetCamera) {\n var isUserResetCamera = resetCamera !== true; // If resetCamera was requested, we first save camera parameters\n // from all the renderers, so we can restore them later\n\n model._screenshot.cameras = model.renderable.getRenderers().map(function (renderer) {\n var camera = renderer.getActiveCamera();\n var params = camera.get('focalPoint', 'position', 'parallelScale');\n return {\n resetCameraArgs: isUserResetCamera ? {\n renderer: renderer\n } : undefined,\n resetCameraFn: isUserResetCamera ? resetCamera : renderer.resetCamera,\n restoreParamsFn: camera.set,\n // \"clone\" the params so we don't keep refs to properties\n arg: JSON.parse(JSON.stringify(params))\n };\n }); // Perform the resetCamera() on each renderer only after capturing\n // the params from all active cameras, in case there happen to be\n // linked cameras among the renderers.\n\n model._screenshot.cameras.forEach(function (_ref6) {\n var resetCameraFn = _ref6.resetCameraFn,\n resetCameraArgs = _ref6.resetCameraArgs;\n return resetCameraFn(resetCameraArgs);\n });\n } // Trigger a render at the custom size\n\n\n publicAPI.traverseAllPasses();\n }\n });\n });\n };\n\n var hardwareMaximumLineWidth;\n\n publicAPI.getHardwareMaximumLineWidth = function () {\n // We cache the result of this function because `getParameter` is slow\n if (hardwareMaximumLineWidth != null) {\n return hardwareMaximumLineWidth;\n }\n\n var gl = publicAPI.get3DContext();\n var lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n hardwareMaximumLineWidth = lineWidthRange[1];\n return lineWidthRange[1];\n };\n\n publicAPI.getGLInformations = function () {\n var gl = publicAPI.get3DContext();\n var glTextureFloat = gl.getExtension('OES_texture_float');\n var glTextureHalfFloat = gl.getExtension('OES_texture_half_float');\n var glDebugRendererInfo = gl.getExtension('WEBGL_debug_renderer_info');\n var glDrawBuffers = gl.getExtension('WEBGL_draw_buffers');\n var glAnisotropic = gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n var params = [['Max Vertex Attributes', 'MAX_VERTEX_ATTRIBS', gl.getParameter(gl.MAX_VERTEX_ATTRIBS)], ['Max Varying Vectors', 'MAX_VARYING_VECTORS', gl.getParameter(gl.MAX_VARYING_VECTORS)], ['Max Vertex Uniform Vectors', 'MAX_VERTEX_UNIFORM_VECTORS', gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS)], ['Max Fragment Uniform Vectors', 'MAX_FRAGMENT_UNIFORM_VECTORS', gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS)], ['Max Fragment Texture Image Units', 'MAX_TEXTURE_IMAGE_UNITS', gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)], ['Max Vertex Texture Image Units', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS', gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS)], ['Max Combined Texture Image Units', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS)], ['Max 2D Texture Size', 'MAX_TEXTURE_SIZE', gl.getParameter(gl.MAX_TEXTURE_SIZE)], ['Max Cube Texture Size', 'MAX_CUBE_MAP_TEXTURE_SIZE', gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE)], ['Max Texture Anisotropy', 'MAX_TEXTURE_MAX_ANISOTROPY_EXT', glAnisotropic && gl.getParameter(glAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)], ['Point Size Range', 'ALIASED_POINT_SIZE_RANGE', gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE).join(' - ')], ['Line Width Range', 'ALIASED_LINE_WIDTH_RANGE', gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE).join(' - ')], ['Max Viewport Dimensions', 'MAX_VIEWPORT_DIMS', gl.getParameter(gl.MAX_VIEWPORT_DIMS).join(' - ')], ['Max Renderbuffer Size', 'MAX_RENDERBUFFER_SIZE', gl.getParameter(gl.MAX_RENDERBUFFER_SIZE)], ['Framebuffer Red Bits', 'RED_BITS', gl.getParameter(gl.RED_BITS)], ['Framebuffer Green Bits', 'GREEN_BITS', gl.getParameter(gl.GREEN_BITS)], ['Framebuffer Blue Bits', 'BLUE_BITS', gl.getParameter(gl.BLUE_BITS)], ['Framebuffer Alpha Bits', 'ALPHA_BITS', gl.getParameter(gl.ALPHA_BITS)], ['Framebuffer Depth Bits', 'DEPTH_BITS', gl.getParameter(gl.DEPTH_BITS)], ['Framebuffer Stencil Bits', 'STENCIL_BITS', gl.getParameter(gl.STENCIL_BITS)], ['Framebuffer Subpixel Bits', 'SUBPIXEL_BITS', gl.getParameter(gl.SUBPIXEL_BITS)], ['MSAA Samples', 'SAMPLES', gl.getParameter(gl.SAMPLES)], ['MSAA Sample Buffers', 'SAMPLE_BUFFERS', gl.getParameter(gl.SAMPLE_BUFFERS)], ['Supported Formats for UByte Render Targets ', 'UNSIGNED_BYTE RENDER TARGET FORMATS', [glTextureFloat && checkRenderTargetSupport(gl, gl.RGBA, gl.UNSIGNED_BYTE) ? 'RGBA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.RGB, gl.UNSIGNED_BYTE) ? 'RGB' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE, gl.UNSIGNED_BYTE) ? 'LUMINANCE' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.ALPHA, gl.UNSIGNED_BYTE) ? 'ALPHA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE) ? 'LUMINANCE_ALPHA' : ''].join(' ')], ['Supported Formats for Half Float Render Targets', 'HALF FLOAT RENDER TARGET FORMATS', [glTextureHalfFloat && checkRenderTargetSupport(gl, gl.RGBA, glTextureHalfFloat.HALF_FLOAT_OES) ? 'RGBA' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.RGB, glTextureHalfFloat.HALF_FLOAT_OES) ? 'RGB' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.LUMINANCE, glTextureHalfFloat.HALF_FLOAT_OES) ? 'LUMINANCE' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.ALPHA, glTextureHalfFloat.HALF_FLOAT_OES) ? 'ALPHA' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.LUMINANCE_ALPHA, glTextureHalfFloat.HALF_FLOAT_OES) ? 'LUMINANCE_ALPHA' : ''].join(' ')], ['Supported Formats for Full Float Render Targets', 'FLOAT RENDER TARGET FORMATS', [glTextureFloat && checkRenderTargetSupport(gl, gl.RGBA, gl.FLOAT) ? 'RGBA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.RGB, gl.FLOAT) ? 'RGB' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE, gl.FLOAT) ? 'LUMINANCE' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.ALPHA, gl.FLOAT) ? 'ALPHA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE_ALPHA, gl.FLOAT) ? 'LUMINANCE_ALPHA' : ''].join(' ')], ['Max Multiple Render Targets Buffers', 'MAX_DRAW_BUFFERS_WEBGL', glDrawBuffers ? gl.getParameter(glDrawBuffers.MAX_DRAW_BUFFERS_WEBGL) : 0], ['High Float Precision in Vertex Shader', 'HIGH_FLOAT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).rangeMax, ')'].join('')], ['Medium Float Precision in Vertex Shader', 'MEDIUM_FLOAT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMax, ')'].join('')], ['Low Float Precision in Vertex Shader', 'LOW_FLOAT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).rangeMax, ')'].join('')], ['High Float Precision in Fragment Shader', 'HIGH_FLOAT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).rangeMax, ')'].join('')], ['Medium Float Precision in Fragment Shader', 'MEDIUM_FLOAT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMax, ')'].join('')], ['Low Float Precision in Fragment Shader', 'LOW_FLOAT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).rangeMax, ')'].join('')], ['High Int Precision in Vertex Shader', 'HIGH_INT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).rangeMax, ')'].join('')], ['Medium Int Precision in Vertex Shader', 'MEDIUM_INT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).rangeMax, ')'].join('')], ['Low Int Precision in Vertex Shader', 'LOW_INT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).rangeMax, ')'].join('')], ['High Int Precision in Fragment Shader', 'HIGH_INT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).rangeMax, ')'].join('')], ['Medium Int Precision in Fragment Shader', 'MEDIUM_INT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).rangeMax, ')'].join('')], ['Low Int Precision in Fragment Shader', 'LOW_INT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).rangeMax, ')'].join('')], ['Supported Extensions', 'EXTENSIONS', gl.getSupportedExtensions().join('
\\t\\t\\t\\t\\t ')], ['WebGL Renderer', 'RENDERER', gl.getParameter(gl.RENDERER)], ['WebGL Vendor', 'VENDOR', gl.getParameter(gl.VENDOR)], ['WebGL Version', 'VERSION', gl.getParameter(gl.VERSION)], ['Shading Language Version', 'SHADING_LANGUAGE_VERSION', gl.getParameter(gl.SHADING_LANGUAGE_VERSION)], ['Unmasked Renderer', 'UNMASKED_RENDERER', glDebugRendererInfo && gl.getParameter(glDebugRendererInfo.UNMASKED_RENDERER_WEBGL)], ['Unmasked Vendor', 'UNMASKED_VENDOR', glDebugRendererInfo && gl.getParameter(glDebugRendererInfo.UNMASKED_VENDOR_WEBGL)], ['WebGL Version', 'WEBGL_VERSION', model.webgl2 ? 2 : 1]];\n var result = {};\n\n while (params.length) {\n var _params$pop = params.pop(),\n _params$pop2 = _slicedToArray(_params$pop, 3),\n label = _params$pop2[0],\n key = _params$pop2[1],\n value = _params$pop2[2];\n\n if (key) {\n result[key] = {\n label: label,\n value: value\n };\n }\n }\n\n return result;\n };\n\n publicAPI.traverseAllPasses = function () {\n if (model.renderPasses) {\n for (var index = 0; index < model.renderPasses.length; ++index) {\n model.renderPasses[index].traverse(publicAPI, null);\n }\n }\n\n if (model.notifyStartCaptureImage) {\n getCanvasDataURL();\n }\n };\n\n publicAPI.disableCullFace = function () {\n if (model.cullFaceEnabled) {\n model.context.disable(model.context.CULL_FACE);\n model.cullFaceEnabled = false;\n }\n };\n\n publicAPI.enableCullFace = function () {\n if (!model.cullFaceEnabled) {\n model.context.enable(model.context.CULL_FACE);\n model.cullFaceEnabled = true;\n }\n };\n\n publicAPI.setViewStream = function (stream) {\n if (model.viewStream === stream) {\n return false;\n }\n\n if (model.subscription) {\n model.subscription.unsubscribe();\n model.subscription = null;\n }\n\n model.viewStream = stream;\n\n if (model.viewStream) {\n // Force background to be transparent + render\n var mainRenderer = model.renderable.getRenderers()[0];\n mainRenderer.getBackgroundByReference()[3] = 0; // Enable display of the background image\n\n publicAPI.setUseBackgroundImage(true); // Bind to remote stream\n\n model.subscription = model.viewStream.onImageReady(function (e) {\n return publicAPI.setBackgroundImage(e.image);\n });\n model.viewStream.setSize(model.size[0], model.size[1]);\n model.viewStream.invalidateCache();\n model.viewStream.render();\n publicAPI.modified();\n }\n\n return true;\n };\n\n publicAPI.createSelector = function () {\n var ret = vtkHardwareSelector.newInstance();\n ret.setOpenGLRenderWindow(publicAPI);\n return ret;\n };\n\n function clearEvents() {\n model.canvas.removeEventListener('webglcontextlost', _preventDefault);\n model.canvas.removeEventListener('webglcontextrestored', publicAPI.restoreContext);\n }\n\n publicAPI.delete = macro.chain(clearEvents, publicAPI.delete, publicAPI.setViewStream, deleteGLContext); // Do not trigger modified for performance reasons\n\n publicAPI.setActiveFramebuffer = function (newActiveFramebuffer) {\n model.activeFramebuffer = newActiveFramebuffer;\n };\n\n var superSetSize = publicAPI.setSize;\n\n publicAPI.setSize = function (width, height) {\n var modified = superSetSize(width, height);\n\n if (modified) {\n publicAPI.invokeWindowResizeEvent({\n width: width,\n height: height\n });\n }\n\n return modified;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n cullFaceEnabled: false,\n shaderCache: null,\n initialized: false,\n context: null,\n canvas: null,\n cursorVisibility: true,\n cursor: 'pointer',\n textureUnitManager: null,\n textureResourceIds: null,\n containerSize: null,\n renderPasses: [],\n notifyStartCaptureImage: false,\n webgl2: false,\n defaultToWebgl2: true,\n // attempt webgl2 on by default\n activeFramebuffer: null,\n xrSession: null,\n xrReferenceSpace: null,\n xrSupported: true,\n imageFormat: 'image/png',\n useOffScreen: false,\n useBackgroundImage: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkRenderWindowViewNode.extend(publicAPI, model, initialValues); // Create internal instances\n\n model.canvas = document.createElement('canvas');\n model.canvas.style.width = '100%';\n createGLContext();\n\n if (!model.selector) {\n model.selector = vtkHardwareSelector.newInstance();\n model.selector.setOpenGLRenderWindow(publicAPI);\n } // Create internal bgImage\n\n\n model.bgImage = new Image();\n model.bgImage.style.position = 'absolute';\n model.bgImage.style.left = '0';\n model.bgImage.style.top = '0';\n model.bgImage.style.width = '100%';\n model.bgImage.style.height = '100%';\n model.bgImage.style.zIndex = '-1';\n model._textureResourceIds = new Map();\n model.myFactory = vtkViewNodeFactory.newInstance();\n /* eslint-disable no-use-before-define */\n\n model.myFactory.registerOverride('vtkRenderWindow', newInstance);\n /* eslint-enable no-use-before-define */\n\n model.shaderCache = vtkShaderCache.newInstance();\n model.shaderCache.setOpenGLRenderWindow(publicAPI); // setup default forward pass rendering\n\n model.renderPasses[0] = vtkForwardPass.newInstance();\n macro.event(publicAPI, model, 'imageReady');\n macro.event(publicAPI, model, 'haveVRDisplay'); // Build VTK API\n\n macro.get(publicAPI, model, ['shaderCache', 'textureUnitManager', 'webgl2', 'vrDisplay', 'useBackgroundImage', 'xrSupported', 'activeFramebuffer']);\n macro.setGet(publicAPI, model, ['initialized', 'context', 'canvas', 'renderPasses', 'notifyStartCaptureImage', 'defaultToWebgl2', 'cursor', 'useOffScreen']);\n macro.setGetArray(publicAPI, model, ['size'], 2);\n macro.event(publicAPI, model, 'windowResizeEvent'); // Object methods\n\n vtkOpenGLRenderWindow(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLRenderWindow'); // ----------------------------------------------------------------------------\n// Register API specific RenderWindow implementation\n// ----------------------------------------------------------------------------\n\nregisterViewConstructor('WebGL', newInstance); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindow = {\n newInstance: newInstance,\n extend: extend,\n pushMonitorGLContextCount: pushMonitorGLContextCount,\n popMonitorGLContextCount: popMonitorGLContextCount\n};\n\nexport { vtkRenderWindow as default, extend, newInstance, popMonitorGLContextCount, pushMonitorGLContextCount };\n","import { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet, get } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNodes(model.renderable.getTextures());\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes(); // we store textures and mapper\n\n model.ogltextures = null;\n model.activeTextures = null;\n\n for (var index = 0; index < model.children.length; index++) {\n var child = model.children[index];\n\n if (child.isA('vtkOpenGLTexture')) {\n if (!model.ogltextures) {\n model.ogltextures = [];\n }\n\n model.ogltextures.push(child);\n } else {\n model.oglmapper = child;\n }\n }\n }\n }; // render both opaque and translucent actors\n\n\n publicAPI.traverseZBufferPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // only render opaque actors\n\n\n publicAPI.traverseOpaqueZBufferPass = function (renderPass) {\n return publicAPI.traverseOpaquePass(renderPass);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.activateTextures = function () {\n // always traverse textures first, then mapper\n if (!model.ogltextures) {\n return;\n }\n\n model.activeTextures = [];\n\n for (var index = 0; index < model.ogltextures.length; index++) {\n var child = model.ogltextures[index];\n child.render();\n\n if (child.getHandle()) {\n model.activeTextures.push(child);\n }\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.zBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n };\n\n publicAPI.opaqueZBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(false);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n };\n\n publicAPI.getKeyMatrices = function () {\n // has the actor changed?\n if (model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n model.renderable.computeMatrix();\n mat4.copy(model.keyMatrices.mcwc, model.renderable.getMatrix());\n mat4.transpose(model.keyMatrices.mcwc, model.keyMatrices.mcwc);\n\n if (model.renderable.getIsIdentity()) {\n mat3.identity(model.keyMatrices.normalMatrix);\n } else {\n mat3.fromMat4(model.keyMatrices.normalMatrix, model.keyMatrices.mcwc);\n mat3.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat3.transpose(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n }\n\n model.keyMatrixTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n keyMatrixTime: null,\n keyMatrices: null,\n activeTextures: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: mat3.identity(new Float64Array(9)),\n mcwc: mat4.identity(new Float64Array(16))\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context']);\n get(publicAPI, model, ['activeTextures']); // Object methods\n\n vtkOpenGLActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkActor = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkActor', newInstance);\n\nexport { vtkActor as default, extend, newInstance };\n","import { newInstance as newInstance$1, setGet, get } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLActor2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLActor2D'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNodes(model.renderable.getTextures());\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes(); // we store textures and mapper\n\n model.ogltextures = null;\n model.activeTextures = null;\n\n for (var index = 0; index < model.children.length; index++) {\n var child = model.children[index];\n\n if (child.isA('vtkOpenGLTexture')) {\n if (!model.ogltextures) {\n model.ogltextures = [];\n }\n\n model.ogltextures.push(child);\n } else {\n model.oglmapper = child;\n }\n }\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n renderPass.incrementOverlayActorCount();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.oglmapper || !model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.oglmapper || !model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.traverseOverlayPass = function (renderPass) {\n if (!model.oglmapper || !model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.activateTextures = function () {\n // always traverse textures first, then mapper\n if (!model.ogltextures) {\n return;\n }\n\n model.activeTextures = [];\n\n for (var index = 0; index < model.ogltextures.length; index++) {\n var child = model.ogltextures[index];\n child.render();\n\n if (child.getHandle()) {\n model.activeTextures.push(child);\n }\n }\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n // deactivate textures\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(false);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n }; // Renders myself\n\n\n publicAPI.overlayPass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n // deactivate textures\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n activeTextures: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Build VTK API\n\n setGet(publicAPI, model, ['context']);\n get(publicAPI, model, ['activeTextures']); // Object methods\n\n vtkOpenGLActor2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkActor2D = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkActor2D', newInstance);\n\nexport { vtkActor2D as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport { mat3, mat4, vec3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, setGet, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkHelper from './Helper.js';\nimport vtkMapper from '../Core/Mapper.js';\nimport { l as normalize, u as uninitializeBounds } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { v as vtkPolyDataVS } from './glsl/vtkPolyDataVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport { registerOverride } from './ViewNodeFactory.js';\nimport { PassTypes } from './HardwareSelector/Constants.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar FieldAssociations = vtkDataSet.FieldAssociations;\n/* eslint-disable no-lonely-if */\n\nvar primTypes = vtkHelper.primTypes;\nvar Representation = vtkProperty.Representation,\n Shading = vtkProperty.Shading;\nvar ScalarMode = vtkMapper.ScalarMode;\nvar Filter = vtkOpenGLTexture.Filter,\n Wrap = vtkOpenGLTexture.Wrap;\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar StartEvent = {\n type: 'StartEvent'\n};\nvar EndEvent = {\n type: 'EndEvent'\n};\nvar CoordinateSystem = vtkProp.CoordinateSystem; // ----------------------------------------------------------------------------\n// vtkOpenGLPolyDataMapper methods\n// ----------------------------------------------------------------------------\n\nfunction getPickState(renderer) {\n var selector = renderer.getSelector();\n\n if (selector) {\n return selector.getCurrentPass();\n }\n\n return PassTypes.MIN_KNOWN_PASS - 1;\n}\n\nfunction vtkOpenGLPolyDataMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLPolyDataMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.currentRenderPass = null;\n model.openGLActor = publicAPI.getFirstAncestorOfType('vtkOpenGLActor');\n model._openGLRenderer = model.openGLActor.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(model._openGLRenderer.getRenderable().getActiveCamera());\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.currentRenderPass = renderPass;\n publicAPI.render();\n }\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n model.haveSeenDepthRequest = true;\n model.renderDepth = true;\n publicAPI.render();\n model.renderDepth = false;\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.render = function () {\n var ctx = model._openGLRenderWindow.getContext();\n\n if (model.context !== ctx) {\n model.context = ctx;\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i].setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n }\n\n var actor = model.openGLActor.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkPolyDataVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderColor = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity'); // create the material/color property declarations, and VS implementation\n // these are always defined\n\n var colorDec = ['uniform float ambient;', 'uniform float diffuse;', 'uniform float specular;', 'uniform float opacityUniform; // the fragment opacity', 'uniform vec3 ambientColorUniform;', 'uniform vec3 diffuseColorUniform;']; // add more for specular\n\n if (lastLightComplexity) {\n colorDec = colorDec.concat(['uniform vec3 specularColorUniform;', 'uniform float specularPowerUniform;']);\n } // now handle the more complex fragment shader implementation\n // the following are always defined variables. We start\n // by assigning a default value from the uniform\n\n\n var colorImpl = ['vec3 ambientColor;', ' vec3 diffuseColor;', ' float opacity;'];\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' vec3 specularColor;', ' float specularPower;']);\n }\n\n colorImpl = colorImpl.concat([' ambientColor = ambientColorUniform;', ' diffuseColor = diffuseColorUniform;', ' opacity = opacityUniform;']);\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' specularColor = specularColorUniform;', ' specularPower = specularPowerUniform;']);\n } // add scalar vertex coloring\n\n\n if (model.lastBoundBO.getCABO().getColorComponents() !== 0 && !model.drawingEdges) {\n colorDec = colorDec.concat(['varying vec4 vertexColorVSOutput;']);\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Dec', ['attribute vec4 scalarColor;', 'varying vec4 vertexColorVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Impl', ['vertexColorVSOutput = scalarColor;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Dec', ['in vec4 vertexColorVSOutput[];', 'out vec4 vertexColorGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Impl', ['vertexColorGSOutput = vertexColorVSOutput[i];']).result;\n }\n\n if (model.lastBoundBO.getCABO().getColorComponents() !== 0 && !model.drawingEdges) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl.concat([' diffuseColor = vertexColorVSOutput.rgb;', ' ambientColor = vertexColorVSOutput.rgb;', ' opacity = opacity*vertexColorVSOutput.a;'])).result;\n } else {\n if (model.renderable.getInterpolateScalarsBeforeMapping() && model.renderable.getColorCoordinates() && !model.drawingEdges) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl.concat([' vec4 texColor = texture2D(texture1, tcoordVCVSOutput.st);', ' diffuseColor = texColor.rgb;', ' ambientColor = texColor.rgb;', ' opacity = opacity*texColor.a;'])).result;\n } else {\n if (actor.getBackfaceProperty() && !model.drawingEdges) {\n colorDec = colorDec.concat(['uniform float opacityUniformBF; // the fragment opacity', 'uniform float ambientIntensityBF; // the material ambient', 'uniform float diffuseIntensityBF; // the material diffuse', 'uniform vec3 ambientColorUniformBF; // ambient material color', 'uniform vec3 diffuseColorUniformBF; // diffuse material color']);\n\n if (lastLightComplexity) {\n colorDec = colorDec.concat(['uniform float specularIntensityBF; // the material specular intensity', 'uniform vec3 specularColorUniformBF; // intensity weighted color', 'uniform float specularPowerUniformBF;']);\n colorImpl = colorImpl.concat(['if (gl_FrontFacing == false) {', ' ambientColor = ambientIntensityBF * ambientColorUniformBF;', ' diffuseColor = diffuseIntensityBF * diffuseColorUniformBF;', ' specularColor = specularIntensityBF * specularColorUniformBF;', ' specularPower = specularPowerUniformBF;', ' opacity = opacityUniformBF; }']);\n } else {\n colorImpl = colorImpl.concat(['if (gl_FrontFacing == false) {', ' ambientColor = ambientIntensityBF * ambientColorUniformBF;', ' diffuseColor = diffuseIntensityBF * diffuseColorUniformBF;', ' opacity = opacityUniformBF; }']);\n }\n }\n\n if (model.haveCellScalars && !model.drawingEdges) {\n colorDec = colorDec.concat(['uniform samplerBuffer texture1;']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl).result;\n }\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', colorDec).result;\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderLight = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment; // check for shadow maps\n\n var shadowFactor = '';\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n var lastLightCount = model.lastBoundBO.getReferenceByName('lastLightCount');\n var sstring = [];\n\n switch (lastLightComplexity) {\n case 0:\n // no lighting or RENDER_VALUES\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', [' gl_FragData[0] = vec4(ambientColor * ambient + diffuseColor * diffuse, opacity);', ' //VTK::Light::Impl'], false).result;\n break;\n\n case 1:\n // headlight\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', [' float df = max(0.0, normalVCVSOutput.z);', ' float sf = pow(df, specularPower);', ' vec3 diffuseL = df * diffuseColor;', ' vec3 specularL = sf * specularColor;', ' gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);', ' //VTK::Light::Impl'], false).result;\n break;\n\n case 2:\n // light kit\n for (var lc = 0; lc < lastLightCount; ++lc) {\n sstring = sstring.concat([\"uniform vec3 lightColor\".concat(lc, \";\"), \"uniform vec3 lightDirectionVC\".concat(lc, \"; // normalized\"), \"uniform vec3 lightHalfAngleVC\".concat(lc, \"; // normalized\")]);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', sstring).result;\n sstring = ['vec3 diffuseL = vec3(0,0,0);', ' vec3 specularL = vec3(0,0,0);', ' float df;'];\n\n for (var _lc = 0; _lc < lastLightCount; ++_lc) {\n sstring = sstring.concat([\" df = max(0.0, dot(normalVCVSOutput, -lightDirectionVC\".concat(_lc, \"));\"), \" diffuseL += ((df\".concat(shadowFactor, \") * lightColor\").concat(_lc, \");\"), \" if (dot(normalVCVSOutput, lightDirectionVC\".concat(_lc, \") < 0.0)\"), ' {', \" float sf = pow( max(0.0, dot(lightHalfAngleVC\".concat(_lc, \",normalVCVSOutput)), specularPower);\"), \" specularL += ((sf\".concat(shadowFactor, \") * lightColor\").concat(_lc, \");\"), ' }']);\n }\n\n sstring = sstring.concat([' diffuseL = diffuseL * diffuseColor;', ' specularL = specularL * specularColor;', ' gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);', ' //VTK::Light::Impl']);\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', sstring, false).result;\n break;\n\n case 3:\n // positional\n for (var _lc2 = 0; _lc2 < lastLightCount; ++_lc2) {\n sstring = sstring.concat([\"uniform vec3 lightColor\".concat(_lc2, \";\"), \"uniform vec3 lightDirectionVC\".concat(_lc2, \"; // normalized\"), \"uniform vec3 lightHalfAngleVC\".concat(_lc2, \"; // normalized\"), \"uniform vec3 lightPositionVC\".concat(_lc2, \";\"), \"uniform vec3 lightAttenuation\".concat(_lc2, \";\"), \"uniform float lightConeAngle\".concat(_lc2, \";\"), \"uniform float lightExponent\".concat(_lc2, \";\"), \"uniform int lightPositional\".concat(_lc2, \";\")]);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', sstring).result;\n sstring = ['vec3 diffuseL = vec3(0,0,0);', ' vec3 specularL = vec3(0,0,0);', ' vec3 vertLightDirectionVC;', ' float attenuation;', ' float df;'];\n\n for (var _lc3 = 0; _lc3 < lastLightCount; ++_lc3) {\n sstring = sstring.concat([' attenuation = 1.0;', \" if (lightPositional\".concat(_lc3, \" == 0)\"), ' {', \" vertLightDirectionVC = lightDirectionVC\".concat(_lc3, \";\"), ' }', ' else', ' {', \" vertLightDirectionVC = vertexVC.xyz - lightPositionVC\".concat(_lc3, \";\"), ' float distanceVC = length(vertLightDirectionVC);', ' vertLightDirectionVC = normalize(vertLightDirectionVC);', ' attenuation = 1.0 /', \" (lightAttenuation\".concat(_lc3, \".x\"), \" + lightAttenuation\".concat(_lc3, \".y * distanceVC\"), \" + lightAttenuation\".concat(_lc3, \".z * distanceVC * distanceVC);\"), ' // per OpenGL standard cone angle is 90 or less for a spot light', \" if (lightConeAngle\".concat(_lc3, \" <= 90.0)\"), ' {', \" float coneDot = dot(vertLightDirectionVC, lightDirectionVC\".concat(_lc3, \");\"), ' // if inside the cone', \" if (coneDot >= cos(radians(lightConeAngle\".concat(_lc3, \")))\"), ' {', \" attenuation = attenuation * pow(coneDot, lightExponent\".concat(_lc3, \");\"), ' }', ' else', ' {', ' attenuation = 0.0;', ' }', ' }', ' }', ' df = max(0.0, attenuation*dot(normalVCVSOutput, -vertLightDirectionVC));', \" diffuseL += ((df\".concat(shadowFactor, \") * lightColor\").concat(_lc3, \");\"), ' if (dot(normalVCVSOutput, vertLightDirectionVC) < 0.0)', ' {', \" float sf = attenuation*pow( max(0.0, dot(lightHalfAngleVC\".concat(_lc3, \",normalVCVSOutput)), specularPower);\"), \" specularL += ((sf\".concat(shadowFactor, \") * lightColor\").concat(_lc3, \");\"), ' }']);\n }\n\n sstring = sstring.concat([' diffuseL = diffuseL * diffuseColor;', ' specularL = specularL * specularColor;', ' gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);', ' //VTK::Light::Impl']);\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', sstring, false).result;\n break;\n\n default:\n vtkErrorMacro('bad light complexity');\n }\n\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderNormal = function (shaders, ren, actor) {\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n\n if (model.lastBoundBO.getCABO().getNormalOffset()) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Dec', ['attribute vec3 normalMC;', 'uniform mat3 normalMatrix;', 'varying vec3 normalVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Impl', ['normalVCVSOutput = normalMatrix * normalMC;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Normal::Dec', ['in vec3 normalVCVSOutput[];', 'out vec3 normalVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Normal::Impl', ['normalVCGSOutput = normalVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', ['varying vec3 normalVCVSOutput;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', ['vec3 normalVCVSOutput = normalize(normalVCVSOutput);', // if (!gl_FrontFacing) does not work in intel hd4000 mac\n // if (int(gl_FrontFacing) == 0) does not work on mesa\n ' if (gl_FrontFacing == false) { normalVCVSOutput = -normalVCVSOutput; }']).result;\n } else {\n if (model.haveCellNormals) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', ['uniform mat3 normalMatrix;', 'uniform samplerBuffer textureN;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', ['vec3 normalVCVSOutput = normalize(normalMatrix *', ' texelFetchBuffer(textureN, gl_PrimitiveID + PrimitiveIDOffset).xyz);', ' if (gl_FrontFacing == false) { normalVCVSOutput = -normalVCVSOutput; }']).result;\n } else {\n if (model.lastBoundBO.getOpenGLMode(actor.getProperty().getRepresentation()) === model.context.LINES) {\n // generate a normal for lines, it will be perpendicular to the line\n // and maximally aligned with the camera view direction\n // no clue if this is the best way to do this.\n // the code below has been optimized a bit so what follows is\n // an explanation of the basic approach. Compute the gradient of the line\n // with respect to x and y, the the larger of the two\n // cross that with the camera view direction. That gives a vector\n // orthogonal to the camera view and the line. Note that the line and the camera\n // view are probably not orthogonal. Which is why when we cross result that with\n // the line gradient again we get a reasonable normal. It will be othogonal to\n // the line (which is a plane but maximally aligned with the camera view.\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', [' vec3 fdx = dFdx(vertexVC.xyz);', ' vec3 fdy = dFdy(vertexVC.xyz);', ' //VTK::UniformFlow::Impl'] // For further replacements\n ).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', ['vec3 normalVCVSOutput;', ' if (abs(fdx.x) > 0.0)', ' { fdx = normalize(fdx); normalVCVSOutput = normalize(cross(vec3(fdx.y, -fdx.x, 0.0), fdx)); }', ' else { fdy = normalize(fdy); normalVCVSOutput = normalize(cross(vec3(fdy.y, -fdy.x, 0.0), fdy));}']).result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', ['uniform int cameraParallel;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', [// ' vec3 fdx = vec3(dFdx(vertexVC.x),dFdx(vertexVC.y),dFdx(vertexVC.z));',\n // ' vec3 fdy = vec3(dFdy(vertexVC.x),dFdy(vertexVC.y),dFdy(vertexVC.z));',\n ' vec3 fdx = dFdx(vertexVC.xyz);', ' vec3 fdy = dFdy(vertexVC.xyz);', ' //VTK::UniformFlow::Impl'] // For further replacements\n ).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', [' fdx = normalize(fdx);', ' fdy = normalize(fdy);', ' vec3 normalVCVSOutput = normalize(cross(fdx,fdy));', // the code below is faster, but does not work on some devices\n // 'vec3 normalVC = normalize(cross(dFdx(vertexVC.xyz), dFdy(vertexVC.xyz)));',\n ' if (cameraParallel == 1 && normalVCVSOutput.z < 0.0) { normalVCVSOutput = -1.0*normalVCVSOutput; }', ' if (cameraParallel == 0 && dot(normalVCVSOutput,vertexVC.xyz) > 0.0) { normalVCVSOutput = -1.0*normalVCVSOutput; }']).result;\n }\n }\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n // replace common shader code\n model.lastBoundBO.replaceShaderPositionVC(shaders, ren, actor);\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment; // do we need the vertex in the shader in View Coordinates\n\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', ['varying vec4 vertexVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['vertexVCVSOutput = MCVCMatrix * vertexMC;', ' gl_Position = MCPCMatrix * vertexMC;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;', 'uniform mat4 MCVCMatrix;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::PositionVC::Dec', ['in vec4 vertexVCVSOutput[];', 'out vec4 vertexVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::PositionVC::Impl', ['vertexVCGSOutput = vertexVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', ['varying vec4 vertexVCVSOutput;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Impl', ['vec4 vertexVC = vertexVCVSOutput;']).result;\n } else {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', [' gl_Position = MCPCMatrix * vertexMC;']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderTCoord = function (shaders, ren, actor) {\n if (model.lastBoundBO.getCABO().getTCoordOffset()) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n\n if (model.drawingEdges) {\n return;\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', 'tcoordVCVSOutput = tcoordMC;').result; // we only handle the first texture by default\n // additional textures are activated and we set the uniform\n // for the texture unit they are assigned to, but you have to\n // add in the shader code to do something with them\n\n var tus = model.openGLActor.getActiveTextures();\n var tNumComp = 2;\n var tcdim = 2;\n\n if (tus && tus.length > 0) {\n tNumComp = tus[0].getComponents();\n\n if (tus[0].getTarget() === model.context.TEXTURE_CUBE_MAP) {\n tcdim = 3;\n }\n }\n\n if (model.renderable.getColorTextureMap()) {\n tNumComp = model.renderable.getColorTextureMap().getPointData().getScalars().getNumberOfComponents();\n tcdim = 2;\n }\n\n if (tcdim === 2) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', 'attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;').result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordVCVSOutput[];', 'out vec2 tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Impl', 'tcoordVCGSOutput = tcoordVCVSOutput[i];').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['varying vec2 tcoordVCVSOutput;', 'uniform sampler2D texture1;']).result;\n\n if (tus && tus.length >= 1) {\n switch (tNumComp) {\n case 1:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;']).result;\n break;\n\n case 2:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;', ' opacity = opacity * tcolor.g;']).result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.rgb;', ' diffuseColor = diffuseColor*tcolor.rgb;', ' opacity = opacity * tcolor.a;']).result;\n }\n }\n } else {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', 'attribute vec3 tcoordMC; varying vec3 tcoordVCVSOutput;').result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in vec3 tcoordVCVSOutput[];', 'out vec3 tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Impl', 'tcoordVCGSOutput = tcoordVCVSOutput[i];').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['varying vec3 tcoordVCVSOutput;', 'uniform samplerCube texture1;']).result;\n\n switch (tNumComp) {\n case 1:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;']).result;\n break;\n\n case 2:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;', ' opacity = opacity * tcolor.g;']).result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.rgb;', ' diffuseColor = diffuseColor*tcolor.rgb;', ' opacity = opacity * tcolor.a;']).result;\n }\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.replaceShaderClip = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', \"uniform vec4 clipPlanes[\".concat(numClipPlanes, \"];\"), \"varying float clipDistancesVSOutput[\".concat(numClipPlanes, \"];\")]).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Impl', [\"for (int planeNum = 0; planeNum < \".concat(numClipPlanes, \"; planeNum++)\"), ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' clipDistancesVSOutput[planeNum] = dot(clipPlanes[planeNum], vertexMC);', ' }']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', \"varying float clipDistancesVSOutput[\".concat(numClipPlanes, \"];\")]).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Impl', [\"for (int planeNum = 0; planeNum < \".concat(numClipPlanes, \"; planeNum++)\"), ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' if (clipDistancesVSOutput[planeNum] < 0.0) discard;', ' }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.getCoincidentParameters = function (ren, actor) {\n // 1. ResolveCoincidentTopology is On and non zero for this primitive\n // type\n var cp = {\n factor: 0.0,\n offset: 0.0\n };\n var prop = actor.getProperty();\n\n if (model.renderable.getResolveCoincidentTopology() || prop.getEdgeVisibility() && prop.getRepresentation() === Representation.SURFACE) {\n var primType = model.lastBoundBO.getPrimitiveType();\n\n if (primType === primTypes.Points || prop.getRepresentation() === Representation.POINTS) {\n cp = model.renderable.getCoincidentTopologyPointOffsetParameter();\n } else if (primType === primTypes.Lines || prop.getRepresentation() === Representation.WIREFRAME) {\n cp = model.renderable.getCoincidentTopologyLineOffsetParameters();\n } else if (primType === primTypes.Tris || primType === primTypes.TriStrips) {\n cp = model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n }\n\n if (primType === primTypes.TrisEdges || primType === primTypes.TriStripsEdges) {\n cp = model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n cp.factor /= 2.0;\n cp.offset /= 2.0;\n }\n } // hardware picking always offset due to saved zbuffer\n // This gets you above the saved surface depth buffer.\n\n\n var selector = model._openGLRenderer.getSelector();\n\n if (selector && selector.getFieldAssociation() === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n cp.offset -= 2.0;\n }\n\n return cp;\n };\n\n publicAPI.replaceShaderPicking = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment;\n var VSSource = shaders.Vertex;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', ['uniform int picking;', '//VTK::Picking::Dec']).result;\n\n if (!model._openGLRenderer.getSelector()) {\n return;\n }\n\n if (model.lastSelectionState === PassTypes.ID_LOW24 || model.lastSelectionState === PassTypes.ID_HIGH24) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Dec', ['flat out int vertexIDVSOutput;\\n', 'uniform int VertexIDOffset;\\n']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Impl', ' vertexIDVSOutput = gl_VertexID + VertexIDOffset;\\n').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', 'flat in int vertexIDVSOutput;\\n').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', [' int idx = vertexIDVSOutput;', '//VTK::Picking::Impl']).result;\n }\n\n switch (model.lastSelectionState) {\n case PassTypes.ID_LOW24:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = vec4(float(idx%256)/255.0, float((idx/256)%256)/255.0, float((idx/65536)%256)/255.0, 1.0);').result;\n break;\n\n case PassTypes.ID_HIGH24:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = vec4(float(idx)/255.0, 0.0, 0.0, 1.0);').result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', 'uniform vec3 mapperIndex;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = picking != 0 ? vec4(mapperIndex,1.0) : gl_FragData[0];').result;\n }\n\n shaders.Fragment = FSSource;\n shaders.Vertex = VSSource;\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n publicAPI.replaceShaderColor(shaders, ren, actor);\n publicAPI.replaceShaderNormal(shaders, ren, actor);\n publicAPI.replaceShaderLight(shaders, ren, actor);\n publicAPI.replaceShaderTCoord(shaders, ren, actor);\n publicAPI.replaceShaderPicking(shaders, ren, actor);\n publicAPI.replaceShaderClip(shaders, ren, actor);\n publicAPI.replaceShaderCoincidentOffset(shaders, ren, actor);\n publicAPI.replaceShaderPositionVC(shaders, ren, actor);\n\n if (model.haveSeenDepthRequest) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', 'uniform int depthRequest;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float iz = floor(gl_FragCoord.z*65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n var lightComplexity = 0;\n var numberOfLights = 0;\n var primType = cellBO.getPrimitiveType();\n var poly = model.currentInput; // different algo from C++ as of 5/2019\n\n var needLighting = false;\n var pointNormals = poly.getPointData().getNormals();\n var cellNormals = poly.getCellData().getNormals();\n var flat = actor.getProperty().getInterpolation() === Shading.FLAT;\n var representation = actor.getProperty().getRepresentation();\n var mode = cellBO.getOpenGLMode(representation, primType); // 1) all surfaces need lighting\n\n if (mode === model.context.TRIANGLES) {\n needLighting = true; // 2) all cell normals without point normals need lighting\n } else if (cellNormals && !pointNormals) {\n needLighting = true; // 3) Phong + pointNormals need lighting\n } else if (!flat && pointNormals) {\n needLighting = true; // 4) Phong Lines need lighting\n } else if (!flat && mode === model.context.LINES) {\n needLighting = true;\n } // 5) everything else is unlit\n // do we need lighting?\n\n\n if (actor.getProperty().getLighting() && needLighting) {\n // consider the lighting complexity to determine which case applies\n // simple headlight, Light Kit, the whole feature set of VTK\n lightComplexity = 0;\n var lights = ren.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n var light = lights[index];\n var status = light.getSwitch();\n\n if (status > 0) {\n numberOfLights++;\n\n if (lightComplexity === 0) {\n lightComplexity = 1;\n }\n }\n\n if (lightComplexity === 1 && (numberOfLights > 1 || light.getIntensity() !== 1.0 || !light.lightTypeIsHeadLight())) {\n lightComplexity = 2;\n }\n\n if (lightComplexity < 3 && light.getPositional()) {\n lightComplexity = 3;\n }\n }\n }\n\n var needRebuild = false;\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n var lastLightCount = model.lastBoundBO.getReferenceByName('lastLightCount');\n\n if (lastLightComplexity !== lightComplexity || lastLightCount !== numberOfLights) {\n model.lastBoundBO.set({\n lastLightComplexity: lightComplexity\n }, true);\n model.lastBoundBO.set({\n lastLightCount: numberOfLights\n }, true);\n needRebuild = true;\n } // has the render pass shader replacement changed? Two options\n\n\n if (!model.currentRenderPass && model.lastRenderPassShaderReplacement || model.currentRenderPass && model.currentRenderPass.getShaderReplacement() !== model.lastRenderPassShaderReplacement) {\n needRebuild = true;\n } // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n // render pass shader replacement changed\n\n\n if (model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.currentInput.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.selectionStateChanged.getMTime() || needRebuild) {\n model.lastHaveSeenDepthRequest = model.haveSeenDepthRequest;\n return true;\n }\n\n return false;\n };\n\n publicAPI.invokeShaderCallbacks = function (cellBO, ren, actor) {\n var listCallbacks = model.renderable.getViewSpecificProperties().ShadersCallbacks;\n\n if (listCallbacks) {\n listCallbacks.forEach(function (object) {\n object.callback(object.userData, cellBO, ren, actor);\n });\n }\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n if (cellBO.getProgram().isUniformUsed('PrimitiveIDOffset')) {\n cellBO.getProgram().setUniformi('PrimitiveIDOffset', model.primitiveIDOffset);\n }\n\n if (cellBO.getProgram().isUniformUsed('VertexIDOffset')) {\n cellBO.getProgram().setUniformi('VertexIDOffset', model.vertexIDOffset);\n }\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (cellBO.getProgram().isAttributeUsed('vertexMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'vertexMC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro('Error setting vertexMC in shader VAO.');\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('normalMC') && cellBO.getCABO().getNormalOffset() && lastLightComplexity > 0) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'normalMC', cellBO.getCABO().getNormalOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro('Error setting normalMC in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('normalMC');\n }\n\n model.renderable.getCustomShaderAttributes().forEach(function (attrName, idx) {\n if (cellBO.getProgram().isAttributeUsed(\"\".concat(attrName, \"MC\"))) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), \"\".concat(attrName, \"MC\"), cellBO.getCABO().getCustomData()[idx].offset, cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getCustomData()[idx].components, false)) {\n vtkErrorMacro(\"Error setting \".concat(attrName, \"MC in shader VAO.\"));\n }\n }\n });\n\n if (cellBO.getProgram().isAttributeUsed('tcoordMC') && cellBO.getCABO().getTCoordOffset()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'tcoordMC', cellBO.getCABO().getTCoordOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getTCoordComponents(), false)) {\n vtkErrorMacro('Error setting tcoordMC in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('tcoordMC');\n }\n\n if (cellBO.getProgram().isAttributeUsed('scalarColor') && cellBO.getCABO().getColorComponents()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO().getColorBO(), 'scalarColor', cellBO.getCABO().getColorOffset(), cellBO.getCABO().getColorBOStride(), model.context.UNSIGNED_BYTE, 4, true)) {\n vtkErrorMacro('Error setting scalarColor in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('scalarColor');\n }\n\n cellBO.getAttributeUpdateTime().modified();\n }\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n // add all the clipping planes\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n var planeEquations = [];\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var mat = inverseShiftScaleMatrix ? mat4.copy(model.tmpMat4, actor.getMatrix()) : actor.getMatrix();\n\n if (inverseShiftScaleMatrix) {\n mat4.transpose(mat, mat);\n mat4.multiply(mat, mat, inverseShiftScaleMatrix);\n mat4.transpose(mat, mat);\n }\n\n for (var i = 0; i < numClipPlanes; i++) {\n var planeEquation = [];\n model.renderable.getClippingPlaneInDataCoords(mat, i, planeEquation);\n\n for (var j = 0; j < 4; j++) {\n planeEquations.push(planeEquation[j]);\n }\n }\n\n cellBO.getProgram().setUniformi('numClipPlanes', numClipPlanes);\n cellBO.getProgram().setUniform4fv('clipPlanes', planeEquations);\n }\n\n if (model.internalColorTexture && cellBO.getProgram().isUniformUsed('texture1')) {\n cellBO.getProgram().setUniformi('texture1', model.internalColorTexture.getTextureUnit());\n }\n\n var tus = model.openGLActor.getActiveTextures();\n\n if (tus) {\n for (var index = 0; index < tus.length; ++index) {\n var tex = tus[index];\n var texUnit = tex.getTextureUnit();\n var tname = \"texture\".concat(texUnit + 1);\n\n if (cellBO.getProgram().isUniformUsed(tname)) {\n cellBO.getProgram().setUniformi(tname, texUnit);\n }\n }\n } // handle depth requests\n\n\n if (model.haveSeenDepthRequest) {\n cellBO.getProgram().setUniformi('depthRequest', model.renderDepth ? 1 : 0);\n } // handle coincident\n\n\n if (cellBO.getProgram().isUniformUsed('coffset')) {\n var cp = publicAPI.getCoincidentParameters(ren, actor);\n cellBO.getProgram().setUniformf('coffset', cp.offset); // cfactor isn't always used when coffset is.\n\n if (cellBO.getProgram().isUniformUsed('cfactor')) {\n cellBO.getProgram().setUniformf('cfactor', cp.factor);\n }\n } // handle wide lines\n\n\n cellBO.setMapperShaderParameters(ren, actor, model._openGLRenderer.getTiledSizeAndOrigin());\n\n var selector = model._openGLRenderer.getSelector();\n\n cellBO.getProgram().setUniform3fArray('mapperIndex', selector ? selector.getPropColorValue() : [0.0, 0.0, 0.0]);\n cellBO.getProgram().setUniformi('picking', selector ? selector.getCurrentPass() + 1 : 0);\n };\n\n publicAPI.setLightingShaderParameters = function (cellBO, ren, actor) {\n // for unlit and headlight there are no lighting parameters\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity < 2) {\n return;\n }\n\n var program = cellBO.getProgram(); // bind some light settings\n\n var numberOfLights = 0;\n var lights = ren.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n var light = lights[index];\n var status = light.getSwitch();\n\n if (status > 0.0) {\n var dColor = light.getColorByReference();\n var intensity = light.getIntensity();\n model.lightColor[0] = dColor[0] * intensity;\n model.lightColor[1] = dColor[1] * intensity;\n model.lightColor[2] = dColor[2] * intensity; // get required info from light\n\n var ld = light.getDirection();\n var transform = ren.getActiveCamera().getViewMatrix();\n\n var newLightDirection = _toConsumableArray(ld);\n\n if (light.lightTypeIsSceneLight()) {\n newLightDirection[0] = transform[0] * ld[0] + transform[1] * ld[1] + transform[2] * ld[2];\n newLightDirection[1] = transform[4] * ld[0] + transform[5] * ld[1] + transform[6] * ld[2];\n newLightDirection[2] = transform[8] * ld[0] + transform[9] * ld[1] + transform[10] * ld[2];\n normalize(newLightDirection);\n }\n\n model.lightDirection[0] = newLightDirection[0];\n model.lightDirection[1] = newLightDirection[1];\n model.lightDirection[2] = newLightDirection[2];\n model.lightHalfAngle[0] = -model.lightDirection[0];\n model.lightHalfAngle[1] = -model.lightDirection[1];\n model.lightHalfAngle[2] = -model.lightDirection[2] + 1.0;\n normalize(model.lightDirection);\n program.setUniform3fArray(\"lightColor\".concat(numberOfLights), model.lightColor);\n program.setUniform3fArray(\"lightDirectionVC\".concat(numberOfLights), model.lightDirection);\n program.setUniform3fArray(\"lightHalfAngleVC\".concat(numberOfLights), model.lightHalfAngle);\n numberOfLights++;\n }\n } // we are done unless we have positional lights\n\n\n if (lastLightComplexity < 3) {\n return;\n } // for lightkit case there are some parameters to set\n\n\n var cam = ren.getActiveCamera();\n var viewTF = cam.getViewMatrix();\n mat4.transpose(viewTF, viewTF);\n numberOfLights = 0;\n\n for (var _index = 0; _index < lights.length; ++_index) {\n var _light = lights[_index];\n\n var _status = _light.getSwitch();\n\n if (_status > 0.0) {\n var lp = _light.getTransformedPosition();\n\n var np = new Float64Array(3);\n vec3.transformMat4(np, lp, viewTF);\n program.setUniform3fArray(\"lightAttenuation\".concat(numberOfLights), _light.getAttenuationValuesByReference());\n program.setUniformi(\"lightPositional\".concat(numberOfLights), _light.getPositional());\n program.setUniformf(\"lightExponent\".concat(numberOfLights), _light.getExponent());\n program.setUniformf(\"lightConeAngle\".concat(numberOfLights), _light.getConeAngle());\n program.setUniform3fArray(\"lightPositionVC\".concat(numberOfLights), [np[0], np[1], np[2]]);\n numberOfLights++;\n }\n }\n };\n\n function safeMatrixMultiply(matrixArray, matrixType, tmpMat) {\n matrixType.identity(tmpMat);\n return matrixArray.reduce(function (res, matrix, index) {\n if (index === 0) {\n return matrix ? matrixType.copy(res, matrix) : matrixType.identity(res);\n }\n\n return matrix ? matrixType.multiply(res, res, matrix) : res;\n }, tmpMat);\n }\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram(); // [WMVP]C == {world, model, view, projection} coordinates\n // E.g., WCPC == world to projection coordinate transformation\n\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var cam = ren.getActiveCamera();\n var camm = model.openGLCamera.getKeyMatrixTime().getMTime();\n var progm = program.getLastCameraMTime();\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var actorIsIdentity = actor.getIsIdentity();\n var actMats = actorIsIdentity ? {\n mcwc: null,\n normalMatrix: null\n } : model.openGLActor.getKeyMatrices();\n\n if (actor.getCoordinateSystem() === CoordinateSystem.DISPLAY) {\n var size = model._openGLRenderer.getTiledSizeAndOrigin();\n\n mat4.identity(model.tmpMat4);\n model.tmpMat4[0] = 2.0 / size.usize;\n model.tmpMat4[12] = -1.0;\n model.tmpMat4[5] = 2.0 / size.vsize;\n model.tmpMat4[13] = -1.0;\n mat4.multiply(model.tmpMat4, model.tmpMat4, inverseShiftScaleMatrix);\n program.setUniformMatrix('MCPCMatrix', model.tmpMat4);\n } else {\n program.setUniformMatrix('MCPCMatrix', safeMatrixMultiply([keyMats.wcpc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n\n if (program.isUniformUsed('MCVCMatrix')) {\n program.setUniformMatrix('MCVCMatrix', safeMatrixMultiply([keyMats.wcvc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n\n if (program.isUniformUsed('normalMatrix')) {\n program.setUniformMatrix3x3('normalMatrix', safeMatrixMultiply([keyMats.normalMatrix, actMats.normalMatrix], mat3, model.tmpMat3));\n }\n\n if (progm !== camm) {\n if (program.isUniformUsed('cameraParallel')) {\n program.setUniformi('cameraParallel', cam.getParallelProjection());\n }\n\n program.setLastCameraMTime(camm);\n }\n\n if (!actorIsIdentity) {\n // reset the cam mtime as actor modified the shader values\n program.setLastCameraMTime(0);\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n var aColor = model.drawingEdges ? ppty.getEdgeColorByReference() : ppty.getAmbientColorByReference();\n var dColor = model.drawingEdges ? ppty.getEdgeColorByReference() : ppty.getDiffuseColorByReference();\n var aIntensity = model.drawingEdges ? 1.0 : ppty.getAmbient();\n var dIntensity = model.drawingEdges ? 0.0 : ppty.getDiffuse();\n var sIntensity = model.drawingEdges ? 0.0 : ppty.getSpecular();\n var specularPower = ppty.getSpecularPower();\n program.setUniformf('opacityUniform', opacity);\n program.setUniform3fArray('ambientColorUniform', aColor);\n program.setUniform3fArray('diffuseColorUniform', dColor);\n program.setUniformf('ambient', aIntensity);\n program.setUniformf('diffuse', dIntensity); // we are done unless we have lighting\n\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity < 1) {\n return;\n }\n\n var sColor = ppty.getSpecularColorByReference();\n program.setUniform3fArray('specularColorUniform', sColor);\n program.setUniformf('specularPowerUniform', specularPower);\n program.setUniformf('specular', sIntensity); // now set the backface properties if we have them\n\n if (program.isUniformUsed('ambientIntensityBF')) {\n ppty = actor.getBackfaceProperty();\n opacity = ppty.getOpacity();\n aColor = ppty.getAmbientColor();\n aIntensity = ppty.getAmbient();\n dColor = ppty.getDiffuseColor();\n dIntensity = ppty.getDiffuse();\n sColor = ppty.getSpecularColor();\n sIntensity = ppty.getSpecular();\n program.setUniformf('ambientIntensityBF', aIntensity);\n program.setUniformf('diffuseIntensityBF', dIntensity);\n program.setUniformf('opacityUniformBF', opacity);\n program.setUniform3fArray('ambientColorUniformBF', aColor);\n program.setUniform3fArray('diffuseColorUniformBF', dColor); // we are done unless we have lighting\n\n if (lastLightComplexity < 1) {\n return;\n }\n\n program.setUniformf('specularIntensityBF', sIntensity);\n program.setUniform3fArray('specularColorUniformBF', sColor);\n program.setUniformf('specularPowerUniformBF', specularPower);\n }\n };\n\n publicAPI.updateMaximumPointCellIds = function (ren, actor) {\n var _model$selectionWebGL, _model$selectionWebGL2, _model$selectionWebGL3, _model$selectionWebGL4;\n\n var selector = model._openGLRenderer.getSelector();\n\n if (!selector) {\n return;\n }\n\n if ((_model$selectionWebGL = model.selectionWebGLIdsToVTKIds) !== null && _model$selectionWebGL !== void 0 && (_model$selectionWebGL2 = _model$selectionWebGL.points) !== null && _model$selectionWebGL2 !== void 0 && _model$selectionWebGL2.length) {\n var length = model.selectionWebGLIdsToVTKIds.points.length;\n selector.setMaximumPointId(length - 1);\n }\n\n if ((_model$selectionWebGL3 = model.selectionWebGLIdsToVTKIds) !== null && _model$selectionWebGL3 !== void 0 && (_model$selectionWebGL4 = _model$selectionWebGL3.cells) !== null && _model$selectionWebGL4 !== void 0 && _model$selectionWebGL4.length) {\n var _length = model.selectionWebGLIdsToVTKIds.cells.length;\n selector.setMaximumCellId(_length - 1);\n }\n\n var fieldAssociation = selector.getFieldAssociation();\n\n if (fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n model.pointPicking = true;\n }\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n model.primitiveIDOffset = 0;\n model.vertexIDOffset = 0;\n var picking = getPickState(model._openGLRenderer);\n\n if (model.lastSelectionState !== picking) {\n model.selectionStateChanged.modified();\n model.lastSelectionState = picking;\n }\n\n if (model._openGLRenderer.getSelector()) {\n switch (picking) {\n default:\n model._openGLRenderer.getSelector().renderProp(actor);\n\n }\n } // make sure the BOs are up to date\n\n\n publicAPI.updateBufferObjects(ren, actor); // If we are coloring by texture, then load the texture map.\n // Use Map as indicator, because texture hangs around.\n\n if (model.renderable.getColorTextureMap()) {\n model.internalColorTexture.activate();\n } // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n\n model.lastBoundBO = null;\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var representation = actor.getProperty().getRepresentation();\n var drawSurfaceWithEdges = actor.getProperty().getEdgeVisibility() && representation === Representation.SURFACE;\n\n var selector = model._openGLRenderer.getSelector(); // If we are picking points, we need to tell it to the helper\n\n\n var pointPicking = selector && selector.getFieldAssociation() === FieldAssociations.FIELD_ASSOCIATION_POINTS && (model.lastSelectionState === PassTypes.ID_LOW24 || model.lastSelectionState === PassTypes.ID_HIGH24); // for every primitive type\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i].setPointPicking(pointPicking);\n var cabo = model.primitives[i].getCABO();\n\n if (cabo.getElementCount()) {\n // are we drawing edges\n model.drawingEdges = drawSurfaceWithEdges && (i === primTypes.TrisEdges || i === primTypes.TriStripsEdges); // don't draw edges when rendering depth or rendering for picking\n\n if (!model.drawingEdges || !(model.renderDepth || model.lastSelectionState >= 0)) {\n model.lastBoundBO = model.primitives[i];\n model.primitiveIDOffset += model.primitives[i].drawArrays(ren, actor, representation, publicAPI);\n model.vertexIDOffset += model.primitives[i].getCABO().getElementCount();\n }\n }\n }\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {\n if (model.LastBoundBO) {\n model.LastBoundBO.getVAO().release();\n }\n\n if (model.renderable.getColorTextureMap()) {\n model.internalColorTexture.deactivate();\n }\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n // Make sure that we have been properly initialized.\n // if (ren.getRenderWindow().checkAbortStatus()) {\n // return;\n // }\n publicAPI.invokeEvent(StartEvent);\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n model.currentInput = model.renderable.getInputData();\n publicAPI.invokeEvent(EndEvent);\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n } // if there are no points then we are done\n\n\n if (!model.currentInput.getPoints || !model.currentInput.getPoints().getNumberOfValues()) {\n return;\n } // apply faceCulling\n\n\n var gl = model.context;\n var backfaceCulling = actor.getProperty().getBackfaceCulling();\n var frontfaceCulling = actor.getProperty().getFrontfaceCulling();\n\n if (!backfaceCulling && !frontfaceCulling) {\n model._openGLRenderWindow.disableCullFace();\n } else if (frontfaceCulling) {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.FRONT);\n } else {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.BACK);\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.computeBounds = function (ren, actor) {\n if (!publicAPI.getInput()) {\n uninitializeBounds(model.bounds);\n return;\n }\n\n model.bounds = publicAPI.getInput().getBounds();\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n // Note that the actor's mtime includes it's properties mtime\n var vmtime = model.VBOBuildTime.getMTime();\n\n if (vmtime < publicAPI.getMTime() || vmtime < model.renderable.getMTime() || vmtime < actor.getMTime() || vmtime < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, 1.0);\n var c = model.renderable.getColorMapColors();\n model.haveCellScalars = false;\n var scalarMode = model.renderable.getScalarMode();\n\n if (model.renderable.getScalarVisibility()) {\n // We must figure out how the scalars should be mapped to the polydata.\n if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !poly.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {\n model.haveCellScalars = true;\n }\n } // Do we have normals?\n\n\n var n = actor.getProperty().getInterpolation() !== Shading.FLAT ? poly.getPointData().getNormals() : null;\n\n if (n === null && poly.getCellData().getNormals()) {\n model.haveCellNormals = true;\n n = poly.getCellData().getNormals();\n } // rebuild the VBO if the data has changed we create a string for the VBO what\n // can change the VBO? points normals tcoords colors so what can change those?\n // the input data is clearly one as it can change all four items tcoords may\n // haveTextures or not colors may change based on quite a few mapping\n // parameters in the mapper\n\n\n var representation = actor.getProperty().getRepresentation();\n var tcoords = poly.getPointData().getTCoords();\n\n if (!model.openGLActor.getActiveTextures()) {\n tcoords = null;\n } // handle color mapping via texture\n\n\n if (model.renderable.getColorCoordinates()) {\n tcoords = model.renderable.getColorCoordinates();\n\n if (!model.internalColorTexture) {\n model.internalColorTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n }\n\n var tex = model.internalColorTexture; // the following 4 lines allow for NPOT textures\n\n tex.setMinificationFilter(Filter.NEAREST);\n tex.setMagnificationFilter(Filter.NEAREST);\n tex.setWrapS(Wrap.CLAMP_TO_EDGE);\n tex.setWrapT(Wrap.CLAMP_TO_EDGE);\n tex.setOpenGLRenderWindow(model._openGLRenderWindow);\n var input = model.renderable.getColorTextureMap();\n var ext = input.getExtent();\n var inScalars = input.getPointData().getScalars();\n tex.create2DFromRaw(ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, inScalars.getNumberOfComponents(), inScalars.getDataType(), inScalars.getData());\n tex.activate();\n tex.sendParameters();\n tex.deactivate();\n }\n\n var toString = \"\".concat(poly.getMTime(), \"A\").concat(representation, \"B\").concat(poly.getMTime()) + \"C\".concat(n ? n.getMTime() : 1, \"D\").concat(c ? c.getMTime() : 1) + \"E\".concat(actor.getProperty().getEdgeVisibility()) + \"F\".concat(tcoords ? tcoords.getMTime() : 1);\n\n if (model.VBOBuildString !== toString) {\n // Build the VBOs\n var points = poly.getPoints();\n var options = {\n points: points,\n normals: n,\n tcoords: tcoords,\n colors: c,\n cellOffset: 0,\n vertexOffset: 0,\n // Used to keep track of vertex ids across primitives for selection\n haveCellScalars: model.haveCellScalars,\n haveCellNormals: model.haveCellNormals,\n customAttributes: model.renderable.getCustomShaderAttributes().map(function (arrayName) {\n return poly.getPointData().getArrayByName(arrayName);\n })\n };\n\n if (model.renderable.getPopulateSelectionSettings()) {\n model.selectionWebGLIdsToVTKIds = {\n points: null,\n cells: null\n };\n }\n\n var primitives = [{\n inRep: 'verts',\n cells: poly.getVerts()\n }, {\n inRep: 'lines',\n cells: poly.getLines()\n }, {\n inRep: 'polys',\n cells: poly.getPolys()\n }, {\n inRep: 'strips',\n cells: poly.getStrips()\n }, {\n inRep: 'polys',\n cells: poly.getPolys()\n }, {\n inRep: 'strips',\n cells: poly.getStrips()\n }];\n var drawSurfaceWithEdges = actor.getProperty().getEdgeVisibility() && representation === Representation.SURFACE;\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n if (i !== primTypes.TrisEdges && i !== primTypes.TriStripsEdges) {\n options.cellOffset += model.primitives[i].getCABO().createVBO(primitives[i].cells, primitives[i].inRep, representation, options, model.selectionWebGLIdsToVTKIds);\n options.vertexOffset += model.primitives[i].getCABO().getElementCount();\n } else {\n // if we have edge visibility build the edge VBOs\n if (drawSurfaceWithEdges) {\n // VBOs for edges in \"surface with edges\" are the last to be built,\n // they are not used when picking with a hardware selector so they\n // don't need selectionWebGLIdsToVTKIds and don't update cellOffset and vertexOffset\n model.primitives[i].getCABO().createVBO(primitives[i].cells, primitives[i].inRep, Representation.WIREFRAME, _objectSpread(_objectSpread({}, options), {}, {\n tcoords: null,\n colors: null,\n haveCellScalars: false,\n haveCellNormals: false\n }));\n } else {\n // otherwise free them\n model.primitives[i].releaseGraphicsResources();\n }\n }\n }\n\n if (model.renderable.getPopulateSelectionSettings()) {\n model.renderable.setSelectionWebGLIdsToVTKIds(model.selectionWebGLIdsToVTKIds);\n publicAPI.updateMaximumPointCellIds();\n }\n\n model.VBOBuildTime.modified();\n model.VBOBuildString = toString;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n VBOBuildTime: 0,\n VBOBuildString: null,\n primitives: null,\n primTypes: null,\n shaderRebuildString: null,\n tmpMat4: null,\n ambientColor: [],\n // used internally\n diffuseColor: [],\n // used internally\n specularColor: [],\n // used internally\n lightColor: [],\n // used internally\n lightHalfAngle: [],\n // used internally\n lightDirection: [],\n // used internally\n lastHaveSeenDepthRequest: false,\n haveSeenDepthRequest: false,\n lastSelectionState: PassTypes.MIN_KNOWN_PASS - 1,\n selectionStateChanged: null,\n selectionWebGLIdsToVTKIds: null,\n pointPicking: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.primitives = [];\n model.primTypes = primTypes;\n model.tmpMat3 = mat3.identity(new Float64Array(9));\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i] = vtkHelper.newInstance();\n model.primitives[i].setPrimitiveType(i);\n model.primitives[i].set({\n lastLightComplexity: 0,\n lastLightCount: 0,\n lastSelectionPass: false\n }, true);\n } // Build VTK API\n\n\n setGet(publicAPI, model, ['context']);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime, {\n mtime: 0\n });\n model.selectionStateChanged = {};\n obj(model.selectionStateChanged, {\n mtime: 0\n }); // Object methods\n\n vtkOpenGLPolyDataMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLPolyDataMapper'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLPolyDataMapper$1 = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkMapper', newInstance);\n\nexport { vtkOpenGLPolyDataMapper$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport vtkHardwareSelector from './HardwareSelector.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkOpenGLPolyDataMapper from './PolyDataMapper.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar Representation = vtkProperty.Representation;\nvar ObjectType = vtkBufferObject.ObjectType;\nvar PassTypes = vtkHardwareSelector.PassTypes;\nvar StartEvent = {\n type: 'StartEvent'\n};\nvar EndEvent = {\n type: 'EndEvent'\n}; // ----------------------------------------------------------------------------\n// vtkOpenGLSphereMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLGlyph3DMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLGlyph3DMapper'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent(StartEvent);\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n model.currentInput = model.renderable.getInputData(1);\n publicAPI.invokeEvent(EndEvent);\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n } // if there are no points then we are done\n\n\n if (!model.currentInput.getPoints || !model.currentInput.getPoints().getNumberOfValues()) {\n return;\n } // apply faceCulling\n\n\n var gl = model.context;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.hardwareSupport = true;\n model.extension = null;\n } else if (!model.extension) {\n model.extension = model.context.getExtension('ANGLE_instanced_arrays');\n model.hardwareSupport = !!model.extension;\n } // to test without extension support uncomment the next two lines\n // model.extension = null;\n // model.hardwareSupport = !!model.extension;\n\n\n var backfaceCulling = actor.getProperty().getBackfaceCulling();\n var frontfaceCulling = actor.getProperty().getFrontfaceCulling();\n\n if (!backfaceCulling && !frontfaceCulling) {\n model._openGLRenderWindow.disableCullFace();\n } else if (frontfaceCulling) {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.FRONT);\n } else {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.BACK);\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.multiply4x4WithOffset = function (out, a, b, off) {\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n var a30 = a[12];\n var a31 = a[13];\n var a32 = a[14];\n var a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[off];\n var b1 = b[off + 1];\n var b2 = b[off + 2];\n var b3 = b[off + 3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[off + 4];\n b1 = b[off + 5];\n b2 = b[off + 6];\n b3 = b[off + 7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[off + 8];\n b1 = b[off + 9];\n b2 = b[off + 10];\n b3 = b[off + 11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[off + 12];\n b1 = b[off + 13];\n b2 = b[off + 14];\n b3 = b[off + 15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n };\n\n publicAPI.replaceShaderNormal = function (shaders, ren, actor) {\n if (model.hardwareSupport) {\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n var VSSource = shaders.Vertex;\n\n if (model.lastBoundBO.getCABO().getNormalOffset()) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Dec', ['attribute vec3 normalMC;', 'attribute mat3 gNormal;', 'uniform mat3 normalMatrix;', 'varying vec3 normalVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Impl', ['normalVCVSOutput = normalMatrix * gNormal * normalMC;']).result;\n }\n\n shaders.Vertex = VSSource;\n }\n }\n\n superClass.replaceShaderNormal(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderColor = function (shaders, ren, actor) {\n if (model.hardwareSupport && model.renderable.getColorArray()) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity'); // create the material/color property declarations, and VS implementation\n // these are always defined\n\n var colorDec = ['uniform float ambient;', 'uniform float diffuse;', 'uniform float specular;', 'uniform float opacityUniform; // the fragment opacity']; // add more for specular\n\n if (lastLightComplexity) {\n colorDec = colorDec.concat(['uniform vec3 specularColorUniform;', 'uniform float specularPowerUniform;']);\n } // now handle the more complex fragment shader implementation\n // the following are always defined variables. We start\n // by assigning a default value from the uniform\n\n\n var colorImpl = ['vec3 ambientColor;', ' vec3 diffuseColor;', ' float opacity;'];\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' vec3 specularColor;', ' float specularPower;']);\n }\n\n colorImpl = colorImpl.concat([' opacity = opacityUniform;']);\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' specularColor = specularColorUniform;', ' specularPower = specularPowerUniform;']);\n }\n\n if (!model.drawingEdges) {\n colorDec = colorDec.concat(['varying vec4 vertexColorVSOutput;']);\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Dec', ['attribute vec4 gColor;', 'varying vec4 vertexColorVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Impl', ['vertexColorVSOutput = gColor;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Dec', ['in vec4 vertexColorVSOutput[];', 'out vec4 vertexColorGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Impl', ['vertexColorGSOutput = vertexColorVSOutput[i];']).result;\n colorImpl = colorImpl.concat([' diffuseColor = vertexColorVSOutput.rgb;', ' ambientColor = vertexColorVSOutput.rgb;', ' opacity = opacity*vertexColorVSOutput.a;']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', colorDec).result;\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n\n superClass.replaceShaderColor(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n if (model.hardwareSupport) {\n var VSSource = shaders.Vertex; // do we need the vertex in the shader in View Coordinates\n\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['vec4 gVertexMC = gMatrix * vertexMC;', 'vertexVCVSOutput = MCVCMatrix * gVertexMC;', ' gl_Position = MCPCMatrix * gVertexMC;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['attribute mat4 gMatrix;', 'uniform mat4 MCPCMatrix;', 'uniform mat4 MCVCMatrix;']).result;\n } else {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['attribute mat4 gMatrix;', 'uniform mat4 MCPCMatrix;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['vec4 gVertexMC = gMatrix * vertexMC;', ' gl_Position = MCPCMatrix * gVertexMC;']).result;\n }\n\n shaders.Vertex = VSSource;\n }\n\n superClass.replaceShaderPositionVC(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderPicking = function (shaders, ren, actor) {\n if (model.hardwareSupport) {\n var FSSource = shaders.Fragment;\n var VSSource = shaders.Vertex;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Dec', ['attribute vec3 mapperIndexVS;', 'varying vec3 mapperIndexVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Impl', ' mapperIndexVSOutput = mapperIndexVS;').result;\n shaders.Vertex = VSSource;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', ['varying vec3 mapperIndexVSOutput;', 'uniform vec3 mapperIndex;', 'uniform int picking;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', [' vec4 pickColor = picking == 2 ? vec4(mapperIndexVSOutput,1.0) : vec4(mapperIndex,1.0);', ' gl_FragData[0] = picking != 0 ? pickColor : gl_FragData[0];']).result;\n shaders.Fragment = FSSource;\n } else {\n superClass.replaceShaderPicking(shaders, ren, actor);\n }\n };\n\n publicAPI.updateGlyphShaderParameters = function (normalMatrixUsed, mcvcMatrixUsed, cellBO, carray, garray, narray, p, selector) {\n var program = cellBO.getProgram();\n\n if (normalMatrixUsed) {\n var a = model.normalMatrix;\n var b = narray;\n var ofs = p * 9;\n var out = model.tmpMat3;\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a10 = a[3];\n var a11 = a[4];\n var a12 = a[5];\n var a20 = a[6];\n var a21 = a[7];\n var a22 = a[8];\n var b00 = b[ofs];\n var b01 = b[ofs + 1];\n var b02 = b[ofs + 2];\n var b10 = b[ofs + 3];\n var b11 = b[ofs + 4];\n var b12 = b[ofs + 5];\n var b20 = b[ofs + 6];\n var b21 = b[ofs + 7];\n var b22 = b[ofs + 8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n program.setUniformMatrix3x3('normalMatrix', model.tmpMat3);\n }\n\n publicAPI.multiply4x4WithOffset(model.tmpMat4, model.mcpcMatrix, garray, p * 16);\n program.setUniformMatrix('MCPCMatrix', model.tmpMat4);\n\n if (mcvcMatrixUsed) {\n publicAPI.multiply4x4WithOffset(model.tmpMat4, model.mcvcMatrix, garray, p * 16);\n program.setUniformMatrix('MCVCMatrix', model.tmpMat4);\n } // set color\n\n\n if (carray) {\n var cdata = carray.getData();\n model.tmpColor[0] = cdata[p * 4] / 255.0;\n model.tmpColor[1] = cdata[p * 4 + 1] / 255.0;\n model.tmpColor[2] = cdata[p * 4 + 2] / 255.0;\n program.setUniform3fArray('ambientColorUniform', model.tmpColor);\n program.setUniform3fArray('diffuseColorUniform', model.tmpColor);\n }\n\n if (selector) {\n program.setUniform3fArray('mapperIndex', selector.getPropColorValue());\n }\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var representation = actor.getProperty().getRepresentation();\n var gl = model.context;\n var drawSurfaceWithEdges = actor.getProperty().getEdgeVisibility() && representation === Representation.SURFACE; // [WMVP]C == {world, model, view, projection} coordinates\n // E.g., WCPC == world to projection coordinate transformation\n\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var actMats = model.openGLActor.getKeyMatrices(); // precompute the actor+camera mats once\n\n mat3.multiply(model.normalMatrix, keyMats.normalMatrix, actMats.normalMatrix);\n mat4.multiply(model.mcpcMatrix, keyMats.wcpc, actMats.mcwc);\n mat4.multiply(model.mcvcMatrix, keyMats.wcvc, actMats.mcwc);\n var garray = model.renderable.getMatrixArray();\n var narray = model.renderable.getNormalArray();\n var carray = model.renderable.getColorArray();\n var numPts = garray.length / 16;\n var compositePass = false;\n\n if (model._openGLRenderer.getSelector()) {\n if (model._openGLRenderer.getSelector().getCurrentPass() === PassTypes.COMPOSITE_INDEX_PASS) {\n compositePass = true;\n }\n } // for every primitive type\n\n\n for (var i = model.primTypes.Start; i < model.primTypes.End; i++) {\n // if there are entries\n var cabo = model.primitives[i].getCABO();\n\n if (cabo.getElementCount()) {\n // are we drawing edges\n model.drawingEdges = drawSurfaceWithEdges && (i === model.primTypes.TrisEdges || i === model.primTypes.TriStripsEdges);\n model.lastBoundBO = model.primitives[i];\n model.primitives[i].updateShaders(ren, actor, publicAPI);\n var program = model.primitives[i].getProgram();\n var mode = model.primitives[i].getOpenGLMode(representation);\n var normalMatrixUsed = program.isUniformUsed('normalMatrix');\n var mcvcMatrixUsed = program.isUniformUsed('MCVCMatrix');\n\n if (model.hardwareSupport) {\n if (model.extension) {\n model.extension.drawArraysInstancedANGLE(mode, 0, cabo.getElementCount(), numPts);\n } else {\n gl.drawArraysInstanced(mode, 0, cabo.getElementCount(), numPts);\n }\n } else {\n // draw the array multiple times with different cam matrix\n for (var p = 0; p < numPts; ++p) {\n if (compositePass) {\n model._openGLRenderer.getSelector().renderCompositeIndex(p);\n }\n\n publicAPI.updateGlyphShaderParameters(normalMatrixUsed, mcvcMatrixUsed, model.primitives[i], carray, garray, narray, p, compositePass ? model._openGLRenderer.getSelector() : null);\n gl.drawArrays(mode, 0, cabo.getElementCount());\n }\n }\n }\n }\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n if (cellBO.getCABO().getElementCount() && (model.glyphBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (cellBO.getProgram().isAttributeUsed('gMatrix')) {\n if (!cellBO.getVAO().addAttributeMatrixWithDivisor(cellBO.getProgram(), model.matrixBuffer, 'gMatrix', 0, 64, model.context.FLOAT, 4, false, 1)) {\n vtkErrorMacro('Error setting gMatrix in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('gMatrix');\n }\n\n if (cellBO.getProgram().isAttributeUsed('gNormal')) {\n if (!cellBO.getVAO().addAttributeMatrixWithDivisor(cellBO.getProgram(), model.normalBuffer, 'gNormal', 0, 36, model.context.FLOAT, 3, false, 1)) {\n vtkErrorMacro('Error setting gNormal in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('gNormal');\n }\n\n if (cellBO.getProgram().isAttributeUsed('gColor')) {\n if (!cellBO.getVAO().addAttributeArrayWithDivisor(cellBO.getProgram(), model.colorBuffer, 'gColor', 0, 4, model.context.UNSIGNED_BYTE, 4, true, 1, false)) {\n vtkErrorMacro('Error setting gColor in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('gColor');\n }\n\n if (cellBO.getProgram().isAttributeUsed('mapperIndexVS')) {\n if (!cellBO.getVAO().addAttributeArrayWithDivisor(cellBO.getProgram(), model.pickBuffer, 'mapperIndexVS', 0, 4, model.context.UNSIGNED_BYTE, 4, true, 1, false)) {\n vtkErrorMacro('Error setting mapperIndexVS in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('mapperIndexVS');\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n cellBO.getAttributeUpdateTime().modified();\n return;\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n model.renderable.buildArrays(); // first do a coarse check\n // Note that the actor's mtime includes it's properties mtime\n\n var vmtime = model.VBOBuildTime.getMTime();\n\n if (vmtime < model.renderable.getBuildTime().getMTime()) {\n return true;\n }\n\n return superClass.getNeedToRebuildBufferObjects(ren, actor);\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n if (superClass.getNeedToRebuildShaders(cellBO, ren, actor) || cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n if (model.hardwareSupport) {\n // update the buffer objects if needed\n var garray = model.renderable.getMatrixArray();\n var narray = model.renderable.getNormalArray();\n var carray = model.renderable.getColorArray();\n\n if (!model.matrixBuffer) {\n model.matrixBuffer = vtkBufferObject.newInstance();\n model.matrixBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.normalBuffer = vtkBufferObject.newInstance();\n model.normalBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorBuffer = vtkBufferObject.newInstance();\n model.colorBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.pickBuffer = vtkBufferObject.newInstance();\n model.pickBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n\n if (model.renderable.getBuildTime().getMTime() > model.glyphBOBuildTime.getMTime()) {\n model.matrixBuffer.upload(garray, ObjectType.ARRAY_BUFFER);\n model.normalBuffer.upload(narray, ObjectType.ARRAY_BUFFER);\n\n if (carray) {\n model.colorBuffer.upload(carray.getData(), ObjectType.ARRAY_BUFFER);\n } else {\n model.colorBuffer.releaseGraphicsResources();\n }\n\n var numPts = garray.length / 16;\n var parray = new Uint8Array(4 * numPts);\n\n for (var i = 0; i < numPts; ++i) {\n var value = i + 1;\n var offset = i * 4;\n parray[offset] = value % 256;\n value -= parray[offset];\n value /= 256;\n parray[offset + 1] = value % 256;\n value -= parray[offset + 1];\n value /= 256;\n parray[offset + 2] = value % 256;\n parray[offset + 3] = 255;\n }\n\n model.pickBuffer.upload(parray, ObjectType.ARRAY_BUFFER);\n model.glyphBOBuildTime.modified();\n }\n }\n\n return superClass.buildBufferObjects(ren, actor);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n normalMatrix: null,\n mcpcMatrix: null,\n mcwcMatrix: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkOpenGLPolyDataMapper.extend(publicAPI, model, initialValues);\n model.tmpMat3 = mat3.identity(new Float64Array(9));\n model.normalMatrix = mat3.identity(new Float64Array(9));\n model.mcpcMatrix = mat4.identity(new Float64Array(16));\n model.mcvcMatrix = mat4.identity(new Float64Array(16));\n model.tmpColor = [];\n model.glyphBOBuildTime = {};\n obj(model.glyphBOBuildTime, {\n mtime: 0\n }); // Object methods\n\n vtkOpenGLGlyph3DMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLGlyph3DMapper'); // ----------------------------------------------------------------------------\n\nvar vtkGlyph3DMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkGlyph3DMapper', newInstance);\n\nexport { vtkGlyph3DMapper as default, extend, newInstance };\n","import { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet, get, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkHelper from './Helper.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLSkybox methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLSkybox(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLSkybox'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n\n var ren = model._openGLRenderer.getRenderable();\n\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera());\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n renderPass.incrementOpaqueActorCount();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass && !model._openGLRenderer.getSelector()) {\n publicAPI.updateBufferObjects();\n model.context.depthMask(true);\n\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(model.tris.getProgram());\n\n model.openGLTexture.render(model._openGLRenderWindow);\n var texUnit = model.openGLTexture.getTextureUnit();\n model.tris.getProgram().setUniformi('sbtexture', texUnit);\n\n var ren = model._openGLRenderer.getRenderable();\n\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var imat = new Float64Array(16);\n mat4.invert(imat, keyMats.wcpc);\n model.tris.getProgram().setUniformMatrix('IMCPCMatrix', imat);\n\n if (model.lastFormat === 'box') {\n var camPos = ren.getActiveCamera().getPosition();\n model.tris.getProgram().setUniform3f('camPos', camPos[0], camPos[1], camPos[2]);\n }\n\n model.tris.getVAO().bind(); // draw polygons\n\n model.context.drawArrays(model.context.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n model.openGLTexture.deactivate();\n }\n };\n\n publicAPI.updateBufferObjects = function () {\n // build the VBO if needed, only happens once\n if (!model.tris.getCABO().getElementCount()) {\n var ptsArray = new Float32Array(12);\n\n for (var i = 0; i < 4; i++) {\n ptsArray[i * 3] = i % 2 * 2 - 1.0;\n ptsArray[i * 3 + 1] = i > 1 ? 1.0 : -1.0;\n ptsArray[i * 3 + 2] = 1.0;\n }\n\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n cellOffset: 0\n });\n } // update the program?\n\n\n if (model.renderable.getFormat() !== model.lastFormat) {\n model.lastFormat = model.renderable.getFormat();\n\n if (model.lastFormat === 'box') {\n // we invert Y below because opengl is messed up!\n // Cube Maps have been specified to follow the RenderMan\n // specification (for whatever reason), and RenderMan\n // assumes the images' origin being in the upper left,\n // contrary to the usual OpenGL behaviour of having the\n // image origin in the lower left. That's why things get\n // swapped in the Y direction. It totally breaks with the usual\n // OpenGL semantics and doesn't make sense at all.\n // But now we're stuck with it. From\n // https://stackoverflow.com/questions/11685608/convention-of-faces-in-opengl-cubemapping\n //\n model.tris.setProgram(model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(\"//VTK::System::Dec\\n attribute vec3 vertexMC;\\n uniform mat4 IMCPCMatrix;\\n varying vec3 TexCoords;\\n void main () {\\n gl_Position = vec4(vertexMC.xyz, 1.0);\\n vec4 wpos = IMCPCMatrix * gl_Position;\\n TexCoords = wpos.xyz/wpos.w;\\n }\", \"//VTK::System::Dec\\n //VTK::Output::Dec\\n varying vec3 TexCoords;\\n uniform samplerCube sbtexture;\\n uniform vec3 camPos;\\n void main () {\\n // skybox looks from inside out\\n // which means we have to adjust\\n // our tcoords. Otherwise text would\\n // be flipped\\n vec3 tc = normalize(TexCoords - camPos);\\n if (abs(tc.z) < max(abs(tc.x),abs(tc.y)))\\n {\\n tc = vec3(1.0, 1.0, -1.0) * tc;\\n }\\n else\\n {\\n tc = vec3(-1.0, 1.0, 1.0) * tc;\\n }\\n gl_FragData[0] = textureCube(sbtexture, tc);\\n }\", ''));\n }\n\n if (model.lastFormat === 'background') {\n // maps the texture to the window\n model.tris.setProgram(model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(\"//VTK::System::Dec\\n attribute vec3 vertexMC;\\n uniform mat4 IMCPCMatrix;\\n varying vec2 TexCoords;\\n void main () {\\n gl_Position = vec4(vertexMC.xyz, 1.0);\\n vec4 wpos = IMCPCMatrix * gl_Position;\\n TexCoords = vec2(vertexMC.x, vertexMC.y)*0.5 + 0.5;\\n }\", \"//VTK::System::Dec\\n //VTK::Output::Dec\\n varying vec2 TexCoords;\\n uniform sampler2D sbtexture;\\n void main () {\\n gl_FragData[0] = texture2D(sbtexture, TexCoords);\\n }\", ''));\n }\n\n model.tris.getShaderSourceTime().modified();\n model.tris.getVAO().bind();\n\n if (!model.tris.getVAO().addAttributeArray(model.tris.getProgram(), model.tris.getCABO(), 'vertexMC', model.tris.getCABO().getVertexOffset(), model.tris.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexMC in shader VAO.');\n }\n } // set/update the texture map if needed\n\n\n var tmaps = model.renderable.getTextures();\n\n if (!tmaps.length) {\n vtkErrorMacro('vtkSkybox requires a texture map');\n }\n\n if (model.openGLTexture.getRenderable() !== tmaps[0]) {\n model.openGLTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.openGLTexture.setRenderable(tmaps[0]);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.openGLTexture = vtkOpenGLTexture.newInstance();\n model.tris = vtkHelper.newInstance();\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: mat3.identity(new Float64Array(9)),\n mcwc: mat4.identity(new Float64Array(16))\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context']);\n get(publicAPI, model, ['activeTextures']); // Object methods\n\n vtkOpenGLSkybox(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkSkybox = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkSkybox', newInstance);\n\nexport { vtkSkybox as default, extend, newInstance };\n","var vtkSphereMapperVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkSphereMapperVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// this shader implements imposters in OpenGL for Spheres\\n\\nattribute vec4 vertexMC;\\nattribute vec2 offsetMC;\\n\\n// optional normal declaration\\n//VTK::Normal::Dec\\n\\n//VTK::Picking::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\nvarying vec4 vertexVCVSOutput;\\nvarying float radiusVCVSOutput;\\nvarying vec3 centerVCVSOutput;\\n\\nuniform int cameraParallel;\\nuniform float scaleFactor;\\n\\nvoid main()\\n{\\n //VTK::Picking::Impl\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Clip::Impl\\n\\n // compute the projected vertex position\\n vec2 scaledOffsetMC = scaleFactor * offsetMC;\\n vertexVCVSOutput = MCVCMatrix * vertexMC;\\n centerVCVSOutput = vertexVCVSOutput.xyz;\\n radiusVCVSOutput = length(scaledOffsetMC)*0.5;\\n\\n // make the triangle face the camera\\n if (cameraParallel == 0)\\n {\\n vec3 dir = normalize(-vertexVCVSOutput.xyz);\\n vec3 base2 = normalize(cross(dir,vec3(1.0,0.0,0.0)));\\n vec3 base1 = cross(base2,dir);\\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz + scaledOffsetMC.x*base1 + scaledOffsetMC.y*base2;\\n }\\n else\\n {\\n // add in the offset\\n vertexVCVSOutput.xy = vertexVCVSOutput.xy + scaledOffsetMC;\\n }\\n\\n gl_Position = VCPCMatrix * vertexVCVSOutput;\\n}\\n\";\n\nexport { vtkSphereMapperVS as v };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat4 } from 'gl-matrix';\nimport { ObjectType } from './BufferObject/Constants.js';\nimport { newInstance as newInstance$1, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport { r as radiansFromDegrees } from '../../Common/Core/Math/index.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkOpenGLPolyDataMapper from './PolyDataMapper.js';\nimport { v as vtkSphereMapperVS } from './glsl/vtkSphereMapperVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLSphereMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLSphereMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLSphereMapper'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkSphereMapperVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 VCPCMatrix;\\n', 'uniform mat4 MCVCMatrix;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', ['varying vec4 vertexVCVSOutput;']).result; // we create vertexVC below, so turn off the default\n // implementation\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Impl', ['vec4 vertexVC = vertexVCVSOutput;\\n']).result; // for lights kit and positional the VCPC matrix is already defined\n // so don't redefine it\n\n var replacement = ['uniform float invertedDepth;\\n', 'uniform int cameraParallel;\\n', 'varying float radiusVCVSOutput;\\n', 'varying vec3 centerVCVSOutput;\\n', 'uniform mat4 VCPCMatrix;\\n'];\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', replacement).result;\n var fragString = '';\n\n if (model.context.getExtension('EXT_frag_depth')) {\n fragString = 'gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\\n';\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n fragString = 'gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\\n';\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', [// compute the eye position and unit direction\n ' vec3 EyePos;\\n', ' vec3 EyeDir;\\n', ' if (cameraParallel != 0) {\\n', ' EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\\n', ' EyeDir = vec3(0.0,0.0,-1.0); }\\n', ' else {\\n', ' EyeDir = vertexVC.xyz;\\n', ' EyePos = vec3(0.0,0.0,0.0);\\n', ' float lengthED = length(EyeDir);\\n', ' EyeDir = normalize(EyeDir);\\n', // we adjust the EyePos to be closer if it is too far away\n // to prevent floating point precision noise\n ' if (lengthED > radiusVCVSOutput*3.0) {\\n', ' EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\\n', ' }\\n', // translate to Sphere center\n ' EyePos = EyePos - centerVCVSOutput;\\n', // scale to radius 1.0\n ' EyePos = EyePos/radiusVCVSOutput;\\n', // find the intersection\n ' float b = 2.0*dot(EyePos,EyeDir);\\n', ' float c = dot(EyePos,EyePos) - 1.0;\\n', ' float d = b*b - 4.0*c;\\n', ' vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\\n', ' if (d < 0.0) { discard; }\\n', ' else {\\n', ' float t = (-b - invertedDepth*sqrt(d))*0.5;\\n', // compute the normal, for unit sphere this is just\n // the intersection point\n ' normalVCVSOutput = invertedDepth*normalize(EyePos + t*EyeDir);\\n', // compute the intersection point in VC\n ' vertexVC.xyz = normalVCVSOutput*radiusVCVSOutput + centerVCVSOutput;\\n', ' }\\n', // compute the pixel's depth\n // ' normalVCVSOutput = vec3(0,0,1);\\n'\n ' vec4 pos = VCPCMatrix * vertexVC;\\n', fragString]).result; // Strip out the normal line -- the normal is computed as part of the depth\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', '').result;\n\n if (model.haveSeenDepthRequest) {\n // special depth impl\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float computedZ = (pos.z / pos.w + 1.0) / 2.0;', 'float iz = floor(computedZ * 65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n superClass.replaceShaderValues(shaders, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime()) && cellBO.getProgram().isAttributeUsed('offsetMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'offsetMC', 12, // 12:this->VBO->ColorOffset+sizeof(float)\n cellBO.getCABO().getStride(), model.context.FLOAT, 2, false)) {\n vtkErrorMacro(\"Error setting 'offsetMC' in shader VAO.\");\n }\n }\n\n if (cellBO.getProgram().isUniformUsed('invertedDepth')) {\n cellBO.getProgram().setUniformf('invertedDepth', model.invert ? -1.0 : 1.0);\n }\n\n if (cellBO.getProgram().isUniformUsed('scaleFactor')) {\n // apply scaling factor only if a scale array has been provided.\n var poly = model.currentInput;\n var pointData = poly.getPointData();\n\n if (model.renderable.getScaleArray() != null && pointData.hasArray(model.renderable.getScaleArray())) {\n cellBO.getProgram().setUniformf('scaleFactor', model.renderable.getScaleFactor());\n } else {\n cellBO.getProgram().setUniformf('scaleFactor', 1.0);\n }\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var cam = ren.getActiveCamera();\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n\n if (program.isUniformUsed('VCPCMatrix')) {\n program.setUniformMatrix('VCPCMatrix', keyMats.vcpc);\n }\n\n if (program.isUniformUsed('MCVCMatrix')) {\n if (!actor.getIsIdentity()) {\n var actMats = model.openGLActor.getKeyMatrices();\n var tmp4 = new Float64Array(16);\n mat4.multiply(tmp4, keyMats.wcvc, actMats.mcwc);\n program.setUniformMatrix('MCVCMatrix', tmp4);\n } else {\n program.setUniformMatrix('MCVCMatrix', keyMats.wcvc);\n }\n }\n\n if (program.isUniformUsed('cameraParallel')) {\n cellBO.getProgram().setUniformi('cameraParallel', cam.getParallelProjection());\n }\n };\n\n publicAPI.getOpenGLMode = function (rep, type) {\n return model.context.TRIANGLES;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, 1.0);\n var c = model.renderable.getColorMapColors();\n var vbo = model.primitives[model.primTypes.Tris].getCABO();\n var pointData = poly.getPointData();\n var points = poly.getPoints();\n var numPoints = points.getNumberOfPoints();\n var pointArray = points.getData();\n var pointSize = 5; // x,y,z,orientation1,orientation2\n\n var scales = null;\n\n if (model.renderable.getScaleArray() != null && pointData.hasArray(model.renderable.getScaleArray())) {\n scales = pointData.getArray(model.renderable.getScaleArray()).getData();\n }\n\n var colorData = null;\n var colorComponents = 0;\n var packedUCVBO = null;\n\n if (c) {\n colorComponents = c.getNumberOfComponents();\n vbo.setColorOffset(0);\n vbo.setColorBOStride(4);\n colorData = c.getData();\n packedUCVBO = new Uint8Array(3 * numPoints * 4);\n\n if (!vbo.getColorBO()) {\n vbo.setColorBO(vtkBufferObject.newInstance());\n }\n\n vbo.getColorBO().setOpenGLRenderWindow(model._openGLRenderWindow);\n } else if (vbo.getColorBO()) {\n vbo.setColorBO(null);\n }\n\n vbo.setColorComponents(colorComponents);\n var packedVBO = new Float32Array(pointSize * numPoints * 3);\n vbo.setStride(pointSize * 4);\n var cos30 = Math.cos(radiansFromDegrees(30.0));\n var pointIdx = 0;\n var colorIdx = 0; //\n // Generate points and point data for sides\n //\n\n var vboIdx = 0;\n var ucIdx = 0;\n\n for (var i = 0; i < numPoints; ++i) {\n var radius = model.renderable.getRadius();\n\n if (scales) {\n radius = scales[i];\n }\n\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = -2.0 * radius * cos30;\n packedVBO[vboIdx++] = -radius;\n\n if (colorData) {\n colorIdx = i * colorComponents;\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = 2.0 * radius * cos30;\n packedVBO[vboIdx++] = -radius;\n\n if (colorData) {\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = 0.0;\n packedVBO[vboIdx++] = 2.0 * radius;\n\n if (colorData) {\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n }\n\n vbo.setElementCount(vboIdx / pointSize);\n vbo.upload(packedVBO, ObjectType.ARRAY_BUFFER);\n\n if (c) {\n vbo.getColorBO().upload(packedUCVBO, ObjectType.ARRAY_BUFFER);\n }\n\n model.VBOBuildTime.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkOpenGLPolyDataMapper.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLSphereMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLSphereMapper'); // ----------------------------------------------------------------------------\n\nvar vtkSphereMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkSphereMapper', newInstance);\n\nexport { vtkSphereMapper as default, extend, newInstance };\n","var vtkStickMapperVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkStickMapperVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// this shader implements imposters in OpenGL for Sticks\\n\\nattribute vec4 vertexMC;\\nattribute vec3 orientMC;\\nattribute vec4 offsetMC;\\nattribute float radiusMC;\\n\\n// optional normal declaration\\n//VTK::Normal::Dec\\n\\n//VTK::Picking::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\nvarying vec4 vertexVCVSOutput;\\nvarying float radiusVCVSOutput;\\nvarying float lengthVCVSOutput;\\nvarying vec3 centerVCVSOutput;\\nvarying vec3 orientVCVSOutput;\\n\\nuniform int cameraParallel;\\n\\nvoid main()\\n{\\n //VTK::Picking::Impl\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Clip::Impl\\n\\n vertexVCVSOutput = MCVCMatrix * vertexMC;\\n centerVCVSOutput = vertexVCVSOutput.xyz;\\n radiusVCVSOutput = radiusMC;\\n lengthVCVSOutput = length(orientMC);\\n orientVCVSOutput = normalMatrix * normalize(orientMC);\\n\\n // make sure it is pointing out of the screen\\n if (orientVCVSOutput.z < 0.0)\\n {\\n orientVCVSOutput = -orientVCVSOutput;\\n }\\n\\n // make the basis\\n vec3 xbase;\\n vec3 ybase;\\n vec3 dir = vec3(0.0,0.0,1.0);\\n if (cameraParallel == 0)\\n {\\n dir = normalize(-vertexVCVSOutput.xyz);\\n }\\n if (abs(dot(dir,orientVCVSOutput)) == 1.0)\\n {\\n xbase = normalize(cross(vec3(0.0,1.0,0.0),orientVCVSOutput));\\n ybase = cross(xbase,orientVCVSOutput);\\n }\\n else\\n {\\n xbase = normalize(cross(orientVCVSOutput,dir));\\n ybase = cross(orientVCVSOutput,xbase);\\n }\\n\\n vec3 offsets = offsetMC.xyz*2.0-1.0;\\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz +\\n radiusVCVSOutput*offsets.x*xbase +\\n radiusVCVSOutput*offsets.y*ybase +\\n 0.5*lengthVCVSOutput*offsets.z*orientVCVSOutput;\\n\\n gl_Position = VCPCMatrix * vertexVCVSOutput;\\n}\\n\";\n\nexport { vtkStickMapperVS as v };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat4, mat3 } from 'gl-matrix';\nimport { ObjectType } from './BufferObject/Constants.js';\nimport { newInstance as newInstance$1, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport { v as vtkStickMapperVS } from './glsl/vtkStickMapperVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkOpenGLPolyDataMapper from './PolyDataMapper.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLStickMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLStickMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLStickMapper'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkStickMapperVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 VCPCMatrix;\\n', 'uniform mat4 MCVCMatrix;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', 'varying vec4 vertexVCVSOutput;').result; // we create vertexVC below, so turn off the default\n // implementation\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Impl', ' vec4 vertexVC = vertexVCVSOutput;\\n').result; // for lights kit and positional the VCPC matrix is already defined\n // so don't redefine it\n\n var replacement = ['uniform int cameraParallel;\\n', 'varying float radiusVCVSOutput;\\n', 'varying vec3 orientVCVSOutput;\\n', 'varying float lengthVCVSOutput;\\n', 'varying vec3 centerVCVSOutput;\\n', 'uniform mat4 VCPCMatrix;\\n'];\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', replacement).result;\n var fragString = '';\n\n if (model.context.getExtension('EXT_frag_depth')) {\n fragString = ' gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\\n';\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n fragString = 'gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\\n';\n } // see https://www.cl.cam.ac.uk/teaching/1999/AGraphHCI/SMAG/node2.html\n\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', [// compute the eye position and unit direction\n ' vec3 EyePos;\\n', ' vec3 EyeDir;\\n', ' if (cameraParallel != 0) {\\n', ' EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\\n', ' EyeDir = vec3(0.0,0.0,-1.0); }\\n', ' else {\\n', ' EyeDir = vertexVC.xyz;\\n', ' EyePos = vec3(0.0,0.0,0.0);\\n', ' float lengthED = length(EyeDir);\\n', ' EyeDir = normalize(EyeDir);\\n', // we adjust the EyePos to be closer if it is too far away\n // to prevent floating point precision noise\n ' if (lengthED > radiusVCVSOutput*3.0) {\\n', ' EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\\n', ' }\\n', // translate to Stick center\n ' EyePos = EyePos - centerVCVSOutput;\\n', // rotate to new basis\n // base1, base2, orientVC\n ' vec3 base1;\\n', ' if (abs(orientVCVSOutput.z) < 0.99) {\\n', ' base1 = normalize(cross(orientVCVSOutput,vec3(0.0,0.0,1.0))); }\\n', ' else {\\n', ' base1 = normalize(cross(orientVCVSOutput,vec3(0.0,1.0,0.0))); }\\n', ' vec3 base2 = cross(orientVCVSOutput,base1);\\n', ' EyePos = vec3(dot(EyePos,base1),dot(EyePos,base2),dot(EyePos,orientVCVSOutput));\\n', ' EyeDir = vec3(dot(EyeDir,base1),dot(EyeDir,base2),dot(EyeDir,orientVCVSOutput));\\n', // scale by radius\n ' EyePos = EyePos/radiusVCVSOutput;\\n', // find the intersection\n ' float a = EyeDir.x*EyeDir.x + EyeDir.y*EyeDir.y;\\n', ' float b = 2.0*(EyePos.x*EyeDir.x + EyePos.y*EyeDir.y);\\n', ' float c = EyePos.x*EyePos.x + EyePos.y*EyePos.y - 1.0;\\n', ' float d = b*b - 4.0*a*c;\\n', ' vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\\n', ' if (d < 0.0) { discard; }\\n', ' else {\\n', ' float t = (-b - sqrt(d))/(2.0*a);\\n', ' float tz = EyePos.z + t*EyeDir.z;\\n', ' vec3 iPoint = EyePos + t*EyeDir;\\n', ' if (abs(iPoint.z)*radiusVCVSOutput > lengthVCVSOutput*0.5) {\\n', // test for end cap\n ' float t2 = (-b + sqrt(d))/(2.0*a);\\n', ' float tz2 = EyePos.z + t2*EyeDir.z;\\n', ' if (tz2*radiusVCVSOutput > lengthVCVSOutput*0.5 || tz*radiusVCVSOutput < -0.5*lengthVCVSOutput) { discard; }\\n', ' else {\\n', ' normalVCVSOutput = orientVCVSOutput;\\n', ' float t3 = (lengthVCVSOutput*0.5/radiusVCVSOutput - EyePos.z)/EyeDir.z;\\n', ' iPoint = EyePos + t3*EyeDir;\\n', ' vertexVC.xyz = radiusVCVSOutput*(iPoint.x*base1 + iPoint.y*base2 + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\\n', ' }\\n', ' }\\n', ' else {\\n', // The normal is the iPoint.xy rotated back into VC\n ' normalVCVSOutput = iPoint.x*base1 + iPoint.y*base2;\\n', // rescale rerotate and translate\n ' vertexVC.xyz = radiusVCVSOutput*(normalVCVSOutput + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\\n', ' }\\n', ' }\\n', // ' vec3 normalVC = vec3(0.0,0.0,1.0);\\n'\n // compute the pixel's depth\n ' vec4 pos = VCPCMatrix * vertexVC;\\n', fragString]).result; // Strip out the normal line -- the normal is computed as part of the depth\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', '').result;\n\n if (model.haveSeenDepthRequest) {\n // special depth impl\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float computedZ = (pos.z / pos.w + 1.0) / 2.0;', 'float iz = floor(computedZ * 65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n superClass.replaceShaderValues(shaders, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (cellBO.getProgram().isAttributeUsed('orientMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'orientMC', 12, // after X Y Z\n cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro(\"Error setting 'orientMC' in shader VAO.\");\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('offsetMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO().getColorBO(), 'offsetMC', 0, cellBO.getCABO().getColorBOStride(), model.context.UNSIGNED_BYTE, 3, true)) {\n vtkErrorMacro(\"Error setting 'offsetMC' in shader VAO.\");\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('radiusMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'radiusMC', 24, // X Y Z OX OY OZ\n cellBO.getCABO().getStride(), model.context.FLOAT, 1, false)) {\n vtkErrorMacro(\"Error setting 'radiusMC' in shader VAO.\");\n }\n }\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var cam = ren.getActiveCamera();\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n\n if (program.isUniformUsed('VCPCMatrix')) {\n program.setUniformMatrix('VCPCMatrix', keyMats.vcpc);\n }\n\n if (!actor.getIsIdentity()) {\n var actMats = model.openGLActor.getKeyMatrices();\n\n if (program.isUniformUsed('MCVCMatrix')) {\n var tmp4 = new Float64Array(16);\n mat4.multiply(tmp4, keyMats.wcvc, actMats.mcwc);\n program.setUniformMatrix('MCVCMatrix', tmp4);\n }\n\n if (program.isUniformUsed('normalMatrix')) {\n var anorms = new Float64Array(9);\n mat3.multiply(anorms, keyMats.normalMatrix, actMats.normalMatrix);\n program.setUniformMatrix3x3('normalMatrix', anorms);\n }\n } else {\n if (program.isUniformUsed('MCVCMatrix')) {\n program.setUniformMatrix('MCVCMatrix', keyMats.wcvc);\n }\n\n if (program.isUniformUsed('normalMatrix')) {\n program.setUniformMatrix3x3('normalMatrix', keyMats.normalMatrix);\n }\n }\n\n if (program.isUniformUsed('cameraParallel')) {\n cellBO.getProgram().setUniformi('cameraParallel', cam.getParallelProjection());\n }\n };\n\n publicAPI.getOpenGLMode = function (rep, type) {\n return model.context.TRIANGLES;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, 1.0);\n var c = model.renderable.getColorMapColors();\n var vbo = model.primitives[model.primTypes.Tris].getCABO();\n var pointData = poly.getPointData();\n var points = poly.getPoints();\n var numPoints = points.getNumberOfPoints();\n var pointArray = points.getData();\n var pointSize = 3; // x,y,z\n // three more floats for orientation + 1 for radius\n\n pointSize += 4;\n var colorData = null;\n var colorComponents = 0;\n vbo.setColorBOStride(4);\n\n if (!vbo.getColorBO()) {\n vbo.setColorBO(vtkBufferObject.newInstance());\n }\n\n vbo.getColorBO().setOpenGLRenderWindow(model._openGLRenderWindow);\n\n if (c) {\n colorComponents = c.getNumberOfComponents();\n vbo.setColorOffset(4);\n colorData = c.getData();\n vbo.setColorBOStride(8);\n }\n\n vbo.setColorComponents(colorComponents);\n vbo.setStride(pointSize * 4); // Create a buffer, and copy the data over.\n\n var packedVBO = new Float32Array(pointSize * numPoints * 12);\n var packedUCVBO = new Uint8Array(12 * numPoints * (colorData ? 8 : 4));\n var scales = null;\n var orientationArray = null; //\n // Generate points and point data for sides\n //\n\n if (model.renderable.getScaleArray() != null && pointData.hasArray(model.renderable.getScaleArray())) {\n scales = pointData.getArray(model.renderable.getScaleArray()).getData();\n }\n\n if (model.renderable.getOrientationArray() != null && pointData.hasArray(model.renderable.getOrientationArray())) {\n orientationArray = pointData.getArray(model.renderable.getOrientationArray()).getData();\n } else {\n vtkErrorMacro(['Error setting orientationArray.\\n', 'You have to specify the stick orientation']);\n } // Vertices\n // 013 - 032 - 324 - 453\n //\n // _.4---_.5\n // .-* .-*\n // 2-----3\n // | /|\n // | / |\n // | / |\n // | / |\n // |/ |\n // 0-----1\n //\n // coord for each points\n // 0: 000\n // 1: 100\n // 2: 001\n // 3: 101\n // 4: 011\n // 5: 111\n // prettier-ignore\n\n\n var verticesArray = [0, 1, 3, 0, 3, 2, 2, 3, 5, 2, 5, 4];\n var pointIdx = 0;\n var colorIdx = 0;\n var vboIdx = 0;\n var ucIdx = 0;\n\n for (var i = 0; i < numPoints; ++i) {\n var length = model.renderable.getLength();\n var radius = model.renderable.getRadius();\n\n if (scales) {\n length = scales[i * 2];\n radius = scales[i * 2 + 1];\n }\n\n for (var j = 0; j < verticesArray.length; ++j) {\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n pointIdx = i * 3;\n packedVBO[vboIdx++] = orientationArray[pointIdx++] * length;\n packedVBO[vboIdx++] = orientationArray[pointIdx++] * length;\n packedVBO[vboIdx++] = orientationArray[pointIdx++] * length;\n packedVBO[vboIdx++] = radius;\n packedUCVBO[ucIdx++] = 255 * (verticesArray[j] % 2);\n packedUCVBO[ucIdx++] = verticesArray[j] >= 4 ? 255 : 0;\n packedUCVBO[ucIdx++] = verticesArray[j] >= 2 ? 255 : 0;\n packedUCVBO[ucIdx++] = 255;\n colorIdx = i * colorComponents;\n\n if (colorData) {\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n }\n }\n\n vbo.setElementCount(vboIdx / pointSize);\n vbo.upload(packedVBO, ObjectType.ARRAY_BUFFER);\n vbo.getColorBO().upload(packedUCVBO, ObjectType.ARRAY_BUFFER);\n model.VBOBuildTime.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkOpenGLPolyDataMapper.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLStickMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLStickMapper'); // ----------------------------------------------------------------------------\n\nvar vtkStickMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkStickMapper', newInstance);\n\nexport { vtkStickMapper as default, extend, newInstance };\n","import { mat3, mat4, vec3 } from 'gl-matrix';\nimport macro from '@kitware/vtk.js/macros';\nimport vtkOpenGLVolumeMapper from '@kitware/vtk.js/Rendering/OpenGL/VolumeMapper';\nimport { Filter } from '@kitware/vtk.js/Rendering/OpenGL/Texture/Constants';\nimport { VtkDataTypes } from '@kitware/vtk.js/Common/Core/DataArray/Constants';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport { Representation } from '@kitware/vtk.js/Rendering/Core/Property/Constants';\n\nconst { vtkWarningMacro } = macro;\n/**\n * vtkStreamingOpenGLVolumeMapper - A dervied class of the core vtkOpenGLVolumeMapper class.\n * This class replaces the buildBufferObjects function so that we progressively upload our textures\n * into GPU memory using the new methods on vtkStreamingOpenGLTexture.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLVolumeMapper(publicAPI, model) {\n model.classHierarchy.push('vtkStreamingOpenGLVolumeMapper');\n\n /**\n * buildBufferObjects - A fork of vtkOpenGLVolumeMapper's buildBufferObjects method.\n * This fork performs most of the same actions, but builds the textures progressively using\n * vtkStreamingOpenGLTexture's methods, and also prevents recomputation of the texture for each\n * vtkStreamingOpenGLVolumeMapper using the texture.\n *\n *\n * @param {*} ren The renderer.\n * @param {*} actor The actor to build the buffer objects for.\n */\n publicAPI.buildBufferObjects = (ren, actor) => {\n const image = model.currentInput;\n if (!image) {\n return;\n }\n\n const scalars = image.getPointData() && image.getPointData().getScalars();\n if (!scalars) {\n return;\n }\n\n const vprop = actor.getProperty();\n\n if (!model.jitterTexture.getHandle()) {\n const oTable = new Uint8Array(32 * 32);\n for (let i = 0; i < 32 * 32; ++i) {\n oTable[i] = 255.0 * Math.random();\n }\n model.jitterTexture.setMinificationFilter(Filter.LINEAR);\n model.jitterTexture.setMagnificationFilter(Filter.LINEAR);\n model.jitterTexture.create2DFromRaw(\n 32,\n 32,\n 1,\n VtkDataTypes.UNSIGNED_CHAR,\n oTable\n );\n }\n\n const numComp = scalars.getNumberOfComponents();\n const iComps = vprop.getIndependentComponents();\n const numIComps = iComps ? numComp : 1;\n\n // rebuild opacity tfun?\n let toString = `${vprop.getMTime()}`;\n if (model.opacityTextureString !== toString) {\n const oWidth = 1024;\n const oSize = oWidth * 2 * numIComps;\n const ofTable = new Float32Array(oSize);\n const tmpTable = new Float32Array(oWidth);\n\n for (let c = 0; c < numIComps; ++c) {\n const ofun = vprop.getScalarOpacity(c);\n const opacityFactor =\n model.renderable.getSampleDistance() /\n vprop.getScalarOpacityUnitDistance(c);\n\n const oRange = ofun.getRange();\n ofun.getTable(oRange[0], oRange[1], oWidth, tmpTable, 1);\n // adjust for sample distance etc\n for (let i = 0; i < oWidth; ++i) {\n ofTable[c * oWidth * 2 + i] =\n 1.0 - (1.0 - tmpTable[i]) ** opacityFactor;\n ofTable[c * oWidth * 2 + i + oWidth] = ofTable[c * oWidth * 2 + i];\n }\n }\n\n model.opacityTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.opacityTexture.setMinificationFilter(Filter.LINEAR);\n model.opacityTexture.setMagnificationFilter(Filter.LINEAR);\n\n // use float texture where possible because we really need the resolution\n // for this table. Errors in low values of opacity accumulate to\n // visible artifacts. High values of opacity quickly terminate without\n // artifacts.\n if (\n model._openGLRenderWindow.getWebgl2() ||\n (model.context.getExtension('OES_texture_float') &&\n model.context.getExtension('OES_texture_float_linear'))\n ) {\n model.opacityTexture.create2DFromRaw(\n oWidth,\n 2 * numIComps,\n 1,\n VtkDataTypes.FLOAT,\n ofTable\n );\n } else {\n const oTable = new Uint8Array(oSize);\n for (let i = 0; i < oSize; ++i) {\n oTable[i] = 255.0 * ofTable[i];\n }\n model.opacityTexture.create2DFromRaw(\n oWidth,\n 2 * numIComps,\n 1,\n VtkDataTypes.UNSIGNED_CHAR,\n oTable\n );\n }\n model.opacityTextureString = toString;\n }\n\n // rebuild color tfun?\n toString = `${vprop.getMTime()}`;\n\n if (model.colorTextureString !== toString) {\n const cWidth = 1024;\n const cSize = cWidth * 2 * numIComps * 3;\n const cTable = new Uint8Array(cSize);\n const tmpTable = new Float32Array(cWidth * 3);\n\n for (let c = 0; c < numIComps; ++c) {\n const cfun = vprop.getRGBTransferFunction(c);\n const cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, tmpTable, 1);\n for (let i = 0; i < cWidth * 3; ++i) {\n cTable[c * cWidth * 6 + i] = 255.0 * tmpTable[i];\n cTable[c * cWidth * 6 + i + cWidth * 3] = 255.0 * tmpTable[i];\n }\n }\n\n model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n\n model.colorTexture.create2DFromRaw(\n cWidth,\n 2 * numIComps,\n 3,\n VtkDataTypes.UNSIGNED_CHAR,\n cTable\n );\n model.colorTextureString = toString;\n }\n\n // rebuild the scalarTexture if the data has changed\n toString = `${image.getMTime()}`;\n\n if (model.scalarTextureString !== toString) {\n // Build the textures\n const dims = image.getDimensions();\n\n const previousTextureParameters =\n model.scalarTexture.getTextureParameters();\n\n const dataType = image.getPointData().getScalars().getDataType();\n const data = image.getPointData().getScalars().getData();\n\n let shouldReset = true;\n\n if (\n previousTextureParameters.dataType &&\n previousTextureParameters.dataType === dataType\n ) {\n const previousTextureSize =\n previousTextureParameters.width *\n previousTextureParameters.height *\n previousTextureParameters.depth *\n previousTextureParameters.numComps;\n if (data.length === previousTextureSize) {\n shouldReset = false;\n }\n }\n\n if (shouldReset) {\n model.scalarTexture.setOglNorm16Ext(\n model.context.getExtension('EXT_texture_norm16')\n );\n\n model.scalarTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.scalarTexture.resetFormatAndType();\n\n model.scalarTexture.create3DFilterableFromRaw(\n dims[0],\n dims[1],\n dims[2],\n numComp,\n scalars.getDataType(),\n scalars.getData(),\n model.renderable.getPreferSizeOverAccuracy()\n );\n } else {\n model.scalarTexture.deactivate();\n model.scalarTexture.update3DFromRaw(data);\n }\n\n model.scalarTextureString = toString;\n }\n\n if (!model.tris.getCABO().getElementCount()) {\n // build the CABO\n const ptsArray = new Float32Array(12);\n for (let i = 0; i < 4; i++) {\n ptsArray[i * 3] = (i % 2) * 2 - 1.0;\n ptsArray[i * 3 + 1] = i > 1 ? 1.0 : -1.0;\n ptsArray[i * 3 + 2] = -1.0;\n }\n\n const cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n\n const points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray,\n });\n points.setName('points');\n const cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray,\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points,\n cellOffset: 0,\n });\n }\n\n model.VBOBuildTime.modified();\n };\n\n // publicAPI.getRenderTargetSize = () => {\n // // https://github.com/Kitware/vtk-js/blob/master/Sources/Rendering/OpenGL/VolumeMapper/index.js#L952\n // if (model.lastXYF > 1.43) {\n // const sz = model.framebuffer.getSize()\n // return [model.fvp[0] * sz[0], model.fvp[1] * sz[1]]\n // }\n\n // // This seems wrong, it assumes the renderWindow only has one renderer\n // // but I don't know if this stuff is correct...\n\n // const { usize, vsize } = model.openGLRenderer.getTiledSizeAndOrigin()\n\n // return [usize, vsize]\n // }\n\n // publicAPI.getRenderTargetSize = () => {\n // if (model._useSmallViewport) {\n // return [model._smallViewportWidth, model._smallViewportHeight]\n // }\n\n // return model._openGLRenderWindow.getFramebufferSize()\n // }\n\n publicAPI.getRenderTargetSize = () => {\n if (model._useSmallViewport) {\n return [model._smallViewportWidth, model._smallViewportHeight];\n }\n\n const { usize, vsize } = model._openGLRenderer.getTiledSizeAndOrigin();\n\n return [usize, vsize];\n };\n\n publicAPI.getRenderTargetOffset = () => {\n const { lowerLeftU, lowerLeftV } =\n model._openGLRenderer.getTiledSizeAndOrigin();\n\n return [lowerLeftU, lowerLeftV];\n };\n\n // TODO: it seems like this may be needed to reset the GPU memory associated\n // with a volume\n // publicAPI.hardReset = () => {\n // model.opacityTexture.releaseGraphicsResources(model._openGLRenderWindow);\n // model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n // model.scalarTexture.setOglNorm16Ext(\n // model.context.getExtension('EXT_texture_norm16')\n // );\n // model.scalarTexture.releaseGraphicsResources(model._openGLRenderWindow);\n // model.scalarTexture.resetFormatAndType();\n // };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkOpenGLVolumeMapper.extend(publicAPI, model, initialValues);\n\n model.scalarTexture = initialValues.scalarTexture;\n model.previousState = {};\n\n // Object methods\n vtkStreamingOpenGLVolumeMapper(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLVolumeMapper'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\n// import vtkGenericWidgetRepresentation from '@kitware/vtk.js/Rendering/SceneGraph/GenericWidgetRepresentation'\nimport vtkOpenGLActor from '@kitware/vtk.js/Rendering/OpenGL/Actor';\nimport vtkOpenGLActor2D from '@kitware/vtk.js/Rendering/OpenGL/Actor2D';\nimport vtkOpenGLCamera from '@kitware/vtk.js/Rendering/OpenGL/Camera';\nimport vtkOpenGLGlyph3DMapper from '@kitware/vtk.js/Rendering/OpenGL/Glyph3DMapper';\nimport vtkOpenGLImageMapper from '@kitware/vtk.js/Rendering/OpenGL/ImageMapper';\nimport vtkOpenGLImageSlice from '@kitware/vtk.js/Rendering/OpenGL/ImageSlice';\nimport vtkOpenGLPixelSpaceCallbackMapper from '@kitware/vtk.js/Rendering/OpenGL/PixelSpaceCallbackMapper';\nimport vtkOpenGLPolyDataMapper from '@kitware/vtk.js/Rendering/OpenGL/PolyDataMapper';\nimport vtkOpenGLRenderer from '@kitware/vtk.js/Rendering/OpenGL/Renderer';\nimport vtkOpenGLSkybox from '@kitware/vtk.js/Rendering/OpenGL/Skybox';\nimport vtkOpenGLSphereMapper from '@kitware/vtk.js/Rendering/OpenGL/SphereMapper';\nimport vtkOpenGLStickMapper from '@kitware/vtk.js/Rendering/OpenGL/StickMapper';\nimport vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture';\nimport vtkOpenGLVolume from '@kitware/vtk.js/Rendering/OpenGL/Volume';\nimport vtkOpenGLVolumeMapper from '@kitware/vtk.js/Rendering/OpenGL/VolumeMapper';\nimport vtkViewNodeFactory from '@kitware/vtk.js/Rendering/SceneGraph/ViewNodeFactory';\nimport vtkStreamingOpenGLVolumeMapper from './vtkStreamingOpenGLVolumeMapper';\n\n/**\n * vtkStreamingOpenGLViewNodeFactory - A fork of the vtkOpenGLViewNodeFactory,\n * so that we can inject our custom derived \"Streaming\" classes.\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLViewNodeFactory(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkStreamingOpenGLViewNodeFactory');\n\n /**\n * createNode - fork of createNode from vtkOpenGLViewNodeFactory.\n * This fork is required to inject the properties from model.getModelInitialValues.\n *\n * @param {object} dataObject An instance of a vtk.js class.\n */\n publicAPI.createNode = (dataObject) => {\n if (dataObject.isDeleted()) {\n return null;\n }\n\n let cpt = 0;\n let className = dataObject.getClassName(cpt++);\n let isObject = false;\n const keys = Object.keys(model.overrides);\n while (className && !isObject) {\n if (keys.indexOf(className) !== -1) {\n isObject = true;\n } else {\n className = dataObject.getClassName(cpt++);\n }\n }\n\n if (!isObject) {\n return null;\n }\n\n const initialValues = model.getModelInitialValues(dataObject);\n\n const vn = model.overrides[className](initialValues);\n vn.setMyFactory(publicAPI);\n return vn;\n };\n\n /**\n * getModelInitialValues - This function allows us to pass textures down from our\n * vtkSharedVolumeMapper to new instances of vtkStreamingOpenGLVolumeMapper.\n * The prevents us from sharing memory.\n *\n * TODO: It would be beneficial to push similar, but generalized, functionality\n * back to vtk.js in the future.\n *\n * @param {object} dataObject An instance of a vtk.js class.\n */\n model.getModelInitialValues = (dataObject) => {\n const initialValues = {};\n\n const className = dataObject.getClassName();\n\n if (className === 'vtkSharedVolumeMapper') {\n initialValues.scalarTexture = dataObject.getScalarTexture();\n }\n\n return initialValues;\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n // Inheritance\n vtkViewNodeFactory.extend(publicAPI, model, initialValues);\n\n // Object methods\n vtkStreamingOpenGLViewNodeFactory(publicAPI, model);\n\n // Initialization\n publicAPI.registerOverride('vtkActor', vtkOpenGLActor.newInstance);\n publicAPI.registerOverride('vtkActor2D', vtkOpenGLActor2D.newInstance);\n publicAPI.registerOverride('vtkCamera', vtkOpenGLCamera.newInstance);\n publicAPI.registerOverride(\n 'vtkGlyph3DMapper',\n vtkOpenGLGlyph3DMapper.newInstance\n );\n publicAPI.registerOverride(\n 'vtkImageMapper',\n vtkOpenGLImageMapper.newInstance\n );\n publicAPI.registerOverride('vtkImageSlice', vtkOpenGLImageSlice.newInstance);\n publicAPI.registerOverride('vtkMapper', vtkOpenGLPolyDataMapper.newInstance);\n publicAPI.registerOverride(\n 'vtkPixelSpaceCallbackMapper',\n vtkOpenGLPixelSpaceCallbackMapper.newInstance\n );\n publicAPI.registerOverride('vtkRenderer', vtkOpenGLRenderer.newInstance);\n publicAPI.registerOverride('vtkSkybox', vtkOpenGLSkybox.newInstance);\n publicAPI.registerOverride(\n 'vtkSphereMapper',\n vtkOpenGLSphereMapper.newInstance\n );\n publicAPI.registerOverride(\n 'vtkStickMapper',\n vtkOpenGLStickMapper.newInstance\n );\n publicAPI.registerOverride('vtkTexture', vtkOpenGLTexture.newInstance);\n publicAPI.registerOverride('vtkVolume', vtkOpenGLVolume.newInstance);\n publicAPI.registerOverride(\n 'vtkVolumeMapper',\n vtkOpenGLVolumeMapper.newInstance\n );\n publicAPI.registerOverride(\n 'vtkSharedVolumeMapper',\n vtkStreamingOpenGLVolumeMapper.newInstance\n );\n // publicAPI.registerOverride(\n // 'vtkWidgetRepresentation',\n // vtkGenericWidgetRepresentation.newInstance\n // )\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLViewNodeFactory'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkOpenGLRenderWindow from '@kitware/vtk.js/Rendering/OpenGL/RenderWindow';\nimport vtkStreamingOpenGLViewNodeFactory from './vtkStreamingOpenGLViewNodeFactory';\n\n/**\n * vtkStreamingOpenGLRenderWindow - A dervied class of the core vtkOpenGLRenderWindow class.\n * The main purpose for this class extension is to add in our own node factory, so we can use\n * our extended \"streaming\" classes for progressive texture loading.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLRenderWindow(publicAPI, model) {\n model.classHierarchy.push('vtkStreamingOpenGLRenderWindow');\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, initialValues);\n\n vtkOpenGLRenderWindow.extend(publicAPI, model, initialValues);\n\n model.myFactory = vtkStreamingOpenGLViewNodeFactory.newInstance();\n /* eslint-disable no-use-before-define */\n model.myFactory.registerOverride('vtkRenderWindow', newInstance);\n /* eslint-enable no-use-before-define */\n\n // Object methods\n vtkStreamingOpenGLRenderWindow(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLRenderWindow'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","var Device = {\n Unknown: 0,\n LeftController: 1,\n RightController: 2\n};\nvar Input = {\n Unknown: 0,\n Trigger: 1,\n TrackPad: 2,\n Grip: 3,\n Thumbstick: 4,\n A: 5,\n B: 6,\n ApplicationMenu: 7 // Not exposed in WebXR API\n\n};\nvar Axis = {\n Unknown: 0,\n TouchpadX: 1,\n TouchpadY: 2,\n ThumbstickX: 3,\n ThumbstickY: 4\n};\nvar Constants = {\n Device: Device,\n Input: Input,\n Axis: Axis\n};\n\nexport { Axis, Device, Input, Constants as default };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { A as degreesFromRadians } from '../../Common/Core/Math/index.js';\nimport Constants from './RenderWindowInteractor/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Device = Constants.Device,\n Input = Constants.Input;\nvar vtkWarningMacro = macro.vtkWarningMacro,\n vtkErrorMacro = macro.vtkErrorMacro,\n normalizeWheel = macro.normalizeWheel,\n vtkOnceErrorMacro = macro.vtkOnceErrorMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nvar EMPTY_MOUSE_EVENT = new MouseEvent('');\nvar deviceInputMap = {\n 'xr-standard': [Input.Trigger, Input.Grip, Input.TrackPad, Input.Thumbstick, Input.A, Input.B]\n};\nvar handledEvents = ['StartAnimation', 'Animation', 'EndAnimation', 'PointerEnter', 'PointerLeave', 'MouseEnter', 'MouseLeave', 'StartMouseMove', 'MouseMove', 'EndMouseMove', 'LeftButtonPress', 'LeftButtonRelease', 'MiddleButtonPress', 'MiddleButtonRelease', 'RightButtonPress', 'RightButtonRelease', 'KeyPress', 'KeyDown', 'KeyUp', 'StartMouseWheel', 'MouseWheel', 'EndMouseWheel', 'StartPinch', 'Pinch', 'EndPinch', 'StartPan', 'Pan', 'EndPan', 'StartRotate', 'Rotate', 'EndRotate', 'Button3D', 'Move3D', 'StartPointerLock', 'EndPointerLock', 'StartInteraction', 'Interaction', 'EndInteraction', 'AnimationFrameRateUpdate'];\n\nfunction preventDefault(event) {\n if (event.cancelable) {\n event.preventDefault();\n }\n}\n\nfunction pointerCacheToPositions(cache) {\n var positions = Object.create(null);\n cache.forEach(function (_ref) {\n var pointerId = _ref.pointerId,\n position = _ref.position;\n positions[pointerId] = position;\n });\n return positions;\n} // ----------------------------------------------------------------------------\n// vtkRenderWindowInteractor methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkRenderWindowInteractor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderWindowInteractor'); // Initialize list of requesters\n\n var animationRequesters = new Set(); // map from pointerId to { pointerId: number, position: [x, y] }\n\n var pointerCache = new Map(); // Factor to apply on wheel spin.\n\n var wheelCoefficient = 1; // Public API methods\n //----------------------------------------------------------------------\n\n publicAPI.start = function () {\n // Let the compositing handle the event loop if it wants to.\n // if (publicAPI.HasObserver(vtkCommand::StartEvent) && !publicAPI.HandleEventLoop) {\n // publicAPI.invokeEvent({ type: 'StartEvent' });\n // return;\n // }\n // As a convenience, initialize if we aren't initialized yet.\n if (!model.initialized) {\n publicAPI.initialize();\n\n if (!model.initialized) {\n return;\n }\n } // Pass execution to the subclass which will run the event loop,\n // this will not return until TerminateApp is called.\n\n\n publicAPI.startEventLoop();\n }; //----------------------------------------------------------------------\n\n\n publicAPI.setRenderWindow = function (aren) {\n vtkErrorMacro('you want to call setView(view) instead of setRenderWindow on a vtk.js interactor');\n }; //----------------------------------------------------------------------\n\n\n publicAPI.setInteractorStyle = function (style) {\n if (model.interactorStyle !== style) {\n if (model.interactorStyle != null) {\n model.interactorStyle.setInteractor(null);\n }\n\n model.interactorStyle = style;\n\n if (model.interactorStyle != null) {\n if (model.interactorStyle.getInteractor() !== publicAPI) {\n model.interactorStyle.setInteractor(publicAPI);\n }\n }\n }\n }; //---------------------------------------------------------------------\n\n\n publicAPI.initialize = function () {\n model.initialized = true;\n publicAPI.enable();\n publicAPI.render();\n };\n\n publicAPI.enable = function () {\n return publicAPI.setEnabled(true);\n };\n\n publicAPI.disable = function () {\n return publicAPI.setEnabled(false);\n };\n\n publicAPI.startEventLoop = function () {\n return vtkWarningMacro('empty event loop');\n };\n\n function updateCurrentRenderer(x, y) {\n if (!model._forcedRenderer) {\n model.currentRenderer = publicAPI.findPokedRenderer(x, y);\n }\n }\n\n publicAPI.getCurrentRenderer = function () {\n if (model.currentRenderer) {\n return model.currentRenderer;\n }\n\n updateCurrentRenderer(0, 0);\n return model.currentRenderer;\n };\n\n function getScreenEventPositionFor(source) {\n var canvas = model._view.getCanvas();\n\n var bounds = canvas.getBoundingClientRect();\n var scaleX = canvas.width / bounds.width;\n var scaleY = canvas.height / bounds.height;\n var position = {\n x: scaleX * (source.clientX - bounds.left),\n y: scaleY * (bounds.height - source.clientY + bounds.top),\n z: 0\n }; // if multitouch, do not update the current renderer\n\n if (pointerCache.size <= 1 || !model.currentRenderer) {\n updateCurrentRenderer(position.x, position.y);\n }\n\n return position;\n }\n\n function getModifierKeysFor(event) {\n return {\n controlKey: event.ctrlKey,\n altKey: event.altKey,\n shiftKey: event.shiftKey\n };\n }\n\n function getKeysFor(event) {\n var modifierKeys = getModifierKeysFor(event);\n\n var keys = _objectSpread({\n key: event.key,\n keyCode: event.charCode\n }, modifierKeys);\n\n return keys;\n }\n\n function getDeviceTypeFor(event) {\n return event.pointerType || '';\n }\n\n publicAPI.bindEvents = function (container) {\n model.container = container;\n container.addEventListener('contextmenu', preventDefault);\n container.addEventListener('wheel', publicAPI.handleWheel);\n container.addEventListener('DOMMouseScroll', publicAPI.handleWheel);\n container.addEventListener('pointerenter', publicAPI.handlePointerEnter);\n container.addEventListener('pointerleave', publicAPI.handlePointerLeave);\n container.addEventListener('pointermove', publicAPI.handlePointerMove, {\n passive: false\n });\n container.addEventListener('pointerdown', publicAPI.handlePointerDown, {\n passive: false\n });\n container.addEventListener('pointerup', publicAPI.handlePointerUp);\n container.addEventListener('pointercancel', publicAPI.handlePointerCancel);\n document.addEventListener('keypress', publicAPI.handleKeyPress);\n document.addEventListener('keydown', publicAPI.handleKeyDown);\n document.addEventListener('keyup', publicAPI.handleKeyUp);\n document.addEventListener('pointerlockchange', publicAPI.handlePointerLockChange); // using touchAction is more performant than preventDefault\n // in a touchstart handler.\n\n container.style.touchAction = 'none';\n container.style.userSelect = 'none'; // disables tap highlight for when cursor is pointer\n\n container.style.webkitTapHighlightColor = 'rgba(0,0,0,0)';\n };\n\n publicAPI.unbindEvents = function () {\n var container = model.container;\n container.removeEventListener('contextmenu', preventDefault);\n container.removeEventListener('wheel', publicAPI.handleWheel);\n container.removeEventListener('DOMMouseScroll', publicAPI.handleWheel);\n container.removeEventListener('pointerenter', publicAPI.handlePointerEnter);\n container.removeEventListener('pointerleave', publicAPI.handlePointerLeave);\n container.removeEventListener('pointermove', publicAPI.handlePointerMove, {\n passive: false\n });\n container.removeEventListener('pointerdown', publicAPI.handlePointerDown, {\n passive: false\n });\n container.removeEventListener('pointerup', publicAPI.handlePointerUp);\n container.removeEventListener('pointercancel', publicAPI.handlePointerCancel);\n document.removeEventListener('keypress', publicAPI.handleKeyPress);\n document.removeEventListener('keydown', publicAPI.handleKeyDown);\n document.removeEventListener('keyup', publicAPI.handleKeyUp);\n document.removeEventListener('pointerlockchange', publicAPI.handlePointerLockChange);\n model.container = null;\n pointerCache.clear();\n };\n\n publicAPI.handleKeyPress = function (event) {\n var data = getKeysFor(event);\n publicAPI.keyPressEvent(data);\n };\n\n publicAPI.handleKeyDown = function (event) {\n var data = getKeysFor(event);\n publicAPI.keyDownEvent(data);\n };\n\n publicAPI.handleKeyUp = function (event) {\n var data = getKeysFor(event);\n publicAPI.keyUpEvent(data);\n };\n\n publicAPI.handlePointerEnter = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.pointerEnterEvent(callData);\n\n if (callData.deviceType === 'mouse') {\n publicAPI.mouseEnterEvent(callData);\n }\n };\n\n publicAPI.handlePointerLeave = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.pointerLeaveEvent(callData);\n\n if (callData.deviceType === 'mouse') {\n publicAPI.mouseLeaveEvent(callData);\n }\n };\n\n publicAPI.handlePointerDown = function (event) {\n if (event.button > 2 || publicAPI.isPointerLocked()) {\n // ignore events from extra mouse buttons such as `back` and `forward`\n return;\n }\n\n if (model.preventDefaultOnPointerDown) {\n preventDefault(event);\n }\n\n if (event.target.hasPointerCapture(event.pointerId)) {\n event.target.releasePointerCapture(event.pointerId);\n }\n\n model.container.setPointerCapture(event.pointerId);\n\n if (pointerCache.has(event.pointerId)) {\n vtkWarningMacro('[RenderWindowInteractor] duplicate pointerId detected');\n }\n\n pointerCache.set(event.pointerId, {\n pointerId: event.pointerId,\n position: getScreenEventPositionFor(event)\n });\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchStart(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseDown(event);\n break;\n }\n };\n\n publicAPI.handlePointerUp = function (event) {\n if (pointerCache.has(event.pointerId)) {\n if (model.preventDefaultOnPointerUp) {\n preventDefault(event);\n }\n\n pointerCache.delete(event.pointerId);\n model.container.releasePointerCapture(event.pointerId);\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchEnd(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseUp(event);\n break;\n }\n }\n };\n\n publicAPI.handlePointerCancel = function (event) {\n if (pointerCache.has(event.pointerId)) {\n pointerCache.delete(event.pointerId);\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchEnd(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseUp(event);\n break;\n }\n }\n };\n\n publicAPI.handlePointerMove = function (event) {\n if (pointerCache.has(event.pointerId)) {\n var pointer = pointerCache.get(event.pointerId);\n pointer.position = getScreenEventPositionFor(event);\n }\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchMove(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseMove(event);\n break;\n }\n };\n\n publicAPI.handleMouseDown = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n switch (event.button) {\n case 0:\n publicAPI.leftButtonPressEvent(callData);\n break;\n\n case 1:\n publicAPI.middleButtonPressEvent(callData);\n break;\n\n case 2:\n publicAPI.rightButtonPressEvent(callData);\n break;\n\n default:\n vtkErrorMacro(\"Unknown mouse button pressed: \".concat(event.button));\n break;\n }\n }; //----------------------------------------------------------------------\n\n\n publicAPI.requestPointerLock = function () {\n if (model.container) {\n model.container.requestPointerLock();\n }\n }; //----------------------------------------------------------------------\n\n\n publicAPI.exitPointerLock = function () {\n return document.exitPointerLock();\n }; //----------------------------------------------------------------------\n\n\n publicAPI.isPointerLocked = function () {\n return !!model.container && document.pointerLockElement === model.container;\n }; //----------------------------------------------------------------------\n\n\n publicAPI.handlePointerLockChange = function () {\n if (publicAPI.isPointerLocked()) {\n publicAPI.startPointerLockEvent();\n } else {\n publicAPI.endPointerLockEvent();\n }\n }; //----------------------------------------------------------------------\n\n\n function forceRender() {\n if (model._view && model.enabled && model.enableRender) {\n model.inRender = true;\n\n model._view.traverseAllPasses();\n\n model.inRender = false;\n } // outside the above test so that third-party code can redirect\n // the render to the appropriate class\n\n\n publicAPI.invokeRenderEvent();\n }\n\n publicAPI.requestAnimation = function (requestor) {\n if (requestor === undefined) {\n vtkErrorMacro(\"undefined requester, can not start animating\");\n return;\n }\n\n if (animationRequesters.has(requestor)) {\n vtkWarningMacro(\"requester is already registered for animating\");\n return;\n }\n\n animationRequesters.add(requestor);\n\n if (!model.animationRequest && animationRequesters.size === 1 && !model.xrAnimation) {\n model._animationStartTime = Date.now();\n model._animationFrameCount = 0;\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n publicAPI.startAnimationEvent();\n }\n }; // continue animating for at least the specified duration of\n // milliseconds.\n\n\n publicAPI.extendAnimation = function (duration) {\n var newEnd = Date.now() + duration;\n model._animationExtendedEnd = Math.max(model._animationExtendedEnd, newEnd);\n\n if (!model.animationRequest && animationRequesters.size === 0 && !model.xrAnimation) {\n model._animationStartTime = Date.now();\n model._animationFrameCount = 0;\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n publicAPI.startAnimationEvent();\n }\n };\n\n publicAPI.isAnimating = function () {\n return model.xrAnimation || model.animationRequest !== null;\n };\n\n publicAPI.cancelAnimation = function (requestor) {\n var skipWarning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!animationRequesters.has(requestor)) {\n if (!skipWarning) {\n var requestStr = requestor && requestor.getClassName ? requestor.getClassName() : requestor;\n vtkWarningMacro(\"\".concat(requestStr, \" did not request an animation\"));\n }\n\n return;\n }\n\n animationRequesters.delete(requestor);\n\n if (model.animationRequest && animationRequesters.size === 0 && Date.now() > model._animationExtendedEnd) {\n cancelAnimationFrame(model.animationRequest);\n model.animationRequest = null;\n publicAPI.endAnimationEvent();\n publicAPI.render();\n }\n };\n\n publicAPI.switchToXRAnimation = function () {\n // cancel existing animation if any\n if (model.animationRequest) {\n cancelAnimationFrame(model.animationRequest);\n model.animationRequest = null;\n }\n\n model.xrAnimation = true;\n };\n\n publicAPI.returnFromXRAnimation = function () {\n model.xrAnimation = false;\n\n if (animationRequesters.size !== 0) {\n model.recentAnimationFrameRate = 10.0;\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n }\n };\n\n publicAPI.updateXRGamepads = function (xrSession, xrFrame, xrRefSpace) {\n // watch for when buttons change state and fire events\n xrSession.inputSources.forEach(function (inputSource) {\n var gripPose = inputSource.gripSpace == null ? null : xrFrame.getPose(inputSource.gripSpace, xrRefSpace);\n var gp = inputSource.gamepad;\n var hand = inputSource.handedness;\n\n if (gp) {\n if (!(gp.index in model.lastGamepadValues)) {\n model.lastGamepadValues[gp.index] = {\n left: {\n buttons: {}\n },\n right: {\n buttons: {}\n },\n none: {\n buttons: {}\n }\n };\n }\n\n for (var b = 0; b < gp.buttons.length; ++b) {\n if (!(b in model.lastGamepadValues[gp.index][hand].buttons)) {\n model.lastGamepadValues[gp.index][hand].buttons[b] = false;\n }\n\n if (model.lastGamepadValues[gp.index][hand].buttons[b] !== gp.buttons[b].pressed && gripPose != null) {\n publicAPI.button3DEvent({\n gamepad: gp,\n position: gripPose.transform.position,\n orientation: gripPose.transform.orientation,\n pressed: gp.buttons[b].pressed,\n device: inputSource.handedness === 'left' ? Device.LeftController : Device.RightController,\n input: deviceInputMap[gp.mapping] && deviceInputMap[gp.mapping][b] ? deviceInputMap[gp.mapping][b] : Input.Trigger\n });\n model.lastGamepadValues[gp.index][hand].buttons[b] = gp.buttons[b].pressed;\n }\n\n if (model.lastGamepadValues[gp.index][hand].buttons[b] && gripPose != null) {\n publicAPI.move3DEvent({\n gamepad: gp,\n position: gripPose.transform.position,\n orientation: gripPose.transform.orientation,\n device: inputSource.handedness === 'left' ? Device.LeftController : Device.RightController\n });\n }\n }\n }\n });\n };\n\n publicAPI.handleMouseMove = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n if (model.moveTimeoutID === 0) {\n publicAPI.startMouseMoveEvent(callData);\n } else {\n publicAPI.mouseMoveEvent(callData);\n clearTimeout(model.moveTimeoutID);\n } // start a timer to keep us animating while we get mouse move events\n\n\n model.moveTimeoutID = setTimeout(function () {\n publicAPI.endMouseMoveEvent();\n model.moveTimeoutID = 0;\n }, 200);\n };\n\n publicAPI.handleAnimation = function () {\n var currTime = Date.now();\n model._animationFrameCount++;\n\n if (currTime - model._animationStartTime > 1000.0 && model._animationFrameCount > 1) {\n model.recentAnimationFrameRate = 1000.0 * (model._animationFrameCount - 1) / (currTime - model._animationStartTime);\n model.lastFrameTime = 1.0 / model.recentAnimationFrameRate;\n publicAPI.animationFrameRateUpdateEvent();\n model._animationStartTime = currTime;\n model._animationFrameCount = 1;\n }\n\n publicAPI.animationEvent();\n forceRender();\n\n if (animationRequesters.size > 0 || Date.now() < model._animationExtendedEnd) {\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n } else {\n cancelAnimationFrame(model.animationRequest);\n model.animationRequest = null;\n publicAPI.endAnimationEvent();\n publicAPI.render();\n }\n };\n\n publicAPI.handleWheel = function (event) {\n preventDefault(event);\n /**\n * wheel event values can vary significantly across browsers, platforms\n * and devices [1]. `normalizeWheel` uses facebook's solution from their\n * fixed-data-table repository [2].\n *\n * [1] https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel\n * [2] https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\n *\n * This code will return an object with properties:\n *\n * spinX -- normalized spin speed (use for zoom) - x plane\n * spinY -- \" - y plane\n * pixelX -- normalized distance (to pixels) - x plane\n * pixelY -- \" - y plane\n *\n */\n\n var callData = _objectSpread(_objectSpread(_objectSpread({}, normalizeWheel(event)), getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n }); // Wheel events are thought to scroll pages (i.e. multiple lines at once).\n // See normalizeWheel() documentation for more context.\n // While trackpad wheel events are many small (<1) wheel spins,\n // mouse wheel events have absolute spin values higher than 1.\n // Here the first spin value is \"recorded\", and used to normalize\n // all the following mouse wheel events.\n\n\n if (model.wheelTimeoutID === 0) {\n // we attempt to distinguish between trackpads and mice\n // .3 will be larger than the first trackpad event,\n // but small enough to detect some common edge case mice\n if (Math.abs(callData.spinY) >= 0.3) {\n // Event is coming from mouse wheel\n wheelCoefficient = Math.abs(callData.spinY);\n } else {\n // Event is coming from trackpad\n wheelCoefficient = 1;\n }\n }\n\n callData.spinY /= wheelCoefficient;\n\n if (model.wheelTimeoutID === 0) {\n publicAPI.startMouseWheelEvent(callData);\n publicAPI.mouseWheelEvent(callData);\n } else {\n publicAPI.mouseWheelEvent(callData);\n clearTimeout(model.wheelTimeoutID);\n }\n\n if (model.mouseScrollDebounceByPass) {\n publicAPI.extendAnimation(600);\n publicAPI.endMouseWheelEvent();\n model.wheelTimeoutID = 0;\n } else {\n // start a timer to keep us animating while we get wheel events\n model.wheelTimeoutID = setTimeout(function () {\n publicAPI.extendAnimation(600);\n publicAPI.endMouseWheelEvent();\n model.wheelTimeoutID = 0;\n }, 200);\n }\n };\n\n publicAPI.handleMouseUp = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n switch (event.button) {\n case 0:\n publicAPI.leftButtonReleaseEvent(callData);\n break;\n\n case 1:\n publicAPI.middleButtonReleaseEvent(callData);\n break;\n\n case 2:\n publicAPI.rightButtonReleaseEvent(callData);\n break;\n\n default:\n vtkErrorMacro(\"Unknown mouse button released: \".concat(event.button));\n break;\n }\n };\n\n publicAPI.handleTouchStart = function (event) {\n var pointers = _toConsumableArray(pointerCache.values()); // If multitouch\n\n\n if (model.recognizeGestures && pointers.length > 1) {\n var positions = pointerCacheToPositions(pointerCache); // did we just transition to multitouch?\n\n if (pointers.length === 2) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonReleaseEvent(callData);\n } // handle the gesture\n\n\n publicAPI.recognizeGesture('TouchStart', positions);\n } else if (pointers.length === 1) {\n var _callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonPressEvent(_callData);\n }\n };\n\n publicAPI.handleTouchMove = function (event) {\n var pointers = _toConsumableArray(pointerCache.values());\n\n if (model.recognizeGestures && pointers.length > 1) {\n var positions = pointerCacheToPositions(pointerCache);\n publicAPI.recognizeGesture('TouchMove', positions);\n } else if (pointers.length === 1) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.mouseMoveEvent(callData);\n }\n };\n\n publicAPI.handleTouchEnd = function (event) {\n var pointers = _toConsumableArray(pointerCache.values());\n\n if (model.recognizeGestures) {\n // No more fingers down\n if (pointers.length === 0) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonReleaseEvent(callData);\n } else if (pointers.length === 1) {\n // If one finger left, end touch and start button press\n var positions = pointerCacheToPositions(pointerCache);\n publicAPI.recognizeGesture('TouchEnd', positions);\n\n var _callData2 = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonPressEvent(_callData2);\n } else {\n // If more than one finger left, keep touch move\n var _positions = pointerCacheToPositions(pointerCache);\n\n publicAPI.recognizeGesture('TouchMove', _positions);\n }\n } else if (pointers.length === 1) {\n var _callData3 = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonReleaseEvent(_callData3);\n }\n };\n\n publicAPI.setView = function (val) {\n if (model._view === val) {\n return;\n }\n\n model._view = val;\n\n model._view.getRenderable().setInteractor(publicAPI);\n\n publicAPI.modified();\n };\n\n publicAPI.getFirstRenderer = function () {\n var _model$_view, _model$_view$getRende, _model$_view$getRende2;\n\n return (_model$_view = model._view) === null || _model$_view === void 0 ? void 0 : (_model$_view$getRende = _model$_view.getRenderable()) === null || _model$_view$getRende === void 0 ? void 0 : (_model$_view$getRende2 = _model$_view$getRende.getRenderersByReference()) === null || _model$_view$getRende2 === void 0 ? void 0 : _model$_view$getRende2[0];\n };\n\n publicAPI.findPokedRenderer = function () {\n var _model$_view2, _model$_view2$getRend;\n\n var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!model._view) {\n return null;\n } // The original order of renderers needs to remain as\n // the first one is the one we want to manipulate the camera on.\n\n\n var rc = (_model$_view2 = model._view) === null || _model$_view2 === void 0 ? void 0 : (_model$_view2$getRend = _model$_view2.getRenderable()) === null || _model$_view2$getRend === void 0 ? void 0 : _model$_view2$getRend.getRenderers();\n\n if (!rc || rc.length === 0) {\n return null;\n }\n\n rc.sort(function (a, b) {\n return a.getLayer() - b.getLayer();\n });\n var interactiveren = null;\n var viewportren = null;\n var currentRenderer = null;\n var count = rc.length;\n\n while (count--) {\n var aren = rc[count];\n\n if (model._view.isInViewport(x, y, aren) && aren.getInteractive()) {\n currentRenderer = aren;\n break;\n }\n\n if (interactiveren === null && aren.getInteractive()) {\n // Save this renderer in case we can't find one in the viewport that\n // is interactive.\n interactiveren = aren;\n }\n\n if (viewportren === null && model._view.isInViewport(x, y, aren)) {\n // Save this renderer in case we can't find one in the viewport that\n // is interactive.\n viewportren = aren;\n }\n } // We must have a value. If we found an interactive renderer before, that's\n // better than a non-interactive renderer.\n\n\n if (currentRenderer === null) {\n currentRenderer = interactiveren;\n } // We must have a value. If we found a renderer that is in the viewport,\n // that is better than any old viewport (but not as good as an interactive\n // one).\n\n\n if (currentRenderer === null) {\n currentRenderer = viewportren;\n } // We must have a value - take anything.\n\n\n if (currentRenderer == null) {\n currentRenderer = rc[0];\n }\n\n return currentRenderer;\n }; // only render if we are not animating. If we are animating\n // then renders will happen naturally anyhow and we definitely\n // do not want extra renders as the make the apparent interaction\n // rate slower.\n\n\n publicAPI.render = function () {\n if (!publicAPI.isAnimating() && !model.inRender) {\n forceRender();\n }\n }; // create the generic Event methods\n\n\n handledEvents.forEach(function (eventName) {\n var lowerFirst = eventName.charAt(0).toLowerCase() + eventName.slice(1);\n\n publicAPI[\"\".concat(lowerFirst, \"Event\")] = function (arg) {\n // Check that interactor enabled\n if (!model.enabled) {\n return;\n } // Check that a poked renderer exists\n\n\n var renderer = publicAPI.getCurrentRenderer();\n\n if (!renderer) {\n vtkOnceErrorMacro(\"\\n Can not forward events without a current renderer on the interactor.\\n \");\n return;\n } // Pass the eventName and the poked renderer\n\n\n var callData = _objectSpread({\n type: eventName,\n pokedRenderer: model.currentRenderer,\n firstRenderer: publicAPI.getFirstRenderer()\n }, arg); // Call invoke\n\n\n publicAPI[\"invoke\".concat(eventName)](callData);\n };\n }); // we know we are in multitouch now, so start recognizing\n\n publicAPI.recognizeGesture = function (event, positions) {\n // more than two pointers we ignore\n if (Object.keys(positions).length > 2) {\n return;\n }\n\n if (!model.startingEventPositions) {\n model.startingEventPositions = {};\n } // store the initial positions\n\n\n if (event === 'TouchStart') {\n Object.keys(positions).forEach(function (key) {\n model.startingEventPositions[key] = positions[key];\n }); // we do not know what the gesture is yet\n\n model.currentGesture = 'Start';\n return;\n } // end the gesture if needed\n\n\n if (event === 'TouchEnd') {\n if (model.currentGesture === 'Pinch') {\n publicAPI.render();\n publicAPI.endPinchEvent();\n }\n\n if (model.currentGesture === 'Rotate') {\n publicAPI.render();\n publicAPI.endRotateEvent();\n }\n\n if (model.currentGesture === 'Pan') {\n publicAPI.render();\n publicAPI.endPanEvent();\n }\n\n model.currentGesture = 'Start';\n model.startingEventPositions = {};\n return;\n } // what are the two pointers we are working with\n\n\n var count = 0;\n var posVals = [];\n var startVals = [];\n Object.keys(positions).forEach(function (key) {\n posVals[count] = positions[key];\n startVals[count] = model.startingEventPositions[key];\n count++;\n }); // The meat of the algorithm\n // on move events we analyze them to determine what type\n // of movement it is and then deal with it.\n // calculate the distances\n\n var originalDistance = Math.sqrt((startVals[0].x - startVals[1].x) * (startVals[0].x - startVals[1].x) + (startVals[0].y - startVals[1].y) * (startVals[0].y - startVals[1].y));\n var newDistance = Math.sqrt((posVals[0].x - posVals[1].x) * (posVals[0].x - posVals[1].x) + (posVals[0].y - posVals[1].y) * (posVals[0].y - posVals[1].y)); // calculate rotations\n\n var originalAngle = degreesFromRadians(Math.atan2(startVals[1].y - startVals[0].y, startVals[1].x - startVals[0].x));\n var newAngle = degreesFromRadians(Math.atan2(posVals[1].y - posVals[0].y, posVals[1].x - posVals[0].x)); // angles are cyclic so watch for that, 1 and 359 are only 2 apart :)\n\n var angleDeviation = newAngle - originalAngle;\n newAngle = newAngle + 180.0 >= 360.0 ? newAngle - 180.0 : newAngle + 180.0;\n originalAngle = originalAngle + 180.0 >= 360.0 ? originalAngle - 180.0 : originalAngle + 180.0;\n\n if (Math.abs(newAngle - originalAngle) < Math.abs(angleDeviation)) {\n angleDeviation = newAngle - originalAngle;\n } // calculate the translations\n\n\n var trans = [];\n trans[0] = (posVals[0].x - startVals[0].x + posVals[1].x - startVals[1].x) / 2.0;\n trans[1] = (posVals[0].y - startVals[0].y + posVals[1].y - startVals[1].y) / 2.0;\n\n if (event === 'TouchMove') {\n // OK we want to\n // - immediately respond to the user\n // - allow the user to zoom without panning (saves focal point)\n // - allow the user to rotate without panning (saves focal point)\n // do we know what gesture we are doing yet? If not\n // see if we can figure it out\n if (model.currentGesture === 'Start') {\n // pinch is a move to/from the center point\n // rotate is a move along the circumference\n // pan is a move of the center point\n // compute the distance along each of these axes in pixels\n // the first to break thresh wins\n var thresh = 0.01 * Math.sqrt(model.container.clientWidth * model.container.clientWidth + model.container.clientHeight * model.container.clientHeight);\n\n if (thresh < 15.0) {\n thresh = 15.0;\n }\n\n var pinchDistance = Math.abs(newDistance - originalDistance);\n var rotateDistance = newDistance * 3.1415926 * Math.abs(angleDeviation) / 360.0;\n var panDistance = Math.sqrt(trans[0] * trans[0] + trans[1] * trans[1]);\n\n if (pinchDistance > thresh && pinchDistance > rotateDistance && pinchDistance > panDistance) {\n model.currentGesture = 'Pinch';\n var callData = {\n scale: 1.0,\n touches: positions\n };\n publicAPI.startPinchEvent(callData);\n } else if (rotateDistance > thresh && rotateDistance > panDistance) {\n model.currentGesture = 'Rotate';\n var _callData4 = {\n rotation: 0.0,\n touches: positions\n };\n publicAPI.startRotateEvent(_callData4);\n } else if (panDistance > thresh) {\n model.currentGesture = 'Pan';\n var _callData5 = {\n translation: [0, 0],\n touches: positions\n };\n publicAPI.startPanEvent(_callData5);\n }\n } else {\n // if we have found a specific type of movement then\n // handle it\n if (model.currentGesture === 'Rotate') {\n var _callData6 = {\n rotation: angleDeviation,\n touches: positions\n };\n publicAPI.rotateEvent(_callData6);\n }\n\n if (model.currentGesture === 'Pinch') {\n var _callData7 = {\n scale: newDistance / originalDistance,\n touches: positions\n };\n publicAPI.pinchEvent(_callData7);\n }\n\n if (model.currentGesture === 'Pan') {\n var _callData8 = {\n translation: trans,\n touches: positions\n };\n publicAPI.panEvent(_callData8);\n }\n }\n }\n };\n\n publicAPI.handleVisibilityChange = function () {\n model._animationStartTime = Date.now();\n model._animationFrameCount = 0;\n };\n\n publicAPI.setCurrentRenderer = function (r) {\n model._forcedRenderer = !!r;\n model.currentRenderer = r;\n }; // Stop animating if the renderWindowInteractor is deleted.\n\n\n var superDelete = publicAPI.delete;\n\n publicAPI.delete = function () {\n while (animationRequesters.size) {\n publicAPI.cancelAnimation(animationRequesters.values().next().value);\n }\n\n if (typeof document.hidden !== 'undefined') {\n document.removeEventListener('visibilitychange', publicAPI.handleVisibilityChange);\n }\n\n if (model.container) {\n publicAPI.unbindEvents();\n }\n\n superDelete();\n }; // Use the Page Visibility API to detect when we switch away from or back to\n // this tab, and reset the animationFrameStart. When tabs are not active, browsers\n // will stop calling requestAnimationFrame callbacks.\n\n\n if (typeof document.hidden !== 'undefined') {\n document.addEventListener('visibilitychange', publicAPI.handleVisibilityChange, false);\n }\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n renderWindow: null,\n interactorStyle: null,\n picker: null,\n pickingManager: null,\n initialized: false,\n enabled: false,\n enableRender: true,\n currentRenderer: null,\n lightFollowCamera: true,\n desiredUpdateRate: 30.0,\n stillUpdateRate: 2.0,\n container: null,\n // _view: null,\n recognizeGestures: true,\n currentGesture: 'Start',\n animationRequest: null,\n lastFrameTime: 0.1,\n recentAnimationFrameRate: 10.0,\n wheelTimeoutID: 0,\n moveTimeoutID: 0,\n lastGamepadValues: {},\n preventDefaultOnPointerDown: false,\n preventDefaultOnPointerUp: false,\n mouseScrollDebounceByPass: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model); // run animation at least until this time\n\n model._animationExtendedEnd = 0;\n macro.event(publicAPI, model, 'RenderEvent');\n handledEvents.forEach(function (eventName) {\n return macro.event(publicAPI, model, eventName);\n }); // Create get-only macros\n\n macro.get(publicAPI, model, ['initialized', 'container', 'interactorStyle', 'lastFrameTime', 'recentAnimationFrameRate', '_view']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['lightFollowCamera', 'enabled', 'enableRender', 'recognizeGestures', 'desiredUpdateRate', 'stillUpdateRate', 'picker', 'preventDefaultOnPointerDown', 'preventDefaultOnPointerUp', 'mouseScrollDebounceByPass']);\n macro.moveToProtected(publicAPI, model, ['view']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkRenderWindowInteractor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderWindowInteractor'); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindowInteractor$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend,\n handledEvents: handledEvents\n}, Constants);\n\nexport { vtkRenderWindowInteractor$1 as default, extend, newInstance };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkStreamingOpenGLRenderWindow from './vtkStreamingOpenGLRenderWindow';\nimport vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';\nimport vtkRenderWindow from '@kitware/vtk.js/Rendering/Core/RenderWindow';\nimport vtkRenderWindowInteractor from '@kitware/vtk.js/Rendering/Core/RenderWindowInteractor';\n\n// Load basic classes for vtk() factory\nimport '@kitware/vtk.js/Common/Core/Points';\nimport '@kitware/vtk.js/Common/Core/DataArray';\nimport '@kitware/vtk.js/Common/DataModel/PolyData';\nimport '@kitware/vtk.js/Rendering/Core/Actor';\nimport '@kitware/vtk.js/Rendering/Core/Mapper';\n\n/**\n * vtkOffscreenMultiRenderWindow - A class to deal with offscreen rendering with multiple renderers.\n *\n * This class is based on the vtkGenericRenderWindow with two key differences:\n * - the vtkGenericRenderWindow had a renderer at the top level, with helpers to get it from the renderWindow.\n * although you could add more renderers, this gave special status to the first viewport. Which was confusing.\n * - When checking the size of the container element we no longer check the client size, as the canvas is offscreen.\n * - We aren't using interactor styles, so don't set one up.\n *\n * Additionally this class has some new helpers to easily add/associate renderers to different viewportIds.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkOffscreenMultiRenderWindow(publicAPI, model) {\n // Capture resize trigger method to remove from publicAPI\n const invokeResize = publicAPI.invokeResize;\n delete publicAPI.invokeResize;\n\n // VTK renderWindow. No renderers set by default\n model.renderWindow = vtkRenderWindow.newInstance();\n model.rendererMap = {};\n\n // OpenGLRenderWindow\n model.openGLRenderWindow = vtkStreamingOpenGLRenderWindow.newInstance();\n model.renderWindow.addView(model.openGLRenderWindow);\n\n // Interactor\n model.interactor = vtkRenderWindowInteractor.newInstance();\n model.interactor.setView(model.openGLRenderWindow);\n model.interactor.initialize();\n\n publicAPI.addRenderer = ({ viewport, id, background }) => {\n const renderer = vtkRenderer.newInstance({\n viewport,\n background: background || model.background,\n });\n\n model.renderWindow.addRenderer(renderer);\n model.rendererMap[id] = renderer;\n };\n\n publicAPI.destroy = () => {\n const rwi = model.renderWindow.getInteractor();\n rwi.delete();\n };\n\n publicAPI.removeRenderer = (id) => {\n const renderer = publicAPI.getRenderer(id);\n model.renderWindow.removeRenderer(renderer);\n renderer.delete();\n delete model.rendererMap[id];\n };\n\n publicAPI.getRenderer = (id) => {\n return model.rendererMap[id];\n };\n\n publicAPI.getRenderers = () => {\n const { rendererMap } = model;\n\n const renderers = Object.keys(rendererMap).map((id) => {\n return { id, renderer: rendererMap[id] };\n });\n\n return renderers;\n };\n\n // Handle window resize\n publicAPI.resize = () => {\n if (model.container) {\n // Don't use getBoundingClientRect() as in vtkGenericRenderWindow as is an offscreen canvas.\n const { width, height } = model.container;\n\n // Note: we do not scale by devicePixelRatio here because it has already\n // been done when adding the offscreenCanvas viewport representations\n model.openGLRenderWindow.setSize(Math.floor(width), Math.floor(height));\n invokeResize();\n model.renderWindow.render();\n }\n };\n\n // Handle DOM container relocation\n publicAPI.setContainer = (el) => {\n // Switch container\n model.container = el;\n model.openGLRenderWindow.setContainer(model.container);\n };\n\n // Properly release GL context\n publicAPI.delete = macro.chain(\n publicAPI.setContainer,\n publicAPI.destroy,\n model.openGLRenderWindow.delete,\n publicAPI.delete\n );\n\n publicAPI.resize();\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n background: [0.0, 0.0, 0.0],\n container: null,\n};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n // Object methods\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, [\n 'renderWindow',\n 'openGLRenderWindow',\n 'interactor',\n 'container',\n ]);\n macro.event(publicAPI, model, 'resize');\n\n // Object specific methods\n vtkOffscreenMultiRenderWindow(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { N as createUninitializedBounds, C as clampValue, J as floor } from '../../Common/Core/Math/index.js';\nimport Constants from './VolumeMapper/Constants.js';\nimport vtkAbstractMapper from './AbstractMapper.js';\nimport vtkPiecewiseFunction from '../../Common/DataModel/PiecewiseFunction.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar BlendMode = Constants.BlendMode,\n FilterMode = Constants.FilterMode;\n\nfunction createRadonTransferFunction(firstAbsorbentMaterialHounsfieldValue, firstAbsorbentMaterialAbsorption, maxAbsorbentMaterialHounsfieldValue, maxAbsorbentMaterialAbsorption, outputTransferFunction) {\n var ofun = null;\n\n if (outputTransferFunction) {\n ofun = outputTransferFunction;\n ofun.removeAllPoints();\n } else {\n ofun = vtkPiecewiseFunction.newInstance();\n }\n\n ofun.addPointLong(-1024, 0, 1, 1); // air (i.e. material with no absorption)\n\n ofun.addPoint(firstAbsorbentMaterialHounsfieldValue, firstAbsorbentMaterialAbsorption);\n ofun.addPoint(maxAbsorbentMaterialHounsfieldValue, maxAbsorbentMaterialAbsorption);\n return ofun;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n createRadonTransferFunction: createRadonTransferFunction\n}; // ----------------------------------------------------------------------------\n// vtkVolumeMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkVolumeMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkVolumeMapper');\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getBounds = function () {\n var input = publicAPI.getInputData();\n\n if (!input) {\n model.bounds = createUninitializedBounds();\n } else {\n if (!model.static) {\n publicAPI.update();\n }\n\n model.bounds = input.getBounds();\n }\n\n return model.bounds;\n };\n\n publicAPI.update = function () {\n publicAPI.getInputData();\n };\n\n publicAPI.setBlendModeToComposite = function () {\n publicAPI.setBlendMode(BlendMode.COMPOSITE_BLEND);\n };\n\n publicAPI.setBlendModeToMaximumIntensity = function () {\n publicAPI.setBlendMode(BlendMode.MAXIMUM_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToMinimumIntensity = function () {\n publicAPI.setBlendMode(BlendMode.MINIMUM_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToAverageIntensity = function () {\n publicAPI.setBlendMode(BlendMode.AVERAGE_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToAdditiveIntensity = function () {\n publicAPI.setBlendMode(BlendMode.ADDITIVE_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToRadonTransform = function () {\n publicAPI.setBlendMode(BlendMode.RADON_TRANSFORM_BLEND);\n };\n\n publicAPI.getBlendModeAsString = function () {\n return macro.enumToString(BlendMode, model.blendMode);\n };\n\n publicAPI.setAverageIPScalarRange = function (min, max) {\n console.warn('setAverageIPScalarRange is deprecated use setIpScalarRange');\n publicAPI.setIpScalarRange(min, max);\n };\n\n publicAPI.getFilterModeAsString = function () {\n return macro.enumToString(FilterMode, model.filterMode);\n };\n\n publicAPI.setFilterModeToOff = function () {\n publicAPI.setFilterMode(FilterMode.OFF);\n };\n\n publicAPI.setFilterModeToNormalized = function () {\n publicAPI.setFilterMode(FilterMode.NORMALIZED);\n };\n\n publicAPI.setFilterModeToRaw = function () {\n publicAPI.setFilterMode(FilterMode.RAW);\n };\n\n publicAPI.setGlobalIlluminationReach = function (gl) {\n return superClass.setGlobalIlluminationReach(clampValue(gl, 0.0, 1.0));\n };\n\n publicAPI.setVolumetricScatteringBlending = function (vsb) {\n return superClass.setVolumetricScatteringBlending(clampValue(vsb, 0.0, 1.0));\n };\n\n publicAPI.setVolumeShadowSamplingDistFactor = function (vsdf) {\n return superClass.setVolumeShadowSamplingDistFactor(vsdf >= 1.0 ? vsdf : 1.0);\n };\n\n publicAPI.setAnisotropy = function (at) {\n return superClass.setAnisotropy(clampValue(at, -0.99, 0.99));\n };\n\n publicAPI.setLAOKernelSize = function (ks) {\n return superClass.setLAOKernelSize(floor(clampValue(ks, 1, 32)));\n };\n\n publicAPI.setLAOKernelRadius = function (kr) {\n return superClass.setLAOKernelRadius(kr >= 1 ? kr : 1);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n// TODO: what values to use for averageIPScalarRange to get GLSL to use max / min values like [-Math.inf, Math.inf]?\n\n\nvar DEFAULT_VALUES = {\n bounds: [1, -1, 1, -1, 1, -1],\n sampleDistance: 1.0,\n imageSampleDistance: 1.0,\n maximumSamplesPerRay: 1000,\n autoAdjustSampleDistances: true,\n blendMode: BlendMode.COMPOSITE_BLEND,\n ipScalarRange: [-1000000.0, 1000000.0],\n filterMode: FilterMode.OFF,\n // ignored by WebGL so no behavior change\n preferSizeOverAccuracy: false,\n // Whether to use halfFloat representation of float, when it is inaccurate\n computeNormalFromOpacity: false,\n // volume shadow parameters\n volumetricScatteringBlending: 0.0,\n globalIlluminationReach: 0.0,\n volumeShadowSamplingDistFactor: 5.0,\n anisotropy: 0.0,\n // local ambient occlusion\n localAmbientOcclusion: false,\n LAOKernelSize: 15,\n LAOKernelRadius: 7\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkAbstractMapper.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['sampleDistance', 'imageSampleDistance', 'maximumSamplesPerRay', 'autoAdjustSampleDistances', 'blendMode', 'filterMode', 'preferSizeOverAccuracy', 'computeNormalFromOpacity', 'volumetricScatteringBlending', 'globalIlluminationReach', 'volumeShadowSamplingDistFactor', 'anisotropy', 'localAmbientOcclusion', 'LAOKernelSize', 'LAOKernelRadius']);\n macro.setGetArray(publicAPI, model, ['ipScalarRange'], 2);\n macro.event(publicAPI, model, 'lightingActivated'); // Object methods\n\n vtkVolumeMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkVolumeMapper'); // ----------------------------------------------------------------------------\n\nvar vtkVolumeMapper$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkVolumeMapper$1 as default, extend, newInstance };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper';\n\n/**\n * vtkSharedVolumeMapper - A derived class of the core vtkVolumeMapper class\n * the scalar texture in as an argument. This is so we can share the same texture\n * memory across different mappers/actors, so we don't duplicate memory usage.\n *\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n * @hidden\n */\nfunction vtkSharedVolumeMapper(publicAPI, model) {\n model.classHierarchy.push('vtkSharedVolumeMapper');\n\n const superDelete = publicAPI.delete;\n publicAPI.delete = () => {\n model.scalarTexture = null;\n superDelete();\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n scalarTexture: null,\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkVolumeMapper.extend(publicAPI, model, initialValues);\n\n macro.setGet(publicAPI, model, ['scalarTexture']);\n\n // Object methods\n vtkSharedVolumeMapper(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkSharedVolumeMapper');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture';\nimport HalfFloat from '@kitware/vtk.js/Common/Core/HalfFloat';\nimport { getConfiguration } from '../../init';\n\n/**\n * vtkStreamingOpenGLTexture - A dervied class of the core vtkOpenGLTexture.\n * This class has methods to update the texture memory on the GPU slice by slice\n * in an efficient yet GPU-architecture friendly manner.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLTexture(publicAPI, model) {\n model.classHierarchy.push('vtkStreamingOpenGLTexture');\n\n const superCreate3DFilterableFromRaw = publicAPI.create3DFilterableFromRaw;\n\n publicAPI.create3DFilterableFromRaw = (\n width,\n height,\n depth,\n numComps,\n dataType,\n data,\n preferSizeOverAccuracy\n ) => {\n model.inputDataType = dataType;\n model.inputNumComps = numComps;\n\n superCreate3DFilterableFromRaw(\n width,\n height,\n depth,\n numComps,\n dataType,\n data,\n preferSizeOverAccuracy\n );\n };\n\n /**\n * This function updates the GPU texture memory to match the current\n * representation of data held in RAM.\n *\n * @param {Float32Array|Uint8Array|Int16Array|Uint16Array} data The data array which has been updated.\n */\n publicAPI.update3DFromRaw = (data) => {\n const { updatedFrames } = model;\n\n if (!updatedFrames.length) {\n return;\n }\n model._openGLRenderWindow.activateTexture(publicAPI);\n publicAPI.createTexture();\n publicAPI.bind();\n\n let bytesPerVoxel;\n let TypedArrayConstructor;\n\n if (data instanceof Uint8Array) {\n bytesPerVoxel = 1;\n TypedArrayConstructor = Uint8Array;\n } else if (data instanceof Int16Array) {\n bytesPerVoxel = 2;\n TypedArrayConstructor = Int16Array;\n } else if (data instanceof Uint16Array) {\n bytesPerVoxel = 2;\n TypedArrayConstructor = Uint16Array;\n } else if (data instanceof Float32Array) {\n bytesPerVoxel = 4;\n TypedArrayConstructor = Float32Array;\n } else {\n throw new Error(`No support for given TypedArray.`);\n }\n\n for (let i = 0; i < updatedFrames.length; i++) {\n if (updatedFrames[i]) {\n model.fillSubImage3D(data, i, bytesPerVoxel, TypedArrayConstructor);\n }\n }\n\n // Reset updatedFrames\n model.updatedFrames = [];\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n };\n\n /**\n * This function updates the GPU texture memory to match the current\n * representation of data held in RAM.\n *\n * @param {Float32Array|Uint8Array} data The data array which has been updated.\n * @param {number} frameIndex The frame to load in.\n * @param {number} BytesPerVoxel The number of bytes per voxel in the data, so we don't have to constantly\n * check the array type.\n * @param {object} TypedArrayConstructor The constructor for the array type. Again so we don't have to constantly check.\n */\n model.fillSubImage3D = (\n data,\n frameIndex,\n bytesPerVoxel,\n TypedArrayConstructor\n ) => {\n const buffer = data.buffer;\n\n const frameLength = model.width * model.height;\n const frameLengthInBytes = frameLength * model.components * bytesPerVoxel;\n\n const zOffset = frameIndex * frameLengthInBytes;\n const rowLength = model.width * model.components;\n\n const gl = model.context;\n\n /**\n * It appears that the implementation of texSubImage3D uses 2D textures to do the texture copy if\n * MAX_TEXTURE_SIZE is greater than MAX_TEXTURE_SIZE_3D. As such if you make a single block too big\n * the transfer messes up cleanly and you render a black box or some data if you are lucky.\n *\n * This block-size based on 2D texture size seems like the safest approach that should work on most systems.\n *\n * There are certainly further optimizations that could be done here, we can do bigger chunks with other systems\n * But we need to find the _exact_ criteria. And then its not even guaranteed it'll be much faster.\n */\n const MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n let blockHeight = Math.floor(\n (bytesPerVoxel * MAX_TEXTURE_SIZE) / model.width\n );\n\n // Cap to actual frame height:\n blockHeight = Math.min(blockHeight, model.height);\n const { useNorm16Texture, preferSizeOverAccuracy } =\n getConfiguration().rendering;\n // TODO: there is currently a bug in chrome and safari which requires\n // blockheight = 1 for norm16 textures:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1408247\n // https://bugs.webkit.org/show_bug.cgi?id=252039\n if (useNorm16Texture && !preferSizeOverAccuracy) {\n blockHeight = 1;\n }\n\n const multiRowBlockLength = rowLength * blockHeight;\n const multiRowBlockLengthInBytes = multiRowBlockLength * bytesPerVoxel;\n\n const normalBlocks = Math.floor(model.height / blockHeight);\n\n const lastBlockHeight = model.height % blockHeight;\n const multiRowLastBlockLength = rowLength * lastBlockHeight;\n\n // Perform most blocks.\n for (let block = 0; block < normalBlocks; block++) {\n const yOffset = block * blockHeight;\n\n let dataView = new TypedArrayConstructor(\n buffer,\n zOffset + block * multiRowBlockLengthInBytes,\n multiRowBlockLength\n );\n\n if (\n model.useHalfFloat &&\n (TypedArrayConstructor === Uint16Array ||\n TypedArrayConstructor === Int16Array)\n ) {\n // in the case we want to use halfFloat rendering (preferSizeOverAccuracy = true),\n // we need to convert uint16 and int16 into fp16 format.\n // This is the step where precision is lost for streaming volume viewport.\n for (let idx = 0; idx < dataView.length; idx++) {\n dataView[idx] = HalfFloat.toHalf(dataView[idx]);\n }\n if (TypedArrayConstructor === Int16Array) {\n dataView = new Uint16Array(dataView);\n }\n }\n\n gl.texSubImage3D(\n model.target, // target\n 0, // mipMap level (always zero)\n 0, // xOffset\n yOffset, // yOffset\n frameIndex,\n model.width,\n blockHeight, //model.height,\n 1, // numFramesInBlock,\n model.format,\n model.openGLDataType,\n dataView\n );\n }\n\n // perform last block if present\n\n if (lastBlockHeight !== 0) {\n const yOffset = normalBlocks * blockHeight;\n\n // Dataview of last block\n const dataView = new TypedArrayConstructor(\n buffer,\n zOffset + normalBlocks * multiRowBlockLengthInBytes,\n multiRowLastBlockLength\n );\n\n gl.texSubImage3D(\n model.target, // target\n 0, // mipMap level (always zero)\n 0, // xOffset\n yOffset, // yOffset\n frameIndex,\n model.width,\n lastBlockHeight, //model.height,\n 1, // numFramesInBlock,\n model.format,\n model.openGLDataType,\n dataView\n );\n }\n };\n\n publicAPI.getTextureParameters = () => {\n return {\n width: model.width,\n height: model.height,\n depth: model.depth,\n numComps: model.inputNumComps,\n dataType: model.inputDataType,\n };\n };\n\n /**\n * Called when a frame is loaded so that on next render we know which data to load in.\n * @param {number} frameIndex The frame to load in.\n */\n publicAPI.setUpdatedFrame = (frameIndex) => {\n model.updatedFrames[frameIndex] = true;\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n updatedFrames: [],\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkOpenGLTexture.extend(publicAPI, model, initialValues);\n\n // Object methods\n vtkStreamingOpenGLTexture(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLTexture'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';\nimport { vec3, mat4 } from 'gl-matrix';\nimport vtkMath from '@kitware/vtk.js/Common/Core/Math';\n\n/**\n * vtkSlabCamera - A derived class of the core vtkCamera class\n *\n * This customization is necesssary because when we do coordinate transformations\n * we need to set the cRange between [d, d + 0.1],\n * where d is distance between the camera position and the focal point.\n * While when we render we set to the clippingRange [0.01, d * 2],\n * where d is the calculated from the bounds of all the actors.\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkSlabCamera(publicAPI, model) {\n model.classHierarchy.push('vtkSlabCamera');\n\n // Set up private variables and methods\n const tmpMatrix = mat4.identity(new Float64Array(16));\n const tmpvec1 = new Float64Array(3);\n\n /**\n * getProjectionMatrix - A fork of vtkCamera's getProjectionMatrix method.\n * This fork performs most of the same actions, but define crange around\n * model.distance when doing coordinate transformations.\n */\n publicAPI.getProjectionMatrix = (aspect, nearz, farz) => {\n const result = mat4.create();\n\n if (model.projectionMatrix) {\n const scale = 1 / model.physicalScale;\n vec3.set(tmpvec1, scale, scale, scale);\n\n mat4.copy(result, model.projectionMatrix);\n mat4.scale(result, result, tmpvec1);\n mat4.transpose(result, result);\n return result;\n }\n\n mat4.identity(tmpMatrix);\n\n let cRange0 = model.clippingRange[0];\n let cRange1 = model.clippingRange[1];\n if (model.isPerformingCoordinateTransformation) {\n /**\n * NOTE: this is necessary because we want the coordinate transformation\n * respect to the view plane (plane orthogonal to the camera and passing to\n * the focal point).\n *\n * When vtk.js computes the coordinate transformations, it simply uses the\n * camera matrix (no ray casting).\n *\n * However for the volume viewport the clipping range is set to be\n * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE).\n * The clipping range is used in the camera method getProjectionMatrix().\n * The projection matrix is used then for viewToWorld/worldToView methods of\n * the renderer. This means that vkt.js will not return the coordinates of\n * the point on the view plane (i.e. the depth coordinate will corresponded\n * to the focal point).\n *\n * Therefore the clipping range has to be set to (distance, distance + 0.01),\n * where now distance is the distance between the camera position and focal\n * point. This is done internally, in our camera customization when the flag\n * isPerformingCoordinateTransformation is set to true.\n */\n cRange0 = model.distance;\n cRange1 = model.distance + 0.1;\n }\n\n const cWidth = cRange1 - cRange0;\n const cRange = [\n cRange0 + ((nearz + 1) * cWidth) / 2.0,\n cRange0 + ((farz + 1) * cWidth) / 2.0,\n ];\n\n if (model.parallelProjection) {\n // set up a rectangular parallelipiped\n const width = model.parallelScale * aspect;\n const height = model.parallelScale;\n\n const xmin = (model.windowCenter[0] - 1.0) * width;\n const xmax = (model.windowCenter[0] + 1.0) * width;\n const ymin = (model.windowCenter[1] - 1.0) * height;\n const ymax = (model.windowCenter[1] + 1.0) * height;\n\n mat4.ortho(tmpMatrix, xmin, xmax, ymin, ymax, cRange[0], cRange[1]);\n mat4.transpose(tmpMatrix, tmpMatrix);\n } else if (model.useOffAxisProjection) {\n throw new Error('Off-Axis projection is not supported at this time');\n } else {\n const tmp = Math.tan(vtkMath.radiansFromDegrees(model.viewAngle) / 2.0);\n let width;\n let height;\n if (model.useHorizontalViewAngle === true) {\n width = cRange0 * tmp;\n height = (cRange0 * tmp) / aspect;\n } else {\n width = cRange0 * tmp * aspect;\n height = cRange0 * tmp;\n }\n\n const xmin = (model.windowCenter[0] - 1.0) * width;\n const xmax = (model.windowCenter[0] + 1.0) * width;\n const ymin = (model.windowCenter[1] - 1.0) * height;\n const ymax = (model.windowCenter[1] + 1.0) * height;\n const znear = cRange[0];\n const zfar = cRange[1];\n\n tmpMatrix[0] = (2.0 * znear) / (xmax - xmin);\n tmpMatrix[5] = (2.0 * znear) / (ymax - ymin);\n tmpMatrix[2] = (xmin + xmax) / (xmax - xmin);\n tmpMatrix[6] = (ymin + ymax) / (ymax - ymin);\n tmpMatrix[10] = -(znear + zfar) / (zfar - znear);\n tmpMatrix[14] = -1.0;\n tmpMatrix[11] = (-2.0 * znear * zfar) / (zfar - znear);\n tmpMatrix[15] = 0.0;\n }\n\n mat4.copy(result, tmpMatrix);\n\n return result;\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n isPerformingCoordinateTransformation: false,\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkCamera.extend(publicAPI, model, initialValues);\n\n macro.setGet(publicAPI, model, ['isPerformingCoordinateTransformation']);\n\n // Object methods\n vtkSlabCamera(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkSlabCamera');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import isTypedArray from '../../utilities/isTypedArray';\nimport { imageIdToURI } from '../../utilities';\nimport { vtkStreamingOpenGLTexture } from '../../RenderingEngine/vtkClasses';\nimport type { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport {\n IVolume,\n VolumeScalarData,\n Metadata,\n Point3,\n IImageVolume,\n Mat3,\n} from '../../types';\n\n/** The base class for volume data. It includes the volume metadata\n * and the volume data along with the loading status.\n */\nexport class ImageVolume implements IImageVolume {\n private _imageIds: Array;\n private _imageIdsIndexMap = new Map();\n private _imageURIsIndexMap = new Map();\n /** volume scalar data 3D or 4D */\n protected scalarData: VolumeScalarData | Array;\n\n /** Read-only unique identifier for the volume */\n readonly volumeId: string;\n\n isPreScaled = false;\n\n /** Dimensions of the volume */\n dimensions: Point3;\n /** volume direction in world space */\n direction: Mat3;\n /** volume metadata */\n metadata: Metadata;\n /** volume origin, Note this is an opinionated origin for the volume */\n origin: Point3;\n /** Whether preScaling has been performed on the volume */\n /** volume scaling parameters if it contains scaled data */\n scaling?: {\n PT?: {\n // @TODO: Do these values exist?\n SUVlbmFactor?: number;\n SUVbsaFactor?: number;\n // accessed in ProbeTool\n suvbwToSuvlbm?: number;\n suvbwToSuvbsa?: number;\n };\n };\n /** volume size in bytes */\n sizeInBytes?: number; // Seems weird to pass this in? Why not grab it from scalarData.byteLength\n /** volume spacing in 3d world space */\n spacing: Point3;\n /** volume number of voxels */\n numVoxels: number;\n /** volume image data */\n imageData?: vtkImageData;\n /** open gl texture for the volume */\n vtkOpenGLTexture: any; // No good way of referencing vtk classes as they aren't classes.\n /** load status object for the volume */\n loadStatus?: Record;\n /** optional reference volume id if the volume is derived from another volume */\n referencedVolumeId?: string;\n /** whether the metadata for the pixel spacing is not undefined */\n hasPixelSpacing: boolean;\n\n constructor(props: IVolume) {\n this.volumeId = props.volumeId;\n this.metadata = props.metadata;\n this.dimensions = props.dimensions;\n this.spacing = props.spacing;\n this.origin = props.origin;\n this.direction = props.direction;\n this.imageData = props.imageData;\n this.scalarData = props.scalarData;\n this.sizeInBytes = props.sizeInBytes;\n this.vtkOpenGLTexture = vtkStreamingOpenGLTexture.newInstance();\n this.numVoxels =\n this.dimensions[0] * this.dimensions[1] * this.dimensions[2];\n\n if (props.scaling) {\n this.scaling = props.scaling;\n }\n\n if (props.referencedVolumeId) {\n this.referencedVolumeId = props.referencedVolumeId;\n }\n }\n\n /** return the image ids for the volume if it is made of separated images */\n public get imageIds(): Array {\n return this._imageIds;\n }\n\n /** updates the image ids */\n public set imageIds(newImageIds: Array) {\n this._imageIds = newImageIds;\n this._reprocessImageIds();\n }\n\n private _reprocessImageIds() {\n this._imageIdsIndexMap.clear();\n this._imageURIsIndexMap.clear();\n\n this._imageIds.forEach((imageId, i) => {\n const imageURI = imageIdToURI(imageId);\n\n this._imageIdsIndexMap.set(imageId, i);\n this._imageURIsIndexMap.set(imageURI, i);\n });\n }\n\n cancelLoading: () => void;\n\n /** return true if it is a 4D volume or false if it is 3D volume */\n public isDynamicVolume(): boolean {\n return false;\n }\n\n /**\n * Return the scalar data for 3D volumes or the active scalar data\n * (current time point) for 4D volumes\n */\n public getScalarData(): VolumeScalarData {\n if (isTypedArray(this.scalarData)) {\n return this.scalarData;\n }\n\n throw new Error('Unknow scalar data type');\n }\n\n /**\n * return the index of a given imageId\n * @param imageId - imageId\n * @returns imageId index\n */\n public getImageIdIndex(imageId: string): number {\n return this._imageIdsIndexMap.get(imageId);\n }\n\n /**\n * return the index of a given imageURI\n * @param imageId - imageURI\n * @returns imageURI index\n */\n public getImageURIIndex(imageURI: string): number {\n return this._imageURIsIndexMap.get(imageURI);\n }\n\n /**\n * destroy the volume and make it unusable\n */\n destroy(): void {\n // TODO: GPU memory associated with volume is not cleared.\n this.imageData.delete();\n this.imageData = null;\n this.scalarData = null;\n\n this.vtkOpenGLTexture.releaseGraphicsResources();\n this.vtkOpenGLTexture.delete();\n }\n}\n\nexport default ImageVolume;\n","/**\n * checks if an object is an instance of a TypedArray\n *\n * @param obj - Object to check\n *\n * @returns True if the object is a TypedArray.\n */\nexport default function isTypedArray(obj: any): boolean {\n return (\n obj instanceof Int8Array ||\n obj instanceof Uint8Array ||\n obj instanceof Uint8ClampedArray ||\n obj instanceof Int16Array ||\n obj instanceof Uint16Array ||\n obj instanceof Int32Array ||\n obj instanceof Uint32Array ||\n obj instanceof Float32Array ||\n obj instanceof Float64Array\n );\n}\n","import '@kitware/vtk.js/Rendering/Profiles/Volume';\n\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport type { vtkImageData as vtkImageDataType } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { ImageVolume } from '../cache/classes/ImageVolume';\nimport type * as Types from '../types';\nimport cache from '../cache/cache';\nimport Events from '../enums/Events';\nimport eventTarget from '../eventTarget';\nimport triggerEvent from '../utilities/triggerEvent';\nimport { uuidv4 } from '../utilities';\nimport { Point3, Metadata, EventTypes, Mat3 } from '../types';\nimport { getConfiguration } from '../init';\n\ninterface VolumeLoaderOptions {\n imageIds: Array;\n}\n\ninterface DerivedVolumeOptions {\n volumeId: string;\n targetBuffer?: {\n type: 'Float32Array' | 'Uint8Array' | 'Uint16Array' | 'Int16Array';\n sharedArrayBuffer?: boolean;\n };\n}\ninterface LocalVolumeOptions {\n scalarData: Float32Array | Uint8Array | Uint16Array | Int16Array;\n metadata: Metadata;\n dimensions: Point3;\n spacing: Point3;\n origin: Point3;\n direction: Mat3;\n}\n\n/**\n * Adds a single scalar data to a 3D volume\n */\nfunction addScalarDataToImageData(\n imageData: vtkImageDataType,\n scalarData: Types.VolumeScalarData,\n dataArrayAttrs\n) {\n const scalarArray = vtkDataArray.newInstance({\n name: `Pixels`,\n values: scalarData,\n ...dataArrayAttrs,\n });\n\n imageData.getPointData().setScalars(scalarArray);\n}\n\n/**\n * Adds multiple scalar data (time points) to a 4D volume\n */\nfunction addScalarDataArraysToImageData(\n imageData: vtkImageDataType,\n scalarDataArrays: Types.VolumeScalarData[],\n dataArrayAttrs\n) {\n scalarDataArrays.forEach((scalarData, i) => {\n const vtkScalarArray = vtkDataArray.newInstance({\n name: `timePoint-${i}`,\n values: scalarData,\n ...dataArrayAttrs,\n });\n\n imageData.getPointData().addArray(vtkScalarArray);\n });\n\n // Set the first as active otherwise nothing is displayed on the screen\n imageData.getPointData().setActiveScalars('timePoint-0');\n}\n\nfunction createInternalVTKRepresentation(\n volume: Types.IImageVolume\n): vtkImageDataType {\n const { dimensions, metadata, spacing, direction, origin } = volume;\n const { PhotometricInterpretation } = metadata;\n\n let numComponents = 1;\n if (PhotometricInterpretation === 'RGB') {\n numComponents = 3;\n }\n\n const imageData = vtkImageData.newInstance();\n const dataArrayAttrs = { numberOfComponents: numComponents };\n\n imageData.setDimensions(dimensions);\n imageData.setSpacing(spacing);\n imageData.setDirection(direction);\n imageData.setOrigin(origin);\n\n // Add scalar data to 3D or 4D volume\n if (volume.isDynamicVolume()) {\n const scalarDataArrays = ((\n volume\n )).getScalarDataArrays();\n\n addScalarDataArraysToImageData(imageData, scalarDataArrays, dataArrayAttrs);\n } else {\n const scalarData = volume.getScalarData();\n\n addScalarDataToImageData(imageData, scalarData, dataArrayAttrs);\n }\n\n return imageData;\n}\n\n/**\n * This module deals with VolumeLoaders and loading volumes\n */\n\nconst volumeLoaders = {};\n\nlet unknownVolumeLoader;\n\n/**\n * Load a volume using a registered Cornerstone Volume Loader.\n *\n * The volume loader that is used will be\n * determined by the volume loader scheme matching against the volumeId.\n *\n * @param volumeId - A Cornerstone Volume Object's volumeId\n * @param options - Options to be passed to the Volume Loader. Options\n * contain the ImageIds that is passed to the loader\n *\n * @returns An Object which can be used to act after a volume is loaded or loading fails\n *\n */\nfunction loadVolumeFromVolumeLoader(\n volumeId: string,\n options?: VolumeLoaderOptions\n): Types.IVolumeLoadObject {\n const colonIndex = volumeId.indexOf(':');\n const scheme = volumeId.substring(0, colonIndex);\n const loader = volumeLoaders[scheme];\n\n if (loader === undefined || loader === null) {\n if (unknownVolumeLoader !== undefined) {\n return unknownVolumeLoader(volumeId, options);\n }\n\n throw new Error(\n 'loadVolumeFromVolumeLoader: no volume loader for volumeId'\n );\n }\n\n const volumeLoadObject = loader(volumeId, options);\n\n // Broadcast a volume loaded event once the image is loaded\n volumeLoadObject.promise.then(\n function (volume) {\n triggerEvent(eventTarget, Events.VOLUME_LOADED, { volume });\n },\n function (error) {\n const errorObject: EventTypes.VolumeLoadedFailedEventDetail = {\n volumeId,\n error,\n };\n\n triggerEvent(eventTarget, Events.VOLUME_LOADED_FAILED, errorObject);\n }\n );\n\n return volumeLoadObject;\n}\n\n/**\n * Loads a volume given a volumeId and optional priority and returns a promise which will resolve to\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\n *\n * @param volumeId - A Cornerstone Image Object's volumeId\n * @param options - Options to be passed to the Volume Loader\n *\n * @returns An Object which can be used to act after an image is loaded or loading fails\n */\nexport function loadVolume(\n volumeId: string,\n options: VolumeLoaderOptions = { imageIds: [] }\n): Promise {\n if (volumeId === undefined) {\n throw new Error('loadVolume: parameter volumeId must not be undefined');\n }\n\n let volumeLoadObject = cache.getVolumeLoadObject(volumeId);\n\n if (volumeLoadObject !== undefined) {\n return volumeLoadObject.promise;\n }\n\n volumeLoadObject = loadVolumeFromVolumeLoader(volumeId, options);\n\n return volumeLoadObject.promise.then((volume: Types.IImageVolume) => {\n volume.imageData = createInternalVTKRepresentation(volume);\n return volume;\n });\n}\n\n/**\n * Loads an image given an volumeId and optional priority and returns a promise which will resolve to\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\n *\n * @param volumeId - A Cornerstone Image Object's volumeId\n * @param options - Options to be passed to the Volume Loader\n *\n * @returns Volume Loader Object\n */\nexport async function createAndCacheVolume(\n volumeId: string,\n options?: VolumeLoaderOptions\n): Promise> {\n if (volumeId === undefined) {\n throw new Error(\n 'createAndCacheVolume: parameter volumeId must not be undefined'\n );\n }\n\n let volumeLoadObject = cache.getVolumeLoadObject(volumeId);\n\n if (volumeLoadObject !== undefined) {\n return volumeLoadObject.promise;\n }\n\n volumeLoadObject = loadVolumeFromVolumeLoader(volumeId, options);\n\n volumeLoadObject.promise.then((volume: Types.IImageVolume) => {\n volume.imageData = createInternalVTKRepresentation(volume);\n });\n\n cache.putVolumeLoadObject(volumeId, volumeLoadObject).catch((err) => {\n throw err;\n });\n\n return volumeLoadObject.promise;\n}\n\n/**\n * Based on a referencedVolumeId, it will build and cache a new volume. If\n * no scalarData is specified in the options, an empty derived volume will be\n * created that matches the image metadata of the referenceVolume. If scalarData\n * is given, it will be used to generate the intensity values for the derivedVolume.\n * Finally, it will save the volume in the cache.\n * @param referencedVolumeId - the volumeId from which the new volume will get its metadata\n * @param options - DerivedVolumeOptions {uid: derivedVolumeUID, targetBuffer: { type: Float32Array | Uint8Array |\n * Uint16Array | Uint32Array }, scalarData: if provided}\n *\n * @returns ImageVolume\n */\nexport async function createAndCacheDerivedVolume(\n referencedVolumeId: string,\n options: DerivedVolumeOptions\n): Promise {\n const referencedVolume = cache.getVolume(referencedVolumeId);\n\n if (!referencedVolume) {\n throw new Error(\n `Cannot created derived volume: Referenced volume with id ${referencedVolumeId} does not exist.`\n );\n }\n\n let { volumeId } = options;\n const { targetBuffer } = options;\n\n if (volumeId === undefined) {\n volumeId = uuidv4();\n }\n\n const { metadata, dimensions, spacing, origin, direction } = referencedVolume;\n const scalarData = referencedVolume.getScalarData();\n const scalarLength = scalarData.length;\n\n let numBytes, TypedArray;\n\n const { useNorm16Texture } = getConfiguration().rendering;\n\n // If target buffer is provided\n if (targetBuffer) {\n if (targetBuffer.type === 'Float32Array') {\n numBytes = scalarLength * 4;\n TypedArray = Float32Array;\n } else if (targetBuffer.type === 'Uint8Array') {\n numBytes = scalarLength;\n TypedArray = Uint8Array;\n } else if (useNorm16Texture && targetBuffer.type === 'Uint16Array') {\n numBytes = scalarLength * 2;\n TypedArray = Uint16Array;\n } else if (useNorm16Texture && targetBuffer.type === 'Int16Array') {\n numBytes = scalarLength * 2;\n TypedArray = Uint16Array;\n } else {\n throw new Error('TargetBuffer should be Float32Array or Uint8Array');\n }\n } else {\n // Use float32 if no targetBuffer is provided\n numBytes = scalarLength * 4;\n TypedArray = Float32Array;\n }\n\n // check if there is enough space in unallocated + image Cache\n const isCacheable = cache.isCacheable(numBytes);\n if (!isCacheable) {\n throw new Error(Events.CACHE_SIZE_EXCEEDED);\n }\n\n let volumeScalarData;\n if (targetBuffer?.sharedArrayBuffer) {\n const buffer = new SharedArrayBuffer(numBytes);\n volumeScalarData = new TypedArray(buffer);\n } else {\n volumeScalarData = new TypedArray(scalarLength);\n }\n\n // Todo: handle more than one component for segmentation (RGB)\n const scalarArray = vtkDataArray.newInstance({\n name: 'Pixels',\n numberOfComponents: 1,\n values: volumeScalarData,\n });\n\n const derivedImageData = vtkImageData.newInstance();\n\n derivedImageData.setDimensions(dimensions);\n derivedImageData.setSpacing(spacing);\n derivedImageData.setDirection(direction);\n derivedImageData.setOrigin(origin);\n derivedImageData.getPointData().setScalars(scalarArray);\n\n const derivedVolume = new ImageVolume({\n volumeId,\n metadata: cloneDeep(metadata),\n dimensions: [dimensions[0], dimensions[1], dimensions[2]],\n spacing,\n origin,\n direction,\n imageData: derivedImageData,\n scalarData: volumeScalarData,\n sizeInBytes: numBytes,\n referencedVolumeId,\n });\n\n const volumeLoadObject = {\n promise: Promise.resolve(derivedVolume),\n };\n\n await cache.putVolumeLoadObject(volumeId, volumeLoadObject);\n\n return derivedVolume;\n}\n\n/**\n * Creates and cache a volume based on a set of provided properties including\n * dimensions, spacing, origin, direction, metadata, scalarData. It should be noted that\n * scalarData should be provided for this function to work. If a volume with the same\n * Id exists in the cache it returns it immediately.\n * @param options - { scalarData, metadata, dimensions, spacing, origin, direction }\n * @param volumeId - Id of the generated volume\n *\n * @returns ImageVolume\n */\nexport function createLocalVolume(\n options: LocalVolumeOptions,\n volumeId: string,\n preventCache = false\n): ImageVolume {\n const { scalarData, metadata, dimensions, spacing, origin, direction } =\n options;\n\n if (\n !scalarData ||\n !(\n scalarData instanceof Uint8Array ||\n scalarData instanceof Float32Array ||\n scalarData instanceof Uint16Array ||\n scalarData instanceof Int16Array\n )\n ) {\n throw new Error(\n 'To use createLocalVolume you should pass scalarData of type Uint8Array, Uint16Array, Int16Array or Float32Array'\n );\n }\n\n // Todo: handle default values for spacing, origin, direction if not provided\n if (volumeId === undefined) {\n volumeId = uuidv4();\n }\n\n const cachedVolume = cache.getVolume(volumeId);\n\n if (cachedVolume) {\n return cachedVolume as ImageVolume;\n }\n\n const scalarLength = dimensions[0] * dimensions[1] * dimensions[2];\n\n const numBytes = scalarData ? scalarData.buffer.byteLength : scalarLength * 4;\n\n // check if there is enough space in unallocated + image Cache\n const isCacheable = cache.isCacheable(numBytes);\n if (!isCacheable) {\n throw new Error(Events.CACHE_SIZE_EXCEEDED);\n }\n\n const scalarArray = vtkDataArray.newInstance({\n name: 'Pixels',\n numberOfComponents: 1,\n values: scalarData,\n });\n\n const imageData = vtkImageData.newInstance();\n\n imageData.setDimensions(dimensions);\n imageData.setSpacing(spacing);\n imageData.setDirection(direction);\n imageData.setOrigin(origin);\n imageData.getPointData().setScalars(scalarArray);\n\n const derivedVolume = new ImageVolume({\n volumeId,\n metadata: cloneDeep(metadata),\n dimensions: [dimensions[0], dimensions[1], dimensions[2]],\n spacing,\n origin,\n direction,\n imageData: imageData,\n scalarData,\n sizeInBytes: numBytes,\n });\n\n if (preventCache) {\n return derivedVolume;\n }\n\n const volumeLoadObject = {\n promise: Promise.resolve(derivedVolume),\n };\n cache.putVolumeLoadObject(volumeId, volumeLoadObject);\n\n return derivedVolume;\n}\n\n/**\n * Registers an volumeLoader plugin with cornerstone for the specified scheme\n *\n * @param scheme - The scheme to use for this volume loader (e.g. 'dicomweb', 'wadouri', 'http')\n * @param volumeLoader - A Cornerstone Volume Loader function\n */\nexport function registerVolumeLoader(\n scheme: string,\n volumeLoader: Types.VolumeLoaderFn\n): void {\n volumeLoaders[scheme] = volumeLoader;\n}\n\n/** Gets the array of volume loader schemes */\nexport function getVolumeLoaderSchemes(): string[] {\n return Object.keys(volumeLoaders);\n}\n\n/**\n * Registers a new unknownVolumeLoader and returns the previous one\n *\n * @param volumeLoader - A Cornerstone Volume Loader\n *\n * @returns The previous Unknown Volume Loader\n */\nexport function registerUnknownVolumeLoader(\n volumeLoader: Types.VolumeLoaderFn\n): Types.VolumeLoaderFn | undefined {\n const oldVolumeLoader = unknownVolumeLoader;\n\n unknownVolumeLoader = volumeLoader;\n\n return oldVolumeLoader;\n}\n","import cache from '../cache/cache';\nimport { EPSILON } from '../constants';\n// import type { VolumeViewport } from '../RenderingEngine'\nimport { ICamera, IImageVolume, IVolumeViewport } from '../types';\nimport getSpacingInNormalDirection from './getSpacingInNormalDirection';\nimport { getVolumeLoaderSchemes } from '../loaders/volumeLoader';\n\n// One EPSILON part larger multiplier\nconst EPSILON_PART = 1 + EPSILON;\n\nconst startsWith = (str, starts) =>\n starts === str.substring(0, Math.min(str.length, starts.length));\n\n// Check if this is a primary volume\n// For now, that means it came from some sort of image loader, but\n// should be specifically designated.\nconst isPrimaryVolume = (volume): boolean =>\n !!getVolumeLoaderSchemes().find((scheme) =>\n startsWith(volume.volumeId, scheme)\n );\n\n/**\n * Given a volume viewport and camera, find the target volume.\n * The imageVolume is retrieved from cache for the specified targetVolumeId or\n * in case it is not provided, it chooses the volumeId on the viewport (there\n * might be more than one in case of fusion) that has the finest resolution in the\n * direction of view (normal).\n *\n * @param viewport - volume viewport\n * @param camera - current camera\n * @param targetVolumeId - If a target volumeId is given that volume\n * is forced to be used.\n *\n * @returns An object containing the imageVolume and spacingInNormalDirection.\n *\n */\nexport default function getTargetVolumeAndSpacingInNormalDir(\n viewport: IVolumeViewport,\n camera: ICamera,\n targetVolumeId?: string\n): {\n imageVolume: IImageVolume;\n spacingInNormalDirection: number;\n actorUID: string;\n} {\n const { viewPlaneNormal } = camera;\n const volumeActors = viewport.getActors();\n\n if (!volumeActors || !volumeActors.length) {\n return {\n spacingInNormalDirection: null,\n imageVolume: null,\n actorUID: null,\n };\n }\n\n const imageVolumes = volumeActors\n .map((va) => {\n // prefer the referenceUID if it is set, since it can be a derived actor\n // and the uid does not necessarily match the volumeId\n const actorUID = va.referenceId ?? va.uid;\n return cache.getVolume(actorUID);\n })\n .filter((iv) => !!iv);\n\n // If a volumeId is defined, set that volume as the target\n if (targetVolumeId) {\n const imageVolumeIndex = imageVolumes.findIndex(\n (iv) => iv.volumeId === targetVolumeId\n );\n\n const imageVolume = imageVolumes[imageVolumeIndex];\n const { uid: actorUID } = volumeActors[imageVolumeIndex];\n const spacingInNormalDirection = getSpacingInNormalDirection(\n imageVolume,\n viewPlaneNormal\n );\n\n return { imageVolume, spacingInNormalDirection, actorUID };\n }\n\n if (!imageVolumes.length) {\n return {\n spacingInNormalDirection: null,\n imageVolume: null,\n actorUID: null,\n };\n }\n\n // Fetch volume actor with finest resolution in direction of projection.\n const smallest = {\n spacingInNormalDirection: Infinity,\n imageVolume: null,\n actorUID: null,\n };\n\n const hasPrimaryVolume = imageVolumes.find(isPrimaryVolume);\n\n for (let i = 0; i < imageVolumes.length; i++) {\n const imageVolume = imageVolumes[i];\n\n if (hasPrimaryVolume && !isPrimaryVolume(imageVolume)) {\n // Secondary volumes like segmentation don't count towards spacing\n continue;\n }\n\n const spacingInNormalDirection = getSpacingInNormalDirection(\n imageVolume,\n viewPlaneNormal\n );\n\n // Allow for EPSILON part larger requirement to prefer earlier volumes\n // when the spacing is within a factor of EPSILON. Use a factor because\n // that deals with very small or very large volumes effectively.\n if (\n spacingInNormalDirection * EPSILON_PART <\n smallest.spacingInNormalDirection\n ) {\n smallest.spacingInNormalDirection = spacingInNormalDirection;\n smallest.imageVolume = imageVolume;\n smallest.actorUID = volumeActors[i].uid;\n }\n }\n\n return smallest;\n}\n","import { Point3 } from '../types';\n\n/**\n * Converts `vtkVolumeActor` bounds to corners in world space.\n *\n * @param volumeActor - The `vtkVolumeActor`.\n *\n * @returns An array of the corners of the `volumeActor` in world space.\n */\nexport default function getVolumeActorCorners(volumeActor): Array {\n const imageData = volumeActor.getMapper().getInputData();\n const bounds = imageData.extentToBounds(imageData.getExtent());\n\n return [\n [bounds[0], bounds[2], bounds[4]],\n [bounds[0], bounds[2], bounds[5]],\n [bounds[0], bounds[3], bounds[4]],\n [bounds[0], bounds[3], bounds[5]],\n [bounds[1], bounds[2], bounds[4]],\n [bounds[1], bounds[2], bounds[5]],\n [bounds[1], bounds[3], bounds[4]],\n [bounds[1], bounds[3], bounds[5]],\n ];\n}\n","import { Point3 } from '../types';\n\n/**\n * Returns true if the specified index is within the given dimensions.\n *\n * @param index - The index to check.\n * @param dimensions - The dimensions to check against.\n *\n * @returns True if the index is in-bounds.\n */\nexport default function indexWithinDimensions(\n index: Point3,\n dimensions: Point3\n): boolean {\n if (\n index[0] < 0 ||\n index[0] >= dimensions[0] ||\n index[1] < 0 ||\n index[1] >= dimensions[1] ||\n index[2] < 0 ||\n index[2] >= dimensions[2]\n ) {\n return false;\n }\n\n return true;\n}\n","import { IVolumeViewport } from '../types';\nimport {\n getRenderingEngines,\n getRenderingEngine,\n} from '../RenderingEngine/getRenderingEngine';\n\n/**\n * Returns the viewports containing the same volume actors (all actors) the same\n * as the target viewport. If renderingEngineId is provided, it will only return\n * viewports that are associated with the renderingEngineId; otherwise, it will\n * return search in all rendering engines.\n *\n * This method is useful for finding viewports that are associated with the same\n * volume (e.g., for tools that share state between viewports).\n *\n * @param viewport - target viewport\n * @returns array of viewports that have the same volume actor as the target viewport\n */\nfunction getVolumeViewportsContainingSameVolumes(\n targetViewport: IVolumeViewport,\n renderingEngineId?: string\n): Array {\n // If rendering engine is not provided, use all rendering engines\n let renderingEngines;\n if (renderingEngineId) {\n renderingEngines = [getRenderingEngine(renderingEngineId)];\n } else {\n renderingEngines = getRenderingEngines();\n }\n\n const sameVolumesViewports = [];\n\n renderingEngines.forEach((renderingEngine) => {\n const targetActors = targetViewport.getActors();\n const viewports = renderingEngine.getVolumeViewports();\n\n for (const vp of viewports) {\n const vpActors = vp.getActors();\n\n if (vpActors.length !== targetActors.length) {\n continue;\n }\n\n // every targetActors should be in the vpActors\n const sameVolumes = targetActors.every(({ uid }) =>\n vpActors.find((vpActor) => uid === vpActor.uid)\n );\n\n if (sameVolumes) {\n sameVolumesViewports.push(vp);\n }\n }\n });\n\n return sameVolumesViewports;\n}\n\nexport default getVolumeViewportsContainingSameVolumes;\n","import { IVolumeViewport } from '../types';\nimport {\n getRenderingEngines,\n getRenderingEngine,\n} from '../RenderingEngine/getRenderingEngine';\n\n/**\n * Similar to {@link getVolumeViewportsContainingSameVolumes}, but uses the volumeId\n * to filter viewports that contain the same volume.\n *\n * @returns VolumeViewport viewports array\n */\nfunction getViewportsWithVolumeId(\n volumeId: string,\n renderingEngineId?: string\n): Array {\n // If rendering engine is not provided, use all rendering engines\n let renderingEngines;\n if (renderingEngineId) {\n renderingEngines = [getRenderingEngine(renderingEngineId)];\n } else {\n renderingEngines = getRenderingEngines();\n }\n\n const targetViewports = [];\n\n renderingEngines.forEach((renderingEngine) => {\n const viewports = renderingEngine.getVolumeViewports();\n const filteredViewports = viewports.filter((vp) =>\n vp.hasVolumeId(volumeId)\n );\n targetViewports.push(...filteredViewports);\n });\n\n return targetViewports;\n}\n\nexport default getViewportsWithVolumeId;\n","import type Point3 from '../types/Point3';\n\n/**\n * Given an imageData object and a point in physical space, return the index of the\n * voxel that contains the point. TODO: this should be pushed to vtk upstream.\n * @param imageData - The image data object.\n * @param physicalPoint - The point in physical space that you want to transform to\n * index space.\n * @returns An array of integers.\n */\nexport default function transformWorldToIndex(imageData, worldPos: Point3) {\n const continuousIndex = imageData.worldToIndex(worldPos);\n const index = continuousIndex.map(Math.round);\n\n return index;\n}\n","import RequestType from '../enums/RequestType';\nimport { IImage } from '../types';\nimport { uuidv4 } from '../utilities';\n\ntype AdditionalDetails = {\n imageId?: string;\n volumeId?: string;\n};\n\ntype RequestDetailsInterface = {\n requestFn: () => Promise;\n type: RequestType;\n additionalDetails: AdditionalDetails;\n};\n\ntype RequestPool = {\n [name in RequestType]: { [key: number]: RequestDetailsInterface[] };\n};\n\n/**\n * RequestPool manager class is a base class that manages the request pools.\n * It is used imageRetrievalPoolManager, and imageLoadPoolManager to retrieve and load images.\n * Previously requestPoolManager was used to manage the retrieval and loading and decoding\n * of the images in a way that new requests were sent after the image was both loaded and decoded\n * which was not performant since it was waiting for the image to be loaded and decoded before\n * sending the next request which is a network request and can be done in parallel.\n * Now, we use separate imageRetrievalPoolManager and imageLoadPoolManager\n * to improve performance and both are extending the RequestPoolManager class which\n * is a basic queueing pool.\n *\n * A new requestPool can be created by instantiating a new RequestPoolManager class.\n *\n * ```javascript\n * const requestPoolManager = new RequestPoolManager()\n * ```\n *\n * ## ImageLoadPoolManager\n *\n * You can use the imageLoadPoolManager to load images, by providing a `requestFn`\n * that returns a promise for the image. You can provide a `type` to specify the type of\n * request (interaction, thumbnail, prefetch), and you can provide additional details\n * that will be passed to the requestFn. Below is an example of a requestFn that loads\n * an image from an imageId:\n *\n * ```javascript\n *\n * const priority = -5\n * const requestType = RequestType.Interaction\n * const additionalDetails = { imageId }\n * const options = {\n * targetBuffer: {\n * type: 'Float32Array',\n * offset: null,\n * length: null,\n * },\n * preScale: {\n * enabled: true,\n * },\n * }\n *\n * imageLoadPoolManager.addRequest(\n * loadAndCacheImage(imageId, options).then(() => { // set on viewport}),\n * requestType,\n * additionalDetails,\n * priority\n * )\n * ```\n * ### ImageRetrievalPoolManager\n * You don't need to directly use the imageRetrievalPoolManager to load images\n * since the imageLoadPoolManager will automatically use it for retrieval. However,\n * maximum number of concurrent requests can be set by calling `setMaxConcurrentRequests`.\n */\nclass RequestPoolManager {\n private id: string;\n private awake: boolean;\n private requestPool: RequestPool;\n private numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0,\n };\n /* maximum number of requests of each type. */\n public maxNumRequests: {\n interaction: number;\n thumbnail: number;\n prefetch: number;\n };\n /* A public property that is used to set the delay between requests. */\n public grabDelay: number;\n private timeoutHandle: number;\n\n /**\n * By default a request pool containing three priority groups, one for each\n * of the request types, is created. Maximum number of requests of each type\n * is set to 6.\n */\n constructor(id?: string) {\n this.id = id ? id : uuidv4();\n\n this.requestPool = {\n interaction: { 0: [] },\n thumbnail: { 0: [] },\n prefetch: { 0: [] },\n };\n\n this.grabDelay = 5;\n this.awake = false;\n\n this.numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0,\n };\n\n this.maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5,\n };\n }\n\n /**\n * This function sets the maximum number of requests for a given request type.\n * @param type - The type of request you want to set the max number\n * of requests for it can be either of interaction, prefetch, or thumbnail.\n * @param maxNumRequests - The maximum number of requests that can be\n * made at a time.\n */\n public setMaxSimultaneousRequests(\n type: RequestType,\n maxNumRequests: number\n ): void {\n this.maxNumRequests[type] = maxNumRequests;\n }\n\n /**\n * It returns the maximum number of requests of a given type that can be made\n * @param type - The type of request.\n * @returns The maximum number of requests of a given type.\n */\n public getMaxSimultaneousRequests(type: RequestType): number {\n return this.maxNumRequests[type];\n }\n\n /**\n * Stops further fetching of the requests, all the ongoing requests will still\n * be retrieved\n */\n public destroy(): void {\n if (this.timeoutHandle) {\n window.clearTimeout(this.timeoutHandle);\n }\n }\n\n /**\n * Adds the requests to the pool of requests.\n *\n * @param requestFn - A function that returns a promise which resolves in the image\n * @param type - Priority category, it can be either of interaction, prefetch,\n * or thumbnail.\n * @param additionalDetails - Additional details that requests can contain.\n * For instance the volumeId for the volume requests\n * @param priority - Priority number for each category of requests. Its default\n * value is priority 0. The lower the priority number, the higher the priority number\n *\n */\n public addRequest(\n requestFn: () => Promise,\n type: RequestType,\n additionalDetails: Record,\n priority = 0\n ): void {\n // Describe the request\n const requestDetails: RequestDetailsInterface = {\n requestFn,\n type,\n additionalDetails,\n };\n\n // Check if the priority group exists on the request type\n if (this.requestPool[type][priority] === undefined) {\n this.requestPool[type][priority] = [];\n }\n\n // Adding the request to the correct priority group of the request type\n this.requestPool[type][priority].push(requestDetails);\n\n // Wake up\n if (!this.awake) {\n this.awake = true;\n this.startGrabbing();\n } else if (type === RequestType.Interaction) {\n // Todo: this is a hack for interaction right now, we should separate\n // the grabbing from the adding requests\n this.startGrabbing();\n }\n }\n\n /**\n * Filter the requestPoolManager's pool of request based on the result of\n * provided filter function. The provided filter function needs to return false or true\n *\n * @param filterFunction - The filter function for filtering of the requests to keep\n */\n public filterRequests(\n filterFunction: (requestDetails: RequestDetailsInterface) => boolean\n ): void {\n Object.keys(this.requestPool).forEach((type: string) => {\n const requestType = this.requestPool[type];\n Object.keys(requestType).forEach((priority) => {\n requestType[priority] = requestType[priority].filter(\n (requestDetails: RequestDetailsInterface) => {\n return filterFunction(requestDetails);\n }\n );\n });\n });\n }\n\n /**\n * Clears the requests specific to the provided type. For instance, the\n * pool of requests of type 'interaction' can be cleared via this function.\n *\n *\n * @param type - category of the request (either interaction, prefetch or thumbnail)\n */\n public clearRequestStack(type: string): void {\n if (!this.requestPool[type]) {\n throw new Error(`No category for the type ${type} found`);\n }\n this.requestPool[type] = { 0: [] };\n }\n\n private sendRequests(type) {\n const requestsToSend = this.maxNumRequests[type] - this.numRequests[type];\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = this.getNextRequest(type);\n if (requestDetails === null) {\n return false;\n } else if (requestDetails) {\n this.numRequests[type]++;\n this.awake = true;\n\n requestDetails.requestFn().finally(() => {\n this.numRequests[type]--;\n this.startAgain();\n });\n }\n }\n\n return true;\n }\n\n private getNextRequest(type): RequestDetailsInterface | null {\n const interactionPriorities = this.getSortedPriorityGroups(type);\n for (const priority of interactionPriorities) {\n if (this.requestPool[type][priority].length) {\n return this.requestPool[type][priority].shift();\n }\n }\n\n return null;\n }\n\n protected startGrabbing(): void {\n const hasRemainingInteractionRequests = this.sendRequests(\n RequestType.Interaction\n );\n const hasRemainingThumbnailRequests = this.sendRequests(\n RequestType.Thumbnail\n );\n const hasRemainingPrefetchRequests = this.sendRequests(\n RequestType.Prefetch\n );\n\n if (\n !hasRemainingInteractionRequests &&\n !hasRemainingThumbnailRequests &&\n !hasRemainingPrefetchRequests\n ) {\n this.awake = false;\n }\n }\n\n protected startAgain(): void {\n if (!this.awake) {\n return;\n }\n\n if (this.grabDelay !== undefined) {\n // Prevents calling setTimeout hundreds of times when hundreds of requests\n // are added which make it slower and works in an unexpected way when\n // destroy/clearTimeout is called because only the last handle is stored.\n if (!this.timeoutHandle) {\n this.timeoutHandle = window.setTimeout(() => {\n this.timeoutHandle = null;\n this.startGrabbing();\n }, this.grabDelay);\n }\n } else {\n this.startGrabbing();\n }\n }\n\n protected getSortedPriorityGroups(type: string): Array {\n const priorities = Object.keys(this.requestPool[type])\n .map(Number)\n .filter((priority) => this.requestPool[type][priority].length)\n .sort((a, b) => a - b);\n return priorities;\n }\n\n /**\n * Returns the request pool containing different categories, their priority and\n * the added request details.\n *\n * @returns the request pool which contains different categories, their priority and\n * the added request details\n */\n getRequestPool(): RequestPool {\n return this.requestPool;\n }\n}\n\nconst requestPoolManager = new RequestPoolManager();\n\nexport { RequestPoolManager };\nexport default requestPoolManager;\n","import { RequestPoolManager } from './requestPoolManager';\nimport RequestType from '../enums/RequestType';\n\n/**\n * You can use the imageLoadPoolManager to load images, by providing a `requestFn`\n * that returns a promise for the image. You can provide a `type` to specify the type of\n * request (interaction, thumbnail, prefetch), and you can provide additional details\n * that will be passed to the requestFn. Below is an example of a requestFn that loads\n * an image from an imageId:\n *\n * ```javascript\n *\n * const priority = -5\n * const requestType = RequestType.Interaction\n * const additionalDetails = { imageId }\n * const options = {\n * targetBuffer: {\n * type: 'Float32Array',\n * offset: null,\n * length: null,\n * },\n * preScale: {\n * enabled: true,\n * },\n * }\n *\n * imageLoadPoolManager.addRequest(\n * loadAndCacheImage(imageId, options).then(() => { // set on viewport}),\n * requestType,\n * additionalDetails,\n * priority\n * )\n * ```\n */\nconst imageLoadPoolManager = new RequestPoolManager('imageLoadPool');\n\nimageLoadPoolManager.grabDelay = 0;\n\nimageLoadPoolManager.setMaxSimultaneousRequests(RequestType.Interaction, 1000);\nimageLoadPoolManager.setMaxSimultaneousRequests(RequestType.Thumbnail, 1000);\nimageLoadPoolManager.setMaxSimultaneousRequests(RequestType.Prefetch, 1000);\n\nexport default imageLoadPoolManager;\n","import cache from '../cache/cache';\nimport Events from '../enums/Events';\nimport eventTarget from '../eventTarget';\nimport { triggerEvent } from '../utilities';\nimport { IImage, ImageLoaderFn, IImageLoadObject, EventTypes } from '../types';\nimport imageLoadPoolManager from '../requestPool/imageLoadPoolManager';\n\nexport interface ImageLoaderOptions {\n priority: number;\n requestType: string;\n additionalDetails?: Record;\n}\n/**\n * This module deals with ImageLoaders, loading images and caching images\n */\nconst imageLoaders = {};\nlet unknownImageLoader;\n\n/**\n * Loads an image using a registered Cornerstone Image Loader.\n *\n * The image loader that is used will be\n * determined by the image loader scheme matching against the imageId.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param Options - to be passed to the Image Loader\n *\n * @returns - An Object which can be used to act after an image is loaded or loading fails\n */\nfunction loadImageFromImageLoader(\n imageId: string,\n options: ImageLoaderOptions\n): IImageLoadObject {\n // Extract the image loader scheme: wadors:https://image1 => wadors\n const colonIndex = imageId.indexOf(':');\n const scheme = imageId.substring(0, colonIndex);\n const loader = imageLoaders[scheme];\n if (loader === undefined || loader === null) {\n if (unknownImageLoader !== undefined) {\n return unknownImageLoader(imageId);\n }\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\n }\n // Load using the registered loader\n const imageLoadObject = loader(imageId, options);\n // Broadcast an image loaded event once the image is loaded\n imageLoadObject.promise.then(\n function (image) {\n triggerEvent(eventTarget, Events.IMAGE_LOADED, { image });\n },\n function (error) {\n const errorObject: EventTypes.ImageLoadedFailedEventDetail = {\n imageId,\n error,\n };\n triggerEvent(eventTarget, Events.IMAGE_LOAD_FAILED, errorObject);\n }\n );\n return imageLoadObject;\n}\n\n/**\n * Gets the imageLoadObject by 1) Looking in to the cache to see if the\n * imageLoadObject has already been cached, 2) Checks inside the volume cache\n * to see if there is a volume that contains the same imageURI for the requested\n * imageID 3) Checks inside the imageCache for similar imageURI that might have\n * been stored as a result of decaching a volume 4) Finally if none were found\n * it request it from the registered imageLoaders.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param options - Options to be passed to the Image Loader\n *\n * @returns An Object which can be used to act after an image is loaded or loading fails\n */\nfunction loadImageFromCacheOrVolume(\n imageId: string,\n options: ImageLoaderOptions\n): IImageLoadObject {\n // 1. Check inside the image cache for imageId\n let imageLoadObject = cache.getImageLoadObject(imageId);\n if (imageLoadObject !== undefined) {\n return imageLoadObject;\n }\n // 2. Check if there exists a volume in the cache containing the imageId,\n // we copy the pixelData over.\n const cachedVolumeInfo = cache.getVolumeContainingImageId(imageId);\n if (cachedVolumeInfo && cachedVolumeInfo.volume.loadStatus.loaded) {\n // 2.1 Convert the volume at the specific slice to a cornerstoneImage object.\n // this will copy the pixel data over.\n const { volume, imageIdIndex } = cachedVolumeInfo;\n imageLoadObject = volume.convertToCornerstoneImage(imageId, imageIdIndex);\n return imageLoadObject;\n }\n // 3. If no volume found, we search inside the imageCache for the imageId\n // that has the same URI which had been cached if the volume was converted\n // to an image\n const cachedImage = cache.getCachedImageBasedOnImageURI(imageId);\n if (cachedImage) {\n imageLoadObject = cachedImage.imageLoadObject;\n return imageLoadObject;\n }\n // 4. if not in image cache nor inside the volume cache, we request the\n // image loaders to load it\n imageLoadObject = loadImageFromImageLoader(imageId, options);\n\n return imageLoadObject;\n}\n\n/**\n * Loads an image given an imageId and optional priority and returns a promise\n * which will resolve to the loaded image object or fail if an error occurred.\n * The loaded image is not stored in the cache.\n *\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param options - Options to be passed to the Image Loader\n *\n * @returns An Object which can be used to act after an image is loaded or loading fails\n */\nexport function loadImage(\n imageId: string,\n options: ImageLoaderOptions = { priority: 0, requestType: 'prefetch' }\n): Promise {\n if (imageId === undefined) {\n throw new Error('loadImage: parameter imageId must not be undefined');\n }\n\n return loadImageFromCacheOrVolume(imageId, options).promise;\n}\n\n/**\n * Loads an image given an imageId and optional priority and returns a promise\n * which will resolve to the loaded image object or fail if an error occurred.\n * The image is stored in the cache.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param options - Options to be passed to the Image Loader\n *\n * @returns Image Loader Object\n */\nexport function loadAndCacheImage(\n imageId: string,\n options: ImageLoaderOptions = { priority: 0, requestType: 'prefetch' }\n): Promise {\n if (imageId === undefined) {\n throw new Error(\n 'loadAndCacheImage: parameter imageId must not be undefined'\n );\n }\n const imageLoadObject = loadImageFromCacheOrVolume(imageId, options);\n\n // if not inside cache, store it\n if (!cache.getImageLoadObject(imageId)) {\n cache.putImageLoadObject(imageId, imageLoadObject).catch((err) => {\n console.warn(err);\n });\n }\n\n return imageLoadObject.promise;\n}\n\n/**\n * Load and cache a list of imageIds\n *\n * @param imageIds - list of imageIds\n * @param options - options for loader\n *\n */\nexport function loadAndCacheImages(\n imageIds: Array,\n options: ImageLoaderOptions = { priority: 0, requestType: 'prefetch' }\n): Promise[] {\n if (!imageIds || imageIds.length === 0) {\n throw new Error(\n 'loadAndCacheImages: parameter imageIds must be list of image Ids'\n );\n }\n\n const allPromises = imageIds.map((imageId) => {\n return loadAndCacheImage(imageId, options);\n });\n\n return allPromises;\n}\n\n/**\n * Removes the imageId from the request pool manager and executes the `cancel`\n * function if it exists.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n *\n */\nexport function cancelLoadImage(imageId: string): void {\n const filterFunction = ({ additionalDetails }) => {\n if (additionalDetails.imageId) {\n return additionalDetails.imageId !== imageId;\n }\n\n // for volumes\n return true;\n };\n\n // Instruct the request pool manager to filter queued\n // requests to ensure requests we no longer need are\n // no longer sent.\n imageLoadPoolManager.filterRequests(filterFunction);\n\n // TODO: Cancel decoding and retrieval as well (somehow?)\n\n // cancel image loading if in progress\n const imageLoadObject = cache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.cancelFn();\n }\n}\n\n/**\n * Removes the imageIds from the request pool manager and calls the `cancel`\n * function if it exists.\n *\n * @param imageIds - Array of Cornerstone Image Object's imageIds\n *\n */\nexport function cancelLoadImages(imageIds: Array): void {\n imageIds.forEach((imageId) => cancelLoadImage(imageId));\n}\n\n/**\n * Removes all the ongoing image loads by calling the `cancel` method on each\n * imageLoadObject. If no `cancel` method is available, it will be ignored.\n *\n */\nexport function cancelLoadAll(): void {\n const requestPool = imageLoadPoolManager.getRequestPool();\n\n Object.keys(requestPool).forEach((type: string) => {\n const requests = requestPool[type];\n\n Object.keys(requests).forEach((priority) => {\n const requestDetails = requests[priority].pop();\n const { imageId, volumeId } = requestDetails.additionalDetails;\n\n let loadObject;\n\n if (imageId) {\n loadObject = cache.getImageLoadObject(imageId);\n } else if (volumeId) {\n loadObject = cache.getVolumeLoadObject(volumeId);\n }\n if (loadObject) {\n loadObject.cancel();\n }\n });\n // resetting the pool types to be empty\n imageLoadPoolManager.clearRequestStack(type);\n\n // TODO: Clear retrieval and decoding queues as well\n });\n}\n\n/**\n * Registers an imageLoader plugin with cornerstone for the specified scheme\n *\n * @param scheme - The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\n * @param imageLoader - A Cornerstone Image Loader function\n */\nexport function registerImageLoader(\n scheme: string,\n imageLoader: ImageLoaderFn\n): void {\n imageLoaders[scheme] = imageLoader;\n}\n/**\n * Registers a new unknownImageLoader and returns the previous one\n *\n * @param imageLoader - A Cornerstone Image Loader\n *\n * @returns The previous Unknown Image Loader\n */\nexport function registerUnknownImageLoader(\n imageLoader: ImageLoaderFn\n): ImageLoaderFn {\n const oldImageLoader = unknownImageLoader;\n unknownImageLoader = imageLoader;\n return oldImageLoader;\n}\n/**\n * Removes all registered and unknown image loaders. This should be called\n * when the application is unmounted to prevent memory leaks.\n *\n */\nexport function unregisterAllImageLoaders(): void {\n Object.keys(imageLoaders).forEach(\n (imageLoader) => delete imageLoaders[imageLoader]\n );\n unknownImageLoader = undefined;\n}\n","const VIEWPORT_ELEMENT = 'viewport-element';\nconst CANVAS_CSS_CLASS = 'cornerstone-canvas';\n\n/**\n * Create a canvas and append it to the element\n *\n * @param element - An HTML Element\n * @returns canvas - A Canvas DOM element\n */\nfunction createCanvas(element: Element | HTMLDivElement): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n\n canvas.style.position = 'absolute';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.classList.add(CANVAS_CSS_CLASS);\n element.appendChild(canvas);\n\n return canvas;\n}\n\n/**\n * Creates an internal div that will contain canvas and SVG layer as children\n * @param element - An HTML Element\n * @returns div Cornerstone internal div that will include the canvas and SVG\n * as its children\n */\nexport function createViewportElement(element: HTMLDivElement): HTMLDivElement {\n const div = document.createElement('div');\n div.style.position = 'relative';\n div.style.width = '100%';\n div.style.height = '100%';\n div.classList.add(VIEWPORT_ELEMENT);\n element.appendChild(div);\n\n return div;\n}\n\n/**\n * Create a canvas or returns the one that already exists for a given element.\n * It first checks if the element has a canvas, if not it creates one and returns it.\n *\n * @param element - An HTML Element\n * @returns canvas a Canvas DOM element\n */\nexport default function getOrCreateCanvas(\n element: HTMLDivElement\n): HTMLCanvasElement {\n const canvasSelector = `canvas.${CANVAS_CSS_CLASS}`;\n const viewportElement = `div.${VIEWPORT_ELEMENT}`;\n\n // Internal div with `relative` positioning to enable absolute positioning\n // of the canvas and svg layer.\n const internalDiv =\n element.querySelector(viewportElement) || createViewportElement(element);\n\n return internalDiv.querySelector(canvasSelector) || createCanvas(internalDiv);\n}\n","import { IImage } from '../types';\n\nconst isPTPrescaledWithSUV = (image: IImage) => {\n return image.preScale?.scaled && image.preScale.scalingParameters?.suvbw;\n};\n\nexport default isPTPrescaledWithSUV;\n","import getOrCreateCanvas from '../RenderingEngine/helpers/getOrCreateCanvas';\nimport { ViewportType, Events } from '../enums';\nimport StackViewport from '../RenderingEngine/StackViewport';\nimport { IImage } from '../types';\nimport { getRenderingEngine } from '../RenderingEngine/getRenderingEngine';\nimport RenderingEngine from '../RenderingEngine';\nimport isPTPrescaledWithSUV from './isPTPrescaledWithSUV';\n\n/**\n * Renders an cornerstone image to a Canvas. This method will handle creation\n * of a temporary enabledElement, setting the imageId, and rendering the image via\n * a StackViewport, copying the canvas drawing to the given canvas Element, and\n * disabling the created temporary element. SuppressEvents argument is used to\n * prevent events from firing during the render process (e.g. during a series\n * of renders to a thumbnail image).\n *\n * @example\n * ```\n * const canvas = document.getElementById('myCanvas')\n *\n * renderToCanvasGPU(canvas, image)\n * ```\n * @param canvas - Canvas element to render to\n * @param image - The image to render\n * @param modality - [Default = undefined] The modality of the image\n * @returns - A promise that resolves when the image has been rendered with the imageId\n */\nexport default function renderToCanvasGPU(\n canvas: HTMLCanvasElement,\n image: IImage,\n modality = undefined,\n renderingEngineId = '_thumbnails'\n): Promise {\n if (!canvas || !(canvas instanceof HTMLCanvasElement)) {\n throw new Error('canvas element is required');\n }\n\n const imageIdToPrint = image.imageId;\n const viewportId = `renderGPUViewport-${imageIdToPrint}`;\n const imageId = image.imageId;\n const element = document.createElement('div');\n element.style.width = `${canvas.width}px`;\n element.style.height = `${canvas.height}px`;\n element.style.visibility = 'hidden';\n element.style.position = 'absolute';\n\n // Up-sampling the provided canvas to match the device pixel ratio\n // since we use device pixel ratio to determine the size of the canvas\n // inside the rendering engine.\n const devicePixelRatio = window.devicePixelRatio || 1;\n const originalWidth = canvas.width;\n const originalHeight = canvas.height;\n canvas.width = originalWidth * devicePixelRatio;\n canvas.height = originalHeight * devicePixelRatio;\n canvas.style.width = `${originalWidth}px`;\n canvas.style.height = `${originalHeight}px`;\n\n document.body.appendChild(element);\n\n // add id to the element so we can find it later, and fix the : which is not allowed in css\n const uniqueId = viewportId.split(':').join('-');\n element.setAttribute('viewport-id-for-remove', uniqueId);\n\n const renderingEngine =\n (getRenderingEngine(renderingEngineId) as RenderingEngine) ||\n new RenderingEngine(renderingEngineId);\n\n let viewport = renderingEngine.getViewport(viewportId) as StackViewport;\n\n if (!viewport) {\n const stackViewportInput = {\n viewportId,\n type: ViewportType.STACK,\n element,\n defaultOptions: {\n suppressEvents: true,\n },\n };\n renderingEngine.enableElement(stackViewportInput);\n viewport = renderingEngine.getViewport(viewportId) as StackViewport;\n }\n\n return new Promise((resolve) => {\n // Creating a temporary HTML element so that we can\n // enable it and later disable it without losing the canvas context\n let elementRendered = false;\n\n // Create a named function to handle the event\n const onImageRendered = (eventDetail) => {\n if (elementRendered) {\n return;\n }\n\n // get the canvas element that is the child of the div\n const temporaryCanvas = getOrCreateCanvas(element);\n\n // Copy the temporary canvas to the given canvas\n const context = canvas.getContext('2d');\n context.drawImage(\n temporaryCanvas,\n 0,\n 0,\n temporaryCanvas.width,\n temporaryCanvas.height, // source dimensions\n 0,\n 0,\n canvas.width,\n canvas.height // destination dimensions\n );\n\n elementRendered = true;\n\n // remove based on id\n element.removeEventListener(Events.IMAGE_RENDERED, onImageRendered);\n\n // Ensure pending previous resize calls are done which might have been\n // triggered by the same disableElement call. This is to avoid potential\n // grab of the wrong canvas coordinate from the offscreen renderer since\n // disable might have not finished resizing yet and it will cause weird\n // copy to on screen from an incorrect location in the offscreen renderer.\n setTimeout(() => {\n renderingEngine.disableElement(viewportId);\n\n // remove all the elements that has the same id\n const elements = document.querySelectorAll(\n `[viewport-id-for-remove=\"${uniqueId}\"]`\n );\n elements.forEach((element) => {\n element.remove();\n });\n }, 0);\n resolve(imageId);\n };\n\n element.addEventListener(Events.IMAGE_RENDERED, onImageRendered);\n viewport.renderImageObject(image);\n\n // force a reset camera to center the image\n viewport.resetCamera();\n\n if (modality === 'PT' && !isPTPrescaledWithSUV(image)) {\n viewport.setProperties({\n voiRange: {\n lower: image.minPixelValue,\n upper: image.maxPixelValue,\n },\n });\n }\n\n viewport.render();\n });\n}\n","import { CPUFallbackViewport } from '../../../../types';\n\nconst state = {\n viewport: {},\n};\n\n/**\n * Sets new default values for `getDefaultViewport`\n *\n * @param {Object} viewport - Object that sets new default values for getDefaultViewport\n * @returns {undefined}\n */\nexport default function (viewport: CPUFallbackViewport): void {\n state.viewport = viewport || {};\n}\n\nexport { state };\n","/**\n * Check if the supplied parameter is undefined and throws and error\n * @param {any} checkParam the parameter to validate for undefined\n * @param {any} errorMsg the error message to be thrown\n * @returns {void}\n * @memberof internal\n */\nexport function validateParameterUndefined(\n checkParam: any | undefined,\n errorMsg: string\n): void {\n if (checkParam === undefined) {\n throw new Error(errorMsg);\n }\n}\n\n/**\n * Check if the supplied parameter is undefined or null and throws and error\n * @param {any} checkParam the parameter to validate for undefined\n * @param {any} errorMsg the error message to be thrown\n * @returns {void}\n * @memberof internal\n */\nexport function validateParameterUndefinedOrNull(\n checkParam: any | null | undefined,\n errorMsg: string\n): void {\n if (checkParam === undefined || checkParam === null) {\n throw new Error(errorMsg);\n }\n}\n","import { validateParameterUndefinedOrNull } from './validator';\nimport { IImage } from '../../../../types';\n\n/**\n * Check if the angle is rotated\n * @param {Number} rotation the rotation angle\n * @returns {Boolean} true if the angle is rotated; Otherwise, false.\n * @memberof Internal\n */\nfunction isRotated(rotation?: number | null): boolean {\n return !(\n rotation === null ||\n rotation === undefined ||\n rotation === 0 ||\n rotation === 180\n );\n}\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {any} image The Cornerstone image.\n * @param {Number} rotation Optional. The rotation angle of the image.\n * @return {{width:Number, height:Number}} The Image dimensions\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n rotation = null\n): { height: number; width: number } {\n validateParameterUndefinedOrNull(\n image,\n 'getImageSize: parameter image must not be undefined'\n );\n validateParameterUndefinedOrNull(\n image.width,\n 'getImageSize: parameter image must have width'\n );\n validateParameterUndefinedOrNull(\n image.height,\n 'getImageSize: parameter image must have height'\n );\n\n if (isRotated(rotation)) {\n return {\n height: image.width,\n width: image.height,\n };\n }\n\n return {\n width: image.width,\n height: image.height,\n };\n}\n","import { validateParameterUndefinedOrNull } from './validator';\nimport getImageSize from './getImageSize';\nimport { IImage } from '../../../../types';\n\n/**\n * Calculates the horizontal, vertical and minimum scale factor for an image\n @param canvas - The window size where the image is displayed. This can be any HTML element or structure with a width, height fields (e.g. canvas).\n * @param image - The cornerstone image object\n * @param rotation - The rotation angle of the image.\n * @returns The calculated horizontal, vertical and minimum scale factor\n */\nexport default function (\n canvas: HTMLCanvasElement,\n image: IImage,\n rotation: number | null = null\n): {\n verticalScale: number;\n horizontalScale: number;\n scaleFactor: number;\n} {\n validateParameterUndefinedOrNull(\n canvas,\n 'getImageScale: parameter canvas must not be undefined'\n );\n validateParameterUndefinedOrNull(\n image,\n 'getImageScale: parameter image must not be undefined'\n );\n\n const imageSize = getImageSize(image, rotation);\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n let verticalRatio = 1;\n let horizontalRatio = 1;\n\n if (rowPixelSpacing < columnPixelSpacing) {\n horizontalRatio = columnPixelSpacing / rowPixelSpacing;\n } else {\n // even if they are equal we want to calculate this ratio (the ration might be 0.5)\n verticalRatio = rowPixelSpacing / columnPixelSpacing;\n }\n\n const verticalScale = canvas.height / imageSize.height / verticalRatio;\n const horizontalScale = canvas.width / imageSize.width / horizontalRatio;\n\n // Fit image to window\n return {\n verticalScale,\n horizontalScale,\n scaleFactor: Math.min(horizontalScale, verticalScale),\n };\n}\n","import createViewport from './createViewport';\nimport getImageFitScale from './getImageFitScale';\nimport {\n IImage,\n CPUFallbackColormap,\n CPUFallbackViewport,\n} from '../../../../types';\n\n/**\n * Creates a new viewport object containing default values for the image and canvas\n *\n * @param canvas - A Canvas DOM element\n * @param image - A Cornerstone Image Object\n * @returns viewport - object\n */\nexport default function (\n canvas: HTMLCanvasElement,\n image: IImage,\n modality?: string,\n colormap?: CPUFallbackColormap\n): CPUFallbackViewport {\n if (canvas === undefined) {\n throw new Error(\n 'getDefaultViewport: parameter canvas must not be undefined'\n );\n }\n\n if (image === undefined) {\n return createViewport();\n }\n\n // Fit image to window\n const scale = getImageFitScale(canvas, image, 0).scaleFactor;\n\n let voi;\n\n if (modality === 'PT' && image.isPreScaled) {\n voi = {\n windowWidth: 5,\n windowCenter: 2.5,\n };\n } else if (\n image.windowWidth !== undefined &&\n image.windowCenter !== undefined\n ) {\n voi = {\n windowWidth: Array.isArray(image.windowWidth)\n ? image.windowWidth[0]\n : image.windowWidth,\n windowCenter: Array.isArray(image.windowCenter)\n ? image.windowCenter[0]\n : image.windowCenter,\n };\n }\n\n return {\n scale,\n translation: {\n x: 0,\n y: 0,\n },\n voi,\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n modality,\n voiLUT: image.voiLUT,\n colormap: colormap !== undefined ? colormap : image.colormap,\n displayedArea: {\n tlhc: {\n x: 1,\n y: 1,\n },\n brhc: {\n x: image.columns,\n y: image.rows,\n },\n rowPixelSpacing:\n image.rowPixelSpacing === undefined ? 1 : image.rowPixelSpacing,\n columnPixelSpacing:\n image.columnPixelSpacing === undefined ? 1 : image.columnPixelSpacing,\n presentationSizeMode: 'NONE',\n },\n };\n}\n","import { state } from './setDefaultViewport';\nimport {\n CPUFallbackViewportDisplayedArea,\n CPUFallbackViewport,\n} from '../../../../types';\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Creates the default displayed area.\n * C.10.4 Displayed Area Module: This Module describes Attributes required to define a Specified Displayed Area space.\n *\n * @returns {tlhc: {x,y}, brhc: {x, y},rowPixelSpacing: Number, columnPixelSpacing: Number, presentationSizeMode: Number} displayedArea object\n * @memberof Internal\n */\nfunction createDefaultDisplayedArea(): CPUFallbackViewportDisplayedArea {\n return {\n // Top Left Hand Corner\n tlhc: {\n x: 1,\n y: 1,\n },\n // Bottom Right Hand Corner\n brhc: {\n x: 1,\n y: 1,\n },\n rowPixelSpacing: 1,\n columnPixelSpacing: 1,\n presentationSizeMode: 'NONE',\n };\n}\n\n/**\n * Creates a new viewport object containing default values\n *\n * @returns {Viewport} viewport object\n * @memberof Internal\n */\nexport default function createViewport(): CPUFallbackViewport {\n const displayedArea = createDefaultDisplayedArea();\n const initialDefaultViewport = {\n scale: 1,\n translation: {\n x: 0,\n y: 0,\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined,\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false,\n displayedArea,\n };\n\n return Object.assign({}, initialDefaultViewport, state.viewport);\n}\n","import {\n CPUFallbackTransform,\n Point2,\n TransformMatrix2D,\n} from '../../../../types';\n\n// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nexport class Transform implements CPUFallbackTransform {\n private m: TransformMatrix2D;\n\n constructor() {\n this.reset();\n }\n\n getMatrix(): TransformMatrix2D {\n return this.m;\n }\n\n reset(): void {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n\n clone(): CPUFallbackTransform {\n const transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n\n multiply(matrix: TransformMatrix2D): void {\n const m11 = this.m[0] * matrix[0] + this.m[2] * matrix[1];\n const m12 = this.m[1] * matrix[0] + this.m[3] * matrix[1];\n\n const m21 = this.m[0] * matrix[2] + this.m[2] * matrix[3];\n const m22 = this.m[1] * matrix[2] + this.m[3] * matrix[3];\n\n const dx = this.m[0] * matrix[4] + this.m[2] * matrix[5] + this.m[4];\n const dy = this.m[1] * matrix[4] + this.m[3] * matrix[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n\n invert(): void {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n\n rotate(rad: number): void {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n\n translate(x: number, y: number): void {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n\n scale(sx: number, sy: number) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n\n transformPoint(point: Point2): Point2 {\n const x = point[0];\n const y = point[1];\n\n return [\n x * this.m[0] + y * this.m[2] + this.m[4],\n x * this.m[1] + y * this.m[3] + this.m[5],\n ];\n }\n}\n","import { Transform } from './transform';\nimport {\n CPUFallbackEnabledElement,\n CPUFallbackTransform,\n} from '../../../../types';\n\n/**\n * Calculate the transform for a Cornerstone enabled element\n *\n * @param enabledElement - The Cornerstone Enabled Element\n * @param scale - The viewport scale\n * @returns The current transform\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n scale?: number\n): CPUFallbackTransform {\n const transform = new Transform();\n\n if (!enabledElement.viewport.displayedArea) {\n return transform;\n }\n\n // Move to center of canvas\n transform.translate(\n enabledElement.canvas.width / 2,\n enabledElement.canvas.height / 2\n );\n\n // Apply the rotation before scaling for non square pixels\n const angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate((angle * Math.PI) / 180);\n }\n\n // Apply the scale\n let widthScale = enabledElement.viewport.scale;\n let heightScale = enabledElement.viewport.scale;\n\n const width =\n enabledElement.viewport.displayedArea.brhc.x -\n (enabledElement.viewport.displayedArea.tlhc.x - 1);\n const height =\n enabledElement.viewport.displayedArea.brhc.y -\n (enabledElement.viewport.displayedArea.tlhc.y - 1);\n\n if (enabledElement.viewport.displayedArea.presentationSizeMode === 'NONE') {\n if (\n enabledElement.image.rowPixelSpacing <\n enabledElement.image.columnPixelSpacing\n ) {\n widthScale *=\n enabledElement.image.columnPixelSpacing /\n enabledElement.image.rowPixelSpacing;\n } else if (\n enabledElement.image.columnPixelSpacing <\n enabledElement.image.rowPixelSpacing\n ) {\n heightScale *=\n enabledElement.image.rowPixelSpacing /\n enabledElement.image.columnPixelSpacing;\n }\n } else {\n // These should be good for \"TRUE SIZE\" and \"MAGNIFY\"\n widthScale = enabledElement.viewport.displayedArea.columnPixelSpacing;\n heightScale = enabledElement.viewport.displayedArea.rowPixelSpacing;\n\n if (\n enabledElement.viewport.displayedArea.presentationSizeMode ===\n 'SCALE TO FIT'\n ) {\n // Fit TRUE IMAGE image (width/height) to window\n const verticalScale =\n enabledElement.canvas.height / (height * heightScale);\n const horizontalScale =\n enabledElement.canvas.width / (width * widthScale);\n\n // Apply new scale\n widthScale = heightScale = Math.min(horizontalScale, verticalScale);\n\n if (\n enabledElement.viewport.displayedArea.rowPixelSpacing <\n enabledElement.viewport.displayedArea.columnPixelSpacing\n ) {\n widthScale *=\n enabledElement.viewport.displayedArea.columnPixelSpacing /\n enabledElement.viewport.displayedArea.rowPixelSpacing;\n } else if (\n enabledElement.viewport.displayedArea.columnPixelSpacing <\n enabledElement.viewport.displayedArea.rowPixelSpacing\n ) {\n heightScale *=\n enabledElement.viewport.displayedArea.rowPixelSpacing /\n enabledElement.viewport.displayedArea.columnPixelSpacing;\n }\n }\n }\n\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate((-angle * Math.PI) / 180);\n }\n\n // Apply the pan offset\n transform.translate(\n enabledElement.viewport.translation.x,\n enabledElement.viewport.translation.y\n );\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate((angle * Math.PI) / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Move back from center of image\n transform.translate(-width / 2, -height / 2);\n\n return transform;\n}\n","/**\n * Use the performance.now() method if possible, and if not, use Date.now()\n *\n * @return {number} Time elapsed since the time origin\n * @memberof Polyfills\n */\nexport default function (): number {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n}\n","/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n * @memberof Objects\n */\n\n/**\n * @module: VOILUT\n */\n\n/**\n * Generates the linear VOI LUT function.\n * From the DICOM standard:\n * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1\n * ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax- ymin) + ymin\n * clipped to the ymin...ymax range\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n * @memberof VOILUT\n */\nfunction generateLinearVOILUT(windowWidth: number, windowCenter: number) {\n return function (modalityLutValue) {\n const value =\n ((modalityLutValue - (windowCenter - 0.5)) / (windowWidth - 1) + 0.5) *\n 255.0;\n return Math.min(Math.max(value, 0), 255);\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n * @memberof VOILUT\n */\nfunction generateNonLinearVOILUT(voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;\n const shift = bitsPerEntry - 8;\n const minValue = voiLUT.lut[0] >> shift;\n const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n * @memberof VOILUT\n */\nexport default function (windowWidth: number, windowCenter: number, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n}\n","import calculateTransform from './calculateTransform';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Sets the canvas context transformation matrix to the pixel coordinate system. This allows\n * geometry to be driven using the canvas context using coordinates in the pixel coordinate system\n * @param {EnabledElement} enabledElement The\n * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas\n * @param {Number} [scale] Optional scale to apply\n * @returns {void}\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n context: CanvasRenderingContext2D,\n scale?: number\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'setToPixelCoordinateSystem: parameter enabledElement must not be undefined'\n );\n }\n if (context === undefined) {\n throw new Error(\n 'setToPixelCoordinateSystem: parameter context must not be undefined'\n );\n }\n\n const transform = calculateTransform(enabledElement, scale);\n const m = transform.getMatrix();\n\n context.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n}\n","import { CPUFallbackEnabledElement, IImage } from '../../../../types';\n\n/**\n * Determine whether or not an Enabled Element needs to be re-rendered.\n *\n * If the imageId has changed, or if any of the last rendered viewport\n * parameters have changed, this function will return true.\n *\n * @param enabledElement - An Enabled Element\n * @param image - An Image\n * @returns Whether - or not the Enabled Element needs to re-render its image\n */\nexport default function doesImageNeedToBeRendered(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage\n): boolean {\n const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n const lastRenderedViewport =\n enabledElement.renderingTools.lastRenderedViewport;\n\n return (\n image.imageId !== lastRenderedImageId ||\n !lastRenderedViewport ||\n lastRenderedViewport.windowCenter !==\n enabledElement.viewport.voi.windowCenter ||\n lastRenderedViewport.windowWidth !==\n enabledElement.viewport.voi.windowWidth ||\n lastRenderedViewport.invert !== enabledElement.viewport.invert ||\n lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||\n lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||\n lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||\n lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||\n lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||\n lastRenderedViewport.colormap !== enabledElement.viewport.colormap\n );\n}\n","import { CPUFallbackEnabledElement, IImage } from '../../../../types';\n\n/**\n * Sets size and clears canvas\n *\n * @param {Object} enabledElement Cornerstone Enabled Element\n * @param {Object} image Image to be rendered\n * @returns {void}\n * @memberof rendering\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n image: IImage\n): void {\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n const renderCanvasData = canvasContext.getImageData(\n 0,\n 0,\n image.width,\n image.height\n );\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n}\n","import {\n CPUFallbackEnabledElement,\n CPUFallbackRenderingTools,\n} from '../../../../types';\n\n/**\n * Saves the parameters of the last render into renderingTools, used later to decide if data can be reused.\n *\n * @param {Object} enabledElement Cornerstone EnabledElement\n * @returns {Object} enabledElement.renderingTools\n * @memberof rendering\n */\n\nexport default function (\n enabledElement: CPUFallbackEnabledElement\n): CPUFallbackRenderingTools {\n const imageId = enabledElement.image.imageId;\n const viewport = enabledElement.viewport;\n const isColor = enabledElement.image.color;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedIsColor = isColor;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap,\n };\n\n return enabledElement.renderingTools;\n}\n","import now from './now';\nimport generateColorLUT from './generateColorLUT';\nimport storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData';\nimport storedRGBAPixelDataToCanvasImageData from './storedRGBAPixelDataToCanvasImageData';\nimport setToPixelCoordinateSystem from './setToPixelCoordinateSystem';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered';\nimport initializeRenderCanvas from './initializeRenderCanvas';\nimport saveLastRendered from './saveLastRendered';\nimport {\n IImage,\n CPUFallbackViewport,\n CPUFallbackEnabledElement,\n} from '../../../../types';\n\n/**\n * Generates an appropriate Look Up Table to render the given image with the given window width and level (specified in the viewport)\n * Uses an internal cache for performance\n *\n * @param {Object} image The image to be rendered\n * @param {Object} viewport The viewport values used for rendering\n * @returns {Uint8ClampedArray} Look Up Table array.\n * @memberof rendering\n */\nfunction getLut(image: IImage, viewport: CPUFallbackViewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (\n image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n image.cachedLut.invert === viewport.invert\n ) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateColorLUT(\n image,\n viewport.voi.windowWidth,\n viewport.voi.windowCenter,\n viewport.invert\n );\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n}\n\n/**\n * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate\n * it is returned, otherwise adjustments are made. It also sets the color transfer functions.\n *\n * @param enabledElement - The cornerstone enabled element\n * @param image - The image to be rendered\n * @param invalidated - Is pixel data valid\n * @returns An appropriate canvas for rendering the image\n * @memberof rendering\n */\nfunction getRenderCanvas(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage,\n invalidated: boolean\n): HTMLCanvasElement {\n const canvasWasColor =\n enabledElement.renderingTools.lastRenderedIsColor === true;\n\n if (!enabledElement.renderingTools.renderCanvas || !canvasWasColor) {\n enabledElement.renderingTools.renderCanvas =\n document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing. Note that this is 256/128, and NOT 255/127, per the DICOM\n // standard, but allow either.\n const { windowWidth, windowCenter } = enabledElement.viewport.voi;\n if (\n (windowWidth === 256 || windowWidth === 255) &&\n (windowCenter === 128 || windowCenter === 127) &&\n enabledElement.viewport.invert === false &&\n image.getCanvas &&\n image.getCanvas()\n ) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if (\n doesImageNeedToBeRendered(enabledElement, image) === false &&\n invalidated !== true\n ) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (\n renderCanvas.width !== image.width ||\n renderCanvas.height !== image.height\n ) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const colorLUT = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n storedRGBAPixelDataToCanvasImageData(\n image,\n colorLUT,\n renderCanvasData.data\n );\n } else {\n storedColorPixelDataToCanvasImageData(\n image,\n colorLUT,\n renderCanvasData.data\n );\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n * @memberof rendering\n */\nexport function renderColorImage(\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'renderColorImage: enabledElement parameter must not be undefined'\n );\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error(\n 'renderColorImage: image must be loaded before it can be drawn'\n );\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(\n 0,\n 0,\n enabledElement.canvas.width,\n enabledElement.canvas.height\n );\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n\n const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;\n const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;\n const width = enabledElement.viewport.displayedArea.brhc.x - sx;\n const height = enabledElement.viewport.displayedArea.brhc.y - sy;\n\n context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n","import getVOILUT from './getVOILut';\nimport { IImage, CPUFallbackLUT } from '../../../../types';\n\n/**\n * Creates a LUT used while rendering to convert stored pixel values to\n * display pixels\n *\n * @param image - A Cornerstone Image Object\n * @param windowWidth - The Window Width\n * @param windowCenter - The Window Center\n * @param invert - A boolean describing whether or not the image has been inverted\n * @param voiLUT- A Volume of Interest Lookup Table\n *\n * @returns A lookup table to apply to the image\n */\nexport default function generateColorLUT(\n image: IImage,\n windowWidth: number | number[],\n windowCenter: number | number[],\n invert: boolean,\n voiLUT?: CPUFallbackLUT\n) {\n const maxPixelValue = image.maxPixelValue;\n const minPixelValue = image.minPixelValue;\n const offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n const length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n const lut = image.cachedLut.lutArray;\n const vlutfn = getVOILUT(\n Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,\n Array.isArray(windowCenter) ? windowCenter[0] : windowCenter,\n voiLUT\n );\n\n if (invert === true) {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = 255 - vlutfn(storedValue);\n }\n } else {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = vlutfn(storedValue);\n }\n }\n\n return lut;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * Converts stored RGBA color pixel values to display pixel values using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Blue\n canvasImageDataData[canvasImageDataIndex++] =\n pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] =\n pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * Converts stored color pixel values to display pixel values using a LUT.\n *\n * Note: Skips alpha value for any input image pixel data.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex] + -minPixelValue]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import type { IImage, CPUFallbackViewport } from '../../../../types';\n\n/**\n * Computes the VOI to display all the pixels if no VOI LUT data (Window Width/Window Center or voiLUT) exists on the viewport object.\n *\n * @param viewport - Object containing the viewport properties\n * @param image - An Image loaded by a Cornerstone Image Loader\n */\nexport default function computeAutoVoi(\n viewport: CPUFallbackViewport,\n image: IImage\n): void {\n if (hasVoi(viewport)) {\n return;\n }\n\n const maxVoi = image.maxPixelValue * image.slope + image.intercept;\n const minVoi = image.minPixelValue * image.slope + image.intercept;\n const ww = maxVoi - minVoi;\n const wc = (maxVoi + minVoi) / 2;\n\n if (viewport.voi === undefined) {\n viewport.voi = {\n windowWidth: ww,\n windowCenter: wc,\n };\n } else {\n viewport.voi.windowWidth = ww;\n viewport.voi.windowCenter = wc;\n }\n}\n\n/**\n * Check if viewport has voi LUT data\n * @param viewport - The viewport to check for voi LUT data\n * @returns true viewport has LUT data (Window Width/Window Center or voiLUT). Otherwise, false.\n */\nfunction hasVoi(viewport: CPUFallbackViewport): boolean {\n const hasLut =\n viewport.voiLUT && viewport.voiLUT.lut && viewport.voiLUT.lut.length > 0;\n\n return (\n hasLut ||\n (viewport.voi.windowWidth !== undefined &&\n viewport.voi.windowCenter !== undefined)\n );\n}\n","/**\n * Check if two lookup tables match\n *\n * @param {LUT} a A lookup table function\n * @param {LUT} b Another lookup table function\n * @return {boolean} Whether or not they match\n * @memberof rendering\n */\nexport default function (a: any, b: any) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return a.id === b.id;\n}\n","import computeAutoVoi from './computeAutoVoi';\nimport lutMatches from './lutMatches';\nimport generateLut from './generateLut';\nimport { IImage, CPUFallbackViewport } from '../../../../types';\n\n/**\n * Retrieve or generate a LUT Array for an Image and Viewport\n *\n * @param {Image} image An Image Object\n * @param {Viewport} viewport An Viewport Object\n * @param {Boolean} invalidated Whether or not the LUT data has been invalidated\n * (e.g. by a change to the windowWidth, windowCenter, or invert viewport parameters).\n * @return {Uint8ClampedArray} LUT Array\n * @memberof rendering\n */\nexport default function (\n image: IImage,\n viewport: CPUFallbackViewport,\n invalidated: boolean\n): Uint8ClampedArray {\n // If we have a cached lut and it has the right values, return it immediately\n if (\n image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&\n lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&\n image.cachedLut.invert === viewport.invert &&\n invalidated !== true\n ) {\n return image.cachedLut.lutArray;\n }\n\n computeAutoVoi(viewport, image);\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(\n image,\n viewport.voi.windowWidth,\n viewport.voi.windowCenter,\n viewport.invert,\n viewport.modalityLUT,\n viewport.voiLUT\n );\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n}\n","import getModalityLut from './getModalityLut';\nimport getVOILUT from './getVOILut';\nimport { IImage, CPUFallbackLUT } from '../../../../types';\n\n/**\n * Creates a LUT used while rendering to convert stored pixel values to\n * display pixels\n *\n * @param image - A Cornerstone Image Object\n * @param windowWidth - The Window Width\n * @param windowCenter - The Window Center\n * @param invert - A boolean describing whether or not the image has been inverted\n * @param modalityLUT - A modality Lookup Table\n * @param voiLUT - A Volume of Interest Lookup Table\n *\n * @returns A lookup table to apply to the image\n */\nexport default function (\n image: IImage,\n windowWidth: number,\n windowCenter: number,\n invert: boolean,\n modalityLUT: CPUFallbackLUT,\n voiLUT: CPUFallbackLUT\n): Uint8ClampedArray {\n const maxPixelValue = image.maxPixelValue;\n const minPixelValue = image.minPixelValue;\n const offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n const length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n const lut = image.cachedLut.lutArray;\n\n const mlutfn = getModalityLut(image.slope, image.intercept, modalityLUT);\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\n\n if (image.isPreScaled) {\n // if the image is already preScaled, it means that the slop and the intercept\n // are applied and there is no need for a modalityLut\n if (invert === true) {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = 255 - vlutfn(storedValue);\n }\n } else {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = vlutfn(storedValue);\n }\n }\n } else {\n if (invert === true) {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));\n }\n } else {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = vlutfn(mlutfn(storedValue));\n }\n }\n }\n\n return lut;\n}\n","/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n * @memberof Internal\n */\nfunction generateLinearModalityLUT(slope, intercept) {\n return (storedPixelValue) => storedPixelValue * slope + intercept;\n}\n\nfunction generateNonLinearModalityLUT(modalityLUT) {\n const minValue = modalityLUT.lut[0];\n const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return (storedPixelValue) => {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n * @memberof Internal\n */\nexport default function (\n slope: number,\n intercept: number,\n modalityLUT: unknown\n) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n}\n","import storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData';\nimport storedPixelDataToCanvasImageDataPET from './storedPixelDataToCanvasImageDataPET';\nimport storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA';\nimport setToPixelCoordinateSystem from './setToPixelCoordinateSystem';\nimport now from './now';\nimport getLut from './getLut';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered';\nimport initializeRenderCanvas from './initializeRenderCanvas';\nimport saveLastRendered from './saveLastRendered';\nimport { IImage, CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate\n * it is returned, otherwise adjustments are made. It also sets the color transfer functions.\n *\n * @param {Object} enabledElement The cornerstone enabled element\n * @param {Object} image The image to be rendered\n * @param {Boolean} invalidated Is pixel data valid\n * @param {Boolean} [useAlphaChannel = true] Will an alpha channel be used\n * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image\n * @memberof rendering\n */\nfunction getRenderCanvas(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage,\n invalidated: boolean,\n useAlphaChannel = true\n): HTMLCanvasElement {\n const canvasWasColor =\n enabledElement.renderingTools.lastRenderedIsColor === true;\n\n if (!enabledElement.renderingTools.renderCanvas || canvasWasColor) {\n enabledElement.renderingTools.renderCanvas =\n document.createElement('canvas');\n initializeRenderCanvas(enabledElement, image);\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if (\n doesImageNeedToBeRendered(enabledElement, image) === false &&\n invalidated !== true\n ) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (\n renderCanvas.width !== image.width ||\n renderCanvas.height !== image.height\n ) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n image.stats = image.stats || {};\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n let start = now();\n image.stats.lastLutGenerateTime = now() - start;\n\n const { viewport } = enabledElement;\n\n // If modality is 'PT' and the image is scaled then the results are floating points,\n // and we cannot create a lut for it (cannot have float indices). Therefore,\n // we use a mapping function to get the voiLUT from the values by applying\n // the windowLevel and windowWidth.\n if (viewport.modality === 'PT' && image.isPreScaled) {\n const { windowWidth, windowCenter } = viewport.voi;\n const minimum = windowCenter - windowWidth / 2;\n const maximum = windowCenter + windowWidth / 2;\n const range = maximum - minimum;\n const collectedMultiplierTerms = 255.0 / range;\n\n let petVOILutFunction;\n\n if (viewport.invert) {\n petVOILutFunction = (value) =>\n 255 - (value - minimum) * collectedMultiplierTerms;\n } else {\n // Note, don't need to math.floor, that is dealt with by setting the value in the Uint8Array.\n petVOILutFunction = (value) =>\n (value - minimum) * collectedMultiplierTerms;\n }\n\n storedPixelDataToCanvasImageDataPET(\n image,\n petVOILutFunction,\n renderCanvasData.data\n );\n } else {\n // Get the lut to use\n const lut = getLut(image, viewport, invalidated);\n\n if (useAlphaChannel) {\n storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);\n } else {\n storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);\n }\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n * @memberof rendering\n */\nexport function renderGrayscaleImage(\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'drawImage: enabledElement parameter must not be undefined'\n );\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(\n 0,\n 0,\n enabledElement.canvas.width,\n enabledElement.canvas.height\n );\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n\n const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;\n const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;\n const width = enabledElement.viewport.displayedArea.brhc.x - sx;\n const height = enabledElement.viewport.displayedArea.brhc.y - sy;\n\n context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lutFunction: (value: number) => number,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n // const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lutFunction(\n pixelData[storedPixelDataIndex++]\n ); // Alpha\n canvasImageDataIndex += 4;\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let pixelValue;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import { Point2, Point4, CPUFallbackLookupTable } from '../../../../types';\n\n// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nconst BELOW_RANGE_COLOR_INDEX = 0;\nconst ABOVE_RANGE_COLOR_INDEX = 1;\nconst NAN_COLOR_INDEX = 2;\n\n/**\n * Converts an HSV (Hue, Saturation, Value) color to RGB (Red, Green, Blue) color value\n * @param {Number} hue A number representing the hue color value\n * @param {any} sat A number representing the saturation color value\n * @param {any} val A number representing the value color value\n * @returns {Numberp[]} An RGB color array\n */\nfunction HSVToRGB(hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n const rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n const hueCase = Math.floor(hue * 6);\n const frac = 6 * hue - hueCase;\n const lx = val * (1 - sat);\n const ly = val * (1 - sat * frac);\n const lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\n/**\n * Maps scalar values into colors via a lookup table\n * LookupTable is an object that is used by mapper objects to map scalar values into rgba (red-green-blue-alpha transparency) color specification,\n * or rgba into scalar values. The color table can be created by direct insertion of color values, or by specifying hue, saturation, value, and alpha range and generating a table\n */\nclass LookupTable implements CPUFallbackLookupTable {\n NumberOfColors: number;\n Ramp: string;\n TableRange: Point2;\n HueRange: Point2;\n SaturationRange: Point2;\n ValueRange: Point2;\n AlphaRange: Point2;\n NaNColor: Point4;\n BelowRangeColor: Point4;\n UseBelowRangeColor: boolean;\n AboveRangeColor: Point4;\n UseAboveRangeColor: boolean;\n InputRange: Point2;\n Table: Point4[];\n\n /**\n * Creates a default linear LookupTable object with 256 colors.\n */\n constructor() {\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n /**\n * Specify the number of values (i.e., colors) in the lookup table.\n * @param {Number} number The number of colors in he LookupTable\n * @returns {void}\n * @memberof Colors\n */\n public setNumberOfTableValues(number) {\n this.NumberOfColors = number;\n }\n\n /**\n * Set the shape of the table ramp to either 'linear', 'scurve' or 'sqrt'\n * @param {String} ramp A string value representing the shape of the table. Allowed values are 'linear', 'scurve' or 'sqrt'\n * @returns {void}\n * @memberof Colors\n */\n public setRamp(ramp) {\n this.Ramp = ramp;\n }\n\n /**\n * Sets the minimum/maximum scalar values for scalar mapping.\n * Scalar values less than minimum range value are clamped to minimum range value.\n * Scalar values greater than maximum range value are clamped to maximum range value.\n * @param {Number} start A double representing the minimum scaler value of the LookupTable\n * @param {any} end A double representing the maximum scaler value of the LookupTable\n * @returns {void}\n * @memberof Colors\n */\n public setTableRange(start, end) {\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n\n /**\n * Set the range in hue (using automatic generation). Hue ranges between [0,1].\n * @param {Number} start A double representing the minimum hue value in a range. Min. is 0\n * @param {Number} end A double representing the maximum hue value in a range. Max. is 1\n * @returns {void}\n * @memberof Colors\n */\n public setHueRange(start, end) {\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n\n /**\n * Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n * @param {Number} start A double representing the minimum Saturation value in a range. Min. is 0\n * @param {Number} end A double representing the maximum Saturation value in a range. Max. is 1\n * @returns {void}\n * @memberof Colors\n */\n public setSaturationRange(start, end) {\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n\n /**\n * Set the range in value (using automatic generation). Value ranges between [0,1].\n * @param {Numeber } start A double representing the minimum value in a range. Min. is 0\n * @param {Numeber} end A double representing the maximum value in a range. Max. is 1\n * @returns {void}\n * @memberof Colors\n */\n public setValueRange(start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n\n /**\n * (Not Used) Sets the range of scalars which will be mapped.\n * @param {Number} start the minimum scalar value in the range\n * @param {Number} end the maximum scalar value in the range\n * @returns {void}\n * @memberof Colors\n */\n public setRange(start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n\n /**\n * Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n * @param {Number} start A double representing the minimum alpha value\n * @param {Number} end A double representing the maximum alpha value\n * @returns {void}\n * @memberof Colors\n */\n public setAlphaRange(start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n\n /**\n * Map one value through the lookup table and return the color as an\n * RGBA array of doubles between 0 and 1.\n * @param {Number} scalar A double scalar value which will be mapped to a color in the LookupTable\n * @returns {Number[]} An RGBA array of doubles between 0 and 1\n * @memberof Colors\n */\n public getColor(scalar) {\n return this.mapValue(scalar);\n }\n\n /**\n * Generate lookup table from hue, saturation, value, alpha min/max values. Table is built from linear ramp of each value.\n * @param {Boolean} force true to force the build of the LookupTable. Otherwie, false. This is useful if a lookup table has been defined manually\n * (using SetTableValue) and then an application decides to rebuild the lookup table using the implicit process.\n * @returns {void}\n * @memberof Colors\n */\n public build(force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n const maxIndex = this.NumberOfColors - 1;\n\n let hinc, sinc, vinc, ainc;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (let i = 0; i <= maxIndex; i++) {\n const hue = this.HueRange[0] + i * hinc;\n const sat = this.SaturationRange[0] + i * sinc;\n const val = this.ValueRange[0] + i * vinc;\n const alpha = this.AlphaRange[0] + i * ainc;\n\n const rgb = HSVToRGB(hue, sat, val);\n const c_rgba: Point4 = [0, 0, 0, 0];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(\n 127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI))\n );\n c_rgba[1] = Math.floor(\n 127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI))\n );\n c_rgba[2] = Math.floor(\n 127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI))\n );\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error(`Invalid Ramp value (${this.Ramp})`);\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n\n /**\n * Ensures the out-of-range colors (Below range and Above range) are set correctly.\n * @returns {void}\n * @memberof Colors\n */\n private buildSpecialColors() {\n const numberOfColors = this.NumberOfColors;\n const belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n const aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n const nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n /**\n * Similar to GetColor - Map one value through the lookup table and return the color as an\n * RGBA array of doubles between 0 and 1.\n * @param {Numeber} v A double scalar value which will be mapped to a color in the LookupTable\n * @returns {Number[]} An RGBA array of doubles between 0 and 1\n * @memberof Colors\n */\n private mapValue(v) {\n const index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n\n /**\n * Return the table index associated with a particular value.\n * @param {Number} v A double value which table index will be returned.\n * @returns {Number} The index in the LookupTable\n * @memberof Colors\n */\n private getIndex(v) {\n const p = {\n Range: [],\n MaxIndex: this.NumberOfColors - 1,\n Shift: -this.TableRange[0],\n Scale: 1,\n };\n\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n let index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n\n /**\n * Directly load color into lookup table. Use [0,1] double values for color component specification.\n * Make sure that you've either used the Build() method or used SetNumberOfTableValues() prior to using this method.\n * @param {Number} index The index in the LookupTable of where to insert the color value\n * @param {Number[]} rgba An array of [0,1] double values for an RGBA color component\n * @returns {void}\n * @memberof Colors\n */\n public setTableValue(index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error(\n `Can't set the table value for negative index (${index})`\n );\n }\n\n if (index >= this.NumberOfColors) {\n new Error(\n `Index ${index} is greater than the number of colors ${this.NumberOfColors}`\n );\n }\n\n this.Table[index] = rgba;\n\n if (index === 0 || index === this.NumberOfColors - 1) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n}\n\nexport default LookupTable;\n","import LookupTable from './lookupTable';\nimport CPU_COLORMAPS from '../../../../constants/cpuColormaps';\nimport {\n CPUFallbackColormap,\n CPUFallbackColormapData,\n Point4,\n} from '../../../../types';\n\nconst COLOR_TRANSPARENT: Point4 = [0, 0, 0, 0];\n\n/**\n * Generate linearly spaced vectors\n * http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\n * @param {Number} a A number representing the first vector\n * @param {Number} b A number representing the second vector\n * @param {Number} n The number of linear spaced vectors to generate\n * @returns {Array} An array of points representing linear spaced vectors.\n * @memberof Colors\n */\nfunction linspace(a: number, b: number, n: number): number[] {\n n = n === null ? 100 : n;\n\n const increment = (b - a) / (n - 1);\n const vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n/**\n * Returns the \"rank/index\" of the element in a sorted array if found or the highest index if not. Uses (binary search)\n * @param {Array} array A sorted array to search in\n * @param {any} elem the element in the array to search for\n * @returns {number} The rank/index of the element in the given array\n * @memberof Colors\n */\nfunction getRank(array, elem) {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = left + Math.floor((right - left) / 2);\n const midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n/**\n * Find the indices into a sorted array a such that, if the corresponding elements\n * In v were inserted before the indices, the order of a would be preserved.\n * http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\n * @param {Array} inputArray The array where the values will be inserted\n * @param {Array} values An array of the values to be inserted into the inputArray\n * @returns {Array} The indices where elements should be inserted to maintain order.\n * @memberof Colors\n */\nfunction searchSorted(inputArray, values) {\n let i;\n const indexes = [];\n const len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n/**\n * Creates an *N* -element 1-d lookup table\n * @param {Number} N The number of elements in the result lookup table\n * @param {Array} data represented by a list of x,y0,y1 mapping correspondences. Each element in this\n * List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n * A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n * Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n * The value of y for values of x <= to that given, and y1 is the value to be used for x >\n * Than that given). The list must start with x=0, end with x=1, and all values of x must be\n * In increasing order. Values between the given mapping points are determined by simple linear\n * Interpolation.\n * @param {any} gamma value denotes a \"gamma curve\" value which adjusts the brightness\n * at the bottom and top of the map.\n * @returns {any[]} an array \"result\" where result[x*(N-1)] gives the closest value for\n * Values of x between 0 and 1.\n * @memberof Colors\n */\nfunction makeMappingArray(N, data, gamma) {\n let i;\n const x = [];\n const y0 = [];\n const y1 = [];\n const lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n const element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n const xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n const xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n const index = xLinSpaceIndexes[i];\n const colorPercent =\n (xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]);\n const colorDelta = y0[index] - y1[index - 1];\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n/**\n * Creates a Colormap based on lookup tables using linear segments.\n * @param {{red:Array, green:Array, blue:Array}} segmentedData An object with a red, green and blue entries.\n * Each entry should be a list of x, y0, y1 tuples, forming rows in a table.\n * @param {Number} N The number of elements in the result Colormap\n * @param {any} gamma value denotes a \"gamma curve\" value which adjusts the brightness\n * at the bottom and top of the Colormap.\n * @returns {Array} The created Colormap object\n * @description The lookup table is generated using linear interpolation for each\n * Primary color, with the 0-1 domain divided into any number of\n * Segments.\n * https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\n * @memberof Colors\n */\nfunction createLinearSegmentedColormap(segmentedData, N, gamma) {\n let i;\n const lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n const redLut = makeMappingArray(N, segmentedData.red, gamma);\n const greenLut = makeMappingArray(N, segmentedData.green, gamma);\n const blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n const red = Math.round(redLut[i] * 255);\n const green = Math.round(greenLut[i] * 255);\n const blue = Math.round(blueLut[i] * 255);\n const rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/**\n * Return all available colormaps (id and name)\n * @returns {Array<{id,key}>} An array of colormaps with an object containing the \"id\" and display \"name\"\n * @memberof Colors\n */\nexport function getColormapsList() {\n const colormaps = [];\n const keys = Object.keys(CPU_COLORMAPS);\n\n keys.forEach(function (key) {\n if (CPU_COLORMAPS.hasOwnProperty(key)) {\n const colormap = CPU_COLORMAPS[key];\n\n colormaps.push({\n id: key,\n name: colormap.name,\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Return a colorMap object with the provided id and colormapData\n * if the Id matches existent colorMap objects (check colormapsData) the colormapData is ignored.\n * if the colormapData is not empty, the colorMap will be added to the colormapsData list. Otherwise, an empty colorMap object is returned.\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n * @returns {*} The Colormap Object\n * @memberof Colors\n */\nexport function getColormap(\n id: string,\n colormapData?: CPUFallbackColormapData\n): CPUFallbackColormap {\n let colormap = CPU_COLORMAPS[id];\n\n if (!colormap) {\n colormap = CPU_COLORMAPS[id] = colormapData || {\n name: '',\n colors: [],\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(\n colormap.segmentedData,\n colormap.numColors,\n colormap.gamma\n );\n }\n\n const cpuFallbackColormap: CPUFallbackColormap = {\n getId() {\n return id;\n },\n\n getColorSchemeName() {\n return colormap.name;\n },\n\n setColorSchemeName(name) {\n colormap.name = name;\n },\n\n getNumberOfColors() {\n return colormap.colors.length;\n },\n\n setNumberOfColors(numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n\n getColor(index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n\n getColorRepeating(index) {\n const numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n\n setColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n\n addColor(rgba) {\n colormap.colors.push(rgba);\n },\n\n insertColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n\n removeColor(index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n\n clearColors() {\n colormap.colors = [];\n },\n\n buildLookupTable(lut) {\n if (!lut) {\n return;\n }\n\n const numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (let i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n\n createLookupTable() {\n const lut = new LookupTable();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n\n isValidIndex(index) {\n return index >= 0 && index < colormap.colors.length;\n },\n };\n\n return cpuFallbackColormap;\n}\n","import * as colors from '../colors/index';\nimport now from './now';\nimport type { IImage, CPUFallbackLookupTable } from '../../../../types';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLUT Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT(\n image: IImage,\n grayscaleLut: Uint8ClampedArray,\n colorLUT: CPUFallbackLookupTable,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLUT instanceof colors.LookupTable) {\n clut = colorLUT.Table;\n } else {\n clut = colorLUT;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale =\n grayscaleLut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUT;\n","import * as colors from '../colors/index';\nimport now from './now';\nimport type { IImage, CPUFallbackLookupTable } from '../../../../types';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLUT Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUTPET(\n image: IImage,\n lutFunction: (value: number) => number,\n colorLUT: CPUFallbackLookupTable,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLUT instanceof colors.LookupTable) {\n clut = colorLUT.Table;\n } else {\n clut = colorLUT;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = lutFunction(\n pixelData[storedPixelDataIndex++] + -minPixelValue\n );\n\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = lutFunction(pixelData[storedPixelDataIndex++]);\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUTPET;\n","import setToPixelCoordinateSystem from './setToPixelCoordinateSystem';\nimport now from './now';\nimport initializeRenderCanvas from './initializeRenderCanvas';\nimport getLut from './getLut';\nimport saveLastRendered from './saveLastRendered';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered';\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from './storedPixelDataToCanvasImageDataPseudocolorLUT';\nimport storedPixelDataToCanvasImageDataPseudocolorLUTPET from './storedPixelDataToCanvasImageDataPseudocolorLUTPET';\nimport * as colors from '../colors/index';\nimport type { IImage, CPUFallbackEnabledElement } from '../../../../types';\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate\n * it is returned, otherwise adjustments are made. It also sets the color transfer functions.\n *\n * @param {Object} enabledElement The cornerstone enabled element\n * @param {Object} image The image to be rendered\n * @param {Boolean} invalidated Is pixel data valid\n * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image\n * @memberof rendering\n */\nfunction getRenderCanvas(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage,\n invalidated: boolean\n): HTMLCanvasElement {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas =\n document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n let colormap =\n enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (enabledElement.options && enabledElement.options.colormap) {\n console.warn(\n 'enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead'\n );\n }\n if (colormap && typeof colormap === 'string') {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (\n doesImageNeedToBeRendered(enabledElement, image) === false &&\n invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId\n ) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (\n renderCanvas.width !== image.width ||\n renderCanvas.height !== image.height\n ) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (\n !enabledElement.renderingTools.colorLUT ||\n invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId\n ) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLUT = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n const { viewport } = enabledElement;\n const colorLUT = enabledElement.renderingTools.colorLUT;\n\n if (viewport.modality === 'PT') {\n const { windowWidth, windowCenter } = viewport.voi;\n const minimum = windowCenter - windowWidth / 2;\n const maximum = windowCenter + windowWidth / 2;\n const range = maximum - minimum;\n const collectedMultiplierTerms = 255.0 / range;\n\n let petVOILutFunction;\n\n if (viewport.invert) {\n petVOILutFunction = (value) => {\n return clamp(\n Math.floor(255 - (value - minimum) * collectedMultiplierTerms),\n 0,\n 255\n );\n };\n } else {\n petVOILutFunction = (value) => {\n return clamp(\n Math.floor((value - minimum) * collectedMultiplierTerms),\n 0,\n 255\n );\n };\n }\n\n storedPixelDataToCanvasImageDataPseudocolorLUTPET(\n image,\n petVOILutFunction,\n colorLUT,\n renderCanvasData.data\n );\n } else {\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n storedPixelDataToCanvasImageDataPseudocolorLUT(\n image,\n lut,\n colorLUT,\n renderCanvasData.data\n );\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n * @memberof rendering\n */\nexport function renderPseudoColorImage(\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'drawImage: enabledElement parameter must not be undefined'\n );\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(\n 0,\n 0,\n enabledElement.canvas.width,\n enabledElement.canvas.height\n );\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n\n const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;\n const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;\n const width = enabledElement.viewport.displayedArea.brhc.x - sx;\n const height = enabledElement.viewport.displayedArea.brhc.y - sy;\n\n context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n","import now from './rendering/now';\nimport { renderColorImage } from './rendering/renderColorImage';\nimport { renderGrayscaleImage } from './rendering/renderGrayscaleImage';\nimport { renderPseudoColorImage } from './rendering/renderPseudoColorImage';\nimport { CPUFallbackEnabledElement } from '../../../types';\n\n/**\n * Draw an image to a given enabled element synchronously\n *\n * @param enabledElement - An enabled element to draw into\n * @param invalidated - true if pixel data has been invalidated and cached rendering should not be used\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n const image = enabledElement.image;\n\n // Check if enabledElement can be redrawn\n if (!enabledElement.canvas || !enabledElement.image) {\n return;\n }\n\n // Start measuring the time needed to draw the image.\n const start = now();\n\n image.stats = {\n lastGetPixelDataTime: -1.0,\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\n lastPutImageDataTime: -1.0,\n lastRenderTime: -1.0,\n lastLutGenerateTime: -1.0,\n };\n\n if (image) {\n let render = image.render;\n\n if (!render) {\n if (enabledElement.viewport.colormap) {\n render = renderPseudoColorImage;\n } else if (image.color) {\n render = renderColorImage;\n } else {\n render = renderGrayscaleImage;\n }\n }\n\n render(enabledElement, invalidated);\n }\n\n // Calculate how long it took to draw the image/layers\n const renderTimeInMs = now() - start;\n\n image.stats.lastRenderTime = renderTimeInMs;\n\n enabledElement.invalid = false;\n enabledElement.needsRedraw = false;\n}\n","import { IImage, CPUFallbackEnabledElement } from '../types';\n\nimport getDefaultViewport from '../RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport';\nimport calculateTransform from '../RenderingEngine/helpers/cpuFallback/rendering/calculateTransform';\nimport drawImageSync from '../RenderingEngine/helpers/cpuFallback/drawImageSync';\n\n/**\n * Renders a cornerstone image object to a canvas.\n * Note: this does not load the image but only takes care of the rendering pipeline\n *\n * @param image - Cornerstone image object\n * @param canvas - Canvas element to render to\n */\nexport default function renderToCanvasCPU(\n canvas: HTMLCanvasElement,\n image: IImage,\n modality?: string,\n renderingEngineId?: string\n): Promise {\n const viewport = getDefaultViewport(canvas, image, modality);\n\n const enabledElement: CPUFallbackEnabledElement = {\n canvas,\n viewport,\n image,\n renderingTools: {},\n };\n\n enabledElement.transform = calculateTransform(enabledElement);\n\n const invalidated = true;\n return new Promise((resolve, reject) => {\n drawImageSync(enabledElement, invalidated);\n resolve(image.imageId);\n });\n}\n","import { IImage } from '../types';\n\nimport { loadAndCacheImage } from '../loaders/imageLoader';\nimport * as metaData from '../metaData';\nimport { RequestType } from '../enums';\nimport imageLoadPoolManager from '../requestPool/imageLoadPoolManager';\nimport renderToCanvasGPU from './renderToCanvasGPU';\nimport renderToCanvasCPU from './renderToCanvasCPU';\nimport { getConfiguration } from '../init';\n\ninterface LoadImageOptions {\n canvas: HTMLCanvasElement;\n imageId: string;\n requestType?: RequestType;\n priority?: number;\n renderingEngineId?: string;\n useCPURendering?: boolean;\n}\n\n/**\n * Loads and renders an imageId to a Canvas. It will use the GPU rendering pipeline\n * for image by default but you can force the CPU rendering pipeline by setting the\n * useCPURendering parameter to true.\n *\n * @example\n * ```\n * const canvas = document.getElementById('myCanvas')\n * const imageId = 'myImageId'\n *\n * loadImageToCanvas(canvas, imageId)\n * ```\n * @param canvas - Canvas element to render to\n * @param imageId - The imageId to render\n * @param requestType - The type of request (default to interaction), can be 'interaction' or 'prefetch' or 'thumbnail'\n * the order of loading for the pool manager is interaction, thumbnail, prefetch\n * @param priority - The priority of the request within the request type (lower is higher priority)\n * @param useCPURendering - Force the use of the CPU rendering pipeline (default to false)\n * @returns - A promise that resolves when the image has been rendered with the imageId\n */\nexport default function loadImageToCanvas(\n options: LoadImageOptions\n): Promise {\n const {\n canvas,\n imageId,\n requestType = RequestType.Thumbnail,\n priority = -5,\n renderingEngineId = '_thumbnails',\n useCPURendering = false,\n } = options;\n\n const renderFn = useCPURendering ? renderToCanvasCPU : renderToCanvasGPU;\n\n return new Promise((resolve, reject) => {\n function successCallback(image: IImage, imageId: string) {\n const { modality } = metaData.get('generalSeriesModule', imageId) || {};\n\n image.isPreScaled = image.isPreScaled || image.preScale?.scaled;\n\n renderFn(canvas, image, modality, renderingEngineId).then(() => {\n resolve(imageId);\n });\n }\n\n function errorCallback(error: Error, imageId: string) {\n console.error(error, imageId);\n reject(error);\n }\n\n function sendRequest(imageId, imageIdIndex, options) {\n return loadAndCacheImage(imageId, options).then(\n (image) => {\n successCallback.call(this, image, imageId);\n },\n (error) => {\n errorCallback.call(this, error, imageId);\n }\n );\n }\n\n const { useNorm16Texture } = getConfiguration().rendering;\n\n // IMPORTANT: Request type should be passed if not the 'interaction'\n // highest priority will be used for the request type in the imageRetrievalPool\n const options = {\n targetBuffer: {\n type: useNorm16Texture ? undefined : 'Float32Array',\n },\n preScale: {\n enabled: true,\n },\n useRGBA: !!useCPURendering,\n requestType,\n };\n\n imageLoadPoolManager.addRequest(\n sendRequest.bind(null, imageId, null, options),\n requestType,\n { imageId },\n priority\n );\n });\n}\n","import { vec3 } from 'gl-matrix';\nimport { metaData } from '..';\nimport { Point2, Point3 } from '../types';\n\n/**\n * Given the imageId, and 3d coordinates on the world space, it returns the continuos\n * image coordinates (IJ) on the image space. The image space is\n * defined with [0,0] being on the top left corner of the top left pixel,\n * the [1,1] being on the bottom right corner of the top left pixel.\n * @param imageId - The image id\n * @param worldCoords - The 3d coordinates on the world.\n * @returns The 2d coordinates on the image.\n *\n */\nfunction worldToImageCoords(\n imageId: string,\n worldCoords: Point3\n): Point2 | undefined {\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n if (!imagePlaneModule) {\n throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);\n }\n\n // For the image coordinates we need to calculate the transformation matrix\n // from the world coordinates to the image coordinates.\n\n const {\n columnCosines,\n rowCosines,\n imagePositionPatient: origin,\n } = imagePlaneModule;\n\n let { columnPixelSpacing, rowPixelSpacing } = imagePlaneModule;\n // Use ||= to convert null and 0 as well as undefined to 1\n columnPixelSpacing ||= 1;\n rowPixelSpacing ||= 1;\n\n // The origin is the image position patient, but since image coordinates start\n // from [0,0] for the top left hand of the first pixel, and the origin is at the\n // center of the first pixel, we need to account for this.\n const newOrigin = vec3.create();\n\n vec3.scaleAndAdd(newOrigin, origin, columnCosines, -columnPixelSpacing / 2);\n vec3.scaleAndAdd(newOrigin, newOrigin, rowCosines, -rowPixelSpacing / 2);\n\n // Get the subtraction vector from the origin to the world coordinates\n const sub = vec3.create();\n vec3.sub(sub, worldCoords, newOrigin);\n\n // Projected distance of the sub vector onto the rowCosines\n const rowDistance = vec3.dot(sub, rowCosines);\n\n // Projected distance of the sub vector onto the columnCosines\n const columnDistance = vec3.dot(sub, columnCosines);\n\n const imageCoords = [\n rowDistance / rowPixelSpacing,\n columnDistance / columnPixelSpacing,\n ];\n\n return imageCoords as Point2;\n}\n\nexport default worldToImageCoords;\n","import { vec3 } from 'gl-matrix';\nimport { metaData } from '..';\nimport { Point2, Point3 } from '../types';\n\n/**\n * Given the imageId and a 2d coordinates on the image space with [0,0] being the top left corner\n * of the top left pixel, and options which includes the imageId, it returns the\n * 3d coordinates on the world space.\n * @param imageId - The image id\n * @param imageCoords - The 2d coordinates on the image\n * @returns The 3d coordinates on the world.\n *\n */\nexport default function imageToWorldCoords(\n imageId: string,\n imageCoords: Point2\n): Point3 | undefined {\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n if (!imagePlaneModule) {\n throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);\n }\n\n const {\n columnCosines,\n rowCosines,\n imagePositionPatient: origin,\n } = imagePlaneModule;\n\n let { columnPixelSpacing, rowPixelSpacing } = imagePlaneModule;\n // Use ||= to convert null and 0 as well as undefined to 1\n columnPixelSpacing ||= 1;\n rowPixelSpacing ||= 1;\n\n // calculate the image coordinates in the world space\n const imageCoordsInWorld = vec3.create();\n\n // move from origin in the direction of the row cosines with the amount of\n // row pixel spacing times the first element of the image coordinates vector\n vec3.scaleAndAdd(\n imageCoordsInWorld,\n origin,\n rowCosines,\n // to accommodate the [0,0] being on the top left corner of the top left pixel\n // but the origin is at the center of the top left pixel\n rowPixelSpacing * (imageCoords[0] - 0.5)\n );\n\n vec3.scaleAndAdd(\n imageCoordsInWorld,\n imageCoordsInWorld,\n columnCosines,\n columnPixelSpacing * (imageCoords[1] - 0.5)\n );\n\n return Array.from(imageCoordsInWorld) as Point3;\n}\n","import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';\nimport getVolumeActorCorners from './getVolumeActorCorners';\nimport type { VolumeActor, Point3, ActorSliceRange } from '../types';\nimport { EPSILON } from '../constants';\n\nconst SMALL_EPSILON = EPSILON * EPSILON;\nconst isOne = (v) => Math.abs(Math.abs(v) - 1) < SMALL_EPSILON;\nconst isUnit = (v, off) =>\n isOne(v[off]) || isOne(v[off + 1]) || isOne(v[off + 2]);\n\nconst isOrthonormal = (v) => isUnit(v, 0) && isUnit(v, 3) && isUnit(v, 6);\n\n/**\n * Given a `vtkVolumeActor`, and a normal direction,\n * calculate the range of slices in the focal normal direction that encapsulate\n * the volume. Also project the `focalPoint` onto this range.\n *\n * @param volumeActor - The `vtkVolumeActor`.\n * @param viewPlaneNormal - The normal to the camera view.\n * @param focalPoint - The focal point of the camera.\n *\n * @returns an object containing the `min`, `max` and `current`\n * positions in the normal direction.\n */\nexport default function getSliceRange(\n volumeActor: VolumeActor,\n viewPlaneNormal: Point3,\n focalPoint: Point3\n): ActorSliceRange {\n const imageData = volumeActor.getMapper().getInputData();\n let corners;\n const direction = imageData.getDirection();\n\n if (isOrthonormal(direction)) {\n // This logic is only valid when the IJK vectors are unit vectors\n corners = getVolumeActorCorners(volumeActor);\n } else {\n // This logic works for both unit and non-unit vectors, but is slower\n const [dx, dy, dz] = imageData.getDimensions();\n const cornersIdx = [\n [0, 0, 0],\n [dx - 1, 0, 0],\n [0, dy - 1, 0],\n [dx - 1, dy - 1, 0],\n [0, 0, dz - 1],\n [dx - 1, 0, dz - 1],\n [0, dy - 1, dz - 1],\n [dx - 1, dy - 1, dz - 1],\n ];\n corners = cornersIdx.map((it) => imageData.indexToWorld(it));\n }\n // Get rotation matrix from normal to +X (since bounds is aligned to XYZ)\n const transform = vtkMatrixBuilder\n .buildFromDegree()\n .identity()\n .rotateFromDirections(viewPlaneNormal, [1, 0, 0]);\n\n corners.forEach((pt) => transform.apply(pt));\n\n const transformedFocalPoint = [...focalPoint];\n transform.apply(transformedFocalPoint);\n\n const currentSlice = transformedFocalPoint[0];\n\n // range is now maximum X distance\n let minX = Infinity;\n let maxX = -Infinity;\n for (let i = 0; i < 8; i++) {\n const x = corners[i][0];\n if (x > maxX) {\n maxX = x;\n }\n if (x < minX) {\n minX = x;\n }\n }\n\n return {\n min: minX,\n max: maxX,\n current: currentSlice,\n actor: volumeActor,\n viewPlaneNormal,\n focalPoint,\n };\n}\n","import getSliceRange from './getSliceRange';\nimport getTargetVolumeAndSpacingInNormalDir from './getTargetVolumeAndSpacingInNormalDir';\nimport {\n ActorSliceRange,\n IVolumeViewport,\n ICamera,\n VolumeActor,\n} from '../types';\n\n/**\n * Calculates the slice range for the given volume based on its orientation\n * @param viewport - Volume viewport\n * @param volumeId - Id of one of the volumes loaded on the given viewport\n * @returns slice range information\n */\nfunction getVolumeSliceRangeInfo(\n viewport: IVolumeViewport,\n volumeId: string\n): {\n sliceRange: ActorSliceRange;\n spacingInNormalDirection: number;\n camera: ICamera;\n} {\n const camera = viewport.getCamera();\n const { focalPoint, viewPlaneNormal } = camera;\n const { spacingInNormalDirection, actorUID } =\n getTargetVolumeAndSpacingInNormalDir(viewport, camera, volumeId);\n\n if (!actorUID) {\n throw new Error(\n `Could not find image volume with id ${volumeId} in the viewport`\n );\n }\n\n const actorEntry = viewport.getActor(actorUID);\n\n if (!actorEntry) {\n console.warn('No actor found for with actorUID of', actorUID);\n return null;\n }\n\n const volumeActor = actorEntry.actor as VolumeActor;\n const sliceRange = getSliceRange(volumeActor, viewPlaneNormal, focalPoint);\n\n return {\n sliceRange,\n spacingInNormalDirection,\n camera,\n };\n}\n\nexport default getVolumeSliceRangeInfo;\n","import { IVolumeViewport } from '../types';\nimport getVolumeSliceRangeInfo from './getVolumeSliceRangeInfo';\n\n/**\n * Calculates the number os steps the volume can scroll based on its orientation\n * @param viewport - Volume viewport\n * @param volumeId - Id of one of the volumes loaded on the given viewport\n * @returns number of steps the volume can scroll and its current position\n */\nfunction getVolumeViewportScrollInfo(\n viewport: IVolumeViewport,\n volumeId: string\n) {\n const { sliceRange, spacingInNormalDirection, camera } =\n getVolumeSliceRangeInfo(viewport, volumeId);\n\n const { min, max, current } = sliceRange;\n\n // Now we can see how many steps there are in this direction\n const numScrollSteps = Math.round((max - min) / spacingInNormalDirection);\n\n // Find out current frameIndex\n const fraction = (current - min) / (max - min);\n const floatingStepNumber = fraction * numScrollSteps;\n const currentStepIndex = Math.round(floatingStepNumber);\n\n return {\n numScrollSteps,\n currentStepIndex,\n sliceRangeInfo: {\n sliceRange,\n spacingInNormalDirection,\n camera,\n },\n };\n}\n\nexport default getVolumeViewportScrollInfo;\n","import { vec3 } from 'gl-matrix';\nimport { ActorSliceRange, Point3 } from '../types';\n\n/**\n * Given a number of frames, `deltaFrames`,\n * move the `focalPoint` and camera `position` so that it moves forward/backwards\n * `deltaFrames` in the camera's normal direction, and snaps to the nearest frame.\n *\n * @param focalPoint - The focal point to move.\n * @param position - The camera position to move.\n * @param sliceRange - The scroll range used to find the current\n * position in the stack, as well as prevent scrolling past the extent of the volume.\n * @param viewPlaneNormal - The normal direction of the camera.\n * @param spacingInNormalDirection - The spacing of frames the normal direction of the camera.\n * @param deltaFrames - The number of frames to jump.\n *\n * @returns The `newFocalPoint` and `newPosition` of the camera.\n */\nexport default function snapFocalPointToSlice(\n focalPoint: Point3,\n position: Point3,\n sliceRange: ActorSliceRange,\n viewPlaneNormal: Point3,\n spacingInNormalDirection: number,\n deltaFrames: number\n): { newFocalPoint: Point3; newPosition: Point3 } {\n const { min, max, current } = sliceRange;\n\n // Get the current offset off the camera position so we can add it on at the end.\n const posDiffFromFocalPoint = vec3.create();\n\n vec3.sub(posDiffFromFocalPoint, position, focalPoint);\n\n // Now we can see how many steps there are in this direction\n const steps = Math.round((max - min) / spacingInNormalDirection);\n\n // Find out current frameIndex\n const fraction = (current - min) / (max - min);\n const floatingStepNumber = fraction * steps;\n let frameIndex = Math.round(floatingStepNumber);\n\n // Dolly the focal point back to min slice focal point.\n let newFocalPoint = [\n focalPoint[0] -\n viewPlaneNormal[0] * floatingStepNumber * spacingInNormalDirection,\n focalPoint[1] -\n viewPlaneNormal[1] * floatingStepNumber * spacingInNormalDirection,\n focalPoint[2] -\n viewPlaneNormal[2] * floatingStepNumber * spacingInNormalDirection,\n ];\n\n // Increment the slice number by deltaFrames.\n frameIndex += deltaFrames;\n\n // Clamp sliceNumber to volume.\n if (frameIndex > steps) {\n frameIndex = steps;\n } else if (frameIndex < 0) {\n frameIndex = 0;\n }\n\n // Dolly the focal towards to the correct frame focal point.\n const newSlicePosFromMin = frameIndex * spacingInNormalDirection;\n\n newFocalPoint = [\n newFocalPoint[0] + viewPlaneNormal[0] * newSlicePosFromMin,\n newFocalPoint[1] + viewPlaneNormal[1] * newSlicePosFromMin,\n newFocalPoint[2] + viewPlaneNormal[2] * newSlicePosFromMin,\n ];\n\n const newPosition = [\n newFocalPoint[0] + posDiffFromFocalPoint[0],\n newFocalPoint[1] + posDiffFromFocalPoint[1],\n newFocalPoint[2] + posDiffFromFocalPoint[2],\n ];\n\n return { newFocalPoint, newPosition };\n}\n","import { ImageSliceData, IVolumeViewport, VolumeActor } from '../types';\nimport getSliceRange from './getSliceRange';\nimport getTargetVolumeAndSpacingInNormalDir from './getTargetVolumeAndSpacingInNormalDir';\n\n/**\n * It calculates the number of slices and the current slice index for a given\n * Volume viewport\n * @param viewport - volume viewport\n * @returns An object with two properties: numberOfSlices and imageIndex.\n */\nfunction getImageSliceDataForVolumeViewport(\n viewport: IVolumeViewport\n): ImageSliceData {\n const camera = viewport.getCamera();\n\n const { spacingInNormalDirection, imageVolume } =\n getTargetVolumeAndSpacingInNormalDir(viewport, camera);\n\n if (!imageVolume) {\n return;\n }\n\n const { viewPlaneNormal, focalPoint } = camera;\n\n const actorEntry = viewport\n .getActors()\n .find(\n (a) =>\n a.referenceId === imageVolume.volumeId || a.uid === imageVolume.volumeId\n );\n\n if (!actorEntry) {\n console.warn('No actor found for with actorUID of', imageVolume.volumeId);\n }\n\n const volumeActor = actorEntry.actor as VolumeActor;\n const sliceRange = getSliceRange(volumeActor, viewPlaneNormal, focalPoint);\n\n const { min, max, current } = sliceRange;\n\n // calculate number of steps from min to max with current normal spacing in direction\n const numberOfSlices = Math.round((max - min) / spacingInNormalDirection) + 1;\n\n // calculate the imageIndex based on min, max, current\n let imageIndex = ((current - min) / (max - min)) * numberOfSlices;\n imageIndex = Math.floor(imageIndex);\n\n // Clamp imageIndex\n if (imageIndex > numberOfSlices - 1) {\n imageIndex = numberOfSlices - 1;\n } else if (imageIndex < 0) {\n imageIndex = 0;\n }\n\n return {\n numberOfSlices,\n imageIndex,\n };\n}\n\nexport default getImageSliceDataForVolumeViewport;\n","import { Types } from '..';\n\ntype actorTypes = 'vtkActor' | 'vtkVolume' | 'vtkImageSlice';\n\n/**\n * Checks if a vtk Actor is an image actor (vtkVolume or vtkImageSlice) otherwise returns false.\n *\n * @param actor - actor\n * @returns A boolean value.\n */\nexport function isImageActor(actorEntry: Types.ActorEntry): boolean {\n return (\n actorIsA(actorEntry, 'vtkVolume') || actorIsA(actorEntry, 'vtkImageSlice')\n );\n}\n\nexport function actorIsA(\n actorEntry: Types.ActorEntry,\n actorType: actorTypes\n): boolean {\n const actor = actorEntry.actor;\n\n return !!actor.isA(actorType);\n}\n","import { getRenderingEngine } from '../RenderingEngine';\nimport { getRenderingEngines } from '../RenderingEngine/getRenderingEngine';\nimport { IStackViewport, IVolumeViewport } from '../types';\n\ntype Viewport = IStackViewport | IVolumeViewport;\n\n/**\n * Get the viewport that is rendering the image with the given imageURI (imageId without\n * the loader schema), this can be a stackViewport or a volumeViewport.\n *\n * @param renderingEngine - The rendering engine that is rendering the viewports\n * @param imageURI - The imageURI of the image that is requested\n * @returns A Viewport\n */\nexport default function getViewportsWithImageURI(\n imageURI: string,\n renderingEngineId?: string\n): Array {\n // If rendering engine is not provided, use all rendering engines\n let renderingEngines;\n if (renderingEngineId) {\n renderingEngines = [getRenderingEngine(renderingEngineId)];\n } else {\n renderingEngines = getRenderingEngines();\n }\n\n const viewports = [];\n renderingEngines.forEach((renderingEngine) => {\n const stackViewports = renderingEngine.getStackViewports();\n\n const filteredStackViewports = stackViewports.filter((viewport) =>\n viewport.hasImageURI(imageURI)\n );\n\n // If no stack viewport found but a volumeViewport is rendering the same data\n const volumeViewports = renderingEngine.getVolumeViewports();\n\n const filteredVolumeViewports = volumeViewports.filter((viewport) =>\n viewport.hasImageURI(imageURI)\n );\n\n viewports.push(...filteredStackViewports, ...filteredVolumeViewports);\n });\n\n return viewports;\n}\n","import { vec3 } from 'gl-matrix';\nimport { planar } from '.';\nimport { metaData } from '..';\nimport { IStackViewport, Point3 } from '../types';\n\n/**\n * Given a point in 3D space and a viewport it returns the index of the closest imageId, it assumes that stack images are sorted according to their sliceLocation\n * @param point - [A, B, C] coordinates of the point in 3D space\n * @param viewport - The StackViewport to search for the closest imageId\n *\n * @returns The imageId index of the closest imageId or null if no imageId is found\n */\nexport default function getClosestStackImageIndexForPoint(\n point: Point3,\n viewport: IStackViewport\n): number | null {\n const minimalDistance = calculateMinimalDistanceForStackViewport(\n point,\n viewport\n );\n return minimalDistance ? minimalDistance.index : null;\n}\n\n//assumes that imageIds are sorted by slice location\nexport function calculateMinimalDistanceForStackViewport(\n point: Point3,\n viewport: IStackViewport\n): { distance: number; index: number } | null {\n const imageIds = viewport.getImageIds();\n const currentImageIdIndex = viewport.getCurrentImageIdIndex();\n\n if (imageIds.length === 0) {\n return null;\n }\n\n const getDistance = (imageId: string): null | number => {\n const planeMetadata = getPlaneMetadata(imageId);\n if (!planeMetadata) {\n return null;\n }\n const plane = planar.planeEquation(\n planeMetadata.planeNormal,\n planeMetadata.imagePositionPatient\n );\n const distance = planar.planeDistanceToPoint(plane, point);\n return distance;\n };\n\n const closestStack = {\n distance: getDistance(imageIds[currentImageIdIndex]) ?? Infinity,\n index: currentImageIdIndex,\n };\n\n //check higher indices\n const higherImageIds = imageIds.slice(currentImageIdIndex + 1);\n\n for (let i = 0; i < higherImageIds.length; i++) {\n const id = higherImageIds[i];\n const distance = getDistance(id);\n if (distance === null) {\n continue;\n }\n if (distance <= closestStack.distance) {\n closestStack.distance = distance;\n closestStack.index = i + currentImageIdIndex + 1;\n } else {\n break;\n }\n }\n //check lower indices\n const lowerImageIds = imageIds.slice(0, currentImageIdIndex);\n for (let i = lowerImageIds.length - 1; i >= 0; i--) {\n const id = lowerImageIds[i];\n const distance = getDistance(id);\n if (distance === null || distance === closestStack.distance) {\n continue;\n }\n if (distance < closestStack.distance) {\n closestStack.distance = distance;\n closestStack.index = i;\n } else {\n break;\n }\n }\n return closestStack.distance === Infinity ? null : closestStack;\n}\n\nfunction getPlaneMetadata(imageId: string): null | {\n rowCosines: Point3;\n columnCosines: Point3;\n imagePositionPatient: Point3;\n planeNormal: Point3;\n} {\n const targetImagePlane = metaData.get('imagePlaneModule', imageId);\n\n if (\n !targetImagePlane ||\n !(\n targetImagePlane.rowCosines instanceof Array &&\n targetImagePlane.rowCosines.length === 3\n ) ||\n !(\n targetImagePlane.columnCosines instanceof Array &&\n targetImagePlane.columnCosines.length === 3\n ) ||\n !(\n targetImagePlane.imagePositionPatient instanceof Array &&\n targetImagePlane.imagePositionPatient.length === 3\n )\n ) {\n return null;\n }\n const {\n rowCosines,\n columnCosines,\n imagePositionPatient,\n }: {\n rowCosines: Point3;\n columnCosines: Point3;\n imagePositionPatient: Point3;\n } = targetImagePlane;\n\n const rowVec = vec3.set(vec3.create(), ...rowCosines);\n const colVec = vec3.set(vec3.create(), ...columnCosines);\n const planeNormal = vec3.cross(vec3.create(), rowVec, colVec) as Point3;\n\n return { rowCosines, columnCosines, imagePositionPatient, planeNormal };\n}\n","import { mat4 } from 'gl-matrix';\nimport { addProvider } from '../metaData';\n\nconst state = {};\n\n/**\n * Simple metadataProvider object to store metadata for spatial registration module.\n */\nconst spatialRegistrationMetadataProvider = {\n /* Adding a new entry to the state object. */\n add: (query: string[], payload: mat4): void => {\n const [viewportId1, viewportId2] = query;\n const entryId = `${viewportId1}_${viewportId2}`;\n\n if (!state[entryId]) {\n state[entryId] = {};\n }\n\n state[entryId] = payload;\n },\n\n get: (type: string, query: string[]): mat4 => {\n if (type !== 'spatialRegistrationModule') {\n return;\n }\n\n const [viewportId1, viewportId2] = query;\n\n // check both ways\n const entryId = `${viewportId1}_${viewportId2}`;\n\n if (state[entryId]) {\n return state[entryId];\n }\n\n const entryIdReverse = `${viewportId2}_${viewportId1}`;\n\n if (state[entryIdReverse]) {\n return mat4.invert(mat4.create(), state[entryIdReverse]);\n }\n },\n};\n\naddProvider(\n spatialRegistrationMetadataProvider.get.bind(\n spatialRegistrationMetadataProvider\n )\n);\n\nexport default spatialRegistrationMetadataProvider;\n","import { vec3, mat4 } from 'gl-matrix';\nimport { IStackViewport } from '../types';\nimport spatialRegistrationMetadataProvider from './spatialRegistrationMetadataProvider';\nimport { metaData } from '..';\n\n/**\n * Defines the allowed difference as a percent between the unit normals before\n * two planes are considered not coplanar. Since this value is small compared\n * to the unit lenght, this value is approximately the angular difference, measured\n * in radians. That is, allow about a 3 degrees variation.\n */\nconst ALLOWED_DELTA = 0.05;\n\n/**\n * It calculates the registration matrix between two viewports (currently only\n * translation is supported)\n * If the viewports are in the same frame of reference, it will return early,\n * but otherwise it will use the current image's metadata to calculate the\n * translation between the two viewports and adds it to the spatialRegistrationModule\n * metadata provider\n *\n *\n * @param viewport1 - The first stack viewport\n * @param viewport2 - The second stack viewport\n */\nfunction calculateViewportsSpatialRegistration(\n viewport1: IStackViewport,\n viewport2: IStackViewport\n): void {\n const imageId1 = viewport1.getCurrentImageId();\n const imageId2 = viewport2.getCurrentImageId();\n\n const imagePlaneModule1 = metaData.get('imagePlaneModule', imageId1);\n const imagePlaneModule2 = metaData.get('imagePlaneModule', imageId2);\n\n if (!imagePlaneModule1 || !imagePlaneModule2) {\n console.log('Viewport spatial registration requires image plane module');\n return;\n }\n const { imageOrientationPatient: iop2 } = imagePlaneModule2;\n const isSameImagePlane = imagePlaneModule1.imageOrientationPatient.every(\n (v, i) => Math.abs(v - iop2[i]) < ALLOWED_DELTA\n );\n\n if (!isSameImagePlane) {\n console.log(\n 'Viewport spatial registration only supported for same orientation (hence translation only) for now',\n imagePlaneModule1?.imageOrientationPatient,\n imagePlaneModule2?.imageOrientationPatient\n );\n return;\n }\n\n const imagePositionPatient1 = imagePlaneModule1.imagePositionPatient;\n const imagePositionPatient2 = imagePlaneModule2.imagePositionPatient;\n\n const translation = vec3.subtract(\n vec3.create(),\n imagePositionPatient1,\n imagePositionPatient2\n );\n\n const mat = mat4.fromTranslation(mat4.create(), translation);\n spatialRegistrationMetadataProvider.add([viewport1.id, viewport2.id], mat);\n}\n\nexport default calculateViewportsSpatialRegistration;\n","import {\n IImageData,\n IStackViewport,\n IVolumeViewport,\n Point2,\n Point3,\n} from '../types';\n\n/**\n * Given a viewport, return the corners of the image in the viewport in world coordinates.\n * Note that this is different than the corners of the canvas in world coordinates since\n * an image can be zoomed out and the canvas can be larger than the image; hence, the\n * corners of the canvas in world coordinates will be outside the image.\n *\n * @param viewport - The viewport to get the corners of.\n * @returns The corners of the image in the viewport in world coordinates.\n */\nexport default function getViewportImageCornersInWorld(\n viewport: IStackViewport | IVolumeViewport\n): Point3[] {\n const { imageData, dimensions } = viewport.getImageData() as IImageData;\n const { canvas } = viewport;\n\n const topLeftCanvas: Point2 = [0, 0];\n const topRightCanvas: Point2 = [canvas.width, 0];\n const bottomRightCanvas: Point2 = [canvas.width, canvas.height];\n const bottomLeftCanvas: Point2 = [0, canvas.height];\n\n const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);\n const topRightWorld = viewport.canvasToWorld(topRightCanvas);\n const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);\n const bottomLeftWorld = viewport.canvasToWorld(bottomLeftCanvas);\n\n const topLeftImage = imageData.worldToIndex(topLeftWorld);\n const topRightImage = imageData.worldToIndex(topRightWorld);\n const bottomRightImage = imageData.worldToIndex(bottomRightWorld);\n const bottomLeftImage = imageData.worldToIndex(bottomLeftWorld);\n\n return _getStackViewportImageCorners({\n dimensions,\n imageData,\n topLeftImage,\n topRightImage,\n bottomRightImage,\n bottomLeftImage,\n topLeftWorld,\n topRightWorld,\n bottomRightWorld,\n bottomLeftWorld,\n });\n}\n\nfunction _getStackViewportImageCorners({\n dimensions,\n imageData,\n topLeftImage,\n topRightImage,\n bottomRightImage,\n bottomLeftImage,\n topLeftWorld,\n topRightWorld,\n bottomRightWorld,\n bottomLeftWorld,\n}) {\n const topLeftImageWorld = _isInBounds(topLeftImage, dimensions)\n ? topLeftWorld\n : (imageData.indexToWorld([0, 0, 0]) as Point3);\n\n const topRightImageWorld = _isInBounds(topRightImage, dimensions)\n ? topRightWorld\n : (imageData.indexToWorld([dimensions[0] - 1, 0, 0]) as Point3);\n\n const bottomRightImageWorld = _isInBounds(bottomRightImage, dimensions)\n ? bottomRightWorld\n : (imageData.indexToWorld([\n dimensions[0] - 1,\n dimensions[1] - 1,\n 0,\n ]) as Point3);\n\n const bottomLeftImageWorld = _isInBounds(bottomLeftImage, dimensions)\n ? bottomLeftWorld\n : (imageData.indexToWorld([0, dimensions[1] - 1, 0]) as Point3);\n\n return [\n topLeftImageWorld,\n topRightImageWorld,\n bottomLeftImageWorld,\n bottomRightImageWorld,\n ];\n}\n\nfunction _isInBounds(imageCoord, dimensions) {\n return (\n imageCoord[0] > 0 ||\n imageCoord[0] < dimensions[0] - 1 ||\n imageCoord[1] > 0 ||\n imageCoord[1] < dimensions[1] - 1 ||\n imageCoord[2] > 0 ||\n imageCoord[2] < dimensions[2] - 1\n );\n}\n","/**\n * A function that checks if there is a value in the array that is NaN.\n * or if the input is a number it just checks if it is NaN.\n * @param input - The input to check if it is NaN.\n * @returns - True if the input is NaN, false otherwise.\n */\nexport default function hasNaNValues(input: number[] | number): boolean {\n if (Array.isArray(input)) {\n return input.some((value) => Number.isNaN(value));\n }\n return Number.isNaN(input);\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';\nimport { ViewportPreset } from '../types';\nimport { VolumeActor } from '../types/IActor';\n\n/**\n * Applies a preset to a volume actor.\n *\n * @param actor - The volume actor to apply the preset to.\n * @param preset - The preset to apply.\n */\nexport default function applyPreset(\n actor: VolumeActor,\n preset: ViewportPreset\n) {\n // Create color transfer function\n const colorTransferArray = preset.colorTransfer\n .split(' ')\n .splice(1)\n .map(parseFloat);\n\n const { shiftRange } = getShiftRange(colorTransferArray);\n const min = shiftRange[0];\n const width = shiftRange[1] - shiftRange[0];\n const cfun = vtkColorTransferFunction.newInstance();\n const normColorTransferValuePoints = [];\n for (let i = 0; i < colorTransferArray.length; i += 4) {\n let value = colorTransferArray[i];\n const r = colorTransferArray[i + 1];\n const g = colorTransferArray[i + 2];\n const b = colorTransferArray[i + 3];\n\n value = (value - min) / width;\n normColorTransferValuePoints.push([value, r, g, b]);\n }\n\n applyPointsToRGBFunction(normColorTransferValuePoints, shiftRange, cfun);\n\n actor.getProperty().setRGBTransferFunction(0, cfun);\n\n // Create scalar opacity function\n const scalarOpacityArray = preset.scalarOpacity\n .split(' ')\n .splice(1)\n .map(parseFloat);\n\n const ofun = vtkPiecewiseFunction.newInstance();\n const normPoints = [];\n for (let i = 0; i < scalarOpacityArray.length; i += 2) {\n let value = scalarOpacityArray[i];\n const opacity = scalarOpacityArray[i + 1];\n\n value = (value - min) / width;\n\n normPoints.push([value, opacity]);\n }\n\n applyPointsToPiecewiseFunction(normPoints, shiftRange, ofun);\n\n actor.getProperty().setScalarOpacity(0, ofun);\n\n const [\n gradientMinValue,\n gradientMinOpacity,\n gradientMaxValue,\n gradientMaxOpacity,\n ] = preset.gradientOpacity.split(' ').splice(1).map(parseFloat);\n\n actor.getProperty().setUseGradientOpacity(0, true);\n actor.getProperty().setGradientOpacityMinimumValue(0, gradientMinValue);\n actor.getProperty().setGradientOpacityMinimumOpacity(0, gradientMinOpacity);\n actor.getProperty().setGradientOpacityMaximumValue(0, gradientMaxValue);\n actor.getProperty().setGradientOpacityMaximumOpacity(0, gradientMaxOpacity);\n\n if (preset.interpolation === '1') {\n actor.getProperty().setInterpolationTypeToFastLinear();\n //actor.getProperty().setInterpolationTypeToLinear()\n }\n\n const ambient = parseFloat(preset.ambient);\n const diffuse = parseFloat(preset.diffuse);\n const specular = parseFloat(preset.specular);\n const specularPower = parseFloat(preset.specularPower);\n\n actor.getProperty().setAmbient(ambient);\n actor.getProperty().setDiffuse(diffuse);\n actor.getProperty().setSpecular(specular);\n actor.getProperty().setSpecularPower(specularPower);\n}\n\nfunction getShiftRange(colorTransferArray) {\n // Credit to paraview-glance\n // https://github.com/Kitware/paraview-glance/blob/3fec8eeff31e9c19ad5b6bff8e7159bd745e2ba9/src/components/controls/ColorBy/script.js#L133\n\n // shift range is original rgb/opacity range centered around 0\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < colorTransferArray.length; i += 4) {\n min = Math.min(min, colorTransferArray[i]);\n max = Math.max(max, colorTransferArray[i]);\n }\n\n const center = (max - min) / 2;\n\n return {\n shiftRange: [-center, center],\n min,\n max,\n };\n}\n\nfunction applyPointsToRGBFunction(points, range, cfun) {\n const width = range[1] - range[0];\n const rescaled = points.map(([x, r, g, b]) => [\n x * width + range[0],\n r,\n g,\n b,\n ]);\n\n cfun.removeAllPoints();\n rescaled.forEach(([x, r, g, b]) => cfun.addRGBPoint(x, r, g, b));\n\n return rescaled;\n}\n\nfunction applyPointsToPiecewiseFunction(points, range, pwf) {\n const width = range[1] - range[0];\n const rescaled = points.map(([x, y]) => [x * width + range[0], y]);\n\n pwf.removeAllPoints();\n rescaled.forEach(([x, y]) => pwf.addPoint(x, y));\n\n return rescaled;\n}\n","const isMergeableObject = (val) => {\n const nonNullObject = val && typeof val === 'object';\n\n return (\n nonNullObject &&\n Object.prototype.toString.call(val) !== '[object RegExp]' &&\n Object.prototype.toString.call(val) !== '[object Date]'\n );\n};\n\nconst emptyTarget = (val) => {\n const isEmpty = Array.isArray(val) ? [] : {};\n\n return isEmpty;\n};\n\nconst cloneIfNecessary = (value, optionsArgument) => {\n const clone = optionsArgument && optionsArgument.clone === true;\n\n return clone && isMergeableObject(value)\n ? deepMerge(emptyTarget(value), value, optionsArgument)\n : value;\n};\n\nconst defaultArrayMerge = (target, source, optionsArgument) => {\n const destination = target.slice();\n\n source.forEach(function (e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument);\n } else if (isMergeableObject(e)) {\n destination[i] = deepMerge(target[i], e, optionsArgument);\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument));\n }\n });\n\n return destination;\n};\n\nconst mergeObject = (target, source, optionsArgument) => {\n const destination = {};\n\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function (key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument);\n });\n }\n Object.keys(source).forEach(function (key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument);\n } else {\n destination[key] = deepMerge(target[key], source[key], optionsArgument);\n }\n });\n\n return destination;\n};\n\n/**\n * Merge two objects, recursively merging any objects that are arrays\n * @param target - The target object.\n * @param source - The source object to merge into the target object.\n * @param optionsArgument - The options object.\n * @returns The merged object.\n */\nconst deepMerge = (target = {}, source = {}, optionsArgument = undefined) => {\n const array = Array.isArray(source);\n const options = optionsArgument || { arrayMerge: defaultArrayMerge };\n const arrayMerge = options.arrayMerge || defaultArrayMerge;\n\n if (array) {\n return Array.isArray(target)\n ? arrayMerge(target, source, optionsArgument)\n : cloneIfNecessary(source, optionsArgument);\n }\n\n return mergeObject(target, source, optionsArgument);\n};\n\nexport default deepMerge;\n","import { get as metaDataGet } from '../metaData';\nimport { ScalingParameters } from '../types';\n\n/**\n * It returns the scaling parameters for the image with the given imageId. This can be\n * used to get passed (as an option) to the imageLoader in order to apply scaling to the image inside\n * the imageLoader.\n * @param imageId - The imageId of the image\n * @returns ScalingParameters\n */\nexport default function getScalingParameters(\n imageId: string\n): ScalingParameters {\n const modalityLutModule = metaDataGet('modalityLutModule', imageId) || {};\n const generalSeriesModule = metaDataGet('generalSeriesModule', imageId) || {};\n\n const { modality } = generalSeriesModule;\n\n const scalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality,\n };\n\n const suvFactor = metaDataGet('scalingModule', imageId) || {};\n\n return {\n ...scalingParameters,\n ...(modality === 'PT' && {\n suvbw: suvFactor.suvbw,\n suvbsa: suvFactor.suvbsa,\n suvlbm: suvFactor.suvlbm,\n }),\n };\n}\n","import { ScalingParameters } from '../types';\n\n/**\n * If the scalar data is a Uint8Array, return 'Uint8Array'. If the scalar data is a\n * Float32Array, return 'Float32Array'. If the scalar data is a Int16Array, return\n * 'Int16Array'. If the scalar data is a Uint16Array, return 'Uint16Array'. If the\n * scalar data is none of the above, throw an error.\n * @param {ScalingParameters} scalingParameters - {\n * @param {any} [scalarData] - The data to be converted.\n * @returns The data type of the scalar data.\n */\nexport default function getScalarDataType(\n scalingParameters: ScalingParameters,\n scalarData?: any\n): string {\n let type;\n\n if (scalarData && scalarData instanceof Uint8Array) {\n type = 'Uint8Array';\n } else if (scalarData instanceof Float32Array) {\n type = 'Float32Array';\n } else if (scalarData instanceof Int16Array) {\n type = 'Int16Array';\n } else if (scalarData instanceof Uint16Array) {\n type = 'Uint16Array';\n } else {\n throw new Error('Unsupported array type');\n }\n\n return type;\n}\n","import getRenderingEngine, {\n getRenderingEngines,\n} from './RenderingEngine/getRenderingEngine';\nimport { IEnabledElement } from './types';\n\n/**\n * A convenience method to find an EnabledElement given a reference to its\n * associated element. Commonly used in code that's handling a custom\n * event emitted by this library.\n *\n * @example\n * Using the renderingEngine to find the enabled element:\n * ```javascript\n * const element = getRenderingEngine(renderingEngineId)\n * .getViewport(viewportId)\n * .element\n *\n * const enabledElement = getEnabledElement(element)\n * ```\n *\n * @example\n * Using a cornerstone event's \"element\"\n * ```javascript\n * // Our \"cornerstone events\" contain the source element, which is\n * // raised on the viewport's div element\n * const { element } = evt.detail\n * const enabledElement = getEnabledElement(element)\n * ```\n *\n * @param element - a reference to an EnabledElement/Viewport's div element\n * @returns the associated EnabledElement, or undefined if no matching EnabledElement\n * can be found\n */\nexport default function getEnabledElement(\n element: HTMLDivElement | undefined\n): IEnabledElement | undefined {\n if (!element) {\n return;\n }\n\n const { viewportUid, renderingEngineUid } = element.dataset;\n\n return getEnabledElementByIds(viewportUid, renderingEngineUid);\n}\n\n/**\n * Similar to {@link getEnabledElement}, but takes the IDs of the\n * renderingEngine and viewport as parameters to return the associated\n * EnabledElement.\n *\n * @param viewportId - The Id of the viewport\n * @param renderingEngineId - The Id of the rendering engine.\n * @returns The enabled element which is an object that contains the viewport, rendering\n * engine, viewport Id, rendering engine Id, and the Frame of Reference UID.\n */\nexport function getEnabledElementByIds(\n viewportId: string,\n renderingEngineId: string\n): IEnabledElement {\n if (!renderingEngineId || !viewportId) {\n return;\n }\n\n const renderingEngine = getRenderingEngine(renderingEngineId);\n\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n return;\n }\n\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!viewport) {\n return;\n }\n\n const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();\n\n return {\n viewport,\n renderingEngine,\n viewportId,\n renderingEngineId,\n FrameOfReferenceUID,\n };\n}\n\n/**\n * Get all the enabled elements from all the rendering engines\n * @returns An array of enabled elements.\n */\nexport function getEnabledElements(): IEnabledElement[] {\n const enabledElements = [];\n\n const renderingEngines = getRenderingEngines();\n\n renderingEngines.forEach((renderingEngine) => {\n const viewports = renderingEngine.getViewports();\n\n viewports.forEach(({ element }) => {\n enabledElements.push(getEnabledElement(element));\n });\n });\n\n return enabledElements;\n}\n","import { StackViewport, Types } from '..';\nimport getEnabledElement from '../getEnabledElement';\n\n/**\n * Gets the IImage rendered by the given element. This is provided as a\n * convenience for the legacy cornerstone getImage function. However it is\n * encouraged for IStackViewport.getImage to be used instead.\n * @param element - the element rendering/containing the image\n * @returns the image\n */\nfunction getImageLegacy(element: HTMLDivElement): Types.IImage | undefined {\n const enabledElement = getEnabledElement(element);\n\n if (!enabledElement) {\n return;\n }\n\n const { viewport } = enabledElement;\n\n if (!(viewport instanceof StackViewport)) {\n throw new Error(\n `An image can only be fetched for a stack viewport and not for a viewport of type: ${viewport.type}`\n );\n }\n\n return viewport.getCornerstoneImage();\n}\n\nexport default getImageLegacy;\n","import { Point3, Plane } from '../types';\nimport { vec3, mat3 } from 'gl-matrix';\n\n/**\n * It calculates the intersection of a line and a plane.\n * Plane equation is Ax+By+Cz=D\n * @param p0 - [x,y,z] of the first point of the line\n * @param p1 - [x,y,z] of the second point of the line\n * @param plane - [A, B, C, D] Plane parameter: Ax+By+Cz=D\n * @returns - [X,Y,Z] coordinates of the intersection\n */\nfunction linePlaneIntersection(p0: Point3, p1: Point3, plane: Plane): Point3 {\n const [x0, y0, z0] = p0;\n const [x1, y1, z1] = p1;\n const [A, B, C, D] = plane;\n const a = x1 - x0;\n const b = y1 - y0;\n const c = z1 - z0;\n const t = (-1 * (A * x0 + B * y0 + C * z0 - D)) / (A * a + B * b + C * c);\n const X = a * t + x0;\n const Y = b * t + y0;\n const Z = c * t + z0;\n\n return [X, Y, Z];\n}\n\n/**\n * It returns the plane equation defined by a point and a normal vector.\n * @param normal - normal vector\n * @param point - a point on the plane\n * @returns - [A, B,C, D] of plane equation A*X + B*Y + C*Z = D\n */\nfunction planeEquation(normal: Point3, point: Point3 | vec3): Plane {\n const [A, B, C] = normal;\n const D = A * point[0] + B * point[1] + C * point[2];\n return [A, B, C, D];\n}\n\n/**\n * Computes the intersection of three planes in 3D space with equations:\n * A1*X + B1*Y + C1*Z = D1\n * A2*X + B2*Y + C2*Z = D2\n * A3*X + B3*Y + C3*Z = D3\n * @returns - [x, y, z] the intersection in the world coordinate\n */\nfunction threePlaneIntersection(\n firstPlane: Plane,\n secondPlane: Plane,\n thirdPlane: Plane\n): Point3 {\n const [A1, B1, C1, D1] = firstPlane;\n const [A2, B2, C2, D2] = secondPlane;\n const [A3, B3, C3, D3] = thirdPlane;\n const m0 = mat3.fromValues(A1, A2, A3, B1, B2, B3, C1, C2, C3);\n const m1 = mat3.fromValues(D1, D2, D3, B1, B2, B3, C1, C2, C3);\n const m2 = mat3.fromValues(A1, A2, A3, D1, D2, D3, C1, C2, C3);\n const m3 = mat3.fromValues(A1, A2, A3, B1, B2, B3, D1, D2, D3);\n\n // TODO: handle no intersection scenario\n const x = mat3.determinant(m1) / mat3.determinant(m0);\n const y = mat3.determinant(m2) / mat3.determinant(m0);\n const z = mat3.determinant(m3) / mat3.determinant(m0);\n return [x, y, z];\n}\n\n/**\n * Computes the distance of a point in 3D space to a plane\n * @param plane - [A, B, C, D] of plane equation A*X + B*Y + C*Z = D\n * @param point - [A, B, C] the plane in World coordinate\n * @param signed - if true, the distance is signed\n * @returns - the distance of the point to the plane\n * */\nfunction planeDistanceToPoint(\n plane: Plane,\n point: Point3,\n signed = false\n): number {\n const [A, B, C, D] = plane;\n const [x, y, z] = point;\n const numerator = A * x + B * y + C * z - D;\n const distance = Math.abs(numerator) / Math.sqrt(A * A + B * B + C * C);\n const sign = signed ? Math.sign(numerator) : 1;\n return sign * distance;\n}\n\nexport {\n linePlaneIntersection,\n planeEquation,\n threePlaneIntersection,\n planeDistanceToPoint,\n};\n","/**\n * Given a low and high window level, return the window width and window center\n * Formulas from note 4 in\n * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1\n * extended to allow for low/high swapping\n * @param low - The low window level.\n * @param high - The high window level.\n * @returns a JavaScript object with two properties: windowWidth and windowCenter.\n */\nfunction toWindowLevel(\n low: number,\n high: number\n): {\n windowWidth: number;\n windowCenter: number;\n} {\n // Allow for swapping high/low\n const windowWidth = Math.abs(high - low) + 1;\n const windowCenter = (low + high + 1) / 2;\n\n return { windowWidth, windowCenter };\n}\n\n/**\n * Given a window width and center, return the lower and upper bounds of the window\n * The formulas for the calculation are specified in\n * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1\n * if (x <= c - 0.5 - (w-1) /2), then y = ymin\n * else if (x > c - 0.5 + (w-1) /2), then y = ymax\n * else y = ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax- ymin) + ymin\n * @param windowWidth - the width of the window in HU\n * @param windowCenter - The center of the window.\n * @returns a JavaScript object with two properties: lower and upper.\n */\nfunction toLowHighRange(\n windowWidth: number,\n windowCenter: number\n): {\n lower: number;\n upper: number;\n} {\n const lower = windowCenter - 0.5 - (windowWidth - 1) / 2;\n const upper = windowCenter - 0.5 + (windowWidth - 1) / 2;\n\n return { lower, upper };\n}\n\nexport { toWindowLevel, toLowHighRange };\n","import { ColormapRegistration } from '../types';\n\nconst _colormaps = new Map();\n\n/**\n * Register a colormap\n * @param name - name of the colormap\n * @param colormap - colormap object\n */\nfunction registerColormap(colormap: ColormapRegistration) {\n _colormaps.set(colormap.Name, colormap);\n}\n\n/**\n * Get a colormap by name\n * @param name - name of the colormap\n * @returns colormap object\n */\nfunction getColormap(name) {\n return _colormaps.get(name);\n}\n\n/**\n * Get all registered colormap names\n * @returns array of colormap names\n *\n */\nfunction getColormapNames() {\n return Array.from(_colormaps.keys());\n}\n\nexport { getColormap, getColormapNames, registerColormap };\n","import cache, { Cache } from './cache';\nimport ImageVolume from './classes/ImageVolume';\n\nexport { ImageVolume, Cache };\nexport default cache;\n","var vtkColorMaps = [\n\t{\n\t\tName: \"KAAMS\",\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.63,\n\t\t\t0.63,\n\t\t\t1,\n\t\t\t0.67,\n\t\t\t0.5,\n\t\t\t0.33,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.75,\n\t\t\t0.53,\n\t\t\t0.35,\n\t\t\t0.7,\n\t\t\t1,\n\t\t\t0.75,\n\t\t\t0.5\n\t\t],\n\t\tAnnotations: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t2,\n\t\t\t2,\n\t\t\t3,\n\t\t\t3,\n\t\t\t4,\n\t\t\t4,\n\t\t\t5,\n\t\t\t5,\n\t\t\t6,\n\t\t\t6,\n\t\t\t7,\n\t\t\t7,\n\t\t\t8,\n\t\t\t8,\n\t\t\t9,\n\t\t\t9,\n\t\t\t10,\n\t\t\t10,\n\t\t\t11,\n\t\t\t11\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Cool to Warm\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.23137254902,\n\t\t\t0.298039215686,\n\t\t\t0.752941176471,\n\t\t\t0.5,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t1,\n\t\t\t0.705882352941,\n\t\t\t0.0156862745098,\n\t\t\t0.149019607843\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Cool to Warm (Extended)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t0.03125,\n\t\t\t0.039216,\n\t\t\t0.062745,\n\t\t\t0.380392,\n\t\t\t0.0625,\n\t\t\t0.062745,\n\t\t\t0.117647,\n\t\t\t0.411765,\n\t\t\t0.09375,\n\t\t\t0.090196,\n\t\t\t0.184314,\n\t\t\t0.45098,\n\t\t\t0.125,\n\t\t\t0.12549,\n\t\t\t0.262745,\n\t\t\t0.501961,\n\t\t\t0.15625,\n\t\t\t0.160784,\n\t\t\t0.337255,\n\t\t\t0.541176,\n\t\t\t0.1875,\n\t\t\t0.2,\n\t\t\t0.396078,\n\t\t\t0.568627,\n\t\t\t0.21875,\n\t\t\t0.239216,\n\t\t\t0.454902,\n\t\t\t0.6,\n\t\t\t0.25,\n\t\t\t0.286275,\n\t\t\t0.521569,\n\t\t\t0.65098,\n\t\t\t0.28125,\n\t\t\t0.337255,\n\t\t\t0.592157,\n\t\t\t0.701961,\n\t\t\t0.3125,\n\t\t\t0.388235,\n\t\t\t0.654902,\n\t\t\t0.74902,\n\t\t\t0.34375,\n\t\t\t0.466667,\n\t\t\t0.737255,\n\t\t\t0.819608,\n\t\t\t0.375,\n\t\t\t0.572549,\n\t\t\t0.819608,\n\t\t\t0.878431,\n\t\t\t0.40625,\n\t\t\t0.654902,\n\t\t\t0.866667,\n\t\t\t0.909804,\n\t\t\t0.4375,\n\t\t\t0.752941,\n\t\t\t0.917647,\n\t\t\t0.941176,\n\t\t\t0.46875,\n\t\t\t0.823529,\n\t\t\t0.956863,\n\t\t\t0.968627,\n\t\t\t0.5,\n\t\t\t0.988235,\n\t\t\t0.960784,\n\t\t\t0.901961,\n\t\t\t0.5,\n\t\t\t0.941176,\n\t\t\t0.984314,\n\t\t\t0.988235,\n\t\t\t0.52,\n\t\t\t0.988235,\n\t\t\t0.945098,\n\t\t\t0.85098,\n\t\t\t0.54,\n\t\t\t0.980392,\n\t\t\t0.898039,\n\t\t\t0.784314,\n\t\t\t0.5625,\n\t\t\t0.968627,\n\t\t\t0.835294,\n\t\t\t0.698039,\n\t\t\t0.59375,\n\t\t\t0.94902,\n\t\t\t0.733333,\n\t\t\t0.588235,\n\t\t\t0.625,\n\t\t\t0.929412,\n\t\t\t0.65098,\n\t\t\t0.509804,\n\t\t\t0.65625,\n\t\t\t0.909804,\n\t\t\t0.564706,\n\t\t\t0.435294,\n\t\t\t0.6875,\n\t\t\t0.878431,\n\t\t\t0.458824,\n\t\t\t0.352941,\n\t\t\t0.71875,\n\t\t\t0.839216,\n\t\t\t0.388235,\n\t\t\t0.286275,\n\t\t\t0.75,\n\t\t\t0.760784,\n\t\t\t0.294118,\n\t\t\t0.211765,\n\t\t\t0.78125,\n\t\t\t0.701961,\n\t\t\t0.211765,\n\t\t\t0.168627,\n\t\t\t0.8125,\n\t\t\t0.65098,\n\t\t\t0.156863,\n\t\t\t0.129412,\n\t\t\t0.84375,\n\t\t\t0.6,\n\t\t\t0.094118,\n\t\t\t0.094118,\n\t\t\t0.875,\n\t\t\t0.54902,\n\t\t\t0.066667,\n\t\t\t0.098039,\n\t\t\t0.90625,\n\t\t\t0.501961,\n\t\t\t0.05098,\n\t\t\t0.12549,\n\t\t\t0.9375,\n\t\t\t0.45098,\n\t\t\t0.054902,\n\t\t\t0.172549,\n\t\t\t0.96875,\n\t\t\t0.4,\n\t\t\t0.054902,\n\t\t\t0.192157,\n\t\t\t1,\n\t\t\t0.34902,\n\t\t\t0.070588,\n\t\t\t0.211765\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Warm to Cool\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.705882352941,\n\t\t\t0.0156862745098,\n\t\t\t0.149019607843,\n\t\t\t0.5,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t1,\n\t\t\t0.23137254902,\n\t\t\t0.298039215686,\n\t\t\t0.752941176471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Warm to Cool (Extended)\",\n\t\tNanColor: [\n\t\t\t0.250004,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.025,\n\t\t\t0.4,\n\t\t\t0.00392157,\n\t\t\t0.101961,\n\t\t\t0.05,\n\t\t\t0.470588,\n\t\t\t0.0156863,\n\t\t\t0.0901961,\n\t\t\t0.075,\n\t\t\t0.54902,\n\t\t\t0.027451,\n\t\t\t0.0705882,\n\t\t\t0.1,\n\t\t\t0.619608,\n\t\t\t0.0627451,\n\t\t\t0.0431373,\n\t\t\t0.125,\n\t\t\t0.690196,\n\t\t\t0.12549,\n\t\t\t0.0627451,\n\t\t\t0.15,\n\t\t\t0.741176,\n\t\t\t0.184314,\n\t\t\t0.0745098,\n\t\t\t0.175,\n\t\t\t0.788235,\n\t\t\t0.266667,\n\t\t\t0.0941176,\n\t\t\t0.2,\n\t\t\t0.811765,\n\t\t\t0.345098,\n\t\t\t0.113725,\n\t\t\t0.225,\n\t\t\t0.831373,\n\t\t\t0.411765,\n\t\t\t0.133333,\n\t\t\t0.25,\n\t\t\t0.85098,\n\t\t\t0.47451,\n\t\t\t0.145098,\n\t\t\t0.275,\n\t\t\t0.870588,\n\t\t\t0.54902,\n\t\t\t0.156863,\n\t\t\t0.3,\n\t\t\t0.878431,\n\t\t\t0.619608,\n\t\t\t0.168627,\n\t\t\t0.325,\n\t\t\t0.890196,\n\t\t\t0.658824,\n\t\t\t0.196078,\n\t\t\t0.35,\n\t\t\t0.909804,\n\t\t\t0.717647,\n\t\t\t0.235294,\n\t\t\t0.375,\n\t\t\t0.929412,\n\t\t\t0.776471,\n\t\t\t0.278431,\n\t\t\t0.395522,\n\t\t\t0.94902,\n\t\t\t0.823529,\n\t\t\t0.321569,\n\t\t\t0.418905,\n\t\t\t0.968627,\n\t\t\t0.87451,\n\t\t\t0.407843,\n\t\t\t0.444278,\n\t\t\t0.980392,\n\t\t\t0.917647,\n\t\t\t0.509804,\n\t\t\t0.470149,\n\t\t\t0.988235,\n\t\t\t0.956863,\n\t\t\t0.643137,\n\t\t\t0.483582,\n\t\t\t0.992157,\n\t\t\t0.964706,\n\t\t\t0.713725,\n\t\t\t0.499,\n\t\t\t0.988235,\n\t\t\t0.980392,\n\t\t\t0.870588,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.501,\n\t\t\t0.913725,\n\t\t\t0.988235,\n\t\t\t0.937255,\n\t\t\t0.516418,\n\t\t\t0.827451,\n\t\t\t0.980392,\n\t\t\t0.886275,\n\t\t\t0.531343,\n\t\t\t0.764706,\n\t\t\t0.980392,\n\t\t\t0.866667,\n\t\t\t0.546766,\n\t\t\t0.658824,\n\t\t\t0.980392,\n\t\t\t0.843137,\n\t\t\t0.564179,\n\t\t\t0.572549,\n\t\t\t0.964706,\n\t\t\t0.835294,\n\t\t\t0.587562,\n\t\t\t0.423529,\n\t\t\t0.941176,\n\t\t\t0.87451,\n\t\t\t0.60597,\n\t\t\t0.262745,\n\t\t\t0.901961,\n\t\t\t0.862745,\n\t\t\t0.629851,\n\t\t\t0.0705882,\n\t\t\t0.854902,\n\t\t\t0.870588,\n\t\t\t0.651741,\n\t\t\t0.0509804,\n\t\t\t0.8,\n\t\t\t0.85098,\n\t\t\t0.681592,\n\t\t\t0.0235294,\n\t\t\t0.709804,\n\t\t\t0.831373,\n\t\t\t0.712935,\n\t\t\t0.0313725,\n\t\t\t0.615686,\n\t\t\t0.811765,\n\t\t\t0.75,\n\t\t\t0.0313725,\n\t\t\t0.537255,\n\t\t\t0.788235,\n\t\t\t0.775,\n\t\t\t0.0392157,\n\t\t\t0.466667,\n\t\t\t0.768627,\n\t\t\t0.8,\n\t\t\t0.0509804,\n\t\t\t0.396078,\n\t\t\t0.741176,\n\t\t\t0.825,\n\t\t\t0.054902,\n\t\t\t0.317647,\n\t\t\t0.709804,\n\t\t\t0.85,\n\t\t\t0.054902,\n\t\t\t0.243137,\n\t\t\t0.678431,\n\t\t\t0.875,\n\t\t\t0.0431373,\n\t\t\t0.164706,\n\t\t\t0.639216,\n\t\t\t0.9,\n\t\t\t0.0313725,\n\t\t\t0.0980392,\n\t\t\t0.6,\n\t\t\t0.925,\n\t\t\t0.0392157,\n\t\t\t0.0392157,\n\t\t\t0.560784,\n\t\t\t0.95,\n\t\t\t0.105882,\n\t\t\t0.0509804,\n\t\t\t0.509804,\n\t\t\t0.975,\n\t\t\t0.113725,\n\t\t\t0.0235294,\n\t\t\t0.45098,\n\t\t\t1,\n\t\t\t0.12549,\n\t\t\t0,\n\t\t\t0.380392\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Desaturated\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.278431372549,\n\t\t\t0.278431372549,\n\t\t\t0.858823529412,\n\t\t\t0.143,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.360784313725,\n\t\t\t0.285,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.429,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t0,\n\t\t\t0.571,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.714,\n\t\t\t1,\n\t\t\t0.380392156863,\n\t\t\t0,\n\t\t\t0.857,\n\t\t\t0.419607843137,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0.301960784314,\n\t\t\t0.301960784314\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Cold and Hot\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.45,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t0.55,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Black-Body Radiation\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.498039215686,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.4,\n\t\t\t0.901960784314,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.8,\n\t\t\t0.901960784314,\n\t\t\t0.901960784314,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"X Ray\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Grayscale\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkRd\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkGn\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkBu\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkMa\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkCy\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Black, Blue and White\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t0.666,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Black, Orange and White\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.333,\n\t\t\t0.501960784314,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.666,\n\t\t\t1,\n\t\t\t0.501960784314,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Linear YGB 1211g\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.968627,\n\t\t\t0.02,\n\t\t\t1,\n\t\t\t0.952941,\n\t\t\t0.878431,\n\t\t\t0.05,\n\t\t\t0.968627,\n\t\t\t0.905882,\n\t\t\t0.776471,\n\t\t\t0.1,\n\t\t\t0.94902,\n\t\t\t0.898039,\n\t\t\t0.647059,\n\t\t\t0.15,\n\t\t\t0.901961,\n\t\t\t0.878431,\n\t\t\t0.556863,\n\t\t\t0.2,\n\t\t\t0.847059,\n\t\t\t0.858824,\n\t\t\t0.482353,\n\t\t\t0.25,\n\t\t\t0.690196,\n\t\t\t0.819608,\n\t\t\t0.435294,\n\t\t\t0.3,\n\t\t\t0.513725,\n\t\t\t0.768627,\n\t\t\t0.384314,\n\t\t\t0.35,\n\t\t\t0.337255,\n\t\t\t0.721569,\n\t\t\t0.337255,\n\t\t\t0.4,\n\t\t\t0.278431,\n\t\t\t0.658824,\n\t\t\t0.392157,\n\t\t\t0.45,\n\t\t\t0.231373,\n\t\t\t0.639216,\n\t\t\t0.435294,\n\t\t\t0.5,\n\t\t\t0.203922,\n\t\t\t0.6,\n\t\t\t0.486275,\n\t\t\t0.55,\n\t\t\t0.172549,\n\t\t\t0.568627,\n\t\t\t0.537255,\n\t\t\t0.6,\n\t\t\t0.141176,\n\t\t\t0.517647,\n\t\t\t0.54902,\n\t\t\t0.65,\n\t\t\t0.133333,\n\t\t\t0.458824,\n\t\t\t0.541176,\n\t\t\t0.7,\n\t\t\t0.12549,\n\t\t\t0.396078,\n\t\t\t0.529412,\n\t\t\t0.75,\n\t\t\t0.117647,\n\t\t\t0.321569,\n\t\t\t0.521569,\n\t\t\t0.8,\n\t\t\t0.121569,\n\t\t\t0.258824,\n\t\t\t0.509804,\n\t\t\t0.85,\n\t\t\t0.133333,\n\t\t\t0.227451,\n\t\t\t0.501961,\n\t\t\t0.9,\n\t\t\t0.145098,\n\t\t\t0.192157,\n\t\t\t0.490196,\n\t\t\t0.95,\n\t\t\t0.188235,\n\t\t\t0.164706,\n\t\t\t0.470588,\n\t\t\t1,\n\t\t\t0.258824,\n\t\t\t0.196078,\n\t\t\t0.439216\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"CIELAB\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Linear Green (Gr4L)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.054902,\n\t\t\t0.109804,\n\t\t\t0.121569,\n\t\t\t0.05,\n\t\t\t0.07451,\n\t\t\t0.172549,\n\t\t\t0.180392,\n\t\t\t0.1,\n\t\t\t0.086275,\n\t\t\t0.231373,\n\t\t\t0.219608,\n\t\t\t0.15,\n\t\t\t0.094118,\n\t\t\t0.278431,\n\t\t\t0.25098,\n\t\t\t0.2,\n\t\t\t0.109804,\n\t\t\t0.34902,\n\t\t\t0.278431,\n\t\t\t0.25,\n\t\t\t0.113725,\n\t\t\t0.4,\n\t\t\t0.278431,\n\t\t\t0.3,\n\t\t\t0.117647,\n\t\t\t0.45098,\n\t\t\t0.270588,\n\t\t\t0.35,\n\t\t\t0.117647,\n\t\t\t0.490196,\n\t\t\t0.243137,\n\t\t\t0.4,\n\t\t\t0.113725,\n\t\t\t0.521569,\n\t\t\t0.203922,\n\t\t\t0.45,\n\t\t\t0.109804,\n\t\t\t0.54902,\n\t\t\t0.152941,\n\t\t\t0.5,\n\t\t\t0.082353,\n\t\t\t0.588235,\n\t\t\t0.082353,\n\t\t\t0.55,\n\t\t\t0.109804,\n\t\t\t0.631373,\n\t\t\t0.05098,\n\t\t\t0.6,\n\t\t\t0.211765,\n\t\t\t0.678431,\n\t\t\t0.082353,\n\t\t\t0.65,\n\t\t\t0.317647,\n\t\t\t0.721569,\n\t\t\t0.113725,\n\t\t\t0.7,\n\t\t\t0.431373,\n\t\t\t0.760784,\n\t\t\t0.160784,\n\t\t\t0.75,\n\t\t\t0.556863,\n\t\t\t0.8,\n\t\t\t0.239216,\n\t\t\t0.8,\n\t\t\t0.666667,\n\t\t\t0.839216,\n\t\t\t0.294118,\n\t\t\t0.85,\n\t\t\t0.784314,\n\t\t\t0.878431,\n\t\t\t0.396078,\n\t\t\t0.9,\n\t\t\t0.886275,\n\t\t\t0.921569,\n\t\t\t0.533333,\n\t\t\t0.95,\n\t\t\t0.960784,\n\t\t\t0.94902,\n\t\t\t0.670588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.984314,\n\t\t\t0.901961\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Linear Blue (8_31f)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.960784,\n\t\t\t1,\n\t\t\t0.980392,\n\t\t\t0.05,\n\t\t\t0.815686,\n\t\t\t0.960784,\n\t\t\t0.913725,\n\t\t\t0.1,\n\t\t\t0.670588,\n\t\t\t0.929412,\n\t\t\t0.870588,\n\t\t\t0.15,\n\t\t\t0.556863,\n\t\t\t0.901961,\n\t\t\t0.843137,\n\t\t\t0.2,\n\t\t\t0.478431,\n\t\t\t0.870588,\n\t\t\t0.823529,\n\t\t\t0.25,\n\t\t\t0.439216,\n\t\t\t0.831373,\n\t\t\t0.803922,\n\t\t\t0.3,\n\t\t\t0.4,\n\t\t\t0.8,\n\t\t\t0.788235,\n\t\t\t0.35,\n\t\t\t0.376471,\n\t\t\t0.768627,\n\t\t\t0.768627,\n\t\t\t0.4,\n\t\t\t0.34902,\n\t\t\t0.709804,\n\t\t\t0.729412,\n\t\t\t0.45,\n\t\t\t0.32549,\n\t\t\t0.654902,\n\t\t\t0.690196,\n\t\t\t0.5,\n\t\t\t0.301961,\n\t\t\t0.607843,\n\t\t\t0.658824,\n\t\t\t0.55,\n\t\t\t0.247059,\n\t\t\t0.545098,\n\t\t\t0.619608,\n\t\t\t0.6,\n\t\t\t0.239216,\n\t\t\t0.494118,\n\t\t\t0.580392,\n\t\t\t0.65,\n\t\t\t0.227451,\n\t\t\t0.439216,\n\t\t\t0.541176,\n\t\t\t0.7,\n\t\t\t0.227451,\n\t\t\t0.403922,\n\t\t\t0.521569,\n\t\t\t0.75,\n\t\t\t0.231373,\n\t\t\t0.368627,\n\t\t\t0.501961,\n\t\t\t0.8,\n\t\t\t0.227451,\n\t\t\t0.321569,\n\t\t\t0.470588,\n\t\t\t0.85,\n\t\t\t0.219608,\n\t\t\t0.282353,\n\t\t\t0.439216,\n\t\t\t0.9,\n\t\t\t0.192157,\n\t\t\t0.235294,\n\t\t\t0.4,\n\t\t\t0.95,\n\t\t\t0.160784,\n\t\t\t0.184314,\n\t\t\t0.34902,\n\t\t\t1,\n\t\t\t0.133333,\n\t\t\t0.12549,\n\t\t\t0.301961\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"HSV\",\n\t\tName: \"Blue to Red Rainbow\",\n\t\tNanColor: [\n\t\t\t0.498039215686,\n\t\t\t0.498039215686,\n\t\t\t0.498039215686\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"HSV\",\n\t\tName: \"Red to Blue Rainbow\",\n\t\tNanColor: [\n\t\t\t0.498039215686,\n\t\t\t0.498039215686,\n\t\t\t0.498039215686\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Blended White\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.17,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.34,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.84,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Blended Grey\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.317647058824,\n\t\t\t0.341176470588,\n\t\t\t0.43137254902,\n\t\t\t0.17,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.34,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.84,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Blended Black\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.17,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.34,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.84,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Blue to Yellow\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.0392156862745,\n\t\t\t0.0392156862745,\n\t\t\t0.949019607843,\n\t\t\t1,\n\t\t\t0.949019607843,\n\t\t\t0.949019607843,\n\t\t\t0.0392156862745\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"HSV\",\n\t\tName: \"blot\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.166,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.167,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.332,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.333,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.501,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.666,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.667,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.832,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.833,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"CIELab Blue to Red\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.6,\n\t\t\t0.749019607843,\n\t\t\t1,\n\t\t\t0.76862745098,\n\t\t\t0.466666666667,\n\t\t\t0.341176470588\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"jet\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.5625,\n\t\t\t-0.777778,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t-0.269841,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t-0.015873,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.238095,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.746032,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"rainbow\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t-0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_rainbow_bright\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.32549,\n\t\t\t0.14902,\n\t\t\t0.960784,\n\t\t\t-0.866221,\n\t\t\t0.297047,\n\t\t\t0.375586,\n\t\t\t0.963836,\n\t\t\t-0.732441,\n\t\t\t0.180302,\n\t\t\t0.536818,\n\t\t\t0.964627,\n\t\t\t-0.598662,\n\t\t\t0.1302,\n\t\t\t0.649207,\n\t\t\t0.929647,\n\t\t\t-0.464883,\n\t\t\t0.0445143,\n\t\t\t0.749654,\n\t\t\t0.855998,\n\t\t\t-0.331104,\n\t\t\t0.0271325,\n\t\t\t0.830713,\n\t\t\t0.721527,\n\t\t\t-0.197324,\n\t\t\t0.259504,\n\t\t\t0.866145,\n\t\t\t0.543555,\n\t\t\t-0.0635452,\n\t\t\t0.428364,\n\t\t\t0.890725,\n\t\t\t0.329819,\n\t\t\t0.0702341,\n\t\t\t0.568503,\n\t\t\t0.898508,\n\t\t\t0.187623,\n\t\t\t0.204013,\n\t\t\t0.738259,\n\t\t\t0.890317,\n\t\t\t0.0825461,\n\t\t\t0.337793,\n\t\t\t0.84546,\n\t\t\t0.86136,\n\t\t\t0.0147555,\n\t\t\t0.471572,\n\t\t\t0.912191,\n\t\t\t0.808018,\n\t\t\t0,\n\t\t\t0.605351,\n\t\t\t0.962848,\n\t\t\t0.710445,\n\t\t\t0,\n\t\t\t0.73913,\n\t\t\t0.999469,\n\t\t\t0.600258,\n\t\t\t0.0176284,\n\t\t\t0.87291,\n\t\t\t0.994156,\n\t\t\t0.445975,\n\t\t\t0.193912,\n\t\t\t1,\n\t\t\t0.980407,\n\t\t\t0.247105,\n\t\t\t0.262699\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_rainbow_dark\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.423499,\n\t\t\t-0.866221,\n\t\t\t0,\n\t\t\t0.119346,\n\t\t\t0.529237,\n\t\t\t-0.732441,\n\t\t\t0,\n\t\t\t0.238691,\n\t\t\t0.634976,\n\t\t\t-0.598662,\n\t\t\t0,\n\t\t\t0.346852,\n\t\t\t0.68788,\n\t\t\t-0.464883,\n\t\t\t0,\n\t\t\t0.45022,\n\t\t\t0.718141,\n\t\t\t-0.331104,\n\t\t\t0,\n\t\t\t0.553554,\n\t\t\t0.664839,\n\t\t\t-0.197324,\n\t\t\t0,\n\t\t\t0.651082,\n\t\t\t0.519303,\n\t\t\t-0.0635452,\n\t\t\t0.115841,\n\t\t\t0.72479,\n\t\t\t0.352857,\n\t\t\t0.0702341,\n\t\t\t0.326771,\n\t\t\t0.781195,\n\t\t\t0.140187,\n\t\t\t0.204013,\n\t\t\t0.522765,\n\t\t\t0.798524,\n\t\t\t0.0284624,\n\t\t\t0.337793,\n\t\t\t0.703162,\n\t\t\t0.788685,\n\t\t\t0.00885756,\n\t\t\t0.471572,\n\t\t\t0.845118,\n\t\t\t0.751133,\n\t\t\t0,\n\t\t\t0.605351,\n\t\t\t0.955734,\n\t\t\t0.690825,\n\t\t\t0,\n\t\t\t0.73913,\n\t\t\t0.995402,\n\t\t\t0.567916,\n\t\t\t0.0618524,\n\t\t\t0.87291,\n\t\t\t0.987712,\n\t\t\t0.403398,\n\t\t\t0.164851,\n\t\t\t1,\n\t\t\t0.980407,\n\t\t\t0.247105,\n\t\t\t0.262699\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"nic_CubicL\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.479965,\n\t\t\t0.0118108,\n\t\t\t0.5307,\n\t\t\t-0.87451,\n\t\t\t0.522213,\n\t\t\t0.0551282,\n\t\t\t0.706919,\n\t\t\t-0.74902,\n\t\t\t0.50839,\n\t\t\t0.237278,\n\t\t\t0.867764,\n\t\t\t-0.623529,\n\t\t\t0.451617,\n\t\t\t0.373834,\n\t\t\t0.987255,\n\t\t\t-0.498039,\n\t\t\t0.39365,\n\t\t\t0.497255,\n\t\t\t0.97506,\n\t\t\t-0.372549,\n\t\t\t0.328631,\n\t\t\t0.599639,\n\t\t\t0.891843,\n\t\t\t-0.247059,\n\t\t\t0.250043,\n\t\t\t0.690286,\n\t\t\t0.778553,\n\t\t\t-0.121569,\n\t\t\t0.249656,\n\t\t\t0.764905,\n\t\t\t0.645857,\n\t\t\t0.00392157,\n\t\t\t0.297954,\n\t\t\t0.821466,\n\t\t\t0.50449,\n\t\t\t0.129412,\n\t\t\t0.337509,\n\t\t\t0.872595,\n\t\t\t0.358447,\n\t\t\t0.254902,\n\t\t\t0.430011,\n\t\t\t0.913789,\n\t\t\t0.297079,\n\t\t\t0.380392,\n\t\t\t0.587191,\n\t\t\t0.931381,\n\t\t\t0.333353,\n\t\t\t0.505882,\n\t\t\t0.727937,\n\t\t\t0.93591,\n\t\t\t0.353742,\n\t\t\t0.631373,\n\t\t\t0.826403,\n\t\t\t0.921081,\n\t\t\t0.365066,\n\t\t\t0.756863,\n\t\t\t0.893201,\n\t\t\t0.846317,\n\t\t\t0.372662,\n\t\t\t0.882353,\n\t\t\t0.965347,\n\t\t\t0.73884,\n\t\t\t0.378506,\n\t\t\t1,\n\t\t\t0.983235,\n\t\t\t0.597451,\n\t\t\t0.366856\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"nic_CubicYF\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.5151,\n\t\t\t0.0482,\n\t\t\t0.6697,\n\t\t\t-0.87451,\n\t\t\t0.520711,\n\t\t\t0.168955,\n\t\t\t0.800574,\n\t\t\t-0.74902,\n\t\t\t0.493694,\n\t\t\t0.278596,\n\t\t\t0.911824,\n\t\t\t-0.623529,\n\t\t\t0.440026,\n\t\t\t0.369475,\n\t\t\t0.984978,\n\t\t\t-0.498039,\n\t\t\t0.398932,\n\t\t\t0.457593,\n\t\t\t0.987053,\n\t\t\t-0.372549,\n\t\t\t0.350651,\n\t\t\t0.540644,\n\t\t\t0.929608,\n\t\t\t-0.247059,\n\t\t\t0.298827,\n\t\t\t0.615625,\n\t\t\t0.857729,\n\t\t\t-0.121569,\n\t\t\t0.239928,\n\t\t\t0.685061,\n\t\t\t0.769531,\n\t\t\t0.00392157,\n\t\t\t0.228832,\n\t\t\t0.739349,\n\t\t\t0.673287,\n\t\t\t0.129412,\n\t\t\t0.263297,\n\t\t\t0.78608,\n\t\t\t0.569988,\n\t\t\t0.254902,\n\t\t\t0.298107,\n\t\t\t0.828337,\n\t\t\t0.460214,\n\t\t\t0.380392,\n\t\t\t0.33092,\n\t\t\t0.864071,\n\t\t\t0.352674,\n\t\t\t0.505882,\n\t\t\t0.38306,\n\t\t\t0.898169,\n\t\t\t0.287309,\n\t\t\t0.631373,\n\t\t\t0.49023,\n\t\t\t0.917481,\n\t\t\t0.307961,\n\t\t\t0.756863,\n\t\t\t0.62372,\n\t\t\t0.926026,\n\t\t\t0.332309,\n\t\t\t0.882353,\n\t\t\t0.717458,\n\t\t\t0.92527,\n\t\t\t0.342476,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.9255,\n\t\t\t0.3529\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"gist_earth\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.239216,\n\t\t\t0.027451,\n\t\t\t0.415686,\n\t\t\t-0.74902,\n\t\t\t0.0901961,\n\t\t\t0.254902,\n\t\t\t0.556863,\n\t\t\t-0.623529,\n\t\t\t0.0941176,\n\t\t\t0.352941,\n\t\t\t0.54902,\n\t\t\t-0.498039,\n\t\t\t0.105882,\n\t\t\t0.435294,\n\t\t\t0.533333,\n\t\t\t-0.372549,\n\t\t\t0.12549,\n\t\t\t0.52549,\n\t\t\t0.501961,\n\t\t\t-0.247059,\n\t\t\t0.156863,\n\t\t\t0.596078,\n\t\t\t0.443137,\n\t\t\t-0.121569,\n\t\t\t0.196078,\n\t\t\t0.65098,\n\t\t\t0.380392,\n\t\t\t0.00392157,\n\t\t\t0.282353,\n\t\t\t0.717647,\n\t\t\t0.301961,\n\t\t\t0.129412,\n\t\t\t0.466667,\n\t\t\t0.772549,\n\t\t\t0.27451,\n\t\t\t0.254902,\n\t\t\t0.678431,\n\t\t\t0.784314,\n\t\t\t0.309804,\n\t\t\t0.380392,\n\t\t\t0.901961,\n\t\t\t0.756863,\n\t\t\t0.376471,\n\t\t\t0.505882,\n\t\t\t0.992157,\n\t\t\t0.705882,\n\t\t\t0.521569,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.721569,\n\t\t\t0.701961,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.784314,\n\t\t\t0.784314,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.866667,\n\t\t\t0.866667,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"2hot\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.0416667,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.873016,\n\t\t\t0.208333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.746032,\n\t\t\t0.375,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.619048,\n\t\t\t0.541667,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.492063,\n\t\t\t0.708333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.365079,\n\t\t\t0.854137,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.238095,\n\t\t\t0.937488,\n\t\t\t0.039062,\n\t\t\t0,\n\t\t\t-0.111111,\n\t\t\t1,\n\t\t\t0.208333,\n\t\t\t0,\n\t\t\t0.015873,\n\t\t\t1,\n\t\t\t0.375,\n\t\t\t0,\n\t\t\t0.142857,\n\t\t\t1,\n\t\t\t0.541667,\n\t\t\t0,\n\t\t\t0.269841,\n\t\t\t1,\n\t\t\t0.708333,\n\t\t\t0,\n\t\t\t0.396825,\n\t\t\t1,\n\t\t\t0.858805,\n\t\t\t0.03125,\n\t\t\t0.52381,\n\t\t\t1,\n\t\t\t0.947392,\n\t\t\t0.15625,\n\t\t\t0.650794,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.3125,\n\t\t\t0.777778,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5625,\n\t\t\t0.904762,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8125,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_red2yellow_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t7.54296e-7,\n\t\t\t0,\n\t\t\t0.0000109827,\n\t\t\t-0.87451,\n\t\t\t0.18285,\n\t\t\t0.0264094,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.3066,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.422841,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.522945,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.605721,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.672502,\n\t\t\t0.14168,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.728167,\n\t\t\t0.244025,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.781215,\n\t\t\t0.333454,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.825,\n\t\t\t0.423586,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.855893,\n\t\t\t0.516793,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.880491,\n\t\t\t0.608846,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.910305,\n\t\t\t0.695505,\n\t\t\t0,\n\t\t\t0.631373,\n\t\t\t0.94109,\n\t\t\t0.779067,\n\t\t\t0.223528,\n\t\t\t0.756863,\n\t\t\t0.967873,\n\t\t\t0.858572,\n\t\t\t0.473521,\n\t\t\t0.882353,\n\t\t\t0.986815,\n\t\t\t0.933211,\n\t\t\t0.751583,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999997\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_marine2gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1.11641e-7,\n\t\t\t0,\n\t\t\t0.00000162551,\n\t\t\t-0.87451,\n\t\t\t0.0413146,\n\t\t\t0.0619808,\n\t\t\t0.209857,\n\t\t\t-0.74902,\n\t\t\t0.0185557,\n\t\t\t0.101341,\n\t\t\t0.350684,\n\t\t\t-0.623529,\n\t\t\t0.00486405,\n\t\t\t0.149847,\n\t\t\t0.461054,\n\t\t\t-0.498039,\n\t\t\t0.0836345,\n\t\t\t0.210845,\n\t\t\t0.517906,\n\t\t\t-0.372549,\n\t\t\t0.173222,\n\t\t\t0.276134,\n\t\t\t0.541793,\n\t\t\t-0.247059,\n\t\t\t0.259857,\n\t\t\t0.343877,\n\t\t\t0.535869,\n\t\t\t-0.121569,\n\t\t\t0.362299,\n\t\t\t0.408124,\n\t\t\t0.504293,\n\t\t\t0.00392157,\n\t\t\t0.468266,\n\t\t\t0.468276,\n\t\t\t0.468257,\n\t\t\t0.129412,\n\t\t\t0.582781,\n\t\t\t0.527545,\n\t\t\t0.374914,\n\t\t\t0.254902,\n\t\t\t0.691591,\n\t\t\t0.585251,\n\t\t\t0.274266,\n\t\t\t0.380392,\n\t\t\t0.784454,\n\t\t\t0.645091,\n\t\t\t0.247332,\n\t\t\t0.505882,\n\t\t\t0.862299,\n\t\t\t0.710383,\n\t\t\t0.27518,\n\t\t\t0.631373,\n\t\t\t0.920863,\n\t\t\t0.782923,\n\t\t\t0.351563,\n\t\t\t0.756863,\n\t\t\t0.955792,\n\t\t\t0.859699,\n\t\t\t0.533541,\n\t\t\t0.882353,\n\t\t\t0.976162,\n\t\t\t0.93433,\n\t\t\t0.780671,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999983\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0742735,\n\t\t\t0.0440331,\n\t\t\t0.230013,\n\t\t\t-0.74902,\n\t\t\t0.125276,\n\t\t\t0.0258685,\n\t\t\t0.415826,\n\t\t\t-0.623529,\n\t\t\t0.143879,\n\t\t\t0.0163031,\n\t\t\t0.591346,\n\t\t\t-0.498039,\n\t\t\t0.212261,\n\t\t\t0.0627855,\n\t\t\t0.705239,\n\t\t\t-0.372549,\n\t\t\t0.306048,\n\t\t\t0.141178,\n\t\t\t0.763636,\n\t\t\t-0.247059,\n\t\t\t0.391537,\n\t\t\t0.232286,\n\t\t\t0.773263,\n\t\t\t-0.121569,\n\t\t\t0.461734,\n\t\t\t0.336633,\n\t\t\t0.708321,\n\t\t\t0.00392157,\n\t\t\t0.54209,\n\t\t\t0.427581,\n\t\t\t0.590007,\n\t\t\t0.129412,\n\t\t\t0.61704,\n\t\t\t0.508623,\n\t\t\t0.460978,\n\t\t\t0.254902,\n\t\t\t0.702703,\n\t\t\t0.579586,\n\t\t\t0.309117,\n\t\t\t0.380392,\n\t\t\t0.790336,\n\t\t\t0.644811,\n\t\t\t0.170397,\n\t\t\t0.505882,\n\t\t\t0.870173,\n\t\t\t0.710733,\n\t\t\t0.117134,\n\t\t\t0.631373,\n\t\t\t0.93656,\n\t\t\t0.781991,\n\t\t\t0.157144,\n\t\t\t0.756863,\n\t\t\t0.965672,\n\t\t\t0.862068,\n\t\t\t0.409836,\n\t\t\t0.882353,\n\t\t\t0.985751,\n\t\t\t0.936296,\n\t\t\t0.714162,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999999\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_sapphire2gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.107704,\n\t\t\t0.107708,\n\t\t\t0.107694,\n\t\t\t-0.87451,\n\t\t\t0.1851,\n\t\t\t0.112354,\n\t\t\t0.308554,\n\t\t\t-0.74902,\n\t\t\t0.236782,\n\t\t\t0.114233,\n\t\t\t0.48788,\n\t\t\t-0.623529,\n\t\t\t0.28296,\n\t\t\t0.126187,\n\t\t\t0.639464,\n\t\t\t-0.498039,\n\t\t\t0.344787,\n\t\t\t0.171643,\n\t\t\t0.739713,\n\t\t\t-0.372549,\n\t\t\t0.413325,\n\t\t\t0.242371,\n\t\t\t0.76913,\n\t\t\t-0.247059,\n\t\t\t0.481863,\n\t\t\t0.3131,\n\t\t\t0.719841,\n\t\t\t-0.121569,\n\t\t\t0.550402,\n\t\t\t0.383829,\n\t\t\t0.612222,\n\t\t\t0.00392157,\n\t\t\t0.61894,\n\t\t\t0.454558,\n\t\t\t0.51126,\n\t\t\t0.129412,\n\t\t\t0.687478,\n\t\t\t0.525287,\n\t\t\t0.39993,\n\t\t\t0.254902,\n\t\t\t0.756017,\n\t\t\t0.596016,\n\t\t\t0.289923,\n\t\t\t0.380392,\n\t\t\t0.824555,\n\t\t\t0.666745,\n\t\t\t0.255498,\n\t\t\t0.505882,\n\t\t\t0.892979,\n\t\t\t0.736822,\n\t\t\t0.27696,\n\t\t\t0.631373,\n\t\t\t0.938851,\n\t\t\t0.804966,\n\t\t\t0.351734,\n\t\t\t0.756863,\n\t\t\t0.966491,\n\t\t\t0.874853,\n\t\t\t0.53572,\n\t\t\t0.882353,\n\t\t\t0.982105,\n\t\t\t0.94153,\n\t\t\t0.782579,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999986\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_red2purple_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.167793,\n\t\t\t0.0166271,\n\t\t\t0.0431278,\n\t\t\t-0.74902,\n\t\t\t0.262608,\n\t\t\t0.0107595,\n\t\t\t0.0791181,\n\t\t\t-0.623529,\n\t\t\t0.351902,\n\t\t\t0.0101858,\n\t\t\t0.100926,\n\t\t\t-0.498039,\n\t\t\t0.441257,\n\t\t\t0.0160835,\n\t\t\t0.131919,\n\t\t\t-0.372549,\n\t\t\t0.5221,\n\t\t\t0.0555972,\n\t\t\t0.195625,\n\t\t\t-0.247059,\n\t\t\t0.593852,\n\t\t\t0.104294,\n\t\t\t0.310234,\n\t\t\t-0.121569,\n\t\t\t0.654628,\n\t\t\t0.158115,\n\t\t\t0.448486,\n\t\t\t0.00392157,\n\t\t\t0.707443,\n\t\t\t0.220914,\n\t\t\t0.570253,\n\t\t\t0.129412,\n\t\t\t0.749504,\n\t\t\t0.293268,\n\t\t\t0.67897,\n\t\t\t0.254902,\n\t\t\t0.781587,\n\t\t\t0.370517,\n\t\t\t0.779269,\n\t\t\t0.380392,\n\t\t\t0.809951,\n\t\t\t0.451099,\n\t\t\t0.855831,\n\t\t\t0.505882,\n\t\t\t0.84424,\n\t\t\t0.531462,\n\t\t\t0.900451,\n\t\t\t0.631373,\n\t\t\t0.865174,\n\t\t\t0.620901,\n\t\t\t0.91606,\n\t\t\t0.756863,\n\t\t\t0.875041,\n\t\t\t0.714054,\n\t\t\t0.910284,\n\t\t\t0.882353,\n\t\t\t0.880764,\n\t\t\t0.80554,\n\t\t\t0.896276,\n\t\t\t1,\n\t\t\t0.887572,\n\t\t\t0.887591,\n\t\t\t0.887556\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple2pink_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.117562,\n\t\t\t0.0291202,\n\t\t\t0.175876,\n\t\t\t-0.74902,\n\t\t\t0.178368,\n\t\t\t0.0458476,\n\t\t\t0.285454,\n\t\t\t-0.623529,\n\t\t\t0.237731,\n\t\t\t0.0680173,\n\t\t\t0.387717,\n\t\t\t-0.498039,\n\t\t\t0.300877,\n\t\t\t0.0956291,\n\t\t\t0.484802,\n\t\t\t-0.372549,\n\t\t\t0.370929,\n\t\t\t0.136858,\n\t\t\t0.554985,\n\t\t\t-0.247059,\n\t\t\t0.449033,\n\t\t\t0.189273,\n\t\t\t0.58863,\n\t\t\t-0.121569,\n\t\t\t0.529971,\n\t\t\t0.245796,\n\t\t\t0.598587,\n\t\t\t0.00392157,\n\t\t\t0.609914,\n\t\t\t0.300643,\n\t\t\t0.610244,\n\t\t\t0.129412,\n\t\t\t0.697079,\n\t\t\t0.351286,\n\t\t\t0.616371,\n\t\t\t0.254902,\n\t\t\t0.785858,\n\t\t\t0.401991,\n\t\t\t0.617376,\n\t\t\t0.380392,\n\t\t\t0.862517,\n\t\t\t0.45745,\n\t\t\t0.64463,\n\t\t\t0.505882,\n\t\t\t0.91359,\n\t\t\t0.525462,\n\t\t\t0.705336,\n\t\t\t0.631373,\n\t\t\t0.932583,\n\t\t\t0.61064,\n\t\t\t0.767412,\n\t\t\t0.756863,\n\t\t\t0.922478,\n\t\t\t0.706966,\n\t\t\t0.817522,\n\t\t\t0.882353,\n\t\t\t0.901302,\n\t\t\t0.803071,\n\t\t\t0.856311,\n\t\t\t1,\n\t\t\t0.887571,\n\t\t\t0.887591,\n\t\t\t0.887549\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_pbj_lin\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.091821,\n\t\t\t0.0611476,\n\t\t\t0.10617,\n\t\t\t-0.74902,\n\t\t\t0.160311,\n\t\t\t0.0900022,\n\t\t\t0.192713,\n\t\t\t-0.623529,\n\t\t\t0.22484,\n\t\t\t0.12126,\n\t\t\t0.272128,\n\t\t\t-0.498039,\n\t\t\t0.291263,\n\t\t\t0.157469,\n\t\t\t0.340828,\n\t\t\t-0.372549,\n\t\t\t0.360015,\n\t\t\t0.200388,\n\t\t\t0.388903,\n\t\t\t-0.247059,\n\t\t\t0.437497,\n\t\t\t0.250058,\n\t\t\t0.387201,\n\t\t\t-0.121569,\n\t\t\t0.512636,\n\t\t\t0.304969,\n\t\t\t0.355955,\n\t\t\t0.00392157,\n\t\t\t0.582603,\n\t\t\t0.360874,\n\t\t\t0.33488,\n\t\t\t0.129412,\n\t\t\t0.655126,\n\t\t\t0.416374,\n\t\t\t0.306351,\n\t\t\t0.254902,\n\t\t\t0.725889,\n\t\t\t0.473329,\n\t\t\t0.279051,\n\t\t\t0.380392,\n\t\t\t0.778125,\n\t\t\t0.537928,\n\t\t\t0.302697,\n\t\t\t0.505882,\n\t\t\t0.815894,\n\t\t\t0.606931,\n\t\t\t0.382431,\n\t\t\t0.631373,\n\t\t\t0.839159,\n\t\t\t0.679308,\n\t\t\t0.497608,\n\t\t\t0.756863,\n\t\t\t0.854748,\n\t\t\t0.751666,\n\t\t\t0.631792,\n\t\t\t0.882353,\n\t\t\t0.869483,\n\t\t\t0.822508,\n\t\t\t0.768592,\n\t\t\t1,\n\t\t\t0.887572,\n\t\t\t0.887589,\n\t\t\t0.887565\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2green_muted\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.107704,\n\t\t\t0.107708,\n\t\t\t0.107695,\n\t\t\t-0.87451,\n\t\t\t0.141522,\n\t\t\t0.13066,\n\t\t\t0.270741,\n\t\t\t-0.74902,\n\t\t\t0.180123,\n\t\t\t0.146119,\n\t\t\t0.42308,\n\t\t\t-0.623529,\n\t\t\t0.210161,\n\t\t\t0.169674,\n\t\t\t0.551795,\n\t\t\t-0.498039,\n\t\t\t0.239701,\n\t\t\t0.212939,\n\t\t\t0.634969,\n\t\t\t-0.372549,\n\t\t\t0.253916,\n\t\t\t0.282947,\n\t\t\t0.653641,\n\t\t\t-0.247059,\n\t\t\t0.242791,\n\t\t\t0.366933,\n\t\t\t0.608521,\n\t\t\t-0.121569,\n\t\t\t0.226302,\n\t\t\t0.446776,\n\t\t\t0.52693,\n\t\t\t0.00392157,\n\t\t\t0.236237,\n\t\t\t0.514689,\n\t\t\t0.458798,\n\t\t\t0.129412,\n\t\t\t0.274641,\n\t\t\t0.577589,\n\t\t\t0.376069,\n\t\t\t0.254902,\n\t\t\t0.349625,\n\t\t\t0.633993,\n\t\t\t0.288131,\n\t\t\t0.380392,\n\t\t\t0.4437,\n\t\t\t0.683677,\n\t\t\t0.260497,\n\t\t\t0.505882,\n\t\t\t0.536247,\n\t\t\t0.731214,\n\t\t\t0.285424,\n\t\t\t0.631373,\n\t\t\t0.628472,\n\t\t\t0.777128,\n\t\t\t0.349151,\n\t\t\t0.756863,\n\t\t\t0.718259,\n\t\t\t0.819287,\n\t\t\t0.496825,\n\t\t\t0.882353,\n\t\t\t0.804768,\n\t\t\t0.856164,\n\t\t\t0.703299,\n\t\t\t1,\n\t\t\t0.887571,\n\t\t\t0.887591,\n\t\t\t0.887548\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2green_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t3.63578e-7,\n\t\t\t0,\n\t\t\t0.00000529374,\n\t\t\t-0.87451,\n\t\t\t0.0539915,\n\t\t\t0.0577948,\n\t\t\t0.212806,\n\t\t\t-0.74902,\n\t\t\t0.0620393,\n\t\t\t0.0758942,\n\t\t\t0.388959,\n\t\t\t-0.623529,\n\t\t\t0.0697499,\n\t\t\t0.102032,\n\t\t\t0.54177,\n\t\t\t-0.498039,\n\t\t\t0.113295,\n\t\t\t0.156156,\n\t\t\t0.64334,\n\t\t\t-0.372549,\n\t\t\t0.152047,\n\t\t\t0.243196,\n\t\t\t0.670283,\n\t\t\t-0.247059,\n\t\t\t0.158096,\n\t\t\t0.344084,\n\t\t\t0.622864,\n\t\t\t-0.121569,\n\t\t\t0.151142,\n\t\t\t0.43922,\n\t\t\t0.532767,\n\t\t\t0.00392157,\n\t\t\t0.17155,\n\t\t\t0.521588,\n\t\t\t0.457719,\n\t\t\t0.129412,\n\t\t\t0.225861,\n\t\t\t0.599141,\n\t\t\t0.363997,\n\t\t\t0.254902,\n\t\t\t0.32328,\n\t\t\t0.67007,\n\t\t\t0.259083,\n\t\t\t0.380392,\n\t\t\t0.442344,\n\t\t\t0.733697,\n\t\t\t0.223754,\n\t\t\t0.505882,\n\t\t\t0.558409,\n\t\t\t0.794941,\n\t\t\t0.257411,\n\t\t\t0.631373,\n\t\t\t0.673875,\n\t\t\t0.854344,\n\t\t\t0.340822,\n\t\t\t0.756863,\n\t\t\t0.787244,\n\t\t\t0.909326,\n\t\t\t0.524717,\n\t\t\t0.882353,\n\t\t\t0.896483,\n\t\t\t0.958063,\n\t\t\t0.775914,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999982\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GREEN-WHITE_LINEAR\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.062745,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.12549,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.188235,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.25098,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0.313725,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.376471,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.094118,\n\t\t\t0.439216,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.196078,\n\t\t\t0.501961,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.294118,\n\t\t\t0.564706,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.396078,\n\t\t\t0.627451,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.498039,\n\t\t\t0.690196,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.6,\n\t\t\t0.752941,\n\t\t\t0.145098,\n\t\t\t0.631373,\n\t\t\t0.701961,\n\t\t\t0.815686,\n\t\t\t0.364706,\n\t\t\t0.756863,\n\t\t\t0.8,\n\t\t\t0.878431,\n\t\t\t0.580392,\n\t\t\t0.882353,\n\t\t\t0.901961,\n\t\t\t0.941176,\n\t\t\t0.796078,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_green2yellow_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.105542,\n\t\t\t0.0603919,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.159454,\n\t\t\t0.104148,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.219502,\n\t\t\t0.15542,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.282276,\n\t\t\t0.203811,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0.346331,\n\t\t\t0.235652,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.411765,\n\t\t\t0.235428,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.477177,\n\t\t\t0.217977,\n\t\t\t0.00392157,\n\t\t\t0.0593644,\n\t\t\t0.541635,\n\t\t\t0.21361,\n\t\t\t0.129412,\n\t\t\t0.233081,\n\t\t\t0.604722,\n\t\t\t0.210591,\n\t\t\t0.254902,\n\t\t\t0.369803,\n\t\t\t0.664942,\n\t\t\t0.226536,\n\t\t\t0.380392,\n\t\t\t0.498446,\n\t\t\t0.722367,\n\t\t\t0.288237,\n\t\t\t0.505882,\n\t\t\t0.601929,\n\t\t\t0.782244,\n\t\t\t0.380815,\n\t\t\t0.631373,\n\t\t\t0.703207,\n\t\t\t0.840497,\n\t\t\t0.512134,\n\t\t\t0.756863,\n\t\t\t0.803186,\n\t\t\t0.896433,\n\t\t\t0.674462,\n\t\t\t0.882353,\n\t\t\t0.903834,\n\t\t\t0.950266,\n\t\t\t0.846715,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999981\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"blue2cyan\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.152941,\n\t\t\t0.364706,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.470588,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t0.572549,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.443137,\n\t\t\t0.670588,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0.537255,\n\t\t\t0.772549,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.627451,\n\t\t\t0.870588,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.717647,\n\t\t\t0.964706,\n\t\t\t0.00392157,\n\t\t\t0.0784314,\n\t\t\t0.772549,\n\t\t\t1,\n\t\t\t0.129412,\n\t\t\t0.207843,\n\t\t\t0.858824,\n\t\t\t1,\n\t\t\t0.254902,\n\t\t\t0.32549,\n\t\t\t0.941176,\n\t\t\t1,\n\t\t\t0.380392,\n\t\t\t0.45098,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.505882,\n\t\t\t0.560784,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t0.662745,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t0.760784,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t0.870588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2cyan_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t4.05298e-7,\n\t\t\t0,\n\t\t\t0.0000059012,\n\t\t\t-0.87451,\n\t\t\t0.0207526,\n\t\t\t0.0740933,\n\t\t\t0.18093,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.121033,\n\t\t\t0.30343,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.166892,\n\t\t\t0.416095,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.216768,\n\t\t\t0.524796,\n\t\t\t-0.372549,\n\t\t\t0.0164769,\n\t\t\t0.275471,\n\t\t\t0.608585,\n\t\t\t-0.247059,\n\t\t\t0.0544527,\n\t\t\t0.344824,\n\t\t\t0.659267,\n\t\t\t-0.121569,\n\t\t\t0.0880643,\n\t\t\t0.419118,\n\t\t\t0.688675,\n\t\t\t0.00392157,\n\t\t\t0.127938,\n\t\t\t0.492556,\n\t\t\t0.720256,\n\t\t\t0.129412,\n\t\t\t0.149476,\n\t\t\t0.566946,\n\t\t\t0.756918,\n\t\t\t0.254902,\n\t\t\t0.188961,\n\t\t\t0.641333,\n\t\t\t0.792122,\n\t\t\t0.380392,\n\t\t\t0.245482,\n\t\t\t0.715336,\n\t\t\t0.827609,\n\t\t\t0.505882,\n\t\t\t0.329216,\n\t\t\t0.786235,\n\t\t\t0.874761,\n\t\t\t0.631373,\n\t\t\t0.453558,\n\t\t\t0.852803,\n\t\t\t0.918466,\n\t\t\t0.756863,\n\t\t\t0.626281,\n\t\t\t0.910493,\n\t\t\t0.954,\n\t\t\t0.882353,\n\t\t\t0.82257,\n\t\t\t0.958709,\n\t\t\t0.980146,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999989\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0425591,\n\t\t\t0.0763529,\n\t\t\t0.150682,\n\t\t\t-0.74902,\n\t\t\t0.0569472,\n\t\t\t0.119154,\n\t\t\t0.275403,\n\t\t\t-0.623529,\n\t\t\t0.0635978,\n\t\t\t0.164772,\n\t\t\t0.395427,\n\t\t\t-0.498039,\n\t\t\t0.0774342,\n\t\t\t0.213851,\n\t\t\t0.510014,\n\t\t\t-0.372549,\n\t\t\t0.106815,\n\t\t\t0.267034,\n\t\t\t0.615102,\n\t\t\t-0.247059,\n\t\t\t0.122093,\n\t\t\t0.324649,\n\t\t\t0.720068,\n\t\t\t-0.121569,\n\t\t\t0.160851,\n\t\t\t0.387068,\n\t\t\t0.806956,\n\t\t\t0.00392157,\n\t\t\t0.213754,\n\t\t\t0.453516,\n\t\t\t0.878012,\n\t\t\t0.129412,\n\t\t\t0.26722,\n\t\t\t0.524656,\n\t\t\t0.932436,\n\t\t\t0.254902,\n\t\t\t0.326844,\n\t\t\t0.599279,\n\t\t\t0.968038,\n\t\t\t0.380392,\n\t\t\t0.403403,\n\t\t\t0.674712,\n\t\t\t0.984784,\n\t\t\t0.505882,\n\t\t\t0.499703,\n\t\t\t0.745519,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t0.615055,\n\t\t\t0.813983,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t0.74405,\n\t\t\t0.879228,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t0.877909,\n\t\t\t0.941913,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999996\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BLUE-WHITE\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.082353,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.168627,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.337255,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.423529,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.509804,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.101961,\n\t\t\t0.592157,\n\t\t\t0.00392157,\n\t\t\t0,\n\t\t\t0.203922,\n\t\t\t0.678431,\n\t\t\t0.129412,\n\t\t\t0,\n\t\t\t0.301961,\n\t\t\t0.764706,\n\t\t\t0.254902,\n\t\t\t0,\n\t\t\t0.403922,\n\t\t\t0.85098,\n\t\t\t0.380392,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.933333,\n\t\t\t0.505882,\n\t\t\t0,\n\t\t\t0.603922,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t0.254902,\n\t\t\t0.705882,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t0.509804,\n\t\t\t0.807843,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t0.764706,\n\t\t\t0.905882,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t4.264e-8,\n\t\t\t0,\n\t\t\t6.20844e-7,\n\t\t\t-0.87451,\n\t\t\t0.100579,\n\t\t\t0.0593111,\n\t\t\t0.145666,\n\t\t\t-0.74902,\n\t\t\t0.167794,\n\t\t\t0.0889224,\n\t\t\t0.254953,\n\t\t\t-0.623529,\n\t\t\t0.231446,\n\t\t\t0.123339,\n\t\t\t0.360511,\n\t\t\t-0.498039,\n\t\t\t0.296699,\n\t\t\t0.163027,\n\t\t\t0.461278,\n\t\t\t-0.372549,\n\t\t\t0.363211,\n\t\t\t0.209286,\n\t\t\t0.55306,\n\t\t\t-0.247059,\n\t\t\t0.431136,\n\t\t\t0.260776,\n\t\t\t0.637195,\n\t\t\t-0.121569,\n\t\t\t0.498202,\n\t\t\t0.320012,\n\t\t\t0.705799,\n\t\t\t0.00392157,\n\t\t\t0.567456,\n\t\t\t0.380459,\n\t\t\t0.778091,\n\t\t\t0.129412,\n\t\t\t0.629381,\n\t\t\t0.445284,\n\t\t\t0.8448,\n\t\t\t0.254902,\n\t\t\t0.688373,\n\t\t\t0.517374,\n\t\t\t0.895694,\n\t\t\t0.380392,\n\t\t\t0.74891,\n\t\t\t0.590906,\n\t\t\t0.93976,\n\t\t\t0.505882,\n\t\t\t0.805017,\n\t\t\t0.667956,\n\t\t\t0.977626,\n\t\t\t0.631373,\n\t\t\t0.850914,\n\t\t\t0.752618,\n\t\t\t0.992396,\n\t\t\t0.756863,\n\t\t\t0.89724,\n\t\t\t0.838454,\n\t\t\t0.994093,\n\t\t\t0.882353,\n\t\t\t0.948461,\n\t\t\t0.922603,\n\t\t\t0.994449,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999967\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_magenta_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.0000254023,\n\t\t\t-0.87451,\n\t\t\t0.128696,\n\t\t\t0.0456782,\n\t\t\t0.11635,\n\t\t\t-0.74902,\n\t\t\t0.228133,\n\t\t\t0.0476299,\n\t\t\t0.201452,\n\t\t\t-0.623529,\n\t\t\t0.327273,\n\t\t\t0.0374065,\n\t\t\t0.282107,\n\t\t\t-0.498039,\n\t\t\t0.420953,\n\t\t\t0.0408166,\n\t\t\t0.35709,\n\t\t\t-0.372549,\n\t\t\t0.511562,\n\t\t\t0.0642203,\n\t\t\t0.430511,\n\t\t\t-0.247059,\n\t\t\t0.599552,\n\t\t\t0.102686,\n\t\t\t0.504257,\n\t\t\t-0.121569,\n\t\t\t0.684646,\n\t\t\t0.150536,\n\t\t\t0.579429,\n\t\t\t0.00392157,\n\t\t\t0.765817,\n\t\t\t0.205978,\n\t\t\t0.656062,\n\t\t\t0.129412,\n\t\t\t0.839176,\n\t\t\t0.27229,\n\t\t\t0.731807,\n\t\t\t0.254902,\n\t\t\t0.89536,\n\t\t\t0.357594,\n\t\t\t0.797309,\n\t\t\t0.380392,\n\t\t\t0.930238,\n\t\t\t0.457825,\n\t\t\t0.846984,\n\t\t\t0.505882,\n\t\t\t0.945921,\n\t\t\t0.564536,\n\t\t\t0.880571,\n\t\t\t0.631373,\n\t\t\t0.948995,\n\t\t\t0.670753,\n\t\t\t0.902279,\n\t\t\t0.756863,\n\t\t\t0.947124,\n\t\t\t0.772819,\n\t\t\t0.918171,\n\t\t\t0.882353,\n\t\t\t0.947265,\n\t\t\t0.869424,\n\t\t\t0.934352,\n\t\t\t1,\n\t\t\t0.954719,\n\t\t\t0.95475,\n\t\t\t0.954726\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"magenta\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.364706,\n\t\t\t0,\n\t\t\t0.152941,\n\t\t\t-0.74902,\n\t\t\t0.470588,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t-0.623529,\n\t\t\t0.572549,\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t-0.498039,\n\t\t\t0.670588,\n\t\t\t0,\n\t\t\t0.443137,\n\t\t\t-0.372549,\n\t\t\t0.772549,\n\t\t\t0,\n\t\t\t0.537255,\n\t\t\t-0.247059,\n\t\t\t0.870588,\n\t\t\t0,\n\t\t\t0.627451,\n\t\t\t-0.121569,\n\t\t\t0.964706,\n\t\t\t0,\n\t\t\t0.717647,\n\t\t\t0.00392157,\n\t\t\t1,\n\t\t\t0.0784314,\n\t\t\t0.772549,\n\t\t\t0.129412,\n\t\t\t1,\n\t\t\t0.207843,\n\t\t\t0.858824,\n\t\t\t0.254902,\n\t\t\t1,\n\t\t\t0.32549,\n\t\t\t0.941176,\n\t\t\t0.380392,\n\t\t\t1,\n\t\t\t0.45098,\n\t\t\t1,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.560784,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.662745,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.760784,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.870588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RED-PURPLE\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.188235,\n\t\t\t0,\n\t\t\t0.007843,\n\t\t\t-0.74902,\n\t\t\t0.345098,\n\t\t\t0,\n\t\t\t0.035294,\n\t\t\t-0.623529,\n\t\t\t0.439216,\n\t\t\t0,\n\t\t\t0.098039,\n\t\t\t-0.498039,\n\t\t\t0.533333,\n\t\t\t0,\n\t\t\t0.152941,\n\t\t\t-0.372549,\n\t\t\t0.627451,\n\t\t\t0.015686,\n\t\t\t0.211765,\n\t\t\t-0.247059,\n\t\t\t0.721569,\n\t\t\t0.031373,\n\t\t\t0.266667,\n\t\t\t-0.121569,\n\t\t\t0.8,\n\t\t\t0.047059,\n\t\t\t0.329412,\n\t\t\t0.00392157,\n\t\t\t0.862745,\n\t\t\t0.047059,\n\t\t\t0.403922,\n\t\t\t0.129412,\n\t\t\t0.941176,\n\t\t\t0.062745,\n\t\t\t0.466667,\n\t\t\t0.254902,\n\t\t\t0.988235,\n\t\t\t0.078431,\n\t\t\t0.54902,\n\t\t\t0.380392,\n\t\t\t0.988235,\n\t\t\t0.141176,\n\t\t\t0.643137,\n\t\t\t0.505882,\n\t\t\t0.988235,\n\t\t\t0.25098,\n\t\t\t0.729412,\n\t\t\t0.631373,\n\t\t\t0.988235,\n\t\t\t0.376471,\n\t\t\t0.811765,\n\t\t\t0.756863,\n\t\t\t0.988235,\n\t\t\t0.54902,\n\t\t\t0.886275,\n\t\t\t0.882353,\n\t\t\t0.988235,\n\t\t\t0.752941,\n\t\t\t0.952941,\n\t\t\t1,\n\t\t\t0.996078,\n\t\t\t0.996078,\n\t\t\t0.996078\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_red_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.147204,\n\t\t\t0.0480135,\n\t\t\t0.0401815,\n\t\t\t-0.74902,\n\t\t\t0.253411,\n\t\t\t0.0617478,\n\t\t\t0.0301333,\n\t\t\t-0.623529,\n\t\t\t0.356059,\n\t\t\t0.0746331,\n\t\t\t0.0446897,\n\t\t\t-0.498039,\n\t\t\t0.457731,\n\t\t\t0.0934935,\n\t\t\t0.0636931,\n\t\t\t-0.372549,\n\t\t\t0.557199,\n\t\t\t0.122714,\n\t\t\t0.0860013,\n\t\t\t-0.247059,\n\t\t\t0.665179,\n\t\t\t0.144238,\n\t\t\t0.105585,\n\t\t\t-0.121569,\n\t\t\t0.763833,\n\t\t\t0.187056,\n\t\t\t0.138326,\n\t\t\t0.00392157,\n\t\t\t0.847035,\n\t\t\t0.254558,\n\t\t\t0.189407,\n\t\t\t0.129412,\n\t\t\t0.905663,\n\t\t\t0.345937,\n\t\t\t0.258215,\n\t\t\t0.254902,\n\t\t\t0.941431,\n\t\t\t0.447111,\n\t\t\t0.346277,\n\t\t\t0.380392,\n\t\t\t0.962608,\n\t\t\t0.546927,\n\t\t\t0.457571,\n\t\t\t0.505882,\n\t\t\t0.987833,\n\t\t\t0.637276,\n\t\t\t0.569944,\n\t\t\t0.631373,\n\t\t\t0.994202,\n\t\t\t0.732176,\n\t\t\t0.687958,\n\t\t\t0.756863,\n\t\t\t0.993304,\n\t\t\t0.826268,\n\t\t\t0.800567,\n\t\t\t0.882353,\n\t\t\t0.994413,\n\t\t\t0.917205,\n\t\t\t0.906393,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999979\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RED_TEMPERATURE\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.090196,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.180392,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.270588,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.360784,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.45098,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.545098,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.635294,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.72549,\n\t\t\t0.058824,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.815686,\n\t\t\t0.176471,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.905882,\n\t\t\t0.294118,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t1,\n\t\t\t0.411765,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.533333,\n\t\t\t0.027451,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.65098,\n\t\t\t0.27451,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.768627,\n\t\t\t0.521569,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.886275,\n\t\t\t0.768627,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_orange_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.0000253806,\n\t\t\t-0.87451,\n\t\t\t0.135871,\n\t\t\t0.0593824,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.224328,\n\t\t\t0.0907216,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.318083,\n\t\t\t0.119647,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.414443,\n\t\t\t0.150246,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.511077,\n\t\t\t0.184884,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.605501,\n\t\t\t0.226033,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.695274,\n\t\t\t0.275491,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.777826,\n\t\t\t0.334445,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.851498,\n\t\t\t0.402441,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.915899,\n\t\t\t0.47759,\n\t\t\t0.000602975,\n\t\t\t0.380392,\n\t\t\t0.971984,\n\t\t\t0.557882,\n\t\t\t0.0361443,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.641287,\n\t\t\t0.135967,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.725198,\n\t\t\t0.27997,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.808205,\n\t\t\t0.438135,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.89306,\n\t\t\t0.587036,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.977928,\n\t\t\t0.721599\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"heated_object\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.34902,\n\t\t\t0.0862745,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.45098,\n\t\t\t0.172549,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.52549,\n\t\t\t0.231373,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.580392,\n\t\t\t0.278431,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.623529,\n\t\t\t0.313725,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.670588,\n\t\t\t0.352941,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.717647,\n\t\t\t0.392157,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.772549,\n\t\t\t0.439216,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.839216,\n\t\t\t0.494118,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.901961,\n\t\t\t0.541176,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.968627,\n\t\t\t0.6,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.658824,\n\t\t\t0,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.721569,\n\t\t\t0,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.827451,\n\t\t\t0.298039,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.976471,\n\t\t\t0.72549,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.0000190933,\n\t\t\t-0.87451,\n\t\t\t0.128363,\n\t\t\t0.0636265,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.193795,\n\t\t\t0.111057,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.25976,\n\t\t\t0.15987,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.328546,\n\t\t\t0.210589,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.399726,\n\t\t\t0.26332,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.472969,\n\t\t\t0.318261,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.546245,\n\t\t\t0.375827,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.61745,\n\t\t\t0.436719,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.685545,\n\t\t\t0.501113,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.749578,\n\t\t\t0.568799,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.80962,\n\t\t\t0.6394,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.865572,\n\t\t\t0.712699,\n\t\t\t0.10257,\n\t\t\t0.631373,\n\t\t\t0.917709,\n\t\t\t0.787569,\n\t\t\t0.233665,\n\t\t\t0.756863,\n\t\t\t0.966914,\n\t\t\t0.863138,\n\t\t\t0.369608,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.939405,\n\t\t\t0.496104,\n\t\t\t1,\n\t\t\t0.999225,\n\t\t\t1,\n\t\t\t0.612275\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_brown_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t3.3216e-7,\n\t\t\t0,\n\t\t\t0.00000483629,\n\t\t\t-0.87451,\n\t\t\t0.14693,\n\t\t\t0.0518172,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.225806,\n\t\t\t0.0814996,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.301681,\n\t\t\t0.111452,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.370487,\n\t\t\t0.150664,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.43108,\n\t\t\t0.199477,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.4849,\n\t\t\t0.255107,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.536798,\n\t\t\t0.313486,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.59286,\n\t\t\t0.371167,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.653119,\n\t\t\t0.428135,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.714589,\n\t\t\t0.485917,\n\t\t\t0.0379541,\n\t\t\t0.380392,\n\t\t\t0.774667,\n\t\t\t0.54565,\n\t\t\t0.116634,\n\t\t\t0.505882,\n\t\t\t0.831222,\n\t\t\t0.608047,\n\t\t\t0.183895,\n\t\t\t0.631373,\n\t\t\t0.880305,\n\t\t\t0.674199,\n\t\t\t0.260298,\n\t\t\t0.756863,\n\t\t\t0.922314,\n\t\t\t0.742472,\n\t\t\t0.367086,\n\t\t\t0.882353,\n\t\t\t0.959408,\n\t\t\t0.811222,\n\t\t\t0.497258,\n\t\t\t1,\n\t\t\t0.993548,\n\t\t\t0.875183,\n\t\t\t0.622093\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"copper_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0784314,\n\t\t\t0.0501961,\n\t\t\t0.0313725,\n\t\t\t-0.74902,\n\t\t\t0.156863,\n\t\t\t0.100392,\n\t\t\t0.0627451,\n\t\t\t-0.623529,\n\t\t\t0.235294,\n\t\t\t0.150588,\n\t\t\t0.0941176,\n\t\t\t-0.498039,\n\t\t\t0.313725,\n\t\t\t0.200784,\n\t\t\t0.12549,\n\t\t\t-0.372549,\n\t\t\t0.392157,\n\t\t\t0.25098,\n\t\t\t0.156863,\n\t\t\t-0.247059,\n\t\t\t0.470588,\n\t\t\t0.301176,\n\t\t\t0.188235,\n\t\t\t-0.121569,\n\t\t\t0.54902,\n\t\t\t0.351373,\n\t\t\t0.219608,\n\t\t\t0.00392157,\n\t\t\t0.627451,\n\t\t\t0.401569,\n\t\t\t0.25098,\n\t\t\t0.129412,\n\t\t\t0.705882,\n\t\t\t0.451765,\n\t\t\t0.282353,\n\t\t\t0.254902,\n\t\t\t0.784314,\n\t\t\t0.501961,\n\t\t\t0.313725,\n\t\t\t0.380392,\n\t\t\t0.862745,\n\t\t\t0.552157,\n\t\t\t0.345098,\n\t\t\t0.505882,\n\t\t\t0.941176,\n\t\t\t0.602353,\n\t\t\t0.376471,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.652549,\n\t\t\t0.407843,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.702745,\n\t\t\t0.439216,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.752941,\n\t\t\t0.470588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.5\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"pink_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.312416,\n\t\t\t0.204524,\n\t\t\t0.204524,\n\t\t\t-0.74902,\n\t\t\t0.441822,\n\t\t\t0.289241,\n\t\t\t0.289241,\n\t\t\t-0.623529,\n\t\t\t0.54112,\n\t\t\t0.354246,\n\t\t\t0.354246,\n\t\t\t-0.498039,\n\t\t\t0.624831,\n\t\t\t0.409048,\n\t\t\t0.409048,\n\t\t\t-0.372549,\n\t\t\t0.698582,\n\t\t\t0.45733,\n\t\t\t0.45733,\n\t\t\t-0.247059,\n\t\t\t0.764404,\n\t\t\t0.502282,\n\t\t\t0.500979,\n\t\t\t-0.121569,\n\t\t\t0.791292,\n\t\t\t0.591516,\n\t\t\t0.54112,\n\t\t\t0.00392157,\n\t\t\t0.817297,\n\t\t\t0.66895,\n\t\t\t0.578481,\n\t\t\t0.129412,\n\t\t\t0.842499,\n\t\t\t0.738308,\n\t\t\t0.613572,\n\t\t\t0.254902,\n\t\t\t0.866968,\n\t\t\t0.801687,\n\t\t\t0.646762,\n\t\t\t0.380392,\n\t\t\t0.890766,\n\t\t\t0.86041,\n\t\t\t0.678329,\n\t\t\t0.505882,\n\t\t\t0.913944,\n\t\t\t0.913944,\n\t\t\t0.711254,\n\t\t\t0.631373,\n\t\t\t0.936549,\n\t\t\t0.936549,\n\t\t\t0.79459,\n\t\t\t0.756863,\n\t\t\t0.958621,\n\t\t\t0.958621,\n\t\t\t0.869979,\n\t\t\t0.882353,\n\t\t\t0.980196,\n\t\t\t0.980196,\n\t\t\t0.939336,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"bone_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.054902,\n\t\t\t0.054902,\n\t\t\t0.075817,\n\t\t\t-0.74902,\n\t\t\t0.109804,\n\t\t\t0.109804,\n\t\t\t0.151634,\n\t\t\t-0.623529,\n\t\t\t0.164706,\n\t\t\t0.164706,\n\t\t\t0.227451,\n\t\t\t-0.498039,\n\t\t\t0.219608,\n\t\t\t0.219608,\n\t\t\t0.303268,\n\t\t\t-0.372549,\n\t\t\t0.27451,\n\t\t\t0.27451,\n\t\t\t0.379085,\n\t\t\t-0.247059,\n\t\t\t0.329412,\n\t\t\t0.329902,\n\t\t\t0.454412,\n\t\t\t-0.121569,\n\t\t\t0.384314,\n\t\t\t0.405719,\n\t\t\t0.509314,\n\t\t\t0.00392157,\n\t\t\t0.439216,\n\t\t\t0.481536,\n\t\t\t0.564216,\n\t\t\t0.129412,\n\t\t\t0.494118,\n\t\t\t0.557353,\n\t\t\t0.619118,\n\t\t\t0.254902,\n\t\t\t0.54902,\n\t\t\t0.63317,\n\t\t\t0.67402,\n\t\t\t0.380392,\n\t\t\t0.603922,\n\t\t\t0.708987,\n\t\t\t0.728922,\n\t\t\t0.505882,\n\t\t\t0.660294,\n\t\t\t0.783824,\n\t\t\t0.783824,\n\t\t\t0.631373,\n\t\t\t0.746569,\n\t\t\t0.838725,\n\t\t\t0.838725,\n\t\t\t0.756863,\n\t\t\t0.832843,\n\t\t\t0.893627,\n\t\t\t0.893627,\n\t\t\t0.882353,\n\t\t\t0.919118,\n\t\t\t0.948529,\n\t\t\t0.948529,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"gray_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0627451,\n\t\t\t0.0627451,\n\t\t\t0.0627451,\n\t\t\t-0.74902,\n\t\t\t0.12549,\n\t\t\t0.12549,\n\t\t\t0.12549,\n\t\t\t-0.623529,\n\t\t\t0.188235,\n\t\t\t0.188235,\n\t\t\t0.188235,\n\t\t\t-0.498039,\n\t\t\t0.25098,\n\t\t\t0.25098,\n\t\t\t0.25098,\n\t\t\t-0.372549,\n\t\t\t0.313725,\n\t\t\t0.313725,\n\t\t\t0.313725,\n\t\t\t-0.247059,\n\t\t\t0.376471,\n\t\t\t0.376471,\n\t\t\t0.376471,\n\t\t\t-0.121569,\n\t\t\t0.439216,\n\t\t\t0.439216,\n\t\t\t0.439216,\n\t\t\t0.00392157,\n\t\t\t0.501961,\n\t\t\t0.501961,\n\t\t\t0.501961,\n\t\t\t0.129412,\n\t\t\t0.564706,\n\t\t\t0.564706,\n\t\t\t0.564706,\n\t\t\t0.254902,\n\t\t\t0.627451,\n\t\t\t0.627451,\n\t\t\t0.627451,\n\t\t\t0.380392,\n\t\t\t0.690196,\n\t\t\t0.690196,\n\t\t\t0.690196,\n\t\t\t0.505882,\n\t\t\t0.752941,\n\t\t\t0.752941,\n\t\t\t0.752941,\n\t\t\t0.631373,\n\t\t\t0.815686,\n\t\t\t0.815686,\n\t\t\t0.815686,\n\t\t\t0.756863,\n\t\t\t0.878431,\n\t\t\t0.878431,\n\t\t\t0.878431,\n\t\t\t0.882353,\n\t\t\t0.941176,\n\t\t\t0.941176,\n\t\t\t0.941176,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Purples\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.247059,\n\t\t\t0,\n\t\t\t0.490196,\n\t\t\t-0.87451,\n\t\t\t0.288397,\n\t\t\t0.07677,\n\t\t\t0.525629,\n\t\t\t-0.74902,\n\t\t\t0.32975,\n\t\t\t0.153587,\n\t\t\t0.561092,\n\t\t\t-0.623529,\n\t\t\t0.373057,\n\t\t\t0.236263,\n\t\t\t0.600461,\n\t\t\t-0.498039,\n\t\t\t0.416363,\n\t\t\t0.319,\n\t\t\t0.639923,\n\t\t\t-0.372549,\n\t\t\t0.459669,\n\t\t\t0.405613,\n\t\t\t0.685198,\n\t\t\t-0.247059,\n\t\t\t0.503345,\n\t\t\t0.491534,\n\t\t\t0.730058,\n\t\t\t-0.121569,\n\t\t\t0.562399,\n\t\t\t0.54862,\n\t\t\t0.757616,\n\t\t\t0.00392157,\n\t\t\t0.621453,\n\t\t\t0.606075,\n\t\t\t0.785544,\n\t\t\t0.129412,\n\t\t\t0.680508,\n\t\t\t0.674971,\n\t\t\t0.824914,\n\t\t\t0.254902,\n\t\t\t0.739562,\n\t\t\t0.743406,\n\t\t\t0.863899,\n\t\t\t0.380392,\n\t\t\t0.798616,\n\t\t\t0.800492,\n\t\t\t0.893426,\n\t\t\t0.505882,\n\t\t\t0.85684,\n\t\t\t0.856655,\n\t\t\t0.922491,\n\t\t\t0.631373,\n\t\t\t0.898178,\n\t\t\t0.894056,\n\t\t\t0.942176,\n\t\t\t0.756863,\n\t\t\t0.938654,\n\t\t\t0.930919,\n\t\t\t0.961646,\n\t\t\t0.882353,\n\t\t\t0.964245,\n\t\t\t0.958478,\n\t\t\t0.977393,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.984314,\n\t\t\t0.992157\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Blues\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.031373,\n\t\t\t0.188235,\n\t\t\t0.419608,\n\t\t\t-0.87451,\n\t\t\t0.031373,\n\t\t\t0.253195,\n\t\t\t0.516063,\n\t\t\t-0.74902,\n\t\t\t0.031757,\n\t\t\t0.318139,\n\t\t\t0.612149,\n\t\t\t-0.623529,\n\t\t\t0.080969,\n\t\t\t0.38113,\n\t\t\t0.661361,\n\t\t\t-0.498039,\n\t\t\t0.130427,\n\t\t\t0.444152,\n\t\t\t0.710327,\n\t\t\t-0.372549,\n\t\t\t0.195386,\n\t\t\t0.509112,\n\t\t\t0.743791,\n\t\t\t-0.247059,\n\t\t\t0.260715,\n\t\t\t0.573841,\n\t\t\t0.777209,\n\t\t\t-0.121569,\n\t\t\t0.341423,\n\t\t\t0.628958,\n\t\t\t0.808704,\n\t\t\t0.00392157,\n\t\t\t0.422745,\n\t\t\t0.684075,\n\t\t\t0.839892,\n\t\t\t0.129412,\n\t\t\t0.523137,\n\t\t\t0.739193,\n\t\t\t0.861546,\n\t\t\t0.254902,\n\t\t\t0.622684,\n\t\t\t0.793464,\n\t\t\t0.883429,\n\t\t\t0.380392,\n\t\t\t0.701423,\n\t\t\t0.826928,\n\t\t\t0.910988,\n\t\t\t0.505882,\n\t\t\t0.778685,\n\t\t\t0.8603,\n\t\t\t0.937993,\n\t\t\t0.631373,\n\t\t\t0.825928,\n\t\t\t0.891795,\n\t\t\t0.953741,\n\t\t\t0.756863,\n\t\t\t0.87328,\n\t\t\t0.923291,\n\t\t\t0.969489,\n\t\t\t0.882353,\n\t\t\t0.922491,\n\t\t\t0.954787,\n\t\t\t0.985236,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.984314,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Greens\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.347374,\n\t\t\t0.139346,\n\t\t\t-0.74902,\n\t\t\t0.000538,\n\t\t\t0.427912,\n\t\t\t0.172933,\n\t\t\t-0.623529,\n\t\t\t0.069435,\n\t\t\t0.486967,\n\t\t\t0.222145,\n\t\t\t-0.498039,\n\t\t\t0.138178,\n\t\t\t0.546082,\n\t\t\t0.271326,\n\t\t\t-0.372549,\n\t\t\t0.197232,\n\t\t\t0.609073,\n\t\t\t0.31857,\n\t\t\t-0.247059,\n\t\t\t0.257255,\n\t\t\t0.671742,\n\t\t\t0.365859,\n\t\t\t-0.121569,\n\t\t\t0.357647,\n\t\t\t0.720953,\n\t\t\t0.415071,\n\t\t\t0.00392157,\n\t\t\t0.45767,\n\t\t\t0.769919,\n\t\t\t0.465021,\n\t\t\t0.129412,\n\t\t\t0.546251,\n\t\t\t0.811257,\n\t\t\t0.537855,\n\t\t\t0.254902,\n\t\t\t0.634295,\n\t\t\t0.852211,\n\t\t\t0.610688,\n\t\t\t0.380392,\n\t\t\t0.709097,\n\t\t\t0.883706,\n\t\t\t0.683522,\n\t\t\t0.505882,\n\t\t\t0.78316,\n\t\t\t0.914833,\n\t\t\t0.755894,\n\t\t\t0.631373,\n\t\t\t0.842215,\n\t\t\t0.938454,\n\t\t\t0.818885,\n\t\t\t0.756863,\n\t\t\t0.899977,\n\t\t\t0.961538,\n\t\t\t0.880692,\n\t\t\t0.882353,\n\t\t\t0.935409,\n\t\t\t0.975317,\n\t\t\t0.92203,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.960784\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PuBu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.301961,\n\t\t\t0,\n\t\t\t0.294118,\n\t\t\t-0.87451,\n\t\t\t0.404321,\n\t\t\t0.029527,\n\t\t\t0.390573,\n\t\t\t-0.74902,\n\t\t\t0.50599,\n\t\t\t0.059592,\n\t\t\t0.486782,\n\t\t\t-0.623529,\n\t\t\t0.519769,\n\t\t\t0.158016,\n\t\t\t0.551742,\n\t\t\t-0.498039,\n\t\t\t0.533456,\n\t\t\t0.256194,\n\t\t\t0.616301,\n\t\t\t-0.372549,\n\t\t\t0.54133,\n\t\t\t0.33887,\n\t\t\t0.655671,\n\t\t\t-0.247059,\n\t\t\t0.54902,\n\t\t\t0.421592,\n\t\t\t0.695087,\n\t\t\t-0.121569,\n\t\t\t0.54902,\n\t\t\t0.506236,\n\t\t\t0.736424,\n\t\t\t0.00392157,\n\t\t\t0.550127,\n\t\t\t0.590573,\n\t\t\t0.777701,\n\t\t\t0.129412,\n\t\t\t0.585559,\n\t\t\t0.665375,\n\t\t\t0.81707,\n\t\t\t0.254902,\n\t\t\t0.622145,\n\t\t\t0.739023,\n\t\t\t0.855825,\n\t\t\t0.380392,\n\t\t\t0.687105,\n\t\t\t0.784298,\n\t\t\t0.879446,\n\t\t\t0.505882,\n\t\t\t0.752065,\n\t\t\t0.829758,\n\t\t\t0.903253,\n\t\t\t0.631373,\n\t\t\t0.817024,\n\t\t\t0.87897,\n\t\t\t0.930811,\n\t\t\t0.756863,\n\t\t\t0.880907,\n\t\t\t0.927213,\n\t\t\t0.957832,\n\t\t\t0.882353,\n\t\t\t0.926182,\n\t\t\t0.958708,\n\t\t\t0.975548,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.992157\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.007843,\n\t\t\t0.219608,\n\t\t\t0.345098,\n\t\t\t-0.87451,\n\t\t\t0.01178,\n\t\t\t0.286536,\n\t\t\t0.449427,\n\t\t\t-0.74902,\n\t\t\t0.015702,\n\t\t\t0.35328,\n\t\t\t0.553479,\n\t\t\t-0.623529,\n\t\t\t0.01767,\n\t\t\t0.396586,\n\t\t\t0.622376,\n\t\t\t-0.498039,\n\t\t\t0.021115,\n\t\t\t0.4402,\n\t\t\t0.690688,\n\t\t\t-0.372549,\n\t\t\t0.11757,\n\t\t\t0.503191,\n\t\t\t0.722184,\n\t\t\t-0.247059,\n\t\t\t0.214625,\n\t\t\t0.565859,\n\t\t\t0.753633,\n\t\t\t-0.121569,\n\t\t\t0.336671,\n\t\t\t0.615071,\n\t\t\t0.78316,\n\t\t\t0.00392157,\n\t\t\t0.457978,\n\t\t\t0.663975,\n\t\t\t0.812503,\n\t\t\t0.129412,\n\t\t\t0.556401,\n\t\t\t0.703345,\n\t\t\t0.836125,\n\t\t\t0.254902,\n\t\t\t0.65421,\n\t\t\t0.742714,\n\t\t\t0.859669,\n\t\t\t0.380392,\n\t\t\t0.736886,\n\t\t\t0.782084,\n\t\t\t0.881323,\n\t\t\t0.505882,\n\t\t\t0.81827,\n\t\t\t0.821638,\n\t\t\t0.903068,\n\t\t\t0.631373,\n\t\t\t0.873387,\n\t\t\t0.864944,\n\t\t\t0.92669,\n\t\t\t0.756863,\n\t\t\t0.927536,\n\t\t\t0.907605,\n\t\t\t0.949988,\n\t\t\t0.882353,\n\t\t\t0.964937,\n\t\t\t0.9391,\n\t\t\t0.967705,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.984314\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuGn\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.031373,\n\t\t\t0.25098,\n\t\t\t0.505882,\n\t\t\t-0.87451,\n\t\t\t0.031373,\n\t\t\t0.329719,\n\t\t\t0.590527,\n\t\t\t-0.74902,\n\t\t\t0.031911,\n\t\t\t0.408397,\n\t\t\t0.674787,\n\t\t\t-0.623529,\n\t\t\t0.100807,\n\t\t\t0.479262,\n\t\t\t0.710219,\n\t\t\t-0.498039,\n\t\t\t0.169704,\n\t\t\t0.550219,\n\t\t\t0.745744,\n\t\t\t-0.372549,\n\t\t\t0.238601,\n\t\t\t0.62699,\n\t\t\t0.787082,\n\t\t\t-0.247059,\n\t\t\t0.307958,\n\t\t\t0.703114,\n\t\t\t0.826759,\n\t\t\t-0.121569,\n\t\t\t0.39654,\n\t\t\t0.752326,\n\t\t\t0.797232,\n\t\t\t0.00392157,\n\t\t\t0.485121,\n\t\t\t0.801046,\n\t\t\t0.767705,\n\t\t\t0.129412,\n\t\t\t0.573702,\n\t\t\t0.83451,\n\t\t\t0.738178,\n\t\t\t0.254902,\n\t\t\t0.661592,\n\t\t\t0.867743,\n\t\t\t0.711034,\n\t\t\t0.380392,\n\t\t\t0.732457,\n\t\t\t0.895302,\n\t\t\t0.74253,\n\t\t\t0.505882,\n\t\t\t0.801845,\n\t\t\t0.922307,\n\t\t\t0.774579,\n\t\t\t0.631373,\n\t\t\t0.841215,\n\t\t\t0.938055,\n\t\t\t0.817885,\n\t\t\t0.756863,\n\t\t\t0.880907,\n\t\t\t0.95391,\n\t\t\t0.861084,\n\t\t\t0.882353,\n\t\t\t0.926182,\n\t\t\t0.971626,\n\t\t\t0.902422,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.941176\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnBu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.347374,\n\t\t\t0.139346,\n\t\t\t-0.74902,\n\t\t\t0.000538,\n\t\t\t0.427912,\n\t\t\t0.172933,\n\t\t\t-0.623529,\n\t\t\t0.069435,\n\t\t\t0.486967,\n\t\t\t0.222145,\n\t\t\t-0.498039,\n\t\t\t0.138178,\n\t\t\t0.546175,\n\t\t\t0.272095,\n\t\t\t-0.372549,\n\t\t\t0.197232,\n\t\t\t0.615071,\n\t\t\t0.368551,\n\t\t\t-0.247059,\n\t\t\t0.256609,\n\t\t\t0.683276,\n\t\t\t0.464867,\n\t\t\t-0.121569,\n\t\t\t0.329443,\n\t\t\t0.722645,\n\t\t\t0.555417,\n\t\t\t0.00392157,\n\t\t\t0.403137,\n\t\t\t0.762138,\n\t\t\t0.645413,\n\t\t\t0.129412,\n\t\t\t0.503529,\n\t\t\t0.805444,\n\t\t\t0.718247,\n\t\t\t0.254902,\n\t\t\t0.603922,\n\t\t\t0.848597,\n\t\t\t0.790465,\n\t\t\t0.380392,\n\t\t\t0.704314,\n\t\t\t0.887966,\n\t\t\t0.847551,\n\t\t\t0.505882,\n\t\t\t0.802307,\n\t\t\t0.926321,\n\t\t\t0.903714,\n\t\t\t0.631373,\n\t\t\t0.851519,\n\t\t\t0.944037,\n\t\t\t0.941115,\n\t\t\t0.756863,\n\t\t\t0.899977,\n\t\t\t0.961538,\n\t\t\t0.976901,\n\t\t\t0.882353,\n\t\t\t0.935409,\n\t\t\t0.975317,\n\t\t\t0.984775,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.992157\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnBuPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.003922,\n\t\t\t0.27451,\n\t\t\t0.211765,\n\t\t\t-0.87451,\n\t\t\t0.003922,\n\t\t\t0.349312,\n\t\t\t0.280661,\n\t\t\t-0.74902,\n\t\t\t0.003937,\n\t\t\t0.423852,\n\t\t\t0.349773,\n\t\t\t-0.623529,\n\t\t\t0.005905,\n\t\t\t0.46519,\n\t\t\t0.446228,\n\t\t\t-0.498039,\n\t\t\t0.009443,\n\t\t\t0.506344,\n\t\t\t0.542837,\n\t\t\t-0.372549,\n\t\t\t0.111803,\n\t\t\t0.535871,\n\t\t\t0.649135,\n\t\t\t-0.247059,\n\t\t\t0.214025,\n\t\t\t0.565859,\n\t\t\t0.753633,\n\t\t\t-0.121569,\n\t\t\t0.310481,\n\t\t\t0.615071,\n\t\t\t0.78316,\n\t\t\t0.00392157,\n\t\t\t0.407797,\n\t\t\t0.663975,\n\t\t\t0.812503,\n\t\t\t0.129412,\n\t\t\t0.531811,\n\t\t\t0.703345,\n\t\t\t0.836125,\n\t\t\t0.254902,\n\t\t\t0.65421,\n\t\t\t0.742714,\n\t\t\t0.859669,\n\t\t\t0.380392,\n\t\t\t0.736886,\n\t\t\t0.782084,\n\t\t\t0.881323,\n\t\t\t0.505882,\n\t\t\t0.81827,\n\t\t\t0.821176,\n\t\t\t0.902884,\n\t\t\t0.631373,\n\t\t\t0.873387,\n\t\t\t0.854641,\n\t\t\t0.922568,\n\t\t\t0.756863,\n\t\t\t0.927536,\n\t\t\t0.888535,\n\t\t\t0.942361,\n\t\t\t0.882353,\n\t\t\t0.964937,\n\t\t\t0.929873,\n\t\t\t0.964014,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.984314\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuGnYl\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.031373,\n\t\t\t0.113725,\n\t\t\t0.345098,\n\t\t\t-0.87451,\n\t\t\t0.088458,\n\t\t\t0.159,\n\t\t\t0.463206,\n\t\t\t-0.74902,\n\t\t\t0.145052,\n\t\t\t0.204567,\n\t\t\t0.5807,\n\t\t\t-0.623529,\n\t\t\t0.139146,\n\t\t\t0.287243,\n\t\t\t0.620069,\n\t\t\t-0.498039,\n\t\t\t0.13318,\n\t\t\t0.370196,\n\t\t\t0.659562,\n\t\t\t-0.372549,\n\t\t\t0.123337,\n\t\t\t0.470588,\n\t\t\t0.706805,\n\t\t\t-0.247059,\n\t\t\t0.115386,\n\t\t\t0.570335,\n\t\t\t0.753126,\n\t\t\t-0.121569,\n\t\t\t0.186251,\n\t\t\t0.643168,\n\t\t\t0.761,\n\t\t\t0.00392157,\n\t\t\t0.258716,\n\t\t\t0.71514,\n\t\t\t0.768074,\n\t\t\t0.129412,\n\t\t\t0.380761,\n\t\t\t0.760415,\n\t\t\t0.750358,\n\t\t\t0.254902,\n\t\t\t0.503576,\n\t\t\t0.806075,\n\t\t\t0.732795,\n\t\t\t0.380392,\n\t\t\t0.645306,\n\t\t\t0.861192,\n\t\t\t0.719016,\n\t\t\t0.505882,\n\t\t\t0.783899,\n\t\t\t0.91511,\n\t\t\t0.705606,\n\t\t\t0.631373,\n\t\t\t0.858701,\n\t\t\t0.944637,\n\t\t\t0.6997,\n\t\t\t0.756863,\n\t\t\t0.931349,\n\t\t\t0.973303,\n\t\t\t0.698424,\n\t\t\t0.882353,\n\t\t\t0.966782,\n\t\t\t0.987082,\n\t\t\t0.777163,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.85098\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PuRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.286275,\n\t\t\t0,\n\t\t\t0.415686,\n\t\t\t-0.87451,\n\t\t\t0.38273,\n\t\t\t0.001968,\n\t\t\t0.441276,\n\t\t\t-0.74902,\n\t\t\t0.479231,\n\t\t\t0.003922,\n\t\t\t0.466774,\n\t\t\t-0.623529,\n\t\t\t0.581592,\n\t\t\t0.003922,\n\t\t\t0.480554,\n\t\t\t-0.498039,\n\t\t\t0.683799,\n\t\t\t0.00549,\n\t\t\t0.494887,\n\t\t\t-0.372549,\n\t\t\t0.776317,\n\t\t\t0.105882,\n\t\t\t0.544098,\n\t\t\t-0.247059,\n\t\t\t0.867866,\n\t\t\t0.206321,\n\t\t\t0.592618,\n\t\t\t-0.121569,\n\t\t\t0.919047,\n\t\t\t0.308681,\n\t\t\t0.612303,\n\t\t\t0.00392157,\n\t\t\t0.968812,\n\t\t\t0.411226,\n\t\t\t0.632603,\n\t\t\t0.129412,\n\t\t\t0.974717,\n\t\t\t0.519493,\n\t\t\t0.671972,\n\t\t\t0.254902,\n\t\t\t0.980546,\n\t\t\t0.626451,\n\t\t\t0.71065,\n\t\t\t0.380392,\n\t\t\t0.984483,\n\t\t\t0.701253,\n\t\t\t0.732303,\n\t\t\t0.505882,\n\t\t\t0.988328,\n\t\t\t0.77504,\n\t\t\t0.755617,\n\t\t\t0.631373,\n\t\t\t0.990296,\n\t\t\t0.828189,\n\t\t\t0.812703,\n\t\t\t0.756863,\n\t\t\t0.992372,\n\t\t\t0.880907,\n\t\t\t0.869035,\n\t\t\t0.882353,\n\t\t\t0.996309,\n\t\t\t0.926182,\n\t\t\t0.912341,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.952941\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RdPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.121569,\n\t\t\t-0.87451,\n\t\t\t0.500377,\n\t\t\t0,\n\t\t\t0.192434,\n\t\t\t-0.74902,\n\t\t\t0.596909,\n\t\t\t0.000277,\n\t\t\t0.263037,\n\t\t\t-0.623529,\n\t\t\t0.703206,\n\t\t\t0.035709,\n\t\t\t0.300438,\n\t\t\t-0.498039,\n\t\t\t0.808612,\n\t\t\t0.071296,\n\t\t\t0.338854,\n\t\t\t-0.372549,\n\t\t\t0.857824,\n\t\t\t0.116571,\n\t\t\t0.441215,\n\t\t\t-0.247059,\n\t\t\t0.905513,\n\t\t\t0.163552,\n\t\t\t0.54293,\n\t\t\t-0.121569,\n\t\t\t0.889765,\n\t\t\t0.281661,\n\t\t\t0.617732,\n\t\t\t0.00392157,\n\t\t\t0.873156,\n\t\t\t0.39897,\n\t\t\t0.691611,\n\t\t\t0.129412,\n\t\t\t0.82985,\n\t\t\t0.491488,\n\t\t\t0.736886,\n\t\t\t0.254902,\n\t\t\t0.789081,\n\t\t\t0.583237,\n\t\t\t0.781853,\n\t\t\t0.380392,\n\t\t\t0.810734,\n\t\t\t0.656071,\n\t\t\t0.819254,\n\t\t\t0.505882,\n\t\t\t0.833126,\n\t\t\t0.729181,\n\t\t\t0.85684,\n\t\t\t0.631373,\n\t\t\t0.870527,\n\t\t\t0.80792,\n\t\t\t0.898178,\n\t\t\t0.756863,\n\t\t\t0.907605,\n\t\t\t0.884398,\n\t\t\t0.938331,\n\t\t\t0.882353,\n\t\t\t0.9391,\n\t\t\t0.921799,\n\t\t\t0.958016,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.956863,\n\t\t\t0.976471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Oranges\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.498039,\n\t\t\t0.152941,\n\t\t\t0.015686,\n\t\t\t-0.87451,\n\t\t\t0.57481,\n\t\t\t0.182468,\n\t\t\t0.013718,\n\t\t\t-0.74902,\n\t\t\t0.651765,\n\t\t\t0.212042,\n\t\t\t0.011734,\n\t\t\t-0.623529,\n\t\t\t0.752157,\n\t\t\t0.247474,\n\t\t\t0.007797,\n\t\t\t-0.498039,\n\t\t\t0.851719,\n\t\t\t0.283368,\n\t\t\t0.004475,\n\t\t\t-0.372549,\n\t\t\t0.898962,\n\t\t\t0.348328,\n\t\t\t0.039908,\n\t\t\t-0.247059,\n\t\t\t0.945652,\n\t\t\t0.413426,\n\t\t\t0.076401,\n\t\t\t-0.121569,\n\t\t\t0.969273,\n\t\t\t0.484291,\n\t\t\t0.157109,\n\t\t\t0.00392157,\n\t\t\t0.992157,\n\t\t\t0.554971,\n\t\t\t0.238185,\n\t\t\t0.129412,\n\t\t\t0.992157,\n\t\t\t0.619931,\n\t\t\t0.330704,\n\t\t\t0.254902,\n\t\t\t0.992157,\n\t\t\t0.684967,\n\t\t\t0.423837,\n\t\t\t0.380392,\n\t\t\t0.992157,\n\t\t\t0.751895,\n\t\t\t0.532103,\n\t\t\t0.505882,\n\t\t\t0.992249,\n\t\t\t0.817716,\n\t\t\t0.639354,\n\t\t\t0.631373,\n\t\t\t0.994218,\n\t\t\t0.861023,\n\t\t\t0.725967,\n\t\t\t0.756863,\n\t\t\t0.996186,\n\t\t\t0.903576,\n\t\t\t0.810965,\n\t\t\t0.882353,\n\t\t\t0.998155,\n\t\t\t0.933103,\n\t\t\t0.868051,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.960784,\n\t\t\t0.921569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Reds\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.05098,\n\t\t\t-0.87451,\n\t\t\t0.525967,\n\t\t\t0.029527,\n\t\t\t0.066728,\n\t\t\t-0.74902,\n\t\t\t0.647643,\n\t\t\t0.058962,\n\t\t\t0.082476,\n\t\t\t-0.623529,\n\t\t\t0.722445,\n\t\t\t0.076678,\n\t\t\t0.098224,\n\t\t\t-0.498039,\n\t\t\t0.797186,\n\t\t\t0.095194,\n\t\t\t0.114187,\n\t\t\t-0.372549,\n\t\t\t0.868051,\n\t\t\t0.164091,\n\t\t\t0.143714,\n\t\t\t-0.247059,\n\t\t\t0.937809,\n\t\t\t0.233541,\n\t\t\t0.173933,\n\t\t\t-0.121569,\n\t\t\t0.96143,\n\t\t\t0.326059,\n\t\t\t0.232987,\n\t\t\t0.00392157,\n\t\t\t0.984375,\n\t\t\t0.418147,\n\t\t\t0.292657,\n\t\t\t0.129412,\n\t\t\t0.986344,\n\t\t\t0.496886,\n\t\t\t0.371396,\n\t\t\t0.254902,\n\t\t\t0.988235,\n\t\t\t0.575702,\n\t\t\t0.450673,\n\t\t\t0.380392,\n\t\t\t0.988235,\n\t\t\t0.656409,\n\t\t\t0.543191,\n\t\t\t0.505882,\n\t\t\t0.98842,\n\t\t\t0.736747,\n\t\t\t0.635894,\n\t\t\t0.631373,\n\t\t\t0.992357,\n\t\t\t0.809581,\n\t\t\t0.732349,\n\t\t\t0.756863,\n\t\t\t0.996186,\n\t\t\t0.880692,\n\t\t\t0.826759,\n\t\t\t0.882353,\n\t\t\t0.998155,\n\t\t\t0.92203,\n\t\t\t0.885813,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.960784,\n\t\t\t0.941176\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RdOr\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.498039,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.6004,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.702514,\n\t\t\t0.000738,\n\t\t\t0.000477,\n\t\t\t-0.623529,\n\t\t\t0.773379,\n\t\t\t0.095225,\n\t\t\t0.061499,\n\t\t\t-0.498039,\n\t\t\t0.843875,\n\t\t\t0.189865,\n\t\t\t0.12283,\n\t\t\t-0.372549,\n\t\t\t0.891119,\n\t\t\t0.294195,\n\t\t\t0.203537,\n\t\t\t-0.247059,\n\t\t\t0.937855,\n\t\t\t0.397924,\n\t\t\t0.283137,\n\t\t\t-0.121569,\n\t\t\t0.963445,\n\t\t\t0.476663,\n\t\t\t0.316601,\n\t\t\t0.00392157,\n\t\t\t0.988297,\n\t\t\t0.555771,\n\t\t\t0.351665,\n\t\t\t0.129412,\n\t\t\t0.990265,\n\t\t\t0.646321,\n\t\t\t0.436309,\n\t\t\t0.254902,\n\t\t\t0.992157,\n\t\t\t0.735256,\n\t\t\t0.519646,\n\t\t\t0.380392,\n\t\t\t0.992157,\n\t\t\t0.784468,\n\t\t\t0.570827,\n\t\t\t0.505882,\n\t\t\t0.992249,\n\t\t\t0.833218,\n\t\t\t0.623483,\n\t\t\t0.631373,\n\t\t\t0.994218,\n\t\t\t0.872587,\n\t\t\t0.706159,\n\t\t\t0.756863,\n\t\t\t0.996186,\n\t\t\t0.911419,\n\t\t\t0.788189,\n\t\t\t0.882353,\n\t\t\t0.998155,\n\t\t\t0.940946,\n\t\t\t0.859054,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.92549\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BrOrYl\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.4,\n\t\t\t0.145098,\n\t\t\t0.023529,\n\t\t\t-0.87451,\n\t\t\t0.500392,\n\t\t\t0.174625,\n\t\t\t0.019592,\n\t\t\t-0.74902,\n\t\t\t0.600784,\n\t\t\t0.204291,\n\t\t\t0.015656,\n\t\t\t-0.623529,\n\t\t\t0.701176,\n\t\t\t0.251534,\n\t\t\t0.011719,\n\t\t\t-0.498039,\n\t\t\t0.800984,\n\t\t\t0.299146,\n\t\t\t0.008397,\n\t\t\t-0.372549,\n\t\t\t0.863975,\n\t\t\t0.370012,\n\t\t\t0.043829,\n\t\t\t-0.247059,\n\t\t\t0.926321,\n\t\t\t0.441107,\n\t\t\t0.0794,\n\t\t\t-0.121569,\n\t\t\t0.961753,\n\t\t\t0.521815,\n\t\t\t0.120738,\n\t\t\t0.00392157,\n\t\t\t0.996078,\n\t\t\t0.602645,\n\t\t\t0.163122,\n\t\t\t0.129412,\n\t\t\t0.996078,\n\t\t\t0.68729,\n\t\t\t0.237924,\n\t\t\t0.254902,\n\t\t\t0.996078,\n\t\t\t0.771011,\n\t\t\t0.314879,\n\t\t\t0.380392,\n\t\t\t0.996078,\n\t\t\t0.832034,\n\t\t\t0.444798,\n\t\t\t0.505882,\n\t\t\t0.996171,\n\t\t\t0.892042,\n\t\t\t0.572595,\n\t\t\t0.631373,\n\t\t\t0.998139,\n\t\t\t0.931411,\n\t\t\t0.65724,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.969489,\n\t\t\t0.741669,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.985236,\n\t\t\t0.822376,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.898039\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RdOrYl\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.501961,\n\t\t\t0,\n\t\t\t0.14902,\n\t\t\t-0.87451,\n\t\t\t0.622038,\n\t\t\t0,\n\t\t\t0.14902,\n\t\t\t-0.74902,\n\t\t\t0.741761,\n\t\t\t0.0004,\n\t\t\t0.148866,\n\t\t\t-0.623529,\n\t\t\t0.816563,\n\t\t\t0.05158,\n\t\t\t0.129181,\n\t\t\t-0.498039,\n\t\t\t0.890965,\n\t\t\t0.10356,\n\t\t\t0.110235,\n\t\t\t-0.372549,\n\t\t\t0.940177,\n\t\t\t0.205921,\n\t\t\t0.137793,\n\t\t\t-0.247059,\n\t\t\t0.988281,\n\t\t\t0.308789,\n\t\t\t0.165536,\n\t\t\t-0.121569,\n\t\t\t0.99025,\n\t\t\t0.432803,\n\t\t\t0.200969,\n\t\t\t0.00392157,\n\t\t\t0.992218,\n\t\t\t0.555217,\n\t\t\t0.236278,\n\t\t\t0.129412,\n\t\t\t0.994187,\n\t\t\t0.628051,\n\t\t\t0.267774,\n\t\t\t0.254902,\n\t\t\t0.996078,\n\t\t\t0.701038,\n\t\t\t0.301269,\n\t\t\t0.380392,\n\t\t\t0.996078,\n\t\t\t0.777809,\n\t\t\t0.383945,\n\t\t\t0.505882,\n\t\t\t0.996171,\n\t\t\t0.852826,\n\t\t\t0.466621,\n\t\t\t0.631373,\n\t\t\t0.998139,\n\t\t\t0.892195,\n\t\t\t0.549296,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.931349,\n\t\t\t0.632188,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.966782,\n\t\t\t0.7188,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"CIELab_blue2red\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.6,\n\t\t\t0.74902,\n\t\t\t1,\n\t\t\t0.76863,\n\t\t\t0.46667,\n\t\t\t0.34118\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"blue2yellow\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2gold\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.175119,\n\t\t\t0.0438468,\n\t\t\t1,\n\t\t\t-0.874016,\n\t\t\t0.22383,\n\t\t\t0.159771,\n\t\t\t0.94557,\n\t\t\t-0.748031,\n\t\t\t0.27254,\n\t\t\t0.233611,\n\t\t\t0.891216,\n\t\t\t-0.622047,\n\t\t\t0.321251,\n\t\t\t0.296526,\n\t\t\t0.836857,\n\t\t\t-0.496063,\n\t\t\t0.369962,\n\t\t\t0.354296,\n\t\t\t0.782359,\n\t\t\t-0.370079,\n\t\t\t0.418672,\n\t\t\t0.409139,\n\t\t\t0.72754,\n\t\t\t-0.244094,\n\t\t\t0.467383,\n\t\t\t0.462152,\n\t\t\t0.672148,\n\t\t\t-0.11811,\n\t\t\t0.51609,\n\t\t\t0.51396,\n\t\t\t0.615825,\n\t\t\t0.00787402,\n\t\t\t0.572863,\n\t\t\t0.55452,\n\t\t\t0.559172,\n\t\t\t0.133858,\n\t\t\t0.630269,\n\t\t\t0.593822,\n\t\t\t0.517729,\n\t\t\t0.259843,\n\t\t\t0.689588,\n\t\t\t0.624668,\n\t\t\t0.47446,\n\t\t\t0.385827,\n\t\t\t0.745394,\n\t\t\t0.656113,\n\t\t\t0.428638,\n\t\t\t0.511811,\n\t\t\t0.798624,\n\t\t\t0.688104,\n\t\t\t0.379105,\n\t\t\t0.637795,\n\t\t\t0.849926,\n\t\t\t0.720593,\n\t\t\t0.323834,\n\t\t\t0.76378,\n\t\t\t0.899765,\n\t\t\t0.753543,\n\t\t\t0.258657,\n\t\t\t0.889764,\n\t\t\t0.948487,\n\t\t\t0.78692,\n\t\t\t0.171778,\n\t\t\t1,\n\t\t\t0.990413,\n\t\t\t0.816451,\n\t\t\t0.00729848\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2yellow\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.0830122,\n\t\t\t0,\n\t\t\t0.495617,\n\t\t\t-0.87451,\n\t\t\t0.141973,\n\t\t\t0.0551288,\n\t\t\t0.57363,\n\t\t\t-0.74902,\n\t\t\t0.193048,\n\t\t\t0.110258,\n\t\t\t0.604561,\n\t\t\t-0.623529,\n\t\t\t0.234231,\n\t\t\t0.165386,\n\t\t\t0.57643,\n\t\t\t-0.498039,\n\t\t\t0.275413,\n\t\t\t0.220515,\n\t\t\t0.548299,\n\t\t\t-0.372549,\n\t\t\t0.316596,\n\t\t\t0.275644,\n\t\t\t0.520169,\n\t\t\t-0.247059,\n\t\t\t0.357778,\n\t\t\t0.330773,\n\t\t\t0.492038,\n\t\t\t-0.121569,\n\t\t\t0.398961,\n\t\t\t0.385901,\n\t\t\t0.463908,\n\t\t\t0.00392157,\n\t\t\t0.449929,\n\t\t\t0.438487,\n\t\t\t0.426815,\n\t\t\t0.129412,\n\t\t\t0.511572,\n\t\t\t0.488299,\n\t\t\t0.379944,\n\t\t\t0.254902,\n\t\t\t0.581222,\n\t\t\t0.53603,\n\t\t\t0.325741,\n\t\t\t0.380392,\n\t\t\t0.650871,\n\t\t\t0.583761,\n\t\t\t0.271538,\n\t\t\t0.505882,\n\t\t\t0.720521,\n\t\t\t0.631493,\n\t\t\t0.217335,\n\t\t\t0.631373,\n\t\t\t0.79017,\n\t\t\t0.679224,\n\t\t\t0.163132,\n\t\t\t0.756863,\n\t\t\t0.85982,\n\t\t\t0.726955,\n\t\t\t0.108929,\n\t\t\t0.882353,\n\t\t\t0.910254,\n\t\t\t0.774159,\n\t\t\t0.14112,\n\t\t\t1,\n\t\t\t0.927513,\n\t\t\t0.81759,\n\t\t\t0.306289\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_cyan2orange\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.0471513,\n\t\t\t0.213874,\n\t\t\t0.414329,\n\t\t\t-0.87451,\n\t\t\t0.0674702,\n\t\t\t0.256648,\n\t\t\t0.439027,\n\t\t\t-0.74902,\n\t\t\t0.0959957,\n\t\t\t0.299331,\n\t\t\t0.462089,\n\t\t\t-0.623529,\n\t\t\t0.132428,\n\t\t\t0.341872,\n\t\t\t0.483212,\n\t\t\t-0.498039,\n\t\t\t0.188743,\n\t\t\t0.38277,\n\t\t\t0.500597,\n\t\t\t-0.372549,\n\t\t\t0.268511,\n\t\t\t0.420229,\n\t\t\t0.512179,\n\t\t\t-0.247059,\n\t\t\t0.352945,\n\t\t\t0.455602,\n\t\t\t0.519101,\n\t\t\t-0.121569,\n\t\t\t0.43893,\n\t\t\t0.489368,\n\t\t\t0.521538,\n\t\t\t0.00392157,\n\t\t\t0.522445,\n\t\t\t0.522495,\n\t\t\t0.522436,\n\t\t\t0.129412,\n\t\t\t0.600089,\n\t\t\t0.555682,\n\t\t\t0.53205,\n\t\t\t0.254902,\n\t\t\t0.67988,\n\t\t\t0.587981,\n\t\t\t0.539163,\n\t\t\t0.380392,\n\t\t\t0.761011,\n\t\t\t0.619586,\n\t\t\t0.544439,\n\t\t\t0.505882,\n\t\t\t0.84278,\n\t\t\t0.650741,\n\t\t\t0.548567,\n\t\t\t0.631373,\n\t\t\t0.910713,\n\t\t\t0.687347,\n\t\t\t0.557822,\n\t\t\t0.756863,\n\t\t\t0.952232,\n\t\t\t0.734972,\n\t\t\t0.577775,\n\t\t\t0.882353,\n\t\t\t0.975642,\n\t\t\t0.789858,\n\t\t\t0.604868,\n\t\t\t1,\n\t\t\t0.990752,\n\t\t\t0.843643,\n\t\t\t0.632857\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple2green\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.235006,\n\t\t\t0.0483128,\n\t\t\t0.530899,\n\t\t\t-0.87451,\n\t\t\t0.302968,\n\t\t\t0.108419,\n\t\t\t0.552391,\n\t\t\t-0.74902,\n\t\t\t0.360241,\n\t\t\t0.166059,\n\t\t\t0.569502,\n\t\t\t-0.623529,\n\t\t\t0.406746,\n\t\t\t0.226782,\n\t\t\t0.579373,\n\t\t\t-0.498039,\n\t\t\t0.444073,\n\t\t\t0.28964,\n\t\t\t0.582094,\n\t\t\t-0.372549,\n\t\t\t0.473648,\n\t\t\t0.353774,\n\t\t\t0.577947,\n\t\t\t-0.247059,\n\t\t\t0.497636,\n\t\t\t0.418154,\n\t\t\t0.567911,\n\t\t\t-0.121569,\n\t\t\t0.519086,\n\t\t\t0.481741,\n\t\t\t0.553968,\n\t\t\t0.00392157,\n\t\t\t0.542884,\n\t\t\t0.542914,\n\t\t\t0.542875,\n\t\t\t0.129412,\n\t\t\t0.566303,\n\t\t\t0.603989,\n\t\t\t0.527499,\n\t\t\t0.254902,\n\t\t\t0.595218,\n\t\t\t0.662965,\n\t\t\t0.516857,\n\t\t\t0.380392,\n\t\t\t0.628641,\n\t\t\t0.720701,\n\t\t\t0.510673,\n\t\t\t0.505882,\n\t\t\t0.665373,\n\t\t\t0.777849,\n\t\t\t0.508165,\n\t\t\t0.631373,\n\t\t\t0.704182,\n\t\t\t0.834921,\n\t\t\t0.508303,\n\t\t\t0.756863,\n\t\t\t0.743846,\n\t\t\t0.892328,\n\t\t\t0.50999,\n\t\t\t0.882353,\n\t\t\t0.783158,\n\t\t\t0.950422,\n\t\t\t0.512181,\n\t\t\t1,\n\t\t\t0.818617,\n\t\t\t1,\n\t\t\t0.513888\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple2green_dark\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.107656,\n\t\t\t0,\n\t\t\t0.428682,\n\t\t\t-0.87451,\n\t\t\t0.1924,\n\t\t\t0,\n\t\t\t0.449799,\n\t\t\t-0.74902,\n\t\t\t0.255118,\n\t\t\t0.0648939,\n\t\t\t0.466726,\n\t\t\t-0.623529,\n\t\t\t0.304256,\n\t\t\t0.133066,\n\t\t\t0.476703,\n\t\t\t-0.498039,\n\t\t\t0.343202,\n\t\t\t0.19716,\n\t\t\t0.479793,\n\t\t\t-0.372549,\n\t\t\t0.373876,\n\t\t\t0.260353,\n\t\t\t0.476241,\n\t\t\t-0.247059,\n\t\t\t0.398497,\n\t\t\t0.322872,\n\t\t\t0.466953,\n\t\t\t-0.121569,\n\t\t\t0.420016,\n\t\t\t0.384252,\n\t\t\t0.453785,\n\t\t\t0.00392157,\n\t\t\t0.44319,\n\t\t\t0.443216,\n\t\t\t0.443186,\n\t\t\t0.129412,\n\t\t\t0.465553,\n\t\t\t0.502139,\n\t\t\t0.428233,\n\t\t\t0.254902,\n\t\t\t0.492959,\n\t\t\t0.559151,\n\t\t\t0.417591,\n\t\t\t0.380392,\n\t\t\t0.524654,\n\t\t\t0.615092,\n\t\t\t0.411016,\n\t\t\t0.505882,\n\t\t\t0.55959,\n\t\t\t0.670583,\n\t\t\t0.40779,\n\t\t\t0.631373,\n\t\t\t0.596614,\n\t\t\t0.726102,\n\t\t\t0.406948,\n\t\t\t0.756863,\n\t\t\t0.634544,\n\t\t\t0.782032,\n\t\t\t0.407439,\n\t\t\t0.882353,\n\t\t\t0.672183,\n\t\t\t0.838703,\n\t\t\t0.408237,\n\t\t\t1,\n\t\t\t0.706131,\n\t\t\t0.892759,\n\t\t\t0.408452\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"coolwarm\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.229806,\n\t\t\t0.298718,\n\t\t\t0.753683,\n\t\t\t-0.875,\n\t\t\t0.303869,\n\t\t\t0.406535,\n\t\t\t0.844959,\n\t\t\t-0.75,\n\t\t\t0.383013,\n\t\t\t0.509419,\n\t\t\t0.917388,\n\t\t\t-0.625,\n\t\t\t0.466667,\n\t\t\t0.604563,\n\t\t\t0.968155,\n\t\t\t-0.5,\n\t\t\t0.552953,\n\t\t\t0.688929,\n\t\t\t0.995376,\n\t\t\t-0.375,\n\t\t\t0.639176,\n\t\t\t0.7596,\n\t\t\t0.998151,\n\t\t\t-0.25,\n\t\t\t0.722193,\n\t\t\t0.813953,\n\t\t\t0.976575,\n\t\t\t-0.125,\n\t\t\t0.798692,\n\t\t\t0.849786,\n\t\t\t0.931689,\n\t\t\t0,\n\t\t\t0.865395,\n\t\t\t0.86541,\n\t\t\t0.865396,\n\t\t\t0.125,\n\t\t\t0.924128,\n\t\t\t0.827385,\n\t\t\t0.774508,\n\t\t\t0.25,\n\t\t\t0.958853,\n\t\t\t0.769768,\n\t\t\t0.678008,\n\t\t\t0.375,\n\t\t\t0.969954,\n\t\t\t0.694267,\n\t\t\t0.579375,\n\t\t\t0.5,\n\t\t\t0.958003,\n\t\t\t0.602842,\n\t\t\t0.481776,\n\t\t\t0.625,\n\t\t\t0.923945,\n\t\t\t0.497309,\n\t\t\t0.38797,\n\t\t\t0.75,\n\t\t\t0.869187,\n\t\t\t0.378313,\n\t\t\t0.300267,\n\t\t\t0.875,\n\t\t\t0.795632,\n\t\t\t0.241284,\n\t\t\t0.220526,\n\t\t\t1,\n\t\t\t0.705673,\n\t\t\t0.0155562,\n\t\t\t0.150233\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.019608,\n\t\t\t0.188235,\n\t\t\t0.380392,\n\t\t\t-0.87451,\n\t\t\t0.088504,\n\t\t\t0.321107,\n\t\t\t0.564937,\n\t\t\t-0.74902,\n\t\t\t0.163399,\n\t\t\t0.444983,\n\t\t\t0.697501,\n\t\t\t-0.623529,\n\t\t\t0.247059,\n\t\t\t0.555709,\n\t\t\t0.754095,\n\t\t\t-0.498039,\n\t\t\t0.420684,\n\t\t\t0.676432,\n\t\t\t0.818685,\n\t\t\t-0.372549,\n\t\t\t0.606459,\n\t\t\t0.789773,\n\t\t\t0.880277,\n\t\t\t-0.247059,\n\t\t\t0.761476,\n\t\t\t0.868512,\n\t\t\t0.924567,\n\t\t\t-0.121569,\n\t\t\t0.878047,\n\t\t\t0.925721,\n\t\t\t0.951942,\n\t\t\t0.00392157,\n\t\t\t0.969089,\n\t\t\t0.966474,\n\t\t\t0.964937,\n\t\t\t0.129412,\n\t\t\t0.983852,\n\t\t\t0.897578,\n\t\t\t0.846828,\n\t\t\t0.254902,\n\t\t\t0.982468,\n\t\t\t0.800692,\n\t\t\t0.706113,\n\t\t\t0.380392,\n\t\t\t0.960323,\n\t\t\t0.66782,\n\t\t\t0.536332,\n\t\t\t0.505882,\n\t\t\t0.894579,\n\t\t\t0.503806,\n\t\t\t0.399769,\n\t\t\t0.631373,\n\t\t\t0.81707,\n\t\t\t0.33218,\n\t\t\t0.281046,\n\t\t\t0.756863,\n\t\t\t0.728489,\n\t\t\t0.155017,\n\t\t\t0.197386,\n\t\t\t0.882353,\n\t\t\t0.576932,\n\t\t\t0.055363,\n\t\t\t0.14925,\n\t\t\t1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.121569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Spectral_lowBlue\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.368627,\n\t\t\t0.309804,\n\t\t\t0.635294,\n\t\t\t-0.87451,\n\t\t\t0.260361,\n\t\t\t0.450058,\n\t\t\t0.70173,\n\t\t\t-0.74902,\n\t\t\t0.248058,\n\t\t\t0.591311,\n\t\t\t0.717186,\n\t\t\t-0.623529,\n\t\t\t0.376009,\n\t\t\t0.734025,\n\t\t\t0.658132,\n\t\t\t-0.498039,\n\t\t\t0.537947,\n\t\t\t0.814764,\n\t\t\t0.64506,\n\t\t\t-0.372549,\n\t\t\t0.702345,\n\t\t\t0.879585,\n\t\t\t0.636678,\n\t\t\t-0.247059,\n\t\t\t0.84752,\n\t\t\t0.938639,\n\t\t\t0.607151,\n\t\t\t-0.121569,\n\t\t\t0.940408,\n\t\t\t0.976163,\n\t\t\t0.656055,\n\t\t\t0.00392157,\n\t\t\t0.999923,\n\t\t\t0.997616,\n\t\t\t0.745021,\n\t\t\t0.129412,\n\t\t\t0.997463,\n\t\t\t0.921338,\n\t\t\t0.61707,\n\t\t\t0.254902,\n\t\t\t0.995002,\n\t\t\t0.824606,\n\t\t\t0.499885,\n\t\t\t0.380392,\n\t\t\t0.992541,\n\t\t\t0.701576,\n\t\t\t0.39654,\n\t\t\t0.505882,\n\t\t\t0.973472,\n\t\t\t0.547405,\n\t\t\t0.318108,\n\t\t\t0.631373,\n\t\t\t0.937793,\n\t\t\t0.398539,\n\t\t\t0.270127,\n\t\t\t0.756863,\n\t\t\t0.861515,\n\t\t\t0.282891,\n\t\t\t0.299654,\n\t\t\t0.882353,\n\t\t\t0.746482,\n\t\t\t0.144637,\n\t\t\t0.288812,\n\t\t\t1,\n\t\t\t0.619608,\n\t\t\t0.003922,\n\t\t\t0.258824\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnRP\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882,\n\t\t\t-0.87451,\n\t\t\t0.066436,\n\t\t\t0.394617,\n\t\t\t0.174779,\n\t\t\t-0.74902,\n\t\t\t0.168858,\n\t\t\t0.524567,\n\t\t\t0.25767,\n\t\t\t-0.623529,\n\t\t\t0.323875,\n\t\t\t0.657439,\n\t\t\t0.361015,\n\t\t\t-0.498039,\n\t\t\t0.504883,\n\t\t\t0.772318,\n\t\t\t0.506344,\n\t\t\t-0.372549,\n\t\t\t0.678431,\n\t\t\t0.870127,\n\t\t\t0.654902,\n\t\t\t-0.247059,\n\t\t\t0.803922,\n\t\t\t0.921799,\n\t\t\t0.780392,\n\t\t\t-0.121569,\n\t\t\t0.897116,\n\t\t\t0.951942,\n\t\t\t0.882814,\n\t\t\t0.00392157,\n\t\t\t0.967397,\n\t\t\t0.965936,\n\t\t\t0.967474,\n\t\t\t0.129412,\n\t\t\t0.928028,\n\t\t\t0.879815,\n\t\t\t0.930565,\n\t\t\t0.254902,\n\t\t\t0.866052,\n\t\t\t0.780777,\n\t\t\t0.882891,\n\t\t\t0.380392,\n\t\t\t0.77501,\n\t\t\t0.665129,\n\t\t\t0.821376,\n\t\t\t0.505882,\n\t\t\t0.675663,\n\t\t\t0.537024,\n\t\t\t0.737024,\n\t\t\t0.631373,\n\t\t\t0.57847,\n\t\t\t0.396155,\n\t\t\t0.645982,\n\t\t\t0.756863,\n\t\t\t0.492349,\n\t\t\t0.223914,\n\t\t\t0.547559,\n\t\t\t0.882353,\n\t\t\t0.375548,\n\t\t\t0.096886,\n\t\t\t0.423299,\n\t\t\t1,\n\t\t\t0.25098,\n\t\t\t0,\n\t\t\t0.294118\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GYPi\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.152941,\n\t\t\t0.392157,\n\t\t\t0.098039,\n\t\t\t-0.87451,\n\t\t\t0.246444,\n\t\t\t0.505344,\n\t\t\t0.117724,\n\t\t\t-0.74902,\n\t\t\t0.351942,\n\t\t\t0.614533,\n\t\t\t0.161399,\n\t\t\t-0.623529,\n\t\t\t0.474971,\n\t\t\t0.717878,\n\t\t\t0.240138,\n\t\t\t-0.498039,\n\t\t\t0.611995,\n\t\t\t0.811226,\n\t\t\t0.392849,\n\t\t\t-0.372549,\n\t\t\t0.746328,\n\t\t\t0.893118,\n\t\t\t0.565321,\n\t\t\t-0.247059,\n\t\t\t0.859516,\n\t\t\t0.94233,\n\t\t\t0.747405,\n\t\t\t-0.121569,\n\t\t\t0.928105,\n\t\t\t0.96386,\n\t\t\t0.875663,\n\t\t\t0.00392157,\n\t\t\t0.969089,\n\t\t\t0.966859,\n\t\t\t0.968012,\n\t\t\t0.129412,\n\t\t\t0.983852,\n\t\t\t0.910265,\n\t\t\t0.948328,\n\t\t\t0.254902,\n\t\t\t0.979239,\n\t\t\t0.833218,\n\t\t\t0.914648,\n\t\t\t0.380392,\n\t\t\t0.949712,\n\t\t\t0.729873,\n\t\t\t0.862976,\n\t\t\t0.505882,\n\t\t\t0.905652,\n\t\t\t0.58293,\n\t\t\t0.763552,\n\t\t\t0.631373,\n\t\t\t0.85521,\n\t\t\t0.410073,\n\t\t\t0.652211,\n\t\t\t0.756863,\n\t\t\t0.793695,\n\t\t\t0.183699,\n\t\t\t0.531642,\n\t\t\t0.882353,\n\t\t\t0.683737,\n\t\t\t0.063899,\n\t\t\t0.420761,\n\t\t\t1,\n\t\t\t0.556863,\n\t\t\t0.003922,\n\t\t\t0.321569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnYlRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.407843,\n\t\t\t0.215686,\n\t\t\t-0.87451,\n\t\t\t0.063975,\n\t\t\t0.525952,\n\t\t\t0.277201,\n\t\t\t-0.74902,\n\t\t\t0.177932,\n\t\t\t0.633064,\n\t\t\t0.332718,\n\t\t\t-0.623529,\n\t\t\t0.364937,\n\t\t\t0.724106,\n\t\t\t0.379469,\n\t\t\t-0.498039,\n\t\t\t0.527951,\n\t\t\t0.797155,\n\t\t\t0.40223,\n\t\t\t-0.372549,\n\t\t\t0.678431,\n\t\t\t0.862822,\n\t\t\t0.433449,\n\t\t\t-0.247059,\n\t\t\t0.803922,\n\t\t\t0.916955,\n\t\t\t0.514648,\n\t\t\t-0.121569,\n\t\t\t0.909419,\n\t\t\t0.961861,\n\t\t\t0.625067,\n\t\t\t0.00392157,\n\t\t\t0.999923,\n\t\t\t0.997616,\n\t\t\t0.745021,\n\t\t\t0.129412,\n\t\t\t0.997463,\n\t\t\t0.921338,\n\t\t\t0.61707,\n\t\t\t0.254902,\n\t\t\t0.995002,\n\t\t\t0.824606,\n\t\t\t0.499885,\n\t\t\t0.380392,\n\t\t\t0.992541,\n\t\t\t0.701576,\n\t\t\t0.39654,\n\t\t\t0.505882,\n\t\t\t0.973472,\n\t\t\t0.547405,\n\t\t\t0.318108,\n\t\t\t0.631373,\n\t\t\t0.939023,\n\t\t\t0.389927,\n\t\t\t0.245521,\n\t\t\t0.756863,\n\t\t\t0.867666,\n\t\t\t0.239831,\n\t\t\t0.176624,\n\t\t\t0.882353,\n\t\t\t0.762399,\n\t\t\t0.110727,\n\t\t\t0.151326,\n\t\t\t1,\n\t\t\t0.647059,\n\t\t\t0,\n\t\t\t0.14902\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GBBr\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.235294,\n\t\t\t0.188235,\n\t\t\t-0.87451,\n\t\t\t0.002461,\n\t\t\t0.338639,\n\t\t\t0.301423,\n\t\t\t-0.74902,\n\t\t\t0.055902,\n\t\t\t0.448981,\n\t\t\t0.417609,\n\t\t\t-0.623529,\n\t\t\t0.183852,\n\t\t\t0.56955,\n\t\t\t0.538178,\n\t\t\t-0.498039,\n\t\t\t0.357785,\n\t\t\t0.700115,\n\t\t\t0.660746,\n\t\t\t-0.372549,\n\t\t\t0.540177,\n\t\t\t0.819531,\n\t\t\t0.77624,\n\t\t\t-0.247059,\n\t\t\t0.714879,\n\t\t\t0.890888,\n\t\t\t0.864821,\n\t\t\t-0.121569,\n\t\t\t0.851134,\n\t\t\t0.934564,\n\t\t\t0.922645,\n\t\t\t0.00392157,\n\t\t\t0.960861,\n\t\t\t0.959785,\n\t\t\t0.95694,\n\t\t\t0.129412,\n\t\t\t0.963322,\n\t\t\t0.927797,\n\t\t\t0.83391,\n\t\t\t0.254902,\n\t\t\t0.939946,\n\t\t\t0.868897,\n\t\t\t0.68935,\n\t\t\t0.380392,\n\t\t\t0.883353,\n\t\t\t0.775394,\n\t\t\t0.517109,\n\t\t\t0.505882,\n\t\t\t0.808074,\n\t\t\t0.625836,\n\t\t\t0.324106,\n\t\t\t0.631373,\n\t\t\t0.717647,\n\t\t\t0.476355,\n\t\t\t0.15494,\n\t\t\t0.756863,\n\t\t\t0.592157,\n\t\t\t0.358247,\n\t\t\t0.06882,\n\t\t\t0.882353,\n\t\t\t0.458593,\n\t\t\t0.26436,\n\t\t\t0.031142,\n\t\t\t1,\n\t\t\t0.329412,\n\t\t\t0.188235,\n\t\t\t0.019608\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PuOr\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.498039,\n\t\t\t0.231373,\n\t\t\t0.031373,\n\t\t\t-0.87451,\n\t\t\t0.62599,\n\t\t\t0.30273,\n\t\t\t0.026451,\n\t\t\t-0.74902,\n\t\t\t0.746943,\n\t\t\t0.387082,\n\t\t\t0.037524,\n\t\t\t-0.623529,\n\t\t\t0.85767,\n\t\t\t0.490427,\n\t\t\t0.071972,\n\t\t\t-0.498039,\n\t\t\t0.936409,\n\t\t\t0.617762,\n\t\t\t0.236371,\n\t\t\t-0.372549,\n\t\t\t0.992695,\n\t\t\t0.743099,\n\t\t\t0.43291,\n\t\t\t-0.247059,\n\t\t\t0.995156,\n\t\t\t0.841523,\n\t\t\t0.63714,\n\t\t\t-0.121569,\n\t\t\t0.985313,\n\t\t\t0.913802,\n\t\t\t0.813687,\n\t\t\t0.00392157,\n\t\t\t0.966244,\n\t\t\t0.966398,\n\t\t\t0.967705,\n\t\t\t0.129412,\n\t\t\t0.889965,\n\t\t\t0.89504,\n\t\t\t0.938178,\n\t\t\t0.254902,\n\t\t\t0.806151,\n\t\t\t0.804306,\n\t\t\t0.894656,\n\t\t\t0.380392,\n\t\t\t0.712649,\n\t\t\t0.688658,\n\t\t\t0.833141,\n\t\t\t0.505882,\n\t\t\t0.594233,\n\t\t\t0.554325,\n\t\t\t0.744637,\n\t\t\t0.631373,\n\t\t\t0.474894,\n\t\t\t0.404229,\n\t\t\t0.652364,\n\t\t\t0.756863,\n\t\t\t0.366628,\n\t\t\t0.217224,\n\t\t\t0.563783,\n\t\t\t0.882353,\n\t\t\t0.266436,\n\t\t\t0.089965,\n\t\t\t0.434833,\n\t\t\t1,\n\t\t\t0.176471,\n\t\t\t0,\n\t\t\t0.294118\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PRGn\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.25098,\n\t\t\t0,\n\t\t\t0.294118,\n\t\t\t-0.87451,\n\t\t\t0.383852,\n\t\t\t0.103345,\n\t\t\t0.431911,\n\t\t\t-0.74902,\n\t\t\t0.497732,\n\t\t\t0.234679,\n\t\t\t0.55371,\n\t\t\t-0.623529,\n\t\t\t0.583852,\n\t\t\t0.40692,\n\t\t\t0.652134,\n\t\t\t-0.498039,\n\t\t\t0.681968,\n\t\t\t0.545175,\n\t\t\t0.742561,\n\t\t\t-0.372549,\n\t\t\t0.7807,\n\t\t\t0.672357,\n\t\t\t0.825221,\n\t\t\t-0.247059,\n\t\t\t0.871742,\n\t\t\t0.788005,\n\t\t\t0.886736,\n\t\t\t-0.121569,\n\t\t\t0.930488,\n\t\t\t0.885198,\n\t\t\t0.932872,\n\t\t\t0.00392157,\n\t\t\t0.966321,\n\t\t\t0.968089,\n\t\t\t0.965859,\n\t\t\t0.129412,\n\t\t\t0.892503,\n\t\t\t0.950865,\n\t\t\t0.877278,\n\t\t\t0.254902,\n\t\t\t0.796078,\n\t\t\t0.91857,\n\t\t\t0.772549,\n\t\t\t0.380392,\n\t\t\t0.670588,\n\t\t\t0.866897,\n\t\t\t0.647059,\n\t\t\t0.505882,\n\t\t\t0.493195,\n\t\t\t0.765398,\n\t\t\t0.496655,\n\t\t\t0.631373,\n\t\t\t0.314187,\n\t\t\t0.649135,\n\t\t\t0.354556,\n\t\t\t0.756863,\n\t\t\t0.15917,\n\t\t\t0.516263,\n\t\t\t0.251211,\n\t\t\t0.882353,\n\t\t\t0.062284,\n\t\t\t0.386621,\n\t\t\t0.170473,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PiYG\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.556863,\n\t\t\t0.003922,\n\t\t\t0.321569,\n\t\t\t-0.87451,\n\t\t\t0.692195,\n\t\t\t0.067897,\n\t\t\t0.427374,\n\t\t\t-0.74902,\n\t\t\t0.797539,\n\t\t\t0.197847,\n\t\t\t0.539177,\n\t\t\t-0.623529,\n\t\t\t0.859054,\n\t\t\t0.424221,\n\t\t\t0.659746,\n\t\t\t-0.498039,\n\t\t\t0.908574,\n\t\t\t0.592618,\n\t\t\t0.770319,\n\t\t\t-0.372549,\n\t\t\t0.951557,\n\t\t\t0.736332,\n\t\t\t0.866205,\n\t\t\t-0.247059,\n\t\t\t0.981084,\n\t\t\t0.839677,\n\t\t\t0.917878,\n\t\t\t-0.121569,\n\t\t\t0.98293,\n\t\t\t0.913802,\n\t\t\t0.949558,\n\t\t\t0.00392157,\n\t\t\t0.96732,\n\t\t\t0.968474,\n\t\t\t0.965629,\n\t\t\t0.129412,\n\t\t\t0.92549,\n\t\t\t0.963552,\n\t\t\t0.869666,\n\t\t\t0.254902,\n\t\t\t0.852441,\n\t\t\t0.939254,\n\t\t\t0.736025,\n\t\t\t0.380392,\n\t\t\t0.739254,\n\t\t\t0.890042,\n\t\t\t0.553941,\n\t\t\t0.505882,\n\t\t\t0.60323,\n\t\t\t0.805536,\n\t\t\t0.382238,\n\t\t\t0.631373,\n\t\t\t0.467282,\n\t\t\t0.711419,\n\t\t\t0.235217,\n\t\t\t0.756863,\n\t\t\t0.344252,\n\t\t\t0.608074,\n\t\t\t0.156478,\n\t\t\t0.882353,\n\t\t\t0.2406,\n\t\t\t0.49827,\n\t\t\t0.116494,\n\t\t\t1,\n\t\t\t0.152941,\n\t\t\t0.392157,\n\t\t\t0.098039\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"OrPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.176471,\n\t\t\t0,\n\t\t\t0.294118,\n\t\t\t-0.87451,\n\t\t\t0.272434,\n\t\t\t0.095963,\n\t\t\t0.444214,\n\t\t\t-0.74902,\n\t\t\t0.373395,\n\t\t\t0.228912,\n\t\t\t0.56932,\n\t\t\t-0.623529,\n\t\t\t0.481661,\n\t\t\t0.415917,\n\t\t\t0.657901,\n\t\t\t-0.498039,\n\t\t\t0.601922,\n\t\t\t0.562937,\n\t\t\t0.750481,\n\t\t\t-0.372549,\n\t\t\t0.718493,\n\t\t\t0.695886,\n\t\t\t0.836986,\n\t\t\t-0.247059,\n\t\t\t0.811995,\n\t\t\t0.811534,\n\t\t\t0.898501,\n\t\t\t-0.121569,\n\t\t\t0.894733,\n\t\t\t0.8995,\n\t\t\t0.940023,\n\t\t\t0.00392157,\n\t\t\t0.969166,\n\t\t\t0.966859,\n\t\t\t0.963629,\n\t\t\t0.129412,\n\t\t\t0.98639,\n\t\t\t0.910265,\n\t\t\t0.803691,\n\t\t\t0.254902,\n\t\t\t0.995002,\n\t\t\t0.835371,\n\t\t\t0.624375,\n\t\t\t0.380392,\n\t\t\t0.992541,\n\t\t\t0.736947,\n\t\t\t0.420146,\n\t\t\t0.505882,\n\t\t\t0.931949,\n\t\t\t0.609458,\n\t\t\t0.224221,\n\t\t\t0.631373,\n\t\t\t0.85075,\n\t\t\t0.483968,\n\t\t\t0.069819,\n\t\t\t0.756863,\n\t\t\t0.740023,\n\t\t\t0.380623,\n\t\t\t0.035371,\n\t\t\t0.882353,\n\t\t\t0.617993,\n\t\t\t0.29827,\n\t\t\t0.026759,\n\t\t\t1,\n\t\t\t0.498039,\n\t\t\t0.231373,\n\t\t\t0.031373\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BrBG\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.329412,\n\t\t\t0.188235,\n\t\t\t0.019608,\n\t\t\t-0.87451,\n\t\t\t0.467205,\n\t\t\t0.269435,\n\t\t\t0.031911,\n\t\t\t-0.74902,\n\t\t\t0.6,\n\t\t\t0.365629,\n\t\t\t0.074202,\n\t\t\t-0.623529,\n\t\t\t0.72549,\n\t\t\t0.483737,\n\t\t\t0.160323,\n\t\t\t-0.498039,\n\t\t\t0.812995,\n\t\t\t0.635832,\n\t\t\t0.336409,\n\t\t\t-0.372549,\n\t\t\t0.88689,\n\t\t\t0.781238,\n\t\t\t0.527874,\n\t\t\t-0.247059,\n\t\t\t0.943483,\n\t\t\t0.87474,\n\t\t\t0.700115,\n\t\t\t-0.121569,\n\t\t\t0.963168,\n\t\t\t0.929796,\n\t\t\t0.841599,\n\t\t\t0.00392157,\n\t\t\t0.957247,\n\t\t\t0.959938,\n\t\t\t0.959554,\n\t\t\t0.129412,\n\t\t\t0.84406,\n\t\t\t0.932872,\n\t\t\t0.920185,\n\t\t\t0.254902,\n\t\t\t0.70396,\n\t\t\t0.886428,\n\t\t\t0.859285,\n\t\t\t0.380392,\n\t\t\t0.529258,\n\t\t\t0.815071,\n\t\t\t0.770704,\n\t\t\t0.505882,\n\t\t\t0.346251,\n\t\t\t0.691811,\n\t\t\t0.653057,\n\t\t\t0.631373,\n\t\t\t0.175855,\n\t\t\t0.562015,\n\t\t\t0.530642,\n\t\t\t0.756863,\n\t\t\t0.047905,\n\t\t\t0.441446,\n\t\t\t0.410073,\n\t\t\t0.882353,\n\t\t\t0.002307,\n\t\t\t0.33218,\n\t\t\t0.294348,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.235294,\n\t\t\t0.188235\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GyRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.101961,\n\t\t\t0.101961,\n\t\t\t0.101961,\n\t\t\t-0.87451,\n\t\t\t0.227451,\n\t\t\t0.227451,\n\t\t\t0.227451,\n\t\t\t-0.74902,\n\t\t\t0.359939,\n\t\t\t0.359939,\n\t\t\t0.359939,\n\t\t\t-0.623529,\n\t\t\t0.502653,\n\t\t\t0.502653,\n\t\t\t0.502653,\n\t\t\t-0.498039,\n\t\t\t0.631373,\n\t\t\t0.631373,\n\t\t\t0.631373,\n\t\t\t-0.372549,\n\t\t\t0.749865,\n\t\t\t0.749865,\n\t\t\t0.749865,\n\t\t\t-0.247059,\n\t\t\t0.843368,\n\t\t\t0.843368,\n\t\t\t0.843368,\n\t\t\t-0.121569,\n\t\t\t0.926105,\n\t\t\t0.926105,\n\t\t\t0.926105,\n\t\t\t0.00392157,\n\t\t\t0.999846,\n\t\t\t0.997232,\n\t\t\t0.995694,\n\t\t\t0.129412,\n\t\t\t0.994925,\n\t\t\t0.908651,\n\t\t\t0.857901,\n\t\t\t0.254902,\n\t\t\t0.982468,\n\t\t\t0.800692,\n\t\t\t0.706113,\n\t\t\t0.380392,\n\t\t\t0.960323,\n\t\t\t0.66782,\n\t\t\t0.536332,\n\t\t\t0.505882,\n\t\t\t0.894579,\n\t\t\t0.503806,\n\t\t\t0.399769,\n\t\t\t0.631373,\n\t\t\t0.81707,\n\t\t\t0.33218,\n\t\t\t0.281046,\n\t\t\t0.756863,\n\t\t\t0.728489,\n\t\t\t0.155017,\n\t\t\t0.197386,\n\t\t\t0.882353,\n\t\t\t0.576932,\n\t\t\t0.055363,\n\t\t\t0.14925,\n\t\t\t1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.121569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divHi_purpleGreen\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.297553,\n\t\t\t0,\n\t\t\t0.489074,\n\t\t\t-0.87451,\n\t\t\t0.40259,\n\t\t\t0.151146,\n\t\t\t0.567754,\n\t\t\t-0.74902,\n\t\t\t0.516038,\n\t\t\t0.284843,\n\t\t\t0.658231,\n\t\t\t-0.623529,\n\t\t\t0.629783,\n\t\t\t0.423646,\n\t\t\t0.750938,\n\t\t\t-0.498039,\n\t\t\t0.735198,\n\t\t\t0.563697,\n\t\t\t0.835956,\n\t\t\t-0.372549,\n\t\t\t0.82408,\n\t\t\t0.695541,\n\t\t\t0.903582,\n\t\t\t-0.247059,\n\t\t\t0.889091,\n\t\t\t0.807454,\n\t\t\t0.944862,\n\t\t\t-0.121569,\n\t\t\t0.92334,\n\t\t\t0.886917,\n\t\t\t0.951839,\n\t\t\t0.00392157,\n\t\t\t0.921045,\n\t\t\t0.921084,\n\t\t\t0.921003,\n\t\t\t0.129412,\n\t\t\t0.877324,\n\t\t\t0.907455,\n\t\t\t0.845381,\n\t\t\t0.254902,\n\t\t\t0.797649,\n\t\t\t0.849713,\n\t\t\t0.734695,\n\t\t\t0.380392,\n\t\t\t0.691646,\n\t\t\t0.75964,\n\t\t\t0.600532,\n\t\t\t0.505882,\n\t\t\t0.568981,\n\t\t\t0.649159,\n\t\t\t0.453807,\n\t\t\t0.631373,\n\t\t\t0.438945,\n\t\t\t0.529756,\n\t\t\t0.304259,\n\t\t\t0.756863,\n\t\t\t0.30973,\n\t\t\t0.412001,\n\t\t\t0.158303,\n\t\t\t0.882353,\n\t\t\t0.187078,\n\t\t\t0.305111,\n\t\t\t0.00251458,\n\t\t\t1,\n\t\t\t0.101655,\n\t\t\t0.220836,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divHi_purpleGreen_dim\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.404088,\n\t\t\t0.131038,\n\t\t\t0.592767,\n\t\t\t-0.87451,\n\t\t\t0.486469,\n\t\t\t0.230957,\n\t\t\t0.651243,\n\t\t\t-0.74902,\n\t\t\t0.575165,\n\t\t\t0.339335,\n\t\t\t0.717723,\n\t\t\t-0.623529,\n\t\t\t0.662741,\n\t\t\t0.454332,\n\t\t\t0.784263,\n\t\t\t-0.498039,\n\t\t\t0.742071,\n\t\t\t0.570213,\n\t\t\t0.842918,\n\t\t\t-0.372549,\n\t\t\t0.806935,\n\t\t\t0.678992,\n\t\t\t0.886227,\n\t\t\t-0.247059,\n\t\t\t0.852219,\n\t\t\t0.771315,\n\t\t\t0.90763,\n\t\t\t-0.121569,\n\t\t\t0.873345,\n\t\t\t0.837327,\n\t\t\t0.901572,\n\t\t\t0.00392157,\n\t\t\t0.866783,\n\t\t\t0.86682,\n\t\t\t0.866745,\n\t\t\t0.129412,\n\t\t\t0.82839,\n\t\t\t0.858225,\n\t\t\t0.796812,\n\t\t\t0.254902,\n\t\t\t0.762578,\n\t\t\t0.814287,\n\t\t\t0.700202,\n\t\t\t0.380392,\n\t\t\t0.676429,\n\t\t\t0.744229,\n\t\t\t0.585735,\n\t\t\t0.505882,\n\t\t\t0.577033,\n\t\t\t0.65732,\n\t\t\t0.461526,\n\t\t\t0.631373,\n\t\t\t0.47128,\n\t\t\t0.562476,\n\t\t\t0.33476,\n\t\t\t0.756863,\n\t\t\t0.365461,\n\t\t\t0.467957,\n\t\t\t0.21076,\n\t\t\t0.882353,\n\t\t\t0.264758,\n\t\t\t0.381138,\n\t\t\t0.0878313,\n\t\t\t1,\n\t\t\t0.182591,\n\t\t\t0.312249,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divLow_icePeach\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.480048,\n\t\t\t0.817441,\n\t\t\t0.998056,\n\t\t\t-0.87451,\n\t\t\t0.425898,\n\t\t\t0.726921,\n\t\t\t0.883187,\n\t\t\t-0.74902,\n\t\t\t0.366682,\n\t\t\t0.629445,\n\t\t\t0.761936,\n\t\t\t-0.623529,\n\t\t\t0.308756,\n\t\t\t0.531002,\n\t\t\t0.640217,\n\t\t\t-0.498039,\n\t\t\t0.258021,\n\t\t\t0.43705,\n\t\t\t0.523433,\n\t\t\t-0.372549,\n\t\t\t0.219244,\n\t\t\t0.352381,\n\t\t\t0.416348,\n\t\t\t-0.247059,\n\t\t\t0.195127,\n\t\t\t0.281032,\n\t\t\t0.322979,\n\t\t\t-0.121569,\n\t\t\t0.186286,\n\t\t\t0.22627,\n\t\t\t0.246525,\n\t\t\t0.00392157,\n\t\t\t0.192352,\n\t\t\t0.19236,\n\t\t\t0.192364,\n\t\t\t0.129412,\n\t\t\t0.255927,\n\t\t\t0.214469,\n\t\t\t0.191756,\n\t\t\t0.254902,\n\t\t\t0.340459,\n\t\t\t0.254426,\n\t\t\t0.206666,\n\t\t\t0.380392,\n\t\t\t0.444655,\n\t\t\t0.309315,\n\t\t\t0.234029,\n\t\t\t0.505882,\n\t\t\t0.565353,\n\t\t\t0.376004,\n\t\t\t0.270969,\n\t\t\t0.631373,\n\t\t\t0.697917,\n\t\t\t0.450748,\n\t\t\t0.314293,\n\t\t\t0.756863,\n\t\t\t0.836657,\n\t\t\t0.529064,\n\t\t\t0.360227,\n\t\t\t0.882353,\n\t\t\t0.972695,\n\t\t\t0.614884,\n\t\t\t0.413123,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.705904,\n\t\t\t0.472699\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divLow_purpleGreen\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.956034,\n\t\t\t0.666487,\n\t\t\t0.952663,\n\t\t\t-0.87451,\n\t\t\t0.874457,\n\t\t\t0.572698,\n\t\t\t0.936352,\n\t\t\t-0.74902,\n\t\t\t0.753465,\n\t\t\t0.488253,\n\t\t\t0.909063,\n\t\t\t-0.623529,\n\t\t\t0.63309,\n\t\t\t0.413507,\n\t\t\t0.763833,\n\t\t\t-0.498039,\n\t\t\t0.514491,\n\t\t\t0.345878,\n\t\t\t0.620015,\n\t\t\t-0.372549,\n\t\t\t0.405008,\n\t\t\t0.288141,\n\t\t\t0.484376,\n\t\t\t-0.247059,\n\t\t\t0.311388,\n\t\t\t0.241986,\n\t\t\t0.363556,\n\t\t\t-0.121569,\n\t\t\t0.238722,\n\t\t\t0.209044,\n\t\t\t0.263449,\n\t\t\t0.00392157,\n\t\t\t0.192352,\n\t\t\t0.192366,\n\t\t\t0.192362,\n\t\t\t0.129412,\n\t\t\t0.200379,\n\t\t\t0.233201,\n\t\t\t0.168618,\n\t\t\t0.254902,\n\t\t\t0.230151,\n\t\t\t0.291737,\n\t\t\t0.165227,\n\t\t\t0.380392,\n\t\t\t0.279481,\n\t\t\t0.366076,\n\t\t\t0.178607,\n\t\t\t0.505882,\n\t\t\t0.344927,\n\t\t\t0.453267,\n\t\t\t0.205703,\n\t\t\t0.631373,\n\t\t\t0.421554,\n\t\t\t0.549449,\n\t\t\t0.242643,\n\t\t\t0.756863,\n\t\t\t0.503334,\n\t\t\t0.649999,\n\t\t\t0.284377,\n\t\t\t0.882353,\n\t\t\t0.583497,\n\t\t\t0.749672,\n\t\t\t0.324969,\n\t\t\t1,\n\t\t\t0.650705,\n\t\t\t0.837228,\n\t\t\t0.356264\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Haze_green\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1,\n\t\t\t0.835294,\n\t\t\t0.886275,\n\t\t\t-0.87451,\n\t\t\t0.937255,\n\t\t\t0.756863,\n\t\t\t0.870443,\n\t\t\t-0.74902,\n\t\t\t0.875817,\n\t\t\t0.666376,\n\t\t\t0.857807,\n\t\t\t-0.623529,\n\t\t\t0.778359,\n\t\t\t0.583007,\n\t\t\t0.808134,\n\t\t\t-0.498039,\n\t\t\t0.676253,\n\t\t\t0.494118,\n\t\t\t0.745098,\n\t\t\t-0.372549,\n\t\t\t0.561365,\n\t\t\t0.390123,\n\t\t\t0.682353,\n\t\t\t-0.247059,\n\t\t\t0.438344,\n\t\t\t0.262745,\n\t\t\t0.621496,\n\t\t\t-0.121569,\n\t\t\t0.321133,\n\t\t\t0.141031,\n\t\t\t0.558751,\n\t\t\t0.00392157,\n\t\t\t0.203922,\n\t\t\t0.0217865,\n\t\t\t0.495861,\n\t\t\t0.129412,\n\t\t\t0.265505,\n\t\t\t0.129412,\n\t\t\t0.433261,\n\t\t\t0.254902,\n\t\t\t0.311692,\n\t\t\t0.255338,\n\t\t\t0.37008,\n\t\t\t0.380392,\n\t\t\t0.356282,\n\t\t\t0.377342,\n\t\t\t0.310821,\n\t\t\t0.505882,\n\t\t\t0.39971,\n\t\t\t0.488889,\n\t\t\t0.258243,\n\t\t\t0.631373,\n\t\t\t0.442556,\n\t\t\t0.604357,\n\t\t\t0.205519,\n\t\t\t0.756863,\n\t\t\t0.48671,\n\t\t\t0.71968,\n\t\t\t0.152941,\n\t\t\t0.882353,\n\t\t\t0.529847,\n\t\t\t0.830356,\n\t\t\t0.100944,\n\t\t\t1,\n\t\t\t0.572549,\n\t\t\t0.933333,\n\t\t\t0.054902\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Haze_lime\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.704034,\n\t\t\t0.784196,\n\t\t\t1,\n\t\t\t-0.87451,\n\t\t\t0.633111,\n\t\t\t0.691418,\n\t\t\t0.956078,\n\t\t\t-0.74902,\n\t\t\t0.564021,\n\t\t\t0.600606,\n\t\t\t0.912157,\n\t\t\t-0.623529,\n\t\t\t0.496827,\n\t\t\t0.51189,\n\t\t\t0.868235,\n\t\t\t-0.498039,\n\t\t\t0.43157,\n\t\t\t0.425416,\n\t\t\t0.824314,\n\t\t\t-0.372549,\n\t\t\t0.368248,\n\t\t\t0.341347,\n\t\t\t0.780392,\n\t\t\t-0.247059,\n\t\t\t0.306767,\n\t\t\t0.259855,\n\t\t\t0.736471,\n\t\t\t-0.121569,\n\t\t\t0.246862,\n\t\t\t0.181069,\n\t\t\t0.692549,\n\t\t\t0.00392157,\n\t\t\t0.191619,\n\t\t\t0.109542,\n\t\t\t0.648627,\n\t\t\t0.129412,\n\t\t\t0.257404,\n\t\t\t0.194031,\n\t\t\t0.604706,\n\t\t\t0.254902,\n\t\t\t0.321794,\n\t\t\t0.278775,\n\t\t\t0.560784,\n\t\t\t0.380392,\n\t\t\t0.387909,\n\t\t\t0.364617,\n\t\t\t0.516863,\n\t\t\t0.505882,\n\t\t\t0.456569,\n\t\t\t0.451881,\n\t\t\t0.472941,\n\t\t\t0.631373,\n\t\t\t0.527424,\n\t\t\t0.540773,\n\t\t\t0.42902,\n\t\t\t0.756863,\n\t\t\t0.599759,\n\t\t\t0.631427,\n\t\t\t0.385098,\n\t\t\t0.882353,\n\t\t\t0.673065,\n\t\t\t0.723898,\n\t\t\t0.341176,\n\t\t\t1,\n\t\t\t0.742751,\n\t\t\t0.812252,\n\t\t\t0.3\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Haze\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1,\n\t\t\t0.835294,\n\t\t\t0.996078,\n\t\t\t-0.00392157,\n\t\t\t0.023529,\n\t\t\t0.141176,\n\t\t\t0.498039,\n\t\t\t0.00392157,\n\t\t\t0.015686,\n\t\t\t0.137255,\n\t\t\t0.494118,\n\t\t\t1,\n\t\t\t0.984314,\n\t\t\t0.764706,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Haze_cyan\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.956863,\n\t\t\t1,\n\t\t\t0.835294,\n\t\t\t-0.87451,\n\t\t\t0.933188,\n\t\t\t0.921714,\n\t\t\t0.760784,\n\t\t\t-0.74902,\n\t\t\t0.870588,\n\t\t\t0.803486,\n\t\t\t0.671605,\n\t\t\t-0.623529,\n\t\t\t0.807843,\n\t\t\t0.684096,\n\t\t\t0.583297,\n\t\t\t-0.498039,\n\t\t\t0.745098,\n\t\t\t0.569208,\n\t\t\t0.494118,\n\t\t\t-0.372549,\n\t\t\t0.682353,\n\t\t\t0.437763,\n\t\t\t0.390123,\n\t\t\t-0.247059,\n\t\t\t0.621496,\n\t\t\t0.288163,\n\t\t\t0.262745,\n\t\t\t-0.121569,\n\t\t\t0.558751,\n\t\t\t0.144517,\n\t\t\t0.141031,\n\t\t\t0.00392157,\n\t\t\t0.495861,\n\t\t\t0.0217865,\n\t\t\t0.0413943,\n\t\t\t0.129412,\n\t\t\t0.433261,\n\t\t\t0.137255,\n\t\t\t0.129412,\n\t\t\t0.254902,\n\t\t\t0.37008,\n\t\t\t0.263181,\n\t\t\t0.255338,\n\t\t\t0.380392,\n\t\t\t0.306318,\n\t\t\t0.381845,\n\t\t\t0.372694,\n\t\t\t0.505882,\n\t\t\t0.243137,\n\t\t\t0.503994,\n\t\t\t0.494263,\n\t\t\t0.631373,\n\t\t\t0.180392,\n\t\t\t0.629484,\n\t\t\t0.619753,\n\t\t\t0.756863,\n\t\t\t0.117647,\n\t\t\t0.754975,\n\t\t\t0.747131,\n\t\t\t0.882353,\n\t\t\t0.054902,\n\t\t\t0.876398,\n\t\t\t0.866812,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.988235,\n\t\t\t0.976471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"nic_Edge\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.191208,\n\t\t\t0.191208,\n\t\t\t0.191208,\n\t\t\t-0.87451,\n\t\t\t0.239484,\n\t\t\t0.00545035,\n\t\t\t0.614821,\n\t\t\t-0.74902,\n\t\t\t0.220593,\n\t\t\t0.0617459,\n\t\t\t0.863547,\n\t\t\t-0.623529,\n\t\t\t0.17509,\n\t\t\t0.278988,\n\t\t\t0.97794,\n\t\t\t-0.498039,\n\t\t\t0.143526,\n\t\t\t0.576069,\n\t\t\t0.998553,\n\t\t\t-0.372549,\n\t\t\t0.166456,\n\t\t\t0.871883,\n\t\t\t0.96594,\n\t\t\t-0.247059,\n\t\t\t0.376202,\n\t\t\t0.993555,\n\t\t\t0.981833,\n\t\t\t-0.121569,\n\t\t\t0.681996,\n\t\t\t0.991297,\n\t\t\t0.999239,\n\t\t\t0.00392157,\n\t\t\t0.954172,\n\t\t\t0.952734,\n\t\t\t0.94374,\n\t\t\t0.129412,\n\t\t\t0.999735,\n\t\t\t0.99301,\n\t\t\t0.662896,\n\t\t\t0.254902,\n\t\t\t0.979399,\n\t\t\t0.991466,\n\t\t\t0.357973,\n\t\t\t0.380392,\n\t\t\t0.968771,\n\t\t\t0.854967,\n\t\t\t0.162659,\n\t\t\t0.505882,\n\t\t\t0.999245,\n\t\t\t0.556697,\n\t\t\t0.144323,\n\t\t\t0.631373,\n\t\t\t0.973959,\n\t\t\t0.26223,\n\t\t\t0.177946,\n\t\t\t0.756863,\n\t\t\t0.852358,\n\t\t\t0.0526707,\n\t\t\t0.222974,\n\t\t\t0.882353,\n\t\t\t0.593889,\n\t\t\t0.00912724,\n\t\t\t0.238855,\n\t\t\t1,\n\t\t\t0.191208,\n\t\t\t0.191208,\n\t\t\t0.191208\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_iceFire_H\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t4.05432e-7,\n\t\t\t0,\n\t\t\t0.00000590122,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.120401,\n\t\t\t0.302675,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.216583,\n\t\t\t0.524574,\n\t\t\t-0.623529,\n\t\t\t0.0552475,\n\t\t\t0.345025,\n\t\t\t0.6595,\n\t\t\t-0.498039,\n\t\t\t0.128047,\n\t\t\t0.492588,\n\t\t\t0.720288,\n\t\t\t-0.372549,\n\t\t\t0.188955,\n\t\t\t0.641309,\n\t\t\t0.792092,\n\t\t\t-0.247059,\n\t\t\t0.327673,\n\t\t\t0.784935,\n\t\t\t0.873434,\n\t\t\t-0.121569,\n\t\t\t0.60824,\n\t\t\t0.892164,\n\t\t\t0.935547,\n\t\t\t0.00392157,\n\t\t\t0.881371,\n\t\t\t0.912178,\n\t\t\t0.818099,\n\t\t\t0.129412,\n\t\t\t0.951407,\n\t\t\t0.835621,\n\t\t\t0.449279,\n\t\t\t0.254902,\n\t\t\t0.904481,\n\t\t\t0.690489,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.85407,\n\t\t\t0.510864,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.777093,\n\t\t\t0.33018,\n\t\t\t0.00088199,\n\t\t\t0.631373,\n\t\t\t0.672862,\n\t\t\t0.139087,\n\t\t\t0.00269398,\n\t\t\t0.756863,\n\t\t\t0.508815,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.882353,\n\t\t\t0.299417,\n\t\t\t0.000366289,\n\t\t\t0.000547829,\n\t\t\t1,\n\t\t\t0.0157519,\n\t\t\t0.00332021,\n\t\t\t4.55569e-8\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_iceFire_L\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.870485,\n\t\t\t0.913768,\n\t\t\t0.832905,\n\t\t\t-0.87451,\n\t\t\t0.586919,\n\t\t\t0.887865,\n\t\t\t0.934003,\n\t\t\t-0.74902,\n\t\t\t0.31583,\n\t\t\t0.776442,\n\t\t\t0.867858,\n\t\t\t-0.623529,\n\t\t\t0.18302,\n\t\t\t0.632034,\n\t\t\t0.787722,\n\t\t\t-0.498039,\n\t\t\t0.117909,\n\t\t\t0.484134,\n\t\t\t0.713825,\n\t\t\t-0.372549,\n\t\t\t0.0507239,\n\t\t\t0.335979,\n\t\t\t0.654741,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.209874,\n\t\t\t0.511832,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.114689,\n\t\t\t0.28935,\n\t\t\t0.00392157,\n\t\t\t0.0157519,\n\t\t\t0.00332021,\n\t\t\t4.55569e-8,\n\t\t\t0.129412,\n\t\t\t0.312914,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.520865,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.680105,\n\t\t\t0.15255,\n\t\t\t0.0025996,\n\t\t\t0.505882,\n\t\t\t0.785109,\n\t\t\t0.339479,\n\t\t\t0.000797922,\n\t\t\t0.631373,\n\t\t\t0.857354,\n\t\t\t0.522494,\n\t\t\t0,\n\t\t\t0.756863,\n\t\t\t0.910974,\n\t\t\t0.699774,\n\t\t\t0,\n\t\t\t0.882353,\n\t\t\t0.951921,\n\t\t\t0.842817,\n\t\t\t0.478545,\n\t\t\t1,\n\t\t\t0.881371,\n\t\t\t0.912178,\n\t\t\t0.818099\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"hsv\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.666666,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t-0.333333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.33333,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.66666,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"hue_L60\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.964784,\n\t\t\t0.400592,\n\t\t\t0.349549,\n\t\t\t-0.87451,\n\t\t\t0.964915,\n\t\t\t0.372498,\n\t\t\t0.53785,\n\t\t\t-0.74902,\n\t\t\t0.892353,\n\t\t\t0.401039,\n\t\t\t0.759569,\n\t\t\t-0.623529,\n\t\t\t0.79263,\n\t\t\t0.446956,\n\t\t\t0.903017,\n\t\t\t-0.498039,\n\t\t\t0.682208,\n\t\t\t0.49954,\n\t\t\t0.966673,\n\t\t\t-0.372549,\n\t\t\t0.56392,\n\t\t\t0.553082,\n\t\t\t0.968836,\n\t\t\t-0.247059,\n\t\t\t0.442031,\n\t\t\t0.606396,\n\t\t\t0.901601,\n\t\t\t-0.121569,\n\t\t\t0.305499,\n\t\t\t0.65701,\n\t\t\t0.765784,\n\t\t\t0.00392157,\n\t\t\t0.197251,\n\t\t\t0.687914,\n\t\t\t0.620914,\n\t\t\t0.129412,\n\t\t\t0.193882,\n\t\t\t0.701887,\n\t\t\t0.472654,\n\t\t\t0.254902,\n\t\t\t0.249866,\n\t\t\t0.706123,\n\t\t\t0.320005,\n\t\t\t0.380392,\n\t\t\t0.35132,\n\t\t\t0.697417,\n\t\t\t0.202919,\n\t\t\t0.505882,\n\t\t\t0.498097,\n\t\t\t0.669467,\n\t\t\t0.125232,\n\t\t\t0.631373,\n\t\t\t0.637477,\n\t\t\t0.626239,\n\t\t\t0.107431,\n\t\t\t0.756863,\n\t\t\t0.762115,\n\t\t\t0.56872,\n\t\t\t0.155812,\n\t\t\t0.882353,\n\t\t\t0.889434,\n\t\t\t0.481116,\n\t\t\t0.240445,\n\t\t\t1,\n\t\t\t0.964784,\n\t\t\t0.400592,\n\t\t\t0.349549\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.8941176470588236,\n\t\t\t0.1019607843137255,\n\t\t\t0.1098039215686274,\n\t\t\t0.2156862745098039,\n\t\t\t0.4941176470588236,\n\t\t\t0.7215686274509804,\n\t\t\t0.3019607843137255,\n\t\t\t0.6862745098039216,\n\t\t\t0.2901960784313726,\n\t\t\t0.596078431372549,\n\t\t\t0.3058823529411765,\n\t\t\t0.6392156862745098,\n\t\t\t1,\n\t\t\t0.4980392156862745,\n\t\t\t0,\n\t\t\t0.6509803921568628,\n\t\t\t0.3372549019607843,\n\t\t\t0.1568627450980392\n\t\t],\n\t\tName: \"Spectrum\",\n\t\tNanColor: [\n\t\t\t0.6509803921568628,\n\t\t\t0.3372549019607843,\n\t\t\t0.1568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4745098039215686,\n\t\t\t0.09019607843137255,\n\t\t\t0.09019607843137255,\n\t\t\t0.7098039215686275,\n\t\t\t0.00392156862745098,\n\t\t\t0.00392156862745098,\n\t\t\t0.9372549019607843,\n\t\t\t0.2784313725490196,\n\t\t\t0.09803921568627451,\n\t\t\t0.9764705882352941,\n\t\t\t0.5137254901960784,\n\t\t\t0.1411764705882353,\n\t\t\t1,\n\t\t\t0.7058823529411765,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t0.02352941176470588\n\t\t],\n\t\tName: \"Warm\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t0.02352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4588235294117647,\n\t\t\t0.6941176470588235,\n\t\t\t0.00392156862745098,\n\t\t\t0.3450980392156863,\n\t\t\t0.5019607843137255,\n\t\t\t0.1607843137254902,\n\t\t\t0.3137254901960784,\n\t\t\t0.8431372549019608,\n\t\t\t0.7490196078431373,\n\t\t\t0.1098039215686274,\n\t\t\t0.5843137254901961,\n\t\t\t0.803921568627451,\n\t\t\t0.2313725490196079,\n\t\t\t0.407843137254902,\n\t\t\t0.6705882352941176,\n\t\t\t0.6039215686274509,\n\t\t\t0.407843137254902,\n\t\t\t1,\n\t\t\t0.3725490196078431,\n\t\t\t0.2,\n\t\t\t0.5019607843137255\n\t\t],\n\t\tName: \"Cool\",\n\t\tNanColor: [\n\t\t\t0.3725490196078431,\n\t\t\t0.2,\n\t\t\t0.5019607843137255\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.2313725490196079,\n\t\t\t0.407843137254902,\n\t\t\t0.6705882352941176,\n\t\t\t0.1098039215686274,\n\t\t\t0.5843137254901961,\n\t\t\t0.803921568627451,\n\t\t\t0.3058823529411765,\n\t\t\t0.8509803921568627,\n\t\t\t0.9176470588235294,\n\t\t\t0.4509803921568628,\n\t\t\t0.6039215686274509,\n\t\t\t0.8352941176470589,\n\t\t\t0.2588235294117647,\n\t\t\t0.2392156862745098,\n\t\t\t0.6627450980392157,\n\t\t\t0.3137254901960784,\n\t\t\t0.3294117647058823,\n\t\t\t0.5294117647058824,\n\t\t\t0.06274509803921569,\n\t\t\t0.1647058823529412,\n\t\t\t0.3215686274509804\n\t\t],\n\t\tName: \"Blues\",\n\t\tNanColor: [\n\t\t\t0.06274509803921569,\n\t\t\t0.1647058823529412,\n\t\t\t0.3215686274509804\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.1098039215686274,\n\t\t\t0.5843137254901961,\n\t\t\t0.803921568627451,\n\t\t\t0.2313725490196079,\n\t\t\t0.407843137254902,\n\t\t\t0.6705882352941176,\n\t\t\t0.4,\n\t\t\t0.2431372549019608,\n\t\t\t0.7176470588235294,\n\t\t\t0.6352941176470588,\n\t\t\t0.3294117647058823,\n\t\t\t0.8117647058823529,\n\t\t\t0.8705882352941177,\n\t\t\t0.3803921568627451,\n\t\t\t0.807843137254902,\n\t\t\t0.8627450980392157,\n\t\t\t0.3803921568627451,\n\t\t\t0.5843137254901961,\n\t\t\t0.2392156862745098,\n\t\t\t0.06274509803921569,\n\t\t\t0.3215686274509804\n\t\t],\n\t\tName: \"Wild Flower\",\n\t\tNanColor: [\n\t\t\t0.2392156862745098,\n\t\t\t0.06274509803921569,\n\t\t\t0.3215686274509804\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.396078431372549,\n\t\t\t0.4862745098039216,\n\t\t\t0.2156862745098039,\n\t\t\t0.4588235294117647,\n\t\t\t0.6941176470588235,\n\t\t\t0.00392156862745098,\n\t\t\t0.6980392156862745,\n\t\t\t0.7294117647058823,\n\t\t\t0.1882352941176471,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t0.02352941176470588,\n\t\t\t1,\n\t\t\t0.7058823529411765,\n\t\t\t0,\n\t\t\t0.9764705882352941,\n\t\t\t0.5137254901960784,\n\t\t\t0.1411764705882353\n\t\t],\n\t\tName: \"Citrus\",\n\t\tNanColor: [\n\t\t\t0.9764705882352941,\n\t\t\t0.5137254901960784,\n\t\t\t0.1411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4980392156862745,\n\t\t\t0.2313725490196079,\n\t\t\t0.03137254901960784,\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333,\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (11)\",\n\t\tNanColor: [\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4980392156862745,\n\t\t\t0.2313725490196079,\n\t\t\t0.03137254901960784,\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333,\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (10)\",\n\t\tNanColor: [\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (9)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (8)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.9450980392156862,\n\t\t\t0.6392156862745098,\n\t\t\t0.2509803921568627,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (7)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.9450980392156862,\n\t\t\t0.6392156862745098,\n\t\t\t0.2509803921568627,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (6)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9019607843137255,\n\t\t\t0.3803921568627451,\n\t\t\t0.00392156862745098,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (5)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9019607843137255,\n\t\t\t0.3803921568627451,\n\t\t\t0.00392156862745098,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (4)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9450980392156862,\n\t\t\t0.6392156862745098,\n\t\t\t0.2509803921568627,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (3)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6196078431372549,\n\t\t\t0.00392156862745098,\n\t\t\t0.2588235294117647,\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353,\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (11)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6196078431372549,\n\t\t\t0.00392156862745098,\n\t\t\t0.2588235294117647,\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353,\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (10)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (9)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (8)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3490196078431372,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (7)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3490196078431372,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (6)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8431372549019608,\n\t\t\t0.09803921568627451,\n\t\t\t0.1098039215686274,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (5)\",\n\t\tNanColor: [\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8431372549019608,\n\t\t\t0.09803921568627451,\n\t\t\t0.1098039215686274,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (4)\",\n\t\tNanColor: [\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3490196078431372,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (3)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1882352941176471,\n\t\t\t0.0196078431372549,\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922,\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (11)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1882352941176471,\n\t\t\t0.0196078431372549,\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922,\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (10)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (9)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (8)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.8470588235294118,\n\t\t\t0.7019607843137254,\n\t\t\t0.396078431372549,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (7)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.8470588235294118,\n\t\t\t0.7019607843137254,\n\t\t\t0.396078431372549,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (6)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6509803921568628,\n\t\t\t0.3803921568627451,\n\t\t\t0.1019607843137255,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (5)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6509803921568628,\n\t\t\t0.3803921568627451,\n\t\t\t0.1019607843137255,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (4)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8470588235294118,\n\t\t\t0.7019607843137254,\n\t\t\t0.396078431372549,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (3)\",\n\t\tNanColor: [\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8980392156862745,\n\t\t\t0.9607843137254902,\n\t\t\t0.9764705882352941,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.2549019607843137,\n\t\t\t0.6823529411764706,\n\t\t\t0.4627450980392157,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176,\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431,\n\t\t\t0,\n\t\t\t0.2666666666666667,\n\t\t\t0.1058823529411765\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (9)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.2666666666666667,\n\t\t\t0.1058823529411765\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8980392156862745,\n\t\t\t0.9607843137254902,\n\t\t\t0.9764705882352941,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.2549019607843137,\n\t\t\t0.6823529411764706,\n\t\t\t0.4627450980392157,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176,\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (8)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.2549019607843137,\n\t\t\t0.6823529411764706,\n\t\t\t0.4627450980392157,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176,\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (7)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431,\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (6)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.6980392156862745,\n\t\t\t0.8862745098039215,\n\t\t\t0.8862745098039215,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431,\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (5)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.6980392156862745,\n\t\t\t0.8862745098039215,\n\t\t\t0.8862745098039215,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (4)\",\n\t\tNanColor: [\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8980392156862745,\n\t\t\t0.9607843137254902,\n\t\t\t0.9764705882352941,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (3)\",\n\t\tNanColor: [\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t1,\n\t\t\t0.9686274509803922,\n\t\t\t0.7372549019607844,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.9254901960784314,\n\t\t\t0.4392156862745098,\n\t\t\t0.0784313725490196,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196,\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392,\n\t\t\t0.4,\n\t\t\t0.1450980392156863,\n\t\t\t0.02352941176470588\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (9)\",\n\t\tNanColor: [\n\t\t\t0.4,\n\t\t\t0.1450980392156863,\n\t\t\t0.02352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t1,\n\t\t\t0.9686274509803922,\n\t\t\t0.7372549019607844,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.9254901960784314,\n\t\t\t0.4392156862745098,\n\t\t\t0.0784313725490196,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196,\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (8)\",\n\t\tNanColor: [\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.9254901960784314,\n\t\t\t0.4392156862745098,\n\t\t\t0.0784313725490196,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196,\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (7)\",\n\t\tNanColor: [\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372,\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (6)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8509803921568627,\n\t\t\t0.5568627450980392,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372,\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (5)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8509803921568627,\n\t\t\t0.5568627450980392,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (4)\",\n\t\tNanColor: [\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t0.9686274509803922,\n\t\t\t0.7372549019607844,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (3)\",\n\t\tNanColor: [\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8784313725490196,\n\t\t\t0.9254901960784314,\n\t\t\t0.9568627450980393,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5490196078431373,\n\t\t\t0.4196078431372549,\n\t\t\t0.6941176470588235,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804,\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216,\n\t\t\t0.3019607843137255,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (9)\",\n\t\tNanColor: [\n\t\t\t0.3019607843137255,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8784313725490196,\n\t\t\t0.9254901960784314,\n\t\t\t0.9568627450980393,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5490196078431373,\n\t\t\t0.4196078431372549,\n\t\t\t0.6941176470588235,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804,\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (8)\",\n\t\tNanColor: [\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5490196078431373,\n\t\t\t0.4196078431372549,\n\t\t\t0.6941176470588235,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804,\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (7)\",\n\t\tNanColor: [\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137,\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (6)\",\n\t\tNanColor: [\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7019607843137254,\n\t\t\t0.803921568627451,\n\t\t\t0.8901960784313725,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137,\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (5)\",\n\t\tNanColor: [\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7019607843137254,\n\t\t\t0.803921568627451,\n\t\t\t0.8901960784313725,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (4)\",\n\t\tNanColor: [\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8784313725490196,\n\t\t\t0.9254901960784314,\n\t\t\t0.9568627450980393,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (3)\",\n\t\tNanColor: [\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4980392156862745,\n\t\t\t0.788235294117647,\n\t\t\t0.4980392156862745,\n\t\t\t0.7450980392156863,\n\t\t\t0.6823529411764706,\n\t\t\t0.8313725490196079,\n\t\t\t0.9921568627450981,\n\t\t\t0.7529411764705882,\n\t\t\t0.5254901960784314,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.6,\n\t\t\t0.2196078431372549,\n\t\t\t0.4235294117647059,\n\t\t\t0.6901960784313725,\n\t\t\t0.9411764705882353,\n\t\t\t0.00784313725490196,\n\t\t\t0.4980392156862745,\n\t\t\t0.7490196078431373,\n\t\t\t0.3568627450980392,\n\t\t\t0.09019607843137255,\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t],\n\t\tName: \"Brewer Qualitative Accent\",\n\t\tNanColor: [\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.1058823529411765,\n\t\t\t0.6196078431372549,\n\t\t\t0.4666666666666667,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.00784313725490196,\n\t\t\t0.4588235294117647,\n\t\t\t0.4392156862745098,\n\t\t\t0.7019607843137254,\n\t\t\t0.9058823529411765,\n\t\t\t0.1607843137254902,\n\t\t\t0.5411764705882353,\n\t\t\t0.4,\n\t\t\t0.6509803921568628,\n\t\t\t0.1176470588235294,\n\t\t\t0.9019607843137255,\n\t\t\t0.6705882352941176,\n\t\t\t0.00784313725490196,\n\t\t\t0.6509803921568628,\n\t\t\t0.4627450980392157,\n\t\t\t0.1137254901960784,\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t],\n\t\tName: \"Brewer Qualitative Dark2\",\n\t\tNanColor: [\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3843137254901961,\n\t\t\t0.5529411764705883,\n\t\t\t0.6274509803921569,\n\t\t\t0.796078431372549,\n\t\t\t0.9058823529411765,\n\t\t\t0.5411764705882353,\n\t\t\t0.7647058823529411,\n\t\t\t0.6509803921568628,\n\t\t\t0.8470588235294118,\n\t\t\t0.3294117647058823,\n\t\t\t1,\n\t\t\t0.8509803921568627,\n\t\t\t0.1843137254901961,\n\t\t\t0.8980392156862745,\n\t\t\t0.7686274509803922,\n\t\t\t0.5803921568627451,\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254\n\t\t],\n\t\tName: \"Brewer Qualitative Set2\",\n\t\tNanColor: [\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.8862745098039215,\n\t\t\t0.803921568627451,\n\t\t\t0.9921568627450981,\n\t\t\t0.803921568627451,\n\t\t\t0.6745098039215687,\n\t\t\t0.796078431372549,\n\t\t\t0.8352941176470589,\n\t\t\t0.9098039215686274,\n\t\t\t0.9568627450980393,\n\t\t\t0.792156862745098,\n\t\t\t0.8941176470588236,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.788235294117647,\n\t\t\t1,\n\t\t\t0.9490196078431372,\n\t\t\t0.6823529411764706,\n\t\t\t0.9450980392156862,\n\t\t\t0.8862745098039215,\n\t\t\t0.8,\n\t\t\t0.8,\n\t\t\t0.8,\n\t\t\t0.8\n\t\t],\n\t\tName: \"Brewer Qualitative Pastel2\",\n\t\tNanColor: [\n\t\t\t0.8,\n\t\t\t0.8,\n\t\t\t0.8\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.984313725490196,\n\t\t\t0.7058823529411765,\n\t\t\t0.6823529411764706,\n\t\t\t0.7019607843137254,\n\t\t\t0.803921568627451,\n\t\t\t0.8901960784313725,\n\t\t\t0.8,\n\t\t\t0.9215686274509803,\n\t\t\t0.7725490196078432,\n\t\t\t0.8705882352941177,\n\t\t\t0.796078431372549,\n\t\t\t0.8941176470588236,\n\t\t\t0.996078431372549,\n\t\t\t0.8509803921568627,\n\t\t\t0.6509803921568628,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.8980392156862745,\n\t\t\t0.8470588235294118,\n\t\t\t0.7411764705882353,\n\t\t\t0.9921568627450981,\n\t\t\t0.8549019607843137,\n\t\t\t0.9254901960784314,\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372\n\t\t],\n\t\tName: \"Brewer Qualitative Pastel1\",\n\t\tNanColor: [\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8941176470588236,\n\t\t\t0.1019607843137255,\n\t\t\t0.1098039215686274,\n\t\t\t0.2156862745098039,\n\t\t\t0.4941176470588236,\n\t\t\t0.7215686274509804,\n\t\t\t0.3019607843137255,\n\t\t\t0.6862745098039216,\n\t\t\t0.2901960784313726,\n\t\t\t0.596078431372549,\n\t\t\t0.3058823529411765,\n\t\t\t0.6392156862745098,\n\t\t\t1,\n\t\t\t0.4980392156862745,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.2,\n\t\t\t0.6509803921568628,\n\t\t\t0.3372549019607843,\n\t\t\t0.1568627450980392,\n\t\t\t0.9686274509803922,\n\t\t\t0.5058823529411764,\n\t\t\t0.7490196078431373,\n\t\t\t0.6,\n\t\t\t0.6,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Qualitative Set1\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.6,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6509803921568628,\n\t\t\t0.807843137254902,\n\t\t\t0.8901960784313725,\n\t\t\t0.1215686274509804,\n\t\t\t0.4705882352941176,\n\t\t\t0.7058823529411765,\n\t\t\t0.6980392156862745,\n\t\t\t0.8745098039215686,\n\t\t\t0.5411764705882353,\n\t\t\t0.2,\n\t\t\t0.6274509803921569,\n\t\t\t0.1725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.6039215686274509,\n\t\t\t0.6,\n\t\t\t0.8901960784313725,\n\t\t\t0.1019607843137255,\n\t\t\t0.1098039215686274,\n\t\t\t0.9921568627450981,\n\t\t\t0.7490196078431373,\n\t\t\t0.4352941176470588,\n\t\t\t1,\n\t\t\t0.4980392156862745,\n\t\t\t0,\n\t\t\t0.792156862745098,\n\t\t\t0.6980392156862745,\n\t\t\t0.8392156862745098,\n\t\t\t0.4156862745098039,\n\t\t\t0.2392156862745098,\n\t\t\t0.6039215686274509,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Qualitative Paired\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5529411764705883,\n\t\t\t0.8274509803921568,\n\t\t\t0.7803921568627451,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7019607843137254,\n\t\t\t0.7450980392156863,\n\t\t\t0.7294117647058823,\n\t\t\t0.8549019607843137,\n\t\t\t0.984313725490196,\n\t\t\t0.5019607843137255,\n\t\t\t0.4470588235294118,\n\t\t\t0.5019607843137255,\n\t\t\t0.6941176470588235,\n\t\t\t0.8274509803921568,\n\t\t\t0.9921568627450981,\n\t\t\t0.7058823529411765,\n\t\t\t0.3843137254901961,\n\t\t\t0.7019607843137254,\n\t\t\t0.8705882352941177,\n\t\t\t0.4117647058823529,\n\t\t\t0.9882352941176471,\n\t\t\t0.803921568627451,\n\t\t\t0.8980392156862745,\n\t\t\t0.8509803921568627,\n\t\t\t0.8509803921568627,\n\t\t\t0.8509803921568627,\n\t\t\t0.7372549019607844,\n\t\t\t0.5019607843137255,\n\t\t\t0.7411764705882353,\n\t\t\t0.8,\n\t\t\t0.9215686274509803,\n\t\t\t0.7725490196078432,\n\t\t\t1,\n\t\t\t0.9294117647058824,\n\t\t\t0.4352941176470588\n\t\t],\n\t\tName: \"Brewer Qualitative Set3\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0.9294117647058824,\n\t\t\t0.4352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.862745,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.695201,\n\t\t\t0\n\t\t],\n\t\tName: \"Traffic Lights\",\n\t\tNanColor: [\n\t\t\t0.803922,\n\t\t\t0,\n\t\t\t0.803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.908659,\n\t\t\t0.604013,\n\t\t\t0.581857,\n\t\t\t1,\n\t\t\t0.862745,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.695201,\n\t\t\t0\n\t\t],\n\t\tName: \"Traffic Lights For Deuteranopes\",\n\t\tNanColor: [\n\t\t\t0.803922,\n\t\t\t0,\n\t\t\t0.803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4196078431372549,\n\t\t\t0,\n\t\t\t0.07058823529411765,\n\t\t\t0.9019607843137255,\n\t\t\t0.9411764705882353,\n\t\t\t0.0196078431372549,\n\t\t\t0.01568627450980392,\n\t\t\t0.6196078431372549,\n\t\t\t0.00784313725490196\n\t\t],\n\t\tName: \"Traffic Lights For Deuteranopes 2\",\n\t\tNanColor: [\n\t\t\t0.803922,\n\t\t\t0,\n\t\t\t0.803922\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Muted Blue-Green\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.109804,\n\t\t\t0.27451,\n\t\t\t0.301961,\n\t\t\t0.02,\n\t\t\t0.129412,\n\t\t\t0.309804,\n\t\t\t0.341176,\n\t\t\t0.05,\n\t\t\t0.14902,\n\t\t\t0.341176,\n\t\t\t0.380392,\n\t\t\t0.1,\n\t\t\t0.188235,\n\t\t\t0.403922,\n\t\t\t0.458824,\n\t\t\t0.15,\n\t\t\t0.227451,\n\t\t\t0.447059,\n\t\t\t0.521569,\n\t\t\t0.2,\n\t\t\t0.290196,\n\t\t\t0.494118,\n\t\t\t0.588235,\n\t\t\t0.25,\n\t\t\t0.368627,\n\t\t\t0.552941,\n\t\t\t0.670588,\n\t\t\t0.3,\n\t\t\t0.458824,\n\t\t\t0.619608,\n\t\t\t0.74902,\n\t\t\t0.35,\n\t\t\t0.588235,\n\t\t\t0.713725,\n\t\t\t0.85098,\n\t\t\t0.4,\n\t\t\t0.72549,\n\t\t\t0.815686,\n\t\t\t0.941176,\n\t\t\t0.45,\n\t\t\t0.831373,\n\t\t\t0.882353,\n\t\t\t0.980392,\n\t\t\t0.475,\n\t\t\t0.909804,\n\t\t\t0.933333,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.980392,\n\t\t\t0.984314,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.996078,\n\t\t\t1,\n\t\t\t0.94902,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.980392,\n\t\t\t0.5,\n\t\t\t0.980392,\n\t\t\t0.984314,\n\t\t\t1,\n\t\t\t0.525,\n\t\t\t0.972549,\n\t\t\t0.988235,\n\t\t\t0.890196,\n\t\t\t0.55,\n\t\t\t0.917647,\n\t\t\t0.960784,\n\t\t\t0.835294,\n\t\t\t0.6,\n\t\t\t0.835294,\n\t\t\t0.921569,\n\t\t\t0.772549,\n\t\t\t0.65,\n\t\t\t0.768627,\n\t\t\t0.901961,\n\t\t\t0.737255,\n\t\t\t0.7,\n\t\t\t0.670588,\n\t\t\t0.831373,\n\t\t\t0.654902,\n\t\t\t0.75,\n\t\t\t0.576471,\n\t\t\t0.760784,\n\t\t\t0.584314,\n\t\t\t0.8,\n\t\t\t0.498039,\n\t\t\t0.678431,\n\t\t\t0.521569,\n\t\t\t0.85,\n\t\t\t0.392157,\n\t\t\t0.560784,\n\t\t\t0.427451,\n\t\t\t0.9,\n\t\t\t0.294118,\n\t\t\t0.45098,\n\t\t\t0.333333,\n\t\t\t0.95,\n\t\t\t0.211765,\n\t\t\t0.34902,\n\t\t\t0.254902,\n\t\t\t1,\n\t\t\t0.152941,\n\t\t\t0.278431,\n\t\t\t0.196078\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Green-Blue Asymmetric Divergent (62Blbc)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.121569,\n\t\t\t0.2,\n\t\t\t0.145098,\n\t\t\t0.05,\n\t\t\t0.196078,\n\t\t\t0.301961,\n\t\t\t0.223529,\n\t\t\t0.1,\n\t\t\t0.258824,\n\t\t\t0.4,\n\t\t\t0.278431,\n\t\t\t0.2,\n\t\t\t0.341176,\n\t\t\t0.54902,\n\t\t\t0.341176,\n\t\t\t0.25,\n\t\t\t0.419608,\n\t\t\t0.619608,\n\t\t\t0.376471,\n\t\t\t0.3,\n\t\t\t0.545098,\n\t\t\t0.701961,\n\t\t\t0.392157,\n\t\t\t0.35,\n\t\t\t0.643137,\n\t\t\t0.780392,\n\t\t\t0.403922,\n\t\t\t0.4,\n\t\t\t0.729412,\n\t\t\t0.819608,\n\t\t\t0.45098,\n\t\t\t0.45,\n\t\t\t0.811765,\n\t\t\t0.870588,\n\t\t\t0.521569,\n\t\t\t0.5,\n\t\t\t0.898039,\n\t\t\t0.909804,\n\t\t\t0.564706,\n\t\t\t0.55,\n\t\t\t0.941176,\n\t\t\t0.92549,\n\t\t\t0.686275,\n\t\t\t0.6,\n\t\t\t0.960784,\n\t\t\t0.94902,\n\t\t\t0.776471,\n\t\t\t0.64,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.65,\n\t\t\t0.890196,\n\t\t\t0.988235,\n\t\t\t0.972549,\n\t\t\t0.7,\n\t\t\t0.721569,\n\t\t\t0.894118,\n\t\t\t0.901961,\n\t\t\t0.75,\n\t\t\t0.631373,\n\t\t\t0.823529,\n\t\t\t0.839216,\n\t\t\t0.8,\n\t\t\t0.517647,\n\t\t\t0.662745,\n\t\t\t0.701961,\n\t\t\t0.85,\n\t\t\t0.384314,\n\t\t\t0.494118,\n\t\t\t0.54902,\n\t\t\t0.9,\n\t\t\t0.298039,\n\t\t\t0.360784,\n\t\t\t0.45098,\n\t\t\t0.95,\n\t\t\t0.223529,\n\t\t\t0.25098,\n\t\t\t0.34902,\n\t\t\t0.99,\n\t\t\t0.156863,\n\t\t\t0.172549,\n\t\t\t0.25098,\n\t\t\t1,\n\t\t\t0.137255,\n\t\t\t0.137255,\n\t\t\t0.188235\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Asymmtrical Earth Tones (6_21b)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.141176,\n\t\t\t0.14902,\n\t\t\t0.2,\n\t\t\t0.05,\n\t\t\t0.215686,\n\t\t\t0.258824,\n\t\t\t0.321569,\n\t\t\t0.1,\n\t\t\t0.243137,\n\t\t\t0.368627,\n\t\t\t0.380392,\n\t\t\t0.15,\n\t\t\t0.27451,\n\t\t\t0.439216,\n\t\t\t0.4,\n\t\t\t0.2,\n\t\t\t0.32549,\n\t\t\t0.501961,\n\t\t\t0.384314,\n\t\t\t0.25,\n\t\t\t0.403922,\n\t\t\t0.6,\n\t\t\t0.419608,\n\t\t\t0.3,\n\t\t\t0.486275,\n\t\t\t0.701961,\n\t\t\t0.454902,\n\t\t\t0.35,\n\t\t\t0.556863,\n\t\t\t0.74902,\n\t\t\t0.494118,\n\t\t\t0.4,\n\t\t\t0.670588,\n\t\t\t0.8,\n\t\t\t0.545098,\n\t\t\t0.5,\n\t\t\t0.854902,\n\t\t\t0.901961,\n\t\t\t0.631373,\n\t\t\t0.55,\n\t\t\t0.92549,\n\t\t\t0.941176,\n\t\t\t0.694118,\n\t\t\t0.6,\n\t\t\t0.960784,\n\t\t\t0.94902,\n\t\t\t0.776471,\n\t\t\t0.65,\n\t\t\t0.988235,\n\t\t\t0.968627,\n\t\t\t0.909804,\n\t\t\t0.7,\n\t\t\t0.839216,\n\t\t\t0.815686,\n\t\t\t0.772549,\n\t\t\t0.75,\n\t\t\t0.701961,\n\t\t\t0.662745,\n\t\t\t0.615686,\n\t\t\t0.8,\n\t\t\t0.6,\n\t\t\t0.529412,\n\t\t\t0.478431,\n\t\t\t0.85,\n\t\t\t0.501961,\n\t\t\t0.403922,\n\t\t\t0.360784,\n\t\t\t0.9,\n\t\t\t0.439216,\n\t\t\t0.313725,\n\t\t\t0.290196,\n\t\t\t1,\n\t\t\t0.301961,\n\t\t\t0.164706,\n\t\t\t0.176471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Yellow 15\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.002,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.05,\n\t\t\t0.984314,\n\t\t\t0.988235,\n\t\t\t0.843137,\n\t\t\t0.1,\n\t\t\t0.988235,\n\t\t\t0.988235,\n\t\t\t0.741176,\n\t\t\t0.15,\n\t\t\t0.980392,\n\t\t\t0.968627,\n\t\t\t0.654902,\n\t\t\t0.2,\n\t\t\t0.980392,\n\t\t\t0.945098,\n\t\t\t0.576471,\n\t\t\t0.25,\n\t\t\t0.968627,\n\t\t\t0.905882,\n\t\t\t0.486275,\n\t\t\t0.3,\n\t\t\t0.968627,\n\t\t\t0.862745,\n\t\t\t0.388235,\n\t\t\t0.35,\n\t\t\t0.960784,\n\t\t\t0.803922,\n\t\t\t0.286275,\n\t\t\t0.4,\n\t\t\t0.94902,\n\t\t\t0.741176,\n\t\t\t0.219608,\n\t\t\t0.45,\n\t\t\t0.941176,\n\t\t\t0.678431,\n\t\t\t0.14902,\n\t\t\t0.5,\n\t\t\t0.929412,\n\t\t\t0.607843,\n\t\t\t0.094118,\n\t\t\t0.55,\n\t\t\t0.921569,\n\t\t\t0.545098,\n\t\t\t0.054902,\n\t\t\t0.6,\n\t\t\t0.909804,\n\t\t\t0.486275,\n\t\t\t0.035294,\n\t\t\t0.65,\n\t\t\t0.890196,\n\t\t\t0.411765,\n\t\t\t0.019608,\n\t\t\t0.7,\n\t\t\t0.8,\n\t\t\t0.305882,\n\t\t\t0,\n\t\t\t0.75,\n\t\t\t0.760784,\n\t\t\t0.239216,\n\t\t\t0,\n\t\t\t0.8,\n\t\t\t0.678431,\n\t\t\t0.180392,\n\t\t\t0.011765,\n\t\t\t0.85,\n\t\t\t0.6,\n\t\t\t0.121569,\n\t\t\t0.023529,\n\t\t\t0.9,\n\t\t\t0.501961,\n\t\t\t0.054902,\n\t\t\t0.031373,\n\t\t\t0.95,\n\t\t\t0.4,\n\t\t\t0.039216,\n\t\t\t0.058824,\n\t\t\t1,\n\t\t\t0.301961,\n\t\t\t0.047059,\n\t\t\t0.090196\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Magma (matplotlib)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Nathaniel J. Smith & Stefan van der Walt\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.001462,\n\t\t\t0.000466,\n\t\t\t0.013866,\n\t\t\t0.003922,\n\t\t\t0.002258,\n\t\t\t0.001295,\n\t\t\t0.018331,\n\t\t\t0.007843,\n\t\t\t0.003279,\n\t\t\t0.002305,\n\t\t\t0.023708,\n\t\t\t0.011765,\n\t\t\t0.004512,\n\t\t\t0.00349,\n\t\t\t0.029965,\n\t\t\t0.015686,\n\t\t\t0.00595,\n\t\t\t0.004843,\n\t\t\t0.03713,\n\t\t\t0.019608,\n\t\t\t0.007588,\n\t\t\t0.006356,\n\t\t\t0.044973,\n\t\t\t0.023529,\n\t\t\t0.009426,\n\t\t\t0.008022,\n\t\t\t0.052844,\n\t\t\t0.027451,\n\t\t\t0.011465,\n\t\t\t0.009828,\n\t\t\t0.06075,\n\t\t\t0.031373,\n\t\t\t0.013708,\n\t\t\t0.011771,\n\t\t\t0.068667,\n\t\t\t0.035294,\n\t\t\t0.016156,\n\t\t\t0.01384,\n\t\t\t0.076603,\n\t\t\t0.039216,\n\t\t\t0.018815,\n\t\t\t0.016026,\n\t\t\t0.084584,\n\t\t\t0.043137,\n\t\t\t0.021692,\n\t\t\t0.01832,\n\t\t\t0.09261,\n\t\t\t0.047059,\n\t\t\t0.024792,\n\t\t\t0.020715,\n\t\t\t0.100676,\n\t\t\t0.05098,\n\t\t\t0.028123,\n\t\t\t0.023201,\n\t\t\t0.108787,\n\t\t\t0.054902,\n\t\t\t0.031696,\n\t\t\t0.025765,\n\t\t\t0.116965,\n\t\t\t0.058824,\n\t\t\t0.03552,\n\t\t\t0.028397,\n\t\t\t0.125209,\n\t\t\t0.062745,\n\t\t\t0.039608,\n\t\t\t0.03109,\n\t\t\t0.133515,\n\t\t\t0.066667,\n\t\t\t0.04383,\n\t\t\t0.03383,\n\t\t\t0.141886,\n\t\t\t0.070588,\n\t\t\t0.048062,\n\t\t\t0.036607,\n\t\t\t0.150327,\n\t\t\t0.07451,\n\t\t\t0.05232,\n\t\t\t0.039407,\n\t\t\t0.158841,\n\t\t\t0.078431,\n\t\t\t0.056615,\n\t\t\t0.04216,\n\t\t\t0.167446,\n\t\t\t0.082353,\n\t\t\t0.060949,\n\t\t\t0.044794,\n\t\t\t0.176129,\n\t\t\t0.086275,\n\t\t\t0.06533,\n\t\t\t0.047318,\n\t\t\t0.184892,\n\t\t\t0.090196,\n\t\t\t0.069764,\n\t\t\t0.049726,\n\t\t\t0.193735,\n\t\t\t0.094118,\n\t\t\t0.074257,\n\t\t\t0.052017,\n\t\t\t0.20266,\n\t\t\t0.098039,\n\t\t\t0.078815,\n\t\t\t0.054184,\n\t\t\t0.211667,\n\t\t\t0.101961,\n\t\t\t0.083446,\n\t\t\t0.056225,\n\t\t\t0.220755,\n\t\t\t0.105882,\n\t\t\t0.088155,\n\t\t\t0.058133,\n\t\t\t0.229922,\n\t\t\t0.109804,\n\t\t\t0.092949,\n\t\t\t0.059904,\n\t\t\t0.239164,\n\t\t\t0.113725,\n\t\t\t0.097833,\n\t\t\t0.061531,\n\t\t\t0.248477,\n\t\t\t0.117647,\n\t\t\t0.102815,\n\t\t\t0.06301,\n\t\t\t0.257854,\n\t\t\t0.121569,\n\t\t\t0.107899,\n\t\t\t0.064335,\n\t\t\t0.267289,\n\t\t\t0.12549,\n\t\t\t0.113094,\n\t\t\t0.065492,\n\t\t\t0.276784,\n\t\t\t0.129412,\n\t\t\t0.118405,\n\t\t\t0.066479,\n\t\t\t0.286321,\n\t\t\t0.133333,\n\t\t\t0.123833,\n\t\t\t0.067295,\n\t\t\t0.295879,\n\t\t\t0.137255,\n\t\t\t0.12938,\n\t\t\t0.067935,\n\t\t\t0.305443,\n\t\t\t0.141176,\n\t\t\t0.135053,\n\t\t\t0.068391,\n\t\t\t0.315,\n\t\t\t0.145098,\n\t\t\t0.140858,\n\t\t\t0.068654,\n\t\t\t0.324538,\n\t\t\t0.14902,\n\t\t\t0.146785,\n\t\t\t0.068738,\n\t\t\t0.334011,\n\t\t\t0.152941,\n\t\t\t0.152839,\n\t\t\t0.068637,\n\t\t\t0.343404,\n\t\t\t0.156863,\n\t\t\t0.159018,\n\t\t\t0.068354,\n\t\t\t0.352688,\n\t\t\t0.160784,\n\t\t\t0.165308,\n\t\t\t0.067911,\n\t\t\t0.361816,\n\t\t\t0.164706,\n\t\t\t0.171713,\n\t\t\t0.067305,\n\t\t\t0.370771,\n\t\t\t0.168627,\n\t\t\t0.178212,\n\t\t\t0.066576,\n\t\t\t0.379497,\n\t\t\t0.172549,\n\t\t\t0.184801,\n\t\t\t0.065732,\n\t\t\t0.387973,\n\t\t\t0.176471,\n\t\t\t0.19146,\n\t\t\t0.064818,\n\t\t\t0.396152,\n\t\t\t0.180392,\n\t\t\t0.198177,\n\t\t\t0.063862,\n\t\t\t0.404009,\n\t\t\t0.184314,\n\t\t\t0.204935,\n\t\t\t0.062907,\n\t\t\t0.411514,\n\t\t\t0.188235,\n\t\t\t0.211718,\n\t\t\t0.061992,\n\t\t\t0.418647,\n\t\t\t0.192157,\n\t\t\t0.218512,\n\t\t\t0.061158,\n\t\t\t0.425392,\n\t\t\t0.196078,\n\t\t\t0.225302,\n\t\t\t0.060445,\n\t\t\t0.431742,\n\t\t\t0.2,\n\t\t\t0.232077,\n\t\t\t0.059889,\n\t\t\t0.437695,\n\t\t\t0.203922,\n\t\t\t0.238826,\n\t\t\t0.059517,\n\t\t\t0.443256,\n\t\t\t0.207843,\n\t\t\t0.245543,\n\t\t\t0.059352,\n\t\t\t0.448436,\n\t\t\t0.211765,\n\t\t\t0.25222,\n\t\t\t0.059415,\n\t\t\t0.453248,\n\t\t\t0.215686,\n\t\t\t0.258857,\n\t\t\t0.059706,\n\t\t\t0.45771,\n\t\t\t0.219608,\n\t\t\t0.265447,\n\t\t\t0.060237,\n\t\t\t0.46184,\n\t\t\t0.223529,\n\t\t\t0.271994,\n\t\t\t0.060994,\n\t\t\t0.46566,\n\t\t\t0.227451,\n\t\t\t0.278493,\n\t\t\t0.061978,\n\t\t\t0.46919,\n\t\t\t0.231373,\n\t\t\t0.284951,\n\t\t\t0.063168,\n\t\t\t0.472451,\n\t\t\t0.235294,\n\t\t\t0.291366,\n\t\t\t0.064553,\n\t\t\t0.475462,\n\t\t\t0.239216,\n\t\t\t0.29774,\n\t\t\t0.066117,\n\t\t\t0.478243,\n\t\t\t0.243137,\n\t\t\t0.304081,\n\t\t\t0.067835,\n\t\t\t0.480812,\n\t\t\t0.247059,\n\t\t\t0.310382,\n\t\t\t0.069702,\n\t\t\t0.483186,\n\t\t\t0.25098,\n\t\t\t0.316654,\n\t\t\t0.07169,\n\t\t\t0.48538,\n\t\t\t0.254902,\n\t\t\t0.322899,\n\t\t\t0.073782,\n\t\t\t0.487408,\n\t\t\t0.258824,\n\t\t\t0.329114,\n\t\t\t0.075972,\n\t\t\t0.489287,\n\t\t\t0.262745,\n\t\t\t0.335308,\n\t\t\t0.078236,\n\t\t\t0.491024,\n\t\t\t0.266667,\n\t\t\t0.341482,\n\t\t\t0.080564,\n\t\t\t0.492631,\n\t\t\t0.270588,\n\t\t\t0.347636,\n\t\t\t0.082946,\n\t\t\t0.494121,\n\t\t\t0.27451,\n\t\t\t0.353773,\n\t\t\t0.085373,\n\t\t\t0.495501,\n\t\t\t0.278431,\n\t\t\t0.359898,\n\t\t\t0.087831,\n\t\t\t0.496778,\n\t\t\t0.282353,\n\t\t\t0.366012,\n\t\t\t0.090314,\n\t\t\t0.49796,\n\t\t\t0.286275,\n\t\t\t0.372116,\n\t\t\t0.092816,\n\t\t\t0.499053,\n\t\t\t0.290196,\n\t\t\t0.378211,\n\t\t\t0.095332,\n\t\t\t0.500067,\n\t\t\t0.294118,\n\t\t\t0.384299,\n\t\t\t0.097855,\n\t\t\t0.501002,\n\t\t\t0.298039,\n\t\t\t0.390384,\n\t\t\t0.100379,\n\t\t\t0.501864,\n\t\t\t0.301961,\n\t\t\t0.396467,\n\t\t\t0.102902,\n\t\t\t0.502658,\n\t\t\t0.305882,\n\t\t\t0.402548,\n\t\t\t0.10542,\n\t\t\t0.503386,\n\t\t\t0.309804,\n\t\t\t0.408629,\n\t\t\t0.10793,\n\t\t\t0.504052,\n\t\t\t0.313725,\n\t\t\t0.414709,\n\t\t\t0.110431,\n\t\t\t0.504662,\n\t\t\t0.317647,\n\t\t\t0.420791,\n\t\t\t0.11292,\n\t\t\t0.505215,\n\t\t\t0.321569,\n\t\t\t0.426877,\n\t\t\t0.115395,\n\t\t\t0.505714,\n\t\t\t0.32549,\n\t\t\t0.432967,\n\t\t\t0.117855,\n\t\t\t0.50616,\n\t\t\t0.329412,\n\t\t\t0.439062,\n\t\t\t0.120298,\n\t\t\t0.506555,\n\t\t\t0.333333,\n\t\t\t0.445163,\n\t\t\t0.122724,\n\t\t\t0.506901,\n\t\t\t0.337255,\n\t\t\t0.451271,\n\t\t\t0.125132,\n\t\t\t0.507198,\n\t\t\t0.341176,\n\t\t\t0.457386,\n\t\t\t0.127522,\n\t\t\t0.507448,\n\t\t\t0.345098,\n\t\t\t0.463508,\n\t\t\t0.129893,\n\t\t\t0.507652,\n\t\t\t0.34902,\n\t\t\t0.46964,\n\t\t\t0.132245,\n\t\t\t0.507809,\n\t\t\t0.352941,\n\t\t\t0.47578,\n\t\t\t0.134577,\n\t\t\t0.507921,\n\t\t\t0.356863,\n\t\t\t0.481929,\n\t\t\t0.136891,\n\t\t\t0.507989,\n\t\t\t0.360784,\n\t\t\t0.488088,\n\t\t\t0.139186,\n\t\t\t0.508011,\n\t\t\t0.364706,\n\t\t\t0.494258,\n\t\t\t0.141462,\n\t\t\t0.507988,\n\t\t\t0.368627,\n\t\t\t0.500438,\n\t\t\t0.143719,\n\t\t\t0.50792,\n\t\t\t0.372549,\n\t\t\t0.506629,\n\t\t\t0.145958,\n\t\t\t0.507806,\n\t\t\t0.376471,\n\t\t\t0.512831,\n\t\t\t0.148179,\n\t\t\t0.507648,\n\t\t\t0.380392,\n\t\t\t0.519045,\n\t\t\t0.150383,\n\t\t\t0.507443,\n\t\t\t0.384314,\n\t\t\t0.52527,\n\t\t\t0.152569,\n\t\t\t0.507192,\n\t\t\t0.388235,\n\t\t\t0.531507,\n\t\t\t0.154739,\n\t\t\t0.506895,\n\t\t\t0.392157,\n\t\t\t0.537755,\n\t\t\t0.156894,\n\t\t\t0.506551,\n\t\t\t0.396078,\n\t\t\t0.544015,\n\t\t\t0.159033,\n\t\t\t0.506159,\n\t\t\t0.4,\n\t\t\t0.550287,\n\t\t\t0.161158,\n\t\t\t0.505719,\n\t\t\t0.403922,\n\t\t\t0.556571,\n\t\t\t0.163269,\n\t\t\t0.50523,\n\t\t\t0.407843,\n\t\t\t0.562866,\n\t\t\t0.165368,\n\t\t\t0.504692,\n\t\t\t0.411765,\n\t\t\t0.569172,\n\t\t\t0.167454,\n\t\t\t0.504105,\n\t\t\t0.415686,\n\t\t\t0.57549,\n\t\t\t0.16953,\n\t\t\t0.503466,\n\t\t\t0.419608,\n\t\t\t0.581819,\n\t\t\t0.171596,\n\t\t\t0.502777,\n\t\t\t0.423529,\n\t\t\t0.588158,\n\t\t\t0.173652,\n\t\t\t0.502035,\n\t\t\t0.427451,\n\t\t\t0.594508,\n\t\t\t0.175701,\n\t\t\t0.501241,\n\t\t\t0.431373,\n\t\t\t0.600868,\n\t\t\t0.177743,\n\t\t\t0.500394,\n\t\t\t0.435294,\n\t\t\t0.607238,\n\t\t\t0.179779,\n\t\t\t0.499492,\n\t\t\t0.439216,\n\t\t\t0.613617,\n\t\t\t0.181811,\n\t\t\t0.498536,\n\t\t\t0.443137,\n\t\t\t0.620005,\n\t\t\t0.18384,\n\t\t\t0.497524,\n\t\t\t0.447059,\n\t\t\t0.626401,\n\t\t\t0.185867,\n\t\t\t0.496456,\n\t\t\t0.45098,\n\t\t\t0.632805,\n\t\t\t0.187893,\n\t\t\t0.495332,\n\t\t\t0.454902,\n\t\t\t0.639216,\n\t\t\t0.189921,\n\t\t\t0.49415,\n\t\t\t0.458824,\n\t\t\t0.645633,\n\t\t\t0.191952,\n\t\t\t0.49291,\n\t\t\t0.462745,\n\t\t\t0.652056,\n\t\t\t0.193986,\n\t\t\t0.491611,\n\t\t\t0.466667,\n\t\t\t0.658483,\n\t\t\t0.196027,\n\t\t\t0.490253,\n\t\t\t0.470588,\n\t\t\t0.664915,\n\t\t\t0.198075,\n\t\t\t0.488836,\n\t\t\t0.47451,\n\t\t\t0.671349,\n\t\t\t0.200133,\n\t\t\t0.487358,\n\t\t\t0.478431,\n\t\t\t0.677786,\n\t\t\t0.202203,\n\t\t\t0.485819,\n\t\t\t0.482353,\n\t\t\t0.684224,\n\t\t\t0.204286,\n\t\t\t0.484219,\n\t\t\t0.486275,\n\t\t\t0.690661,\n\t\t\t0.206384,\n\t\t\t0.482558,\n\t\t\t0.490196,\n\t\t\t0.697098,\n\t\t\t0.208501,\n\t\t\t0.480835,\n\t\t\t0.494118,\n\t\t\t0.703532,\n\t\t\t0.210638,\n\t\t\t0.479049,\n\t\t\t0.498039,\n\t\t\t0.709962,\n\t\t\t0.212797,\n\t\t\t0.477201,\n\t\t\t0.501961,\n\t\t\t0.716387,\n\t\t\t0.214982,\n\t\t\t0.47529,\n\t\t\t0.505882,\n\t\t\t0.722805,\n\t\t\t0.217194,\n\t\t\t0.473316,\n\t\t\t0.509804,\n\t\t\t0.729216,\n\t\t\t0.219437,\n\t\t\t0.471279,\n\t\t\t0.513725,\n\t\t\t0.735616,\n\t\t\t0.221713,\n\t\t\t0.46918,\n\t\t\t0.517647,\n\t\t\t0.742004,\n\t\t\t0.224025,\n\t\t\t0.467018,\n\t\t\t0.521569,\n\t\t\t0.748378,\n\t\t\t0.226377,\n\t\t\t0.464794,\n\t\t\t0.52549,\n\t\t\t0.754737,\n\t\t\t0.228772,\n\t\t\t0.462509,\n\t\t\t0.529412,\n\t\t\t0.761077,\n\t\t\t0.231214,\n\t\t\t0.460162,\n\t\t\t0.533333,\n\t\t\t0.767398,\n\t\t\t0.233705,\n\t\t\t0.457755,\n\t\t\t0.537255,\n\t\t\t0.773695,\n\t\t\t0.236249,\n\t\t\t0.455289,\n\t\t\t0.541176,\n\t\t\t0.779968,\n\t\t\t0.238851,\n\t\t\t0.452765,\n\t\t\t0.545098,\n\t\t\t0.786212,\n\t\t\t0.241514,\n\t\t\t0.450184,\n\t\t\t0.54902,\n\t\t\t0.792427,\n\t\t\t0.244242,\n\t\t\t0.447543,\n\t\t\t0.552941,\n\t\t\t0.798608,\n\t\t\t0.24704,\n\t\t\t0.444848,\n\t\t\t0.556863,\n\t\t\t0.804752,\n\t\t\t0.249911,\n\t\t\t0.442102,\n\t\t\t0.560784,\n\t\t\t0.810855,\n\t\t\t0.252861,\n\t\t\t0.439305,\n\t\t\t0.564706,\n\t\t\t0.816914,\n\t\t\t0.255895,\n\t\t\t0.436461,\n\t\t\t0.568627,\n\t\t\t0.822926,\n\t\t\t0.259016,\n\t\t\t0.433573,\n\t\t\t0.572549,\n\t\t\t0.828886,\n\t\t\t0.262229,\n\t\t\t0.430644,\n\t\t\t0.576471,\n\t\t\t0.834791,\n\t\t\t0.26554,\n\t\t\t0.427671,\n\t\t\t0.580392,\n\t\t\t0.840636,\n\t\t\t0.268953,\n\t\t\t0.424666,\n\t\t\t0.584314,\n\t\t\t0.846416,\n\t\t\t0.272473,\n\t\t\t0.421631,\n\t\t\t0.588235,\n\t\t\t0.852126,\n\t\t\t0.276106,\n\t\t\t0.418573,\n\t\t\t0.592157,\n\t\t\t0.857763,\n\t\t\t0.279857,\n\t\t\t0.415496,\n\t\t\t0.596078,\n\t\t\t0.86332,\n\t\t\t0.283729,\n\t\t\t0.412403,\n\t\t\t0.6,\n\t\t\t0.868793,\n\t\t\t0.287728,\n\t\t\t0.409303,\n\t\t\t0.603922,\n\t\t\t0.874176,\n\t\t\t0.291859,\n\t\t\t0.406205,\n\t\t\t0.607843,\n\t\t\t0.879464,\n\t\t\t0.296125,\n\t\t\t0.403118,\n\t\t\t0.611765,\n\t\t\t0.884651,\n\t\t\t0.30053,\n\t\t\t0.400047,\n\t\t\t0.615686,\n\t\t\t0.889731,\n\t\t\t0.305079,\n\t\t\t0.397002,\n\t\t\t0.619608,\n\t\t\t0.8947,\n\t\t\t0.309773,\n\t\t\t0.393995,\n\t\t\t0.623529,\n\t\t\t0.899552,\n\t\t\t0.314616,\n\t\t\t0.391037,\n\t\t\t0.627451,\n\t\t\t0.904281,\n\t\t\t0.31961,\n\t\t\t0.388137,\n\t\t\t0.631373,\n\t\t\t0.908884,\n\t\t\t0.324755,\n\t\t\t0.385308,\n\t\t\t0.635294,\n\t\t\t0.913354,\n\t\t\t0.330052,\n\t\t\t0.382563,\n\t\t\t0.639216,\n\t\t\t0.917689,\n\t\t\t0.3355,\n\t\t\t0.379915,\n\t\t\t0.643137,\n\t\t\t0.921884,\n\t\t\t0.341098,\n\t\t\t0.377376,\n\t\t\t0.647059,\n\t\t\t0.925937,\n\t\t\t0.346844,\n\t\t\t0.374959,\n\t\t\t0.65098,\n\t\t\t0.929845,\n\t\t\t0.352734,\n\t\t\t0.372677,\n\t\t\t0.654902,\n\t\t\t0.933606,\n\t\t\t0.358764,\n\t\t\t0.370541,\n\t\t\t0.658824,\n\t\t\t0.937221,\n\t\t\t0.364929,\n\t\t\t0.368567,\n\t\t\t0.662745,\n\t\t\t0.940687,\n\t\t\t0.371224,\n\t\t\t0.366762,\n\t\t\t0.666667,\n\t\t\t0.944006,\n\t\t\t0.377643,\n\t\t\t0.365136,\n\t\t\t0.670588,\n\t\t\t0.94718,\n\t\t\t0.384178,\n\t\t\t0.363701,\n\t\t\t0.67451,\n\t\t\t0.95021,\n\t\t\t0.39082,\n\t\t\t0.362468,\n\t\t\t0.678431,\n\t\t\t0.953099,\n\t\t\t0.397563,\n\t\t\t0.361438,\n\t\t\t0.682353,\n\t\t\t0.955849,\n\t\t\t0.4044,\n\t\t\t0.360619,\n\t\t\t0.686275,\n\t\t\t0.958464,\n\t\t\t0.411324,\n\t\t\t0.360014,\n\t\t\t0.690196,\n\t\t\t0.960949,\n\t\t\t0.418323,\n\t\t\t0.35963,\n\t\t\t0.694118,\n\t\t\t0.96331,\n\t\t\t0.42539,\n\t\t\t0.359469,\n\t\t\t0.698039,\n\t\t\t0.965549,\n\t\t\t0.432519,\n\t\t\t0.359529,\n\t\t\t0.701961,\n\t\t\t0.967671,\n\t\t\t0.439703,\n\t\t\t0.35981,\n\t\t\t0.705882,\n\t\t\t0.96968,\n\t\t\t0.446936,\n\t\t\t0.360311,\n\t\t\t0.709804,\n\t\t\t0.971582,\n\t\t\t0.45421,\n\t\t\t0.36103,\n\t\t\t0.713725,\n\t\t\t0.973381,\n\t\t\t0.46152,\n\t\t\t0.361965,\n\t\t\t0.717647,\n\t\t\t0.975082,\n\t\t\t0.468861,\n\t\t\t0.363111,\n\t\t\t0.721569,\n\t\t\t0.97669,\n\t\t\t0.476226,\n\t\t\t0.364466,\n\t\t\t0.72549,\n\t\t\t0.97821,\n\t\t\t0.483612,\n\t\t\t0.366025,\n\t\t\t0.729412,\n\t\t\t0.979645,\n\t\t\t0.491014,\n\t\t\t0.367783,\n\t\t\t0.733333,\n\t\t\t0.981,\n\t\t\t0.498428,\n\t\t\t0.369734,\n\t\t\t0.737255,\n\t\t\t0.982279,\n\t\t\t0.505851,\n\t\t\t0.371874,\n\t\t\t0.741176,\n\t\t\t0.983485,\n\t\t\t0.51328,\n\t\t\t0.374198,\n\t\t\t0.745098,\n\t\t\t0.984622,\n\t\t\t0.520713,\n\t\t\t0.376698,\n\t\t\t0.74902,\n\t\t\t0.985693,\n\t\t\t0.528148,\n\t\t\t0.379371,\n\t\t\t0.752941,\n\t\t\t0.9867,\n\t\t\t0.535582,\n\t\t\t0.38221,\n\t\t\t0.756863,\n\t\t\t0.987646,\n\t\t\t0.543015,\n\t\t\t0.38521,\n\t\t\t0.760784,\n\t\t\t0.988533,\n\t\t\t0.550446,\n\t\t\t0.388365,\n\t\t\t0.764706,\n\t\t\t0.989363,\n\t\t\t0.557873,\n\t\t\t0.391671,\n\t\t\t0.768627,\n\t\t\t0.990138,\n\t\t\t0.565296,\n\t\t\t0.395122,\n\t\t\t0.772549,\n\t\t\t0.990871,\n\t\t\t0.572706,\n\t\t\t0.398714,\n\t\t\t0.776471,\n\t\t\t0.991558,\n\t\t\t0.580107,\n\t\t\t0.402441,\n\t\t\t0.780392,\n\t\t\t0.992196,\n\t\t\t0.587502,\n\t\t\t0.406299,\n\t\t\t0.784314,\n\t\t\t0.992785,\n\t\t\t0.594891,\n\t\t\t0.410283,\n\t\t\t0.788235,\n\t\t\t0.993326,\n\t\t\t0.602275,\n\t\t\t0.41439,\n\t\t\t0.792157,\n\t\t\t0.993834,\n\t\t\t0.609644,\n\t\t\t0.418613,\n\t\t\t0.796078,\n\t\t\t0.994309,\n\t\t\t0.616999,\n\t\t\t0.42295,\n\t\t\t0.8,\n\t\t\t0.994738,\n\t\t\t0.62435,\n\t\t\t0.427397,\n\t\t\t0.803922,\n\t\t\t0.995122,\n\t\t\t0.631696,\n\t\t\t0.431951,\n\t\t\t0.807843,\n\t\t\t0.99548,\n\t\t\t0.639027,\n\t\t\t0.436607,\n\t\t\t0.811765,\n\t\t\t0.99581,\n\t\t\t0.646344,\n\t\t\t0.441361,\n\t\t\t0.815686,\n\t\t\t0.996096,\n\t\t\t0.653659,\n\t\t\t0.446213,\n\t\t\t0.819608,\n\t\t\t0.996341,\n\t\t\t0.660969,\n\t\t\t0.45116,\n\t\t\t0.823529,\n\t\t\t0.99658,\n\t\t\t0.668256,\n\t\t\t0.456192,\n\t\t\t0.827451,\n\t\t\t0.996775,\n\t\t\t0.675541,\n\t\t\t0.461314,\n\t\t\t0.831373,\n\t\t\t0.996925,\n\t\t\t0.682828,\n\t\t\t0.466526,\n\t\t\t0.835294,\n\t\t\t0.997077,\n\t\t\t0.690088,\n\t\t\t0.471811,\n\t\t\t0.839216,\n\t\t\t0.997186,\n\t\t\t0.697349,\n\t\t\t0.477182,\n\t\t\t0.843137,\n\t\t\t0.997254,\n\t\t\t0.704611,\n\t\t\t0.482635,\n\t\t\t0.847059,\n\t\t\t0.997325,\n\t\t\t0.711848,\n\t\t\t0.488154,\n\t\t\t0.85098,\n\t\t\t0.997351,\n\t\t\t0.719089,\n\t\t\t0.493755,\n\t\t\t0.854902,\n\t\t\t0.997351,\n\t\t\t0.726324,\n\t\t\t0.499428,\n\t\t\t0.858824,\n\t\t\t0.997341,\n\t\t\t0.733545,\n\t\t\t0.505167,\n\t\t\t0.862745,\n\t\t\t0.997285,\n\t\t\t0.740772,\n\t\t\t0.510983,\n\t\t\t0.866667,\n\t\t\t0.997228,\n\t\t\t0.747981,\n\t\t\t0.516859,\n\t\t\t0.870588,\n\t\t\t0.997138,\n\t\t\t0.75519,\n\t\t\t0.522806,\n\t\t\t0.87451,\n\t\t\t0.997019,\n\t\t\t0.762398,\n\t\t\t0.528821,\n\t\t\t0.878431,\n\t\t\t0.996898,\n\t\t\t0.769591,\n\t\t\t0.534892,\n\t\t\t0.882353,\n\t\t\t0.996727,\n\t\t\t0.776795,\n\t\t\t0.541039,\n\t\t\t0.886275,\n\t\t\t0.996571,\n\t\t\t0.783977,\n\t\t\t0.547233,\n\t\t\t0.890196,\n\t\t\t0.996369,\n\t\t\t0.791167,\n\t\t\t0.553499,\n\t\t\t0.894118,\n\t\t\t0.996162,\n\t\t\t0.798348,\n\t\t\t0.55982,\n\t\t\t0.898039,\n\t\t\t0.995932,\n\t\t\t0.805527,\n\t\t\t0.566202,\n\t\t\t0.901961,\n\t\t\t0.99568,\n\t\t\t0.812706,\n\t\t\t0.572645,\n\t\t\t0.905882,\n\t\t\t0.995424,\n\t\t\t0.819875,\n\t\t\t0.57914,\n\t\t\t0.909804,\n\t\t\t0.995131,\n\t\t\t0.827052,\n\t\t\t0.585701,\n\t\t\t0.913725,\n\t\t\t0.994851,\n\t\t\t0.834213,\n\t\t\t0.592307,\n\t\t\t0.917647,\n\t\t\t0.994524,\n\t\t\t0.841387,\n\t\t\t0.598983,\n\t\t\t0.921569,\n\t\t\t0.994222,\n\t\t\t0.84854,\n\t\t\t0.605696,\n\t\t\t0.92549,\n\t\t\t0.993866,\n\t\t\t0.855711,\n\t\t\t0.612482,\n\t\t\t0.929412,\n\t\t\t0.993545,\n\t\t\t0.862859,\n\t\t\t0.619299,\n\t\t\t0.933333,\n\t\t\t0.99317,\n\t\t\t0.870024,\n\t\t\t0.626189,\n\t\t\t0.937255,\n\t\t\t0.992831,\n\t\t\t0.877168,\n\t\t\t0.633109,\n\t\t\t0.941176,\n\t\t\t0.99244,\n\t\t\t0.88433,\n\t\t\t0.640099,\n\t\t\t0.945098,\n\t\t\t0.992089,\n\t\t\t0.89147,\n\t\t\t0.647116,\n\t\t\t0.94902,\n\t\t\t0.991688,\n\t\t\t0.898627,\n\t\t\t0.654202,\n\t\t\t0.952941,\n\t\t\t0.991332,\n\t\t\t0.905763,\n\t\t\t0.661309,\n\t\t\t0.956863,\n\t\t\t0.99093,\n\t\t\t0.912915,\n\t\t\t0.668481,\n\t\t\t0.960784,\n\t\t\t0.99057,\n\t\t\t0.920049,\n\t\t\t0.675675,\n\t\t\t0.964706,\n\t\t\t0.990175,\n\t\t\t0.927196,\n\t\t\t0.682926,\n\t\t\t0.968627,\n\t\t\t0.989815,\n\t\t\t0.934329,\n\t\t\t0.690198,\n\t\t\t0.972549,\n\t\t\t0.989434,\n\t\t\t0.94147,\n\t\t\t0.697519,\n\t\t\t0.976471,\n\t\t\t0.989077,\n\t\t\t0.948604,\n\t\t\t0.704863,\n\t\t\t0.980392,\n\t\t\t0.988717,\n\t\t\t0.955742,\n\t\t\t0.712242,\n\t\t\t0.984314,\n\t\t\t0.988367,\n\t\t\t0.962878,\n\t\t\t0.719649,\n\t\t\t0.988235,\n\t\t\t0.988033,\n\t\t\t0.970012,\n\t\t\t0.727077,\n\t\t\t0.992157,\n\t\t\t0.987691,\n\t\t\t0.977154,\n\t\t\t0.734536,\n\t\t\t0.996078,\n\t\t\t0.987387,\n\t\t\t0.984288,\n\t\t\t0.742002,\n\t\t\t1,\n\t\t\t0.987053,\n\t\t\t0.991438,\n\t\t\t0.749504\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Inferno (matplotlib)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Nathaniel J. Smith & Stefan van der Walt\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.001462,\n\t\t\t0.000466,\n\t\t\t0.013866,\n\t\t\t0.003922,\n\t\t\t0.002267,\n\t\t\t0.00127,\n\t\t\t0.01857,\n\t\t\t0.007843,\n\t\t\t0.003299,\n\t\t\t0.002249,\n\t\t\t0.024239,\n\t\t\t0.011765,\n\t\t\t0.004547,\n\t\t\t0.003392,\n\t\t\t0.030909,\n\t\t\t0.015686,\n\t\t\t0.006006,\n\t\t\t0.004692,\n\t\t\t0.038558,\n\t\t\t0.019608,\n\t\t\t0.007676,\n\t\t\t0.006136,\n\t\t\t0.046836,\n\t\t\t0.023529,\n\t\t\t0.009561,\n\t\t\t0.007713,\n\t\t\t0.055143,\n\t\t\t0.027451,\n\t\t\t0.011663,\n\t\t\t0.009417,\n\t\t\t0.06346,\n\t\t\t0.031373,\n\t\t\t0.013995,\n\t\t\t0.011225,\n\t\t\t0.071862,\n\t\t\t0.035294,\n\t\t\t0.016561,\n\t\t\t0.013136,\n\t\t\t0.080282,\n\t\t\t0.039216,\n\t\t\t0.019373,\n\t\t\t0.015133,\n\t\t\t0.088767,\n\t\t\t0.043137,\n\t\t\t0.022447,\n\t\t\t0.017199,\n\t\t\t0.097327,\n\t\t\t0.047059,\n\t\t\t0.025793,\n\t\t\t0.019331,\n\t\t\t0.10593,\n\t\t\t0.05098,\n\t\t\t0.029432,\n\t\t\t0.021503,\n\t\t\t0.114621,\n\t\t\t0.054902,\n\t\t\t0.033385,\n\t\t\t0.023702,\n\t\t\t0.123397,\n\t\t\t0.058824,\n\t\t\t0.037668,\n\t\t\t0.025921,\n\t\t\t0.132232,\n\t\t\t0.062745,\n\t\t\t0.042253,\n\t\t\t0.028139,\n\t\t\t0.141141,\n\t\t\t0.066667,\n\t\t\t0.046915,\n\t\t\t0.030324,\n\t\t\t0.150164,\n\t\t\t0.070588,\n\t\t\t0.051644,\n\t\t\t0.032474,\n\t\t\t0.159254,\n\t\t\t0.07451,\n\t\t\t0.056449,\n\t\t\t0.034569,\n\t\t\t0.168414,\n\t\t\t0.078431,\n\t\t\t0.06134,\n\t\t\t0.03659,\n\t\t\t0.177642,\n\t\t\t0.082353,\n\t\t\t0.066331,\n\t\t\t0.038504,\n\t\t\t0.186962,\n\t\t\t0.086275,\n\t\t\t0.071429,\n\t\t\t0.040294,\n\t\t\t0.196354,\n\t\t\t0.090196,\n\t\t\t0.076637,\n\t\t\t0.041905,\n\t\t\t0.205799,\n\t\t\t0.094118,\n\t\t\t0.081962,\n\t\t\t0.043328,\n\t\t\t0.215289,\n\t\t\t0.098039,\n\t\t\t0.087411,\n\t\t\t0.044556,\n\t\t\t0.224813,\n\t\t\t0.101961,\n\t\t\t0.09299,\n\t\t\t0.045583,\n\t\t\t0.234358,\n\t\t\t0.105882,\n\t\t\t0.098702,\n\t\t\t0.046402,\n\t\t\t0.243904,\n\t\t\t0.109804,\n\t\t\t0.104551,\n\t\t\t0.047008,\n\t\t\t0.25343,\n\t\t\t0.113725,\n\t\t\t0.110536,\n\t\t\t0.047399,\n\t\t\t0.262912,\n\t\t\t0.117647,\n\t\t\t0.116656,\n\t\t\t0.047574,\n\t\t\t0.272321,\n\t\t\t0.121569,\n\t\t\t0.122908,\n\t\t\t0.047536,\n\t\t\t0.281624,\n\t\t\t0.12549,\n\t\t\t0.129285,\n\t\t\t0.047293,\n\t\t\t0.290788,\n\t\t\t0.129412,\n\t\t\t0.135778,\n\t\t\t0.046856,\n\t\t\t0.299776,\n\t\t\t0.133333,\n\t\t\t0.142378,\n\t\t\t0.046242,\n\t\t\t0.308553,\n\t\t\t0.137255,\n\t\t\t0.149073,\n\t\t\t0.045468,\n\t\t\t0.317085,\n\t\t\t0.141176,\n\t\t\t0.15585,\n\t\t\t0.044559,\n\t\t\t0.325338,\n\t\t\t0.145098,\n\t\t\t0.162689,\n\t\t\t0.043554,\n\t\t\t0.333277,\n\t\t\t0.14902,\n\t\t\t0.169575,\n\t\t\t0.042489,\n\t\t\t0.340874,\n\t\t\t0.152941,\n\t\t\t0.176493,\n\t\t\t0.041402,\n\t\t\t0.348111,\n\t\t\t0.156863,\n\t\t\t0.183429,\n\t\t\t0.040329,\n\t\t\t0.354971,\n\t\t\t0.160784,\n\t\t\t0.190367,\n\t\t\t0.039309,\n\t\t\t0.361447,\n\t\t\t0.164706,\n\t\t\t0.197297,\n\t\t\t0.0384,\n\t\t\t0.367535,\n\t\t\t0.168627,\n\t\t\t0.204209,\n\t\t\t0.037632,\n\t\t\t0.373238,\n\t\t\t0.172549,\n\t\t\t0.211095,\n\t\t\t0.03703,\n\t\t\t0.378563,\n\t\t\t0.176471,\n\t\t\t0.217949,\n\t\t\t0.036615,\n\t\t\t0.383522,\n\t\t\t0.180392,\n\t\t\t0.224763,\n\t\t\t0.036405,\n\t\t\t0.388129,\n\t\t\t0.184314,\n\t\t\t0.231538,\n\t\t\t0.036405,\n\t\t\t0.3924,\n\t\t\t0.188235,\n\t\t\t0.238273,\n\t\t\t0.036621,\n\t\t\t0.396353,\n\t\t\t0.192157,\n\t\t\t0.244967,\n\t\t\t0.037055,\n\t\t\t0.400007,\n\t\t\t0.196078,\n\t\t\t0.25162,\n\t\t\t0.037705,\n\t\t\t0.403378,\n\t\t\t0.2,\n\t\t\t0.258234,\n\t\t\t0.038571,\n\t\t\t0.406485,\n\t\t\t0.203922,\n\t\t\t0.26481,\n\t\t\t0.039647,\n\t\t\t0.409345,\n\t\t\t0.207843,\n\t\t\t0.271347,\n\t\t\t0.040922,\n\t\t\t0.411976,\n\t\t\t0.211765,\n\t\t\t0.27785,\n\t\t\t0.042353,\n\t\t\t0.414392,\n\t\t\t0.215686,\n\t\t\t0.284321,\n\t\t\t0.043933,\n\t\t\t0.416608,\n\t\t\t0.219608,\n\t\t\t0.290763,\n\t\t\t0.045644,\n\t\t\t0.418637,\n\t\t\t0.223529,\n\t\t\t0.297178,\n\t\t\t0.04747,\n\t\t\t0.420491,\n\t\t\t0.227451,\n\t\t\t0.303568,\n\t\t\t0.049396,\n\t\t\t0.422182,\n\t\t\t0.231373,\n\t\t\t0.309935,\n\t\t\t0.051407,\n\t\t\t0.423721,\n\t\t\t0.235294,\n\t\t\t0.316282,\n\t\t\t0.05349,\n\t\t\t0.425116,\n\t\t\t0.239216,\n\t\t\t0.32261,\n\t\t\t0.055634,\n\t\t\t0.426377,\n\t\t\t0.243137,\n\t\t\t0.328921,\n\t\t\t0.057827,\n\t\t\t0.427511,\n\t\t\t0.247059,\n\t\t\t0.335217,\n\t\t\t0.06006,\n\t\t\t0.428524,\n\t\t\t0.25098,\n\t\t\t0.3415,\n\t\t\t0.062325,\n\t\t\t0.429425,\n\t\t\t0.254902,\n\t\t\t0.347771,\n\t\t\t0.064616,\n\t\t\t0.430217,\n\t\t\t0.258824,\n\t\t\t0.354032,\n\t\t\t0.066925,\n\t\t\t0.430906,\n\t\t\t0.262745,\n\t\t\t0.360284,\n\t\t\t0.069247,\n\t\t\t0.431497,\n\t\t\t0.266667,\n\t\t\t0.366529,\n\t\t\t0.071579,\n\t\t\t0.431994,\n\t\t\t0.270588,\n\t\t\t0.372768,\n\t\t\t0.073915,\n\t\t\t0.4324,\n\t\t\t0.27451,\n\t\t\t0.379001,\n\t\t\t0.076253,\n\t\t\t0.432719,\n\t\t\t0.278431,\n\t\t\t0.385228,\n\t\t\t0.078591,\n\t\t\t0.432955,\n\t\t\t0.282353,\n\t\t\t0.391453,\n\t\t\t0.080927,\n\t\t\t0.433109,\n\t\t\t0.286275,\n\t\t\t0.397674,\n\t\t\t0.083257,\n\t\t\t0.433183,\n\t\t\t0.290196,\n\t\t\t0.403894,\n\t\t\t0.08558,\n\t\t\t0.433179,\n\t\t\t0.294118,\n\t\t\t0.410113,\n\t\t\t0.087896,\n\t\t\t0.433098,\n\t\t\t0.298039,\n\t\t\t0.416331,\n\t\t\t0.090203,\n\t\t\t0.432943,\n\t\t\t0.301961,\n\t\t\t0.422549,\n\t\t\t0.092501,\n\t\t\t0.432714,\n\t\t\t0.305882,\n\t\t\t0.428768,\n\t\t\t0.09479,\n\t\t\t0.432412,\n\t\t\t0.309804,\n\t\t\t0.434987,\n\t\t\t0.097069,\n\t\t\t0.432039,\n\t\t\t0.313725,\n\t\t\t0.441207,\n\t\t\t0.099338,\n\t\t\t0.431594,\n\t\t\t0.317647,\n\t\t\t0.447428,\n\t\t\t0.101597,\n\t\t\t0.43108,\n\t\t\t0.321569,\n\t\t\t0.453651,\n\t\t\t0.103848,\n\t\t\t0.430498,\n\t\t\t0.32549,\n\t\t\t0.459875,\n\t\t\t0.106089,\n\t\t\t0.429846,\n\t\t\t0.329412,\n\t\t\t0.4661,\n\t\t\t0.108322,\n\t\t\t0.429125,\n\t\t\t0.333333,\n\t\t\t0.472328,\n\t\t\t0.110547,\n\t\t\t0.428334,\n\t\t\t0.337255,\n\t\t\t0.478558,\n\t\t\t0.112764,\n\t\t\t0.427475,\n\t\t\t0.341176,\n\t\t\t0.484789,\n\t\t\t0.114974,\n\t\t\t0.426548,\n\t\t\t0.345098,\n\t\t\t0.491022,\n\t\t\t0.117179,\n\t\t\t0.425552,\n\t\t\t0.34902,\n\t\t\t0.497257,\n\t\t\t0.119379,\n\t\t\t0.424488,\n\t\t\t0.352941,\n\t\t\t0.503493,\n\t\t\t0.121575,\n\t\t\t0.423356,\n\t\t\t0.356863,\n\t\t\t0.50973,\n\t\t\t0.123769,\n\t\t\t0.422156,\n\t\t\t0.360784,\n\t\t\t0.515967,\n\t\t\t0.12596,\n\t\t\t0.420887,\n\t\t\t0.364706,\n\t\t\t0.522206,\n\t\t\t0.12815,\n\t\t\t0.419549,\n\t\t\t0.368627,\n\t\t\t0.528444,\n\t\t\t0.130341,\n\t\t\t0.418142,\n\t\t\t0.372549,\n\t\t\t0.534683,\n\t\t\t0.132534,\n\t\t\t0.416667,\n\t\t\t0.376471,\n\t\t\t0.54092,\n\t\t\t0.134729,\n\t\t\t0.415123,\n\t\t\t0.380392,\n\t\t\t0.547157,\n\t\t\t0.136929,\n\t\t\t0.413511,\n\t\t\t0.384314,\n\t\t\t0.553392,\n\t\t\t0.139134,\n\t\t\t0.411829,\n\t\t\t0.388235,\n\t\t\t0.559624,\n\t\t\t0.141346,\n\t\t\t0.410078,\n\t\t\t0.392157,\n\t\t\t0.565854,\n\t\t\t0.143567,\n\t\t\t0.408258,\n\t\t\t0.396078,\n\t\t\t0.572081,\n\t\t\t0.145797,\n\t\t\t0.406369,\n\t\t\t0.4,\n\t\t\t0.578304,\n\t\t\t0.148039,\n\t\t\t0.404411,\n\t\t\t0.403922,\n\t\t\t0.584521,\n\t\t\t0.150294,\n\t\t\t0.402385,\n\t\t\t0.407843,\n\t\t\t0.590734,\n\t\t\t0.152563,\n\t\t\t0.40029,\n\t\t\t0.411765,\n\t\t\t0.59694,\n\t\t\t0.154848,\n\t\t\t0.398125,\n\t\t\t0.415686,\n\t\t\t0.603139,\n\t\t\t0.157151,\n\t\t\t0.395891,\n\t\t\t0.419608,\n\t\t\t0.60933,\n\t\t\t0.159474,\n\t\t\t0.393589,\n\t\t\t0.423529,\n\t\t\t0.615513,\n\t\t\t0.161817,\n\t\t\t0.391219,\n\t\t\t0.427451,\n\t\t\t0.621685,\n\t\t\t0.164184,\n\t\t\t0.388781,\n\t\t\t0.431373,\n\t\t\t0.627847,\n\t\t\t0.166575,\n\t\t\t0.386276,\n\t\t\t0.435294,\n\t\t\t0.633998,\n\t\t\t0.168992,\n\t\t\t0.383704,\n\t\t\t0.439216,\n\t\t\t0.640135,\n\t\t\t0.171438,\n\t\t\t0.381065,\n\t\t\t0.443137,\n\t\t\t0.64626,\n\t\t\t0.173914,\n\t\t\t0.378359,\n\t\t\t0.447059,\n\t\t\t0.652369,\n\t\t\t0.176421,\n\t\t\t0.375586,\n\t\t\t0.45098,\n\t\t\t0.658463,\n\t\t\t0.178962,\n\t\t\t0.372748,\n\t\t\t0.454902,\n\t\t\t0.66454,\n\t\t\t0.181539,\n\t\t\t0.369846,\n\t\t\t0.458824,\n\t\t\t0.670599,\n\t\t\t0.184153,\n\t\t\t0.366879,\n\t\t\t0.462745,\n\t\t\t0.676638,\n\t\t\t0.186807,\n\t\t\t0.363849,\n\t\t\t0.466667,\n\t\t\t0.682656,\n\t\t\t0.189501,\n\t\t\t0.360757,\n\t\t\t0.470588,\n\t\t\t0.688653,\n\t\t\t0.192239,\n\t\t\t0.357603,\n\t\t\t0.47451,\n\t\t\t0.694627,\n\t\t\t0.195021,\n\t\t\t0.354388,\n\t\t\t0.478431,\n\t\t\t0.700576,\n\t\t\t0.197851,\n\t\t\t0.351113,\n\t\t\t0.482353,\n\t\t\t0.7065,\n\t\t\t0.200728,\n\t\t\t0.347777,\n\t\t\t0.486275,\n\t\t\t0.712396,\n\t\t\t0.203656,\n\t\t\t0.344383,\n\t\t\t0.490196,\n\t\t\t0.718264,\n\t\t\t0.206636,\n\t\t\t0.340931,\n\t\t\t0.494118,\n\t\t\t0.724103,\n\t\t\t0.20967,\n\t\t\t0.337424,\n\t\t\t0.498039,\n\t\t\t0.729909,\n\t\t\t0.212759,\n\t\t\t0.333861,\n\t\t\t0.501961,\n\t\t\t0.735683,\n\t\t\t0.215906,\n\t\t\t0.330245,\n\t\t\t0.505882,\n\t\t\t0.741423,\n\t\t\t0.219112,\n\t\t\t0.326576,\n\t\t\t0.509804,\n\t\t\t0.747127,\n\t\t\t0.222378,\n\t\t\t0.322856,\n\t\t\t0.513725,\n\t\t\t0.752794,\n\t\t\t0.225706,\n\t\t\t0.319085,\n\t\t\t0.517647,\n\t\t\t0.758422,\n\t\t\t0.229097,\n\t\t\t0.315266,\n\t\t\t0.521569,\n\t\t\t0.76401,\n\t\t\t0.232554,\n\t\t\t0.311399,\n\t\t\t0.52549,\n\t\t\t0.769556,\n\t\t\t0.236077,\n\t\t\t0.307485,\n\t\t\t0.529412,\n\t\t\t0.775059,\n\t\t\t0.239667,\n\t\t\t0.303526,\n\t\t\t0.533333,\n\t\t\t0.780517,\n\t\t\t0.243327,\n\t\t\t0.299523,\n\t\t\t0.537255,\n\t\t\t0.785929,\n\t\t\t0.247056,\n\t\t\t0.295477,\n\t\t\t0.541176,\n\t\t\t0.791293,\n\t\t\t0.250856,\n\t\t\t0.29139,\n\t\t\t0.545098,\n\t\t\t0.796607,\n\t\t\t0.254728,\n\t\t\t0.287264,\n\t\t\t0.54902,\n\t\t\t0.801871,\n\t\t\t0.258674,\n\t\t\t0.283099,\n\t\t\t0.552941,\n\t\t\t0.807082,\n\t\t\t0.262692,\n\t\t\t0.278898,\n\t\t\t0.556863,\n\t\t\t0.812239,\n\t\t\t0.266786,\n\t\t\t0.274661,\n\t\t\t0.560784,\n\t\t\t0.817341,\n\t\t\t0.270954,\n\t\t\t0.27039,\n\t\t\t0.564706,\n\t\t\t0.822386,\n\t\t\t0.275197,\n\t\t\t0.266085,\n\t\t\t0.568627,\n\t\t\t0.827372,\n\t\t\t0.279517,\n\t\t\t0.26175,\n\t\t\t0.572549,\n\t\t\t0.832299,\n\t\t\t0.283913,\n\t\t\t0.257383,\n\t\t\t0.576471,\n\t\t\t0.837165,\n\t\t\t0.288385,\n\t\t\t0.252988,\n\t\t\t0.580392,\n\t\t\t0.841969,\n\t\t\t0.292933,\n\t\t\t0.248564,\n\t\t\t0.584314,\n\t\t\t0.846709,\n\t\t\t0.297559,\n\t\t\t0.244113,\n\t\t\t0.588235,\n\t\t\t0.851384,\n\t\t\t0.30226,\n\t\t\t0.239636,\n\t\t\t0.592157,\n\t\t\t0.855992,\n\t\t\t0.307038,\n\t\t\t0.235133,\n\t\t\t0.596078,\n\t\t\t0.860533,\n\t\t\t0.311892,\n\t\t\t0.230606,\n\t\t\t0.6,\n\t\t\t0.865006,\n\t\t\t0.316822,\n\t\t\t0.226055,\n\t\t\t0.603922,\n\t\t\t0.869409,\n\t\t\t0.321827,\n\t\t\t0.221482,\n\t\t\t0.607843,\n\t\t\t0.873741,\n\t\t\t0.326906,\n\t\t\t0.216886,\n\t\t\t0.611765,\n\t\t\t0.878001,\n\t\t\t0.33206,\n\t\t\t0.212268,\n\t\t\t0.615686,\n\t\t\t0.882188,\n\t\t\t0.337287,\n\t\t\t0.207628,\n\t\t\t0.619608,\n\t\t\t0.886302,\n\t\t\t0.342586,\n\t\t\t0.202968,\n\t\t\t0.623529,\n\t\t\t0.890341,\n\t\t\t0.347957,\n\t\t\t0.198286,\n\t\t\t0.627451,\n\t\t\t0.894305,\n\t\t\t0.353399,\n\t\t\t0.193584,\n\t\t\t0.631373,\n\t\t\t0.898192,\n\t\t\t0.358911,\n\t\t\t0.18886,\n\t\t\t0.635294,\n\t\t\t0.902003,\n\t\t\t0.364492,\n\t\t\t0.184116,\n\t\t\t0.639216,\n\t\t\t0.905735,\n\t\t\t0.37014,\n\t\t\t0.17935,\n\t\t\t0.643137,\n\t\t\t0.90939,\n\t\t\t0.375856,\n\t\t\t0.174563,\n\t\t\t0.647059,\n\t\t\t0.912966,\n\t\t\t0.381636,\n\t\t\t0.169755,\n\t\t\t0.65098,\n\t\t\t0.916462,\n\t\t\t0.387481,\n\t\t\t0.164924,\n\t\t\t0.654902,\n\t\t\t0.919879,\n\t\t\t0.393389,\n\t\t\t0.16007,\n\t\t\t0.658824,\n\t\t\t0.923215,\n\t\t\t0.399359,\n\t\t\t0.155193,\n\t\t\t0.662745,\n\t\t\t0.92647,\n\t\t\t0.405389,\n\t\t\t0.150292,\n\t\t\t0.666667,\n\t\t\t0.929644,\n\t\t\t0.411479,\n\t\t\t0.145367,\n\t\t\t0.670588,\n\t\t\t0.932737,\n\t\t\t0.417627,\n\t\t\t0.140417,\n\t\t\t0.67451,\n\t\t\t0.935747,\n\t\t\t0.423831,\n\t\t\t0.13544,\n\t\t\t0.678431,\n\t\t\t0.938675,\n\t\t\t0.430091,\n\t\t\t0.130438,\n\t\t\t0.682353,\n\t\t\t0.941521,\n\t\t\t0.436405,\n\t\t\t0.125409,\n\t\t\t0.686275,\n\t\t\t0.944285,\n\t\t\t0.442772,\n\t\t\t0.120354,\n\t\t\t0.690196,\n\t\t\t0.946965,\n\t\t\t0.449191,\n\t\t\t0.115272,\n\t\t\t0.694118,\n\t\t\t0.949562,\n\t\t\t0.45566,\n\t\t\t0.110164,\n\t\t\t0.698039,\n\t\t\t0.952075,\n\t\t\t0.462178,\n\t\t\t0.105031,\n\t\t\t0.701961,\n\t\t\t0.954506,\n\t\t\t0.468744,\n\t\t\t0.099874,\n\t\t\t0.705882,\n\t\t\t0.956852,\n\t\t\t0.475356,\n\t\t\t0.094695,\n\t\t\t0.709804,\n\t\t\t0.959114,\n\t\t\t0.482014,\n\t\t\t0.089499,\n\t\t\t0.713725,\n\t\t\t0.961293,\n\t\t\t0.488716,\n\t\t\t0.084289,\n\t\t\t0.717647,\n\t\t\t0.963387,\n\t\t\t0.495462,\n\t\t\t0.079073,\n\t\t\t0.721569,\n\t\t\t0.965397,\n\t\t\t0.502249,\n\t\t\t0.073859,\n\t\t\t0.72549,\n\t\t\t0.967322,\n\t\t\t0.509078,\n\t\t\t0.068659,\n\t\t\t0.729412,\n\t\t\t0.969163,\n\t\t\t0.515946,\n\t\t\t0.063488,\n\t\t\t0.733333,\n\t\t\t0.970919,\n\t\t\t0.522853,\n\t\t\t0.058367,\n\t\t\t0.737255,\n\t\t\t0.97259,\n\t\t\t0.529798,\n\t\t\t0.053324,\n\t\t\t0.741176,\n\t\t\t0.974176,\n\t\t\t0.53678,\n\t\t\t0.048392,\n\t\t\t0.745098,\n\t\t\t0.975677,\n\t\t\t0.543798,\n\t\t\t0.043618,\n\t\t\t0.74902,\n\t\t\t0.977092,\n\t\t\t0.55085,\n\t\t\t0.03905,\n\t\t\t0.752941,\n\t\t\t0.978422,\n\t\t\t0.557937,\n\t\t\t0.034931,\n\t\t\t0.756863,\n\t\t\t0.979666,\n\t\t\t0.565057,\n\t\t\t0.031409,\n\t\t\t0.760784,\n\t\t\t0.980824,\n\t\t\t0.572209,\n\t\t\t0.028508,\n\t\t\t0.764706,\n\t\t\t0.981895,\n\t\t\t0.579392,\n\t\t\t0.02625,\n\t\t\t0.768627,\n\t\t\t0.982881,\n\t\t\t0.586606,\n\t\t\t0.024661,\n\t\t\t0.772549,\n\t\t\t0.983779,\n\t\t\t0.593849,\n\t\t\t0.02377,\n\t\t\t0.776471,\n\t\t\t0.984591,\n\t\t\t0.601122,\n\t\t\t0.023606,\n\t\t\t0.780392,\n\t\t\t0.985315,\n\t\t\t0.608422,\n\t\t\t0.024202,\n\t\t\t0.784314,\n\t\t\t0.985952,\n\t\t\t0.61575,\n\t\t\t0.025592,\n\t\t\t0.788235,\n\t\t\t0.986502,\n\t\t\t0.623105,\n\t\t\t0.027814,\n\t\t\t0.792157,\n\t\t\t0.986964,\n\t\t\t0.630485,\n\t\t\t0.030908,\n\t\t\t0.796078,\n\t\t\t0.987337,\n\t\t\t0.63789,\n\t\t\t0.034916,\n\t\t\t0.8,\n\t\t\t0.987622,\n\t\t\t0.64532,\n\t\t\t0.039886,\n\t\t\t0.803922,\n\t\t\t0.987819,\n\t\t\t0.652773,\n\t\t\t0.045581,\n\t\t\t0.807843,\n\t\t\t0.987926,\n\t\t\t0.66025,\n\t\t\t0.05175,\n\t\t\t0.811765,\n\t\t\t0.987945,\n\t\t\t0.667748,\n\t\t\t0.058329,\n\t\t\t0.815686,\n\t\t\t0.987874,\n\t\t\t0.675267,\n\t\t\t0.065257,\n\t\t\t0.819608,\n\t\t\t0.987714,\n\t\t\t0.682807,\n\t\t\t0.072489,\n\t\t\t0.823529,\n\t\t\t0.987464,\n\t\t\t0.690366,\n\t\t\t0.07999,\n\t\t\t0.827451,\n\t\t\t0.987124,\n\t\t\t0.697944,\n\t\t\t0.087731,\n\t\t\t0.831373,\n\t\t\t0.986694,\n\t\t\t0.70554,\n\t\t\t0.095694,\n\t\t\t0.835294,\n\t\t\t0.986175,\n\t\t\t0.713153,\n\t\t\t0.103863,\n\t\t\t0.839216,\n\t\t\t0.985566,\n\t\t\t0.720782,\n\t\t\t0.112229,\n\t\t\t0.843137,\n\t\t\t0.984865,\n\t\t\t0.728427,\n\t\t\t0.120785,\n\t\t\t0.847059,\n\t\t\t0.984075,\n\t\t\t0.736087,\n\t\t\t0.129527,\n\t\t\t0.85098,\n\t\t\t0.983196,\n\t\t\t0.743758,\n\t\t\t0.138453,\n\t\t\t0.854902,\n\t\t\t0.982228,\n\t\t\t0.751442,\n\t\t\t0.147565,\n\t\t\t0.858824,\n\t\t\t0.981173,\n\t\t\t0.759135,\n\t\t\t0.156863,\n\t\t\t0.862745,\n\t\t\t0.980032,\n\t\t\t0.766837,\n\t\t\t0.166353,\n\t\t\t0.866667,\n\t\t\t0.978806,\n\t\t\t0.774545,\n\t\t\t0.176037,\n\t\t\t0.870588,\n\t\t\t0.977497,\n\t\t\t0.782258,\n\t\t\t0.185923,\n\t\t\t0.87451,\n\t\t\t0.976108,\n\t\t\t0.789974,\n\t\t\t0.196018,\n\t\t\t0.878431,\n\t\t\t0.974638,\n\t\t\t0.797692,\n\t\t\t0.206332,\n\t\t\t0.882353,\n\t\t\t0.973088,\n\t\t\t0.805409,\n\t\t\t0.216877,\n\t\t\t0.886275,\n\t\t\t0.971468,\n\t\t\t0.813122,\n\t\t\t0.227658,\n\t\t\t0.890196,\n\t\t\t0.969783,\n\t\t\t0.820825,\n\t\t\t0.238686,\n\t\t\t0.894118,\n\t\t\t0.968041,\n\t\t\t0.828515,\n\t\t\t0.249972,\n\t\t\t0.898039,\n\t\t\t0.966243,\n\t\t\t0.836191,\n\t\t\t0.261534,\n\t\t\t0.901961,\n\t\t\t0.964394,\n\t\t\t0.843848,\n\t\t\t0.273391,\n\t\t\t0.905882,\n\t\t\t0.962517,\n\t\t\t0.851476,\n\t\t\t0.285546,\n\t\t\t0.909804,\n\t\t\t0.960626,\n\t\t\t0.859069,\n\t\t\t0.29801,\n\t\t\t0.913725,\n\t\t\t0.95872,\n\t\t\t0.866624,\n\t\t\t0.31082,\n\t\t\t0.917647,\n\t\t\t0.956834,\n\t\t\t0.874129,\n\t\t\t0.323974,\n\t\t\t0.921569,\n\t\t\t0.954997,\n\t\t\t0.881569,\n\t\t\t0.337475,\n\t\t\t0.92549,\n\t\t\t0.953215,\n\t\t\t0.888942,\n\t\t\t0.351369,\n\t\t\t0.929412,\n\t\t\t0.951546,\n\t\t\t0.896226,\n\t\t\t0.365627,\n\t\t\t0.933333,\n\t\t\t0.950018,\n\t\t\t0.903409,\n\t\t\t0.380271,\n\t\t\t0.937255,\n\t\t\t0.948683,\n\t\t\t0.910473,\n\t\t\t0.395289,\n\t\t\t0.941176,\n\t\t\t0.947594,\n\t\t\t0.917399,\n\t\t\t0.410665,\n\t\t\t0.945098,\n\t\t\t0.946809,\n\t\t\t0.924168,\n\t\t\t0.426373,\n\t\t\t0.94902,\n\t\t\t0.946392,\n\t\t\t0.930761,\n\t\t\t0.442367,\n\t\t\t0.952941,\n\t\t\t0.946403,\n\t\t\t0.937159,\n\t\t\t0.458592,\n\t\t\t0.956863,\n\t\t\t0.946903,\n\t\t\t0.943348,\n\t\t\t0.47497,\n\t\t\t0.960784,\n\t\t\t0.947937,\n\t\t\t0.949318,\n\t\t\t0.491426,\n\t\t\t0.964706,\n\t\t\t0.949545,\n\t\t\t0.955063,\n\t\t\t0.50786,\n\t\t\t0.968627,\n\t\t\t0.95174,\n\t\t\t0.960587,\n\t\t\t0.524203,\n\t\t\t0.972549,\n\t\t\t0.954529,\n\t\t\t0.965896,\n\t\t\t0.540361,\n\t\t\t0.976471,\n\t\t\t0.957896,\n\t\t\t0.971003,\n\t\t\t0.556275,\n\t\t\t0.980392,\n\t\t\t0.961812,\n\t\t\t0.975924,\n\t\t\t0.571925,\n\t\t\t0.984314,\n\t\t\t0.966249,\n\t\t\t0.980678,\n\t\t\t0.587206,\n\t\t\t0.988235,\n\t\t\t0.971162,\n\t\t\t0.985282,\n\t\t\t0.602154,\n\t\t\t0.992157,\n\t\t\t0.976511,\n\t\t\t0.989753,\n\t\t\t0.61676,\n\t\t\t0.996078,\n\t\t\t0.982257,\n\t\t\t0.994109,\n\t\t\t0.631017,\n\t\t\t1,\n\t\t\t0.988362,\n\t\t\t0.998364,\n\t\t\t0.644924\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Plasma (matplotlib)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Nathaniel J. Smith & Stefan van der Walt\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.050383,\n\t\t\t0.029803,\n\t\t\t0.527975,\n\t\t\t0.003922,\n\t\t\t0.063536,\n\t\t\t0.028426,\n\t\t\t0.533124,\n\t\t\t0.007843,\n\t\t\t0.075353,\n\t\t\t0.027206,\n\t\t\t0.538007,\n\t\t\t0.011765,\n\t\t\t0.086222,\n\t\t\t0.026125,\n\t\t\t0.542658,\n\t\t\t0.015686,\n\t\t\t0.096379,\n\t\t\t0.025165,\n\t\t\t0.547103,\n\t\t\t0.019608,\n\t\t\t0.10598,\n\t\t\t0.024309,\n\t\t\t0.551368,\n\t\t\t0.023529,\n\t\t\t0.115124,\n\t\t\t0.023556,\n\t\t\t0.555468,\n\t\t\t0.027451,\n\t\t\t0.123903,\n\t\t\t0.022878,\n\t\t\t0.559423,\n\t\t\t0.031373,\n\t\t\t0.132381,\n\t\t\t0.022258,\n\t\t\t0.56325,\n\t\t\t0.035294,\n\t\t\t0.140603,\n\t\t\t0.021687,\n\t\t\t0.566959,\n\t\t\t0.039216,\n\t\t\t0.148607,\n\t\t\t0.021154,\n\t\t\t0.570562,\n\t\t\t0.043137,\n\t\t\t0.156421,\n\t\t\t0.020651,\n\t\t\t0.574065,\n\t\t\t0.047059,\n\t\t\t0.16407,\n\t\t\t0.020171,\n\t\t\t0.577478,\n\t\t\t0.05098,\n\t\t\t0.171574,\n\t\t\t0.019706,\n\t\t\t0.580806,\n\t\t\t0.054902,\n\t\t\t0.17895,\n\t\t\t0.019252,\n\t\t\t0.584054,\n\t\t\t0.058824,\n\t\t\t0.186213,\n\t\t\t0.018803,\n\t\t\t0.587228,\n\t\t\t0.062745,\n\t\t\t0.193374,\n\t\t\t0.018354,\n\t\t\t0.59033,\n\t\t\t0.066667,\n\t\t\t0.200445,\n\t\t\t0.017902,\n\t\t\t0.593364,\n\t\t\t0.070588,\n\t\t\t0.207435,\n\t\t\t0.017442,\n\t\t\t0.596333,\n\t\t\t0.07451,\n\t\t\t0.21435,\n\t\t\t0.016973,\n\t\t\t0.599239,\n\t\t\t0.078431,\n\t\t\t0.221197,\n\t\t\t0.016497,\n\t\t\t0.602083,\n\t\t\t0.082353,\n\t\t\t0.227983,\n\t\t\t0.016007,\n\t\t\t0.604867,\n\t\t\t0.086275,\n\t\t\t0.234715,\n\t\t\t0.015502,\n\t\t\t0.607592,\n\t\t\t0.090196,\n\t\t\t0.241396,\n\t\t\t0.014979,\n\t\t\t0.610259,\n\t\t\t0.094118,\n\t\t\t0.248032,\n\t\t\t0.014439,\n\t\t\t0.612868,\n\t\t\t0.098039,\n\t\t\t0.254627,\n\t\t\t0.013882,\n\t\t\t0.615419,\n\t\t\t0.101961,\n\t\t\t0.261183,\n\t\t\t0.013308,\n\t\t\t0.617911,\n\t\t\t0.105882,\n\t\t\t0.267703,\n\t\t\t0.012716,\n\t\t\t0.620346,\n\t\t\t0.109804,\n\t\t\t0.274191,\n\t\t\t0.012109,\n\t\t\t0.622722,\n\t\t\t0.113725,\n\t\t\t0.280648,\n\t\t\t0.011488,\n\t\t\t0.625038,\n\t\t\t0.117647,\n\t\t\t0.287076,\n\t\t\t0.010855,\n\t\t\t0.627295,\n\t\t\t0.121569,\n\t\t\t0.293478,\n\t\t\t0.010213,\n\t\t\t0.62949,\n\t\t\t0.12549,\n\t\t\t0.299855,\n\t\t\t0.009561,\n\t\t\t0.631624,\n\t\t\t0.129412,\n\t\t\t0.30621,\n\t\t\t0.008902,\n\t\t\t0.633694,\n\t\t\t0.133333,\n\t\t\t0.312543,\n\t\t\t0.008239,\n\t\t\t0.6357,\n\t\t\t0.137255,\n\t\t\t0.318856,\n\t\t\t0.007576,\n\t\t\t0.63764,\n\t\t\t0.141176,\n\t\t\t0.32515,\n\t\t\t0.006915,\n\t\t\t0.639512,\n\t\t\t0.145098,\n\t\t\t0.331426,\n\t\t\t0.006261,\n\t\t\t0.641316,\n\t\t\t0.14902,\n\t\t\t0.337683,\n\t\t\t0.005618,\n\t\t\t0.643049,\n\t\t\t0.152941,\n\t\t\t0.343925,\n\t\t\t0.004991,\n\t\t\t0.64471,\n\t\t\t0.156863,\n\t\t\t0.35015,\n\t\t\t0.004382,\n\t\t\t0.646298,\n\t\t\t0.160784,\n\t\t\t0.356359,\n\t\t\t0.003798,\n\t\t\t0.64781,\n\t\t\t0.164706,\n\t\t\t0.362553,\n\t\t\t0.003243,\n\t\t\t0.649245,\n\t\t\t0.168627,\n\t\t\t0.368733,\n\t\t\t0.002724,\n\t\t\t0.650601,\n\t\t\t0.172549,\n\t\t\t0.374897,\n\t\t\t0.002245,\n\t\t\t0.651876,\n\t\t\t0.176471,\n\t\t\t0.381047,\n\t\t\t0.001814,\n\t\t\t0.653068,\n\t\t\t0.180392,\n\t\t\t0.387183,\n\t\t\t0.001434,\n\t\t\t0.654177,\n\t\t\t0.184314,\n\t\t\t0.393304,\n\t\t\t0.001114,\n\t\t\t0.655199,\n\t\t\t0.188235,\n\t\t\t0.399411,\n\t\t\t0.000859,\n\t\t\t0.656133,\n\t\t\t0.192157,\n\t\t\t0.405503,\n\t\t\t0.000678,\n\t\t\t0.656977,\n\t\t\t0.196078,\n\t\t\t0.41158,\n\t\t\t0.000577,\n\t\t\t0.65773,\n\t\t\t0.2,\n\t\t\t0.417642,\n\t\t\t0.000564,\n\t\t\t0.65839,\n\t\t\t0.203922,\n\t\t\t0.423689,\n\t\t\t0.000646,\n\t\t\t0.658956,\n\t\t\t0.207843,\n\t\t\t0.429719,\n\t\t\t0.000831,\n\t\t\t0.659425,\n\t\t\t0.211765,\n\t\t\t0.435734,\n\t\t\t0.001127,\n\t\t\t0.659797,\n\t\t\t0.215686,\n\t\t\t0.441732,\n\t\t\t0.00154,\n\t\t\t0.660069,\n\t\t\t0.219608,\n\t\t\t0.447714,\n\t\t\t0.00208,\n\t\t\t0.66024,\n\t\t\t0.223529,\n\t\t\t0.453677,\n\t\t\t0.002755,\n\t\t\t0.66031,\n\t\t\t0.227451,\n\t\t\t0.459623,\n\t\t\t0.003574,\n\t\t\t0.660277,\n\t\t\t0.231373,\n\t\t\t0.46555,\n\t\t\t0.004545,\n\t\t\t0.660139,\n\t\t\t0.235294,\n\t\t\t0.471457,\n\t\t\t0.005678,\n\t\t\t0.659897,\n\t\t\t0.239216,\n\t\t\t0.477344,\n\t\t\t0.00698,\n\t\t\t0.659549,\n\t\t\t0.243137,\n\t\t\t0.48321,\n\t\t\t0.00846,\n\t\t\t0.659095,\n\t\t\t0.247059,\n\t\t\t0.489055,\n\t\t\t0.010127,\n\t\t\t0.658534,\n\t\t\t0.25098,\n\t\t\t0.494877,\n\t\t\t0.01199,\n\t\t\t0.657865,\n\t\t\t0.254902,\n\t\t\t0.500678,\n\t\t\t0.014055,\n\t\t\t0.657088,\n\t\t\t0.258824,\n\t\t\t0.506454,\n\t\t\t0.016333,\n\t\t\t0.656202,\n\t\t\t0.262745,\n\t\t\t0.512206,\n\t\t\t0.018833,\n\t\t\t0.655209,\n\t\t\t0.266667,\n\t\t\t0.517933,\n\t\t\t0.021563,\n\t\t\t0.654109,\n\t\t\t0.270588,\n\t\t\t0.523633,\n\t\t\t0.024532,\n\t\t\t0.652901,\n\t\t\t0.27451,\n\t\t\t0.529306,\n\t\t\t0.027747,\n\t\t\t0.651586,\n\t\t\t0.278431,\n\t\t\t0.534952,\n\t\t\t0.031217,\n\t\t\t0.650165,\n\t\t\t0.282353,\n\t\t\t0.54057,\n\t\t\t0.03495,\n\t\t\t0.64864,\n\t\t\t0.286275,\n\t\t\t0.546157,\n\t\t\t0.038954,\n\t\t\t0.64701,\n\t\t\t0.290196,\n\t\t\t0.551715,\n\t\t\t0.043136,\n\t\t\t0.645277,\n\t\t\t0.294118,\n\t\t\t0.557243,\n\t\t\t0.047331,\n\t\t\t0.643443,\n\t\t\t0.298039,\n\t\t\t0.562738,\n\t\t\t0.051545,\n\t\t\t0.641509,\n\t\t\t0.301961,\n\t\t\t0.568201,\n\t\t\t0.055778,\n\t\t\t0.639477,\n\t\t\t0.305882,\n\t\t\t0.573632,\n\t\t\t0.060028,\n\t\t\t0.637349,\n\t\t\t0.309804,\n\t\t\t0.579029,\n\t\t\t0.064296,\n\t\t\t0.635126,\n\t\t\t0.313725,\n\t\t\t0.584391,\n\t\t\t0.068579,\n\t\t\t0.632812,\n\t\t\t0.317647,\n\t\t\t0.589719,\n\t\t\t0.072878,\n\t\t\t0.630408,\n\t\t\t0.321569,\n\t\t\t0.595011,\n\t\t\t0.07719,\n\t\t\t0.627917,\n\t\t\t0.32549,\n\t\t\t0.600266,\n\t\t\t0.081516,\n\t\t\t0.625342,\n\t\t\t0.329412,\n\t\t\t0.605485,\n\t\t\t0.085854,\n\t\t\t0.622686,\n\t\t\t0.333333,\n\t\t\t0.610667,\n\t\t\t0.090204,\n\t\t\t0.619951,\n\t\t\t0.337255,\n\t\t\t0.615812,\n\t\t\t0.094564,\n\t\t\t0.61714,\n\t\t\t0.341176,\n\t\t\t0.620919,\n\t\t\t0.098934,\n\t\t\t0.614257,\n\t\t\t0.345098,\n\t\t\t0.625987,\n\t\t\t0.103312,\n\t\t\t0.611305,\n\t\t\t0.34902,\n\t\t\t0.631017,\n\t\t\t0.107699,\n\t\t\t0.608287,\n\t\t\t0.352941,\n\t\t\t0.636008,\n\t\t\t0.112092,\n\t\t\t0.605205,\n\t\t\t0.356863,\n\t\t\t0.640959,\n\t\t\t0.116492,\n\t\t\t0.602065,\n\t\t\t0.360784,\n\t\t\t0.645872,\n\t\t\t0.120898,\n\t\t\t0.598867,\n\t\t\t0.364706,\n\t\t\t0.650746,\n\t\t\t0.125309,\n\t\t\t0.595617,\n\t\t\t0.368627,\n\t\t\t0.65558,\n\t\t\t0.129725,\n\t\t\t0.592317,\n\t\t\t0.372549,\n\t\t\t0.660374,\n\t\t\t0.134144,\n\t\t\t0.588971,\n\t\t\t0.376471,\n\t\t\t0.665129,\n\t\t\t0.138566,\n\t\t\t0.585582,\n\t\t\t0.380392,\n\t\t\t0.669845,\n\t\t\t0.142992,\n\t\t\t0.582154,\n\t\t\t0.384314,\n\t\t\t0.674522,\n\t\t\t0.147419,\n\t\t\t0.578688,\n\t\t\t0.388235,\n\t\t\t0.67916,\n\t\t\t0.151848,\n\t\t\t0.575189,\n\t\t\t0.392157,\n\t\t\t0.683758,\n\t\t\t0.156278,\n\t\t\t0.57166,\n\t\t\t0.396078,\n\t\t\t0.688318,\n\t\t\t0.160709,\n\t\t\t0.568103,\n\t\t\t0.4,\n\t\t\t0.69284,\n\t\t\t0.165141,\n\t\t\t0.564522,\n\t\t\t0.403922,\n\t\t\t0.697324,\n\t\t\t0.169573,\n\t\t\t0.560919,\n\t\t\t0.407843,\n\t\t\t0.701769,\n\t\t\t0.174005,\n\t\t\t0.557296,\n\t\t\t0.411765,\n\t\t\t0.706178,\n\t\t\t0.178437,\n\t\t\t0.553657,\n\t\t\t0.415686,\n\t\t\t0.710549,\n\t\t\t0.182868,\n\t\t\t0.550004,\n\t\t\t0.419608,\n\t\t\t0.714883,\n\t\t\t0.187299,\n\t\t\t0.546338,\n\t\t\t0.423529,\n\t\t\t0.719181,\n\t\t\t0.191729,\n\t\t\t0.542663,\n\t\t\t0.427451,\n\t\t\t0.723444,\n\t\t\t0.196158,\n\t\t\t0.538981,\n\t\t\t0.431373,\n\t\t\t0.72767,\n\t\t\t0.200586,\n\t\t\t0.535293,\n\t\t\t0.435294,\n\t\t\t0.731862,\n\t\t\t0.205013,\n\t\t\t0.531601,\n\t\t\t0.439216,\n\t\t\t0.736019,\n\t\t\t0.209439,\n\t\t\t0.527908,\n\t\t\t0.443137,\n\t\t\t0.740143,\n\t\t\t0.213864,\n\t\t\t0.524216,\n\t\t\t0.447059,\n\t\t\t0.744232,\n\t\t\t0.218288,\n\t\t\t0.520524,\n\t\t\t0.45098,\n\t\t\t0.748289,\n\t\t\t0.222711,\n\t\t\t0.516834,\n\t\t\t0.454902,\n\t\t\t0.752312,\n\t\t\t0.227133,\n\t\t\t0.513149,\n\t\t\t0.458824,\n\t\t\t0.756304,\n\t\t\t0.231555,\n\t\t\t0.509468,\n\t\t\t0.462745,\n\t\t\t0.760264,\n\t\t\t0.235976,\n\t\t\t0.505794,\n\t\t\t0.466667,\n\t\t\t0.764193,\n\t\t\t0.240396,\n\t\t\t0.502126,\n\t\t\t0.470588,\n\t\t\t0.76809,\n\t\t\t0.244817,\n\t\t\t0.498465,\n\t\t\t0.47451,\n\t\t\t0.771958,\n\t\t\t0.249237,\n\t\t\t0.494813,\n\t\t\t0.478431,\n\t\t\t0.775796,\n\t\t\t0.253658,\n\t\t\t0.491171,\n\t\t\t0.482353,\n\t\t\t0.779604,\n\t\t\t0.258078,\n\t\t\t0.487539,\n\t\t\t0.486275,\n\t\t\t0.783383,\n\t\t\t0.2625,\n\t\t\t0.483918,\n\t\t\t0.490196,\n\t\t\t0.787133,\n\t\t\t0.266922,\n\t\t\t0.480307,\n\t\t\t0.494118,\n\t\t\t0.790855,\n\t\t\t0.271345,\n\t\t\t0.476706,\n\t\t\t0.498039,\n\t\t\t0.794549,\n\t\t\t0.27577,\n\t\t\t0.473117,\n\t\t\t0.501961,\n\t\t\t0.798216,\n\t\t\t0.280197,\n\t\t\t0.469538,\n\t\t\t0.505882,\n\t\t\t0.801855,\n\t\t\t0.284626,\n\t\t\t0.465971,\n\t\t\t0.509804,\n\t\t\t0.805467,\n\t\t\t0.289057,\n\t\t\t0.462415,\n\t\t\t0.513725,\n\t\t\t0.809052,\n\t\t\t0.293491,\n\t\t\t0.45887,\n\t\t\t0.517647,\n\t\t\t0.812612,\n\t\t\t0.297928,\n\t\t\t0.455338,\n\t\t\t0.521569,\n\t\t\t0.816144,\n\t\t\t0.302368,\n\t\t\t0.451816,\n\t\t\t0.52549,\n\t\t\t0.819651,\n\t\t\t0.306812,\n\t\t\t0.448306,\n\t\t\t0.529412,\n\t\t\t0.823132,\n\t\t\t0.311261,\n\t\t\t0.444806,\n\t\t\t0.533333,\n\t\t\t0.826588,\n\t\t\t0.315714,\n\t\t\t0.441316,\n\t\t\t0.537255,\n\t\t\t0.830018,\n\t\t\t0.320172,\n\t\t\t0.437836,\n\t\t\t0.541176,\n\t\t\t0.833422,\n\t\t\t0.324635,\n\t\t\t0.434366,\n\t\t\t0.545098,\n\t\t\t0.836801,\n\t\t\t0.329105,\n\t\t\t0.430905,\n\t\t\t0.54902,\n\t\t\t0.840155,\n\t\t\t0.33358,\n\t\t\t0.427455,\n\t\t\t0.552941,\n\t\t\t0.843484,\n\t\t\t0.338062,\n\t\t\t0.424013,\n\t\t\t0.556863,\n\t\t\t0.846788,\n\t\t\t0.342551,\n\t\t\t0.420579,\n\t\t\t0.560784,\n\t\t\t0.850066,\n\t\t\t0.347048,\n\t\t\t0.417153,\n\t\t\t0.564706,\n\t\t\t0.853319,\n\t\t\t0.351553,\n\t\t\t0.413734,\n\t\t\t0.568627,\n\t\t\t0.856547,\n\t\t\t0.356066,\n\t\t\t0.410322,\n\t\t\t0.572549,\n\t\t\t0.85975,\n\t\t\t0.360588,\n\t\t\t0.406917,\n\t\t\t0.576471,\n\t\t\t0.862927,\n\t\t\t0.365119,\n\t\t\t0.403519,\n\t\t\t0.580392,\n\t\t\t0.866078,\n\t\t\t0.36966,\n\t\t\t0.400126,\n\t\t\t0.584314,\n\t\t\t0.869203,\n\t\t\t0.374212,\n\t\t\t0.396738,\n\t\t\t0.588235,\n\t\t\t0.872303,\n\t\t\t0.378774,\n\t\t\t0.393355,\n\t\t\t0.592157,\n\t\t\t0.875376,\n\t\t\t0.383347,\n\t\t\t0.389976,\n\t\t\t0.596078,\n\t\t\t0.878423,\n\t\t\t0.387932,\n\t\t\t0.3866,\n\t\t\t0.6,\n\t\t\t0.881443,\n\t\t\t0.392529,\n\t\t\t0.383229,\n\t\t\t0.603922,\n\t\t\t0.884436,\n\t\t\t0.397139,\n\t\t\t0.37986,\n\t\t\t0.607843,\n\t\t\t0.887402,\n\t\t\t0.401762,\n\t\t\t0.376494,\n\t\t\t0.611765,\n\t\t\t0.89034,\n\t\t\t0.406398,\n\t\t\t0.37313,\n\t\t\t0.615686,\n\t\t\t0.89325,\n\t\t\t0.411048,\n\t\t\t0.369768,\n\t\t\t0.619608,\n\t\t\t0.896131,\n\t\t\t0.415712,\n\t\t\t0.366407,\n\t\t\t0.623529,\n\t\t\t0.898984,\n\t\t\t0.420392,\n\t\t\t0.363047,\n\t\t\t0.627451,\n\t\t\t0.901807,\n\t\t\t0.425087,\n\t\t\t0.359688,\n\t\t\t0.631373,\n\t\t\t0.904601,\n\t\t\t0.429797,\n\t\t\t0.356329,\n\t\t\t0.635294,\n\t\t\t0.907365,\n\t\t\t0.434524,\n\t\t\t0.35297,\n\t\t\t0.639216,\n\t\t\t0.910098,\n\t\t\t0.439268,\n\t\t\t0.34961,\n\t\t\t0.643137,\n\t\t\t0.9128,\n\t\t\t0.444029,\n\t\t\t0.346251,\n\t\t\t0.647059,\n\t\t\t0.915471,\n\t\t\t0.448807,\n\t\t\t0.34289,\n\t\t\t0.65098,\n\t\t\t0.918109,\n\t\t\t0.453603,\n\t\t\t0.339529,\n\t\t\t0.654902,\n\t\t\t0.920714,\n\t\t\t0.458417,\n\t\t\t0.336166,\n\t\t\t0.658824,\n\t\t\t0.923287,\n\t\t\t0.463251,\n\t\t\t0.332801,\n\t\t\t0.662745,\n\t\t\t0.925825,\n\t\t\t0.468103,\n\t\t\t0.329435,\n\t\t\t0.666667,\n\t\t\t0.928329,\n\t\t\t0.472975,\n\t\t\t0.326067,\n\t\t\t0.670588,\n\t\t\t0.930798,\n\t\t\t0.477867,\n\t\t\t0.322697,\n\t\t\t0.67451,\n\t\t\t0.933232,\n\t\t\t0.48278,\n\t\t\t0.319325,\n\t\t\t0.678431,\n\t\t\t0.93563,\n\t\t\t0.487712,\n\t\t\t0.315952,\n\t\t\t0.682353,\n\t\t\t0.93799,\n\t\t\t0.492667,\n\t\t\t0.312575,\n\t\t\t0.686275,\n\t\t\t0.940313,\n\t\t\t0.497642,\n\t\t\t0.309197,\n\t\t\t0.690196,\n\t\t\t0.942598,\n\t\t\t0.502639,\n\t\t\t0.305816,\n\t\t\t0.694118,\n\t\t\t0.944844,\n\t\t\t0.507658,\n\t\t\t0.302433,\n\t\t\t0.698039,\n\t\t\t0.947051,\n\t\t\t0.512699,\n\t\t\t0.299049,\n\t\t\t0.701961,\n\t\t\t0.949217,\n\t\t\t0.517763,\n\t\t\t0.295662,\n\t\t\t0.705882,\n\t\t\t0.951344,\n\t\t\t0.52285,\n\t\t\t0.292275,\n\t\t\t0.709804,\n\t\t\t0.953428,\n\t\t\t0.52796,\n\t\t\t0.288883,\n\t\t\t0.713725,\n\t\t\t0.95547,\n\t\t\t0.533093,\n\t\t\t0.28549,\n\t\t\t0.717647,\n\t\t\t0.957469,\n\t\t\t0.53825,\n\t\t\t0.282096,\n\t\t\t0.721569,\n\t\t\t0.959424,\n\t\t\t0.543431,\n\t\t\t0.278701,\n\t\t\t0.72549,\n\t\t\t0.961336,\n\t\t\t0.548636,\n\t\t\t0.275305,\n\t\t\t0.729412,\n\t\t\t0.963203,\n\t\t\t0.553865,\n\t\t\t0.271909,\n\t\t\t0.733333,\n\t\t\t0.965024,\n\t\t\t0.559118,\n\t\t\t0.268513,\n\t\t\t0.737255,\n\t\t\t0.966798,\n\t\t\t0.564396,\n\t\t\t0.265118,\n\t\t\t0.741176,\n\t\t\t0.968526,\n\t\t\t0.5697,\n\t\t\t0.261721,\n\t\t\t0.745098,\n\t\t\t0.970205,\n\t\t\t0.575028,\n\t\t\t0.258325,\n\t\t\t0.74902,\n\t\t\t0.971835,\n\t\t\t0.580382,\n\t\t\t0.254931,\n\t\t\t0.752941,\n\t\t\t0.973416,\n\t\t\t0.585761,\n\t\t\t0.25154,\n\t\t\t0.756863,\n\t\t\t0.974947,\n\t\t\t0.591165,\n\t\t\t0.248151,\n\t\t\t0.760784,\n\t\t\t0.976428,\n\t\t\t0.596595,\n\t\t\t0.244767,\n\t\t\t0.764706,\n\t\t\t0.977856,\n\t\t\t0.602051,\n\t\t\t0.241387,\n\t\t\t0.768627,\n\t\t\t0.979233,\n\t\t\t0.607532,\n\t\t\t0.238013,\n\t\t\t0.772549,\n\t\t\t0.980556,\n\t\t\t0.613039,\n\t\t\t0.234646,\n\t\t\t0.776471,\n\t\t\t0.981826,\n\t\t\t0.618572,\n\t\t\t0.231287,\n\t\t\t0.780392,\n\t\t\t0.983041,\n\t\t\t0.624131,\n\t\t\t0.227937,\n\t\t\t0.784314,\n\t\t\t0.984199,\n\t\t\t0.629718,\n\t\t\t0.224595,\n\t\t\t0.788235,\n\t\t\t0.985301,\n\t\t\t0.63533,\n\t\t\t0.221265,\n\t\t\t0.792157,\n\t\t\t0.986345,\n\t\t\t0.640969,\n\t\t\t0.217948,\n\t\t\t0.796078,\n\t\t\t0.987332,\n\t\t\t0.646633,\n\t\t\t0.214648,\n\t\t\t0.8,\n\t\t\t0.98826,\n\t\t\t0.652325,\n\t\t\t0.211364,\n\t\t\t0.803922,\n\t\t\t0.989128,\n\t\t\t0.658043,\n\t\t\t0.2081,\n\t\t\t0.807843,\n\t\t\t0.989935,\n\t\t\t0.663787,\n\t\t\t0.204859,\n\t\t\t0.811765,\n\t\t\t0.990681,\n\t\t\t0.669558,\n\t\t\t0.201642,\n\t\t\t0.815686,\n\t\t\t0.991365,\n\t\t\t0.675355,\n\t\t\t0.198453,\n\t\t\t0.819608,\n\t\t\t0.991985,\n\t\t\t0.681179,\n\t\t\t0.195295,\n\t\t\t0.823529,\n\t\t\t0.992541,\n\t\t\t0.68703,\n\t\t\t0.19217,\n\t\t\t0.827451,\n\t\t\t0.993032,\n\t\t\t0.692907,\n\t\t\t0.189084,\n\t\t\t0.831373,\n\t\t\t0.993456,\n\t\t\t0.69881,\n\t\t\t0.186041,\n\t\t\t0.835294,\n\t\t\t0.993814,\n\t\t\t0.704741,\n\t\t\t0.183043,\n\t\t\t0.839216,\n\t\t\t0.994103,\n\t\t\t0.710698,\n\t\t\t0.180097,\n\t\t\t0.843137,\n\t\t\t0.994324,\n\t\t\t0.716681,\n\t\t\t0.177208,\n\t\t\t0.847059,\n\t\t\t0.994474,\n\t\t\t0.722691,\n\t\t\t0.174381,\n\t\t\t0.85098,\n\t\t\t0.994553,\n\t\t\t0.728728,\n\t\t\t0.171622,\n\t\t\t0.854902,\n\t\t\t0.994561,\n\t\t\t0.734791,\n\t\t\t0.168938,\n\t\t\t0.858824,\n\t\t\t0.994495,\n\t\t\t0.74088,\n\t\t\t0.166335,\n\t\t\t0.862745,\n\t\t\t0.994355,\n\t\t\t0.746995,\n\t\t\t0.163821,\n\t\t\t0.866667,\n\t\t\t0.994141,\n\t\t\t0.753137,\n\t\t\t0.161404,\n\t\t\t0.870588,\n\t\t\t0.993851,\n\t\t\t0.759304,\n\t\t\t0.159092,\n\t\t\t0.87451,\n\t\t\t0.993482,\n\t\t\t0.765499,\n\t\t\t0.156891,\n\t\t\t0.878431,\n\t\t\t0.993033,\n\t\t\t0.77172,\n\t\t\t0.154808,\n\t\t\t0.882353,\n\t\t\t0.992505,\n\t\t\t0.777967,\n\t\t\t0.152855,\n\t\t\t0.886275,\n\t\t\t0.991897,\n\t\t\t0.784239,\n\t\t\t0.151042,\n\t\t\t0.890196,\n\t\t\t0.991209,\n\t\t\t0.790537,\n\t\t\t0.149377,\n\t\t\t0.894118,\n\t\t\t0.990439,\n\t\t\t0.796859,\n\t\t\t0.14787,\n\t\t\t0.898039,\n\t\t\t0.989587,\n\t\t\t0.803205,\n\t\t\t0.146529,\n\t\t\t0.901961,\n\t\t\t0.988648,\n\t\t\t0.809579,\n\t\t\t0.145357,\n\t\t\t0.905882,\n\t\t\t0.987621,\n\t\t\t0.815978,\n\t\t\t0.144363,\n\t\t\t0.909804,\n\t\t\t0.986509,\n\t\t\t0.822401,\n\t\t\t0.143557,\n\t\t\t0.913725,\n\t\t\t0.985314,\n\t\t\t0.828846,\n\t\t\t0.142945,\n\t\t\t0.917647,\n\t\t\t0.984031,\n\t\t\t0.835315,\n\t\t\t0.142528,\n\t\t\t0.921569,\n\t\t\t0.982653,\n\t\t\t0.841812,\n\t\t\t0.142303,\n\t\t\t0.92549,\n\t\t\t0.98119,\n\t\t\t0.848329,\n\t\t\t0.142279,\n\t\t\t0.929412,\n\t\t\t0.979644,\n\t\t\t0.854866,\n\t\t\t0.142453,\n\t\t\t0.933333,\n\t\t\t0.977995,\n\t\t\t0.861432,\n\t\t\t0.142808,\n\t\t\t0.937255,\n\t\t\t0.976265,\n\t\t\t0.868016,\n\t\t\t0.143351,\n\t\t\t0.941176,\n\t\t\t0.974443,\n\t\t\t0.874622,\n\t\t\t0.144061,\n\t\t\t0.945098,\n\t\t\t0.97253,\n\t\t\t0.88125,\n\t\t\t0.144923,\n\t\t\t0.94902,\n\t\t\t0.970533,\n\t\t\t0.887896,\n\t\t\t0.145919,\n\t\t\t0.952941,\n\t\t\t0.968443,\n\t\t\t0.894564,\n\t\t\t0.147014,\n\t\t\t0.956863,\n\t\t\t0.966271,\n\t\t\t0.901249,\n\t\t\t0.14818,\n\t\t\t0.960784,\n\t\t\t0.964021,\n\t\t\t0.90795,\n\t\t\t0.14937,\n\t\t\t0.964706,\n\t\t\t0.961681,\n\t\t\t0.914672,\n\t\t\t0.15052,\n\t\t\t0.968627,\n\t\t\t0.959276,\n\t\t\t0.921407,\n\t\t\t0.151566,\n\t\t\t0.972549,\n\t\t\t0.956808,\n\t\t\t0.928152,\n\t\t\t0.152409,\n\t\t\t0.976471,\n\t\t\t0.954287,\n\t\t\t0.934908,\n\t\t\t0.152921,\n\t\t\t0.980392,\n\t\t\t0.951726,\n\t\t\t0.941671,\n\t\t\t0.152925,\n\t\t\t0.984314,\n\t\t\t0.949151,\n\t\t\t0.948435,\n\t\t\t0.152178,\n\t\t\t0.988235,\n\t\t\t0.946602,\n\t\t\t0.95519,\n\t\t\t0.150328,\n\t\t\t0.992157,\n\t\t\t0.944152,\n\t\t\t0.961916,\n\t\t\t0.146861,\n\t\t\t0.996078,\n\t\t\t0.941896,\n\t\t\t0.96859,\n\t\t\t0.140956,\n\t\t\t1,\n\t\t\t0.940015,\n\t\t\t0.975158,\n\t\t\t0.131326\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Viridis (matplotlib)\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Eric Firing\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.267004,\n\t\t\t0.004874,\n\t\t\t0.329415,\n\t\t\t0.003922,\n\t\t\t0.26851,\n\t\t\t0.009605,\n\t\t\t0.335427,\n\t\t\t0.007843,\n\t\t\t0.269944,\n\t\t\t0.014625,\n\t\t\t0.341379,\n\t\t\t0.011765,\n\t\t\t0.271305,\n\t\t\t0.019942,\n\t\t\t0.347269,\n\t\t\t0.015686,\n\t\t\t0.272594,\n\t\t\t0.025563,\n\t\t\t0.353093,\n\t\t\t0.019608,\n\t\t\t0.273809,\n\t\t\t0.031497,\n\t\t\t0.358853,\n\t\t\t0.023529,\n\t\t\t0.274952,\n\t\t\t0.037752,\n\t\t\t0.364543,\n\t\t\t0.027451,\n\t\t\t0.276022,\n\t\t\t0.044167,\n\t\t\t0.370164,\n\t\t\t0.031373,\n\t\t\t0.277018,\n\t\t\t0.050344,\n\t\t\t0.375715,\n\t\t\t0.035294,\n\t\t\t0.277941,\n\t\t\t0.056324,\n\t\t\t0.381191,\n\t\t\t0.039216,\n\t\t\t0.278791,\n\t\t\t0.062145,\n\t\t\t0.386592,\n\t\t\t0.043137,\n\t\t\t0.279566,\n\t\t\t0.067836,\n\t\t\t0.391917,\n\t\t\t0.047059,\n\t\t\t0.280267,\n\t\t\t0.073417,\n\t\t\t0.397163,\n\t\t\t0.05098,\n\t\t\t0.280894,\n\t\t\t0.078907,\n\t\t\t0.402329,\n\t\t\t0.054902,\n\t\t\t0.281446,\n\t\t\t0.08432,\n\t\t\t0.407414,\n\t\t\t0.058824,\n\t\t\t0.281924,\n\t\t\t0.089666,\n\t\t\t0.412415,\n\t\t\t0.062745,\n\t\t\t0.282327,\n\t\t\t0.094955,\n\t\t\t0.417331,\n\t\t\t0.066667,\n\t\t\t0.282656,\n\t\t\t0.100196,\n\t\t\t0.42216,\n\t\t\t0.070588,\n\t\t\t0.28291,\n\t\t\t0.105393,\n\t\t\t0.426902,\n\t\t\t0.07451,\n\t\t\t0.283091,\n\t\t\t0.110553,\n\t\t\t0.431554,\n\t\t\t0.078431,\n\t\t\t0.283197,\n\t\t\t0.11568,\n\t\t\t0.436115,\n\t\t\t0.082353,\n\t\t\t0.283229,\n\t\t\t0.120777,\n\t\t\t0.440584,\n\t\t\t0.086275,\n\t\t\t0.283187,\n\t\t\t0.125848,\n\t\t\t0.44496,\n\t\t\t0.090196,\n\t\t\t0.283072,\n\t\t\t0.130895,\n\t\t\t0.449241,\n\t\t\t0.094118,\n\t\t\t0.282884,\n\t\t\t0.13592,\n\t\t\t0.453427,\n\t\t\t0.098039,\n\t\t\t0.282623,\n\t\t\t0.140926,\n\t\t\t0.457517,\n\t\t\t0.101961,\n\t\t\t0.28229,\n\t\t\t0.145912,\n\t\t\t0.46151,\n\t\t\t0.105882,\n\t\t\t0.281887,\n\t\t\t0.150881,\n\t\t\t0.465405,\n\t\t\t0.109804,\n\t\t\t0.281412,\n\t\t\t0.155834,\n\t\t\t0.469201,\n\t\t\t0.113725,\n\t\t\t0.280868,\n\t\t\t0.160771,\n\t\t\t0.472899,\n\t\t\t0.117647,\n\t\t\t0.280255,\n\t\t\t0.165693,\n\t\t\t0.476498,\n\t\t\t0.121569,\n\t\t\t0.279574,\n\t\t\t0.170599,\n\t\t\t0.479997,\n\t\t\t0.12549,\n\t\t\t0.278826,\n\t\t\t0.17549,\n\t\t\t0.483397,\n\t\t\t0.129412,\n\t\t\t0.278012,\n\t\t\t0.180367,\n\t\t\t0.486697,\n\t\t\t0.133333,\n\t\t\t0.277134,\n\t\t\t0.185228,\n\t\t\t0.489898,\n\t\t\t0.137255,\n\t\t\t0.276194,\n\t\t\t0.190074,\n\t\t\t0.493001,\n\t\t\t0.141176,\n\t\t\t0.275191,\n\t\t\t0.194905,\n\t\t\t0.496005,\n\t\t\t0.145098,\n\t\t\t0.274128,\n\t\t\t0.199721,\n\t\t\t0.498911,\n\t\t\t0.14902,\n\t\t\t0.273006,\n\t\t\t0.20452,\n\t\t\t0.501721,\n\t\t\t0.152941,\n\t\t\t0.271828,\n\t\t\t0.209303,\n\t\t\t0.504434,\n\t\t\t0.156863,\n\t\t\t0.270595,\n\t\t\t0.214069,\n\t\t\t0.507052,\n\t\t\t0.160784,\n\t\t\t0.269308,\n\t\t\t0.218818,\n\t\t\t0.509577,\n\t\t\t0.164706,\n\t\t\t0.267968,\n\t\t\t0.223549,\n\t\t\t0.512008,\n\t\t\t0.168627,\n\t\t\t0.26658,\n\t\t\t0.228262,\n\t\t\t0.514349,\n\t\t\t0.172549,\n\t\t\t0.265145,\n\t\t\t0.232956,\n\t\t\t0.516599,\n\t\t\t0.176471,\n\t\t\t0.263663,\n\t\t\t0.237631,\n\t\t\t0.518762,\n\t\t\t0.180392,\n\t\t\t0.262138,\n\t\t\t0.242286,\n\t\t\t0.520837,\n\t\t\t0.184314,\n\t\t\t0.260571,\n\t\t\t0.246922,\n\t\t\t0.522828,\n\t\t\t0.188235,\n\t\t\t0.258965,\n\t\t\t0.251537,\n\t\t\t0.524736,\n\t\t\t0.192157,\n\t\t\t0.257322,\n\t\t\t0.25613,\n\t\t\t0.526563,\n\t\t\t0.196078,\n\t\t\t0.255645,\n\t\t\t0.260703,\n\t\t\t0.528312,\n\t\t\t0.2,\n\t\t\t0.253935,\n\t\t\t0.265254,\n\t\t\t0.529983,\n\t\t\t0.203922,\n\t\t\t0.252194,\n\t\t\t0.269783,\n\t\t\t0.531579,\n\t\t\t0.207843,\n\t\t\t0.250425,\n\t\t\t0.27429,\n\t\t\t0.533103,\n\t\t\t0.211765,\n\t\t\t0.248629,\n\t\t\t0.278775,\n\t\t\t0.534556,\n\t\t\t0.215686,\n\t\t\t0.246811,\n\t\t\t0.283237,\n\t\t\t0.535941,\n\t\t\t0.219608,\n\t\t\t0.244972,\n\t\t\t0.287675,\n\t\t\t0.53726,\n\t\t\t0.223529,\n\t\t\t0.243113,\n\t\t\t0.292092,\n\t\t\t0.538516,\n\t\t\t0.227451,\n\t\t\t0.241237,\n\t\t\t0.296485,\n\t\t\t0.539709,\n\t\t\t0.231373,\n\t\t\t0.239346,\n\t\t\t0.300855,\n\t\t\t0.540844,\n\t\t\t0.235294,\n\t\t\t0.237441,\n\t\t\t0.305202,\n\t\t\t0.541921,\n\t\t\t0.239216,\n\t\t\t0.235526,\n\t\t\t0.309527,\n\t\t\t0.542944,\n\t\t\t0.243137,\n\t\t\t0.233603,\n\t\t\t0.313828,\n\t\t\t0.543914,\n\t\t\t0.247059,\n\t\t\t0.231674,\n\t\t\t0.318106,\n\t\t\t0.544834,\n\t\t\t0.25098,\n\t\t\t0.229739,\n\t\t\t0.322361,\n\t\t\t0.545706,\n\t\t\t0.254902,\n\t\t\t0.227802,\n\t\t\t0.326594,\n\t\t\t0.546532,\n\t\t\t0.258824,\n\t\t\t0.225863,\n\t\t\t0.330805,\n\t\t\t0.547314,\n\t\t\t0.262745,\n\t\t\t0.223925,\n\t\t\t0.334994,\n\t\t\t0.548053,\n\t\t\t0.266667,\n\t\t\t0.221989,\n\t\t\t0.339161,\n\t\t\t0.548752,\n\t\t\t0.270588,\n\t\t\t0.220057,\n\t\t\t0.343307,\n\t\t\t0.549413,\n\t\t\t0.27451,\n\t\t\t0.21813,\n\t\t\t0.347432,\n\t\t\t0.550038,\n\t\t\t0.278431,\n\t\t\t0.21621,\n\t\t\t0.351535,\n\t\t\t0.550627,\n\t\t\t0.282353,\n\t\t\t0.214298,\n\t\t\t0.355619,\n\t\t\t0.551184,\n\t\t\t0.286275,\n\t\t\t0.212395,\n\t\t\t0.359683,\n\t\t\t0.55171,\n\t\t\t0.290196,\n\t\t\t0.210503,\n\t\t\t0.363727,\n\t\t\t0.552206,\n\t\t\t0.294118,\n\t\t\t0.208623,\n\t\t\t0.367752,\n\t\t\t0.552675,\n\t\t\t0.298039,\n\t\t\t0.206756,\n\t\t\t0.371758,\n\t\t\t0.553117,\n\t\t\t0.301961,\n\t\t\t0.204903,\n\t\t\t0.375746,\n\t\t\t0.553533,\n\t\t\t0.305882,\n\t\t\t0.203063,\n\t\t\t0.379716,\n\t\t\t0.553925,\n\t\t\t0.309804,\n\t\t\t0.201239,\n\t\t\t0.38367,\n\t\t\t0.554294,\n\t\t\t0.313725,\n\t\t\t0.19943,\n\t\t\t0.387607,\n\t\t\t0.554642,\n\t\t\t0.317647,\n\t\t\t0.197636,\n\t\t\t0.391528,\n\t\t\t0.554969,\n\t\t\t0.321569,\n\t\t\t0.19586,\n\t\t\t0.395433,\n\t\t\t0.555276,\n\t\t\t0.32549,\n\t\t\t0.1941,\n\t\t\t0.399323,\n\t\t\t0.555565,\n\t\t\t0.329412,\n\t\t\t0.192357,\n\t\t\t0.403199,\n\t\t\t0.555836,\n\t\t\t0.333333,\n\t\t\t0.190631,\n\t\t\t0.407061,\n\t\t\t0.556089,\n\t\t\t0.337255,\n\t\t\t0.188923,\n\t\t\t0.41091,\n\t\t\t0.556326,\n\t\t\t0.341176,\n\t\t\t0.187231,\n\t\t\t0.414746,\n\t\t\t0.556547,\n\t\t\t0.345098,\n\t\t\t0.185556,\n\t\t\t0.41857,\n\t\t\t0.556753,\n\t\t\t0.34902,\n\t\t\t0.183898,\n\t\t\t0.422383,\n\t\t\t0.556944,\n\t\t\t0.352941,\n\t\t\t0.182256,\n\t\t\t0.426184,\n\t\t\t0.55712,\n\t\t\t0.356863,\n\t\t\t0.180629,\n\t\t\t0.429975,\n\t\t\t0.557282,\n\t\t\t0.360784,\n\t\t\t0.179019,\n\t\t\t0.433756,\n\t\t\t0.55743,\n\t\t\t0.364706,\n\t\t\t0.177423,\n\t\t\t0.437527,\n\t\t\t0.557565,\n\t\t\t0.368627,\n\t\t\t0.175841,\n\t\t\t0.44129,\n\t\t\t0.557685,\n\t\t\t0.372549,\n\t\t\t0.174274,\n\t\t\t0.445044,\n\t\t\t0.557792,\n\t\t\t0.376471,\n\t\t\t0.172719,\n\t\t\t0.448791,\n\t\t\t0.557885,\n\t\t\t0.380392,\n\t\t\t0.171176,\n\t\t\t0.45253,\n\t\t\t0.557965,\n\t\t\t0.384314,\n\t\t\t0.169646,\n\t\t\t0.456262,\n\t\t\t0.55803,\n\t\t\t0.388235,\n\t\t\t0.168126,\n\t\t\t0.459988,\n\t\t\t0.558082,\n\t\t\t0.392157,\n\t\t\t0.166617,\n\t\t\t0.463708,\n\t\t\t0.558119,\n\t\t\t0.396078,\n\t\t\t0.165117,\n\t\t\t0.467423,\n\t\t\t0.558141,\n\t\t\t0.4,\n\t\t\t0.163625,\n\t\t\t0.471133,\n\t\t\t0.558148,\n\t\t\t0.403922,\n\t\t\t0.162142,\n\t\t\t0.474838,\n\t\t\t0.55814,\n\t\t\t0.407843,\n\t\t\t0.160665,\n\t\t\t0.47854,\n\t\t\t0.558115,\n\t\t\t0.411765,\n\t\t\t0.159194,\n\t\t\t0.482237,\n\t\t\t0.558073,\n\t\t\t0.415686,\n\t\t\t0.157729,\n\t\t\t0.485932,\n\t\t\t0.558013,\n\t\t\t0.419608,\n\t\t\t0.15627,\n\t\t\t0.489624,\n\t\t\t0.557936,\n\t\t\t0.423529,\n\t\t\t0.154815,\n\t\t\t0.493313,\n\t\t\t0.55784,\n\t\t\t0.427451,\n\t\t\t0.153364,\n\t\t\t0.497,\n\t\t\t0.557724,\n\t\t\t0.431373,\n\t\t\t0.151918,\n\t\t\t0.500685,\n\t\t\t0.557587,\n\t\t\t0.435294,\n\t\t\t0.150476,\n\t\t\t0.504369,\n\t\t\t0.55743,\n\t\t\t0.439216,\n\t\t\t0.149039,\n\t\t\t0.508051,\n\t\t\t0.55725,\n\t\t\t0.443137,\n\t\t\t0.147607,\n\t\t\t0.511733,\n\t\t\t0.557049,\n\t\t\t0.447059,\n\t\t\t0.14618,\n\t\t\t0.515413,\n\t\t\t0.556823,\n\t\t\t0.45098,\n\t\t\t0.144759,\n\t\t\t0.519093,\n\t\t\t0.556572,\n\t\t\t0.454902,\n\t\t\t0.143343,\n\t\t\t0.522773,\n\t\t\t0.556295,\n\t\t\t0.458824,\n\t\t\t0.141935,\n\t\t\t0.526453,\n\t\t\t0.555991,\n\t\t\t0.462745,\n\t\t\t0.140536,\n\t\t\t0.530132,\n\t\t\t0.555659,\n\t\t\t0.466667,\n\t\t\t0.139147,\n\t\t\t0.533812,\n\t\t\t0.555298,\n\t\t\t0.470588,\n\t\t\t0.13777,\n\t\t\t0.537492,\n\t\t\t0.554906,\n\t\t\t0.47451,\n\t\t\t0.136408,\n\t\t\t0.541173,\n\t\t\t0.554483,\n\t\t\t0.478431,\n\t\t\t0.135066,\n\t\t\t0.544853,\n\t\t\t0.554029,\n\t\t\t0.482353,\n\t\t\t0.133743,\n\t\t\t0.548535,\n\t\t\t0.553541,\n\t\t\t0.486275,\n\t\t\t0.132444,\n\t\t\t0.552216,\n\t\t\t0.553018,\n\t\t\t0.490196,\n\t\t\t0.131172,\n\t\t\t0.555899,\n\t\t\t0.552459,\n\t\t\t0.494118,\n\t\t\t0.129933,\n\t\t\t0.559582,\n\t\t\t0.551864,\n\t\t\t0.498039,\n\t\t\t0.128729,\n\t\t\t0.563265,\n\t\t\t0.551229,\n\t\t\t0.501961,\n\t\t\t0.127568,\n\t\t\t0.566949,\n\t\t\t0.550556,\n\t\t\t0.505882,\n\t\t\t0.126453,\n\t\t\t0.570633,\n\t\t\t0.549841,\n\t\t\t0.509804,\n\t\t\t0.125394,\n\t\t\t0.574318,\n\t\t\t0.549086,\n\t\t\t0.513725,\n\t\t\t0.124395,\n\t\t\t0.578002,\n\t\t\t0.548287,\n\t\t\t0.517647,\n\t\t\t0.123463,\n\t\t\t0.581687,\n\t\t\t0.547445,\n\t\t\t0.521569,\n\t\t\t0.122606,\n\t\t\t0.585371,\n\t\t\t0.546557,\n\t\t\t0.52549,\n\t\t\t0.121831,\n\t\t\t0.589055,\n\t\t\t0.545623,\n\t\t\t0.529412,\n\t\t\t0.121148,\n\t\t\t0.592739,\n\t\t\t0.544641,\n\t\t\t0.533333,\n\t\t\t0.120565,\n\t\t\t0.596422,\n\t\t\t0.543611,\n\t\t\t0.537255,\n\t\t\t0.120092,\n\t\t\t0.600104,\n\t\t\t0.54253,\n\t\t\t0.541176,\n\t\t\t0.119738,\n\t\t\t0.603785,\n\t\t\t0.5414,\n\t\t\t0.545098,\n\t\t\t0.119512,\n\t\t\t0.607464,\n\t\t\t0.540218,\n\t\t\t0.54902,\n\t\t\t0.119423,\n\t\t\t0.611141,\n\t\t\t0.538982,\n\t\t\t0.552941,\n\t\t\t0.119483,\n\t\t\t0.614817,\n\t\t\t0.537692,\n\t\t\t0.556863,\n\t\t\t0.119699,\n\t\t\t0.61849,\n\t\t\t0.536347,\n\t\t\t0.560784,\n\t\t\t0.120081,\n\t\t\t0.622161,\n\t\t\t0.534946,\n\t\t\t0.564706,\n\t\t\t0.120638,\n\t\t\t0.625828,\n\t\t\t0.533488,\n\t\t\t0.568627,\n\t\t\t0.12138,\n\t\t\t0.629492,\n\t\t\t0.531973,\n\t\t\t0.572549,\n\t\t\t0.122312,\n\t\t\t0.633153,\n\t\t\t0.530398,\n\t\t\t0.576471,\n\t\t\t0.123444,\n\t\t\t0.636809,\n\t\t\t0.528763,\n\t\t\t0.580392,\n\t\t\t0.12478,\n\t\t\t0.640461,\n\t\t\t0.527068,\n\t\t\t0.584314,\n\t\t\t0.126326,\n\t\t\t0.644107,\n\t\t\t0.525311,\n\t\t\t0.588235,\n\t\t\t0.128087,\n\t\t\t0.647749,\n\t\t\t0.523491,\n\t\t\t0.592157,\n\t\t\t0.130067,\n\t\t\t0.651384,\n\t\t\t0.521608,\n\t\t\t0.596078,\n\t\t\t0.132268,\n\t\t\t0.655014,\n\t\t\t0.519661,\n\t\t\t0.6,\n\t\t\t0.134692,\n\t\t\t0.658636,\n\t\t\t0.517649,\n\t\t\t0.603922,\n\t\t\t0.137339,\n\t\t\t0.662252,\n\t\t\t0.515571,\n\t\t\t0.607843,\n\t\t\t0.14021,\n\t\t\t0.665859,\n\t\t\t0.513427,\n\t\t\t0.611765,\n\t\t\t0.143303,\n\t\t\t0.669459,\n\t\t\t0.511215,\n\t\t\t0.615686,\n\t\t\t0.146616,\n\t\t\t0.67305,\n\t\t\t0.508936,\n\t\t\t0.619608,\n\t\t\t0.150148,\n\t\t\t0.676631,\n\t\t\t0.506589,\n\t\t\t0.623529,\n\t\t\t0.153894,\n\t\t\t0.680203,\n\t\t\t0.504172,\n\t\t\t0.627451,\n\t\t\t0.157851,\n\t\t\t0.683765,\n\t\t\t0.501686,\n\t\t\t0.631373,\n\t\t\t0.162016,\n\t\t\t0.687316,\n\t\t\t0.499129,\n\t\t\t0.635294,\n\t\t\t0.166383,\n\t\t\t0.690856,\n\t\t\t0.496502,\n\t\t\t0.639216,\n\t\t\t0.170948,\n\t\t\t0.694384,\n\t\t\t0.493803,\n\t\t\t0.643137,\n\t\t\t0.175707,\n\t\t\t0.6979,\n\t\t\t0.491033,\n\t\t\t0.647059,\n\t\t\t0.180653,\n\t\t\t0.701402,\n\t\t\t0.488189,\n\t\t\t0.65098,\n\t\t\t0.185783,\n\t\t\t0.704891,\n\t\t\t0.485273,\n\t\t\t0.654902,\n\t\t\t0.19109,\n\t\t\t0.708366,\n\t\t\t0.482284,\n\t\t\t0.658824,\n\t\t\t0.196571,\n\t\t\t0.711827,\n\t\t\t0.479221,\n\t\t\t0.662745,\n\t\t\t0.202219,\n\t\t\t0.715272,\n\t\t\t0.476084,\n\t\t\t0.666667,\n\t\t\t0.20803,\n\t\t\t0.718701,\n\t\t\t0.472873,\n\t\t\t0.670588,\n\t\t\t0.214,\n\t\t\t0.722114,\n\t\t\t0.469588,\n\t\t\t0.67451,\n\t\t\t0.220124,\n\t\t\t0.725509,\n\t\t\t0.466226,\n\t\t\t0.678431,\n\t\t\t0.226397,\n\t\t\t0.728888,\n\t\t\t0.462789,\n\t\t\t0.682353,\n\t\t\t0.232815,\n\t\t\t0.732247,\n\t\t\t0.459277,\n\t\t\t0.686275,\n\t\t\t0.239374,\n\t\t\t0.735588,\n\t\t\t0.455688,\n\t\t\t0.690196,\n\t\t\t0.24607,\n\t\t\t0.73891,\n\t\t\t0.452024,\n\t\t\t0.694118,\n\t\t\t0.252899,\n\t\t\t0.742211,\n\t\t\t0.448284,\n\t\t\t0.698039,\n\t\t\t0.259857,\n\t\t\t0.745492,\n\t\t\t0.444467,\n\t\t\t0.701961,\n\t\t\t0.266941,\n\t\t\t0.748751,\n\t\t\t0.440573,\n\t\t\t0.705882,\n\t\t\t0.274149,\n\t\t\t0.751988,\n\t\t\t0.436601,\n\t\t\t0.709804,\n\t\t\t0.281477,\n\t\t\t0.755203,\n\t\t\t0.432552,\n\t\t\t0.713725,\n\t\t\t0.288921,\n\t\t\t0.758394,\n\t\t\t0.428426,\n\t\t\t0.717647,\n\t\t\t0.296479,\n\t\t\t0.761561,\n\t\t\t0.424223,\n\t\t\t0.721569,\n\t\t\t0.304148,\n\t\t\t0.764704,\n\t\t\t0.419943,\n\t\t\t0.72549,\n\t\t\t0.311925,\n\t\t\t0.767822,\n\t\t\t0.415586,\n\t\t\t0.729412,\n\t\t\t0.319809,\n\t\t\t0.770914,\n\t\t\t0.411152,\n\t\t\t0.733333,\n\t\t\t0.327796,\n\t\t\t0.77398,\n\t\t\t0.40664,\n\t\t\t0.737255,\n\t\t\t0.335885,\n\t\t\t0.777018,\n\t\t\t0.402049,\n\t\t\t0.741176,\n\t\t\t0.344074,\n\t\t\t0.780029,\n\t\t\t0.397381,\n\t\t\t0.745098,\n\t\t\t0.35236,\n\t\t\t0.783011,\n\t\t\t0.392636,\n\t\t\t0.74902,\n\t\t\t0.360741,\n\t\t\t0.785964,\n\t\t\t0.387814,\n\t\t\t0.752941,\n\t\t\t0.369214,\n\t\t\t0.788888,\n\t\t\t0.382914,\n\t\t\t0.756863,\n\t\t\t0.377779,\n\t\t\t0.791781,\n\t\t\t0.377939,\n\t\t\t0.760784,\n\t\t\t0.386433,\n\t\t\t0.794644,\n\t\t\t0.372886,\n\t\t\t0.764706,\n\t\t\t0.395174,\n\t\t\t0.797475,\n\t\t\t0.367757,\n\t\t\t0.768627,\n\t\t\t0.404001,\n\t\t\t0.800275,\n\t\t\t0.362552,\n\t\t\t0.772549,\n\t\t\t0.412913,\n\t\t\t0.803041,\n\t\t\t0.357269,\n\t\t\t0.776471,\n\t\t\t0.421908,\n\t\t\t0.805774,\n\t\t\t0.35191,\n\t\t\t0.780392,\n\t\t\t0.430983,\n\t\t\t0.808473,\n\t\t\t0.346476,\n\t\t\t0.784314,\n\t\t\t0.440137,\n\t\t\t0.811138,\n\t\t\t0.340967,\n\t\t\t0.788235,\n\t\t\t0.449368,\n\t\t\t0.813768,\n\t\t\t0.335384,\n\t\t\t0.792157,\n\t\t\t0.458674,\n\t\t\t0.816363,\n\t\t\t0.329727,\n\t\t\t0.796078,\n\t\t\t0.468053,\n\t\t\t0.818921,\n\t\t\t0.323998,\n\t\t\t0.8,\n\t\t\t0.477504,\n\t\t\t0.821444,\n\t\t\t0.318195,\n\t\t\t0.803922,\n\t\t\t0.487026,\n\t\t\t0.823929,\n\t\t\t0.312321,\n\t\t\t0.807843,\n\t\t\t0.496615,\n\t\t\t0.826376,\n\t\t\t0.306377,\n\t\t\t0.811765,\n\t\t\t0.506271,\n\t\t\t0.828786,\n\t\t\t0.300362,\n\t\t\t0.815686,\n\t\t\t0.515992,\n\t\t\t0.831158,\n\t\t\t0.294279,\n\t\t\t0.819608,\n\t\t\t0.525776,\n\t\t\t0.833491,\n\t\t\t0.288127,\n\t\t\t0.823529,\n\t\t\t0.535621,\n\t\t\t0.835785,\n\t\t\t0.281908,\n\t\t\t0.827451,\n\t\t\t0.545524,\n\t\t\t0.838039,\n\t\t\t0.275626,\n\t\t\t0.831373,\n\t\t\t0.555484,\n\t\t\t0.840254,\n\t\t\t0.269281,\n\t\t\t0.835294,\n\t\t\t0.565498,\n\t\t\t0.84243,\n\t\t\t0.262877,\n\t\t\t0.839216,\n\t\t\t0.575563,\n\t\t\t0.844566,\n\t\t\t0.256415,\n\t\t\t0.843137,\n\t\t\t0.585678,\n\t\t\t0.846661,\n\t\t\t0.249897,\n\t\t\t0.847059,\n\t\t\t0.595839,\n\t\t\t0.848717,\n\t\t\t0.243329,\n\t\t\t0.85098,\n\t\t\t0.606045,\n\t\t\t0.850733,\n\t\t\t0.236712,\n\t\t\t0.854902,\n\t\t\t0.616293,\n\t\t\t0.852709,\n\t\t\t0.230052,\n\t\t\t0.858824,\n\t\t\t0.626579,\n\t\t\t0.854645,\n\t\t\t0.223353,\n\t\t\t0.862745,\n\t\t\t0.636902,\n\t\t\t0.856542,\n\t\t\t0.21662,\n\t\t\t0.866667,\n\t\t\t0.647257,\n\t\t\t0.8584,\n\t\t\t0.209861,\n\t\t\t0.870588,\n\t\t\t0.657642,\n\t\t\t0.860219,\n\t\t\t0.203082,\n\t\t\t0.87451,\n\t\t\t0.668054,\n\t\t\t0.861999,\n\t\t\t0.196293,\n\t\t\t0.878431,\n\t\t\t0.678489,\n\t\t\t0.863742,\n\t\t\t0.189503,\n\t\t\t0.882353,\n\t\t\t0.688944,\n\t\t\t0.865448,\n\t\t\t0.182725,\n\t\t\t0.886275,\n\t\t\t0.699415,\n\t\t\t0.867117,\n\t\t\t0.175971,\n\t\t\t0.890196,\n\t\t\t0.709898,\n\t\t\t0.868751,\n\t\t\t0.169257,\n\t\t\t0.894118,\n\t\t\t0.720391,\n\t\t\t0.87035,\n\t\t\t0.162603,\n\t\t\t0.898039,\n\t\t\t0.730889,\n\t\t\t0.871916,\n\t\t\t0.156029,\n\t\t\t0.901961,\n\t\t\t0.741388,\n\t\t\t0.873449,\n\t\t\t0.149561,\n\t\t\t0.905882,\n\t\t\t0.751884,\n\t\t\t0.874951,\n\t\t\t0.143228,\n\t\t\t0.909804,\n\t\t\t0.762373,\n\t\t\t0.876424,\n\t\t\t0.137064,\n\t\t\t0.913725,\n\t\t\t0.772852,\n\t\t\t0.877868,\n\t\t\t0.131109,\n\t\t\t0.917647,\n\t\t\t0.783315,\n\t\t\t0.879285,\n\t\t\t0.125405,\n\t\t\t0.921569,\n\t\t\t0.79376,\n\t\t\t0.880678,\n\t\t\t0.120005,\n\t\t\t0.92549,\n\t\t\t0.804182,\n\t\t\t0.882046,\n\t\t\t0.114965,\n\t\t\t0.929412,\n\t\t\t0.814576,\n\t\t\t0.883393,\n\t\t\t0.110347,\n\t\t\t0.933333,\n\t\t\t0.82494,\n\t\t\t0.88472,\n\t\t\t0.106217,\n\t\t\t0.937255,\n\t\t\t0.83527,\n\t\t\t0.886029,\n\t\t\t0.102646,\n\t\t\t0.941176,\n\t\t\t0.845561,\n\t\t\t0.887322,\n\t\t\t0.099702,\n\t\t\t0.945098,\n\t\t\t0.85581,\n\t\t\t0.888601,\n\t\t\t0.097452,\n\t\t\t0.94902,\n\t\t\t0.866013,\n\t\t\t0.889868,\n\t\t\t0.095953,\n\t\t\t0.952941,\n\t\t\t0.876168,\n\t\t\t0.891125,\n\t\t\t0.09525,\n\t\t\t0.956863,\n\t\t\t0.886271,\n\t\t\t0.892374,\n\t\t\t0.095374,\n\t\t\t0.960784,\n\t\t\t0.89632,\n\t\t\t0.893616,\n\t\t\t0.096335,\n\t\t\t0.964706,\n\t\t\t0.906311,\n\t\t\t0.894855,\n\t\t\t0.098125,\n\t\t\t0.968627,\n\t\t\t0.916242,\n\t\t\t0.896091,\n\t\t\t0.100717,\n\t\t\t0.972549,\n\t\t\t0.926106,\n\t\t\t0.89733,\n\t\t\t0.104071,\n\t\t\t0.976471,\n\t\t\t0.935904,\n\t\t\t0.89857,\n\t\t\t0.108131,\n\t\t\t0.980392,\n\t\t\t0.945636,\n\t\t\t0.899815,\n\t\t\t0.112838,\n\t\t\t0.984314,\n\t\t\t0.9553,\n\t\t\t0.901065,\n\t\t\t0.118128,\n\t\t\t0.988235,\n\t\t\t0.964894,\n\t\t\t0.902323,\n\t\t\t0.123941,\n\t\t\t0.992157,\n\t\t\t0.974417,\n\t\t\t0.90359,\n\t\t\t0.130215,\n\t\t\t0.996078,\n\t\t\t0.983868,\n\t\t\t0.904867,\n\t\t\t0.136897,\n\t\t\t1,\n\t\t\t0.993248,\n\t\t\t0.906157,\n\t\t\t0.143936\n\t\t]\n\t},\n\t{\n\t\tShowIndexedColorActiveValues: 1,\n\t\tIndexedColors: [\n\t\t\t0.07,\n\t\t\t0.5,\n\t\t\t0.7,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.85,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t0.76,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.71,\n\t\t\t0.71,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.05,\n\t\t\t0.05,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.05,\n\t\t\t0.05,\n\t\t\t0.7,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7,\n\t\t\t0.89,\n\t\t\t0.96,\n\t\t\t0.67,\n\t\t\t0.36,\n\t\t\t0.95,\n\t\t\t0.54,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.75,\n\t\t\t0.65,\n\t\t\t0.65,\n\t\t\t0.5,\n\t\t\t0.6,\n\t\t\t0.6,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.19,\n\t\t\t0.12,\n\t\t\t0.94,\n\t\t\t0.12,\n\t\t\t0.5,\n\t\t\t0.82,\n\t\t\t0.89,\n\t\t\t0.56,\n\t\t\t0.25,\n\t\t\t0.83,\n\t\t\t0.24,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.9,\n\t\t\t0.9,\n\t\t\t0.9,\n\t\t\t0.75,\n\t\t\t0.76,\n\t\t\t0.78,\n\t\t\t0.65,\n\t\t\t0.65,\n\t\t\t0.67,\n\t\t\t0.54,\n\t\t\t0.6,\n\t\t\t0.78,\n\t\t\t0.61,\n\t\t\t0.48,\n\t\t\t0.78,\n\t\t\t0.5,\n\t\t\t0.48,\n\t\t\t0.78,\n\t\t\t0.44,\n\t\t\t0.48,\n\t\t\t0.78,\n\t\t\t0.36,\n\t\t\t0.48,\n\t\t\t0.76,\n\t\t\t1,\n\t\t\t0.48,\n\t\t\t0.38,\n\t\t\t0.49,\n\t\t\t0.5,\n\t\t\t0.69,\n\t\t\t0.76,\n\t\t\t0.56,\n\t\t\t0.56,\n\t\t\t0.4,\n\t\t\t0.56,\n\t\t\t0.56,\n\t\t\t0.74,\n\t\t\t0.5,\n\t\t\t0.89,\n\t\t\t1,\n\t\t\t0.63,\n\t\t\t0,\n\t\t\t0.65,\n\t\t\t0.16,\n\t\t\t0.16,\n\t\t\t0.36,\n\t\t\t0.72,\n\t\t\t0.82,\n\t\t\t0.44,\n\t\t\t0.18,\n\t\t\t0.69,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.58,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.58,\n\t\t\t0.88,\n\t\t\t0.88,\n\t\t\t0.45,\n\t\t\t0.76,\n\t\t\t0.79,\n\t\t\t0.33,\n\t\t\t0.71,\n\t\t\t0.71,\n\t\t\t0.23,\n\t\t\t0.62,\n\t\t\t0.62,\n\t\t\t0.14,\n\t\t\t0.56,\n\t\t\t0.56,\n\t\t\t0.04,\n\t\t\t0.49,\n\t\t\t0.55,\n\t\t\t0,\n\t\t\t0.41,\n\t\t\t0.52,\n\t\t\t0.88,\n\t\t\t0.88,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.85,\n\t\t\t0.56,\n\t\t\t0.65,\n\t\t\t0.46,\n\t\t\t0.45,\n\t\t\t0.4,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.62,\n\t\t\t0.39,\n\t\t\t0.71,\n\t\t\t0.83,\n\t\t\t0.48,\n\t\t\t0,\n\t\t\t0.58,\n\t\t\t0,\n\t\t\t0.58,\n\t\t\t0.26,\n\t\t\t0.62,\n\t\t\t0.69,\n\t\t\t0.34,\n\t\t\t0.09,\n\t\t\t0.56,\n\t\t\t0,\n\t\t\t0.79,\n\t\t\t0,\n\t\t\t0.44,\n\t\t\t0.83,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.85,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.78,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.64,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.56,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.38,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.27,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.19,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.12,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.61,\n\t\t\t0,\n\t\t\t0.9,\n\t\t\t0.46,\n\t\t\t0,\n\t\t\t0.83,\n\t\t\t0.32,\n\t\t\t0,\n\t\t\t0.75,\n\t\t\t0.22,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t0.14,\n\t\t\t0.3,\n\t\t\t0.76,\n\t\t\t1,\n\t\t\t0.3,\n\t\t\t0.65,\n\t\t\t1,\n\t\t\t0.13,\n\t\t\t0.58,\n\t\t\t0.84,\n\t\t\t0.15,\n\t\t\t0.49,\n\t\t\t0.67,\n\t\t\t0.15,\n\t\t\t0.4,\n\t\t\t0.59,\n\t\t\t0.09,\n\t\t\t0.33,\n\t\t\t0.53,\n\t\t\t0.96,\n\t\t\t0.93,\n\t\t\t0.82,\n\t\t\t0.8,\n\t\t\t0.82,\n\t\t\t0.12,\n\t\t\t0.71,\n\t\t\t0.71,\n\t\t\t0.76,\n\t\t\t0.65,\n\t\t\t0.33,\n\t\t\t0.3,\n\t\t\t0.34,\n\t\t\t0.35,\n\t\t\t0.38,\n\t\t\t0.62,\n\t\t\t0.31,\n\t\t\t0.71,\n\t\t\t0.67,\n\t\t\t0.36,\n\t\t\t0,\n\t\t\t0.46,\n\t\t\t0.31,\n\t\t\t0.27,\n\t\t\t0.26,\n\t\t\t0.51,\n\t\t\t0.59,\n\t\t\t0.26,\n\t\t\t0,\n\t\t\t0.4,\n\t\t\t0,\n\t\t\t0.49,\n\t\t\t0,\n\t\t\t0.44,\n\t\t\t0.67,\n\t\t\t0.98,\n\t\t\t0,\n\t\t\t0.73,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.63,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.56,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.42,\n\t\t\t1,\n\t\t\t0.33,\n\t\t\t0.36,\n\t\t\t0.95,\n\t\t\t0.47,\n\t\t\t0.36,\n\t\t\t0.89,\n\t\t\t0.54,\n\t\t\t0.31,\n\t\t\t0.89,\n\t\t\t0.63,\n\t\t\t0.21,\n\t\t\t0.83,\n\t\t\t0.7,\n\t\t\t0.12,\n\t\t\t0.83,\n\t\t\t0.7,\n\t\t\t0.12,\n\t\t\t0.73,\n\t\t\t0.7,\n\t\t\t0.05,\n\t\t\t0.65,\n\t\t\t0.74,\n\t\t\t0.05,\n\t\t\t0.53,\n\t\t\t0.78,\n\t\t\t0,\n\t\t\t0.4,\n\t\t\t0.8,\n\t\t\t0,\n\t\t\t0.35,\n\t\t\t0.82,\n\t\t\t0,\n\t\t\t0.31,\n\t\t\t0.85,\n\t\t\t0,\n\t\t\t0.27,\n\t\t\t0.88,\n\t\t\t0,\n\t\t\t0.22,\n\t\t\t0.9,\n\t\t\t0,\n\t\t\t0.18,\n\t\t\t0.91,\n\t\t\t0,\n\t\t\t0.15,\n\t\t\t0.92,\n\t\t\t0,\n\t\t\t0.14,\n\t\t\t0.93,\n\t\t\t0,\n\t\t\t0.13,\n\t\t\t0.94,\n\t\t\t0,\n\t\t\t0.12,\n\t\t\t0.95,\n\t\t\t0,\n\t\t\t0.11,\n\t\t\t0.96,\n\t\t\t0,\n\t\t\t0.1,\n\t\t\t0.97,\n\t\t\t0,\n\t\t\t0.09,\n\t\t\t0.98,\n\t\t\t0,\n\t\t\t0.08,\n\t\t\t0.99,\n\t\t\t0,\n\t\t\t0.07,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.06\n\t\t],\n\t\tAnnotations: [\n\t\t\t0,\n\t\t\t\"Xx\",\n\t\t\t1,\n\t\t\t\"H\",\n\t\t\t2,\n\t\t\t\"He\",\n\t\t\t3,\n\t\t\t\"Li\",\n\t\t\t4,\n\t\t\t\"Be\",\n\t\t\t5,\n\t\t\t\"B\",\n\t\t\t6,\n\t\t\t\"C\",\n\t\t\t7,\n\t\t\t\"N\",\n\t\t\t8,\n\t\t\t\"O\",\n\t\t\t9,\n\t\t\t\"F\",\n\t\t\t10,\n\t\t\t\"Ne\",\n\t\t\t11,\n\t\t\t\"Na\",\n\t\t\t12,\n\t\t\t\"Mg\",\n\t\t\t13,\n\t\t\t\"Al\",\n\t\t\t14,\n\t\t\t\"Si\",\n\t\t\t15,\n\t\t\t\"P\",\n\t\t\t16,\n\t\t\t\"S\",\n\t\t\t17,\n\t\t\t\"Cl\",\n\t\t\t18,\n\t\t\t\"Ar\",\n\t\t\t19,\n\t\t\t\"K\",\n\t\t\t20,\n\t\t\t\"Ca\",\n\t\t\t21,\n\t\t\t\"Sc\",\n\t\t\t22,\n\t\t\t\"Ti\",\n\t\t\t23,\n\t\t\t\"V\",\n\t\t\t24,\n\t\t\t\"Cr\",\n\t\t\t25,\n\t\t\t\"Mn\",\n\t\t\t26,\n\t\t\t\"Fe\",\n\t\t\t27,\n\t\t\t\"Co\",\n\t\t\t28,\n\t\t\t\"Ni\",\n\t\t\t29,\n\t\t\t\"Cu\",\n\t\t\t30,\n\t\t\t\"Zn\",\n\t\t\t31,\n\t\t\t\"Ga\",\n\t\t\t32,\n\t\t\t\"Ge\",\n\t\t\t33,\n\t\t\t\"As\",\n\t\t\t34,\n\t\t\t\"Se\",\n\t\t\t35,\n\t\t\t\"Br\",\n\t\t\t36,\n\t\t\t\"Kr\",\n\t\t\t37,\n\t\t\t\"Rb\",\n\t\t\t38,\n\t\t\t\"Sr\",\n\t\t\t39,\n\t\t\t\"Y\",\n\t\t\t40,\n\t\t\t\"Zr\",\n\t\t\t41,\n\t\t\t\"Nb\",\n\t\t\t42,\n\t\t\t\"Mo\",\n\t\t\t43,\n\t\t\t\"Tc\",\n\t\t\t44,\n\t\t\t\"Ru\",\n\t\t\t45,\n\t\t\t\"Rh\",\n\t\t\t46,\n\t\t\t\"Pd\",\n\t\t\t47,\n\t\t\t\"Ag\",\n\t\t\t48,\n\t\t\t\"Cd\",\n\t\t\t49,\n\t\t\t\"In\",\n\t\t\t50,\n\t\t\t\"Sn\",\n\t\t\t51,\n\t\t\t\"Sb\",\n\t\t\t52,\n\t\t\t\"Te\",\n\t\t\t53,\n\t\t\t\"I\",\n\t\t\t54,\n\t\t\t\"Xe\",\n\t\t\t55,\n\t\t\t\"Cs\",\n\t\t\t56,\n\t\t\t\"Ba\",\n\t\t\t57,\n\t\t\t\"La\",\n\t\t\t58,\n\t\t\t\"Ce\",\n\t\t\t59,\n\t\t\t\"Pr\",\n\t\t\t60,\n\t\t\t\"Nd\",\n\t\t\t61,\n\t\t\t\"Pm\",\n\t\t\t62,\n\t\t\t\"Sm\",\n\t\t\t63,\n\t\t\t\"Eu\",\n\t\t\t64,\n\t\t\t\"Gd\",\n\t\t\t65,\n\t\t\t\"Tb\",\n\t\t\t66,\n\t\t\t\"Dy\",\n\t\t\t67,\n\t\t\t\"Ho\",\n\t\t\t68,\n\t\t\t\"Er\",\n\t\t\t69,\n\t\t\t\"Tm\",\n\t\t\t70,\n\t\t\t\"Yb\",\n\t\t\t71,\n\t\t\t\"Lu\",\n\t\t\t72,\n\t\t\t\"Hf\",\n\t\t\t73,\n\t\t\t\"Ta\",\n\t\t\t74,\n\t\t\t\"W\",\n\t\t\t75,\n\t\t\t\"Re\",\n\t\t\t76,\n\t\t\t\"Os\",\n\t\t\t77,\n\t\t\t\"Ir\",\n\t\t\t78,\n\t\t\t\"Pt\",\n\t\t\t79,\n\t\t\t\"Au\",\n\t\t\t80,\n\t\t\t\"Hg\",\n\t\t\t81,\n\t\t\t\"Tl\",\n\t\t\t82,\n\t\t\t\"Pb\",\n\t\t\t83,\n\t\t\t\"Bi\",\n\t\t\t84,\n\t\t\t\"Po\",\n\t\t\t85,\n\t\t\t\"At\",\n\t\t\t86,\n\t\t\t\"Rn\",\n\t\t\t87,\n\t\t\t\"Fr\",\n\t\t\t88,\n\t\t\t\"Ra\",\n\t\t\t89,\n\t\t\t\"Ac\",\n\t\t\t90,\n\t\t\t\"Th\",\n\t\t\t91,\n\t\t\t\"Pa\",\n\t\t\t92,\n\t\t\t\"U\",\n\t\t\t93,\n\t\t\t\"Np\",\n\t\t\t94,\n\t\t\t\"Pu\",\n\t\t\t95,\n\t\t\t\"Am\",\n\t\t\t96,\n\t\t\t\"Cm\",\n\t\t\t97,\n\t\t\t\"Bk\",\n\t\t\t98,\n\t\t\t\"Cf\",\n\t\t\t99,\n\t\t\t\"Es\",\n\t\t\t100,\n\t\t\t\"Fm\",\n\t\t\t101,\n\t\t\t\"Md\",\n\t\t\t102,\n\t\t\t\"No\",\n\t\t\t103,\n\t\t\t\"Lr\",\n\t\t\t104,\n\t\t\t\"Rf\",\n\t\t\t105,\n\t\t\t\"Db\",\n\t\t\t106,\n\t\t\t\"Sg\",\n\t\t\t107,\n\t\t\t\"Bh\",\n\t\t\t108,\n\t\t\t\"Hs\",\n\t\t\t109,\n\t\t\t\"Mt\",\n\t\t\t110,\n\t\t\t\"Ds\",\n\t\t\t111,\n\t\t\t\"Rg\",\n\t\t\t112,\n\t\t\t\"Cn\",\n\t\t\t113,\n\t\t\t\"Uut\",\n\t\t\t114,\n\t\t\t\"Uuq\",\n\t\t\t115,\n\t\t\t\"Uup\",\n\t\t\t116,\n\t\t\t\"Uuh\",\n\t\t\t117,\n\t\t\t\"Uus\",\n\t\t\t118,\n\t\t\t\"Uuo\"\n\t\t],\n\t\tName: \"BlueObeliskElements\"\n\t}\n];\n\nexport { vtkColorMaps as v };\n","import { v as vtkColorMaps$1 } from './ColorMaps.json.js';\n\nvar presetMap = Object.create(null);\nvtkColorMaps$1.filter(function (p) {\n return p.RGBPoints;\n}).filter(function (p) {\n return p.ColorSpace !== 'CIELAB';\n}).forEach(function (p) {\n presetMap[p.Name] = p;\n}); // ----------------------------------------------------------------------------\n\nvar rgbPresetNames = Object.keys(presetMap);\nrgbPresetNames.sort(); // ----------------------------------------------------------------------------\n\nfunction getPresetByName(name) {\n return presetMap[name];\n} // ----------------------------------------------------------------------------\n\n\nfunction addPreset(preset) {\n if (!preset.RGBPoints || preset.ColorSpace === 'CIELAB') {\n return;\n }\n\n if (!presetMap[preset.Name]) {\n rgbPresetNames.push(preset.Name);\n rgbPresetNames.sort();\n }\n\n presetMap[preset.Name] = preset;\n} // ----------------------------------------------------------------------------\n\n\nfunction removePresetByName(name) {\n var index = rgbPresetNames.indexOf(name);\n\n if (index > -1) {\n rgbPresetNames.splice(index, 1);\n }\n\n delete presetMap[name];\n} // ----------------------------------------------------------------------------\n\n\nvar vtkColorMaps = {\n addPreset: addPreset,\n removePresetByName: removePresetByName,\n getPresetByName: getPresetByName,\n rgbPresetNames: rgbPresetNames\n};\n\nexport { vtkColorMaps as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkColorTransferFunction from './ColorTransferFunction.js';\nimport vtkPiecewiseFunction from '../../Common/DataModel/PiecewiseFunction.js';\nimport Constants from './VolumeProperty/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar InterpolationType = Constants.InterpolationType,\n OpacityMode = Constants.OpacityMode;\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar VTK_MAX_VRCOMP = 4; // ----------------------------------------------------------------------------\n// vtkVolumeProperty methods\n// ----------------------------------------------------------------------------\n\nfunction vtkVolumeProperty(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkVolumeProperty');\n\n publicAPI.getMTime = function () {\n var mTime = model.mtime;\n var time;\n\n for (var index = 0; index < VTK_MAX_VRCOMP; index++) {\n // Color MTimes\n if (model.componentData[index].colorChannels === 1) {\n if (model.componentData[index].grayTransferFunction) {\n // time that Gray transfer function was last modified\n time = model.componentData[index].grayTransferFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n } else if (model.componentData[index].colorChannels === 3) {\n if (model.componentData[index].rGBTransferFunction) {\n // time that RGB transfer function was last modified\n time = model.componentData[index].rGBTransferFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n } // Opacity MTimes\n\n\n if (model.componentData[index].scalarOpacity) {\n // time that Scalar opacity transfer function was last modified\n time = model.componentData[index].scalarOpacity.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n\n if (model.componentData[index].gradientOpacity) {\n if (!model.componentData[index].disableGradientOpacity) {\n // time that Gradient opacity transfer function was last modified\n time = model.componentData[index].gradientOpacity.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n }\n }\n\n return mTime;\n };\n\n publicAPI.getColorChannels = function (index) {\n if (index < 0 || index > 3) {\n vtkErrorMacro('Bad index - must be between 0 and 3');\n return 0;\n }\n\n return model.componentData[index].colorChannels;\n }; // Set the color of a volume to a gray transfer function\n\n\n publicAPI.setGrayTransferFunction = function (index, func) {\n var modified = false;\n\n if (model.componentData[index].grayTransferFunction !== func) {\n model.componentData[index].grayTransferFunction = func;\n modified = true;\n }\n\n if (model.componentData[index].colorChannels !== 1) {\n model.componentData[index].colorChannels = 1;\n modified = true;\n }\n\n if (modified) {\n publicAPI.modified();\n }\n\n return modified;\n }; // Get the currently set gray transfer function. Create one if none set.\n\n\n publicAPI.getGrayTransferFunction = function (index) {\n if (model.componentData[index].grayTransferFunction === null) {\n model.componentData[index].grayTransferFunction = vtkPiecewiseFunction.newInstance();\n model.componentData[index].grayTransferFunction.addPoint(0, 0.0);\n model.componentData[index].grayTransferFunction.addPoint(1024, 1.0);\n\n if (model.componentData[index].colorChannels !== 1) {\n model.componentData[index].colorChannels = 1;\n }\n\n publicAPI.modified();\n }\n\n return model.componentData[index].grayTransferFunction;\n }; // Set the color of a volume to an RGB transfer function\n\n\n publicAPI.setRGBTransferFunction = function (index, func) {\n var modified = false;\n\n if (model.componentData[index].rGBTransferFunction !== func) {\n model.componentData[index].rGBTransferFunction = func;\n modified = true;\n }\n\n if (model.componentData[index].colorChannels !== 3) {\n model.componentData[index].colorChannels = 3;\n modified = true;\n }\n\n if (modified) {\n publicAPI.modified();\n }\n\n return modified;\n }; // Get the currently set RGB transfer function. Create one if none set.\n\n\n publicAPI.getRGBTransferFunction = function (index) {\n if (model.componentData[index].rGBTransferFunction === null) {\n model.componentData[index].rGBTransferFunction = vtkColorTransferFunction.newInstance();\n model.componentData[index].rGBTransferFunction.addRGBPoint(0, 0.0, 0.0, 0.0);\n model.componentData[index].rGBTransferFunction.addRGBPoint(1024, 1.0, 1.0, 1.0);\n\n if (model.componentData[index].colorChannels !== 3) {\n model.componentData[index].colorChannels = 3;\n }\n\n publicAPI.modified();\n }\n\n return model.componentData[index].rGBTransferFunction;\n }; // Set the scalar opacity of a volume to a transfer function\n\n\n publicAPI.setScalarOpacity = function (index, func) {\n if (model.componentData[index].scalarOpacity !== func) {\n model.componentData[index].scalarOpacity = func;\n publicAPI.modified();\n return true;\n }\n\n return false;\n }; // Get the scalar opacity transfer function. Create one if none set.\n\n\n publicAPI.getScalarOpacity = function (index) {\n if (model.componentData[index].scalarOpacity === null) {\n model.componentData[index].scalarOpacity = vtkPiecewiseFunction.newInstance();\n model.componentData[index].scalarOpacity.addPoint(0, 1.0);\n model.componentData[index].scalarOpacity.addPoint(1024, 1.0);\n publicAPI.modified();\n }\n\n return model.componentData[index].scalarOpacity;\n };\n\n publicAPI.setComponentWeight = function (index, value) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return false;\n }\n\n var val = Math.min(1, Math.max(0, value));\n\n if (model.componentData[index].componentWeight !== val) {\n model.componentData[index].componentWeight = val;\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n\n publicAPI.getComponentWeight = function (index) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return 0.0;\n }\n\n return model.componentData[index].componentWeight;\n };\n\n publicAPI.setInterpolationTypeToNearest = function () {\n return publicAPI.setInterpolationType(InterpolationType.NEAREST);\n };\n\n publicAPI.setInterpolationTypeToLinear = function () {\n return publicAPI.setInterpolationType(InterpolationType.LINEAR);\n };\n\n publicAPI.setInterpolationTypeToFastLinear = function () {\n return publicAPI.setInterpolationType(InterpolationType.FAST_LINEAR);\n };\n\n publicAPI.getInterpolationTypeAsString = function () {\n return macro.enumToString(InterpolationType, model.interpolationType);\n };\n\n var sets = ['useGradientOpacity', 'scalarOpacityUnitDistance', 'gradientOpacityMinimumValue', 'gradientOpacityMinimumOpacity', 'gradientOpacityMaximumValue', 'gradientOpacityMaximumOpacity', 'opacityMode'];\n sets.forEach(function (val) {\n var cap = macro.capitalize(val);\n\n publicAPI[\"set\".concat(cap)] = function (index, value) {\n if (model.componentData[index][\"\".concat(val)] !== value) {\n model.componentData[index][\"\".concat(val)] = value;\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n });\n var gets = ['useGradientOpacity', 'scalarOpacityUnitDistance', 'gradientOpacityMinimumValue', 'gradientOpacityMinimumOpacity', 'gradientOpacityMaximumValue', 'gradientOpacityMaximumOpacity', 'opacityMode'];\n gets.forEach(function (val) {\n var cap = macro.capitalize(val);\n\n publicAPI[\"get\".concat(cap)] = function (index) {\n return model.componentData[index][\"\".concat(val)];\n };\n });\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n independentComponents: true,\n interpolationType: InterpolationType.FAST_LINEAR,\n shade: false,\n ambient: 0.1,\n diffuse: 0.7,\n specular: 0.2,\n specularPower: 10.0,\n useLabelOutline: false,\n labelOutlineThickness: 1,\n labelOutlineOpacity: 1.0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n\n if (!model.componentData) {\n model.componentData = [];\n\n for (var i = 0; i < VTK_MAX_VRCOMP; ++i) {\n model.componentData.push({\n colorChannels: 1,\n grayTransferFunction: null,\n rGBTransferFunction: null,\n scalarOpacity: null,\n scalarOpacityUnitDistance: 1.0,\n opacityMode: OpacityMode.FRACTIONAL,\n gradientOpacityMinimumValue: 0,\n gradientOpacityMinimumOpacity: 0.0,\n gradientOpacityMaximumValue: 1.0,\n gradientOpacityMaximumOpacity: 1.0,\n useGradientOpacity: false,\n componentWeight: 1.0\n });\n }\n }\n\n macro.setGet(publicAPI, model, ['independentComponents', 'interpolationType', 'shade', 'ambient', 'diffuse', 'specular', 'specularPower', 'useLabelOutline', 'labelOutlineThickness', 'labelOutlineOpacity']); // Object methods\n\n vtkVolumeProperty(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkVolumeProperty'); // ----------------------------------------------------------------------------\n\nvar vtkVolumeProperty$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkVolumeProperty$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkProp3D from './Prop3D.js';\nimport vtkVolumeProperty from './VolumeProperty.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkVolume methods\n// ----------------------------------------------------------------------------\n\nfunction vtkVolume(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkVolume');\n\n publicAPI.getVolumes = function () {\n return publicAPI;\n };\n\n publicAPI.makeProperty = vtkVolumeProperty.newInstance;\n\n publicAPI.getProperty = function () {\n if (model.property === null) {\n model.property = publicAPI.makeProperty();\n }\n\n return model.property;\n };\n\n publicAPI.getBounds = function () {\n if (model.mapper === null) {\n return model.bounds;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.mapper.getBounds();\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n model.bounds = [1, -1, 1, -1, 1, -1];\n model.boundsMTime.modified();\n return bds;\n } // Check if we have cached values for these bounds - we cache the\n // values returned by model.mapper.getBounds() and we store the time\n // of caching. If the values returned this time are different, or\n // the modified time of this class is newer than the cached time,\n // then we need to rebuild.\n\n\n var zip = function zip(rows) {\n return rows[0].map(function (_, c) {\n return rows.map(function (row) {\n return row[c];\n });\n });\n };\n\n if (!model.mapperBounds || !zip([bds, model.mapperBounds]).reduce(function (a, b) {\n return a && b[0] === b[1];\n }, true) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {\n vtkDebugMacro('Recomputing bounds...');\n model.mapperBounds = bds.map(function (x) {\n return x;\n });\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n /* eslint-disable no-multi-assign */\n\n model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;\n model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;\n /* eslint-enable no-multi-assign */\n\n model.bounds = model.bounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n model.boundsMTime.modified();\n }\n\n return model.bounds;\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.property !== null) {\n var time = model.property.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getRedrawMTime = function () {\n var mt = model.mtime;\n\n if (model.mapper !== null) {\n var time = model.mapper.getMTime();\n mt = time > mt ? time : mt;\n\n if (model.mapper.getInput() !== null) {\n // FIXME !!! getInputAlgorithm / getInput\n model.mapper.getInputAlgorithm().update();\n time = model.mapper.getInput().getMTime();\n mt = time > mt ? time : mt;\n }\n }\n\n return mt;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n mapper: null,\n property: null,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp3D.extend(publicAPI, model, initialValues); // vtkTimeStamp\n\n model.boundsMTime = {};\n macro.obj(model.boundsMTime); // Build VTK API\n\n macro.set(publicAPI, model, ['property']);\n macro.setGet(publicAPI, model, ['mapper']);\n macro.getArray(publicAPI, model, ['bounds'], 6); // Object methods\n\n vtkVolume(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkVolume'); // ----------------------------------------------------------------------------\n\nvar vtkVolume$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkVolume$1 as default, extend, newInstance };\n","import { vtkSharedVolumeMapper } from '../vtkClasses';\nimport { getConfiguration } from '../../init';\n/**\n * Given an imageData and a vtkOpenGLTexture, it creates a \"shared\" vtk volume mapper\n * from which various volume actors can be created.\n *\n * @param imageData - the vtkImageData object that contains the data to\n * render.\n * @param vtkOpenGLTexture - The vtkOpenGLTexture that will be used to render\n * the volume.\n * @returns The volume mapper.\n */\nexport default function createVolumeMapper(\n imageData: any,\n vtkOpenGLTexture: any\n): any {\n const volumeMapper = vtkSharedVolumeMapper.newInstance();\n\n if (getConfiguration().rendering.preferSizeOverAccuracy) {\n volumeMapper.setPreferSizeOverAccuracy(true);\n }\n\n volumeMapper.setInputData(imageData);\n\n const spacing = imageData.getSpacing();\n // Set the sample distance to half the mean length of one side. This is where the divide by 6 comes from.\n // https://github.com/Kitware/VTK/blob/6b559c65bb90614fb02eb6d1b9e3f0fca3fe4b0b/Rendering/VolumeOpenGL2/vtkSmartVolumeMapper.cxx#L344\n const sampleDistance = (spacing[0] + spacing[1] + spacing[2]) / 6;\n\n // This is to allow for good pixel level image quality.\n // Todo: why we are setting this to 4000? Is this a good number? it should be configurable\n volumeMapper.setMaximumSamplesPerRay(4000);\n volumeMapper.setSampleDistance(sampleDistance);\n volumeMapper.setScalarTexture(vtkOpenGLTexture);\n\n return volumeMapper;\n}\n","import {\n VolumeActor,\n IImageVolume,\n VOIRange,\n ScalingParameters,\n} from '../../types';\nimport { loadAndCacheImage } from '../../loaders/imageLoader';\nimport * as metaData from '../../metaData';\nimport { getMinMax, windowLevel } from '../../utilities';\nimport { RequestType } from '../../enums';\n\nconst PRIORITY = 0;\nconst REQUEST_TYPE = RequestType.Prefetch;\n\n/**\n * It sets the default window level of an image volume based on the VOI.\n * It first look for the VOI in the metadata and if it is not found, it\n * loads the middle slice image (middle imageId) and based on its min\n * and max pixel values, it calculates the VOI.\n * Finally it sets the VOI on the volumeActor transferFunction\n * @param volumeActor - The volume actor\n * @param imageVolume - The image volume that we want to set the VOI for.\n */\nasync function setDefaultVolumeVOI(\n volumeActor: VolumeActor,\n imageVolume: IImageVolume,\n use16BitTexture: boolean\n): Promise {\n let voi = getVOIFromMetadata(imageVolume);\n\n if (!voi) {\n voi = await getVOIFromMinMax(imageVolume, use16BitTexture);\n }\n\n if (!voi || voi.lower === undefined || voi.upper === undefined) {\n throw new Error(\n 'Could not get VOI from metadata, nor from the min max of the image middle slice'\n );\n }\n\n voi = handlePreScaledVolume(imageVolume, voi);\n const { lower, upper } = voi;\n\n volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .setMappingRange(lower, upper);\n}\n\nfunction handlePreScaledVolume(imageVolume: IImageVolume, voi: VOIRange) {\n const imageIds = imageVolume.imageIds;\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageIds[imageIdIndex];\n\n const generalSeriesModule =\n metaData.get('generalSeriesModule', imageId) || {};\n\n /**\n * If the volume is prescaled and the modality is PT Sometimes you get super high\n * values at the peak and it skews the min/max so nothing useful is displayed\n * Therefore, we follow the majority of other viewers and we set the min/max\n * for the scaled PT to be 0, 5\n */\n if (_isCurrentImagePTPrescaled(generalSeriesModule.modality, imageVolume)) {\n return {\n lower: 0,\n upper: 5,\n };\n }\n\n return voi;\n}\n\n/**\n * Get the VOI from the metadata of the middle slice of the image volume. It checks\n * the metadata for the VOI and if it is not found, it returns null\n *\n * @param imageVolume - The image volume that we want to get the VOI from.\n * @returns VOIRange with lower and upper values\n */\nfunction getVOIFromMetadata(imageVolume: IImageVolume): VOIRange {\n const { imageIds } = imageVolume;\n\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageIds[imageIdIndex];\n\n const voiLutModule = metaData.get('voiLutModule', imageId);\n\n if (voiLutModule && voiLutModule.windowWidth && voiLutModule.windowCenter) {\n const { windowWidth, windowCenter } = voiLutModule;\n\n const voi = {\n windowWidth: Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,\n windowCenter: Array.isArray(windowCenter)\n ? windowCenter[0]\n : windowCenter,\n };\n\n const { lower, upper } = windowLevel.toLowHighRange(\n Number(voi.windowWidth),\n Number(voi.windowCenter)\n );\n\n return {\n lower,\n upper,\n };\n }\n}\n\n/**\n * It loads the middle slice image (middle imageId) and based on its min\n * and max pixel values, it calculates the VOI.\n *\n * @param imageVolume - The image volume that we want to get the VOI from.\n * @returns The VOIRange with lower and upper values\n */\nasync function getVOIFromMinMax(\n imageVolume: IImageVolume,\n use16BitTexture: boolean\n): Promise {\n const { imageIds } = imageVolume;\n const scalarData = imageVolume.getScalarData();\n\n // Get the middle image from the list of imageIds\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageVolume.imageIds[imageIdIndex];\n const generalSeriesModule =\n metaData.get('generalSeriesModule', imageId) || {};\n const { modality } = generalSeriesModule;\n const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};\n\n const numImages = imageIds.length;\n const bytesPerImage = scalarData.byteLength / numImages;\n const voxelsPerImage = scalarData.length / numImages;\n const bytePerPixel = scalarData.BYTES_PER_ELEMENT;\n\n const scalingParameters: ScalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality,\n };\n\n let scalingParametersToUse;\n if (modality === 'PT') {\n const suvFactor = metaData.get('scalingModule', imageId);\n\n if (suvFactor) {\n scalingParametersToUse = {\n ...scalingParameters,\n suvbw: suvFactor.suvbw,\n };\n }\n }\n\n const byteOffset = imageIdIndex * bytesPerImage;\n\n const options = {\n targetBuffer: {\n type: use16BitTexture ? undefined : 'Float32Array',\n },\n priority: PRIORITY,\n requestType: REQUEST_TYPE,\n preScale: {\n enabled: true,\n scalingParameters: scalingParametersToUse,\n },\n };\n\n // Loading the middle slice image for a volume has two scenarios, the first one is that\n // uses the same volumeLoader which might not resolve to an image (since for performance\n // reasons volumes' pixelData is set via offset and length on the volume arrayBuffer\n // when each slice is loaded). The second scenario is that the image might not reach\n // to the volumeLoader, and an already cached image (with Image object) is used\n // instead. For the first scenario, we use the arrayBuffer of the volume to get the correct\n // slice for the imageScalarData, and for the second scenario we use the getPixelData\n // on the Cornerstone IImage object to get the pixel data.\n const image = await loadAndCacheImage(imageId, options);\n\n let imageScalarData;\n if (!image) {\n imageScalarData = _getImageScalarDataFromImageVolume(\n imageVolume,\n byteOffset,\n bytePerPixel,\n voxelsPerImage\n );\n } else {\n imageScalarData = image.getPixelData();\n }\n\n // Get the min and max pixel values of the middle slice\n const { min, max } = getMinMax(imageScalarData);\n\n return {\n lower: min,\n upper: max,\n };\n}\n\nfunction _getImageScalarDataFromImageVolume(\n imageVolume,\n byteOffset,\n bytePerPixel,\n voxelsPerImage\n) {\n const { scalarData } = imageVolume;\n const { volumeBuffer } = scalarData;\n if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {\n byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;\n }\n\n const TypedArray = scalarData.constructor;\n const imageScalarData = new TypedArray(voxelsPerImage);\n\n const volumeBufferView = new TypedArray(\n volumeBuffer,\n byteOffset,\n voxelsPerImage\n );\n\n imageScalarData.set(volumeBufferView);\n\n return imageScalarData;\n}\n\nfunction _isCurrentImagePTPrescaled(modality, imageVolume) {\n if (modality !== 'PT' || !imageVolume.isPreScaled) {\n return false;\n }\n\n if (!imageVolume.scaling?.PT.suvbw) {\n return false;\n }\n\n return true;\n}\n\nexport default setDefaultVolumeVOI;\n","import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\n\nimport { VolumeActor } from './../../types/IActor';\nimport { VoiModifiedEventDetail } from './../../types/EventTypes';\nimport { loadVolume } from '../../loaders/volumeLoader';\nimport createVolumeMapper from './createVolumeMapper';\nimport BlendModes from '../../enums/BlendModes';\nimport { triggerEvent } from '../../utilities';\nimport { Events } from '../../enums';\nimport setDefaultVolumeVOI from './setDefaultVolumeVOI';\n\ninterface createVolumeActorInterface {\n volumeId: string;\n callback?: ({\n volumeActor,\n volumeId,\n }: {\n volumeActor: VolumeActor;\n volumeId: string;\n }) => void;\n blendMode?: BlendModes;\n}\n\n/**\n * Given a volumeId, it creates a vtk volume actor and returns it. If\n * callback is provided, it will be called with the volume actor and the\n * volumeId. If blendMode is provided, it will be set on the volume actor.\n *\n * @param props - createVolumeActorInterface\n * @returns A promise that resolves to a VolumeActor.\n */\nasync function createVolumeActor(\n props: createVolumeActorInterface,\n element: HTMLDivElement,\n viewportId: string,\n suppressEvents = false,\n use16BitTexture = false\n): Promise {\n const { volumeId, callback, blendMode } = props;\n\n const imageVolume = await loadVolume(volumeId);\n\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${imageVolume.volumeId} does not exist`\n );\n }\n\n const { imageData, vtkOpenGLTexture } = imageVolume;\n\n const volumeMapper = createVolumeMapper(imageData, vtkOpenGLTexture);\n\n if (blendMode) {\n volumeMapper.setBlendMode(blendMode);\n }\n\n const volumeActor = vtkVolume.newInstance();\n volumeActor.setMapper(volumeMapper);\n\n const numberOfComponents = imageData\n .getPointData()\n .getScalars()\n .getNumberOfComponents();\n\n if (numberOfComponents === 3) {\n volumeActor.getProperty().setIndependentComponents(false);\n }\n\n // If the volume is composed of imageIds, we can apply a default VOI based\n // on either the metadata or the min/max of the middle slice. Example of other\n // types of volumes which might not be composed of imageIds would be e.g., nrrd, nifti\n // format volumes\n if (imageVolume.imageIds) {\n await setDefaultVolumeVOI(volumeActor, imageVolume, use16BitTexture);\n }\n\n if (callback) {\n callback({ volumeActor, volumeId });\n }\n\n if (!suppressEvents) {\n triggerVOIModified(element, viewportId, volumeActor, volumeId);\n }\n\n return volumeActor;\n}\n\nfunction triggerVOIModified(\n element: HTMLDivElement,\n viewportId: string,\n volumeActor: VolumeActor,\n volumeId: string\n) {\n const voiRange = volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .getRange();\n\n const voiModifiedEventDetail: VoiModifiedEventDetail = {\n viewportId,\n range: {\n lower: voiRange[0],\n upper: voiRange[1],\n },\n volumeId,\n };\n\n triggerEvent(element, Events.VOI_MODIFIED, voiModifiedEventDetail);\n}\n\nexport default createVolumeActor;\n","import BaseVolumeViewport from '../BaseVolumeViewport';\nimport type {\n IVolumeInput,\n IRenderingEngine,\n IVolumeViewport,\n} from '../../types';\n\n/**\n * Similar to {@link addVolumesToViewports} it adds volumes to viewports; however,\n * this method will Set the volumes on the viewports which means that the previous\n * volumes will be removed.\n *\n * @param renderingEngine - The rendering engine to use to get viewports from\n * @param volumeInputs - Array of volume inputs including volumeId. Other properties\n * such as visibility, callback, blendMode, slabThickness are optional\n * @param viewportIds - Array of viewport IDs to add the volume to\n * @param immediateRender - If true, the volumes will be rendered immediately\n * @returns A promise that resolves when all volumes have been added\n */\nasync function setVolumesForViewports(\n renderingEngine: IRenderingEngine,\n volumeInputs: Array,\n viewportIds: Array,\n immediateRender = false,\n suppressEvents = false\n): Promise {\n // Check if all viewports are volumeViewports\n viewportIds.forEach((viewportId) => {\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!viewport) {\n throw new Error(`Viewport with Id ${viewportId} does not exist`);\n }\n\n // if not instance of BaseVolumeViewport, throw\n if (!(viewport instanceof BaseVolumeViewport)) {\n throw new Error(\n 'setVolumesForViewports only supports VolumeViewport and VolumeViewport3D'\n );\n }\n });\n\n const setVolumePromises = viewportIds.map(async (viewportId) => {\n const viewport = renderingEngine.getViewport(viewportId) as IVolumeViewport;\n\n await viewport.setVolumes(volumeInputs, immediateRender, suppressEvents);\n });\n\n await Promise.all(setVolumePromises);\n\n return;\n}\n\nexport default setVolumesForViewports;\n","import { VolumeViewport } from '../';\nimport BaseVolumeViewport from '../BaseVolumeViewport';\nimport type { IVolumeInput, IRenderingEngine } from '../../types';\n\n/**\n * For each provided viewport it adds a volume to the viewport using the\n * provided renderingEngine\n *\n *\n * @param renderingEngine - The rendering engine to use to get viewports from\n * @param volumeInputs - Array of volume inputs including volumeId. Other properties\n * such as visibility, callback, blendMode, slabThickness are optional\n * @param viewportIds - Array of viewport IDs to add the volume to\n * @param immediateRender - If true, the volumes will be rendered immediately\n * @returns A promise that resolves when all volumes have been added\n */\nasync function addVolumesToViewports(\n renderingEngine: IRenderingEngine,\n volumeInputs: Array,\n viewportIds: Array,\n immediateRender = false,\n suppressEvents = false\n): Promise {\n // Check if all viewports are volumeViewports\n for (const viewportId of viewportIds) {\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!viewport) {\n throw new Error(`Viewport with Id ${viewportId} does not exist`);\n }\n\n // if not instance of BaseVolumeViewport, throw\n if (!(viewport instanceof BaseVolumeViewport)) {\n console.warn(\n `Viewport with Id ${viewportId} is not a BaseVolumeViewport. Cannot add volume to this viewport.`\n );\n\n return;\n }\n }\n\n const addVolumePromises = viewportIds.map(async (viewportId) => {\n const viewport = renderingEngine.getViewport(viewportId) as VolumeViewport;\n\n await viewport.addVolumes(volumeInputs, immediateRender, suppressEvents);\n });\n\n await Promise.all(addVolumePromises);\n return;\n}\n\nexport default addVolumesToViewports;\n","import {\n getImageSliceDataForVolumeViewport,\n triggerEvent,\n} from '../../utilities';\nimport { EventTypes } from '../../types';\nimport { Events } from '../../enums';\nimport { getRenderingEngine } from '../getRenderingEngine';\nimport BaseVolumeViewport from '../BaseVolumeViewport';\n\n// Keeping track of previous imageIndex for each viewportId\ntype VolumeImageState = Record;\n\nconst state: VolumeImageState = {};\n\nexport function resetVolumeNewImageState(viewportId: string): void {\n if (state[viewportId] !== undefined) {\n delete state[viewportId];\n }\n}\n\n/**\n * It captures the camera modified event and with the camera focal point and viewPlaneNomad\n * it calculates the image index in the view direction. Finally it triggers\n * a VOLUME_NEW_IMAGE event with the image index.\n *\n * @internal\n *\n * @param cameraEvent - The camera modified event\n * @param viewportImageData - The image data of the viewport\n */\nfunction volumeNewImageEventDispatcher(\n cameraEvent: EventTypes.CameraModifiedEvent\n): void {\n const { renderingEngineId, viewportId } = cameraEvent.detail;\n const renderingEngine = getRenderingEngine(renderingEngineId);\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!(viewport instanceof BaseVolumeViewport)) {\n throw new Error(\n `volumeNewImageEventDispatcher: viewport is not a BaseVolumeViewport`\n );\n }\n\n if (state[viewport.id] === undefined) {\n state[viewport.id] = 0;\n }\n\n const sliceData = getImageSliceDataForVolumeViewport(viewport);\n\n if (!sliceData) {\n console.warn(\n `volumeNewImageEventDispatcher: sliceData is undefined for viewport ${viewport.id}`\n );\n return;\n }\n\n const { numberOfSlices, imageIndex } = sliceData;\n\n if (state[viewport.id] === imageIndex) {\n return;\n }\n\n state[viewport.id] = imageIndex;\n\n const eventDetail: EventTypes.VolumeNewImageEventDetail = {\n imageIndex,\n viewportId,\n renderingEngineId,\n numberOfSlices,\n };\n\n triggerEvent(viewport.element, Events.VOLUME_NEW_IMAGE, eventDetail);\n}\n\nexport default volumeNewImageEventDispatcher;\n","import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera';\nimport vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';\nimport vtkMath from '@kitware/vtk.js/Common/Core/Math';\nimport vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';\n\nimport { vec2, vec3 } from 'gl-matrix';\nimport _cloneDeep from 'lodash.clonedeep';\n\nimport Events from '../enums/Events';\nimport ViewportStatus from '../enums/ViewportStatus';\nimport ViewportType from '../enums/ViewportType';\nimport renderingEngineCache from './renderingEngineCache';\nimport { triggerEvent, planar, isImageActor, actorIsA } from '../utilities';\nimport hasNaNValues from '../utilities/hasNaNValues';\nimport { RENDERING_DEFAULTS } from '../constants';\nimport type {\n ICamera,\n ActorEntry,\n IRenderingEngine,\n ViewportInputOptions,\n Point2,\n Point3,\n FlipDirection,\n EventTypes,\n DisplayArea,\n} from '../types';\nimport type { ViewportInput, IViewport } from '../types/IViewport';\nimport type { vtkSlabCamera } from './vtkClasses/vtkSlabCamera';\nimport { getConfiguration } from '../init';\nimport IImageCalibration from '../types/IImageCalibration';\n\n/**\n * An object representing a single viewport, which is a camera\n * looking into a viewport, and an associated target output `HTMLDivElement`.\n * Viewport is a base class that can be extended to create a specific\n * viewport type. Both VolumeViewport and StackViewport are subclasses\n * of Viewport. Common logic for all viewports is contained in Viewport class\n * which is camera properties/methods, vtk.js actors, and other common\n * logic.\n */\nclass Viewport implements IViewport {\n /** unique identifier for the viewport */\n readonly id: string;\n /** HTML element in DOM that is used for rendering the viewport */\n readonly element: HTMLDivElement;\n /** an internal canvas that is created on the provided HTML element */\n readonly canvas: HTMLCanvasElement;\n /** RenderingEngine id that the viewport belongs to */\n readonly renderingEngineId: string;\n /** Type of viewport */\n readonly type: ViewportType;\n protected flipHorizontal = false;\n protected flipVertical = false;\n public isDisabled: boolean;\n /** Record the renddering status, mostly for testing purposes, but can also\n * be useful for knowing things like whether the viewport is initialized\n */\n public viewportStatus: ViewportStatus = ViewportStatus.NO_DATA;\n\n /** sx of viewport on the offscreen canvas */\n sx: number;\n /** sy of viewport on the offscreen canvas */\n sy: number;\n /** sWidth of viewport on the offscreen canvas */\n sWidth: number;\n /** sHeight of viewport on the offscreen canvas */\n sHeight: number;\n /** a Map containing the actor uid and actors */\n _actors: Map;\n /** Default options for the viewport which includes orientation, viewPlaneNormal and backgroundColor */\n readonly defaultOptions: any;\n /** options for the viewport which includes orientation axis, backgroundColor and displayArea */\n options: ViewportInputOptions;\n private _suppressCameraModifiedEvents = false;\n /** A flag representing if viewport methods should fire events or not */\n readonly suppressEvents: boolean;\n protected hasPixelSpacing = true;\n protected calibration: IImageCalibration;\n /** The camera that is initially defined on the reset for\n * the relative pan/zoom\n */\n protected initialCamera: ICamera;\n /** The camera that is defined for resetting displayArea to ensure absolute displayArea\n * settings\n */\n private fitToCanvasCamera: ICamera;\n\n constructor(props: ViewportInput) {\n this.id = props.id;\n this.renderingEngineId = props.renderingEngineId;\n this.type = props.type;\n this.element = props.element;\n this.canvas = props.canvas;\n this.sx = props.sx;\n this.sy = props.sy;\n this.sWidth = props.sWidth;\n this.sHeight = props.sHeight;\n this._actors = new Map();\n // Set data attributes for render events\n this.element.setAttribute('data-viewport-uid', this.id);\n this.element.setAttribute(\n 'data-rendering-engine-uid',\n this.renderingEngineId\n );\n\n this.defaultOptions = _cloneDeep(props.defaultOptions);\n this.suppressEvents = props.defaultOptions.suppressEvents\n ? props.defaultOptions.suppressEvents\n : false;\n this.options = _cloneDeep(props.defaultOptions);\n this.isDisabled = false;\n }\n\n getRotation: () => number;\n getFrameOfReferenceUID: () => string;\n canvasToWorld: (canvasPos: Point2) => Point3;\n worldToCanvas: (worldPos: Point3) => Point2;\n customRenderViewportToCanvas: () => unknown;\n resize: () => void;\n getProperties: () => void;\n updateRenderingPipeline: () => void;\n\n static get useCustomRenderingPipeline(): boolean {\n return false;\n }\n\n /**\n * Indicate that the image has been rendered.\n * This will set the viewportStatus to RENDERED if there is image data\n * available to actually be rendered - otherwise, the rendering simply showed\n * the background image.\n */\n public setRendered() {\n if (\n this.viewportStatus === ViewportStatus.NO_DATA ||\n this.viewportStatus === ViewportStatus.LOADING\n ) {\n return;\n }\n this.viewportStatus = ViewportStatus.RENDERED;\n }\n\n /**\n * Returns the rendering engine driving the `Viewport`.\n *\n * @returns The RenderingEngine instance.\n */\n public getRenderingEngine(): IRenderingEngine {\n return renderingEngineCache.get(this.renderingEngineId);\n }\n\n /**\n * Returns the `vtkRenderer` responsible for rendering the `Viewport`.\n *\n * @returns The `vtkRenderer` for the `Viewport`.\n */\n public getRenderer(): any {\n const renderingEngine = this.getRenderingEngine();\n\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n throw new Error('Rendering engine has been destroyed');\n }\n\n return renderingEngine.offscreenMultiRenderWindow.getRenderer(this.id);\n }\n\n /**\n * Renders the `Viewport` using the `RenderingEngine`.\n */\n public render(): void {\n const renderingEngine = this.getRenderingEngine();\n\n renderingEngine.renderViewport(this.id);\n }\n\n /**\n * Sets new options and (TODO) applies them.\n *\n * @param options - The viewport options to set.\n * @param immediate - If `true`, renders the viewport after the options are set.\n */\n public setOptions(options: ViewportInputOptions, immediate = false): void {\n this.options = _cloneDeep(options);\n\n // TODO When this is needed we need to move the camera position.\n // We can steal some logic from the tools we build to do this.\n if (this.options?.displayArea) {\n this.setDisplayArea(this.options?.displayArea);\n }\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Resets the options the `Viewport`'s `defaultOptions`\n *\n * @param immediate - If `true`, renders the viewport after the options are reset.\n */\n public reset(immediate = false) {\n this.options = _cloneDeep(this.defaultOptions);\n\n // TODO When this is needed we need to move the camera position.\n // We can steal some logic from the tools we build to do this.\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Flip the viewport on horizontal or vertical axis, this method\n * works with vtk-js backed rendering pipeline.\n *\n * @param flipOptions - Flip options specifying the axis of flip\n * @param flipOptions.flipHorizontal - Flip the viewport on horizontal axis\n * @param flipOptions.flipVertical - Flip the viewport on vertical axis\n */\n protected flip({ flipHorizontal, flipVertical }: FlipDirection): void {\n const imageData = this.getDefaultImageData();\n\n if (!imageData) {\n return;\n }\n\n const camera = this.getCamera();\n const { viewPlaneNormal, viewUp, focalPoint, position } = camera;\n\n const viewRight = vec3.cross(vec3.create(), viewPlaneNormal, viewUp);\n let viewUpToSet = vec3.copy(vec3.create(), viewUp);\n const viewPlaneNormalToSet = vec3.negate(vec3.create(), viewPlaneNormal);\n\n // for both flip horizontal and vertical we need to move the camera to the\n // other side of the image\n const distance = vec3.distance(position, focalPoint);\n\n // If the pan has been applied, we need to be able\n // apply the pan back\n const dimensions = imageData.getDimensions();\n const middleIJK = dimensions.map((d) => Math.floor(d / 2));\n\n const idx = [middleIJK[0], middleIJK[1], middleIJK[2]];\n const centeredFocalPoint = imageData.indexToWorld(idx, vec3.create());\n\n const resetFocalPoint = this._getFocalPointForResetCamera(\n centeredFocalPoint as Point3,\n camera,\n { resetPan: true, resetToCenter: false }\n );\n\n const panDir = vec3.subtract(vec3.create(), focalPoint, resetFocalPoint);\n const panValue = vec3.length(panDir);\n\n const getPanDir = (mirrorVec) => {\n const panDirMirror = vec3.scale(\n vec3.create(),\n mirrorVec,\n 2 * vec3.dot(panDir, mirrorVec)\n );\n vec3.subtract(panDirMirror, panDirMirror, panDir);\n vec3.normalize(panDirMirror, panDirMirror);\n\n return panDirMirror;\n };\n\n // Flipping horizontal mean that the camera should move\n // to the other side of the image but looking at the\n // same direction and same focal point\n if (flipHorizontal) {\n // we need to apply the pan value to the new focal point but in the direction\n // that is mirrored on the viewUp for the flip horizontal and\n // viewRight for the flip vertical\n\n // mirror the pan direction based on the viewUp\n const panDirMirror = getPanDir(viewUpToSet);\n\n // move focal point from the resetFocalPoint to the newFocalPoint\n // based on the panDirMirror and panValue\n const newFocalPoint = vec3.scaleAndAdd(\n vec3.create(),\n resetFocalPoint,\n panDirMirror,\n panValue\n );\n\n // move the camera position also the same way as the focal point\n const newPosition = vec3.scaleAndAdd(\n vec3.create(),\n newFocalPoint,\n viewPlaneNormalToSet,\n distance\n );\n\n this.setCamera({\n viewPlaneNormal: viewPlaneNormalToSet as Point3,\n position: newPosition as Point3,\n focalPoint: newFocalPoint as Point3,\n });\n\n this.flipHorizontal = !this.flipHorizontal;\n }\n\n // Flipping vertical mean that the camera should negate the view up\n // and also move to the other side of the image but looking at the\n if (flipVertical) {\n viewUpToSet = vec3.negate(viewUpToSet, viewUp);\n\n // we need to apply the pan value to the new focal point but in the direction\n const panDirMirror = getPanDir(viewRight);\n\n const newFocalPoint = vec3.scaleAndAdd(\n vec3.create(),\n resetFocalPoint,\n panDirMirror,\n panValue\n );\n\n const newPosition = vec3.scaleAndAdd(\n vec3.create(),\n newFocalPoint,\n viewPlaneNormalToSet,\n distance\n );\n\n this.setCamera({\n focalPoint: newFocalPoint as Point3,\n viewPlaneNormal: viewPlaneNormalToSet as Point3,\n viewUp: viewUpToSet as Point3,\n position: newPosition as Point3,\n });\n\n this.flipVertical = !this.flipVertical;\n }\n\n this.render();\n }\n\n private getDefaultImageData(): any {\n const actorEntry = this.getDefaultActor();\n\n if (actorEntry && isImageActor(actorEntry)) {\n return actorEntry.actor.getMapper().getInputData();\n }\n }\n\n /**\n * Get the default actor\n * @returns An actor entry.\n */\n public getDefaultActor(): ActorEntry {\n return this.getActors()[0];\n }\n\n /**\n * Get all the actors in the viewport\n * @returns An array of ActorEntry objects.\n */\n public getActors(): Array {\n return Array.from(this._actors.values());\n }\n\n /**\n * Get an actor by its UID\n * @param actorUID - The unique ID of the actor.\n * @returns An ActorEntry object.\n */\n public getActor(actorUID: string): ActorEntry {\n return this._actors.get(actorUID);\n }\n\n /**\n * Get an actor UID by its index\n * @param index - array index.\n * @returns actorUID\n */\n public getActorUIDByIndex(index: number): string {\n const actor = this.getActors()[index];\n if (actor) {\n return actor.uid;\n }\n }\n\n /**\n * Get an actor by its index\n * @param index - array index.\n * @returns actorUID\n */\n public getActorByIndex(index: number): ActorEntry {\n return this.getActors()[index];\n }\n\n /**\n * It removes all actors from the viewport and then adds the actors from the array.\n * @param actors - An array of ActorEntry objects.\n */\n public setActors(actors: Array): void {\n this.removeAllActors();\n const resetCameraPanAndZoom = true;\n // when we set the actor we need to reset the camera to initialize the\n // camera focal point with the bounds of the actors.\n this.addActors(actors, resetCameraPanAndZoom);\n }\n\n /**\n * Remove the actor from the viewport\n * @param actorUID - The unique identifier for the actor.\n */\n _removeActor(actorUID: string): void {\n const actorEntry = this.getActor(actorUID);\n if (!actorEntry) {\n console.warn(`Actor ${actorUID} does not exist for this viewport`);\n return;\n }\n const renderer = this.getRenderer();\n renderer.removeViewProp(actorEntry.actor); // removeActor not implemented in vtk?\n this._actors.delete(actorUID);\n }\n\n /**\n * Remove the actors with the given UIDs from the viewport\n * @param actorUIDs - An array of actor UIDs to remove.\n */\n public removeActors(actorUIDs: Array): void {\n actorUIDs.forEach((actorUID) => {\n this._removeActor(actorUID);\n });\n }\n\n /**\n * Add a list of actors (actor entries) to the viewport\n * @param resetCameraPanAndZoom - force reset pan and zoom of the camera,\n * default value is false.\n * @param actors - An array of ActorEntry objects.\n */\n public addActors(\n actors: Array,\n resetCameraPanAndZoom = false\n ): void {\n const renderingEngine = this.getRenderingEngine();\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n console.warn(\n 'Viewport::addActors::Rendering engine has not been initialized or has been destroyed'\n );\n return;\n }\n\n actors.forEach((actor) => this.addActor(actor));\n\n // set the clipping planes for the actors\n this.resetCamera(resetCameraPanAndZoom, resetCameraPanAndZoom);\n }\n\n /**\n * Add an actor to the viewport including its id, its actor and slabThickness\n * if defined\n * @param actorEntry - ActorEntry\n * @param actorEntry.uid - The unique identifier for the actor.\n * @param actorEntry.actor - The volume actor.\n * @param actorEntry.slabThickness - The slab thickness.\n */\n public addActor(actorEntry: ActorEntry): void {\n const { uid: actorUID, actor } = actorEntry;\n const renderingEngine = this.getRenderingEngine();\n\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n console.warn(\n `Cannot add actor UID of ${actorUID} Rendering Engine has been destroyed`\n );\n return;\n }\n\n if (!actorUID || !actor) {\n throw new Error('Actors should have uid and vtk Actor properties');\n }\n\n if (this.getActor(actorUID)) {\n console.warn(`Actor ${actorUID} already exists for this viewport`);\n return;\n }\n\n const renderer = this.getRenderer();\n renderer.addActor(actor);\n this._actors.set(actorUID, Object.assign({}, actorEntry));\n }\n\n /**\n * Remove all actors from the renderer\n */\n public removeAllActors(): void {\n this.getRenderer().removeAllViewProps();\n this._actors = new Map();\n return;\n }\n\n /**\n * Reset the camera to the default viewport camera without firing events\n */\n protected resetCameraNoEvent(): void {\n this._suppressCameraModifiedEvents = true;\n this.resetCamera();\n this._suppressCameraModifiedEvents = false;\n }\n\n /**\n * Sets the camera to the default viewport camera without firing events\n * @param camera - The camera to use for the viewport.\n */\n protected setCameraNoEvent(camera: ICamera): void {\n this._suppressCameraModifiedEvents = true;\n this.setCamera(camera);\n this._suppressCameraModifiedEvents = false;\n }\n\n /**\n * Calculates the intersections between the volume's boundaries and the viewplane.\n * 1) Determine the viewplane using the camera's ViewplaneNormal and focalPoint.\n * 2) Using volumeBounds, calculate the line equation for the 3D volume's 12 edges.\n * 3) Intersect each edge to the viewPlane and see whether the intersection point is inside the volume bounds.\n * 4) Return list of intersection points\n * It should be noted that intersection points may range from 3 to 6 points.\n * Orthogonal views have four points of intersection.\n *\n * @param imageData - vtkImageData\n * @param focalPoint - camera focal point\n * @param normal - view plane normal\n * @returns intersections list\n */\n private _getViewImageDataIntersections(imageData, focalPoint, normal) {\n // Viewplane equation: Ax+By+Cz=D\n const A = normal[0];\n const B = normal[1];\n const C = normal[2];\n const D = A * focalPoint[0] + B * focalPoint[1] + C * focalPoint[2];\n\n // Computing the edges of the 3D cube\n const bounds = imageData.getBounds();\n const edges = this._getEdges(bounds);\n\n const intersections = [];\n\n for (const edge of edges) {\n // start point: [x0, y0, z0], end point: [x1, y1, z1]\n const [[x0, y0, z0], [x1, y1, z1]] = edge;\n // Check if the edge is parallel to plane\n if (A * (x1 - x0) + B * (y1 - y0) + C * (z1 - z0) === 0) {\n continue;\n }\n const intersectionPoint = planar.linePlaneIntersection(\n [x0, y0, z0],\n [x1, y1, z1],\n [A, B, C, D]\n );\n\n if (this._isInBounds(intersectionPoint, bounds)) {\n intersections.push(intersectionPoint);\n }\n }\n\n return intersections;\n }\n\n /**\n * Sets the camera to an initial bounds. If\n * resetPan and resetZoom are true it places the focal point at the center of\n * the volume (or slice); otherwise, only the camera zoom and camera Pan or Zoom\n * is reset for the current view.\n * @param displayArea - The display area of interest.\n * @param suppressEvents - If true, don't fire displayArea event.\n */\n public setDisplayArea(\n displayArea: DisplayArea,\n suppressEvents = false\n ): void {\n const { storeAsInitialCamera } = displayArea;\n\n // make calculations relative to the fitToCanvasCamera view\n this.setCamera(this.fitToCanvasCamera, false);\n\n const { imageArea, imageCanvasPoint } = displayArea;\n\n if (imageArea) {\n const [areaX, areaY] = imageArea;\n const zoom = Math.min(this.getZoom() / areaX, this.getZoom() / areaY);\n this.setZoom(zoom, storeAsInitialCamera);\n }\n\n // getting the image info\n const imageData = this.getDefaultImageData();\n if (imageCanvasPoint && imageData) {\n const { imagePoint, canvasPoint } = imageCanvasPoint;\n const [canvasX, canvasY] = canvasPoint;\n const devicePixelRatio = window?.devicePixelRatio || 1;\n const validateCanvasPanX = this.sWidth / devicePixelRatio;\n const validateCanvasPanY = this.sHeight / devicePixelRatio;\n const canvasPanX = validateCanvasPanX * (canvasX - 0.5);\n const canvasPanY = validateCanvasPanY * (canvasY - 0.5);\n\n const dimensions = imageData.getDimensions();\n const canvasZero = this.worldToCanvas([0, 0, 0]);\n const canvasEdge = this.worldToCanvas(dimensions);\n const canvasImage = [\n canvasEdge[0] - canvasZero[0],\n canvasEdge[1] - canvasZero[1],\n ];\n const [imgWidth, imgHeight] = canvasImage;\n const [imageX, imageY] = imagePoint;\n const imagePanX = imgWidth * (0.5 - imageX);\n const imagePanY = imgHeight * (0.5 - imageY);\n\n const newPositionX = imagePanX + canvasPanX;\n const newPositionY = imagePanY + canvasPanY;\n\n const deltaPoint2: Point2 = [newPositionX, newPositionY];\n this.setPan(deltaPoint2, storeAsInitialCamera);\n }\n\n if (storeAsInitialCamera) {\n this.options.displayArea = displayArea;\n }\n\n if (!suppressEvents) {\n const eventDetail: EventTypes.DisplayAreaModifiedEventDetail = {\n viewportId: this.id,\n displayArea: displayArea,\n storeAsInitialCamera: storeAsInitialCamera,\n };\n\n triggerEvent(this.element, Events.DISPLAY_AREA_MODIFIED, eventDetail);\n }\n }\n\n public getDisplayArea(): DisplayArea | undefined {\n return this.options?.displayArea;\n }\n\n /**\n * Resets the camera based on the rendering volume(s) bounds. If\n * resetPan and resetZoom are true it places the focal point at the center of\n * the volume (or slice); otherwise, only the camera zoom and camera Pan or Zoom\n * is reset for the current view.\n * @param resetPan - If true, the camera focal point is reset to the center of the volume (slice)\n * @param resetZoom - If true, the camera zoom is reset to the default zoom\n * @param storeAsInitialCamera - If true, reset camera is stored as the initial camera (to allow differences to\n * be detected for pan/zoom values)\n * @returns boolean\n */\n public resetCamera(\n resetPan = true,\n resetZoom = true,\n resetToCenter = true,\n storeAsInitialCamera = true\n ): boolean {\n const renderer = this.getRenderer();\n\n // fix the flip right away, since we rely on the viewPlaneNormal and\n // viewUp for later. Basically, we need to flip back if flipHorizontal\n // is true or flipVertical is true\n this.setCamera({\n flipHorizontal: false,\n flipVertical: false,\n });\n\n const previousCamera = _cloneDeep(this.getCamera());\n const bounds = renderer.computeVisiblePropBounds();\n const focalPoint = [0, 0, 0];\n const imageData = this.getDefaultImageData();\n\n // Todo: remove this, this is just for tests passing\n if (imageData) {\n const spc = imageData.getSpacing();\n\n bounds[0] = bounds[0] + spc[0] / 2;\n bounds[1] = bounds[1] - spc[0] / 2;\n bounds[2] = bounds[2] + spc[1] / 2;\n bounds[3] = bounds[3] - spc[1] / 2;\n bounds[4] = bounds[4] + spc[2] / 2;\n bounds[5] = bounds[5] - spc[2] / 2;\n }\n\n const activeCamera = this.getVtkActiveCamera();\n const viewPlaneNormal = activeCamera.getViewPlaneNormal();\n const viewUp = activeCamera.getViewUp();\n\n // Reset the perspective zoom factors, otherwise subsequent zooms will cause\n // the view angle to become very small and cause bad depth sorting.\n // todo: parallel projection only\n\n focalPoint[0] = (bounds[0] + bounds[1]) / 2.0;\n focalPoint[1] = (bounds[2] + bounds[3]) / 2.0;\n focalPoint[2] = (bounds[4] + bounds[5]) / 2.0;\n\n if (imageData) {\n const dimensions = imageData.getDimensions();\n const middleIJK = dimensions.map((d) => Math.floor(d / 2));\n\n const idx = [middleIJK[0], middleIJK[1], middleIJK[2]];\n imageData.indexToWorld(idx, focalPoint);\n }\n\n const { widthWorld, heightWorld } =\n this._getWorldDistanceViewUpAndViewRight(bounds, viewUp, viewPlaneNormal);\n\n const canvasSize = [this.sWidth, this.sHeight];\n\n const boundsAspectRatio = widthWorld / heightWorld;\n const canvasAspectRatio = canvasSize[0] / canvasSize[1];\n\n let radius;\n\n if (boundsAspectRatio < canvasAspectRatio) {\n // can fit full height, so use it.\n radius = heightWorld / 2;\n } else {\n const scaleFactor = boundsAspectRatio / canvasAspectRatio;\n\n radius = (heightWorld * scaleFactor) / 2;\n }\n\n //const angle = vtkMath.radiansFromDegrees(activeCamera.getViewAngle())\n const parallelScale = 1.1 * radius;\n\n let w1 = bounds[1] - bounds[0];\n let w2 = bounds[3] - bounds[2];\n let w3 = bounds[5] - bounds[4];\n w1 *= w1;\n w2 *= w2;\n w3 *= w3;\n radius = w1 + w2 + w3;\n\n // If we have just a single point, pick a radius of 1.0\n radius = radius === 0 ? 1.0 : radius;\n\n // compute the radius of the enclosing sphere\n radius = Math.sqrt(radius) * 0.5;\n\n const distance = 1.1 * radius;\n\n const viewUpToSet: Point3 =\n Math.abs(vtkMath.dot(viewUp, viewPlaneNormal)) > 0.999\n ? [-viewUp[2], viewUp[0], viewUp[1]]\n : viewUp;\n\n const focalPointToSet = this._getFocalPointForResetCamera(\n focalPoint,\n previousCamera,\n { resetPan, resetToCenter }\n );\n\n const positionToSet: Point3 = [\n focalPointToSet[0] + distance * viewPlaneNormal[0],\n focalPointToSet[1] + distance * viewPlaneNormal[1],\n focalPointToSet[2] + distance * viewPlaneNormal[2],\n ];\n\n renderer.resetCameraClippingRange(bounds);\n\n const clippingRangeToUse: Point2 = [\n -RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,\n RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,\n ];\n\n activeCamera.setPhysicalScale(radius);\n activeCamera.setPhysicalTranslation(\n -focalPointToSet[0],\n -focalPointToSet[1],\n -focalPointToSet[2]\n );\n\n this.setCamera({\n parallelScale: resetZoom ? parallelScale : previousCamera.parallelScale,\n focalPoint: focalPointToSet,\n position: positionToSet,\n viewAngle: 90,\n viewUp: viewUpToSet,\n clippingRange: clippingRangeToUse,\n });\n\n const modifiedCamera = _cloneDeep(this.getCamera());\n\n this.setFitToCanvasCamera(_cloneDeep(this.getCamera()));\n\n if (storeAsInitialCamera) {\n this.setInitialCamera(modifiedCamera);\n }\n\n const RESET_CAMERA_EVENT = {\n type: 'ResetCameraEvent',\n renderer,\n };\n\n // Here to let parallel/distributed compositing intercept\n // and do the right thing.\n renderer.invokeEvent(RESET_CAMERA_EVENT);\n\n this.triggerCameraModifiedEventIfNecessary(previousCamera, modifiedCamera);\n\n if (\n imageData &&\n this.options?.displayArea &&\n resetZoom &&\n resetPan &&\n resetToCenter\n ) {\n this.setDisplayArea(this.options?.displayArea);\n }\n\n return true;\n }\n\n /**\n * Sets the provided camera as the initial camera.\n * This allows computing differences applied later as compared to the initial\n * position, for things like zoom and pan.\n * @param camera - to store as the initial value.\n */\n protected setInitialCamera(camera: ICamera): void {\n this.initialCamera = camera;\n }\n\n /**\n * Sets the provided camera as the displayArea camera.\n * This allows computing differences applied later as compared to the initial\n * position, for things like zoom and pan.\n * @param camera - to store as the initial value.\n */\n protected setFitToCanvasCamera(camera: ICamera): void {\n this.fitToCanvasCamera = camera;\n }\n\n /**\n * Helper function to return the current canvas pan value.\n *\n * @returns a Point2 containing the current pan values\n * on the canvas,\n * computed from the current camera, where the initial pan\n * value is [0,0].\n */\n public getPan(): Point2 {\n const activeCamera = this.getVtkActiveCamera();\n const focalPoint = activeCamera.getFocalPoint() as Point3;\n\n const zero3 = this.canvasToWorld([0, 0]);\n const initialCanvasFocal = this.worldToCanvas(\n vec3.subtract(vec3.create(), this.initialCamera.focalPoint, zero3)\n );\n const currentCanvasFocal = this.worldToCanvas(\n vec3.subtract(vec3.create(), focalPoint, zero3)\n );\n const result = (\n vec2.subtract(vec2.create(), initialCanvasFocal, currentCanvasFocal)\n );\n return result;\n }\n\n /**\n * Sets the canvas pan value relative to the initial view position of 0,0\n * Modifies the camera to perform the pan.\n */\n public setPan(pan: Point2, storeAsInitialCamera = false): void {\n const previousCamera = this.getCamera();\n const { focalPoint, position } = previousCamera;\n const zero3 = this.canvasToWorld([0, 0]);\n const delta2 = vec2.subtract(vec2.create(), pan, this.getPan());\n if (\n Math.abs(delta2[0]) < 1 &&\n Math.abs(delta2[1]) < 1 &&\n !storeAsInitialCamera\n ) {\n return;\n }\n const delta = vec3.subtract(\n vec3.create(),\n this.canvasToWorld(delta2),\n zero3\n );\n const newFocal = vec3.subtract(vec3.create(), focalPoint, delta);\n const newPosition = vec3.subtract(vec3.create(), position, delta);\n this.setCamera(\n {\n ...previousCamera,\n focalPoint: newFocal as Point3,\n position: newPosition as Point3,\n },\n storeAsInitialCamera\n );\n }\n\n /**\n * Returns a current zoom level relative to the initial parallel scale\n * originally applied to the image. That is, on initial display,\n * the zoom level is 1. Computed as a function of the camera.\n */\n public getZoom(): number {\n const activeCamera = this.getVtkActiveCamera();\n const { parallelScale: initialParallelScale } = this.initialCamera;\n return initialParallelScale / activeCamera.getParallelScale();\n }\n\n /** Zooms the image using parallel scale by updating the camera value.\n * @param value - The relative parallel scale to apply. It is relative\n * to the initial offsets value.\n * @param storeAsInitialCamera - can be set to true to reset the camera\n * after applying this zoom as the initial camera. A subsequent getZoom\n * call will return \"1\", but the zoom will have been applied.\n */\n public setZoom(value: number, storeAsInitialCamera = false): void {\n const camera = this.getCamera();\n const { parallelScale: initialParallelScale } = this.initialCamera;\n const parallelScale = initialParallelScale / value;\n if (camera.parallelScale === parallelScale && !storeAsInitialCamera) {\n return;\n }\n this.setCamera(\n {\n ...camera,\n parallelScale,\n },\n storeAsInitialCamera\n );\n }\n\n /**\n * Because the focalPoint is always in the centre of the viewport,\n * we must do planar computations if the frame (image \"slice\") is to be preserved.\n * 1. Calculate the intersection of the view plane with the imageData\n * which results in points of intersection (minimum of 3, maximum of 6)\n * 2. Calculate average of the intersection points to get newFocalPoint\n * 3. Set the new focalPoint\n * @param imageData - imageData\n * @returns focalPoint\n */\n private _getFocalPointForViewPlaneReset(imageData) {\n // Todo: move some where else\n const { focalPoint, viewPlaneNormal: normal } = this.getCamera();\n const intersections = this._getViewImageDataIntersections(\n imageData,\n focalPoint,\n normal\n );\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n intersections.forEach(([point_x, point_y, point_z]) => {\n x += point_x;\n y += point_y;\n z += point_z;\n });\n\n const newFocalPoint = [\n x / intersections.length,\n y / intersections.length,\n z / intersections.length,\n ];\n // Set the focal point on the average of the intersection points\n return newFocalPoint;\n }\n\n /**\n * Gets the target output canvas for the `Viewport`.\n *\n * @returns an HTMLCanvasElement.\n */\n public getCanvas(): HTMLCanvasElement {\n return this.canvas;\n }\n /**\n * Gets the active vtkCamera for the viewport.\n *\n * @returns vtk driven camera\n */\n protected getVtkActiveCamera(): vtkCamera | vtkSlabCamera {\n const renderer = this.getRenderer();\n\n return renderer.getActiveCamera();\n }\n\n /**\n * Get the camera's current state\n * @returns The camera object.\n */\n public getCamera(): ICamera {\n const vtkCamera = this.getVtkActiveCamera();\n\n return {\n viewUp: vtkCamera.getViewUp(),\n viewPlaneNormal: vtkCamera.getViewPlaneNormal(),\n position: vtkCamera.getPosition(),\n focalPoint: vtkCamera.getFocalPoint(),\n parallelProjection: vtkCamera.getParallelProjection(),\n parallelScale: vtkCamera.getParallelScale(),\n viewAngle: vtkCamera.getViewAngle(),\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n };\n }\n\n /**\n * Set the camera parameters\n * @param cameraInterface - ICamera\n * @param storeAsInitialCamera - to set the provided camera as the initial one,\n * used to compute differences for things like pan and zoom.\n */\n public setCamera(\n cameraInterface: ICamera,\n storeAsInitialCamera = false\n ): void {\n const vtkCamera = this.getVtkActiveCamera();\n const previousCamera = _cloneDeep(this.getCamera());\n const updatedCamera = Object.assign({}, previousCamera, cameraInterface);\n const {\n viewUp,\n viewPlaneNormal,\n position,\n focalPoint,\n parallelScale,\n viewAngle,\n flipHorizontal,\n flipVertical,\n clippingRange,\n } = cameraInterface;\n\n // Note: Flip camera should be two separate calls since\n // for flip, we need to flip the viewportNormal, and if\n // flipHorizontal, and flipVertical are both true, that would\n // the logic would be incorrect. So instead, we handle flip Horizontal\n // and flipVertical separately.\n if (flipHorizontal !== undefined) {\n // flip if not flipped but requested to flip OR if flipped but requested to\n // not flip\n const flipH =\n (flipHorizontal && !this.flipHorizontal) ||\n (!flipHorizontal && this.flipHorizontal);\n\n if (flipH) {\n this.flip({ flipHorizontal: flipH });\n }\n }\n\n if (flipVertical !== undefined) {\n const flipV =\n (flipVertical && !this.flipVertical) ||\n (!flipVertical && this.flipVertical);\n\n if (flipV) {\n this.flip({ flipVertical: flipV });\n }\n }\n\n if (viewUp !== undefined) {\n vtkCamera.setViewUp(viewUp);\n }\n\n if (viewPlaneNormal !== undefined) {\n vtkCamera.setDirectionOfProjection(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n }\n\n if (position !== undefined) {\n vtkCamera.setPosition(...position);\n }\n\n if (focalPoint !== undefined) {\n vtkCamera.setFocalPoint(...focalPoint);\n }\n\n if (parallelScale !== undefined) {\n vtkCamera.setParallelScale(parallelScale);\n }\n\n if (viewAngle !== undefined) {\n vtkCamera.setViewAngle(viewAngle);\n }\n\n if (clippingRange !== undefined) {\n vtkCamera.setClippingRange(clippingRange);\n }\n\n // update clippingPlanes if volume viewports\n const actorEntry = this.getDefaultActor();\n\n if (!actorEntry || !actorEntry.actor) {\n return;\n }\n\n const isImageSlice = actorIsA(actorEntry, 'vtkImageSlice');\n\n if (!isImageSlice) {\n this.updateClippingPlanesForActors(updatedCamera);\n } else {\n const renderer = this.getRenderer();\n renderer.resetCameraClippingRange();\n }\n\n if (storeAsInitialCamera) {\n this.setInitialCamera(updatedCamera);\n }\n\n this.triggerCameraModifiedEventIfNecessary(\n previousCamera,\n this.getCamera()\n );\n }\n\n /**\n * Trigger camera modified event\n * @param cameraInterface - ICamera\n * @param cameraInterface - ICamera\n */\n public triggerCameraModifiedEventIfNecessary(\n previousCamera: ICamera,\n updatedCamera: ICamera\n ): void {\n if (!this._suppressCameraModifiedEvents && !this.suppressEvents) {\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera: updatedCamera,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n rotation: this.getRotation(),\n };\n\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n }\n\n /**\n * Updates the actors clipping planes orientation from the camera properties\n * @param updatedCamera - ICamera\n */\n protected updateClippingPlanesForActors(updatedCamera: ICamera): void {\n const actorEntries = this.getActors();\n actorEntries.forEach((actorEntry) => {\n // we assume that the first two clipping plane of the mapper are always\n // the 'camera' clipping. Update clipping planes only if the actor is\n // a vtkVolume\n if (!actorEntry.actor) {\n return;\n }\n\n const mapper = actorEntry.actor.getMapper();\n const vtkPlanes = mapper.getClippingPlanes();\n\n let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;\n if (actorEntry.slabThickness) {\n slabThickness = actorEntry.slabThickness;\n }\n\n const { viewPlaneNormal, focalPoint } = updatedCamera;\n\n this.setOrientationOfClippingPlanes(\n vtkPlanes,\n slabThickness,\n viewPlaneNormal,\n focalPoint\n );\n });\n }\n\n public setOrientationOfClippingPlanes(\n vtkPlanes: Array,\n slabThickness: number,\n viewPlaneNormal: Point3,\n focalPoint: Point3\n ): void {\n if (vtkPlanes.length < 2) {\n return;\n }\n\n const scaledDistance = [\n viewPlaneNormal[0],\n viewPlaneNormal[1],\n viewPlaneNormal[2],\n ];\n vtkMath.multiplyScalar(scaledDistance, slabThickness);\n\n vtkPlanes[0].setNormal(viewPlaneNormal);\n const newOrigin1 = [0, 0, 0];\n vtkMath.subtract(focalPoint, scaledDistance, newOrigin1);\n vtkPlanes[0].setOrigin(newOrigin1);\n\n vtkPlanes[1].setNormal(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n const newOrigin2 = [0, 0, 0];\n vtkMath.add(focalPoint, scaledDistance, newOrigin2);\n vtkPlanes[1].setOrigin(newOrigin2);\n }\n\n private _getWorldDistanceViewUpAndViewRight(bounds, viewUp, viewPlaneNormal) {\n const viewUpCorners = this._getCorners(bounds);\n const viewRightCorners = this._getCorners(bounds);\n\n const viewRight = vec3.cross(vec3.create(), viewUp, viewPlaneNormal);\n\n let transform = vtkMatrixBuilder\n .buildFromDegree()\n .identity()\n .rotateFromDirections(viewUp, [1, 0, 0]);\n\n viewUpCorners.forEach((pt) => transform.apply(pt));\n\n // range is now maximum X distance\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < 8; i++) {\n const y = viewUpCorners[i][0];\n if (y > maxY) {\n maxY = y;\n }\n if (y < minY) {\n minY = y;\n }\n }\n\n transform = vtkMatrixBuilder\n .buildFromDegree()\n .identity()\n .rotateFromDirections(\n [viewRight[0], viewRight[1], viewRight[2]],\n [1, 0, 0]\n );\n\n viewRightCorners.forEach((pt) => transform.apply(pt));\n\n // range is now maximum Y distance\n let minX = Infinity;\n let maxX = -Infinity;\n for (let i = 0; i < 8; i++) {\n const x = viewRightCorners[i][0];\n if (x > maxX) {\n maxX = x;\n }\n if (x < minX) {\n minX = x;\n }\n }\n\n return { widthWorld: maxX - minX, heightWorld: maxY - minY };\n }\n\n protected _shouldUseNativeDataType() {\n const { useNorm16Texture, preferSizeOverAccuracy } =\n getConfiguration().rendering;\n return useNorm16Texture || preferSizeOverAccuracy;\n }\n\n _getCorners(bounds: Array): Array[] {\n return [\n [bounds[0], bounds[2], bounds[4]],\n [bounds[0], bounds[2], bounds[5]],\n [bounds[0], bounds[3], bounds[4]],\n [bounds[0], bounds[3], bounds[5]],\n [bounds[1], bounds[2], bounds[4]],\n [bounds[1], bounds[2], bounds[5]],\n [bounds[1], bounds[3], bounds[4]],\n [bounds[1], bounds[3], bounds[5]],\n ];\n }\n\n _getFocalPointForResetCamera(\n centeredFocalPoint: Point3,\n previousCamera: ICamera,\n { resetPan = true, resetToCenter = true }\n ): Point3 {\n if (resetToCenter && resetPan) {\n return centeredFocalPoint;\n }\n\n if (resetToCenter && !resetPan) {\n return hasNaNValues(previousCamera.focalPoint)\n ? centeredFocalPoint\n : previousCamera.focalPoint;\n }\n\n if (!resetToCenter && resetPan) {\n // this is an interesting case that means the reset camera should not\n // change the slice (default behavior is to go to the center of the\n // image), and rather just reset the pan on the slice that is currently\n // being viewed\n const oldCamera = previousCamera;\n const oldFocalPoint = oldCamera.focalPoint;\n const oldViewPlaneNormal = oldCamera.viewPlaneNormal;\n\n const vectorFromOldFocalPointToCenteredFocalPoint = vec3.subtract(\n vec3.create(),\n centeredFocalPoint,\n oldFocalPoint\n );\n\n const distanceFromOldFocalPointToCenteredFocalPoint = vec3.dot(\n vectorFromOldFocalPointToCenteredFocalPoint,\n oldViewPlaneNormal\n );\n\n const newFocalPoint = vec3.scaleAndAdd(\n vec3.create(),\n centeredFocalPoint,\n oldViewPlaneNormal,\n -1 * distanceFromOldFocalPointToCenteredFocalPoint\n );\n\n return [newFocalPoint[0], newFocalPoint[1], newFocalPoint[2]];\n }\n\n if (!resetPan && !resetToCenter) {\n // this means the reset camera should not change the slice and should not\n // touch the pan either.\n return hasNaNValues(previousCamera.focalPoint)\n ? centeredFocalPoint\n : previousCamera.focalPoint;\n }\n }\n\n /**\n * Determines whether or not the 3D point position is inside the boundaries of the 3D imageData.\n * @param point - 3D coordinate\n * @param bounds - Bounds of the image\n * @returns boolean\n */\n _isInBounds(point: Point3, bounds: number[]): boolean {\n const [xMin, xMax, yMin, yMax, zMin, zMax] = bounds;\n const [x, y, z] = point;\n if (x < xMin || x > xMax || y < yMin || y > yMax || z < zMin || z > zMax) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns a list of edges for the imageData bounds, which are\n * the cube edges in the case of volumeViewport edges.\n * p1: front, bottom, left\n * p2: front, top, left\n * p3: back, bottom, left\n * p4: back, top, left\n * p5: front, bottom, right\n * p6: front, top, right\n * p7: back, bottom, right\n * p8: back, top, right\n * @param bounds - Bounds of the renderer\n * @returns Edges of the containing bounds\n */\n _getEdges(bounds: Array): Array<[number[], number[]]> {\n const [p1, p2, p3, p4, p5, p6, p7, p8] = this._getCorners(bounds);\n return [\n [p1, p2],\n [p1, p5],\n [p1, p3],\n [p2, p4],\n [p2, p6],\n [p3, p4],\n [p3, p7],\n [p4, p8],\n [p5, p7],\n [p5, p6],\n [p6, p8],\n [p7, p8],\n ];\n }\n}\n\nexport default Viewport;\n","import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';\n\nimport cache from '../cache';\nimport {\n MPR_CAMERA_VALUES,\n RENDERING_DEFAULTS,\n VIEWPORT_PRESETS,\n} from '../constants';\nimport {\n BlendModes,\n Events,\n InterpolationType,\n OrientationAxis,\n ViewportStatus,\n VOILUTFunctionType,\n} from '../enums';\nimport ViewportType from '../enums/ViewportType';\nimport eventTarget from '../eventTarget';\nimport { getShouldUseCPURendering } from '../init';\nimport { loadVolume } from '../loaders/volumeLoader';\nimport type {\n ActorEntry,\n ColormapPublic,\n FlipDirection,\n IImageData,\n IVolumeInput,\n OrientationVectors,\n Point2,\n Point3,\n VOIRange,\n VolumeViewportProperties,\n} from '../types';\nimport { VoiModifiedEventDetail } from '../types/EventTypes';\nimport type { ViewportInput } from '../types/IViewport';\nimport type IVolumeViewport from '../types/IVolumeViewport';\nimport {\n actorIsA,\n applyPreset,\n createSigmoidRGBTransferFunction,\n getVoiFromSigmoidRGBTransferFunction,\n imageIdToURI,\n invertRgbTransferFunction,\n triggerEvent,\n colormap as colormapUtils,\n} from '../utilities';\nimport { createVolumeActor } from './helpers';\nimport volumeNewImageEventDispatcher, {\n resetVolumeNewImageState,\n} from './helpers/volumeNewImageEventDispatcher';\nimport Viewport from './Viewport';\nimport type { vtkSlabCamera as vtkSlabCameraType } from './vtkClasses/vtkSlabCamera';\nimport vtkSlabCamera from './vtkClasses/vtkSlabCamera';\nimport transformWorldToIndex from '../utilities/transformWorldToIndex';\n\n/**\n * Abstract base class for volume viewports. VolumeViewports are used to render\n * 3D volumes from which various orientations can be viewed. Since VolumeViewports\n * use SharedVolumeMappers behind the scene, memory footprint of visualizations\n * of the same volume in different orientations is very small.\n *\n * For setting volumes on viewports you need to use {@link addVolumesToViewports}\n * which will add volumes to the specified viewports.\n */\nabstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {\n useCPURendering = false;\n use16BitTexture = false;\n private _FrameOfReferenceUID: string;\n private inverted = false;\n\n // Viewport Properties\n // TODO: similar to setVoi, this is only applicable to first volume\n private VOILUTFunction: VOILUTFunctionType;\n\n constructor(props: ViewportInput) {\n super(props);\n\n this.useCPURendering = getShouldUseCPURendering();\n this.use16BitTexture = this._shouldUseNativeDataType();\n\n if (this.useCPURendering) {\n throw new Error(\n 'VolumeViewports cannot be used whilst CPU Fallback Rendering is enabled.'\n );\n }\n\n const renderer = this.getRenderer();\n\n const camera = vtkSlabCamera.newInstance();\n renderer.setActiveCamera(camera);\n\n switch (this.type) {\n case ViewportType.ORTHOGRAPHIC:\n camera.setParallelProjection(true);\n break;\n case ViewportType.VOLUME_3D:\n camera.setParallelProjection(true);\n break;\n case ViewportType.PERSPECTIVE:\n camera.setParallelProjection(false);\n break;\n default:\n throw new Error(`Unrecognized viewport type: ${this.type}`);\n }\n\n this.initializeVolumeNewImageEventDispatcher();\n }\n\n static get useCustomRenderingPipeline(): boolean {\n return false;\n }\n\n protected applyViewOrientation(\n orientation: OrientationAxis | OrientationVectors\n ) {\n const { viewPlaneNormal, viewUp } =\n this._getOrientationVectors(orientation);\n const camera = this.getVtkActiveCamera();\n camera.setDirectionOfProjection(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n camera.setViewUpFrom(viewUp);\n\n this.resetCamera();\n }\n\n private initializeVolumeNewImageEventDispatcher(): void {\n const volumeNewImageHandlerBound = volumeNewImageHandler.bind(this);\n const volumeNewImageCleanUpBound = volumeNewImageCleanUp.bind(this);\n\n function volumeNewImageHandler(cameraEvent) {\n const { viewportId } = cameraEvent.detail;\n\n if (viewportId !== this.id || this.isDisabled) {\n return;\n }\n\n const viewportImageData = this.getImageData();\n\n if (!viewportImageData) {\n return;\n }\n\n volumeNewImageEventDispatcher(cameraEvent);\n }\n\n function volumeNewImageCleanUp(evt) {\n const { viewportId } = evt.detail;\n\n if (viewportId !== this.id) {\n return;\n }\n\n this.element.removeEventListener(\n Events.CAMERA_MODIFIED,\n volumeNewImageHandlerBound\n );\n\n eventTarget.removeEventListener(\n Events.ELEMENT_DISABLED,\n volumeNewImageCleanUpBound\n );\n\n resetVolumeNewImageState(viewportId);\n }\n\n this.element.removeEventListener(\n Events.CAMERA_MODIFIED,\n volumeNewImageHandlerBound\n );\n this.element.addEventListener(\n Events.CAMERA_MODIFIED,\n volumeNewImageHandlerBound\n );\n\n eventTarget.addEventListener(\n Events.ELEMENT_DISABLED,\n volumeNewImageCleanUpBound\n );\n }\n\n protected resetVolumeViewportClippingRange() {\n const activeCamera = this.getVtkActiveCamera();\n\n if (activeCamera.getParallelProjection()) {\n activeCamera.setClippingRange(\n -RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,\n RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE\n );\n } else {\n activeCamera.setClippingRange(\n RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS,\n RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE\n );\n }\n }\n\n /**\n * Sets the properties for the volume viewport on the volume\n * Sets the VOILUTFunction property for the volume viewport on the volume\n *\n * @param VOILUTFunction - Sets the voi mode (LINEAR or SAMPLED_SIGMOID)\n * @param volumeId - The volume id to set the properties for (if undefined, the first volume)\n * @param suppressEvents - If true, the viewport will not emit events\n */\n private setVOILUTFunction(\n voiLUTFunction: VOILUTFunctionType,\n volumeId?: string,\n suppressEvents?: boolean\n ): void {\n // make sure the VOI LUT function is valid in the VOILUTFunctionType which is enum\n if (Object.values(VOILUTFunctionType).indexOf(voiLUTFunction) === -1) {\n voiLUTFunction = VOILUTFunctionType.LINEAR;\n }\n const { voiRange } = this.getProperties();\n this.VOILUTFunction = voiLUTFunction;\n this.setVOI(voiRange, volumeId, suppressEvents);\n }\n\n /**\n * Sets the colormap for the volume with the given ID and optionally suppresses events.\n *\n * @param colormap - The colormap to apply (e.g., \"hsv\").\n * @param volumeId - The ID of the volume to set the colormap for.\n * @param suppressEvents - If `true`, events will not be emitted during the colormap a\n *\n * @returns void\n */\n private setColormap(\n colormap: ColormapPublic,\n volumeId: string,\n suppressEvents?: boolean\n ) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n\n const mapper = volumeActor.getMapper();\n mapper.setSampleDistance(1.0);\n\n const cfun = vtkColorTransferFunction.newInstance();\n let colormapObj = colormapUtils.getColormap(colormap.name);\n\n const { name } = colormap;\n\n if (!colormapObj) {\n colormapObj = vtkColorMaps.getPresetByName(name);\n }\n\n if (!colormapObj) {\n throw new Error(`Colormap ${colormap} not found`);\n }\n\n const range = volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .getRange();\n\n cfun.applyColorMap(colormapObj);\n cfun.setMappingRange(range[0], range[1]);\n volumeActor.getProperty().setRGBTransferFunction(0, cfun);\n }\n\n /**\n * Sets the opacity for the volume with the given ID.\n *\n * @param colormap - An object containing opacity that can be a number or an array of OpacityMapping\n * @param volumeId - The ID of the volume to set the opacity for.\n *\n * @returns void\n */\n private setOpacity(colormap: ColormapPublic, volumeId: string) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n if (!applicableVolumeActorInfo) {\n return;\n }\n const { volumeActor } = applicableVolumeActorInfo;\n const ofun = vtkPiecewiseFunction.newInstance();\n if (typeof colormap.opacity === 'number') {\n const range = volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .getRange();\n\n ofun.addPoint(range[0], colormap.opacity);\n ofun.addPoint(range[1], colormap.opacity);\n } else {\n colormap.opacity.forEach(({ opacity, value }) => {\n ofun.addPoint(value, opacity);\n });\n }\n volumeActor.getProperty().setScalarOpacity(0, ofun);\n }\n\n /**\n * Sets the inversion for the volume transfer function\n *\n * @param invert - Should the transfer function be inverted?\n * @param volumeId - volumeId\n * @param suppressEvents - If `true`, events will not be published\n *\n * @returns void\n */\n private setInvert(\n invert: boolean,\n volumeId?: string,\n suppressEvents?: boolean\n ) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const volumeIdToUse = applicableVolumeActorInfo.volumeId;\n\n const cfun = this._getOrCreateColorTransferFunction(volumeIdToUse);\n invertRgbTransferFunction(cfun);\n\n this.inverted = invert;\n\n const { voiRange } = this.getProperties();\n\n if (!suppressEvents) {\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRange,\n volumeId: volumeIdToUse,\n VOILUTFunction: this.VOILUTFunction,\n invert: this.inverted,\n invertStateChanged: true,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n }\n\n private _getOrCreateColorTransferFunction(\n volumeId: string\n ): vtkColorTransferFunction {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return null;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n\n const rgbTransferFunction = volumeActor\n .getProperty()\n .getRGBTransferFunction(0);\n\n if (rgbTransferFunction) {\n return rgbTransferFunction;\n }\n\n const newRGBTransferFunction = vtkColorTransferFunction.newInstance();\n volumeActor.getProperty().setRGBTransferFunction(0, newRGBTransferFunction);\n\n return newRGBTransferFunction;\n }\n\n private setInterpolationType(\n interpolationType: InterpolationType,\n volumeId?: string\n ) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n const volumeProperty = volumeActor.getProperty();\n\n // @ts-ignore\n volumeProperty.setInterpolationType(interpolationType);\n }\n\n /**\n * Sets the properties for the volume viewport on the volume\n * (if fusion, it sets it for the first volume in the fusion)\n *\n * @param voiRange - Sets the lower and upper voi\n * @param volumeId - The volume id to set the properties for (if undefined, the first volume)\n * @param suppressEvents - If true, the viewport will not emit events\n */\n private setVOI(\n voiRange: VOIRange,\n volumeId?: string,\n suppressEvents = false\n ): void {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n const volumeIdToUse = applicableVolumeActorInfo.volumeId;\n\n let voiRangeToUse = voiRange;\n if (typeof voiRangeToUse === 'undefined') {\n const imageData = volumeActor.getMapper().getInputData();\n const range = imageData.getPointData().getScalars().getRange();\n const maxVoiRange = { lower: range[0], upper: range[1] };\n voiRangeToUse = maxVoiRange;\n }\n\n // scaling logic here\n // https://github.com/Kitware/vtk-js/blob/c6f2e12cddfe5c0386a73f0793eb6d9ab20d573e/Sources/Rendering/OpenGL/VolumeMapper/index.js#L957-L972\n if (this.VOILUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID) {\n const cfun = createSigmoidRGBTransferFunction(voiRangeToUse);\n volumeActor.getProperty().setRGBTransferFunction(0, cfun);\n } else {\n // TODO: refactor and make it work for PET series (inverted/colormap)\n // const cfun = createLinearRGBTransferFunction(voiRangeToUse);\n // volumeActor.getProperty().setRGBTransferFunction(0, cfun);\n\n // Todo: Moving from LINEAR to SIGMOID and back to LINEAR will not\n // work until we implement it in a different way because the\n // LINEAR transfer function is not recreated.\n const { lower, upper } = voiRangeToUse;\n volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .setRange(lower, upper);\n }\n\n if (!suppressEvents) {\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRange,\n volumeId: volumeIdToUse,\n VOILUTFunction: this.VOILUTFunction,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n }\n\n /**\n * Sets the properties for the volume viewport on the volume\n * (if fusion, it sets it for the first volume in the fusion)\n *\n * @param VolumeViewportProperties - The properties to set\n * @param [VolumeViewportProperties.voiRange] - Sets the lower and upper voi\n * @param [VolumeViewportProperties.VOILUTFunction] - Sets the voi mode (LINEAR, or SAMPLED_SIGMOID)\n * @param [VolumeViewportProperties.invert] - Inverts the color transfer function\n * @param [VolumeViewportProperties.colormap] - Sets the colormap\n * @param [VolumeViewportProperties.preset] - Sets the colormap\n * @param volumeId - The volume id to set the properties for (if undefined, the first volume)\n * @param suppressEvents - If true, the viewport will not emit events\n */\n public setProperties(\n {\n voiRange,\n VOILUTFunction,\n invert,\n colormap,\n preset,\n interpolationType,\n }: VolumeViewportProperties = {},\n volumeId?: string,\n suppressEvents = false\n ): void {\n // Note: colormap should always be done first, since we can then\n // modify the voiRange\n\n if (colormap?.name) {\n this.setColormap(colormap, volumeId, suppressEvents);\n }\n if (colormap?.opacity != null) {\n this.setOpacity(colormap, volumeId);\n }\n\n if (voiRange !== undefined) {\n this.setVOI(voiRange, volumeId, suppressEvents);\n }\n\n if (typeof interpolationType !== 'undefined') {\n this.setInterpolationType(interpolationType);\n }\n\n if (VOILUTFunction !== undefined) {\n this.setVOILUTFunction(VOILUTFunction, volumeId, suppressEvents);\n }\n\n if (invert !== undefined && this.inverted !== invert) {\n this.setInvert(invert, volumeId, suppressEvents);\n }\n\n if (preset !== undefined) {\n this.setPreset(preset, volumeId, suppressEvents);\n }\n }\n\n /**\n * Sets the specified preset for the volume with the given ID\n *\n * @param presetName - The name of the preset to apply (e.g., \"CT-Bone\").\n * @param volumeId - The ID of the volume to set the preset for.\n * @param suppressEvents - If `true`, events will not be emitted during the preset application.\n *\n * @returns void\n */\n private setPreset(presetName, volumeId, suppressEvents) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n\n const preset = VIEWPORT_PRESETS.find((preset) => {\n return preset.name === presetName;\n });\n\n if (!preset) {\n return;\n }\n\n applyPreset(volumeActor, preset);\n }\n\n /**\n * Retrieve the viewport properties\n * @returns viewport properties including voi, interpolation type: TODO: slabThickness, invert, rotation, flip\n */\n public getProperties = (): VolumeViewportProperties => {\n const voiRanges = this.getActors()\n .map((actorEntry) => {\n const volumeActor = actorEntry.actor as vtkVolume;\n const volumeId = actorEntry.uid;\n const volume = cache.getVolume(volumeId);\n if (!volume) {\n return null;\n }\n const cfun = volumeActor.getProperty().getRGBTransferFunction(0);\n const [lower, upper] =\n this.VOILUTFunction === 'SIGMOID'\n ? getVoiFromSigmoidRGBTransferFunction(cfun)\n : cfun.getRange();\n return { volumeId, voiRange: { lower, upper } };\n })\n .filter(Boolean);\n\n const voiRange = voiRanges.length ? voiRanges[0].voiRange : null;\n const VOILUTFunction = this.VOILUTFunction;\n\n return { voiRange, VOILUTFunction, invert: this.inverted };\n };\n\n /**\n * Creates volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n * For each entry, if a `blendMode` and/or `slabThickness` is defined, this will be set on the actor's\n * `VolumeMapper`.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async setVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n\n const FrameOfReferenceUID = firstImageVolume.metadata.FrameOfReferenceUID;\n\n await this._isValidVolumeInputArray(volumeInputArray, FrameOfReferenceUID);\n\n this._FrameOfReferenceUID = FrameOfReferenceUID;\n\n const volumeActors = [];\n\n // One actor per volume\n for (let i = 0; i < volumeInputArray.length; i++) {\n const { volumeId, actorUID, slabThickness } = volumeInputArray[i];\n\n const actor = await createVolumeActor(\n volumeInputArray[i],\n this.element,\n this.id,\n suppressEvents,\n this.use16BitTexture\n );\n\n // We cannot use only volumeId since then we cannot have for instance more\n // than one representation of the same volume (since actors would have the\n // same name, and we don't allow that) AND We cannot use only any uid, since\n // we rely on the volume in the cache for mapper. So we prefer actorUID if\n // it is defined, otherwise we use volumeId for the actor name.\n const uid = actorUID || volumeId;\n volumeActors.push({\n uid,\n actor,\n slabThickness,\n referenceId: volumeId,\n });\n }\n\n this._setVolumeActors(volumeActors);\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n triggerEvent(this.element, Events.VOLUME_VIEWPORT_NEW_VOLUME, {\n viewportId: this.id,\n volumeActors,\n });\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Creates and adds volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async addVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n const volumeActors = [];\n\n await this._isValidVolumeInputArray(\n volumeInputArray,\n this._FrameOfReferenceUID\n );\n\n // One actor per volume\n for (let i = 0; i < volumeInputArray.length; i++) {\n const { volumeId, visibility, actorUID, slabThickness } =\n volumeInputArray[i];\n\n const actor = await createVolumeActor(\n volumeInputArray[i],\n this.element,\n this.id,\n suppressEvents,\n this.use16BitTexture\n );\n\n if (visibility === false) {\n actor.setVisibility(false);\n }\n\n // We cannot use only volumeId since then we cannot have for instance more\n // than one representation of the same volume (since actors would have the\n // same name, and we don't allow that) AND We cannot use only any uid, since\n // we rely on the volume in the cache for mapper. So we prefer actorUID if\n // it is defined, otherwise we use volumeId for the actor name.\n const uid = actorUID || volumeId;\n volumeActors.push({\n uid,\n actor,\n slabThickness,\n // although the actor UID is defined, we need to use the volumeId for the\n // referenceId, since the actor UID is used to reference the actor in the\n // viewport, however, the actor is created from its volumeId\n // and if later we need to grab the referenced volume from cache,\n // we can use the referenceId to get the volume from the cache\n referenceId: volumeId,\n });\n }\n\n this.addActors(volumeActors);\n\n if (immediate) {\n // render\n this.render();\n }\n }\n\n /**\n * It removes the volume actor from the Viewport. If the volume actor is not in\n * the viewport, it does nothing.\n * @param actorUIDs - Array of actor UIDs to remove. In case of simple volume it will\n * be the volume Id, but in case of Segmentation it will be `{volumeId}-{representationType}`\n * since the same volume can be rendered in multiple representations.\n * @param immediate - If true, the Viewport will be rendered immediately\n */\n public removeVolumeActors(actorUIDs: Array, immediate = false): void {\n // Todo: This is actually removeActors\n this.removeActors(actorUIDs);\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * It sets the orientation for the camera, the orientation can be one of the\n * following: axial, sagittal, coronal, default. Use the Enums.OrientationAxis\n * to set the orientation. The \"default\" orientation is the orientation that\n * the volume was acquired in (scan axis)\n *\n * @param orientation - The orientation to set the camera to.\n * @param immediate - Whether the `Viewport` should be rendered as soon as the camera is set.\n */\n public setOrientation(orientation: OrientationAxis, immediate = true): void {\n console.warn('Method \"setOrientation\" needs implementation');\n }\n\n private _getApplicableVolumeActor(volumeId?: string) {\n if (volumeId !== undefined && !this.getActor(volumeId)) {\n return;\n }\n\n const actorEntries = this.getActors();\n\n if (!actorEntries.length) {\n return;\n }\n\n let volumeActor;\n\n if (volumeId) {\n volumeActor = this.getActor(volumeId)?.actor as vtkVolume;\n }\n\n // // set it for the first volume (if there are more than one - fusion)\n if (!volumeActor) {\n volumeActor = actorEntries[0].actor as vtkVolume;\n volumeId = actorEntries[0].uid;\n }\n\n return { volumeActor, volumeId };\n }\n\n private async _isValidVolumeInputArray(\n volumeInputArray: Array,\n FrameOfReferenceUID: string\n ): Promise {\n const numVolumes = volumeInputArray.length;\n\n // Check all other volumes exist and have the same FrameOfReference\n for (let i = 1; i < numVolumes; i++) {\n const volumeInput = volumeInputArray[i];\n\n const imageVolume = await loadVolume(volumeInput.volumeId);\n\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${imageVolume.volumeId} does not exist`\n );\n }\n\n if (FrameOfReferenceUID !== imageVolume.metadata.FrameOfReferenceUID) {\n throw new Error(\n `Volumes being added to viewport ${this.id} do not share the same FrameOfReferenceUID. This is not yet supported`\n );\n }\n }\n\n return true;\n }\n\n /**\n * gets the visible bounds of the viewport in the world coordinate system\n */\n public getBounds(): number[] {\n const renderer = this.getRenderer();\n const bounds = renderer.computeVisiblePropBounds();\n return bounds;\n }\n\n /**\n * Flip the viewport along the desired axis\n * @param flipDirection - FlipDirection\n */\n public flip(flipDirection: FlipDirection): void {\n super.flip(flipDirection);\n }\n\n public getFrameOfReferenceUID = (): string => {\n return this._FrameOfReferenceUID;\n };\n\n /**\n * Checks if the viewport has a volume actor with the given volumeId\n * @param volumeId - the volumeId to look for\n * @returns Boolean indicating if the volume is present in the viewport\n */\n public hasVolumeId(volumeId: string): boolean {\n // Note: this assumes that the uid of the volume is the same as the volumeId\n // which is not guaranteed to be the case for SEG.\n const actorEntries = this.getActors();\n return actorEntries.some((actorEntry) => {\n return actorEntry.uid === volumeId;\n });\n }\n\n /**\n * Returns the image and its properties that is being shown inside the\n * stack viewport. It returns, the image dimensions, image direction,\n * image scalar data, vtkImageData object, metadata, and scaling (e.g., PET suvbw)\n * Note: since the volume viewport supports fusion, to get the\n * image data for a specific volume, use the optional volumeId\n * argument.\n *\n * @param volumeId - The volumeId of the volume to get the image for.\n * @returns IImageData: {dimensions, direction, scalarData, vtkImageData, metadata, scaling}\n */\n public getImageData(volumeId?: string): IImageData | undefined {\n const defaultActor = this.getDefaultActor();\n if (!defaultActor) {\n return;\n }\n\n const { uid: defaultActorUID } = defaultActor;\n volumeId = volumeId ?? defaultActorUID;\n\n const actorEntry = this.getActor(volumeId);\n\n if (!actorIsA(actorEntry, 'vtkVolume')) {\n return;\n }\n\n const actor = actorEntry.actor;\n const volume = cache.getVolume(volumeId);\n\n const vtkImageData = actor.getMapper().getInputData();\n return {\n dimensions: vtkImageData.getDimensions(),\n spacing: vtkImageData.getSpacing(),\n origin: vtkImageData.getOrigin(),\n direction: vtkImageData.getDirection(),\n scalarData: vtkImageData.getPointData().getScalars().isDeleted()\n ? null\n : vtkImageData.getPointData().getScalars().getData(),\n imageData: actor.getMapper().getInputData(),\n metadata: {\n Modality: volume?.metadata?.Modality,\n },\n scaling: volume?.scaling,\n hasPixelSpacing: true,\n };\n }\n\n /**\n * Attaches the volume actors to the viewport.\n *\n * @param volumeActorEntries - The volume actors to add the viewport.\n *\n */\n private _setVolumeActors(volumeActorEntries: Array): void {\n // New volume actors implies resetting the inverted flag (i.e. like starting from scratch).\n this.inverted = false;\n this.setActors(volumeActorEntries);\n }\n\n /**\n * canvasToWorld Returns the world coordinates of the given `canvasPos`\n * projected onto the plane defined by the `Viewport`'s `vtkCamera`'s focal point\n * and the direction of projection.\n *\n * @param canvasPos - The position in canvas coordinates.\n * @returns The corresponding world coordinates.\n * @public\n */\n public canvasToWorld = (canvasPos: Point2): Point3 => {\n const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType;\n\n /**\n * NOTE: this is necessary because we want the coordinate transformation\n * respect to the view plane (plane orthogonal to the camera and passing to\n * the focal point).\n *\n * When vtk.js computes the coordinate transformations, it simply uses the\n * camera matrix (no ray casting).\n *\n * However for the volume viewport the clipping range is set to be\n * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE).\n * The clipping range is used in the camera method getProjectionMatrix().\n * The projection matrix is used then for viewToWorld/worldToView methods of\n * the renderer. This means that vkt.js will not return the coordinates of\n * the point on the view plane (i.e. the depth coordinate will correspond\n * to the focal point).\n *\n * Therefore the clipping range has to be set to (distance, distance + 0.01),\n * where now distance is the distance between the camera position and focal\n * point. This is done internally, in our camera customization when the flag\n * isPerformingCoordinateTransformation is set to true.\n */\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(true);\n\n const renderer = this.getRenderer();\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasPosWithDPR = [\n canvasPos[0] * devicePixelRatio,\n canvasPos[1] * devicePixelRatio,\n ];\n const displayCoord = [\n canvasPosWithDPR[0] + this.sx,\n canvasPosWithDPR[1] + this.sy,\n ];\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const worldCoord = openGLRenderWindow.displayToWorld(\n displayCoord[0],\n displayCoord[1],\n 0,\n renderer\n );\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(false);\n\n return [worldCoord[0], worldCoord[1], worldCoord[2]];\n };\n\n /**\n * Returns the canvas coordinates of the given `worldPos`\n * projected onto the `Viewport`'s `canvas`.\n *\n * @param worldPos - The position in world coordinates.\n * @returns The corresponding canvas coordinates.\n * @public\n */\n public worldToCanvas = (worldPos: Point3): Point2 => {\n const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType;\n\n /**\n * NOTE: this is necessary because we want the coordinate trasformation\n * respect to the view plane (plane orthogonal to the camera and passing to\n * the focal point).\n *\n * When vtk.js computes the coordinate transformations, it simply uses the\n * camera matrix (no ray casting).\n *\n * However for the volume viewport the clipping range is set to be\n * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE).\n * The clipping range is used in the camera method getProjectionMatrix().\n * The projection matrix is used then for viewToWorld/worldToView methods of\n * the renderer. This means that vkt.js will not return the coordinates of\n * the point on the view plane (i.e. the depth coordinate will corresponded\n * to the focal point).\n *\n * Therefore the clipping range has to be set to (distance, distance + 0.01),\n * where now distance is the distance between the camera position and focal\n * point. This is done internally, in our camera customization when the flag\n * isPerformingCoordinateTransformation is set to true.\n */\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(true);\n\n const renderer = this.getRenderer();\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n const displayCoord = openGLRenderWindow.worldToDisplay(\n ...worldPos,\n renderer\n );\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const canvasCoord = [\n displayCoord[0] - this.sx,\n displayCoord[1] - this.sy,\n ];\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasCoordWithDPR = [\n canvasCoord[0] / devicePixelRatio,\n canvasCoord[1] / devicePixelRatio,\n ];\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(false);\n\n return canvasCoordWithDPR;\n };\n\n /*\n * Checking if the imageURI is in the volumes that are being\n * rendered by the viewport. imageURI is the imageId without the schema\n * for instance for the imageId of wadors:http://..., the http://... is the imageURI.\n * Why we don't check the imageId is because the same image can be shown in\n * another viewport (StackViewport) with a different schema\n *\n * @param imageURI - The imageURI to check\n * @returns True if the imageURI is in the volumes that are being rendered by the viewport\n */\n public hasImageURI = (imageURI: string): boolean => {\n const volumeActors = this.getActors().filter((actorEntry) =>\n actorIsA(actorEntry, 'vtkVolume')\n );\n\n return volumeActors.some(({ uid }) => {\n const volume = cache.getVolume(uid);\n\n if (!volume || !volume.imageIds) {\n return false;\n }\n\n const volumeImageURIs = volume.imageIds.map(imageIdToURI);\n\n return volumeImageURIs.includes(imageURI);\n });\n };\n\n protected _getOrientationVectors(\n orientation: OrientationAxis | OrientationVectors\n ): OrientationVectors {\n if (typeof orientation === 'object') {\n if (orientation.viewPlaneNormal && orientation.viewUp) {\n return orientation;\n } else {\n throw new Error(\n 'Invalid orientation object. It must contain viewPlaneNormal and viewUp'\n );\n }\n } else if (\n typeof orientation === 'string' &&\n MPR_CAMERA_VALUES[orientation]\n ) {\n return MPR_CAMERA_VALUES[orientation];\n } else {\n throw new Error(\n `Invalid orientation: ${orientation}. Valid orientations are: ${Object.keys(\n MPR_CAMERA_VALUES\n ).join(', ')}`\n );\n }\n }\n /**\n * Gets the largest slab thickness from all actors in the viewport.\n *\n * @returns slabThickness - The slab thickness.\n */\n public getSlabThickness(): number {\n const actors = this.getActors();\n let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;\n actors.forEach((actor) => {\n if (actor.slabThickness > slabThickness) {\n slabThickness = actor.slabThickness;\n }\n });\n\n return slabThickness;\n }\n /**\n * Given a point in world coordinates, return the intensity at that point\n * @param point - The point in world coordinates to get the intensity\n * from.\n * @returns The intensity value of the voxel at the given point.\n */\n public getIntensityFromWorld(point: Point3): number {\n const actorEntry = this.getDefaultActor();\n if (!actorIsA(actorEntry, 'vtkVolume')) {\n return;\n }\n\n const { actor, uid } = actorEntry;\n const imageData = actor.getMapper().getInputData();\n\n const volume = cache.getVolume(uid);\n const { dimensions } = volume;\n\n const index = transformWorldToIndex(imageData, point);\n\n const voxelIndex =\n index[2] * dimensions[0] * dimensions[1] +\n index[1] * dimensions[0] +\n index[0];\n\n return volume.getScalarData()[voxelIndex];\n }\n\n /**\n * Returns the list of image Ids for the current viewport\n *\n * @param volumeId - volumeId\n * @returns list of strings for image Ids\n */\n public getImageIds = (volumeId?: string): Array => {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n throw new Error(`No actor found for the given volumeId: ${volumeId}`);\n }\n\n const volumeIdToUse = applicableVolumeActorInfo.volumeId;\n\n const imageVolume = cache.getVolume(volumeIdToUse);\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${volumeIdToUse} does not exist in cache`\n );\n }\n\n return imageVolume.imageIds;\n };\n\n abstract getCurrentImageIdIndex(): number;\n\n abstract getCurrentImageId(): string;\n\n abstract setBlendMode(\n blendMode: BlendModes,\n filterActorUIDs?: Array,\n immediate?: boolean\n ): void;\n\n abstract setSlabThickness(\n slabThickness: number,\n filterActorUIDs?: Array\n ): void;\n\n abstract resetProperties(volumeId?: string): void;\n}\n\nexport default BaseVolumeViewport;\n","import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';\nimport vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\n\nimport { vec3 } from 'gl-matrix';\n\nimport cache from '../cache';\nimport { MPR_CAMERA_VALUES, RENDERING_DEFAULTS } from '../constants';\nimport { BlendModes, OrientationAxis, Events } from '../enums';\nimport type {\n ActorEntry,\n IImageVolume,\n IVolumeInput,\n OrientationVectors,\n Point3,\n} from '../types';\nimport type { ViewportInput } from '../types/IViewport';\nimport { actorIsA, getClosestImageId, triggerEvent } from '../utilities';\nimport BaseVolumeViewport from './BaseVolumeViewport';\nimport setDefaultVolumeVOI from './helpers/setDefaultVolumeVOI';\n\n/**\n * An object representing a VolumeViewport. VolumeViewports are used to render\n * 3D volumes from which various orientations can be viewed. Since VolumeViewports\n * use SharedVolumeMappers behind the scene, memory footprint of visualizations\n * of the same volume in different orientations is very small.\n *\n * For setting volumes on viewports you need to use {@link addVolumesToViewports}\n * which will add volumes to the specified viewports.\n */\nclass VolumeViewport extends BaseVolumeViewport {\n private _useAcquisitionPlaneForViewPlane = false;\n constructor(props: ViewportInput) {\n super(props);\n\n const { orientation } = this.options;\n\n // if the camera is set to be acquisition axis then we need to skip\n // it for now until the volume is set\n if (orientation && orientation !== OrientationAxis.ACQUISITION) {\n this.applyViewOrientation(orientation);\n return;\n }\n\n this._useAcquisitionPlaneForViewPlane = true;\n }\n\n /**\n * Creates volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n * For each entry, if a `blendMode` and/or `slabThickness` is defined, this will be set on the actor's\n * `VolumeMapper`.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async setVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n\n if (this._useAcquisitionPlaneForViewPlane) {\n this._setViewPlaneToAcquisitionPlane(firstImageVolume);\n this._useAcquisitionPlaneForViewPlane = false;\n }\n\n return super.setVolumes(volumeInputArray, immediate, suppressEvents);\n }\n\n /**\n * Creates and adds volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async addVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n\n if (this._useAcquisitionPlaneForViewPlane) {\n this._setViewPlaneToAcquisitionPlane(firstImageVolume);\n this._useAcquisitionPlaneForViewPlane = false;\n }\n\n return super.addVolumes(volumeInputArray, immediate, suppressEvents);\n }\n\n /**\n * It sets the orientation for the camera, the orientation can be one of the\n * following: axial, sagittal, coronal, default. Use the Enums.OrientationAxis\n * to set the orientation. The \"default\" orientation is the orientation that\n * the volume was acquired in (scan axis)\n *\n * @param orientation - The orientation to set the camera to.\n * @param immediate - Whether the `Viewport` should be rendered as soon as the camera is set.\n */\n public setOrientation(orientation: OrientationAxis, immediate = true): void {\n let viewPlaneNormal, viewUp;\n\n if (MPR_CAMERA_VALUES[orientation]) {\n ({ viewPlaneNormal, viewUp } = MPR_CAMERA_VALUES[orientation]);\n } else if (orientation === 'acquisition') {\n ({ viewPlaneNormal, viewUp } = this._getAcquisitionPlaneOrientation());\n } else {\n throw new Error(\n `Invalid orientation: ${orientation}. Use Enums.OrientationAxis instead.`\n );\n }\n\n this.setCamera({\n viewPlaneNormal,\n viewUp,\n });\n\n this.resetCamera();\n\n if (immediate) {\n this.render();\n }\n }\n\n private _getAcquisitionPlaneOrientation(): OrientationVectors {\n const actorEntry = this.getDefaultActor();\n\n if (!actorEntry) {\n return;\n }\n\n // Todo: fix this after we add the volumeId reference to actorEntry later\n // in the segmentation refactor\n const volumeId = actorEntry.uid;\n\n const imageVolume = cache.getVolume(volumeId);\n\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${volumeId} does not exist in cache`\n );\n }\n\n const { direction } = imageVolume;\n const viewPlaneNormal = direction.slice(6, 9).map((x) => -x) as Point3;\n const viewUp = (direction.slice(3, 6) as Point3).map((x) => -x) as Point3;\n\n return {\n viewPlaneNormal,\n viewUp,\n };\n }\n\n private _setViewPlaneToAcquisitionPlane(imageVolume: IImageVolume): void {\n let viewPlaneNormal, viewUp;\n\n if (imageVolume) {\n const { direction } = imageVolume;\n viewPlaneNormal = direction.slice(6, 9).map((x) => -x) as Point3;\n viewUp = (direction.slice(3, 6) as Point3).map((x) => -x) as Point3;\n } else {\n ({ viewPlaneNormal, viewUp } = this._getAcquisitionPlaneOrientation());\n }\n\n this.setCamera({\n viewPlaneNormal,\n viewUp,\n });\n\n this.resetCamera();\n }\n\n public setBlendMode(\n blendMode: BlendModes,\n filterActorUIDs = [],\n immediate = false\n ): void {\n let actorEntries = this.getActors();\n\n if (filterActorUIDs && filterActorUIDs.length > 0) {\n actorEntries = actorEntries.filter((actorEntry: ActorEntry) => {\n return filterActorUIDs.includes(actorEntry.uid);\n });\n }\n\n actorEntries.forEach((actorEntry) => {\n const { actor } = actorEntry;\n\n const mapper = actor.getMapper();\n // @ts-ignore vtk incorrect typing\n mapper.setBlendMode(blendMode);\n });\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Reset the camera for the volume viewport\n */\n public resetCamera(\n resetPan = true,\n resetZoom = true,\n resetToCenter = true\n ): boolean {\n super.resetCamera(resetPan, resetZoom, resetToCenter);\n\n this.resetVolumeViewportClippingRange();\n\n const activeCamera = this.getVtkActiveCamera();\n const viewPlaneNormal = activeCamera.getViewPlaneNormal();\n const focalPoint = activeCamera.getFocalPoint();\n\n // always add clipping planes for the volume viewport. If a use case\n // arises where we don't want clipping planes, you should use the volume_3d\n // viewport instead.\n const actorEntries = this.getActors();\n actorEntries.forEach((actorEntry) => {\n if (!actorEntry.actor) {\n return;\n }\n const mapper = actorEntry.actor.getMapper();\n const vtkPlanes = mapper.getClippingPlanes();\n\n if (vtkPlanes.length === 0) {\n const clipPlane1 = vtkPlane.newInstance();\n const clipPlane2 = vtkPlane.newInstance();\n const newVtkPlanes = [clipPlane1, clipPlane2];\n\n let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;\n if (actorEntry.slabThickness) {\n slabThickness = actorEntry.slabThickness;\n }\n\n this.setOrientationOfClippingPlanes(\n newVtkPlanes,\n slabThickness,\n viewPlaneNormal,\n focalPoint\n );\n\n mapper.addClippingPlane(clipPlane1);\n mapper.addClippingPlane(clipPlane2);\n }\n });\n\n return true;\n }\n\n /**\n * It sets the slabThickness of the actors of the viewport. If filterActorUIDs are\n * provided, only the actors with the given UIDs will be affected. If no\n * filterActorUIDs are provided, all actors will be affected.\n *\n * @param slabThickness - The slab thickness to set.\n * @param filterActorUIDs - Optional argument to filter the actors to apply\n * the slab thickness to (if not provided, all actors will be affected).\n */\n public setSlabThickness(slabThickness: number, filterActorUIDs = []): void {\n let actorEntries = this.getActors();\n\n if (filterActorUIDs && filterActorUIDs.length > 0) {\n actorEntries = actorEntries.filter((actorEntry) => {\n return filterActorUIDs.includes(actorEntry.uid);\n });\n }\n\n actorEntries.forEach((actorEntry) => {\n if (actorIsA(actorEntry, 'vtkVolume')) {\n actorEntry.slabThickness = slabThickness;\n }\n });\n\n const currentCamera = this.getCamera();\n this.updateClippingPlanesForActors(currentCamera);\n this.triggerCameraModifiedEventIfNecessary(currentCamera, currentCamera);\n }\n\n /**\n * Uses the origin and focalPoint to calculate the slice index.\n * Todo: This only works if the imageIds are properly sorted\n *\n * @returns The slice index\n */\n public getCurrentImageIdIndex = (): number | undefined => {\n const { viewPlaneNormal, focalPoint } = this.getCamera();\n\n // Todo: handle scenario of fusion of multiple volumes\n // we cannot only check number of actors, because we might have\n // segmentations ...\n const { origin, spacing } = this.getImageData();\n\n // how many steps are from the origin to the focal point in the\n // normal direction\n const spacingInNormal = spacing[2];\n const sub = vec3.create();\n vec3.sub(sub, focalPoint, origin);\n const distance = vec3.dot(sub, viewPlaneNormal);\n\n // divide by the spacing in the normal direction to get the\n // number of steps, and subtract 1 to get the index\n return Math.round(Math.abs(distance) / spacingInNormal);\n };\n\n /**\n * Uses viewport camera and volume actor to decide if the viewport\n * is looking at the volume in the direction of acquisition (imageIds).\n * If so, it uses the origin and focalPoint to find which imageId is\n * currently being viewed.\n *\n * @returns ImageId\n */\n public getCurrentImageId = (): string | undefined => {\n if (this.getActors().length > 1) {\n console.warn(\n `Using the first/default actor of ${\n this.getActors().length\n } actors for getCurrentImageId.`\n );\n }\n\n const actorEntry = this.getDefaultActor();\n\n if (!actorEntry || !actorIsA(actorEntry, 'vtkVolume')) {\n return;\n }\n\n const { uid } = actorEntry;\n const volume = cache.getVolume(uid);\n\n if (!volume) {\n return;\n }\n\n const { viewPlaneNormal, focalPoint } = this.getCamera();\n\n return getClosestImageId(volume, focalPoint, viewPlaneNormal);\n };\n\n getRotation = (): number => 0;\n\n /**\n * Reset the viewport properties to the default values\n *\n\n * @param volumeId - Optional volume ID to specify which volume properties to reset.\n * If not provided, it will reset the properties of the default actor.\n *\n * @returns void\n */\n public resetProperties(volumeId?: string): void {\n this._resetProperties(volumeId);\n }\n\n private _resetProperties(volumeId?: string) {\n // Get the actor based on the volumeId if provided, otherwise use the default actor.\n const volumeActor = volumeId\n ? this.getActor(volumeId)\n : this.getDefaultActor();\n\n if (!volumeActor) {\n throw new Error(`No actor found for the given volumeId: ${volumeId}`);\n }\n\n const imageVolume = cache.getVolume(volumeActor.uid);\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${volumeActor.uid} does not exist in cache`\n );\n }\n setDefaultVolumeVOI(volumeActor.actor as vtkVolume, imageVolume, false);\n\n const range = (volumeActor.actor as vtkVolume)\n .getProperty()\n .getRGBTransferFunction(0)\n .getMappingRange();\n\n const eventDetails = {\n viewportId: volumeActor.uid,\n range: {\n lower: range[0],\n upper: range[1],\n },\n volumeId: volumeActor.uid,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetails);\n }\n}\n\nexport default VolumeViewport;\n","import macro from '../../macros.js';\nimport vtkAbstractMapper3D from './AbstractMapper3D.js';\n\n// vtkAbstractImageMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkAbstractImageMapper(publicAPI, model) {\n model.classHierarchy.push('vtkAbstractImageMapper');\n\n publicAPI.getIsOpaque = function () {\n return true;\n };\n\n publicAPI.getCurrentImage = function () {\n return null;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n slice: 0,\n customDisplayExtent: [0, 0, 0, 0, 0, 0],\n useCustomExtents: false,\n backgroundColor: [0, 0, 0, 1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkAbstractMapper3D.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['slice', 'useCustomExtents']);\n macro.setGetArray(publicAPI, model, ['customDisplayExtent'], 6);\n macro.setGetArray(publicAPI, model, ['backgroundColor'], 4);\n vtkAbstractImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar vtkAbstractImageMapper$1 = {\n extend: extend\n};\n\nexport { vtkAbstractImageMapper$1 as default, extend };\n","import { vec3 } from 'gl-matrix';\nimport vtkPlane from '../../../Common/DataModel/Plane.js';\n\n/**\n * Perform plane-line intersection, where the line is defined by two points (p1, p2),\n * and the plane is defined by the imageData and slice number.\n *\n * @param {Vector3} p1\n * @param {Vector3} p2\n * @param {vtkImageMapper|vtkImageArrayMapper} mapper\n */\n\nfunction doPicking(p1, p2, mapper) {\n var imageData = mapper.getCurrentImage();\n var extent = imageData.getExtent(); // Slice origin\n\n var ijk = [extent[0], extent[2], extent[4]];\n\n var _mapper$getClosestIJK = mapper.getClosestIJKAxis(),\n ijkMode = _mapper$getClosestIJK.ijkMode;\n\n var nSlice = mapper.isA('vtkImageArrayMapper') ? mapper.getSubSlice() : mapper.getSlice();\n\n if (ijkMode !== mapper.getSlicingMode()) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = mapper.getSliceAtPosition(nSlice);\n }\n\n ijk[ijkMode] += nSlice;\n var worldOrigin = [0, 0, 0];\n imageData.indexToWorld(ijk, worldOrigin); // Normal computation\n\n ijk[ijkMode] += 1;\n var worldNormal = [0, 0, 0];\n imageData.indexToWorld(ijk, worldNormal);\n worldNormal[0] -= worldOrigin[0];\n worldNormal[1] -= worldOrigin[1];\n worldNormal[2] -= worldOrigin[2];\n vec3.normalize(worldNormal, worldNormal);\n var intersect = vtkPlane.intersectWithLine(p1, p2, worldOrigin, worldNormal);\n\n if (intersect.intersection) {\n var point = intersect.x;\n var absoluteIJK = [0, 0, 0];\n imageData.worldToIndex(point, absoluteIJK); // `t` is the parametric position along the line\n // defined in Plane.intersectWithLine\n\n return {\n t: intersect.t,\n absoluteIJK: absoluteIJK\n };\n }\n\n return null;\n}\n/**\n * Implement point picking for image plane.\n * The plane is defined by the imageData and current slice number,\n * set in the input mapper.\n *\n * @param {Vector3} p1\n * @param {Vector3} p2\n * @param {vtkImageMapper|vtkImageArrayMapper} mapper\n */\n\n\nfunction intersectWithLineForPointPicking(p1, p2, mapper) {\n var pickingData = doPicking(p1, p2, mapper);\n\n if (pickingData) {\n var imageData = mapper.getCurrentImage();\n var extent = imageData.getExtent(); // Get closer integer ijk\n // NB: point picking means closest slice, means rounding\n\n var ijk = [Math.round(pickingData.absoluteIJK[0]), Math.round(pickingData.absoluteIJK[1]), Math.round(pickingData.absoluteIJK[2])]; // Are we outside our actual extent\n\n if (ijk[0] < extent[0] || ijk[0] > extent[1] || ijk[1] < extent[2] || ijk[1] > extent[3] || ijk[2] < extent[4] || ijk[2] > extent[5]) {\n return null;\n }\n\n return {\n t: pickingData.t,\n ijk: ijk\n };\n }\n\n return null;\n}\n/**\n * Implement cell picking for image plane.\n * The plane is defined by the imageData and current slice number,\n * set in the input mapper.\n *\n * @param {Vector3} p1\n * @param {Vector3} p2\n * @param {vtkImageMapper|vtkImageArrayMapper} mapper\n */\n\nfunction intersectWithLineForCellPicking(p1, p2, mapper) {\n var pickingData = doPicking(p1, p2, mapper);\n\n if (pickingData) {\n var imageData = mapper.getCurrentImage();\n var extent = imageData.getExtent();\n var absIJK = pickingData.absoluteIJK; // Get closer integer ijk\n // NB: cell picking means closest voxel, means flooring\n\n var ijk = [Math.floor(absIJK[0]), Math.floor(absIJK[1]), Math.floor(absIJK[2])]; // Are we outside our actual extent\n\n if (ijk[0] < extent[0] || ijk[0] > extent[1] - 1 || ijk[1] < extent[2] || ijk[1] > extent[3] - 1 || ijk[2] < extent[4] || // handle single-slice images\n ijk[2] > (extent[5] ? extent[5] - 1 : extent[5])) {\n return null;\n } // Parametric coordinates within cell\n\n\n var pCoords = [absIJK[0] - ijk[0], absIJK[1] - ijk[1], absIJK[2] - ijk[2]];\n return {\n t: pickingData.t,\n ijk: ijk,\n pCoords: pCoords\n };\n }\n\n return null;\n}\n\nexport { intersectWithLineForCellPicking, intersectWithLineForPointPicking };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport Constants from './ImageMapper/Constants.js';\nimport macro from '../../macros.js';\nimport vtkAbstractImageMapper from './AbstractImageMapper.js';\nimport { intersectWithLineForPointPicking, intersectWithLineForCellPicking } from './AbstractImageMapper/helper.js';\nimport { C as clampValue, O as multiply3x3_vect3, N as createUninitializedBounds } from '../../Common/Core/Math/index.js';\nimport CoincidentTopologyHelper from './Mapper/CoincidentTopologyHelper.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar staticOffsetAPI = CoincidentTopologyHelper.staticOffsetAPI,\n otherStaticMethods = CoincidentTopologyHelper.otherStaticMethods;\nvar vtkWarningMacro = macro.vtkWarningMacro;\nvar SlicingMode = Constants.SlicingMode; // ----------------------------------------------------------------------------\n// vtkImageMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageMapper');\n\n publicAPI.getSliceAtPosition = function (pos) {\n var image = publicAPI.getCurrentImage();\n var pos3;\n\n if (pos.length === 3) {\n pos3 = pos;\n } else if (Number.isFinite(pos)) {\n var bds = image.getBounds();\n\n switch (model.slicingMode) {\n case SlicingMode.X:\n pos3 = [pos, (bds[3] + bds[2]) / 2, (bds[5] + bds[4]) / 2];\n break;\n\n case SlicingMode.Y:\n pos3 = [(bds[1] + bds[0]) / 2, pos, (bds[5] + bds[4]) / 2];\n break;\n\n case SlicingMode.Z:\n pos3 = [(bds[1] + bds[0]) / 2, (bds[3] + bds[2]) / 2, pos];\n break;\n }\n }\n\n var ijk = [0, 0, 0];\n image.worldToIndex(pos3, ijk);\n var ex = image.getExtent();\n\n var _publicAPI$getClosest = publicAPI.getClosestIJKAxis(),\n ijkMode = _publicAPI$getClosest.ijkMode;\n\n var slice = 0;\n\n switch (ijkMode) {\n case SlicingMode.I:\n slice = clampValue(ijk[0], ex[0], ex[1]);\n break;\n\n case SlicingMode.J:\n slice = clampValue(ijk[1], ex[2], ex[3]);\n break;\n\n case SlicingMode.K:\n slice = clampValue(ijk[2], ex[4], ex[5]);\n break;\n\n default:\n return 0;\n }\n\n return slice;\n };\n\n publicAPI.setSliceFromCamera = function (cam) {\n var fp = cam.getFocalPoint();\n\n switch (model.slicingMode) {\n case SlicingMode.I:\n case SlicingMode.J:\n case SlicingMode.K:\n {\n var slice = publicAPI.getSliceAtPosition(fp);\n publicAPI.setSlice(slice);\n }\n break;\n\n case SlicingMode.X:\n publicAPI.setSlice(fp[0]);\n break;\n\n case SlicingMode.Y:\n publicAPI.setSlice(fp[1]);\n break;\n\n case SlicingMode.Z:\n publicAPI.setSlice(fp[2]);\n break;\n }\n };\n\n publicAPI.setXSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.X);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setYSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.Y);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setZSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.Z);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setISlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.I);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setJSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.J);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setKSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.K);\n publicAPI.setSlice(id);\n };\n\n publicAPI.getSlicingModeNormal = function () {\n var out = [0, 0, 0];\n var a = publicAPI.getCurrentImage().getDirection();\n var mat3 = [[a[0], a[1], a[2]], [a[3], a[4], a[5]], [a[6], a[7], a[8]]];\n\n switch (model.slicingMode) {\n case SlicingMode.X:\n out[0] = 1;\n break;\n\n case SlicingMode.Y:\n out[1] = 1;\n break;\n\n case SlicingMode.Z:\n out[2] = 1;\n break;\n\n case SlicingMode.I:\n multiply3x3_vect3(mat3, [1, 0, 0], out);\n break;\n\n case SlicingMode.J:\n multiply3x3_vect3(mat3, [0, 1, 0], out);\n break;\n\n case SlicingMode.K:\n multiply3x3_vect3(mat3, [0, 0, 1], out);\n break;\n }\n\n return out;\n };\n\n function computeClosestIJKAxis() {\n var inVec3;\n\n switch (model.slicingMode) {\n case SlicingMode.X:\n inVec3 = [1, 0, 0];\n break;\n\n case SlicingMode.Y:\n inVec3 = [0, 1, 0];\n break;\n\n case SlicingMode.Z:\n inVec3 = [0, 0, 1];\n break;\n\n default:\n model.closestIJKAxis = {\n ijkMode: model.slicingMode,\n flip: false\n };\n return;\n } // Project vec3 onto direction cosines\n\n\n var out = [0, 0, 0]; // The direction matrix in vtkImageData is the indexToWorld rotation matrix\n // with a column-major data layout since it is stored as a WebGL matrix.\n // We need the worldToIndex rotation matrix for the projection, and it needs\n // to be in a row-major data layout to use vtkMath for operations.\n // To go from the indexToWorld column-major matrix to the worldToIndex\n // row-major matrix, we need to transpose it (column -> row) then inverse it.\n // However, that 3x3 matrix is a rotation matrix which is orthonormal, meaning\n // that its inverse is equal to its transpose. We therefore need to apply two\n // transpositions resulting in a no-op.\n\n var a = publicAPI.getCurrentImage().getDirection();\n multiply3x3_vect3(a, inVec3, out);\n var maxAbs = 0.0;\n var ijkMode = -1;\n var flip = false;\n\n for (var axis = 0; axis < out.length; ++axis) {\n var absValue = Math.abs(out[axis]);\n\n if (absValue > maxAbs) {\n maxAbs = absValue;\n flip = out[axis] < 0.0;\n ijkMode = axis;\n }\n }\n\n if (maxAbs !== 1.0) {\n var xyzLabel = 'IJKXYZ'[model.slicingMode];\n var ijkLabel = 'IJKXYZ'[ijkMode];\n vtkWarningMacro(\"Unaccurate slicing along \".concat(xyzLabel, \" axis which \") + \"is not aligned with any IJK axis of the image data. \" + \"Using \".concat(ijkLabel, \" axis as a fallback (\").concat(maxAbs, \"% aligned). \") + \"Necessitates slice reformat that is not yet implemented. \" + \"You can switch the slicing mode on your mapper to do IJK slicing instead.\");\n }\n\n model.closestIJKAxis = {\n ijkMode: ijkMode,\n flip: flip\n };\n }\n\n publicAPI.setSlicingMode = function (mode) {\n if (model.slicingMode === mode) {\n return;\n }\n\n model.slicingMode = mode;\n\n if (publicAPI.getCurrentImage()) {\n computeClosestIJKAxis();\n }\n\n publicAPI.modified();\n };\n\n publicAPI.getClosestIJKAxis = function () {\n if ((model.closestIJKAxis === undefined || model.closestIJKAxis.ijkMode === SlicingMode.NONE) && publicAPI.getCurrentImage()) {\n computeClosestIJKAxis();\n }\n\n return model.closestIJKAxis;\n };\n\n publicAPI.getBounds = function () {\n var image = publicAPI.getCurrentImage();\n\n if (!image) {\n return createUninitializedBounds();\n }\n\n if (!model.useCustomExtents) {\n return image.getBounds();\n }\n\n var ex = model.customDisplayExtent.slice();\n\n var _publicAPI$getClosest2 = publicAPI.getClosestIJKAxis(),\n ijkMode = _publicAPI$getClosest2.ijkMode;\n\n var nSlice = model.slice;\n\n if (ijkMode !== model.slicingMode) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = publicAPI.getSliceAtPosition(model.slice);\n }\n\n switch (ijkMode) {\n case SlicingMode.I:\n ex[0] = nSlice;\n ex[1] = nSlice;\n break;\n\n case SlicingMode.J:\n ex[2] = nSlice;\n ex[3] = nSlice;\n break;\n\n case SlicingMode.K:\n ex[4] = nSlice;\n ex[5] = nSlice;\n break;\n }\n\n return image.extentToBounds(ex);\n };\n\n publicAPI.getBoundsForSlice = function () {\n var slice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : model.slice;\n var halfThickness = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var image = publicAPI.getCurrentImage();\n\n if (!image) {\n return createUninitializedBounds();\n }\n\n var extent = image.getSpatialExtent();\n\n var _publicAPI$getClosest3 = publicAPI.getClosestIJKAxis(),\n ijkMode = _publicAPI$getClosest3.ijkMode;\n\n var nSlice = slice;\n\n if (ijkMode !== model.slicingMode) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = publicAPI.getSliceAtPosition(slice);\n }\n\n switch (ijkMode) {\n case SlicingMode.I:\n extent[0] = nSlice - halfThickness;\n extent[1] = nSlice + halfThickness;\n break;\n\n case SlicingMode.J:\n extent[2] = nSlice - halfThickness;\n extent[3] = nSlice + halfThickness;\n break;\n\n case SlicingMode.K:\n extent[4] = nSlice - halfThickness;\n extent[5] = nSlice + halfThickness;\n break;\n }\n\n return image.extentToBounds(extent);\n };\n\n publicAPI.intersectWithLineForPointPicking = function (p1, p2) {\n return intersectWithLineForPointPicking(p1, p2, publicAPI);\n };\n\n publicAPI.intersectWithLineForCellPicking = function (p1, p2) {\n return intersectWithLineForCellPicking(p1, p2, publicAPI);\n };\n\n publicAPI.getCurrentImage = function () {\n return publicAPI.getInputData();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n slicingMode: SlicingMode.NONE,\n closestIJKAxis: {\n ijkMode: SlicingMode.NONE,\n flip: false\n },\n renderToRectangle: false,\n sliceAtFocalPoint: false,\n preferSizeOverAccuracy: false // Whether to use halfFloat representation of float, when it is inaccurate\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkAbstractImageMapper.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['slicingMode']);\n macro.setGet(publicAPI, model, ['closestIJKAxis', 'renderToRectangle', 'sliceAtFocalPoint', 'preferSizeOverAccuracy']);\n CoincidentTopologyHelper.implementCoincidentTopologyMethods(publicAPI, model); // Object methods\n\n vtkImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageMapper'); // ----------------------------------------------------------------------------\n\nvar vtkImageMapper$1 = _objectSpread(_objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, staticOffsetAPI), otherStaticMethods), Constants);\n\nexport { vtkImageMapper$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport InterpolationType$1 from './ImageProperty/Constants.js';\n\nvar InterpolationType = InterpolationType$1.InterpolationType;\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar VTK_MAX_VRCOMP = 4; // ----------------------------------------------------------------------------\n// vtkImageProperty methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageProperty(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageProperty');\n\n publicAPI.getMTime = function () {\n var mTime = model.mtime;\n var time;\n\n for (var index = 0; index < VTK_MAX_VRCOMP; index++) {\n // Color MTimes\n if (model.componentData[index].rGBTransferFunction) {\n // time that RGB transfer function was last modified\n time = model.componentData[index].rGBTransferFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n } // Piecewise function MTimes\n\n\n if (model.componentData[index].piecewiseFunction) {\n // time that weighting function was last modified\n time = model.componentData[index].piecewiseFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n }\n\n return mTime;\n }; // Set the color of a volume to an RGB transfer function\n\n\n publicAPI.setRGBTransferFunction = function (index, func) {\n // backwards compatible call without the component index\n var idx = index;\n var transferFunc = func;\n\n if (!Number.isInteger(index)) {\n transferFunc = index;\n idx = 0;\n }\n\n if (model.componentData[idx].rGBTransferFunction !== transferFunc) {\n model.componentData[idx].rGBTransferFunction = transferFunc;\n publicAPI.modified();\n return true;\n }\n\n return false;\n }; // Get the currently set RGB transfer function.\n\n\n publicAPI.getRGBTransferFunction = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.componentData[idx].rGBTransferFunction;\n }; // Set the piecewise function\n\n\n publicAPI.setPiecewiseFunction = function (index, func) {\n var idx = index;\n var transferFunc = func;\n\n if (!Number.isInteger(index)) {\n transferFunc = index;\n idx = 0;\n }\n\n if (model.componentData[idx].piecewiseFunction !== transferFunc) {\n model.componentData[idx].piecewiseFunction = transferFunc;\n publicAPI.modified();\n return true;\n }\n\n return false;\n }; // Get the component weighting function.\n\n\n publicAPI.getPiecewiseFunction = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.componentData[idx].piecewiseFunction;\n }; // Alias to set the piecewise function\n\n\n publicAPI.setScalarOpacity = function (index, func) {\n // backwards compatible call without the component index\n var idx = index;\n var transferFunc = func;\n\n if (!Number.isInteger(index)) {\n transferFunc = index;\n idx = 0;\n }\n\n return publicAPI.setPiecewiseFunction(idx, transferFunc);\n }; // Alias to get the piecewise function (backwards compatibility)\n\n\n publicAPI.getScalarOpacity = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return publicAPI.getPiecewiseFunction(idx);\n };\n\n publicAPI.setComponentWeight = function (index, value) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return false;\n }\n\n var val = Math.min(1, Math.max(0, value));\n\n if (model.componentData[index].componentWeight !== val) {\n model.componentData[index].componentWeight = val;\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n\n publicAPI.getComponentWeight = function (index) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return 0.0;\n }\n\n return model.componentData[index].componentWeight;\n };\n\n publicAPI.setInterpolationTypeToNearest = function () {\n return publicAPI.setInterpolationType(InterpolationType.NEAREST);\n };\n\n publicAPI.setInterpolationTypeToLinear = function () {\n return publicAPI.setInterpolationType(InterpolationType.LINEAR);\n };\n\n publicAPI.getInterpolationTypeAsString = function () {\n return macro.enumToString(InterpolationType, model.interpolationType);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n independentComponents: false,\n interpolationType: InterpolationType.LINEAR,\n colorWindow: 255,\n colorLevel: 127.5,\n ambient: 1.0,\n diffuse: 0.0,\n opacity: 1.0,\n useLookupTableScalarRange: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n\n if (!model.componentData) {\n model.componentData = [];\n\n for (var i = 0; i < VTK_MAX_VRCOMP; i++) {\n model.componentData.push({\n rGBTransferFunction: null,\n piecewiseFunction: null,\n componentWeight: 1.0\n });\n }\n }\n\n macro.setGet(publicAPI, model, ['independentComponents', 'interpolationType', 'colorWindow', 'colorLevel', 'ambient', 'diffuse', 'opacity', 'useLookupTableScalarRange']); // Object methods\n\n vtkImageProperty(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageProperty'); // ----------------------------------------------------------------------------\n\nvar vtkImageProperty$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageProperty$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkProp3D from './Prop3D.js';\nimport vtkImageProperty from './ImageProperty.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkImageSlice methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageSlice(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageSlice');\n\n publicAPI.getActors = function () {\n return publicAPI;\n };\n\n publicAPI.getImages = function () {\n return publicAPI;\n };\n\n publicAPI.getIsOpaque = function () {\n if (model.forceOpaque) {\n return true;\n }\n\n if (model.forceTranslucent) {\n return false;\n } // make sure we have a property\n\n\n if (!model.property) {\n // force creation of a property\n publicAPI.getProperty();\n }\n\n var isOpaque = model.property.getOpacity() >= 1.0; // are we using an opaque scalar array, if any?\n\n isOpaque = isOpaque && (!model.mapper || model.mapper.getIsOpaque());\n return isOpaque;\n }; // Always render during opaque pass, to keep the behavior\n // predictable and because depth-peeling kills alpha-blending.\n // In the future, the Renderer should render images in layers,\n // i.e. where each image will have a layer number assigned to it,\n // and the Renderer will do the images in their own pass.\n\n\n publicAPI.hasTranslucentPolygonalGeometry = function () {\n return false;\n };\n\n publicAPI.makeProperty = vtkImageProperty.newInstance;\n\n publicAPI.getProperty = function () {\n if (model.property === null) {\n model.property = publicAPI.makeProperty();\n }\n\n return model.property;\n };\n\n publicAPI.getBounds = function () {\n if (model.mapper === null) {\n return model.bounds;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.mapper.getBounds();\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n model.bounds = [1, -1, 1, -1, 1, -1];\n model.boundsMTime.modified();\n return bds;\n } // Check if we have cached values for these bounds - we cache the\n // values returned by model.mapper.getBounds() and we store the time\n // of caching. If the values returned this time are different, or\n // the modified time of this class is newer than the cached time,\n // then we need to rebuild.\n\n\n var zip = function zip(rows) {\n return rows[0].map(function (_, c) {\n return rows.map(function (row) {\n return row[c];\n });\n });\n };\n\n if (!model.mapperBounds || !zip([bds, model.mapperBounds]).reduce(function (a, b) {\n return a && b[0] === b[1];\n }, true) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {\n vtkDebugMacro('Recomputing bounds...');\n model.mapperBounds = bds.map(function (x) {\n return x;\n });\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n /* eslint-disable no-multi-assign */\n\n model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;\n model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;\n /* eslint-enable no-multi-assign */\n\n model.bounds = model.bounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n model.boundsMTime.modified();\n }\n\n return model.bounds;\n };\n\n publicAPI.getBoundsForSlice = function (slice) {\n var thickness = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Check for the special case when the mapper's bounds are unknown\n var bds = model.mapper.getBoundsForSlice(slice, thickness);\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n return bds;\n }\n\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n var newBounds = [Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, -Number.MAX_VALUE];\n newBounds = newBounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n return newBounds;\n }; //----------------------------------------------------------------------------\n // Get the minimum X bound\n\n\n publicAPI.getMinXBound = function () {\n publicAPI.getBounds();\n return model.bounds[0];\n }; // Get the maximum X bound\n\n\n publicAPI.getMaxXBound = function () {\n publicAPI.getBounds();\n return model.bounds[1];\n }; // Get the minimum Y bound\n\n\n publicAPI.getMinYBound = function () {\n publicAPI.getBounds();\n return model.bounds[2];\n }; // Get the maximum Y bound\n\n\n publicAPI.getMaxYBound = function () {\n publicAPI.getBounds();\n return model.bounds[3];\n }; // Get the minimum Z bound\n\n\n publicAPI.getMinZBound = function () {\n publicAPI.getBounds();\n return model.bounds[4];\n }; // Get the maximum Z bound\n\n\n publicAPI.getMaxZBound = function () {\n publicAPI.getBounds();\n return model.bounds[5];\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.property !== null) {\n var time = model.property.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getRedrawMTime = function () {\n var mt = model.mtime;\n\n if (model.mapper !== null) {\n var time = model.mapper.getMTime();\n mt = time > mt ? time : mt;\n\n if (model.mapper.getInput() !== null) {\n // FIXME !!! getInputAlgorithm / getInput\n model.mapper.getInputAlgorithm().update();\n time = model.mapper.getInput().getMTime();\n mt = time > mt ? time : mt;\n }\n }\n\n if (model.property !== null) {\n var _time = model.property.getMTime();\n\n mt = _time > mt ? _time : mt;\n\n if (model.property.getRGBTransferFunction() !== null) {\n _time = model.property.getRGBTransferFunction().getMTime();\n mt = _time > mt ? _time : mt;\n }\n }\n\n return mt;\n };\n\n publicAPI.getSupportsSelection = function () {\n return model.mapper ? model.mapper.getSupportsSelection() : false;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n mapper: null,\n property: null,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp3D.extend(publicAPI, model, initialValues); // vtkTimeStamp\n\n model.boundsMTime = {};\n macro.obj(model.boundsMTime); // Build VTK API\n\n macro.set(publicAPI, model, ['property']);\n macro.setGet(publicAPI, model, ['mapper']);\n macro.getArray(publicAPI, model, ['bounds'], 6); // Object methods\n\n vtkImageSlice(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageSlice'); // ----------------------------------------------------------------------------\n\nvar vtkImageSlice$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageSlice$1 as default, extend, newInstance };\n","import calculateTransform from './calculateTransform';\nimport {\n CPUFallbackEnabledElement,\n CPUFallbackTransform,\n} from '../../../../types';\n\nexport default function (\n enabledElement: CPUFallbackEnabledElement\n): CPUFallbackTransform {\n // Todo: for some reason using the cached transfer after the first call\n // does not give correct transform.\n // if (enabledElement.transform) {\n // return enabledElement.transform;\n // }\n\n return calculateTransform(enabledElement);\n}\n","import getTransform from './getTransform';\n\nimport { Point2, CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Converts a point in the canvas coordinate system to the pixel coordinate system\n * system. This can be used to reset tools' image coordinates after modifications\n * have been made in canvas space (e.g. moving a tool by a few cm, independent of\n * image resolution).\n *\n * @param element - The Cornerstone element within which the input point lies\n * @param pt - The input point in the canvas coordinate system\n *\n * @returns The transformed point in the pixel coordinate system\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n pt: Point2\n): Point2 {\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt);\n}\n","import getTransform from './getTransform';\nimport { CPUFallbackEnabledElement, Point2 } from '../../../../types';\n\n/**\n * Converts a point in the pixel coordinate system to the canvas coordinate system\n * system. This can be used to render using canvas context without having the weird\n * side effects that come from scaling and non square pixels\n *\n * @param {HTMLDivElement} element An HTML Element enabled for Cornerstone\n * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system\n *\n * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system\n * @memberof PixelCoordinateSystem\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n pt: Point2\n): Point2 {\n const transform = getTransform(enabledElement);\n\n return transform.transformPoint(pt);\n}\n","import fitToWindow from './fitToWindow';\nimport getImageSize from './getImageSize';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * This module is responsible for enabling an element to display images with cornerstone\n *\n * @param {HTMLDivElement} element The DOM element enabled for Cornerstone\n * @param {HTMLDivElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\n * @returns {void}\n */\nfunction setCanvasSize(enabledElement: CPUFallbackEnabledElement) {\n const { canvas } = enabledElement;\n const { clientWidth, clientHeight } = canvas;\n\n // Set the canvas to be same resolution as the client.\n if (canvas.width !== clientWidth || canvas.height !== clientHeight) {\n canvas.width = clientWidth;\n canvas.height = clientHeight;\n }\n}\n\n/**\n * Checks if the image of a given enabled element fitted the window\n * before the resize\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {number} oldCanvasWidth The width of the canvas before the resize\n * @param {number} oldCanvasHeight The height of the canvas before the resize\n * @return {Boolean} true if it fitted the windows, false otherwise\n */\nfunction wasFitToWindow(\n enabledElement: CPUFallbackEnabledElement,\n oldCanvasWidth: number,\n oldCanvasHeight: number\n): boolean {\n const scale = enabledElement.viewport.scale;\n const imageSize = getImageSize(\n enabledElement.image,\n enabledElement.viewport.rotation\n );\n const imageWidth = Math.round(imageSize.width * scale);\n const imageHeight = Math.round(imageSize.height * scale);\n const x = enabledElement.viewport.translation.x;\n const y = enabledElement.viewport.translation.y;\n\n return (\n (imageWidth === oldCanvasWidth && imageHeight <= oldCanvasHeight) ||\n (imageWidth <= oldCanvasWidth &&\n imageHeight === oldCanvasHeight &&\n x === 0 &&\n y === 0)\n );\n}\n\n/**\n * Rescale the image relative to the changed size of the canvas\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {number} oldCanvasWidth The width of the canvas before the resize\n * @param {number} oldCanvasHeight The height of the canvas before the resize\n * @return {void}\n */\nfunction relativeRescale(\n enabledElement: CPUFallbackEnabledElement,\n oldCanvasWidth: number,\n oldCanvasHeight: number\n): void {\n const scale = enabledElement.viewport.scale;\n const canvasWidth = enabledElement.canvas.width;\n const canvasHeight = enabledElement.canvas.height;\n const relWidthChange = canvasWidth / oldCanvasWidth;\n const relHeightChange = canvasHeight / oldCanvasHeight;\n const relChange = Math.sqrt(relWidthChange * relHeightChange);\n\n enabledElement.viewport.scale = relChange * scale;\n}\n\n/**\n * Resizes an enabled element and optionally fits the image to window\n *\n * @param {HTMLDivElement} element The DOM element enabled for Cornerstone\n * @param {Boolean} forceFitToWindow true to to force a refit, false to rescale accordingly\n * @returns {void}\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n forceFitToWindow = false\n): void {\n const oldCanvasWidth = enabledElement.canvas.width;\n const oldCanvasHeight = enabledElement.canvas.height;\n\n setCanvasSize(enabledElement);\n\n if (enabledElement.image === undefined) {\n return;\n }\n\n if (\n forceFitToWindow ||\n wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight)\n ) {\n // Fit the image to the window again if it fitted before the resize\n fitToWindow(enabledElement);\n } else {\n // Adapt the scale of a zoomed or panned image relative to the size change\n relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight);\n }\n}\n","import getImageFitScale from './getImageFitScale';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param element - The Cornerstone element to update\n */\nexport default function (enabledElement: CPUFallbackEnabledElement): void {\n const { image } = enabledElement;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = getImageFitScale(\n enabledElement.canvas,\n image,\n enabledElement.viewport.rotation\n ).scaleFactor;\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n}\n","import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport type { vtkImageData as vtkImageDataType } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport _cloneDeep from 'lodash.clonedeep';\nimport vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';\nimport { vec2, vec3, mat4 } from 'gl-matrix';\nimport vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper';\nimport vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport * as metaData from '../metaData';\nimport Viewport from './Viewport';\nimport eventTarget from '../eventTarget';\nimport {\n triggerEvent,\n isEqual,\n invertRgbTransferFunction,\n createSigmoidRGBTransferFunction,\n windowLevel as windowLevelUtil,\n imageIdToURI,\n isImageActor,\n actorIsA,\n} from '../utilities';\nimport {\n Point2,\n Point3,\n VOIRange,\n ICamera,\n IImage,\n IImageData,\n CPUIImageData,\n PTScaling,\n Scaling,\n StackViewportProperties,\n FlipDirection,\n ActorEntry,\n CPUFallbackEnabledElement,\n CPUFallbackColormapData,\n EventTypes,\n IStackViewport,\n VolumeActor,\n Mat3,\n ColormapRegistration,\n IImageCalibration,\n} from '../types';\nimport { ViewportInput } from '../types/IViewport';\nimport drawImageSync from './helpers/cpuFallback/drawImageSync';\nimport { getColormap } from './helpers/cpuFallback/colors/index';\n\nimport { loadAndCacheImage } from '../loaders/imageLoader';\nimport imageLoadPoolManager from '../requestPool/imageLoadPoolManager';\nimport {\n InterpolationType,\n RequestType,\n Events,\n CalibrationTypes,\n VOILUTFunctionType,\n} from '../enums';\nimport canvasToPixel from './helpers/cpuFallback/rendering/canvasToPixel';\nimport pixelToCanvas from './helpers/cpuFallback/rendering/pixelToCanvas';\nimport getDefaultViewport from './helpers/cpuFallback/rendering/getDefaultViewport';\nimport calculateTransform from './helpers/cpuFallback/rendering/calculateTransform';\nimport resize from './helpers/cpuFallback/rendering/resize';\n\nimport resetCamera from './helpers/cpuFallback/rendering/resetCamera';\nimport { Transform } from './helpers/cpuFallback/rendering/transform';\nimport { getConfiguration, getShouldUseCPURendering } from '../init';\nimport {\n StackViewportNewStackEventDetail,\n StackViewportScrollEventDetail,\n VoiModifiedEventDetail,\n} from '../types/EventTypes';\nimport cache from '../cache';\nimport correctShift from './helpers/cpuFallback/rendering/correctShift';\nimport { ImageActor } from '../types/IActor';\nimport createLinearRGBTransferFunction from '../utilities/createLinearRGBTransferFunction';\nimport {\n PixelDataTypedArray,\n ImagePixelModule,\n ImagePlaneModule,\n} from '../types';\nimport ViewportStatus from '../enums/ViewportStatus';\n\nconst EPSILON = 1; // Slice Thickness\n\ninterface ImageDataMetaData {\n bitsAllocated: number;\n numComps: number;\n origin: Point3;\n direction: Mat3;\n dimensions: Point3;\n spacing: Point3;\n numVoxels: number;\n imagePlaneModule: ImagePlaneModule;\n imagePixelModule: ImagePixelModule;\n}\n// TODO This needs to be exposed as its published to consumers.\ntype CalibrationEvent = {\n rowScale?: number;\n columnScale?: number;\n scale: number;\n calibration: IImageCalibration;\n};\n\ntype SetVOIOptions = {\n suppressEvents?: boolean;\n forceRecreateLUTFunction?: boolean;\n voiUpdatedWithSetProperties?: boolean;\n};\n\n/**\n * An object representing a single stack viewport, which is a camera\n * looking into an internal viewport, and an associated target output `canvas`.\n *\n * StackViewports can be rendered using both GPU and a fallback CPU is the GPU\n * is not available (or low performance). Read more about StackViewports in\n * the documentation section of this website.\n */\nclass StackViewport extends Viewport implements IStackViewport {\n private imageIds: Array;\n // current imageIdIndex that is rendered in the viewport\n private currentImageIdIndex: number;\n // the imageIdIndex that is targeted to be loaded with scrolling but has not initiated loading yet\n private targetImageIdIndex: number;\n // setTimeout if the image is debounced to be loaded\n private debouncedTimeout: number;\n\n // Viewport Properties\n private voiRange: VOIRange;\n private voiUpdatedWithSetProperties = false;\n private VOILUTFunction: VOILUTFunctionType;\n //\n private invert = false;\n // The initial invert of the image loaded as opposed to the invert status of the viewport itself (see above).\n private initialInvert = false;\n private interpolationType: InterpolationType;\n\n // Helpers\n private _imageData: vtkImageDataType;\n private cameraFocalPointOnRender: Point3; // we use focalPoint since flip manipulates the position and makes it useless to track\n private stackInvalidated = false; // if true -> new actor is forced to be created for the stack\n private _publishCalibratedEvent = false;\n private _calibrationEvent: CalibrationEvent;\n private _cpuFallbackEnabledElement?: CPUFallbackEnabledElement;\n // CPU fallback\n private useCPURendering: boolean;\n // Since WebGL natively supports 8 bit int and Float32, we should check if\n // extra configuration flags has been set to use native data type\n // which would save a lot of memory and speed up rendering but it is not\n // yet widely supported in all hardwares. This feature can be turned on\n // by setting useNorm16Texture or preferSizeOverAccuracy in the configuration\n private useNativeDataType = false;\n private cpuImagePixelData: PixelDataTypedArray;\n private cpuRenderingInvalidated: boolean;\n private csImage: IImage;\n\n // TODO: These should not be here and will be nuked\n public modality: string; // this is needed for tools\n public scaling: Scaling;\n\n // Camera properties\n private initialViewUp: Point3;\n\n /**\n * Constructor for the StackViewport class\n * @param props - ViewportInput\n */\n constructor(props: ViewportInput) {\n super(props);\n this.scaling = {};\n this.modality = null;\n this.useCPURendering = getShouldUseCPURendering();\n this.useNativeDataType = this._shouldUseNativeDataType();\n this._configureRenderingPipeline();\n\n this.useCPURendering\n ? this._resetCPUFallbackElement()\n : this._resetGPUViewport();\n\n this.imageIds = [];\n this.currentImageIdIndex = 0;\n this.targetImageIdIndex = 0;\n this.cameraFocalPointOnRender = [0, 0, 0];\n this.resetCamera();\n\n this.initializeElementDisabledHandler();\n }\n\n public setUseCPURendering(value: boolean) {\n this.useCPURendering = value;\n this._configureRenderingPipeline();\n }\n\n static get useCustomRenderingPipeline(): boolean {\n return getShouldUseCPURendering();\n }\n\n public updateRenderingPipeline = () => {\n this._configureRenderingPipeline();\n };\n\n private _configureRenderingPipeline() {\n this.useNativeDataType = this._shouldUseNativeDataType();\n this.useCPURendering = getShouldUseCPURendering();\n\n for (const [funcName, functions] of Object.entries(\n this.renderingPipelineFunctions\n )) {\n this[funcName] = this.useCPURendering ? functions.cpu : functions.gpu;\n }\n\n this.useCPURendering\n ? this._resetCPUFallbackElement()\n : this._resetGPUViewport();\n }\n\n private _resetCPUFallbackElement() {\n this._cpuFallbackEnabledElement = {\n canvas: this.canvas,\n renderingTools: {},\n transform: new Transform(),\n viewport: { rotation: 0 },\n };\n }\n\n private _resetGPUViewport() {\n const renderer = this.getRenderer();\n const camera = vtkCamera.newInstance();\n renderer.setActiveCamera(camera);\n\n const viewPlaneNormal = [0, 0, -1];\n this.initialViewUp = [0, -1, 0];\n\n camera.setDirectionOfProjection(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n camera.setViewUp(...this.initialViewUp);\n camera.setParallelProjection(true);\n camera.setThicknessFromFocalPoint(0.1);\n camera.setFreezeFocalPoint(true);\n }\n\n /**\n * Returns the image and its properties that is being shown inside the\n * stack viewport. It returns, the image dimensions, image direction,\n * image scalar data, vtkImageData object, metadata, and scaling (e.g., PET suvbw)\n *\n * @returns IImageData: dimensions, direction, scalarData, vtkImageData, metadata, scaling\n */\n public getImageData: () => IImageData | CPUIImageData;\n\n /**\n * Sets the colormap for the current viewport.\n * @param colormap - The colormap data to use.\n */\n public setColormap: (\n colormap: CPUFallbackColormapData | ColormapRegistration\n ) => void;\n\n /**\n * If the user has selected CPU rendering, return the CPU camera, otherwise\n * return the default camera\n * @returns The camera object.\n */\n public getCamera: () => ICamera;\n\n /**\n * Set the camera based on the provided camera object.\n * @param cameraInterface - The camera interface that will be used to\n * render the scene.\n */\n public setCamera: (\n cameraInterface: ICamera,\n storeAsInitialCamera?: boolean\n ) => void;\n\n public getRotation: () => number;\n\n /**\n * It sets the colormap to the default colormap.\n */\n public unsetColormap: () => void;\n\n /**\n * Centers Pan and resets the zoom for stack viewport.\n */\n public resetCamera: (resetPan?: boolean, resetZoom?: boolean) => boolean;\n\n /**\n * canvasToWorld Returns the world coordinates of the given `canvasPos`\n * projected onto the plane defined by the `Viewport`'s camera.\n *\n * @param canvasPos - The position in canvas coordinates.\n * @returns The corresponding world coordinates.\n * @public\n */\n public canvasToWorld: (canvasPos: Point2) => Point3;\n\n /**\n * Returns the canvas coordinates of the given `worldPos`\n * projected onto the `Viewport`'s `canvas`.\n *\n * @param worldPos - The position in world coordinates.\n * @returns The corresponding canvas coordinates.\n * @public\n */\n public worldToCanvas: (worldPos: Point3) => Point2;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, returns the `vtkRenderer` responsible for rendering the `Viewport`.\n *\n * @returns The `vtkRenderer` for the `Viewport`.\n */\n public getRenderer: () => any;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, return the default\n * actor which is the first actor in the renderer.\n * @returns An actor entry.\n */\n public getDefaultActor: () => ActorEntry;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, return the actors in the viewport\n * @returns An array of ActorEntry objects.\n */\n public getActors: () => Array;\n /**\n * If the renderer is CPU based, throw an error. Otherwise, it returns the actor entry for the given actor UID.\n * @param actorUID - The unique ID of the actor you want to get.\n * @returns An ActorEntry object.\n */\n public getActor: (actorUID: string) => ActorEntry;\n\n /**\n * If the renderer is CPU-based, throw an error; otherwise, set the\n * actors in the viewport.\n * @param actors - An array of ActorEntry objects.\n */\n public setActors: (actors: Array) => void;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, add a list of actors to the viewport\n * @param actors - An array of ActorEntry objects.\n */\n public addActors: (actors: Array) => void;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, add the\n * actor to the viewport\n * @param actorEntry - The ActorEntry object that was created by the\n * user.\n */\n public addActor: (actorEntry: ActorEntry) => void;\n\n /**\n * It throws an error if the renderer is CPU based. Otherwise, it removes the actors from the viewport.\n */\n public removeAllActors: () => void;\n\n private setVOI: (voiRange: VOIRange, options?: SetVOIOptions) => void;\n\n private setInterpolationType: (interpolationType: InterpolationType) => void;\n\n private setInvertColor: (invert: boolean) => void;\n\n private initializeElementDisabledHandler() {\n eventTarget.addEventListener(\n Events.ELEMENT_DISABLED,\n function elementDisabledHandler() {\n clearTimeout(this.debouncedTimeout);\n\n eventTarget.removeEventListener(\n Events.ELEMENT_DISABLED,\n elementDisabledHandler\n );\n }\n );\n }\n\n /**\n * Resizes the viewport - only used in CPU fallback for StackViewport. The\n * GPU resizing happens inside the RenderingEngine.\n */\n public resize = (): void => {\n // GPU viewport resize is handled inside the RenderingEngine\n if (this.useCPURendering) {\n this._resizeCPU();\n }\n };\n\n private _resizeCPU = (): void => {\n if (this._cpuFallbackEnabledElement.viewport) {\n resize(this._cpuFallbackEnabledElement);\n }\n };\n\n private getImageDataGPU(): IImageData | undefined {\n const defaultActor = this.getDefaultActor();\n\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n\n const { actor } = defaultActor;\n const vtkImageData = actor.getMapper().getInputData();\n return {\n dimensions: vtkImageData.getDimensions(),\n spacing: vtkImageData.getSpacing(),\n origin: vtkImageData.getOrigin(),\n direction: vtkImageData.getDirection(),\n scalarData: vtkImageData.getPointData().getScalars().getData(),\n imageData: actor.getMapper().getInputData(),\n metadata: { Modality: this.modality },\n scaling: this.scaling,\n hasPixelSpacing: this.hasPixelSpacing,\n calibration: this.calibration,\n preScale: {\n ...this.csImage.preScale,\n },\n };\n }\n\n private getImageDataCPU(): CPUIImageData | undefined {\n const { metadata } = this._cpuFallbackEnabledElement;\n\n const spacing = metadata.spacing;\n\n return {\n dimensions: metadata.dimensions,\n spacing,\n origin: metadata.origin,\n direction: metadata.direction,\n metadata: { Modality: this.modality },\n scaling: this.scaling,\n imageData: {\n getDirection: () => metadata.direction,\n getDimensions: () => metadata.dimensions,\n getScalarData: () => this.cpuImagePixelData,\n getSpacing: () => spacing,\n worldToIndex: (point: Point3) => {\n const canvasPoint = this.worldToCanvasCPU(point);\n const pixelCoord = canvasToPixel(\n this._cpuFallbackEnabledElement,\n canvasPoint\n );\n return [pixelCoord[0], pixelCoord[1], 0];\n },\n indexToWorld: (point: Point3) => {\n const canvasPoint = pixelToCanvas(this._cpuFallbackEnabledElement, [\n point[0],\n point[1],\n ]);\n return this.canvasToWorldCPU(canvasPoint);\n },\n },\n scalarData: this.cpuImagePixelData,\n hasPixelSpacing: this.hasPixelSpacing,\n calibration: this.calibration,\n preScale: {\n ...this.csImage.preScale,\n },\n };\n }\n\n /**\n * Returns the frame of reference UID, if the image doesn't have imagePlaneModule\n * metadata, it returns undefined, otherwise, frameOfReferenceUID is returned.\n * @returns frameOfReferenceUID : string representing frame of reference id\n */\n public getFrameOfReferenceUID = (): string | undefined => {\n // Get the current image that is displayed in the viewport\n const imageId = this.getCurrentImageId();\n\n if (!imageId) {\n return;\n }\n\n // Use the metadata provider to grab its imagePlaneModule metadata\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n // If nothing exists, return undefined\n if (!imagePlaneModule) {\n return;\n }\n\n // Otherwise, provide the FrameOfReferenceUID so we can map\n // annotations made on VolumeViewports back to StackViewports\n // and vice versa\n return imagePlaneModule.frameOfReferenceUID;\n };\n\n /**\n * Returns the raw/loaded image being shown inside the stack viewport.\n */\n public getCornerstoneImage = (): IImage => {\n return this.csImage;\n };\n\n /**\n * Creates imageMapper based on the provided vtkImageData and also creates\n * the imageSliceActor and connects it to the imageMapper.\n * For color stack images, it sets the independent components to be false which\n * is required in vtk.\n *\n * @param imageData - vtkImageData for the viewport\n * @returns actor vtkActor\n */\n private createActorMapper = (imageData) => {\n const mapper = vtkImageMapper.newInstance();\n mapper.setInputData(imageData);\n\n const actor = vtkImageSlice.newInstance();\n\n actor.setMapper(mapper);\n\n const { preferSizeOverAccuracy } = getConfiguration().rendering;\n\n if (preferSizeOverAccuracy) {\n // @ts-ignore for now until vtk is updated\n mapper.setPreferSizeOverAccuracy(true);\n }\n\n if (imageData.getPointData().getNumberOfComponents() > 1) {\n actor.getProperty().setIndependentComponents(false);\n }\n\n return actor;\n };\n\n /**\n * Retrieves the metadata from the metadata provider, and optionally adds the\n * scaling to the viewport if modality is PET and scaling metadata is provided.\n *\n * @param imageId - a string representing the imageId for the image\n * @returns imagePlaneModule and imagePixelModule containing the metadata for the image\n */\n private buildMetadata(image: IImage) {\n const imageId = image.imageId;\n\n const {\n pixelRepresentation,\n bitsAllocated,\n bitsStored,\n highBit,\n photometricInterpretation,\n samplesPerPixel,\n } = metaData.get('imagePixelModule', imageId);\n\n // we can grab the window center and width from the image object\n // since it the loader already has used the metadata provider\n // to get the values\n const { windowWidth, windowCenter, voiLUTFunction } = image;\n\n const { modality } = metaData.get('generalSeriesModule', imageId);\n const imageIdScalingFactor = metaData.get('scalingModule', imageId);\n\n if (modality === 'PT' && imageIdScalingFactor) {\n this._addScalingToViewport(imageIdScalingFactor);\n }\n\n this.modality = modality;\n const voiLUTFunctionEnum = this._getValidVOILUTFunction(voiLUTFunction);\n this.VOILUTFunction = voiLUTFunctionEnum;\n\n this.calibration = null;\n let imagePlaneModule = this._getImagePlaneModule(imageId);\n\n if (!this.useCPURendering) {\n imagePlaneModule = this.calibrateIfNecessary(imageId, imagePlaneModule);\n }\n\n return {\n imagePlaneModule,\n imagePixelModule: {\n bitsAllocated,\n bitsStored,\n samplesPerPixel,\n highBit,\n photometricInterpretation,\n pixelRepresentation,\n windowWidth,\n windowCenter,\n modality,\n voiLUTFunction: voiLUTFunctionEnum,\n },\n };\n }\n\n /**\n * Checks the metadataProviders to see if a calibratedPixelSpacing is\n * given. If so, checks the actor to see if it needs to be modified, and\n * set the flags for imageCalibration if a new actor needs to be created\n *\n * @param imageId - imageId\n * @param imagePlaneModule - imagePlaneModule\n * @returns modified imagePlaneModule with the calibrated spacings\n */\n private calibrateIfNecessary(imageId, imagePlaneModule) {\n const calibration = metaData.get('calibratedPixelSpacing', imageId);\n const isUpdated = this.calibration !== calibration;\n const { scale } = calibration || {};\n this.hasPixelSpacing = scale > 0 || imagePlaneModule.rowPixelSpacing > 0;\n imagePlaneModule.calibration = calibration;\n\n if (!isUpdated) {\n return imagePlaneModule;\n }\n\n this.calibration = calibration;\n this._publishCalibratedEvent = true;\n this._calibrationEvent = {\n scale,\n calibration,\n };\n\n return imagePlaneModule;\n }\n\n /**\n * Sets the properties for the viewport on the default actor. Properties include\n * setting the VOI, inverting the colors and setting the interpolation type, rotation\n * @param voiRange - Sets the lower and upper voi\n * @param invert - Inverts the colors\n * @param interpolationType - Changes the interpolation type (1:linear, 0: nearest)\n * @param rotation - image rotation in degrees\n */\n public setProperties(\n {\n voiRange,\n VOILUTFunction,\n invert,\n interpolationType,\n rotation,\n }: StackViewportProperties = {},\n suppressEvents = false\n ): void {\n this.viewportStatus = this.csImage\n ? ViewportStatus.PRE_RENDER\n : ViewportStatus.LOADING;\n // if voi is not applied for the first time, run the setVOI function\n // which will apply the default voi based on the range\n if (typeof voiRange !== 'undefined') {\n const voiUpdatedWithSetProperties = true;\n this.setVOI(voiRange, { suppressEvents, voiUpdatedWithSetProperties });\n }\n\n if (typeof VOILUTFunction !== 'undefined') {\n this.setVOILUTFunction(VOILUTFunction, suppressEvents);\n }\n\n if (typeof invert !== 'undefined') {\n this.setInvertColor(invert);\n }\n\n if (typeof interpolationType !== 'undefined') {\n this.setInterpolationType(interpolationType);\n }\n\n if (typeof rotation !== 'undefined') {\n // TODO: check with VTK about rounding errors here.\n if (this.getRotation() !== rotation) {\n this.setRotation(rotation);\n }\n }\n }\n\n /**\n * Retrieve the viewport properties\n * @returns viewport properties including voi, invert, interpolation type, rotation, flip\n */\n public getProperties = (): StackViewportProperties => {\n const {\n voiRange,\n VOILUTFunction,\n interpolationType,\n invert,\n voiUpdatedWithSetProperties,\n } = this;\n const rotation = this.getRotation();\n\n return {\n voiRange,\n VOILUTFunction,\n interpolationType,\n invert,\n rotation,\n isComputedVOI: !voiUpdatedWithSetProperties,\n };\n };\n\n /**\n * Reset the viewport properties to the default values\n */\n public resetProperties(): void {\n this.cpuRenderingInvalidated = true;\n this.voiUpdatedWithSetProperties = false;\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n this.fillWithBackgroundColor();\n\n if (this.useCPURendering) {\n this._cpuFallbackEnabledElement.renderingTools = {};\n }\n\n this._resetProperties();\n\n this.render();\n }\n\n private _resetProperties() {\n let voiRange;\n if (this._isCurrentImagePTPrescaled()) {\n // if not set via setProperties; if it is a PT image and is already prescaled,\n // use the default range for PT\n voiRange = this._getDefaultPTPrescaledVOIRange();\n } else {\n // if not set via setProperties; if it is not a PT image or is not prescaled,\n // use the voiRange for the current image from its metadata if found\n // otherwise, use the cached voiRange\n voiRange = this._getVOIRangeForCurrentImage();\n }\n\n this.setVOI(voiRange);\n\n if (this.getRotation() !== 0) {\n this.setRotation(0);\n }\n this.setInterpolationType(InterpolationType.LINEAR);\n this.setInvertColor(this.initialInvert);\n }\n\n private _setPropertiesFromCache(): void {\n const { interpolationType, invert } = this;\n\n let voiRange;\n if (this.voiUpdatedWithSetProperties) {\n // use the cached voiRange if the voiRange is locked (if the user has\n // manually set the voi with tools or setProperties api)\n voiRange = this.voiRange;\n } else if (this._isCurrentImagePTPrescaled()) {\n // if not set via setProperties; if it is a PT image and is already prescaled,\n // use the default range for PT\n voiRange = this._getDefaultPTPrescaledVOIRange();\n } else {\n // if not set via setProperties; if it is not a PT image or is not prescaled,\n // use the voiRange for the current image from its metadata if found\n // otherwise, use the cached voiRange\n voiRange = this._getVOIRangeForCurrentImage() ?? this.voiRange;\n }\n\n this.setVOI(voiRange);\n this.setInterpolationType(interpolationType);\n this.setInvertColor(invert);\n }\n\n private getCameraCPU(): Partial {\n const { metadata, viewport } = this._cpuFallbackEnabledElement;\n const { direction } = metadata;\n\n // focalPoint and position of CPU camera is just a placeholder since\n // tools need focalPoint to be defined\n const viewPlaneNormal = direction.slice(6, 9).map((x) => -x) as Point3;\n let viewUp = direction.slice(3, 6).map((x) => -x) as Point3;\n\n // If camera is rotated, we need the correct rotated viewUp along the\n // viewPlaneNormal vector\n if (viewport.rotation) {\n const rotationMatrix = mat4.fromRotation(\n mat4.create(),\n (viewport.rotation * Math.PI) / 180,\n viewPlaneNormal\n );\n viewUp = vec3.transformMat4(\n vec3.create(),\n viewUp,\n rotationMatrix\n ) as Point3;\n }\n\n const canvasCenter: Point2 = [\n this.element.clientWidth / 2,\n this.element.clientHeight / 2,\n ];\n\n // Focal point is the center of the canvas in world coordinate by construction\n const canvasCenterWorld = this.canvasToWorld(canvasCenter);\n\n // parallel scale is half of the viewport height in the world units (mm)\n\n const topLeftWorld = this.canvasToWorld([0, 0]);\n const bottomLeftWorld = this.canvasToWorld([0, this.element.clientHeight]);\n\n const parallelScale = vec3.distance(topLeftWorld, bottomLeftWorld) / 2;\n\n return {\n parallelProjection: true,\n focalPoint: canvasCenterWorld,\n position: [0, 0, 0],\n parallelScale,\n scale: viewport.scale,\n viewPlaneNormal: [\n viewPlaneNormal[0],\n viewPlaneNormal[1],\n viewPlaneNormal[2],\n ],\n viewUp: [viewUp[0], viewUp[1], viewUp[2]],\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n };\n }\n\n private setCameraCPU(cameraInterface: ICamera): void {\n const { viewport, image } = this._cpuFallbackEnabledElement;\n const previousCamera = this.getCameraCPU();\n\n const { focalPoint, parallelScale, scale, flipHorizontal, flipVertical } =\n cameraInterface;\n\n const { clientHeight } = this.element;\n\n if (focalPoint) {\n const focalPointCanvas = this.worldToCanvasCPU(focalPoint);\n const focalPointPixel = canvasToPixel(\n this._cpuFallbackEnabledElement,\n focalPointCanvas\n );\n\n const prevFocalPointCanvas = this.worldToCanvasCPU(\n previousCamera.focalPoint\n );\n const prevFocalPointPixel = canvasToPixel(\n this._cpuFallbackEnabledElement,\n prevFocalPointCanvas\n );\n\n const deltaPixel = vec2.create();\n vec2.subtract(\n deltaPixel,\n vec2.fromValues(focalPointPixel[0], focalPointPixel[1]),\n vec2.fromValues(prevFocalPointPixel[0], prevFocalPointPixel[1])\n );\n\n const shift = correctShift(\n { x: deltaPixel[0], y: deltaPixel[1] },\n viewport\n );\n\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n }\n\n if (parallelScale) {\n // We need to convert he parallelScale which has a physical meaning to\n // camera scale factor (since CPU works with scale). Since parallelScale represents\n // half of the height of the viewport in the world unit (mm), we can use that\n // to compute the scale factor which is the ratio of the viewport height in pixels\n // to the current rendered image height.\n const { rowPixelSpacing } = image;\n const scale = (clientHeight * rowPixelSpacing * 0.5) / parallelScale;\n\n viewport.scale = scale;\n viewport.parallelScale = parallelScale;\n }\n\n if (scale) {\n const { rowPixelSpacing } = image;\n viewport.scale = scale;\n viewport.parallelScale = (clientHeight * rowPixelSpacing * 0.5) / scale;\n }\n\n if (flipHorizontal !== undefined || flipVertical !== undefined) {\n this.setFlipCPU({ flipHorizontal, flipVertical });\n }\n\n // re-calculate the transforms\n this._cpuFallbackEnabledElement.transform = calculateTransform(\n this._cpuFallbackEnabledElement\n );\n\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera: this.getCamera(),\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n rotation: this.getRotation(),\n };\n\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n\n private setFlipCPU({ flipHorizontal, flipVertical }: FlipDirection): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n\n if (flipHorizontal !== undefined) {\n viewport.hflip = flipHorizontal;\n this.flipHorizontal = viewport.hflip;\n }\n\n if (flipVertical !== undefined) {\n viewport.vflip = flipVertical;\n this.flipVertical = viewport.vflip;\n }\n }\n\n private getRotationCPU = (): number => {\n const { viewport } = this._cpuFallbackEnabledElement;\n return viewport.rotation;\n };\n\n /**\n * Gets the rotation resulting from the value set in setRotation AND taking into\n * account any flips that occurred subsequently.\n *\n * @returns the rotation resulting from the value set in setRotation AND taking into\n * account any flips that occurred subsequently.\n */\n private getRotationGPU = (): number => {\n const {\n viewUp: currentViewUp,\n viewPlaneNormal,\n flipVertical,\n } = this.getCamera();\n\n // The initial view up vector without any rotation, but incorporating vertical flip.\n const initialViewUp = flipVertical\n ? vec3.negate(vec3.create(), this.initialViewUp)\n : this.initialViewUp;\n\n // The angle between the initial and current view up vectors.\n // TODO: check with VTK about rounding errors here.\n const initialToCurrentViewUpAngle =\n (vec3.angle(initialViewUp, currentViewUp) * 180) / Math.PI;\n\n // Now determine if initialToCurrentViewUpAngle is positive or negative by comparing\n // the direction of the initial/current view up cross product with the current\n // viewPlaneNormal.\n\n const initialToCurrentViewUpCross = vec3.cross(\n vec3.create(),\n initialViewUp,\n currentViewUp\n );\n\n // The sign of the dot product of the start/end view up cross product and\n // the viewPlaneNormal indicates a positive or negative rotation respectively.\n const normalDot = vec3.dot(initialToCurrentViewUpCross, viewPlaneNormal);\n\n return normalDot >= 0\n ? initialToCurrentViewUpAngle\n : (360 - initialToCurrentViewUpAngle) % 360;\n };\n\n private setRotation(rotation: number): void {\n const previousCamera = this.getCamera();\n\n this.useCPURendering\n ? this.setRotationCPU(rotation)\n : this.setRotationGPU(rotation);\n\n // New camera after rotation\n const camera = this.getCamera();\n\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n rotation,\n };\n\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n\n private setVOILUTFunction(\n voiLUTFunction: VOILUTFunctionType,\n suppressEvents?: boolean\n ): void {\n if (this.useCPURendering) {\n throw new Error('VOI LUT function is not supported in CPU rendering');\n }\n\n // make sure the VOI LUT function is valid in the VOILUTFunctionType which is enum\n const newVOILUTFunction = this._getValidVOILUTFunction(voiLUTFunction);\n\n let forceRecreateLUTFunction = false;\n if (\n this.VOILUTFunction !== VOILUTFunctionType.LINEAR &&\n newVOILUTFunction === VOILUTFunctionType.LINEAR\n ) {\n forceRecreateLUTFunction = true;\n }\n\n this.VOILUTFunction = newVOILUTFunction;\n\n const { voiRange } = this.getProperties();\n this.setVOI(voiRange, { suppressEvents, forceRecreateLUTFunction });\n }\n\n private setRotationCPU(rotation: number): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n viewport.rotation = rotation;\n }\n\n private setRotationGPU(rotation: number): void {\n const { flipVertical } = this.getCamera();\n\n // Moving back to zero rotation, for new scrolled slice rotation is 0 after camera reset\n const initialViewUp = flipVertical\n ? vec3.negate(vec3.create(), this.initialViewUp)\n : this.initialViewUp;\n\n this.setCamera({\n viewUp: initialViewUp as Point3,\n });\n\n // rotating camera to the new value\n this.getVtkActiveCamera().roll(-rotation);\n }\n\n private setInterpolationTypeGPU(interpolationType: InterpolationType): void {\n const defaultActor = this.getDefaultActor();\n\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n const { actor } = defaultActor;\n const volumeProperty = actor.getProperty();\n\n // @ts-ignore\n volumeProperty.setInterpolationType(interpolationType);\n this.interpolationType = interpolationType;\n }\n\n private setInterpolationTypeCPU(interpolationType: InterpolationType): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n\n viewport.pixelReplication =\n interpolationType === InterpolationType.LINEAR ? false : true;\n\n this.interpolationType = interpolationType;\n }\n\n private setInvertColorCPU(invert: boolean): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n\n if (!viewport) {\n return;\n }\n\n viewport.invert = invert;\n this.invert = invert;\n }\n\n private setInvertColorGPU(invert: boolean): void {\n const defaultActor = this.getDefaultActor();\n\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n\n // Duplicated logic to make sure typescript stops complaining\n // about vtkActor not having the correct property\n if (actorIsA(defaultActor, 'vtkVolume')) {\n const volumeActor = defaultActor.actor as VolumeActor;\n const tfunc = volumeActor.getProperty().getRGBTransferFunction(0);\n\n if ((!this.invert && invert) || (this.invert && !invert)) {\n invertRgbTransferFunction(tfunc);\n }\n this.invert = invert;\n } else if (actorIsA(defaultActor, 'vtkImageSlice')) {\n const imageSliceActor = defaultActor.actor as vtkImageSlice;\n const tfunc = imageSliceActor.getProperty().getRGBTransferFunction(0);\n\n if ((!this.invert && invert) || (this.invert && !invert)) {\n invertRgbTransferFunction(tfunc);\n }\n this.invert = invert;\n }\n }\n\n private setVOICPU(voiRange: VOIRange, options: SetVOIOptions = {}): void {\n const { suppressEvents = false } = options;\n // TODO: Account for VOILUTFunction\n const { viewport, image } = this._cpuFallbackEnabledElement;\n\n if (!viewport || !image) {\n return;\n }\n\n if (typeof voiRange === 'undefined') {\n const { windowWidth: ww, windowCenter: wc } = image;\n\n const wwToUse = Array.isArray(ww) ? ww[0] : ww;\n const wcToUse = Array.isArray(wc) ? wc[0] : wc;\n viewport.voi = {\n windowWidth: wwToUse,\n windowCenter: wcToUse,\n };\n\n const { lower, upper } = windowLevelUtil.toLowHighRange(wwToUse, wcToUse);\n voiRange = { lower, upper };\n } else {\n const { lower, upper } = voiRange;\n const { windowCenter, windowWidth } = windowLevelUtil.toWindowLevel(\n lower,\n upper\n );\n\n if (!viewport.voi) {\n viewport.voi = {\n windowWidth: 0,\n windowCenter: 0,\n };\n }\n\n viewport.voi.windowWidth = windowWidth;\n viewport.voi.windowCenter = windowCenter;\n }\n\n this.voiRange = voiRange;\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRange,\n };\n\n if (!suppressEvents) {\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n }\n\n private setVOIGPU(voiRange: VOIRange, options: SetVOIOptions = {}): void {\n const {\n suppressEvents = false,\n forceRecreateLUTFunction = false,\n voiUpdatedWithSetProperties = false,\n } = options;\n\n if (\n voiRange &&\n this.voiRange &&\n this.voiRange.lower === voiRange.lower &&\n this.voiRange.upper === voiRange.upper &&\n !forceRecreateLUTFunction &&\n !this.stackInvalidated\n ) {\n return;\n }\n\n const defaultActor = this.getDefaultActor();\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n const imageActor = defaultActor.actor as ImageActor;\n\n let voiRangeToUse = voiRange;\n\n if (typeof voiRangeToUse === 'undefined') {\n const imageData = imageActor.getMapper().getInputData();\n const range = imageData.getPointData().getScalars().getRange();\n const maxVoiRange = { lower: range[0], upper: range[1] };\n voiRangeToUse = maxVoiRange;\n }\n\n // scaling logic here\n // https://github.com/Kitware/vtk-js/blob/master/Sources/Rendering/OpenGL/ImageMapper/index.js#L540-L549\n imageActor.getProperty().setUseLookupTableScalarRange(true);\n\n let transferFunction = imageActor.getProperty().getRGBTransferFunction(0);\n\n const isSigmoidTFun =\n this.VOILUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID;\n\n // use the old cfun if it exists for linear case\n if (isSigmoidTFun || !transferFunction || forceRecreateLUTFunction) {\n const transferFunctionCreator = isSigmoidTFun\n ? createSigmoidRGBTransferFunction\n : createLinearRGBTransferFunction;\n\n transferFunction = transferFunctionCreator(voiRangeToUse);\n\n if (this.invert) {\n invertRgbTransferFunction(transferFunction);\n }\n\n imageActor.getProperty().setRGBTransferFunction(0, transferFunction);\n }\n\n if (!isSigmoidTFun) {\n // @ts-ignore vtk type error\n transferFunction.setRange(voiRangeToUse.lower, voiRangeToUse.upper);\n }\n\n this.voiRange = voiRangeToUse;\n\n // if voiRange is set by setProperties we need to lock it if it is not locked already\n if (!this.voiUpdatedWithSetProperties) {\n this.voiUpdatedWithSetProperties = voiUpdatedWithSetProperties;\n }\n\n if (suppressEvents) {\n return;\n }\n\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRangeToUse,\n VOILUTFunction: this.VOILUTFunction,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n\n /**\n * Adds scaling parameters to the viewport to be used along all slices\n *\n * @param imageIdScalingFactor - suvbw, suvlbm, suvbsa\n */\n private _addScalingToViewport(imageIdScalingFactor) {\n if (this.scaling.PT) {\n return;\n }\n\n // if don't exist\n // These ratios are constant across all frames, so only need one.\n const { suvbw, suvlbm, suvbsa } = imageIdScalingFactor;\n\n const ptScaling = {};\n\n if (suvlbm) {\n ptScaling.suvbwToSuvlbm = suvlbm / suvbw;\n }\n\n if (suvbsa) {\n ptScaling.suvbwToSuvbsa = suvbsa / suvbw;\n }\n\n this.scaling.PT = ptScaling;\n }\n\n /**\n * Calculates number of components based on the dicom metadata\n *\n * @param photometricInterpretation - string dicom tag\n * @returns number representing number of components\n */\n private _getNumCompsFromPhotometricInterpretation(\n photometricInterpretation: string\n ): number {\n // TODO: this function will need to have more logic later\n // see http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.2\n let numberOfComponents = 1;\n if (\n photometricInterpretation === 'RGB' ||\n photometricInterpretation.indexOf('YBR') !== -1 ||\n photometricInterpretation === 'PALETTE COLOR'\n ) {\n numberOfComponents = 3;\n }\n\n return numberOfComponents;\n }\n\n /**\n * Calculates image metadata based on the image object. It calculates normal\n * axis for the images, and output image metadata\n *\n * @param image - stack image containing cornerstone image\n * @returns image metadata: bitsAllocated, number of components, origin,\n * direction, dimensions, spacing, number of voxels.\n */\n private _getImageDataMetadata(image: IImage): ImageDataMetaData {\n // TODO: Creating a single image should probably not require a metadata provider.\n // We should define the minimum we need to display an image and it should live on\n // the Image object itself. Additional stuff (e.g. pixel spacing, direction, origin, etc)\n // should be optional and used if provided through a metadata provider.\n\n const { imagePlaneModule, imagePixelModule } = this.buildMetadata(image);\n\n let rowCosines, columnCosines;\n\n rowCosines = imagePlaneModule.rowCosines;\n columnCosines = imagePlaneModule.columnCosines;\n\n // if null or undefined\n if (rowCosines == null || columnCosines == null) {\n rowCosines = [1, 0, 0];\n columnCosines = [0, 1, 0];\n }\n\n const rowCosineVec = vec3.fromValues(\n rowCosines[0],\n rowCosines[1],\n rowCosines[2]\n );\n const colCosineVec = vec3.fromValues(\n columnCosines[0],\n columnCosines[1],\n columnCosines[2]\n );\n const scanAxisNormal = vec3.create();\n vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec);\n\n let origin = imagePlaneModule.imagePositionPatient;\n // if null or undefined\n if (origin == null) {\n origin = [0, 0, 0];\n }\n\n const xSpacing =\n imagePlaneModule.columnPixelSpacing || image.columnPixelSpacing;\n const ySpacing = imagePlaneModule.rowPixelSpacing || image.rowPixelSpacing;\n const xVoxels = image.columns;\n const yVoxels = image.rows;\n\n // Note: For rendering purposes, we use the EPSILON as the z spacing.\n // This is purely for internal implementation logic since we are still\n // technically rendering 3D objects with vtk.js, but the abstracted intention\n // of the stack viewport is to render 2D images\n const zSpacing = EPSILON;\n const zVoxels = 1;\n\n const numComps =\n image.numComps ||\n this._getNumCompsFromPhotometricInterpretation(\n imagePixelModule.photometricInterpretation\n );\n\n return {\n bitsAllocated: imagePixelModule.bitsAllocated,\n numComps,\n origin,\n direction: [...rowCosineVec, ...colCosineVec, ...scanAxisNormal] as Mat3,\n dimensions: [xVoxels, yVoxels, zVoxels],\n spacing: [xSpacing, ySpacing, zSpacing],\n numVoxels: xVoxels * yVoxels * zVoxels,\n imagePlaneModule,\n imagePixelModule,\n };\n }\n\n /**\n * Converts the image direction to camera viewUp and viewplaneNormal\n *\n * @param imageDataDirection - vtkImageData direction\n * @returns viewplane normal and viewUp of the camera\n */\n private _getCameraOrientation(imageDataDirection: Mat3): {\n viewPlaneNormal: Point3;\n viewUp: Point3;\n } {\n const viewPlaneNormal = imageDataDirection.slice(6, 9).map((x) => -x);\n\n const viewUp = imageDataDirection.slice(3, 6).map((x) => -x);\n return {\n viewPlaneNormal: [\n viewPlaneNormal[0],\n viewPlaneNormal[1],\n viewPlaneNormal[2],\n ],\n viewUp: [viewUp[0], viewUp[1], viewUp[2]],\n };\n }\n\n /**\n * Creates vtkImagedata based on the image object, it creates\n * and empty scalar data for the image based on the metadata\n * tags (e.g., bitsAllocated)\n *\n * @param image - cornerstone Image object\n */\n private _createVTKImageData({\n origin,\n direction,\n dimensions,\n spacing,\n numComps,\n pixelArray,\n }): void {\n const values = new pixelArray.constructor(pixelArray.length);\n\n // Todo: I guess nothing should be done for use16bit?\n const scalarArray = vtkDataArray.newInstance({\n name: 'Pixels',\n numberOfComponents: numComps,\n values: values,\n });\n\n this._imageData = vtkImageData.newInstance();\n\n this._imageData.setDimensions(dimensions);\n this._imageData.setSpacing(spacing);\n this._imageData.setDirection(direction);\n this._imageData.setOrigin(origin);\n this._imageData.getPointData().setScalars(scalarArray);\n }\n\n /**\n * Sets the imageIds to be visualized inside the stack viewport. It accepts\n * list of imageIds, the index of the first imageId to be viewed. It is a\n * asynchronous function that returns a promise resolving to imageId being\n * displayed in the stack viewport.\n *\n *\n * @param imageIds - list of strings, that represents list of image Ids\n * @param currentImageIdIndex - number representing the index of the initial image to be displayed\n */\n public async setStack(\n imageIds: Array,\n currentImageIdIndex = 0\n ): Promise {\n this._throwIfDestroyed();\n\n this.imageIds = imageIds;\n this.currentImageIdIndex = currentImageIdIndex;\n this.targetImageIdIndex = currentImageIdIndex;\n\n // reset the stack\n this.stackInvalidated = true;\n this.flipVertical = false;\n this.flipHorizontal = false;\n this.voiRange = null;\n this.interpolationType = InterpolationType.LINEAR;\n this.invert = false;\n this.viewportStatus = ViewportStatus.LOADING;\n\n this.fillWithBackgroundColor();\n\n if (this.useCPURendering) {\n this._cpuFallbackEnabledElement.renderingTools = {};\n delete this._cpuFallbackEnabledElement.viewport.colormap;\n }\n\n const imageId = await this._setImageIdIndex(currentImageIdIndex);\n\n const eventDetail: StackViewportNewStackEventDetail = {\n imageIds,\n viewportId: this.id,\n element: this.element,\n currentImageIdIndex: currentImageIdIndex,\n };\n\n triggerEvent(eventTarget, Events.STACK_VIEWPORT_NEW_STACK, eventDetail);\n\n return imageId;\n }\n\n /**\n * Throws an error if you are using a destroyed instance of the stack viewport\n */\n private _throwIfDestroyed() {\n if (this.isDisabled) {\n throw new Error(\n 'The stack viewport has been destroyed and is no longer usable. Renderings will not be performed. If you ' +\n 'are using the same viewportId and have re-enabled the viewport, you need to grab the new viewport instance ' +\n 'using renderingEngine.getViewport(viewportId), instead of using your lexical scoped reference to the viewport instance.'\n );\n }\n }\n\n /**\n * It checks if the new image object matches the dimensions, spacing,\n * and direction of the previously displayed image in the viewport or not.\n * It returns a boolean\n *\n * @param image - Cornerstone Image object\n * @param imageData - vtkImageData\n * @returns boolean\n */\n private _checkVTKImageDataMatchesCornerstoneImage(\n image: IImage,\n imageData: vtkImageDataType\n ): boolean {\n if (!imageData) {\n return false;\n }\n const [xSpacing, ySpacing] = imageData.getSpacing();\n const [xVoxels, yVoxels] = imageData.getDimensions();\n const imagePlaneModule = this._getImagePlaneModule(image.imageId);\n const direction = imageData.getDirection();\n const rowCosines = direction.slice(0, 3);\n const columnCosines = direction.slice(3, 6);\n const dataType = imageData.getPointData().getScalars().getDataType();\n\n // using epsilon comparison for float numbers comparison.\n const isSameXSpacing = isEqual(xSpacing, image.columnPixelSpacing);\n const isSameYSpacing = isEqual(ySpacing, image.rowPixelSpacing);\n\n // using spacing, size, and direction only for now\n return (\n (isSameXSpacing ||\n (image.columnPixelSpacing === null && xSpacing === 1.0)) &&\n (isSameYSpacing ||\n (image.rowPixelSpacing === null && ySpacing === 1.0)) &&\n xVoxels === image.columns &&\n yVoxels === image.rows &&\n isEqual(imagePlaneModule.rowCosines, rowCosines) &&\n isEqual(imagePlaneModule.columnCosines, columnCosines) &&\n (!this.useNativeDataType ||\n dataType === image.getPixelData().constructor.name)\n );\n }\n\n /**\n * It Updates the vtkImageData of the viewport with the new pixel data\n * from the provided image object.\n *\n * @param image - Cornerstone Image object\n */\n private _updateVTKImageDataFromCornerstoneImage(image: IImage): void {\n const imagePlaneModule = this._getImagePlaneModule(image.imageId);\n let origin = imagePlaneModule.imagePositionPatient;\n\n if (origin == null) {\n origin = [0, 0, 0];\n }\n\n this._imageData.setOrigin(origin);\n\n // Update the pixel data in the vtkImageData object with the pixelData\n // from the loaded Cornerstone image\n this._updatePixelData(image);\n }\n\n private _updatePixelData(image: IImage) {\n const pixelData = image.getPixelData();\n const scalars = this._imageData.getPointData().getScalars();\n const scalarData = scalars.getData() as\n | Uint8Array\n | Float32Array\n | Uint16Array\n | Int16Array;\n\n // if the color image is loaded with CPU previously, it loads it\n // with RGBA, and here we need to remove the A channel from the\n // pixel data.\n if (image.color && image.rgba) {\n const newPixelData = new Uint8Array(image.columns * image.rows * 3);\n for (let i = 0; i < image.columns * image.rows; i++) {\n newPixelData[i * 3] = pixelData[i * 4];\n newPixelData[i * 3 + 1] = pixelData[i * 4 + 1];\n newPixelData[i * 3 + 2] = pixelData[i * 4 + 2];\n }\n // modify the image object to have the correct pixel data for later\n // use.\n image.rgba = false;\n image.getPixelData = () => newPixelData;\n scalarData.set(newPixelData);\n } else {\n scalarData.set(pixelData);\n }\n\n // Trigger modified on the VTK Object so the texture is updated\n // TODO: evaluate directly changing things with texSubImage3D later\n this._imageData.modified();\n }\n\n /**\n * It uses imageLoadPoolManager to add request for the imageId. It loadsAndCache\n * the image and triggers the STACK_NEW_IMAGE when the request successfully retrieves\n * the image. Next, the volume actor gets updated with the new new retrieved image.\n *\n * @param imageId - string representing the imageId\n * @param imageIdIndex - index of the imageId in the imageId list\n */\n private async _loadAndDisplayImage(\n imageId: string,\n imageIdIndex: number\n ): Promise {\n await (this.useCPURendering\n ? this._loadAndDisplayImageCPU(imageId, imageIdIndex)\n : this._loadAndDisplayImageGPU(imageId, imageIdIndex));\n\n return imageId;\n }\n\n private _loadAndDisplayImageCPU(\n imageId: string,\n imageIdIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n // 1. Load the image using the Image Loader\n function successCallback(\n image: IImage,\n imageIdIndex: number,\n imageId: string\n ) {\n // Perform this check after the image has finished loading\n // in case the user has already scrolled away to another image.\n // In that case, do not render this image.\n if (this.currentImageIdIndex !== imageIdIndex) {\n return;\n }\n\n const pixelData = image.getPixelData();\n\n // handle the case where the pixelData is a Float32Array\n // CPU path cannot handle it, it should be converted to Uint16Array\n // and via the Modality LUT we can display it properly\n const preScale = image.preScale;\n const scalingParams = preScale?.scalingParameters;\n\n const scaledWithNonIntegers =\n (preScale?.scaled && scalingParams?.rescaleIntercept % 1 !== 0) ||\n scalingParams?.rescaleSlope % 1 !== 0;\n\n if (pixelData instanceof Float32Array && scaledWithNonIntegers) {\n const floatMinMax = {\n min: image.maxPixelValue,\n max: image.minPixelValue,\n };\n const floatRange = Math.abs(floatMinMax.max - floatMinMax.min);\n const intRange = 65535;\n const slope = floatRange / intRange;\n const intercept = floatMinMax.min;\n const numPixels = pixelData.length;\n const intPixelData = new Uint16Array(numPixels);\n\n let min = 65535;\n\n let max = 0;\n\n for (let i = 0; i < numPixels; i++) {\n const rescaledPixel = Math.floor(\n (pixelData[i] - intercept) / slope\n );\n\n intPixelData[i] = rescaledPixel;\n min = Math.min(min, rescaledPixel);\n max = Math.max(max, rescaledPixel);\n }\n\n // reset the properties since basically the image has changed\n image.minPixelValue = min;\n image.maxPixelValue = max;\n image.slope = slope;\n image.intercept = intercept;\n image.getPixelData = () => intPixelData;\n\n image.preScale = {\n ...image.preScale,\n scaled: false,\n };\n }\n\n this._setCSImage(image);\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n const eventDetail: EventTypes.StackNewImageEventDetail = {\n image,\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n\n triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail);\n\n this._updateToDisplayImageCPU(image);\n\n // Todo: trigger an event to allow applications to hook into END of loading state\n // Currently we use loadHandlerManagers for this\n\n // Trigger the image to be drawn on the next animation frame\n this.render();\n\n // Update the viewport's currentImageIdIndex to reflect the newly\n // rendered image\n this.currentImageIdIndex = imageIdIndex;\n resolve(imageId);\n }\n\n function errorCallback(\n error: Error,\n imageIdIndex: number,\n imageId: string\n ) {\n const eventDetail = {\n error,\n imageIdIndex,\n imageId,\n };\n\n if (!this.suppressEvents) {\n triggerEvent(eventTarget, Events.IMAGE_LOAD_ERROR, eventDetail);\n }\n\n reject(error);\n }\n\n function sendRequest(imageId, imageIdIndex, options) {\n return loadAndCacheImage(imageId, options).then(\n (image) => {\n successCallback.call(this, image, imageIdIndex, imageId);\n },\n (error) => {\n errorCallback.call(this, error, imageIdIndex, imageId);\n }\n );\n }\n\n const priority = -5;\n const requestType = RequestType.Interaction;\n const additionalDetails = { imageId };\n const options = {\n preScale: {\n enabled: true,\n },\n useRGBA: true,\n };\n\n const eventDetail: EventTypes.PreStackNewImageEventDetail = {\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n triggerEvent(this.element, Events.PRE_STACK_NEW_IMAGE, eventDetail);\n\n imageLoadPoolManager.addRequest(\n sendRequest.bind(this, imageId, imageIdIndex, options),\n requestType,\n additionalDetails,\n priority\n );\n });\n }\n\n private _loadAndDisplayImageGPU(imageId: string, imageIdIndex: number) {\n return new Promise((resolve, reject) => {\n // 1. Load the image using the Image Loader\n function successCallback(image, imageIdIndex, imageId) {\n // Todo: trigger an event to allow applications to hook into END of loading state\n // Currently we use loadHandlerManagers for this\n // Perform this check after the image has finished loading\n // in case the user has already scrolled away to another image.\n // In that case, do not render this image.\n if (this.currentImageIdIndex !== imageIdIndex) {\n return;\n }\n\n // If Photometric Interpretation is not the same for the next image we are trying to load\n // invalidate the stack to recreate the VTK imageData\n const csImgFrame = this.csImage?.imageFrame;\n const imgFrame = image?.imageFrame;\n\n // if a volume is decached into images then the imageFrame will be undefined\n if (\n csImgFrame?.photometricInterpretation !==\n imgFrame?.photometricInterpretation ||\n this.csImage?.photometricInterpretation !==\n image?.photometricInterpretation\n ) {\n this.stackInvalidated = true;\n }\n\n this._setCSImage(image);\n\n const eventDetail: EventTypes.StackNewImageEventDetail = {\n image,\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n\n triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail);\n this._updateActorToDisplayImageId(image);\n\n // Trigger the image to be drawn on the next animation frame\n this.render();\n\n // Update the viewport's currentImageIdIndex to reflect the newly\n // rendered image\n this.currentImageIdIndex = imageIdIndex;\n resolve(imageId);\n }\n\n function errorCallback(error, imageIdIndex, imageId) {\n const eventDetail = {\n error,\n imageIdIndex,\n imageId,\n };\n\n triggerEvent(eventTarget, Events.IMAGE_LOAD_ERROR, eventDetail);\n reject(error);\n }\n\n function sendRequest(imageId, imageIdIndex, options) {\n return loadAndCacheImage(imageId, options).then(\n (image) => {\n successCallback.call(this, image, imageIdIndex, imageId);\n },\n (error) => {\n errorCallback.call(this, error, imageIdIndex, imageId);\n }\n );\n }\n\n /**\n * If use16bittexture is specified, the CSWIL will automatically choose the\n * array type when no targetBuffer is provided. When CSWIL is initialized,\n * the use16bit should match the settings of cornerstone3D (either preferSizeOverAccuracy\n * or norm16 textures need to be enabled)\n *\n * If use16bittexture is not specified, we force the Float32Array for now\n */\n const priority = -5;\n const requestType = RequestType.Interaction;\n const additionalDetails = { imageId };\n const options = {\n targetBuffer: {\n type: this.useNativeDataType ? undefined : 'Float32Array',\n },\n preScale: {\n enabled: true,\n },\n useRGBA: false,\n };\n\n const eventDetail: EventTypes.PreStackNewImageEventDetail = {\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n triggerEvent(this.element, Events.PRE_STACK_NEW_IMAGE, eventDetail);\n\n imageLoadPoolManager.addRequest(\n sendRequest.bind(this, imageId, imageIdIndex, options),\n requestType,\n additionalDetails,\n priority\n );\n });\n }\n\n /**\n * Renders the given Cornerstone image object in the viewport.\n * This method is intended to be used by utilities to render\n * an individual image, rather than by applications that want to display\n * a complete image stack. If you want to load and display a complete\n * image stack, use the setStack method instead of this one.\n *\n * The rendered image will appear in the viewport's element.\n * Use this method if you have other means of loading and the\n * cornerstone image object is already available.\n *\n * If you don't understand the difference between this method and\n * setStack, you probably want to use setStack.\n *\n * @param image - The Cornerstone image object to render.\n */\n public renderImageObject = (image) => {\n this._setCSImage(image);\n\n const renderFn = this.useCPURendering\n ? this._updateToDisplayImageCPU\n : this._updateActorToDisplayImageId;\n\n renderFn.call(this, image);\n };\n\n private _setCSImage = (image) => {\n image.isPreScaled = image.preScale?.scaled;\n this.csImage = image;\n };\n\n private _updateToDisplayImageCPU(image: IImage) {\n const metadata = this._getImageDataMetadata(image) as ImageDataMetaData;\n\n const viewport = getDefaultViewport(\n this.canvas,\n image,\n this.modality,\n this._cpuFallbackEnabledElement.viewport.colormap\n );\n\n const { windowCenter, windowWidth } = viewport.voi;\n this.voiRange = windowLevelUtil.toLowHighRange(windowWidth, windowCenter);\n\n this._cpuFallbackEnabledElement.image = image;\n this._cpuFallbackEnabledElement.metadata = {\n ...metadata,\n };\n this.cpuImagePixelData = image.getPixelData();\n\n const viewportSettingToUse = Object.assign(\n {},\n viewport,\n this._cpuFallbackEnabledElement.viewport\n );\n\n // Important: this.stackInvalidated is different than cpuRenderingInvalidated. The\n // former is being used to maintain the previous state of the viewport\n // in the same stack, the latter is used to trigger drawImageSync\n this._cpuFallbackEnabledElement.viewport = this.stackInvalidated\n ? viewport\n : viewportSettingToUse;\n\n // used the previous state of the viewport, then stackInvalidated is set to false\n this.stackInvalidated = false;\n\n // new viewport is set to the current viewport, then cpuRenderingInvalidated is set to true\n this.cpuRenderingInvalidated = true;\n\n this._cpuFallbackEnabledElement.transform = calculateTransform(\n this._cpuFallbackEnabledElement\n );\n }\n\n /**\n * It updates the volume actor with the retrieved cornerstone image.\n * It first checks if the new image has the same dimensions, spacings, and\n * dimensions of the previous one: 1) If yes, it updates the pixel data 2) if not,\n * it creates a whole new volume actor for the image.\n * Note: Camera gets reset for both situations. Therefore, each image renders at\n * its exact 3D location in the space, and both image and camera moves while scrolling.\n *\n * @param image - Cornerstone image\n * @returns\n */\n private _updateActorToDisplayImageId(image) {\n // This function should do the following:\n // - Get the existing actor's vtkImageData that is being used to render the current image and check if we can reuse the vtkImageData that is in place (i.e. do the image dimensions and data type match?)\n // - If we can reuse it, replace the scalar data under the hood\n // - If we cannot reuse it, create a new actor, remove the old one, and reset the camera\n\n // 2. Check if we can reuse the existing vtkImageData object, if one is present.\n const sameImageData = this._checkVTKImageDataMatchesCornerstoneImage(\n image,\n this._imageData\n );\n\n const activeCamera = this.getRenderer().getActiveCamera();\n\n // Cache camera props so we can trigger one camera changed event after\n // The full transition.\n const previousCameraProps = _cloneDeep(this.getCamera());\n if (sameImageData && !this.stackInvalidated) {\n // 3a. If we can reuse it, replace the scalar data under the hood\n this._updateVTKImageDataFromCornerstoneImage(image);\n\n // Since the 3D location of the imageData is changing as we scroll, we need\n // to modify the camera position to render this properly. However, resetting\n // causes problem related to zoom and pan tools: upon rendering of a new slice\n // the pan and zoom will get reset. To solve this, 1) we store the camera\n // properties related to pan and zoom 2) reset the camera to correctly place\n // it in the space 3) restore the pan, zoom props.\n const cameraProps = this.getCamera();\n\n const panCache = vec3.subtract(\n vec3.create(),\n this.cameraFocalPointOnRender,\n cameraProps.focalPoint\n );\n\n // Reset the camera to point to the new slice location, reset camera doesn't\n // modify the direction of projection and viewUp\n this.resetCameraNoEvent();\n\n // set the flip and view up back to the previous value since the restore camera props\n // rely on the correct flip value\n this.setCameraNoEvent({\n flipHorizontal: previousCameraProps.flipHorizontal,\n flipVertical: previousCameraProps.flipVertical,\n viewUp: previousCameraProps.viewUp,\n });\n\n const { focalPoint } = this.getCamera();\n this.cameraFocalPointOnRender = focalPoint;\n\n // This is necessary to initialize the clipping range and it is not related\n // to our custom slabThickness.\n // @ts-ignore: vtkjs incorrect typing\n activeCamera.setFreezeFocalPoint(true);\n\n // We shouldn't restore the focalPoint, position and parallelScale after reset\n // if it is the first render or we have completely re-created the vtkImageData\n this._restoreCameraProps(\n cameraProps,\n previousCameraProps,\n panCache as Point3\n );\n\n this._setPropertiesFromCache();\n\n return;\n }\n\n const {\n origin,\n direction,\n dimensions,\n spacing,\n numComps,\n imagePixelModule,\n } = this._getImageDataMetadata(image);\n\n // 3b. If we cannot reuse the vtkImageData object (either the first render\n // or the size has changed), create a new one\n this._createVTKImageData({\n origin,\n direction,\n dimensions,\n spacing,\n numComps,\n pixelArray: image.getPixelData(),\n });\n\n // Set the scalar data of the vtkImageData object from the Cornerstone\n // Image's pixel data\n this._updateVTKImageDataFromCornerstoneImage(image);\n\n // Create a VTK Image Slice actor to display the vtkImageData object\n const actor = this.createActorMapper(this._imageData);\n const actors = [];\n actors.push({ uid: this.id, actor });\n this.setActors(actors);\n // Adjusting the camera based on slice axis. this is required if stack\n // contains various image orientations (axial ct, sagittal xray)\n const { viewPlaneNormal, viewUp } = this._getCameraOrientation(direction);\n\n this.setCameraNoEvent({ viewUp, viewPlaneNormal });\n\n // Setting this makes the following comment about resetCameraNoEvent not modifying viewUp true.\n this.initialViewUp = viewUp;\n\n // Reset the camera to point to the new slice location, reset camera doesn't\n // modify the direction of projection and viewUp\n this.resetCameraNoEvent();\n\n this.triggerCameraEvent(this.getCamera(), previousCameraProps);\n\n // This is necessary to initialize the clipping range and it is not related\n // to our custom slabThickness.\n // @ts-ignore: vtkjs incorrect typing\n activeCamera.setFreezeFocalPoint(true);\n\n const monochrome1 =\n imagePixelModule.photometricInterpretation === 'MONOCHROME1';\n\n // invalidate the stack so that we can set the voi range\n this.stackInvalidated = true;\n\n this.setVOI(this._getInitialVOIRange(image), {\n forceRecreateLUTFunction: !!monochrome1,\n });\n\n this.initialInvert = !!monochrome1;\n\n // should carry over the invert color from the previous image if has been applied\n this.setInvertColor(this.invert || this.initialInvert);\n\n // Saving position of camera on render, to cache the panning\n this.cameraFocalPointOnRender = this.getCamera().focalPoint;\n this.stackInvalidated = false;\n\n if (this._publishCalibratedEvent) {\n this.triggerCalibrationEvent();\n }\n }\n\n private _getInitialVOIRange(image: IImage) {\n if (this.voiRange && this.voiUpdatedWithSetProperties) {\n return this.voiRange;\n }\n const { windowCenter, windowWidth } = image;\n\n let voiRange = this._getVOIRangeFromWindowLevel(windowWidth, windowCenter);\n\n // Get the range for the PT since if it is prescaled\n // we set a default range of 0-5\n voiRange = this._getPTPreScaledRange() || voiRange;\n\n return voiRange;\n }\n\n private _getPTPreScaledRange() {\n if (!this._isCurrentImagePTPrescaled()) {\n return undefined;\n }\n\n return this._getDefaultPTPrescaledVOIRange();\n }\n\n private _isCurrentImagePTPrescaled() {\n if (this.modality !== 'PT' || !this.csImage.isPreScaled) {\n return false;\n }\n\n if (!this.csImage.preScale?.scalingParameters?.suvbw) {\n return false;\n }\n\n return true;\n }\n\n private _getDefaultPTPrescaledVOIRange() {\n return { lower: 0, upper: 5 };\n }\n\n private _getVOIRangeFromWindowLevel(\n windowWidth: number | number[],\n windowCenter: number | number[]\n ): { lower: number; upper: number } | undefined {\n let center, width;\n\n if (typeof windowCenter === 'number' && typeof windowWidth === 'number') {\n center = windowCenter;\n width = windowWidth;\n } else if (Array.isArray(windowCenter) && Array.isArray(windowWidth)) {\n center = windowCenter[0];\n width = windowWidth[0];\n }\n\n // If center and width are defined, convert them to low-high range\n if (center !== undefined && width !== undefined) {\n return windowLevelUtil.toLowHighRange(width, center);\n }\n }\n\n /**\n * Loads the image based on the provided imageIdIndex\n * @param imageIdIndex - number represents imageId index\n */\n private async _setImageIdIndex(imageIdIndex: number): Promise {\n if (imageIdIndex >= this.imageIds.length) {\n throw new Error(\n `ImageIdIndex provided ${imageIdIndex} is invalid, the stack only has ${this.imageIds.length} elements`\n );\n }\n\n // Update the state of the viewport to the new imageIdIndex;\n this.currentImageIdIndex = imageIdIndex;\n this.hasPixelSpacing = true;\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n // Todo: trigger an event to allow applications to hook into START of loading state\n // Currently we use loadHandlerManagers for this\n const imageId = await this._loadAndDisplayImage(\n this.imageIds[imageIdIndex],\n imageIdIndex\n );\n\n return imageId;\n }\n\n private resetCameraCPU(resetPan, resetZoom) {\n const { image } = this._cpuFallbackEnabledElement;\n\n if (!image) {\n return;\n }\n\n resetCamera(this._cpuFallbackEnabledElement, resetPan, resetZoom);\n\n const { scale } = this._cpuFallbackEnabledElement.viewport;\n\n // canvas center is the focal point\n const { clientWidth, clientHeight } = this.element;\n const center: Point2 = [clientWidth / 2, clientHeight / 2];\n\n const centerWorld = this.canvasToWorldCPU(center);\n\n this.setCameraCPU({\n focalPoint: centerWorld,\n scale,\n });\n }\n\n private resetCameraGPU(resetPan, resetZoom): boolean {\n // Todo: we need to make the rotation a camera properties so that\n // we can reset it there, right now it is not possible to reset the rotation\n // without this\n\n // We do not know the ordering of various flips and rotations that have been applied,\n // so the rotation and flip must be reset together.\n this.setCamera({\n flipHorizontal: false,\n flipVertical: false,\n viewUp: this.initialViewUp,\n });\n\n // For stack Viewport we since we have only one slice\n // it should be enough to reset the camera to the center of the image\n const resetToCenter = true;\n return super.resetCamera(resetPan, resetZoom, resetToCenter);\n }\n\n /**\n * It scrolls the stack of imageIds by the delta amount provided. If the debounce\n * flag is set, it will only scroll the stack if the delta is greater than the\n * debounceThreshold which is 40 milliseconds by default.\n * @param delta - number of indices to scroll, it can be positive or negative\n * @param debounce - whether to debounce the scroll event\n * @param loop - whether to loop the stack\n */\n public scroll(delta: number, debounce = true, loop = false): void {\n const imageIds = this.imageIds;\n\n const currentTargetImageIdIndex = this.targetImageIdIndex;\n const numberOfFrames = imageIds.length;\n\n let newTargetImageIdIndex = currentTargetImageIdIndex + delta;\n newTargetImageIdIndex = Math.max(0, newTargetImageIdIndex);\n\n if (loop) {\n newTargetImageIdIndex = newTargetImageIdIndex % numberOfFrames;\n } else {\n newTargetImageIdIndex = Math.min(\n numberOfFrames - 1,\n newTargetImageIdIndex\n );\n }\n\n this.targetImageIdIndex = newTargetImageIdIndex;\n\n const targetImageId = imageIds[newTargetImageIdIndex];\n\n const imageAlreadyLoaded = cache.isLoaded(targetImageId);\n\n // If image is already cached we want to scroll right away; however, if it is\n // not cached, we can debounce the scroll event to avoid firing multiple scroll\n // events for the images that might happen to be passing by (as a result of infinite\n // scrolling).\n if (imageAlreadyLoaded || !debounce) {\n this.setImageIdIndex(newTargetImageIdIndex);\n } else {\n clearTimeout(this.debouncedTimeout);\n this.debouncedTimeout = window.setTimeout(() => {\n this.setImageIdIndex(newTargetImageIdIndex);\n }, 40);\n }\n\n const eventData: StackViewportScrollEventDetail = {\n newImageIdIndex: newTargetImageIdIndex,\n imageId: targetImageId,\n direction: delta,\n };\n\n if (newTargetImageIdIndex !== currentTargetImageIdIndex) {\n triggerEvent(this.element, Events.STACK_VIEWPORT_SCROLL, eventData);\n }\n }\n\n /**\n * Loads the image based on the provided imageIdIndex. It is an Async function which\n * returns a promise that resolves to the imageId.\n *\n * @param imageIdIndex - number represents imageId index in the list of\n * provided imageIds in setStack\n */\n public async setImageIdIndex(imageIdIndex: number): Promise {\n this._throwIfDestroyed();\n\n // If we are already on this imageId index, stop here\n if (this.currentImageIdIndex === imageIdIndex) {\n return this.getCurrentImageId();\n }\n\n // Otherwise, get the imageId and attempt to display it\n const imageId = this._setImageIdIndex(imageIdIndex);\n\n return imageId;\n }\n\n /**\n * Calibrates the image with new metadata that has been added for imageId. To calibrate\n * a viewport, you should add your calibration data manually to\n * calibratedPixelSpacingMetadataProvider and call viewport.calibrateSpacing\n * for it get applied.\n *\n * @param imageId - imageId to be calibrated\n */\n public calibrateSpacing(imageId: string): void {\n const imageIdIndex = this.getImageIds().indexOf(imageId);\n this.stackInvalidated = true;\n this._loadAndDisplayImage(imageId, imageIdIndex);\n }\n\n /**\n * Restores the camera props such zooming and panning after an image is\n * changed, if needed (after scroll)\n *\n * @param parallelScale - camera parallel scale\n */\n private _restoreCameraProps(\n { parallelScale: prevScale }: ICamera,\n previousCamera: ICamera,\n panCache: Point3\n ): void {\n const renderer = this.getRenderer();\n\n // get the focalPoint and position after the reset\n const { position, focalPoint } = this.getCamera();\n\n const newPosition = vec3.subtract(vec3.create(), position, panCache);\n const newFocal = vec3.subtract(vec3.create(), focalPoint, panCache);\n\n // Restoring previous state x,y and scale, keeping the new z\n // we need to break the flip operations since they also work on the\n // camera position and focal point\n this.setCameraNoEvent({\n parallelScale: prevScale,\n position: newPosition as Point3,\n focalPoint: newFocal as Point3,\n });\n\n const camera = this.getCamera();\n\n this.triggerCameraEvent(camera, previousCamera);\n\n // Invoking render\n const RESET_CAMERA_EVENT = {\n type: 'ResetCameraEvent',\n renderer,\n };\n\n renderer.invokeEvent(RESET_CAMERA_EVENT);\n }\n\n private triggerCameraEvent(camera: ICamera, previousCamera: ICamera) {\n // Finally emit event for the full camera change cause during load image.\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n\n if (!this.suppressEvents) {\n // For crosshairs to adapt to new viewport size\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n }\n\n private triggerCalibrationEvent() {\n // Update the indexToWorld and WorldToIndex for viewport\n const { imageData } = this.getImageData();\n // Finally emit event for the full camera change cause during load image.\n const eventDetail: EventTypes.ImageSpacingCalibratedEventDetail = {\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n imageId: this.getCurrentImageId(),\n // Todo: why do we need to pass imageData? isn't' indexToWorld and worldToIndex enough?\n imageData: imageData as vtkImageData,\n worldToIndex: imageData.getWorldToIndex() as mat4,\n ...this._calibrationEvent,\n };\n\n if (!this.suppressEvents) {\n // Let the tools know the image spacing has been calibrated\n triggerEvent(this.element, Events.IMAGE_SPACING_CALIBRATED, eventDetail);\n }\n\n this._publishCalibratedEvent = false;\n }\n\n private canvasToWorldCPU = (canvasPos: Point2): Point3 => {\n if (!this._cpuFallbackEnabledElement.image) {\n return;\n }\n // compute the pixel coordinate in the image\n const [px, py] = canvasToPixel(this._cpuFallbackEnabledElement, canvasPos);\n\n // convert pixel coordinate to world coordinate\n const { origin, spacing, direction } = this.getImageData();\n\n const worldPos = vec3.fromValues(0, 0, 0);\n\n // Calculate size of spacing vector in normal direction\n const iVector = direction.slice(0, 3) as Point3;\n const jVector = direction.slice(3, 6) as Point3;\n\n // Calculate the world coordinate of the pixel\n vec3.scaleAndAdd(worldPos, origin, iVector, px * spacing[0]);\n vec3.scaleAndAdd(worldPos, worldPos, jVector, py * spacing[1]);\n\n return [worldPos[0], worldPos[1], worldPos[2]] as Point3;\n };\n\n private worldToCanvasCPU = (worldPos: Point3): Point2 => {\n // world to pixel\n const { spacing, direction, origin } = this.getImageData();\n\n const iVector = direction.slice(0, 3) as Point3;\n const jVector = direction.slice(3, 6) as Point3;\n\n const diff = vec3.subtract(vec3.create(), worldPos, origin);\n\n const worldPoint: Point2 = [\n vec3.dot(diff, iVector) / spacing[0],\n vec3.dot(diff, jVector) / spacing[1],\n ];\n\n // pixel to canvas\n const canvasPoint = pixelToCanvas(\n this._cpuFallbackEnabledElement,\n worldPoint\n );\n return canvasPoint;\n };\n\n private canvasToWorldGPU = (canvasPos: Point2): Point3 => {\n const renderer = this.getRenderer();\n\n // Temporary setting the clipping range to the distance and distance + 0.1\n // in order to calculate the transformations correctly.\n // This is similar to the vtkSlabCamera isPerformingCoordinateTransformations\n // You can read more about it here there.\n const vtkCamera = this.getVtkActiveCamera();\n const crange = vtkCamera.getClippingRange();\n const distance = vtkCamera.getDistance();\n\n vtkCamera.setClippingRange(distance, distance + 0.1);\n\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasPosWithDPR = [\n canvasPos[0] * devicePixelRatio,\n canvasPos[1] * devicePixelRatio,\n ];\n const displayCoord = [\n canvasPosWithDPR[0] + this.sx,\n canvasPosWithDPR[1] + this.sy,\n ];\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const worldCoord = openGLRenderWindow.displayToWorld(\n displayCoord[0],\n displayCoord[1],\n 0,\n renderer\n );\n\n // set clipping range back to original to be able\n vtkCamera.setClippingRange(crange[0], crange[1]);\n\n return [worldCoord[0], worldCoord[1], worldCoord[2]];\n };\n\n private worldToCanvasGPU = (worldPos: Point3): Point2 => {\n const renderer = this.getRenderer();\n\n // Temporary setting the clipping range to the distance and distance + 0.1\n // in order to calculate the transformations correctly.\n // This is similar to the vtkSlabCamera isPerformingCoordinateTransformations\n // You can read more about it here there.\n const vtkCamera = this.getVtkActiveCamera();\n const crange = vtkCamera.getClippingRange();\n const distance = vtkCamera.getDistance();\n\n vtkCamera.setClippingRange(distance, distance + 0.1);\n\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n const displayCoord = openGLRenderWindow.worldToDisplay(\n ...worldPos,\n renderer\n );\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const canvasCoord = [\n displayCoord[0] - this.sx,\n displayCoord[1] - this.sy,\n ];\n\n // set clipping range back to original to be able\n vtkCamera.setClippingRange(crange[0], crange[1]);\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasCoordWithDPR = [\n canvasCoord[0] / devicePixelRatio,\n canvasCoord[1] / devicePixelRatio,\n ];\n\n return canvasCoordWithDPR;\n };\n\n private _getVOIRangeForCurrentImage() {\n const { windowCenter, windowWidth } = this.csImage;\n\n return this._getVOIRangeFromWindowLevel(windowWidth, windowCenter);\n }\n\n private _getValidVOILUTFunction(voiLUTFunction: any) {\n if (Object.values(VOILUTFunctionType).indexOf(voiLUTFunction) === -1) {\n voiLUTFunction = VOILUTFunctionType.LINEAR;\n }\n return voiLUTFunction;\n }\n\n /**\n * Returns the index of the imageId being renderer\n *\n * @returns currently shown imageId index\n */\n public getCurrentImageIdIndex = (): number => {\n return this.currentImageIdIndex;\n };\n\n /**\n *\n * Returns the imageIdIndex that is targeted to be loaded, in case of debounced\n * loading (with scroll), the targetImageIdIndex is the latest imageId\n * index that is requested to be loaded but debounced.\n */\n public getTargetImageIdIndex = (): number => {\n return this.targetImageIdIndex;\n };\n\n /**\n * Returns the list of image Ids for the current viewport\n * @returns list of strings for image Ids\n */\n public getImageIds = (): Array => {\n return this.imageIds;\n };\n\n /**\n * Returns the currently rendered imageId\n * @returns string for imageId\n */\n public getCurrentImageId = (): string => {\n return this.imageIds[this.currentImageIdIndex];\n };\n\n /**\n * Returns true if the viewport contains the given imageId\n * @param imageId - imageId\n * @returns boolean if imageId is in viewport\n */\n public hasImageId = (imageId: string): boolean => {\n return this.imageIds.includes(imageId);\n };\n\n /**\n * Returns true if the viewport contains the given imageURI (no data loader scheme)\n * @param imageURI - imageURI\n * @returns boolean if imageURI is in viewport\n */\n public hasImageURI = (imageURI: string): boolean => {\n const imageIds = this.imageIds;\n for (let i = 0; i < imageIds.length; i++) {\n if (imageIdToURI(imageIds[i]) === imageURI) {\n return true;\n }\n }\n\n return false;\n };\n\n private getCPUFallbackError(method: string): Error {\n return new Error(\n `method ${method} cannot be used during CPU Fallback mode`\n );\n }\n\n private fillWithBackgroundColor() {\n const renderingEngine = this.getRenderingEngine();\n\n if (renderingEngine) {\n renderingEngine.fillCanvasWithBackgroundColor(\n this.canvas,\n this.options.background\n );\n }\n }\n\n public customRenderViewportToCanvas = () => {\n if (!this.useCPURendering) {\n throw new Error(\n 'Custom cpu rendering pipeline should only be hit in CPU rendering mode'\n );\n }\n\n if (this._cpuFallbackEnabledElement.image) {\n drawImageSync(\n this._cpuFallbackEnabledElement,\n this.cpuRenderingInvalidated\n );\n // reset flags\n this.cpuRenderingInvalidated = false;\n } else {\n this.fillWithBackgroundColor();\n }\n\n return {\n canvas: this.canvas,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n viewportStatus: this.viewportStatus,\n };\n };\n\n private unsetColormapCPU() {\n delete this._cpuFallbackEnabledElement.viewport.colormap;\n this._cpuFallbackEnabledElement.renderingTools = {};\n\n this.cpuRenderingInvalidated = true;\n\n this.fillWithBackgroundColor();\n\n this.render();\n }\n\n private setColormapCPU(colormapData: CPUFallbackColormapData) {\n const colormap = getColormap(colormapData.name, colormapData);\n\n this._cpuFallbackEnabledElement.viewport.colormap = colormap;\n this._cpuFallbackEnabledElement.renderingTools = {};\n\n this.fillWithBackgroundColor();\n this.cpuRenderingInvalidated = true;\n\n this.render();\n }\n\n private setColormapGPU(colormap: ColormapRegistration) {\n const ActorEntry = this.getDefaultActor();\n const actor = ActorEntry.actor as ImageActor;\n const actorProp = actor.getProperty();\n const rgbTransferFunction = actorProp.getRGBTransferFunction();\n\n if (!rgbTransferFunction) {\n const cfun = vtkColorTransferFunction.newInstance();\n const voiRange = this._getVOIRangeForCurrentImage();\n cfun.applyColorMap(colormap);\n cfun.setMappingRange(voiRange.lower, voiRange.upper);\n actorProp.setRGBTransferFunction(0, cfun);\n } else {\n rgbTransferFunction.applyColorMap(colormap);\n actorProp.setRGBTransferFunction(0, rgbTransferFunction);\n }\n\n this.render();\n }\n\n private unsetColormapGPU() {\n // TODO -> vtk has full colormaps which are piecewise and frankly better?\n // Do we really want a pre defined 256 color map just for the sake of harmonization?\n throw new Error('unsetColormapGPU not implemented.');\n }\n\n // create default values for imagePlaneModule if values are undefined\n private _getImagePlaneModule(imageId: string): ImagePlaneModule {\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n const calibratedPixelSpacing = metaData.get(\n 'calibratedPixelSpacing',\n imageId\n );\n\n this.calibration ||= imagePlaneModule.calibration;\n\n const newImagePlaneModule: ImagePlaneModule = {\n ...imagePlaneModule,\n };\n\n if (!newImagePlaneModule.columnPixelSpacing) {\n newImagePlaneModule.columnPixelSpacing = 1;\n this.hasPixelSpacing = this.calibration?.scale > 0;\n }\n\n if (!newImagePlaneModule.rowPixelSpacing) {\n newImagePlaneModule.rowPixelSpacing = 1;\n this.hasPixelSpacing = this.calibration?.scale > 0;\n }\n\n if (!newImagePlaneModule.columnCosines) {\n newImagePlaneModule.columnCosines = [0, 1, 0];\n }\n\n if (!newImagePlaneModule.rowCosines) {\n newImagePlaneModule.rowCosines = [1, 0, 0];\n }\n\n if (!newImagePlaneModule.imagePositionPatient) {\n newImagePlaneModule.imagePositionPatient = [0, 0, 0];\n }\n\n if (!newImagePlaneModule.imageOrientationPatient) {\n newImagePlaneModule.imageOrientationPatient = new Float32Array([\n 1, 0, 0, 0, 1, 0,\n ]);\n }\n\n return newImagePlaneModule;\n }\n\n private renderingPipelineFunctions = {\n getImageData: {\n cpu: this.getImageDataCPU,\n gpu: this.getImageDataGPU,\n },\n setColormap: {\n cpu: this.setColormapCPU,\n gpu: this.setColormapGPU,\n },\n getCamera: {\n cpu: this.getCameraCPU,\n gpu: super.getCamera,\n },\n setCamera: {\n cpu: this.setCameraCPU,\n gpu: super.setCamera,\n },\n setVOI: {\n cpu: this.setVOICPU,\n gpu: this.setVOIGPU,\n },\n getRotation: {\n cpu: this.getRotationCPU,\n gpu: this.getRotationGPU,\n },\n setInterpolationType: {\n cpu: this.setInterpolationTypeCPU,\n gpu: this.setInterpolationTypeGPU,\n },\n setInvertColor: {\n cpu: this.setInvertColorCPU,\n gpu: this.setInvertColorGPU,\n },\n resetCamera: {\n cpu: (resetPan = true, resetZoom = true): boolean => {\n this.resetCameraCPU(resetPan, resetZoom);\n return true;\n },\n gpu: (resetPan = true, resetZoom = true): boolean => {\n this.resetCameraGPU(resetPan, resetZoom);\n return true;\n },\n },\n canvasToWorld: {\n cpu: this.canvasToWorldCPU,\n gpu: this.canvasToWorldGPU,\n },\n worldToCanvas: {\n cpu: this.worldToCanvasCPU,\n gpu: this.worldToCanvasGPU,\n },\n getRenderer: {\n cpu: () => this.getCPUFallbackError('getRenderer'),\n gpu: super.getRenderer,\n },\n getDefaultActor: {\n cpu: () => this.getCPUFallbackError('getDefaultActor'),\n gpu: super.getDefaultActor,\n },\n getActors: {\n cpu: () => this.getCPUFallbackError('getActors'),\n gpu: super.getActors,\n },\n getActor: {\n cpu: () => this.getCPUFallbackError('getActor'),\n gpu: super.getActor,\n },\n setActors: {\n cpu: () => this.getCPUFallbackError('setActors'),\n gpu: super.setActors,\n },\n addActors: {\n cpu: () => this.getCPUFallbackError('addActors'),\n gpu: super.addActors,\n },\n addActor: {\n cpu: () => this.getCPUFallbackError('addActor'),\n gpu: super.addActor,\n },\n removeAllActors: {\n cpu: () => this.getCPUFallbackError('removeAllActors'),\n gpu: super.removeAllActors,\n },\n unsetColormap: {\n cpu: this.unsetColormapCPU,\n gpu: this.unsetColormapGPU,\n },\n };\n}\n\nexport default StackViewport;\n","import { CPUFallbackViewport, Point2 } from '../../../../types';\n\ntype Shift = {\n x: number;\n y: number;\n};\n/**\n * Corrects the shift by accounting for viewport rotation and flips.\n *\n * @param shift - The shift to correct.\n * @param viewportOrientation - Object containing information on the viewport orientation.\n */\nexport default function (\n shift: Shift,\n viewportOrientation: CPUFallbackViewport\n): Shift {\n const { hflip, vflip, rotation } = viewportOrientation;\n\n // Apply Flips\n shift.x *= hflip ? -1 : 1;\n shift.y *= vflip ? -1 : 1;\n\n // Apply rotations\n if (rotation !== 0) {\n const angle = (rotation * Math.PI) / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n","import getImageFitScale from './getImageFitScale';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Resets the camera to the default position. which would be the center of the image.\n * with no translation, no flipping, no zoom and proper scale.\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n resetPan = true,\n resetZoom = true\n): void {\n const { canvas, image, viewport } = enabledElement;\n const scale = getImageFitScale(canvas, image, 0).scaleFactor;\n\n viewport.vflip = false;\n viewport.hflip = false;\n\n if (resetPan) {\n viewport.translation.x = 0;\n viewport.translation.y = 0;\n }\n\n if (resetZoom) {\n viewport.displayedArea.tlhc.x = 1;\n viewport.displayedArea.tlhc.y = 1;\n viewport.displayedArea.brhc.x = image.columns;\n viewport.displayedArea.brhc.y = image.rows;\n\n viewport.scale = scale;\n }\n}\n","import { BlendModes, OrientationAxis } from '../enums';\nimport type { ViewportInput } from '../types/IViewport';\nimport BaseVolumeViewport from './BaseVolumeViewport';\n\n/**\n * An object representing a 3-dimensional volume viewport. VolumeViewport3Ds are used to render\n * 3D volumes in their entirety, and not just load a single slice at a time.\n *\n * For setting volumes on viewports you need to use {@link addVolumesToViewports}\n * which will add volumes to the specified viewports.\n */\nclass VolumeViewport3D extends BaseVolumeViewport {\n constructor(props: ViewportInput) {\n super(props);\n\n const { parallelProjection, orientation } = this.options;\n\n const activeCamera = this.getVtkActiveCamera();\n\n if (parallelProjection != null) {\n activeCamera.setParallelProjection(parallelProjection);\n }\n\n if (orientation && orientation !== OrientationAxis.ACQUISITION) {\n this.applyViewOrientation(orientation);\n }\n }\n\n public resetCamera(\n resetPan = true,\n resetZoom = true,\n resetToCenter = true\n ): boolean {\n super.resetCamera(resetPan, resetZoom, resetToCenter);\n this.resetVolumeViewportClippingRange();\n return;\n }\n\n getRotation = (): number => 0;\n\n getCurrentImageIdIndex = (): number | undefined => {\n return undefined;\n };\n\n getCurrentImageId = (): string => {\n return null;\n };\n\n setSlabThickness(\n slabThickness: number,\n filterActorUIDs?: Array\n ): void {\n return null;\n }\n\n setBlendMode(\n blendMode: BlendModes,\n filterActorUIDs?: string[],\n immediate?: boolean\n ): void {\n return null;\n }\n\n resetProperties(volumeId?: string): void {\n return null;\n }\n}\n\nexport default VolumeViewport3D;\n","// TODO -> Eventually we'll need to register to this list\nimport StackViewport from '../StackViewport';\nimport VolumeViewport from '../VolumeViewport';\nimport ViewportType from '../../enums/ViewportType';\nimport VolumeViewport3D from '../VolumeViewport3D';\n\nconst viewportTypeToViewportClass = {\n [ViewportType.ORTHOGRAPHIC]: VolumeViewport,\n [ViewportType.PERSPECTIVE]: VolumeViewport,\n [ViewportType.STACK]: StackViewport,\n [ViewportType.VOLUME_3D]: VolumeViewport3D,\n};\n\nexport default viewportTypeToViewportClass;\n","import viewportTypeToViewportClass from './viewportTypeToViewportClass';\n\nexport default function viewportTypeUsesCustomRenderingPipeline(\n viewportType: string\n) {\n return viewportTypeToViewportClass[viewportType].useCustomRenderingPipeline;\n}\n","import Events from '../enums/Events';\nimport renderingEngineCache from './renderingEngineCache';\nimport eventTarget from '../eventTarget';\nimport { triggerEvent, uuidv4 } from '../utilities';\nimport { vtkOffscreenMultiRenderWindow } from './vtkClasses';\nimport ViewportType from '../enums/ViewportType';\nimport VolumeViewport from './VolumeViewport';\nimport BaseVolumeViewport from './BaseVolumeViewport';\nimport StackViewport from './StackViewport';\nimport viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline';\nimport getOrCreateCanvas from './helpers/getOrCreateCanvas';\nimport { getShouldUseCPURendering, isCornerstoneInitialized } from '../init';\nimport type IStackViewport from '../types/IStackViewport';\nimport type IRenderingEngine from '../types/IRenderingEngine';\nimport type IVolumeViewport from '../types/IVolumeViewport';\nimport type * as EventTypes from '../types/EventTypes';\nimport type {\n ViewportInput,\n PublicViewportInput,\n InternalViewportInput,\n NormalizedViewportInput,\n} from '../types/IViewport';\nimport { OrientationAxis, ViewportStatus } from '../enums';\nimport VolumeViewport3D from './VolumeViewport3D';\n\ntype ViewportDisplayCoords = {\n sxStartDisplayCoords: number;\n syStartDisplayCoords: number;\n sxEndDisplayCoords: number;\n syEndDisplayCoords: number;\n sx: number;\n sy: number;\n sWidth: number;\n sHeight: number;\n};\n\n// Rendering engines seem to not like rendering things less than 2 pixels per side\nconst VIEWPORT_MIN_SIZE = 2;\n\n/**\n * A RenderingEngine takes care of the full pipeline of creating viewports and rendering\n * them on a large offscreen canvas and transmitting this data back to the screen. This allows us\n * to leverage the power of vtk.js whilst only using one WebGL context for the processing, and allowing\n * us to share texture memory across on-screen viewports that show the same data.\n *\n * Instantiating a rendering engine:\n * ```js\n * const renderingEngine = new RenderingEngine('pet-ct-rendering-engine');\n * ```\n *\n * There are various ways you can trigger a render on viewports. The simplest is to call `render()`\n * on the rendering engine; however, it will trigger a render on all viewports. A more efficient\n * way to do this is to call `renderViewports([viewportId])` on the rendering engine to\n * trigger a render on a specific viewport(s). Each viewport also has a `.render` method which can be used to trigger a render on that\n * viewport.\n *\n *\n * Rendering engine uses `detect-gpu` external library to detect if GPU is available and\n * it has minimum requirement to be able to render a volume with vtk.js. If GPU is not available\n * RenderingEngine will throw an error if you try to render a volume; however, for StackViewports\n * it is capable of falling back to CPU rendering for Stack images.\n *\n * By default RenderingEngine will use vtk.js enabled pipeline for rendering viewports,\n * however, if a custom rendering pipeline is specified by a custom viewport, it will be used instead.\n * We use this custom pipeline to render a StackViewport on CPU using Cornerstone-legacy cpu rendering pipeline.\n *\n * @public\n */\nclass RenderingEngine implements IRenderingEngine {\n /** Unique identifier for renderingEngine */\n readonly id: string;\n /** A flag which tells if the renderingEngine has been destroyed */\n public hasBeenDestroyed: boolean;\n public offscreenMultiRenderWindow: any;\n readonly offScreenCanvasContainer: any; // WebGL\n private _viewports: Map;\n private _needsRender: Set = new Set();\n private _animationFrameSet = false;\n private _animationFrameHandle: number | null = null;\n private useCPURendering: boolean;\n\n /**\n * @param uid - Unique identifier for RenderingEngine\n */\n constructor(id?: string) {\n this.id = id ? id : uuidv4();\n this.useCPURendering = getShouldUseCPURendering();\n\n renderingEngineCache.set(this);\n\n if (!isCornerstoneInitialized()) {\n throw new Error(\n '@cornerstonejs/core is not initialized, run init() first'\n );\n }\n\n if (!this.useCPURendering) {\n this.offscreenMultiRenderWindow =\n vtkOffscreenMultiRenderWindow.newInstance();\n this.offScreenCanvasContainer = document.createElement('div');\n this.offscreenMultiRenderWindow.setContainer(\n this.offScreenCanvasContainer\n );\n }\n\n this._viewports = new Map();\n this.hasBeenDestroyed = false;\n }\n\n /**\n * Enables the requested viewport and add it to the viewports. It will\n * properly create the Stack viewport or Volume viewport:\n *\n * 1) Checks if the viewport is defined already, if yes, remove it first\n * 2) Checks if the viewport is using a custom rendering pipeline, if no,\n * it calculates a new offscreen canvas with the new requested viewport\n * 3) Adds the viewport\n *\n *\n * ```\n * renderingEngine.enableElement({\n * viewportId: viewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element,\n * defaultOptions: {\n * orientation: Enums.OrientationAxis.AXIAL,\n * background: [1, 0, 1],\n * },\n * })\n * ```\n *\n * @fires Events.ELEMENT_ENABLED\n *\n * @param viewportInputEntry - viewport specifications\n */\n public enableElement(viewportInputEntry: PublicViewportInput): void {\n const viewportInput = this._normalizeViewportInputEntry(viewportInputEntry);\n\n this._throwIfDestroyed();\n const { element, viewportId } = viewportInput;\n\n // Throw error if no canvas\n if (!element) {\n throw new Error('No element provided');\n }\n\n // 1. Get the viewport from the list of available viewports.\n const viewport = this.getViewport(viewportId);\n\n // 1.a) If there is a found viewport, we remove the viewport and create a new viewport\n if (viewport) {\n console.log('Viewport already exists, disabling it first');\n this.disableElement(viewportId);\n console.log(`Viewport ${viewportId} disabled`);\n }\n\n // 2.a) See if viewport uses a custom rendering pipeline.\n const { type } = viewportInput;\n\n const viewportUsesCustomRenderingPipeline =\n viewportTypeUsesCustomRenderingPipeline(type);\n\n // 2.b) Retrieving the list of viewports for calculation of the new size for\n // offScreen canvas.\n\n // If the viewport being added uses a custom pipeline, or we aren't using\n // GPU rendering, we don't need to resize the offscreen canvas.\n if (!this.useCPURendering && !viewportUsesCustomRenderingPipeline) {\n this.enableVTKjsDrivenViewport(viewportInput);\n } else {\n // 3 Add the requested viewport to rendering Engine\n this.addCustomViewport(viewportInput);\n }\n\n // 5. Set the background color for the canvas\n const canvas = getOrCreateCanvas(element);\n const { background } = viewportInput.defaultOptions;\n this.fillCanvasWithBackgroundColor(canvas, background);\n }\n\n /**\n * Disables the requested viewportId from the rendering engine:\n *\n * 1) It removes the viewport from the the list of viewports\n * 2) remove the renderer from the offScreen render window if using vtk.js driven\n * rendering pipeline\n * 3) resetting the viewport to remove the canvas attributes and canvas data\n * 4) resize the offScreen appropriately (if using vtk.js driven rendering pipeline)\n *\n * @fires Events.ELEMENT_ENABLED\n *\n * @param viewportId - viewport Id\n *\n */\n public disableElement(viewportId: string): void {\n this._throwIfDestroyed();\n // 1. Getting the viewport to remove it\n const viewport = this.getViewport(viewportId);\n\n // 2 To throw if there is no viewport stored in rendering engine\n if (!viewport) {\n console.warn(`viewport ${viewportId} does not exist`);\n return;\n }\n\n // 3. Reset the viewport to remove attributes, and reset the canvas\n this._resetViewport(viewport);\n\n // 4. Remove the related renderer from the offScreenMultiRenderWindow\n if (\n !viewportTypeUsesCustomRenderingPipeline(viewport.type) &&\n !this.useCPURendering\n ) {\n this.offscreenMultiRenderWindow.removeRenderer(viewportId);\n }\n\n // 5. Remove the requested viewport from the rendering engine\n this._removeViewport(viewportId);\n viewport.isDisabled = true;\n\n // 6. Avoid rendering for the disabled viewport\n this._needsRender.delete(viewportId);\n\n // 7. Clear RAF if no viewport is left\n const viewports = this.getViewports();\n if (!viewports.length) {\n this._clearAnimationFrame();\n }\n\n // 8. Resize the offScreen canvas to accommodate for the new size (after removal)\n // Note: Resize should not reset pan and zoom when disabling an element.\n // This is because we are only resizing the offscreen canvas to deal with the element\n // which was removed, and do not wish to alter the current state of any other currently enabled element\n const immediate = true;\n const keepCamera = true;\n this.resize(immediate, keepCamera);\n }\n\n /**\n * It takes an array of viewport input objects including element, viewportId, type\n * and defaultOptions. It will add the viewport to the rendering engine and enables them.\n *\n *\n * ```typescript\n *renderingEngine.setViewports([\n * {\n * viewportId: axialViewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element: document.getElementById('axialDiv'),\n * defaultOptions: {\n * orientation: Enums.OrientationAxis.AXIAL,\n * },\n * },\n * {\n * viewportId: sagittalViewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element: document.getElementById('sagittalDiv'),\n * defaultOptions: {\n * orientation: Enums.OrientationAxis.SAGITTAL,\n * },\n * },\n * {\n * viewportId: customOrientationViewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element: document.getElementById('customOrientationDiv'),\n * defaultOptions: {\n * orientation: { viewPlaneNormal: [0, 0, 1], viewUp: [0, 1, 0] },\n * },\n * },\n * ])\n * ```\n *\n * @fires Events.ELEMENT_ENABLED\n *\n * @param viewportInputEntries - Array\n */\n\n public setViewports(\n publicViewportInputEntries: Array\n ): void {\n const viewportInputEntries = this._normalizeViewportInputEntries(\n publicViewportInputEntries\n );\n this._throwIfDestroyed();\n this._reset();\n\n // 1. Split viewports based on whether they use vtk.js or a custom pipeline.\n\n const vtkDrivenViewportInputEntries: NormalizedViewportInput[] = [];\n const customRenderingViewportInputEntries: NormalizedViewportInput[] = [];\n\n viewportInputEntries.forEach((vpie) => {\n if (\n !this.useCPURendering &&\n !viewportTypeUsesCustomRenderingPipeline(vpie.type)\n ) {\n vtkDrivenViewportInputEntries.push(vpie);\n } else {\n customRenderingViewportInputEntries.push(vpie);\n }\n });\n\n this.setVtkjsDrivenViewports(vtkDrivenViewportInputEntries);\n this.setCustomViewports(customRenderingViewportInputEntries);\n }\n\n /**\n * Resizes the offscreen viewport and recalculates translations to on screen canvases.\n * It is up to the parent app to call the resize of the on-screen canvas changes.\n * This is left as an app level concern as one might want to debounce the changes, or the like.\n *\n * @param immediate - Whether all of the viewports should be rendered immediately.\n * @param keepCamera - Whether to keep the camera for other viewports while resizing the offscreen canvas\n */\n public resize(immediate = true, keepCamera = true): void {\n this._throwIfDestroyed();\n // 1. Get the viewports' canvases\n const viewports = this._getViewportsAsArray();\n\n const vtkDrivenViewports = [];\n const customRenderingViewports = [];\n\n viewports.forEach((vpie) => {\n if (!viewportTypeUsesCustomRenderingPipeline(vpie.type)) {\n vtkDrivenViewports.push(vpie);\n } else {\n customRenderingViewports.push(vpie);\n }\n });\n\n if (vtkDrivenViewports.length) {\n this._resizeVTKViewports(vtkDrivenViewports, keepCamera, immediate);\n }\n\n if (customRenderingViewports.length) {\n this._resizeUsingCustomResizeHandler(\n customRenderingViewports,\n keepCamera,\n immediate\n );\n }\n }\n\n /**\n * Returns the viewport by Id\n *\n * @returns viewport\n */\n public getViewport(viewportId: string): IStackViewport | IVolumeViewport {\n return this._viewports.get(viewportId);\n }\n\n /**\n * getViewports Returns an array of all `Viewport`s on the `RenderingEngine` instance.\n *\n * @returns Array of viewports\n */\n public getViewports(): Array {\n this._throwIfDestroyed();\n\n return this._getViewportsAsArray();\n }\n\n /**\n * Filters all the available viewports and return the stack viewports\n * @returns stack viewports registered on the rendering Engine\n */\n public getStackViewports(): Array {\n this._throwIfDestroyed();\n\n const viewports = this.getViewports();\n\n const isStackViewport = (\n viewport: IStackViewport | IVolumeViewport\n ): viewport is StackViewport => {\n return viewport instanceof StackViewport;\n };\n\n return viewports.filter(isStackViewport);\n }\n\n /**\n * Return all the viewports that are volume viewports\n * @returns An array of VolumeViewport objects.\n */\n public getVolumeViewports(): Array {\n this._throwIfDestroyed();\n\n const viewports = this.getViewports();\n\n const isVolumeViewport = (\n viewport: IStackViewport | IVolumeViewport\n ): viewport is BaseVolumeViewport => {\n return viewport instanceof BaseVolumeViewport;\n };\n\n return viewports.filter(isVolumeViewport);\n }\n\n /**\n * Renders all viewports on the next animation frame.\n *\n * @fires Events.IMAGE_RENDERED\n */\n public render(): void {\n const viewports = this.getViewports();\n const viewportIds = viewports.map((vp) => vp.id);\n\n this._setViewportsToBeRenderedNextFrame(viewportIds);\n }\n\n /**\n * Renders any viewports viewing the given Frame Of Reference.\n *\n * @param FrameOfReferenceUID - The unique identifier of the\n * Frame Of Reference.\n */\n public renderFrameOfReference = (FrameOfReferenceUID: string): void => {\n const viewports = this._getViewportsAsArray();\n const viewportIdsWithSameFrameOfReferenceUID = viewports.map((vp) => {\n if (vp.getFrameOfReferenceUID() === FrameOfReferenceUID) {\n return vp.id;\n }\n });\n\n return this.renderViewports(viewportIdsWithSameFrameOfReferenceUID);\n };\n\n /**\n * Renders the provided Viewport IDs.\n *\n */\n public renderViewports(viewportIds: Array): void {\n this._setViewportsToBeRenderedNextFrame(viewportIds);\n }\n\n /**\n * Renders only a specific `Viewport` on the next animation frame.\n *\n * @param viewportId - The Id of the viewport.\n */\n public renderViewport(viewportId: string): void {\n this._setViewportsToBeRenderedNextFrame([viewportId]);\n }\n\n /**\n * destroy the rendering engine. It will remove all the viewports and,\n * if the rendering engine is using the GPU, it will also destroy the GPU\n * resources.\n */\n public destroy(): void {\n if (this.hasBeenDestroyed) {\n return;\n }\n\n // remove vtk rendered first before resetting the viewport\n if (!this.useCPURendering) {\n const viewports = this._getViewportsAsArray();\n viewports.forEach((vp) => {\n this.offscreenMultiRenderWindow.removeRenderer(vp.id);\n });\n\n // Free up WebGL resources\n this.offscreenMultiRenderWindow.delete();\n\n // Make sure all references go stale and are garbage collected.\n delete this.offscreenMultiRenderWindow;\n }\n\n this._reset();\n renderingEngineCache.delete(this.id);\n\n this.hasBeenDestroyed = true;\n }\n\n /**\n * Fill the canvas with the background color\n * @param canvas - The canvas element to draw on.\n * @param backgroundColor - An array of three numbers between 0 and 1 that\n * specify the red, green, and blue values of the background color.\n */\n public fillCanvasWithBackgroundColor(\n canvas: HTMLCanvasElement,\n backgroundColor: [number, number, number]\n ): void {\n const ctx = canvas.getContext('2d');\n\n // Default to black if no background color is set\n let fillStyle;\n if (backgroundColor) {\n const rgb = backgroundColor.map((f) => Math.floor(255 * f));\n fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;\n } else {\n fillStyle = 'black';\n }\n\n // We draw over the previous stack with the background color while we\n // wait for the next stack to load\n ctx.fillStyle = fillStyle;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n private _normalizeViewportInputEntry(\n viewportInputEntry: PublicViewportInput\n ) {\n const { type, defaultOptions } = viewportInputEntry;\n let options = defaultOptions;\n\n if (!options || Object.keys(options).length === 0) {\n options = {\n background: [0, 0, 0],\n orientation: null,\n displayArea: null,\n };\n\n if (type === ViewportType.ORTHOGRAPHIC) {\n options = {\n ...options,\n orientation: OrientationAxis.AXIAL,\n };\n }\n }\n\n return {\n ...viewportInputEntry,\n defaultOptions: options,\n };\n }\n\n private _normalizeViewportInputEntries(\n viewportInputEntries: Array\n ): Array {\n const normalizedViewportInputs = [];\n\n viewportInputEntries.forEach((viewportInput) => {\n normalizedViewportInputs.push(\n this._normalizeViewportInputEntry(viewportInput)\n );\n });\n\n return normalizedViewportInputs;\n }\n\n private _resizeUsingCustomResizeHandler(\n customRenderingViewports: StackViewport[],\n keepCamera = true,\n immediate = true\n ) {\n // 1. If viewport has a custom resize method, call it here.\n customRenderingViewports.forEach((vp) => {\n if (typeof vp.resize === 'function') {\n vp.resize();\n }\n });\n\n // 3. Reset viewport cameras\n customRenderingViewports.forEach((vp) => {\n const prevCamera = vp.getCamera();\n vp.resetCamera();\n\n if (keepCamera) {\n vp.setCamera(prevCamera);\n }\n });\n\n // 2. If render is immediate: Render all\n if (immediate === true) {\n this.render();\n }\n }\n\n private _resizeVTKViewports(\n vtkDrivenViewports: Array,\n keepCamera = true,\n immediate = true\n ) {\n const canvasesDrivenByVtkJs = vtkDrivenViewports.map((vp) => vp.canvas);\n\n if (canvasesDrivenByVtkJs.length) {\n // 1. Recalculate and resize the offscreen canvas size\n const { offScreenCanvasWidth, offScreenCanvasHeight } =\n this._resizeOffScreenCanvas(canvasesDrivenByVtkJs);\n\n // 2. Recalculate the viewports location on the off screen canvas\n this._resize(\n vtkDrivenViewports,\n offScreenCanvasWidth,\n offScreenCanvasHeight\n );\n }\n\n // 3. Reset viewport cameras\n vtkDrivenViewports.forEach((vp: IStackViewport | IVolumeViewport) => {\n const canvas = getOrCreateCanvas(vp.element);\n const rect = canvas.getBoundingClientRect();\n const devicePixelRatio = window.devicePixelRatio || 1;\n canvas.width = rect.width * devicePixelRatio;\n canvas.height = rect.height * devicePixelRatio;\n\n const prevCamera = vp.getCamera();\n vp.resetCamera();\n\n if (keepCamera) {\n vp.setCamera(prevCamera);\n }\n });\n\n // 4. If render is immediate: Render all\n if (immediate === true) {\n this.render();\n }\n }\n\n /**\n * Enables a viewport to be driven by the offscreen vtk.js rendering engine.\n *\n * @param viewportInputEntry - Information object used to\n * construct and enable the viewport.\n */\n private enableVTKjsDrivenViewport(\n viewportInputEntry: NormalizedViewportInput\n ) {\n const viewports = this._getViewportsAsArray();\n const viewportsDrivenByVtkJs = viewports.filter(\n (vp) => viewportTypeUsesCustomRenderingPipeline(vp.type) === false\n );\n\n const canvasesDrivenByVtkJs = viewportsDrivenByVtkJs.map((vp) => vp.canvas);\n\n const canvas = getOrCreateCanvas(viewportInputEntry.element);\n canvasesDrivenByVtkJs.push(canvas);\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width * devicePixelRatio;\n canvas.height = rect.height * devicePixelRatio;\n\n // 2.c Calculating the new size for offScreen Canvas\n const { offScreenCanvasWidth, offScreenCanvasHeight } =\n this._resizeOffScreenCanvas(canvasesDrivenByVtkJs);\n\n // 2.d Re-position previous viewports on the offScreen Canvas based on the new\n // offScreen canvas size\n const xOffset = this._resize(\n viewportsDrivenByVtkJs,\n offScreenCanvasWidth,\n offScreenCanvasHeight\n );\n\n const internalViewportEntry = { ...viewportInputEntry, canvas };\n\n // 3 Add the requested viewport to rendering Engine\n this.addVtkjsDrivenViewport(internalViewportEntry, {\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n xOffset,\n });\n }\n\n /**\n * Disables the requested viewportId from the rendering engine:\n * 1) It removes the viewport from the the list of viewports\n * 2) remove the renderer from the offScreen render window\n * 3) resetting the viewport to remove the canvas attributes and canvas data\n * 4) resize the offScreen appropriately\n *\n * @param viewportId - viewport Id\n *\n */\n private _removeViewport(viewportId: string): void {\n // 1. Get the viewport\n const viewport = this.getViewport(viewportId);\n if (!viewport) {\n console.warn(`viewport ${viewportId} does not exist`);\n return;\n }\n\n // 2. Delete the viewports from the the viewports\n this._viewports.delete(viewportId);\n }\n\n /**\n * Adds a viewport driven by vtk.js to the `RenderingEngine`.\n *\n * @param viewportInputEntry - Information object used to construct and enable the viewport.\n * @param options - Options object used to configure the viewport.\n * @param options.offScreenCanvasWidth - The width of the offscreen canvas.\n * @param options.offScreenCanvasHeight - The height of the offscreen canvas.\n * @param options.xOffset - The x offset of the viewport on the offscreen canvas.\n */\n private addVtkjsDrivenViewport(\n viewportInputEntry: InternalViewportInput,\n offscreenCanvasProperties?: {\n offScreenCanvasWidth: number;\n offScreenCanvasHeight: number;\n xOffset: number;\n }\n ): void {\n const { element, canvas, viewportId, type, defaultOptions } =\n viewportInputEntry;\n\n // Make the element not focusable, we use this for modifier keys to work\n element.tabIndex = -1;\n\n const { offScreenCanvasWidth, offScreenCanvasHeight, xOffset } =\n offscreenCanvasProperties;\n\n // 1. Calculate the size of location of the viewport on the offScreen canvas\n const {\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n sx,\n sy,\n sWidth,\n sHeight,\n } = this._getViewportCoordsOnOffScreenCanvas(\n viewportInputEntry,\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n xOffset\n );\n\n // 2. Add a renderer to the offScreenMultiRenderWindow\n this.offscreenMultiRenderWindow.addRenderer({\n viewport: [\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n ],\n id: viewportId,\n background: defaultOptions.background\n ? defaultOptions.background\n : [0, 0, 0],\n });\n\n // 3. ViewportInput to be passed to a stack/volume viewport\n const viewportInput = {\n id: viewportId,\n element, // div\n renderingEngineId: this.id,\n type,\n canvas,\n sx,\n sy,\n sWidth,\n sHeight,\n defaultOptions: defaultOptions || {},\n };\n\n // 4. Create a proper viewport based on the type of the viewport\n let viewport;\n if (type === ViewportType.STACK) {\n // 4.a Create stack viewport\n viewport = new StackViewport(viewportInput);\n } else if (\n type === ViewportType.ORTHOGRAPHIC ||\n type === ViewportType.PERSPECTIVE\n ) {\n // 4.b Create a volume viewport\n viewport = new VolumeViewport(viewportInput);\n } else if (type === ViewportType.VOLUME_3D) {\n viewport = new VolumeViewport3D(viewportInput);\n } else {\n throw new Error(`Viewport Type ${type} is not supported`);\n }\n\n // 5. Storing the viewports\n this._viewports.set(viewportId, viewport);\n\n const eventDetail: EventTypes.ElementEnabledEventDetail = {\n element,\n viewportId,\n renderingEngineId: this.id,\n };\n\n if (!viewport.suppressEvents) {\n triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail);\n }\n }\n\n /**\n * Adds a viewport using a custom rendering pipeline to the `RenderingEngine`.\n *\n * @param viewportInputEntry - Information object used to\n * construct and enable the viewport.\n */\n private addCustomViewport(viewportInputEntry: PublicViewportInput): void {\n const { element, viewportId, type, defaultOptions } = viewportInputEntry;\n\n // Make the element not focusable, we use this for modifier keys to work\n element.tabIndex = -1;\n\n const canvas = getOrCreateCanvas(element);\n\n // Add a viewport with no offset\n const { clientWidth, clientHeight } = canvas;\n\n // Set the canvas to be same resolution as the client.\n // Note: This ignores devicePixelRatio for now. We may want to change it in the\n // future but it has no benefit for the Cornerstone CPU rendering pathway at the\n // moment anyway.\n if (canvas.width !== clientWidth || canvas.height !== clientHeight) {\n canvas.width = clientWidth;\n canvas.height = clientHeight;\n }\n\n const viewportInput = {\n id: viewportId,\n renderingEngineId: this.id,\n element, // div\n type,\n canvas,\n sx: 0, // No offset, uses own renderer\n sy: 0,\n sWidth: clientWidth,\n sHeight: clientHeight,\n defaultOptions: defaultOptions || {},\n };\n\n // 4. Create a proper viewport based on the type of the viewport\n\n if (type !== ViewportType.STACK) {\n // In the future these will need to be pluggable, but we aren't there yet\n // and these are just Stacks for now.\n throw new Error('Support for fully custom viewports not yet implemented');\n }\n\n // 4.a Create stack viewport\n const viewport = new StackViewport(viewportInput);\n\n // 5. Storing the viewports\n this._viewports.set(viewportId, viewport);\n\n const eventDetail: EventTypes.ElementEnabledEventDetail = {\n element,\n viewportId,\n renderingEngineId: this.id,\n };\n\n triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail);\n }\n\n /**\n * Sets multiple viewports using custom rendering\n * pipelines to the `RenderingEngine`.\n *\n * @param viewportInputEntries - An array of information\n * objects used to construct and enable the viewports.\n */\n private setCustomViewports(viewportInputEntries: PublicViewportInput[]) {\n viewportInputEntries.forEach((vpie) => this.addCustomViewport(vpie));\n }\n\n /**\n * Sets multiple vtk.js driven viewports to\n * the `RenderingEngine`.\n *\n * @param viewportInputEntries - An array of information\n * objects used to construct and enable the viewports.\n */\n private setVtkjsDrivenViewports(\n viewportInputEntries: NormalizedViewportInput[]\n ) {\n // Deal with vtkjs driven viewports\n if (viewportInputEntries.length) {\n // 1. Getting all the canvases from viewports calculation of the new offScreen size\n const vtkDrivenCanvases = viewportInputEntries.map((vp) =>\n getOrCreateCanvas(vp.element)\n );\n\n // Ensure the canvas size includes any scaling due to device pixel ratio\n vtkDrivenCanvases.forEach((canvas) => {\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width * devicePixelRatio;\n canvas.height = rect.height * devicePixelRatio;\n });\n\n // 2. Set canvas size based on height and sum of widths\n const { offScreenCanvasWidth, offScreenCanvasHeight } =\n this._resizeOffScreenCanvas(vtkDrivenCanvases);\n\n /*\n TODO: Commenting this out until we can mock the Canvas usage in the tests (or use jsdom?)\n if (!offScreenCanvasWidth || !offScreenCanvasHeight) {\n throw new Error('Invalid offscreen canvas width or height')\n }*/\n\n // 3. Adding the viewports based on the viewportInputEntry definition to the\n // rendering engine.\n let xOffset = 0;\n for (let i = 0; i < viewportInputEntries.length; i++) {\n const vtkDrivenViewportInputEntry = viewportInputEntries[i];\n const canvas = vtkDrivenCanvases[i];\n const internalViewportEntry = {\n ...vtkDrivenViewportInputEntry,\n canvas,\n };\n\n this.addVtkjsDrivenViewport(internalViewportEntry, {\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n xOffset,\n });\n\n // Incrementing the xOffset which provides the horizontal location of each\n // viewport on the offScreen canvas\n xOffset += canvas.width;\n }\n }\n }\n\n /**\n * Resizes the offscreen canvas based on the provided vtk.js driven canvases.\n *\n * @param canvases - An array of HTML Canvas\n */\n private _resizeOffScreenCanvas(\n canvasesDrivenByVtkJs: Array\n ): { offScreenCanvasWidth: number; offScreenCanvasHeight: number } {\n const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this;\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // 1. Calculated the height of the offScreen canvas to be the maximum height\n // between canvases\n const offScreenCanvasHeight = Math.max(\n ...canvasesDrivenByVtkJs.map(\n (canvas) => canvas.clientHeight * devicePixelRatio\n )\n );\n\n // 2. Calculating the width of the offScreen canvas to be the sum of all\n let offScreenCanvasWidth = 0;\n\n canvasesDrivenByVtkJs.forEach((canvas) => {\n offScreenCanvasWidth += canvas.clientWidth * devicePixelRatio;\n });\n\n offScreenCanvasContainer.width = offScreenCanvasWidth;\n offScreenCanvasContainer.height = offScreenCanvasHeight;\n\n // 3. Resize command\n offscreenMultiRenderWindow.resize();\n\n return { offScreenCanvasWidth, offScreenCanvasHeight };\n }\n\n /**\n * Recalculates and updates the viewports location on the offScreen canvas upon its resize\n *\n * @param viewports - An array of viewports\n * @param offScreenCanvasWidth - new offScreen canvas width\n * @param offScreenCanvasHeight - new offScreen canvas height\n *\n * @returns _xOffset the final offset which will be used for the next viewport\n */\n private _resize(\n viewportsDrivenByVtkJs: Array,\n offScreenCanvasWidth: number,\n offScreenCanvasHeight: number\n ): number {\n // Redefine viewport properties\n let _xOffset = 0;\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n for (let i = 0; i < viewportsDrivenByVtkJs.length; i++) {\n const viewport = viewportsDrivenByVtkJs[i];\n const {\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n sx,\n sy,\n sWidth,\n sHeight,\n } = this._getViewportCoordsOnOffScreenCanvas(\n viewport,\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n _xOffset\n );\n\n _xOffset += viewport.canvas.clientWidth * devicePixelRatio;\n\n viewport.sx = sx;\n viewport.sy = sy;\n viewport.sWidth = sWidth;\n viewport.sHeight = sHeight;\n\n // Updating the renderer for the viewport\n const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id);\n renderer.setViewport([\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n ]);\n }\n\n // Returns the final xOffset\n return _xOffset;\n }\n\n /**\n * Calculates the location of the provided viewport on the offScreenCanvas\n *\n * @param viewports - An array of viewports\n * @param offScreenCanvasWidth - new offScreen canvas width\n * @param offScreenCanvasHeight - new offScreen canvas height\n * @param _xOffset - xOffSet to draw\n */\n private _getViewportCoordsOnOffScreenCanvas(\n viewport: InternalViewportInput | IStackViewport | IVolumeViewport,\n offScreenCanvasWidth: number,\n offScreenCanvasHeight: number,\n _xOffset: number\n ): ViewportDisplayCoords {\n const { canvas } = viewport;\n const { clientWidth, clientHeight } = canvas;\n const devicePixelRatio = window.devicePixelRatio || 1;\n const height = clientHeight * devicePixelRatio;\n const width = clientWidth * devicePixelRatio;\n\n // Update the canvas drawImage offsets.\n const sx = _xOffset;\n const sy = 0;\n const sWidth = width;\n const sHeight = height;\n\n const sxStartDisplayCoords = sx / offScreenCanvasWidth;\n\n // Need to offset y if it not max height\n const syStartDisplayCoords =\n sy + (offScreenCanvasHeight - height) / offScreenCanvasHeight;\n\n const sWidthDisplayCoords = sWidth / offScreenCanvasWidth;\n const sHeightDisplayCoords = sHeight / offScreenCanvasHeight;\n\n return {\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords: sxStartDisplayCoords + sWidthDisplayCoords,\n syEndDisplayCoords: syStartDisplayCoords + sHeightDisplayCoords,\n sx,\n sy,\n sWidth,\n sHeight,\n };\n }\n\n /**\n * @method _getViewportsAsArray Returns an array of all viewports\n *\n * @returns {Array} Array of viewports.\n */\n private _getViewportsAsArray() {\n return Array.from(this._viewports.values());\n }\n\n private _setViewportsToBeRenderedNextFrame(viewportIds: string[]) {\n // Add the viewports to the set of flagged viewports\n viewportIds.forEach((viewportId) => {\n this._needsRender.add(viewportId);\n });\n\n // Render any flagged viewports\n this._render();\n }\n\n /**\n * Sets up animation frame if necessary\n */\n private _render() {\n // If we have viewports that need rendering and we have not already\n // set the RAF callback to run on the next frame.\n if (this._needsRender.size > 0 && this._animationFrameSet === false) {\n this._animationFrameHandle = window.requestAnimationFrame(\n this._renderFlaggedViewports\n );\n\n // Set the flag that we have already set up the next RAF call.\n this._animationFrameSet = true;\n }\n }\n\n /**\n * Renders all viewports.\n */\n private _renderFlaggedViewports = () => {\n this._throwIfDestroyed();\n\n if (!this.useCPURendering) {\n this.performVtkDrawCall();\n }\n\n const viewports = this._getViewportsAsArray();\n const eventDetailArray = [];\n\n for (let i = 0; i < viewports.length; i++) {\n const viewport = viewports[i];\n if (this._needsRender.has(viewport.id)) {\n const eventDetail =\n this.renderViewportUsingCustomOrVtkPipeline(viewport);\n eventDetailArray.push(eventDetail);\n viewport.setRendered();\n\n // This viewport has been rendered, we can remove it from the set\n this._needsRender.delete(viewport.id);\n\n // If there is nothing left that is flagged for rendering, stop the loop\n if (this._needsRender.size === 0) {\n break;\n }\n }\n }\n\n // allow RAF to be called again\n this._animationFrameSet = false;\n this._animationFrameHandle = null;\n\n eventDetailArray.forEach((eventDetail) => {\n // Very small viewports won't have an element\n if (!eventDetail?.element) {\n return;\n }\n triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail);\n });\n };\n\n /**\n * Performs the single `vtk.js` draw call which is used to render the offscreen\n * canvas for vtk.js. This is a bulk rendering step for all Volume and Stack\n * viewports when GPU rendering is available.\n */\n private performVtkDrawCall() {\n // Render all viewports under vtk.js' control.\n const { offscreenMultiRenderWindow } = this;\n const renderWindow = offscreenMultiRenderWindow.getRenderWindow();\n\n const renderers = offscreenMultiRenderWindow.getRenderers();\n\n if (!renderers.length) {\n return;\n }\n\n for (let i = 0; i < renderers.length; i++) {\n const { renderer, id } = renderers[i];\n\n // Requesting viewports that need rendering to be rendered only\n if (this._needsRender.has(id)) {\n renderer.setDraw(true);\n } else {\n renderer.setDraw(false);\n }\n }\n\n renderWindow.render();\n\n // After redraw we set all renderers to not render until necessary\n for (let i = 0; i < renderers.length; i++) {\n renderers[i].renderer.setDraw(false);\n }\n }\n\n /**\n * Renders the given viewport\n * using its proffered method.\n *\n * @param viewport - The viewport to render\n */\n private renderViewportUsingCustomOrVtkPipeline(\n viewport: IStackViewport | IVolumeViewport\n ): EventTypes.ImageRenderedEventDetail[] {\n let eventDetail;\n\n // Rendering engines start having issues without at least two pixels\n // in each direction\n if (\n viewport.sWidth < VIEWPORT_MIN_SIZE ||\n viewport.sHeight < VIEWPORT_MIN_SIZE\n ) {\n console.log('Viewport is too small', viewport.sWidth, viewport.sHeight);\n return;\n }\n if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) {\n eventDetail =\n viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail;\n } else {\n if (this.useCPURendering) {\n throw new Error(\n 'GPU not available, and using a viewport with no custom render pipeline.'\n );\n }\n\n const { offscreenMultiRenderWindow } = this;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const context = openGLRenderWindow.get3DContext();\n const offScreenCanvas = context.canvas;\n\n eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas(\n viewport,\n offScreenCanvas\n );\n }\n\n return eventDetail;\n }\n\n /**\n * Renders a particular `Viewport`'s on screen canvas.\n * @param viewport - The `Viewport` to render.\n * @param offScreenCanvas - The offscreen canvas to render from.\n */\n private _renderViewportFromVtkCanvasToOnscreenCanvas(\n viewport: IStackViewport | IVolumeViewport,\n offScreenCanvas\n ): EventTypes.ImageRenderedEventDetail {\n const {\n element,\n canvas,\n sx,\n sy,\n sWidth,\n sHeight,\n id: viewportId,\n renderingEngineId,\n suppressEvents,\n } = viewport;\n\n const { width: dWidth, height: dHeight } = canvas;\n\n const onScreenContext = canvas.getContext('2d');\n\n onScreenContext.drawImage(\n offScreenCanvas,\n sx,\n sy,\n sWidth,\n sHeight,\n 0, //dx\n 0, // dy\n dWidth,\n dHeight\n );\n\n return {\n element,\n suppressEvents,\n viewportId,\n renderingEngineId,\n viewportStatus: viewport.viewportStatus,\n };\n }\n\n /**\n * Reset the viewport by removing the data attributes\n * and clearing the context of draw. It also emits an element disabled event\n *\n * @param viewport - The `Viewport` to render.\n */\n private _resetViewport(viewport: IStackViewport | IVolumeViewport) {\n const renderingEngineId = this.id;\n\n const { element, canvas, id: viewportId } = viewport;\n\n const eventDetail: EventTypes.ElementDisabledEventDetail = {\n element,\n viewportId,\n renderingEngineId,\n };\n\n // Trigger first before removing the data attributes, as we need the enabled\n // element to remove tools associated with the viewport\n triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail);\n\n element.removeAttribute('data-viewport-uid');\n element.removeAttribute('data-rendering-engine-uid');\n\n // clear drawing\n const context = canvas.getContext('2d');\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private _clearAnimationFrame() {\n window.cancelAnimationFrame(this._animationFrameHandle);\n\n this._needsRender.clear();\n this._animationFrameSet = false;\n this._animationFrameHandle = null;\n }\n\n /**\n * Resets the `RenderingEngine`\n */\n private _reset() {\n const viewports = this._getViewportsAsArray();\n\n viewports.forEach((viewport) => {\n this._resetViewport(viewport);\n });\n\n this._clearAnimationFrame();\n\n this._viewports = new Map();\n }\n\n /**\n * Throws an error if trying to interact with the `RenderingEngine`\n * instance after its `destroy` method has been called.\n */\n private _throwIfDestroyed() {\n if (this.hasBeenDestroyed) {\n throw new Error(\n 'this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.'\n );\n }\n }\n\n // debugging utils for offScreen canvas\n _downloadOffScreenCanvas() {\n const dataURL = this._debugRender();\n _TEMPDownloadURI(dataURL);\n }\n\n // debugging utils for offScreen canvas\n _debugRender(): void {\n const { offscreenMultiRenderWindow } = this;\n const renderWindow = offscreenMultiRenderWindow.getRenderWindow();\n\n const renderers = offscreenMultiRenderWindow.getRenderers();\n\n for (let i = 0; i < renderers.length; i++) {\n renderers[i].renderer.setDraw(true);\n }\n\n renderWindow.render();\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const context = openGLRenderWindow.get3DContext();\n\n const offScreenCanvas = context.canvas;\n const dataURL = offScreenCanvas.toDataURL();\n\n this._getViewportsAsArray().forEach((viewport) => {\n const { sx, sy, sWidth, sHeight } = viewport;\n\n const canvas = viewport.canvas;\n const { width: dWidth, height: dHeight } = canvas;\n\n const onScreenContext = canvas.getContext('2d');\n\n //sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight\n onScreenContext.drawImage(\n offScreenCanvas,\n sx,\n sy,\n sWidth,\n sHeight,\n 0, //dx\n 0, // dy\n dWidth,\n dHeight\n );\n });\n\n return dataURL;\n }\n}\n\nexport default RenderingEngine;\n\n// debugging utils for offScreen canvas\nfunction _TEMPDownloadURI(uri) {\n const link = document.createElement('a');\n\n link.download = 'viewport.png';\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","import RenderingEngine from './RenderingEngine';\nimport getRenderingEngine from './getRenderingEngine';\nimport VolumeViewport from './VolumeViewport';\nimport StackViewport from './StackViewport';\nimport VolumeViewport3D from './VolumeViewport3D';\nimport {\n createVolumeActor,\n createVolumeMapper,\n getOrCreateCanvas,\n} from './helpers';\n\nexport {\n getRenderingEngine,\n RenderingEngine,\n VolumeViewport,\n VolumeViewport3D,\n createVolumeActor,\n createVolumeMapper,\n getOrCreateCanvas,\n StackViewport,\n};\n\nexport default RenderingEngine;\n","import { RequestPoolManager } from './requestPoolManager';\nimport RequestType from '../enums/RequestType';\n\n/**\n * ImageRetrievalPoolManager\n * You don't need to directly use the imageRetrievalPoolManager to load images\n * since the imageLoadPoolManager will automatically use it for retrieval. However,\n * maximum number of concurrent requests can be set by calling `setMaxConcurrentRequests`.\n *\n * Retrieval (usually) === XHR requests\n */\nconst imageRetrievalPoolManager = new RequestPoolManager('imageRetrievalPool');\n\nimageRetrievalPoolManager.setMaxSimultaneousRequests(\n RequestType.Interaction,\n 200\n);\nimageRetrievalPoolManager.setMaxSimultaneousRequests(\n RequestType.Thumbnail,\n 200\n);\nimageRetrievalPoolManager.setMaxSimultaneousRequests(RequestType.Prefetch, 200);\nimageRetrievalPoolManager.grabDelay = 0;\n\nexport default imageRetrievalPoolManager;\n","/*\n * Constants\n */\n\nconst DEFAULT_SETTINGS = Symbol('DefaultSettings');\nconst RUNTIME_SETTINGS = Symbol('RuntimeSettings');\nconst OBJECT_SETTINGS_MAP = Symbol('ObjectSettingsMap');\nconst DICTIONARY = Symbol('Dictionary');\n\n/**\n * Settings\n */\nexport default class Settings {\n constructor(base?: Settings) {\n const dictionary = Object.create(\n base instanceof Settings && DICTIONARY in base ? base[DICTIONARY] : null\n );\n Object.seal(\n Object.defineProperty(this, DICTIONARY, {\n value: dictionary,\n })\n );\n }\n\n set(key: string, value: unknown): boolean {\n return set(this[DICTIONARY], key, value, null);\n }\n\n get(key: string): unknown {\n return get(this[DICTIONARY], key);\n }\n\n /**\n * Unset a specific key or a set of keys within a namespace when the key ends with a dot (ASCII #46).\n * If the key is \".\", all keys will be removed and this command works as a reset.\n * @param key - name The key to be unset or a namespace.\n * @returns boolean\n */\n unset(key: string): boolean {\n return unset(this[DICTIONARY], key + '');\n }\n\n forEach(callback: (key: string, value: unknown) => void): void {\n iterate(this[DICTIONARY], callback);\n }\n\n extend(): Settings {\n return new Settings(this);\n }\n\n /**\n * Recursively import all properties from the given plain JavaScript object.\n * This method has the opposite effect of the `dump` method.\n * @param root - The root object whose properties will\n * be imported.\n */\n import(root: Record): void {\n if (isPlainObject(root)) {\n Object.keys(root).forEach((key) => {\n set(this[DICTIONARY], key, root[key], null);\n });\n }\n }\n\n /**\n * Build a JSON representation of the current internal state of this settings\n * object. The returned object can be safely passed to `JSON.stringify`\n * function.\n * @returns The JSON representation of the current\n * state of this settings instance\n */\n dump(): Record {\n const context = {};\n iterate(this[DICTIONARY], (key, value) => {\n if (typeof value !== 'undefined') {\n deepSet(context, key, value);\n }\n });\n return context;\n }\n\n static assert(subject: Settings): Settings {\n return subject instanceof Settings\n ? subject\n : Settings.getRuntimeSettings();\n }\n\n static getDefaultSettings(subfield = null): Settings | any {\n let defaultSettings = Settings[DEFAULT_SETTINGS];\n if (!(defaultSettings instanceof Settings)) {\n defaultSettings = new Settings();\n Settings[DEFAULT_SETTINGS] = defaultSettings;\n }\n\n // Given subfield of 'segmentation' it will return all settings\n // that starts with segmentation.*\n if (subfield) {\n const settingObj = {};\n defaultSettings.forEach((name: string) => {\n if (name.startsWith(subfield)) {\n const setting = name.split(`${subfield}.`)[1];\n settingObj[setting] = defaultSettings.get(name);\n }\n });\n return settingObj;\n }\n\n return defaultSettings;\n }\n\n static getRuntimeSettings(): Settings {\n let runtimeSettings = Settings[RUNTIME_SETTINGS];\n if (!(runtimeSettings instanceof Settings)) {\n runtimeSettings = new Settings(Settings.getDefaultSettings());\n Settings[RUNTIME_SETTINGS] = runtimeSettings;\n }\n return runtimeSettings;\n }\n\n static getObjectSettings(subject: unknown, from?: unknown): Settings {\n let settings = null;\n if (subject instanceof Settings) {\n settings = subject;\n } else if (typeof subject === 'object' && subject !== null) {\n let objectSettingsMap = Settings[OBJECT_SETTINGS_MAP];\n if (!(objectSettingsMap instanceof WeakMap)) {\n objectSettingsMap = new WeakMap();\n Settings[OBJECT_SETTINGS_MAP] = objectSettingsMap;\n }\n settings = objectSettingsMap.get(subject);\n if (!(settings instanceof Settings)) {\n settings = new Settings(\n Settings.assert(Settings.getObjectSettings(from))\n );\n objectSettingsMap.set(subject, settings);\n }\n }\n return settings;\n }\n\n static extendRuntimeSettings(): Settings {\n return Settings.getRuntimeSettings().extend();\n }\n}\n\n/*\n * Local Helpers\n */\n\nfunction unset(dictionary: Record, name: string): boolean {\n if (name.endsWith('.')) {\n let deleteCount = 0;\n const namespace = name;\n const base = namespace.slice(0, -1);\n const deleteAll = base.length === 0;\n for (const key in dictionary) {\n if (\n Object.prototype.hasOwnProperty.call(dictionary, key) &&\n (deleteAll || key.startsWith(namespace) || key === base)\n ) {\n delete dictionary[key];\n ++deleteCount;\n }\n }\n return deleteCount > 0;\n }\n return delete dictionary[name];\n}\n\nfunction iterate(\n dictionary: Record,\n callback: (key: string, value: unknown) => void\n): void {\n for (const key in dictionary) {\n callback(key, dictionary[key]);\n }\n}\n\nfunction setAll(\n dictionary: Record,\n prefix: string,\n record: Record,\n references: WeakSet>\n): boolean {\n let failCount: number;\n if (references.has(record)) {\n return set(dictionary, prefix, null, references);\n }\n references.add(record);\n failCount = 0;\n for (const field in record) {\n if (Object.prototype.hasOwnProperty.call(record, field)) {\n const key = field.length === 0 ? prefix : `${prefix}.${field}`;\n if (!set(dictionary, key, record[field], references)) {\n ++failCount;\n }\n }\n }\n references.delete(record);\n return failCount === 0;\n}\n\n/**\n * Set the key-value pair on a given dictionary. If the given value is a\n * plain javascript object, every property of that object will also be set.\n * @param dictionary {Record} The target dictionary\n * @param key {string} The given key\n * @param value {unknown} The given value\n * @param references {WeakSet>} references is a WeakSet\n * instance used to keep track of which objects have already been iterated\n * through preventing thus possible stack overflows caused by cyclic references\n * @returns {boolean} Returns true if every given key-value pair has been\n * successfully set\n */\nfunction set(\n dictionary: Record,\n key: string,\n value: unknown,\n references: WeakSet>\n): boolean {\n if (isValidKey(key)) {\n if (isPlainObject(value)) {\n return setAll(\n dictionary,\n key,\n value as Record,\n references instanceof WeakSet ? references : new WeakSet()\n );\n }\n dictionary[key] = value;\n return true;\n }\n return false;\n}\n\nfunction get(dictionary: Record, key: string): unknown {\n return dictionary[key];\n}\n\n/**\n * Make sure the -provided key correctly formatted.\n * e.g.:\n * \"my.cool.property\" (valid)\n * \"my.cool.property.\" (invalid)\n * \".my.cool.property\" (invalid)\n * \"my.cool..property\" (invalid)\n * @param key {string} The property name to be used as key within the internal\n * dictionary\n * @returns {boolean} True on success, false otherwise\n */\nfunction isValidKey(key: string): boolean {\n let last: number, current: number, previous: number;\n if (typeof key !== 'string' || (last = key.length - 1) < 0) {\n return false;\n }\n previous = -1;\n while ((current = key.indexOf('.', previous + 1)) >= 0) {\n if (current - previous < 2 || current === last) {\n return false;\n }\n previous = current;\n }\n return true;\n}\n\nfunction isPlainObject(subject: unknown) {\n if (typeof subject === 'object' && subject !== null) {\n const prototype = Object.getPrototypeOf(subject);\n if (prototype === Object.prototype || prototype === null) {\n return true;\n }\n }\n return false;\n}\n\nfunction deepSet(context, key, value) {\n const separator = key.indexOf('.');\n if (separator >= 0) {\n const subKey = key.slice(0, separator);\n let subContext = context[subKey];\n if (typeof subContext !== 'object' || subContext === null) {\n const subContextValue = subContext;\n subContext = {};\n if (typeof subContextValue !== 'undefined') {\n subContext[''] = subContextValue;\n }\n context[subKey] = subContext;\n }\n deepSet(subContext, key.slice(separator + 1, key.length), value);\n } else {\n context[key] = value;\n }\n}\n\n/**\n * Initial Settings for the repository\n */\nSettings.getDefaultSettings().set('useCursors', true);\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n","import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n","export const durationSecond = 1000;\nexport const durationMinute = durationSecond * 60;\nexport const durationHour = durationMinute * 60;\nexport const durationDay = durationHour * 24;\nexport const durationWeek = durationDay * 7;\nexport const durationMonth = durationDay * 30;\nexport const durationYear = durationDay * 365;\n","import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n","import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"g\": formatYearISO,\n \"G\": formatFullYearISO,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"g\": formatUTCYearISO,\n \"G\": formatUTCFullYearISO,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"g\": parseYear,\n \"G\": parseFullYear,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {utcFormat} from \"./defaultLocale.js\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat.js\";\nimport {utcParse} from \"./defaultLocale.js\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { vec3, mat4 } from 'gl-matrix';\nimport * as d3 from 'd3-scale';\nimport { L as normalize2D, M as nearestPowerOfTwo } from '../../Common/Core/Math/index.js';\nimport macro from '../../macros.js';\nimport vtkActor from './Actor.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkMapper from './Mapper.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkTexture from './Texture.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// vtkCubeAxesActor\n// ----------------------------------------------------------------------------\n// faces are -x x -y y -z z\n// point 0 is 0,0,0 and then +x fastest changing, +y then +z\n\nvar faceNormals = [[-1, 0, 0], [1, 0, 0], [0, -1, 0], [0, 1, 0], [0, 0, -1], [0, 0, 1]];\nvar faceEdges = [[8, 7, 11, 3], [9, 1, 10, 5], [4, 9, 0, 8], [2, 11, 6, 10], [0, 3, 2, 1], [4, 5, 6, 7]];\nvar edgePoints = [[0, 1], [1, 3], [2, 3], [0, 2], [4, 5], [5, 7], [6, 7], [4, 6], [0, 4], [1, 5], [3, 7], [2, 6]];\nvar edgeAxes = [0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2];\nvar faceAxes = [[1, 2], [1, 2], [0, 2], [0, 2], [0, 1], [0, 1]]; //\n// Developer note: This class is broken into the main class and a helper\n// class. The main class holds view independent properties (those properties\n// that do not change as the view's resolution/aspect ratio change). The\n// helper class is instantiated one per view and holds properties that can\n// depend on view specific values such as resolution. The helper class code\n// could have been left to the View specific implementation (such as\n// vtkWebGPUCubeAxesActor) but is instead placed here to it can be shared by\n// multiple rendering backends.\n//\n// some shared temp variables to reduce heap allocs\n\nvar ptv3 = new Float64Array(3);\nvar pt2v3 = new Float64Array(3);\nvar tmpv3 = new Float64Array(3);\nvar tmp2v3 = new Float64Array(3);\nvar xDir = new Float64Array(3);\nvar yDir = new Float64Array(3);\nvar invmat = new Float64Array(16);\n\nfunction applyTextStyle(ctx, style) {\n ctx.strokeStyle = style.strokeColor;\n ctx.lineWidth = style.strokeSize;\n ctx.fillStyle = style.fontColor;\n ctx.font = \"\".concat(style.fontStyle, \" \").concat(style.fontSize, \"px \").concat(style.fontFamily);\n} // many properties of this actor depend on the API specific view The main\n// dependency being the resolution as that drives what font sizes to use.\n// Bacause of this we need to do some of the calculations in a API specific\n// subclass. But... we don't want a lot of duplicated code between WebGL and\n// WebGPU for example so we have this helper class, that is designed to be\n// fairly API independent so that API specific views can call this to do\n// most of the work.\n\n\nfunction vtkCubeAxesActorHelper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCubeAxesActorHelper');\n\n publicAPI.setRenderable = function (renderable) {\n if (model.renderable === renderable) {\n return;\n }\n\n model.renderable = renderable;\n model.tmActor.addTexture(model.renderable.getTmTexture());\n model.tmActor.setProperty(renderable.getProperty());\n model.tmActor.setParentProp(renderable);\n publicAPI.modified();\n }; // called by updateTexturePolyData\n\n\n publicAPI.createPolyDataForOneLabel = function (text, pos, cmat, imat, dir, offset, results) {\n var value = model.renderable.get_tmAtlas().get(text);\n\n if (!value) {\n return;\n }\n\n var coords = model.renderable.getTextPolyData().getPoints().getData(); // compute pixel to distance factors\n\n var size = model.lastSize;\n ptv3[0] = coords[pos * 3];\n ptv3[1] = coords[pos * 3 + 1];\n ptv3[2] = coords[pos * 3 + 2];\n vec3.transformMat4(tmpv3, ptv3, cmat); // moving 0.1 in NDC\n\n tmpv3[0] += 0.1;\n vec3.transformMat4(pt2v3, tmpv3, imat); // results in WC move of\n\n vec3.subtract(xDir, pt2v3, ptv3);\n tmpv3[0] -= 0.1;\n tmpv3[1] += 0.1;\n vec3.transformMat4(pt2v3, tmpv3, imat); // results in WC move of\n\n vec3.subtract(yDir, pt2v3, ptv3);\n\n for (var i = 0; i < 3; i++) {\n xDir[i] /= 0.5 * 0.1 * size[0];\n yDir[i] /= 0.5 * 0.1 * size[1];\n } // have to find the four corners of the texture polygon for this label\n // convert anchor point to View Coords\n\n\n var ptIdx = results.ptIdx;\n var cellIdx = results.cellIdx;\n ptv3[0] = coords[pos * 3];\n ptv3[1] = coords[pos * 3 + 1];\n ptv3[2] = coords[pos * 3 + 2]; // horizontal left, right, or middle alignment based on dir[0]\n\n if (dir[0] < -0.5) {\n vec3.scale(tmpv3, xDir, dir[0] * offset - value.width);\n } else if (dir[0] > 0.5) {\n vec3.scale(tmpv3, xDir, dir[0] * offset);\n } else {\n vec3.scale(tmpv3, xDir, dir[0] * offset - value.width / 2.0);\n }\n\n vec3.add(ptv3, ptv3, tmpv3);\n vec3.scale(tmpv3, yDir, dir[1] * offset - value.height / 2.0);\n vec3.add(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[0];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[1];\n ptIdx++;\n vec3.scale(tmpv3, xDir, value.width);\n vec3.add(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[2];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[3];\n ptIdx++;\n vec3.scale(tmpv3, yDir, value.height);\n vec3.add(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[4];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[5];\n ptIdx++;\n vec3.scale(tmpv3, xDir, value.width);\n vec3.subtract(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[6];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[7];\n ptIdx++; // add the two triangles to represent the quad\n\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 3;\n results.polys[cellIdx * 4 + 3] = ptIdx - 2;\n cellIdx++;\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 2;\n results.polys[cellIdx * 4 + 3] = ptIdx - 1;\n results.ptIdx += 4;\n results.cellIdx += 2;\n }; // update the polydata associated with drawing the text labels\n // specifically the quads used for each label and their associated tcoords\n // etc. This changes every time the camera viewpoint changes\n\n\n publicAPI.updateTexturePolyData = function () {\n var cmat = model.camera.getCompositeProjectionMatrix(model.lastAspectRatio, -1, 1);\n mat4.transpose(cmat, cmat); // update the polydata\n\n var numLabels = model.renderable.getTextValues().length;\n var numPts = numLabels * 4;\n var numTris = numLabels * 2;\n var points = new Float64Array(numPts * 3);\n var polys = new Uint16Array(numTris * 4);\n var tcoords = new Float32Array(numPts * 2);\n mat4.invert(invmat, cmat);\n var results = {\n ptIdx: 0,\n cellIdx: 0,\n polys: polys,\n points: points,\n tcoords: tcoords\n };\n var ptIdx = 0;\n var textIdx = 0;\n var axisIdx = 0;\n var coords = model.renderable.getTextPolyData().getPoints().getData();\n var textValues = model.renderable.getTextValues();\n\n while (ptIdx < coords.length / 3) {\n // compute the direction to move out\n ptv3[0] = coords[ptIdx * 3];\n ptv3[1] = coords[ptIdx * 3 + 1];\n ptv3[2] = coords[ptIdx * 3 + 2];\n vec3.transformMat4(tmpv3, ptv3, cmat);\n ptv3[0] = coords[ptIdx * 3 + 3];\n ptv3[1] = coords[ptIdx * 3 + 4];\n ptv3[2] = coords[ptIdx * 3 + 5];\n vec3.transformMat4(tmp2v3, ptv3, cmat);\n vec3.subtract(tmpv3, tmpv3, tmp2v3);\n var dir = [tmpv3[0], tmpv3[1]];\n normalize2D(dir); // write the axis label\n\n publicAPI.createPolyDataForOneLabel(textValues[textIdx], ptIdx, cmat, invmat, dir, model.renderable.getAxisTitlePixelOffset(), results);\n ptIdx += 2;\n textIdx++; // write the tick labels\n\n for (var t = 0; t < model.renderable.getTickCounts()[axisIdx]; t++) {\n publicAPI.createPolyDataForOneLabel(textValues[textIdx], ptIdx, cmat, invmat, dir, model.renderable.getTickLabelPixelOffset(), results);\n ptIdx++;\n textIdx++;\n }\n\n axisIdx++;\n }\n\n var tcoordDA = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoords,\n name: 'TextureCoordinates'\n });\n model.tmPolyData.getPointData().setTCoords(tcoordDA);\n model.tmPolyData.getPoints().setData(points, 3);\n model.tmPolyData.getPoints().modified();\n model.tmPolyData.getPolys().setData(polys, 1);\n model.tmPolyData.getPolys().modified();\n model.tmPolyData.modified();\n };\n\n publicAPI.updateAPISpecificData = function (size, camera, renderWindow) {\n // has the size changed?\n if (model.lastSize[0] !== size[0] || model.lastSize[1] !== size[1]) {\n model.lastSize[0] = size[0];\n model.lastSize[1] = size[1];\n model.lastAspectRatio = size[0] / size[1];\n model.forceUpdate = true;\n }\n\n model.camera = camera; // compute bounds for label quads whenever the camera changes\n\n publicAPI.updateTexturePolyData();\n };\n}\n\nvar newCubeAxesActorHelper = macro.newInstance(function (publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n renderable: null\n };\n Object.assign(model, {}, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n model.tmPolyData = vtkPolyData.newInstance();\n model.tmMapper = vtkMapper.newInstance();\n model.tmMapper.setInputData(model.tmPolyData);\n model.tmActor = vtkActor.newInstance({\n parentProp: publicAPI\n });\n model.tmActor.setMapper(model.tmMapper);\n macro.setGet(publicAPI, model, ['renderable']);\n macro.get(publicAPI, model, ['lastSize', 'lastAspectRatio', 'axisTextStyle', 'tickTextStyle', 'tmActor', 'ticks']);\n model.forceUpdate = false;\n model.lastRedrawTime = {};\n macro.obj(model.lastRedrawTime, {\n mtime: 0\n });\n model.lastRebuildTime = {};\n macro.obj(model.lastRebuildTime, {\n mtime: 0\n });\n model.lastSize = [-1, -1]; // internal variables\n\n model.lastTickBounds = [];\n vtkCubeAxesActorHelper(publicAPI, model);\n}, 'vtkCubeAxesActorHelper');\n\nfunction vtkCubeAxesActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCubeAxesActor');\n\n publicAPI.setCamera = function (cam) {\n if (model.camera === cam) {\n return;\n }\n\n if (model.cameraModifiedSub) {\n model.cameraModifiedSub.unsubscribe();\n model.cameraModifiedSub = null;\n }\n\n model.camera = cam;\n\n if (cam) {\n model.cameraModifiedSub = cam.onModified(publicAPI.update);\n }\n\n publicAPI.update();\n publicAPI.modified();\n }; // estimate from a camera model what faces to draw\n // return true if the list of faces to draw has changed\n\n\n publicAPI.computeFacesToDraw = function () {\n var cmat = model.camera.getViewMatrix();\n mat4.transpose(cmat, cmat);\n var changed = false;\n var length = vtkBoundingBox.getDiagonalLength(model.dataBounds);\n var faceDot = Math.sin(model.faceVisibilityAngle * Math.PI / 180.0);\n\n for (var f = 0; f < 6; f++) {\n var drawit = false;\n var faceAxis = Math.floor(f / 2);\n var otherAxis1 = (faceAxis + 1) % 3;\n var otherAxis2 = (faceAxis + 2) % 3; // only for non degenerate axes\n\n if (model.dataBounds[otherAxis1 * 2] !== model.dataBounds[otherAxis1 * 2 + 1] && model.dataBounds[otherAxis2 * 2] !== model.dataBounds[otherAxis2 * 2 + 1]) {\n // for each face transform the center and off center to get a direction vector\n ptv3[faceAxis] = model.dataBounds[f] - 0.1 * length * faceNormals[f][faceAxis];\n ptv3[otherAxis1] = 0.5 * (model.dataBounds[otherAxis1 * 2] + model.dataBounds[otherAxis1 * 2 + 1]);\n ptv3[otherAxis2] = 0.5 * (model.dataBounds[otherAxis2 * 2] + model.dataBounds[otherAxis2 * 2 + 1]);\n vec3.transformMat4(tmpv3, ptv3, cmat);\n ptv3[faceAxis] = model.dataBounds[f];\n vec3.transformMat4(tmp2v3, ptv3, cmat);\n vec3.subtract(tmpv3, tmp2v3, tmpv3);\n vec3.normalize(tmpv3, tmpv3); // tmpv3 now holds the face normal vector\n\n drawit = tmpv3[2] > faceDot; // for perspctive we need the view direction to the plane\n\n if (!model.camera.getParallelProjection()) {\n vec3.normalize(tmp2v3, tmp2v3);\n drawit = vec3.dot(tmp2v3, tmpv3) > faceDot;\n }\n }\n\n if (drawit !== model.lastFacesToDraw[f]) {\n model.lastFacesToDraw[f] = drawit;\n changed = true;\n }\n }\n\n return changed;\n }; // update the polydata that represents the boundingd edges and gridlines\n\n\n publicAPI.updatePolyData = function (facesToDraw, edgesToDraw, ticks) {\n // compute the number of points and lines required\n var numPts = 0;\n var numLines = 0;\n numPts += 8; // always start with the 8 cube points\n // count edgesToDraw\n\n var numEdgesToDraw = 0;\n\n for (var e = 0; e < 12; e++) {\n if (edgesToDraw[e] > 0) {\n numEdgesToDraw++;\n }\n }\n\n numLines += numEdgesToDraw; // add values for gridlines\n\n if (model.gridLines) {\n for (var f = 0; f < 6; f++) {\n if (facesToDraw[f]) {\n numPts += ticks[faceAxes[f][0]].length * 2 + ticks[faceAxes[f][1]].length * 2;\n numLines += ticks[faceAxes[f][0]].length + ticks[faceAxes[f][1]].length;\n }\n }\n } // now allocate the memory\n\n\n var points = new Float64Array(numPts * 3);\n var lines = new Uint32Array(numLines * 3);\n var ptIdx = 0;\n var lineIdx = 0; // add the 8 corner points\n\n for (var z = 0; z < 2; z++) {\n for (var y = 0; y < 2; y++) {\n for (var x = 0; x < 2; x++) {\n points[ptIdx * 3] = model.dataBounds[x];\n points[ptIdx * 3 + 1] = model.dataBounds[2 + y];\n points[ptIdx * 3 + 2] = model.dataBounds[4 + z];\n ptIdx++;\n }\n }\n } // draw the edges\n\n\n for (var _e = 0; _e < 12; _e++) {\n if (edgesToDraw[_e] > 0) {\n lines[lineIdx * 3] = 2;\n lines[lineIdx * 3 + 1] = edgePoints[_e][0];\n lines[lineIdx * 3 + 2] = edgePoints[_e][1];\n lineIdx++;\n }\n } // now handle gridlines\n // grid lines are tick[axis1] + ticks[axes2] lines each having two points\n // for simplicity we don;t worry about duplicating points, this is tiny\n\n\n if (model.gridLines) {\n // for each visible face\n // add the points\n for (var _f = 0; _f < 6; _f++) {\n if (facesToDraw[_f]) {\n var faceIdx = Math.floor(_f / 2);\n var aticks = ticks[faceAxes[_f][0]];\n\n for (var t = 0; t < aticks.length; t++) {\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][0]] = aticks[t];\n points[ptIdx * 3 + faceAxes[_f][1]] = model.dataBounds[faceAxes[_f][1] * 2];\n ptIdx++;\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][0]] = aticks[t];\n points[ptIdx * 3 + faceAxes[_f][1]] = model.dataBounds[faceAxes[_f][1] * 2 + 1];\n ptIdx++;\n lines[lineIdx * 3] = 2;\n lines[lineIdx * 3 + 1] = ptIdx - 2;\n lines[lineIdx * 3 + 2] = ptIdx - 1;\n lineIdx++;\n }\n\n aticks = ticks[faceAxes[_f][1]];\n\n for (var _t = 0; _t < aticks.length; _t++) {\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][1]] = aticks[_t];\n points[ptIdx * 3 + faceAxes[_f][0]] = model.dataBounds[faceAxes[_f][0] * 2];\n ptIdx++;\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][1]] = aticks[_t];\n points[ptIdx * 3 + faceAxes[_f][0]] = model.dataBounds[faceAxes[_f][0] * 2 + 1];\n ptIdx++;\n lines[lineIdx * 3] = 2;\n lines[lineIdx * 3 + 1] = ptIdx - 2;\n lines[lineIdx * 3 + 2] = ptIdx - 1;\n lineIdx++;\n }\n }\n }\n }\n\n model.polyData.getPoints().setData(points, 3);\n model.polyData.getPoints().modified();\n model.polyData.getLines().setData(lines, 1);\n model.polyData.getLines().modified();\n model.polyData.modified();\n }; // update the data that represents where to put the labels\n // in world coordinates. This only changes when faces to draw changes\n // of dataBounds changes\n\n\n publicAPI.updateTextData = function (facesToDraw, edgesToDraw, ticks, tickStrings) {\n // count outside edgesToDraw\n var textPointCount = 0;\n\n for (var e = 0; e < 12; e++) {\n if (edgesToDraw[e] === 1) {\n textPointCount += 2;\n textPointCount += ticks[edgeAxes[e]].length;\n }\n }\n\n var points = model.polyData.getPoints().getData();\n var textPoints = new Float64Array(textPointCount * 3);\n var ptIdx = 0;\n var textIdx = 0;\n var axisCount = 0;\n\n for (var f = 0; f < 6; f++) {\n if (facesToDraw[f]) {\n for (var _e2 = 0; _e2 < 4; _e2++) {\n var edgeIdx = faceEdges[f][_e2];\n\n if (edgesToDraw[edgeIdx] === 1) {\n var edgeAxis = edgeAxes[edgeIdx]; // add a middle point on the edge\n\n var ptIdx1 = edgePoints[edgeIdx][0] * 3;\n var ptIdx2 = edgePoints[edgeIdx][1] * 3;\n textPoints[ptIdx * 3] = 0.5 * (points[ptIdx1] + points[ptIdx2]);\n textPoints[ptIdx * 3 + 1] = 0.5 * (points[ptIdx1 + 1] + points[ptIdx2 + 1]);\n textPoints[ptIdx * 3 + 2] = 0.5 * (points[ptIdx1 + 2] + points[ptIdx2 + 2]);\n ptIdx++; // add a middle face point, we use this to\n // move the labels away from the edge in the right direction\n\n var faceIdx = Math.floor(f / 2);\n textPoints[ptIdx * 3 + faceIdx] = model.dataBounds[f];\n textPoints[ptIdx * 3 + faceAxes[f][0]] = 0.5 * (model.dataBounds[faceAxes[f][0] * 2] + model.dataBounds[faceAxes[f][0] * 2 + 1]);\n textPoints[ptIdx * 3 + faceAxes[f][1]] = 0.5 * (model.dataBounds[faceAxes[f][1] * 2] + model.dataBounds[faceAxes[f][1] * 2 + 1]);\n ptIdx++; // set the text\n\n model.textValues[textIdx] = model.axisLabels[edgeAxis];\n textIdx++; // now add the tick marks along the edgeAxis\n\n var otherAxis1 = (edgeAxis + 1) % 3;\n var otherAxis2 = (edgeAxis + 2) % 3;\n var aticks = ticks[edgeAxis];\n var atickStrings = tickStrings[edgeAxis];\n model.tickCounts[axisCount] = aticks.length;\n\n for (var t = 0; t < aticks.length; t++) {\n textPoints[ptIdx * 3 + edgeAxis] = aticks[t];\n textPoints[ptIdx * 3 + otherAxis1] = points[ptIdx1 + otherAxis1];\n textPoints[ptIdx * 3 + otherAxis2] = points[ptIdx1 + otherAxis2];\n ptIdx++; // set the text\n\n model.textValues[textIdx] = atickStrings[t];\n textIdx++;\n }\n\n axisCount++;\n }\n }\n }\n }\n\n model.textPolyData.getPoints().setData(textPoints, 3);\n model.textPolyData.modified();\n }; // main method to rebuild the cube axes, gets called on camera modify\n // and changes to key members\n\n\n publicAPI.update = function () {\n // Can't do anything if we don't have a camera...\n if (!model.camera) {\n return;\n } // compute what faces to draw\n\n\n var facesChanged = publicAPI.computeFacesToDraw();\n var facesToDraw = model.lastFacesToDraw; // have the bounds changed?\n\n var boundsChanged = false;\n\n for (var i = 0; i < 6; i++) {\n if (model.dataBounds[i] !== model.lastTickBounds[i]) {\n boundsChanged = true;\n model.lastTickBounds[i] = model.dataBounds[i];\n }\n } // did something significant change? If so rebuild a lot of things\n\n\n if (facesChanged || boundsChanged || model.forceUpdate) {\n // compute the edges to draw\n // for each drawn face, mark edges, all single mark edges we draw\n var edgesToDraw = new Array(12).fill(0);\n\n for (var f = 0; f < 6; f++) {\n if (facesToDraw[f]) {\n for (var e = 0; e < 4; e++) {\n edgesToDraw[faceEdges[f][e]]++;\n }\n }\n } // compute tick marks for axes\n\n\n var ticks = [];\n var tickStrings = [];\n\n for (var _i = 0; _i < 3; _i++) {\n var scale = d3.scaleLinear().domain([model.dataBounds[_i * 2], model.dataBounds[_i * 2 + 1]]);\n ticks[_i] = scale.ticks(5);\n var format = scale.tickFormat(5);\n tickStrings[_i] = ticks[_i].map(format);\n } // update gridlines / edge lines\n\n\n publicAPI.updatePolyData(facesToDraw, edgesToDraw, ticks); // compute label world coords and text\n\n publicAPI.updateTextData(facesToDraw, edgesToDraw, ticks, tickStrings); // rebuild the texture only when force or changed bounds, face\n // visibility changes do to change the atlas\n\n if (boundsChanged || model.forceUpdate) {\n publicAPI.updateTextureAtlas(tickStrings);\n }\n }\n\n model.forceUpdate = false;\n }; // create the texture map atlas that contains the rendering of\n // all the text strings. Only needs to be called when the text strings\n // have changed (labels and ticks)\n\n\n publicAPI.updateTextureAtlas = function (tickStrings) {\n // compute the width and height we need\n // set the text properties\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left'; // first the three labels\n\n model._tmAtlas.clear();\n\n var maxWidth = 0;\n var totalHeight = 1; // start one pixel in so we have a border\n\n for (var i = 0; i < 3; i++) {\n if (!model._tmAtlas.has(model.axisLabels[i])) {\n applyTextStyle(model.tmContext, model.axisTextStyle);\n var metrics = model.tmContext.measureText(model.axisLabels[i]);\n var entry = {\n height: metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: metrics.width + 2,\n textStyle: model.axisTextStyle\n };\n\n model._tmAtlas.set(model.axisLabels[i], entry);\n\n totalHeight += entry.height;\n\n if (maxWidth < entry.width) {\n maxWidth = entry.width;\n }\n } // and the ticks\n\n\n applyTextStyle(model.tmContext, model.tickTextStyle);\n\n for (var t = 0; t < tickStrings[i].length; t++) {\n if (!model._tmAtlas.has(tickStrings[i][t])) {\n var _metrics = model.tmContext.measureText(tickStrings[i][t]);\n\n var _entry = {\n height: _metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: _metrics.width + 2,\n textStyle: model.tickTextStyle\n };\n\n model._tmAtlas.set(tickStrings[i][t], _entry);\n\n totalHeight += _entry.height;\n\n if (maxWidth < _entry.width) {\n maxWidth = _entry.width;\n }\n }\n }\n } // always use power of two to avoid interpolation\n // in cases where PO2 is required\n\n\n maxWidth = nearestPowerOfTwo(maxWidth);\n totalHeight = nearestPowerOfTwo(totalHeight); // set the tcoord values\n\n model._tmAtlas.forEach(function (value) {\n value.tcoords = [0.0, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight) / totalHeight, 0.0, (totalHeight - value.startingHeight) / totalHeight];\n }); // make sure we have power of two dimensions\n\n\n model.tmCanvas.width = maxWidth;\n model.tmCanvas.height = totalHeight;\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left';\n model.tmContext.clearRect(0, 0, maxWidth, totalHeight); // draw the text onto the texture\n\n model._tmAtlas.forEach(function (value, key) {\n applyTextStyle(model.tmContext, value.textStyle);\n model.tmContext.fillText(key, 1, value.startingHeight + value.height - 1);\n });\n\n model.tmTexture.setCanvas(model.tmCanvas);\n model.tmTexture.modified();\n }; // Make sure the data is correct\n\n\n publicAPI.onModified(function () {\n model.forceUpdate = true;\n publicAPI.update();\n });\n\n publicAPI.setTickTextStyle = function (tickStyle) {\n model.tickTextStyle = _objectSpread(_objectSpread({}, model.tickTextStyle), tickStyle);\n publicAPI.modified();\n };\n\n publicAPI.setAxisTextStyle = function (axisStyle) {\n model.axisTextStyle = _objectSpread(_objectSpread({}, model.axisTextStyle), axisStyle);\n publicAPI.modified();\n };\n\n publicAPI.get_tmAtlas = function () {\n return model._tmAtlas;\n }; // try to get the bounds for the annotation. This is complicated\n // as it relies on the pixel size of the window. Every time the camera\n // changes the bounds change. This method simplifies by just expanding\n // the grid bounds by a user specified factor.\n\n\n publicAPI.getBounds = function () {\n publicAPI.update();\n vtkBoundingBox.setBounds(model.bounds, model.gridActor.getBounds());\n vtkBoundingBox.scaleAboutCenter(model.bounds, model.boundsScaleFactor, model.boundsScaleFactor, model.boundsScaleFactor);\n return model.bounds;\n }; // Make sure the grid share the actor property\n\n\n var _setProp = macro.chain(publicAPI.setProperty, model.gridActor.setProperty);\n\n publicAPI.setProperty = function (p) {\n return _setProp(p)[0];\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n boundsScaleFactor: 1.3,\n camera: null,\n dataBounds: _toConsumableArray(vtkBoundingBox.INIT_BOUNDS),\n faceVisibilityAngle: 8,\n gridLines: true,\n axisLabels: null,\n axisTitlePixelOffset: 35.0,\n axisTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 18,\n fontFamily: 'serif'\n },\n tickLabelPixelOffset: 12.0,\n tickTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 14,\n fontFamily: 'serif'\n }\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, defaultValues(initialValues)); // Inheritance\n\n vtkActor.extend(publicAPI, model, initialValues); // internal variables\n\n model.lastFacesToDraw = [false, false, false, false, false, false];\n model.axisLabels = ['X-Axis', 'Y-Axis', 'Z-Axis'];\n model.tickCounts = [];\n model.textValues = [];\n model.lastTickBounds = [];\n model.tmCanvas = document.createElement('canvas');\n model.tmContext = model.tmCanvas.getContext('2d');\n model._tmAtlas = new Map(); // for texture atlas\n\n model.tmTexture = vtkTexture.newInstance();\n model.tmTexture.setInterpolate(false);\n publicAPI.getProperty().setDiffuse(0.0);\n publicAPI.getProperty().setAmbient(1.0);\n model.gridMapper = vtkMapper.newInstance();\n model.polyData = vtkPolyData.newInstance();\n model.gridMapper.setInputData(model.polyData);\n model.gridActor = vtkActor.newInstance();\n model.gridActor.setMapper(model.gridMapper);\n model.gridActor.setProperty(publicAPI.getProperty());\n model.gridActor.setParentProp(publicAPI);\n model.textPolyData = vtkPolyData.newInstance();\n macro.setGet(publicAPI, model, ['axisTitlePixelOffset', 'boundsScaleFactor', 'faceVisibilityAngle', 'gridLines', 'tickLabelPixelOffset']);\n macro.setGetArray(publicAPI, model, ['dataBounds'], 6);\n macro.setGetArray(publicAPI, model, ['axisLabels'], 3);\n macro.get(publicAPI, model, ['axisTextStyle', 'tickTextStyle', 'camera', 'tmTexture', 'textValues', 'textPolyData', 'tickCounts', 'gridActor']); // Object methods\n\n vtkCubeAxesActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCubeAxesActor'); // ----------------------------------------------------------------------------\n\nvar vtkCubeAxesActor$1 = {\n newInstance: newInstance,\n extend: extend,\n newCubeAxesActorHelper: newCubeAxesActorHelper\n};\n\nexport { vtkCubeAxesActor$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkCubeAxesActor from '../Core/CubeAxesActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLCubeAxesActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLCubeAxesActor(publicAPI, model) {\n model.classHierarchy.push('vtkOpenGLCubeAxesActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n\n if (!model.CubeAxesActorHelper.getRenderable()) {\n model.CubeAxesActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.CubeAxesActorHelper.getTmActor());\n publicAPI.addMissingNode(model.renderable.getGridActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model._openGLRenderer ? model._openGLRenderer.getRenderable().getActiveCamera() : null;\n\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n model.CubeAxesActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model._openGLRenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.CubeAxesActorHelper = vtkCubeAxesActor.newCubeAxesActorHelper(); // Object methods\n\n vtkOpenGLCubeAxesActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLCubeAxesActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkCubeAxesActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkAbstractMapper from './AbstractMapper.js';\nimport vtkLookupTable from '../../Common/Core/LookupTable.js';\nimport Constants from './Mapper/Constants.js';\n\nvar ColorMode = Constants.ColorMode,\n ScalarMode = Constants.ScalarMode,\n GetArray = Constants.GetArray; // ---------------------------------------------------------------------------\n// vtkMapper2D methods\n// ---------------------------------------------------------------------------\n\nfunction vtkMapper2D(publicAPI, model) {\n // Set out className\n model.classHierarchy.push('vtkMapper2D');\n\n publicAPI.createDefaultLookupTable = function () {\n model.lookupTable = vtkLookupTable.newInstance();\n };\n\n publicAPI.getColorModeAsString = function () {\n return macro.enumToString(ColorMode, model.colorMode);\n };\n\n publicAPI.setColorModeToDefault = function () {\n return publicAPI.setColorMode(0);\n };\n\n publicAPI.setColorModeToMapScalars = function () {\n return publicAPI.setColorMode(1);\n };\n\n publicAPI.setColorModeToDirectScalars = function () {\n return publicAPI.setColorMode(2);\n };\n\n publicAPI.getScalarModeAsString = function () {\n return macro.enumToString(ScalarMode, model.scalarMode);\n };\n\n publicAPI.setScalarModeToDefault = function () {\n return publicAPI.setScalarMode(0);\n };\n\n publicAPI.setScalarModeToUsePointData = function () {\n return publicAPI.setScalarMode(1);\n };\n\n publicAPI.setScalarModeToUseCellData = function () {\n return publicAPI.setScalarMode(2);\n };\n\n publicAPI.setScalarModeToUsePointFieldData = function () {\n return publicAPI.setScalarMode(3);\n };\n\n publicAPI.setScalarModeToUseCellFieldData = function () {\n return publicAPI.setScalarMode(4);\n };\n\n publicAPI.setScalarModeToUseFieldData = function () {\n return publicAPI.setScalarMode(5);\n };\n\n publicAPI.getAbstractScalars = function (input, scalarMode, arrayAccessMode, arrayId, arrayName) {\n // make sure we have an input\n if (!input || !model.scalarVisibility) {\n return {\n scalars: null,\n cellFLag: false\n };\n }\n\n var scalars = null;\n var cellFlag = false; // get scalar data and point/cell attribute according to scalar mode\n\n if (scalarMode === ScalarMode.DEFAULT) {\n scalars = input.getPointData().getScalars();\n\n if (!scalars) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n }\n } else if (scalarMode === ScalarMode.USE_POINT_DATA) {\n scalars = input.getPointData().getScalars();\n } else if (scalarMode === ScalarMode.USE_CELL_DATA) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n } else if (scalarMode === ScalarMode.USE_POINT_FIELD_DATA) {\n var pd = input.getPointData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = pd.getArrayByIndex(arrayId);\n } else {\n scalars = pd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_CELL_FIELD_DATA) {\n var cd = input.getCellData();\n cellFlag = true;\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = cd.getArrayByIndex(arrayId);\n } else {\n scalars = cd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_FIELD_DATA) {\n var fd = input.getFieldData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = fd.getArrayByIndex(arrayId);\n } else {\n scalars = fd.getArrayByName(arrayName);\n }\n }\n\n return {\n scalars: scalars,\n cellFlag: cellFlag\n };\n };\n\n publicAPI.getLookupTable = function () {\n if (!model.lookupTable) {\n publicAPI.createDefaultLookupTable();\n }\n\n return model.lookupTable;\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.lookupTable !== null) {\n var time = model.lookupTable.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.mapScalars = function (input, alpha) {\n var scalars = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName).scalars;\n\n if (!scalars) {\n model.colorMapColors = null;\n return;\n } // we want to only recompute when something has changed\n\n\n var toString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n if (model.colorBuildString === toString) return;\n\n if (!model.useLookupTableScalarRange) {\n publicAPI.getLookupTable().setRange(model.scalarRange[0], model.scalarRange[1]);\n }\n\n var lut = publicAPI.getLookupTable();\n\n if (lut) {\n // Ensure that the lookup table is built\n lut.build();\n model.colorMapColors = lut.mapScalars(scalars, model.colorMode, model.fieldDataTupleId);\n }\n\n model.colorBuildString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n static: false,\n lookupTable: null,\n scalarVisibility: false,\n scalarRange: [0, 1],\n useLookupTableScalarRange: false,\n colorMode: 0,\n scalarMode: 0,\n arrayAccessMode: 1,\n // By_NAME\n renderTime: 0,\n colorByArrayName: null,\n transformCoordinate: null,\n viewSpecificProperties: null,\n customShaderAttributes: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkAbstractMapper.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['colorMapColors']);\n macro.setGet(publicAPI, model, ['arrayAccessMode', 'colorByArrayName', 'colorMode', 'lookupTable', 'renderTime', 'scalarMode', 'scalarVisibility', 'static', 'transformCoordinate', 'useLookupTableScalarRange', 'viewSpecificProperties', 'customShaderAttributes' // point data array names that will be transferred to the VBO\n ]);\n macro.setGetArray(publicAPI, model, ['scalarRange'], 2);\n\n if (!model.viewSpecificProperties) {\n model.viewSpecificProperties = {};\n } // Object methods\n\n\n vtkMapper2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkMapper2D'); // ----------------------------------------------------------------------------\n\nvar vtkMapper2D$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkMapper2D$1 as default, extend, newInstance };\n","var vtkPolyData2DFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyData2DFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\nuniform int PrimitiveIDOffset;\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// Scalar coloring\\n//VTK::Color::Dec\\n\\n// Depth Peeling\\n//VTK::DepthPeeling::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\nvoid main()\\n{\\n // Apple Bug\\n //VTK::PrimID::Impl\\n\\n //VTK::Color::Impl\\n //VTK::TCoord::Impl\\n\\n //VTK::DepthPeeling::Impl\\n //VTK::Picking::Impl\\n\\n if (gl_FragData[0].a <= 0.0)\\n {\\n discard;\\n }\\n}\\n\";\n\nexport { vtkPolyData2DFS as v };\n","var vtkPolyData2DVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyData2DVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\n// all variables that represent positions or directions have a suffix\\n// indicating the coordinate system they are in. The possible values are\\n// MC - Model Coordinates\\n// WC - WC world coordinates\\n// VC - View Coordinates\\n// DC - Display Coordinates\\n\\nin vec4 vertexWC;\\n\\n// frag position in VC\\n//VTK::PositionVC::Dec\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\nuniform mat4 WCVCMatrix; // World to view matrix\\n\\nvoid main()\\n{\\n // Apple Bug\\n //VTK::PrimID::Impl\\n\\n gl_Position = WCVCMatrix*vertexWC;\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Color::Impl\\n\\n //VTK::PositionVC::Impl\\n}\\n\";\n\nexport { vtkPolyData2DVS as v };\n","var DisplayLocation = {\n BACKGROUND: 0,\n FOREGROUND: 1\n};\nvar Constants = {\n DisplayLocation: DisplayLocation\n};\n\nexport { DisplayLocation, Constants as default };\n","import { mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, setGet, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkHelper from './Helper.js';\nimport vtkMapper2D from '../Core/Mapper2D.js';\nimport vtkPoints from '../../Common/Core/Points.js';\nimport { v as vtkPolyData2DFS } from './glsl/vtkPolyData2DFS.glsl.js';\nimport { v as vtkPolyData2DVS } from './glsl/vtkPolyData2DVS.glsl.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { K as round } from '../../Common/Core/Math/index.js';\nimport { DisplayLocation } from '../Core/Property2D/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// import { mat3, mat4, vec3 } from 'gl-matrix';\nvar primTypes = vtkHelper.primTypes;\nvar ScalarMode = vtkMapper2D.ScalarMode;\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar StartEvent = {\n type: 'StartEvent'\n};\nvar EndEvent = {\n type: 'EndEvent'\n}; // ----------------------------------------------------------------------------\n// vtkOpenGLPolyDataMapper2D methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLPolyDataMapper2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLPolyDataMapper2D');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.openGLActor2D = publicAPI.getFirstAncestorOfType('vtkOpenGLActor2D');\n model._openGLRenderer = model.openGLActor2D.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(model._openGLRenderer.getRenderable().getActiveCamera());\n }\n };\n\n publicAPI.overlayPass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkPolyData2DVS;\n shaders.Fragment = vtkPolyData2DFS;\n shaders.Geometry = '';\n };\n\n publicAPI.render = function () {\n var ctx = model._openGLRenderWindow.getContext();\n\n if (model.context !== ctx) {\n model.context = ctx;\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i].setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n }\n\n var actor = model.openGLActor2D.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent(StartEvent);\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n model.currentInput = model.renderable.getInputData();\n publicAPI.invokeEvent(EndEvent);\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n } // if there are no points then we are done\n\n\n if (!model.currentInput.getPoints || !model.currentInput.getPoints().getNumberOfValues()) {\n return;\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n model.primitiveIDOffset = 0;\n\n if (model._openGLRenderer.getSelector()) {\n switch (model._openGLRenderer.getSelector().getCurrentPass()) {\n default:\n model._openGLRenderer.getSelector().renderProp(actor);\n\n }\n } // make sure the BOs are up to date\n\n\n publicAPI.updateBufferObjects(ren, actor); // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n model.lastBoundBO = null;\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n if (cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n // Note that the actor's mtime includes it's properties mtime\n var vmtime = model.VBOBuildTime.getMTime();\n\n if (vmtime < publicAPI.getMTime() || vmtime < model._openGLRenderWindow.getMTime() || vmtime < model.renderable.getMTime() || vmtime < actor.getMTime() || vmtime < model.currentInput.getMTime() || model.renderable.getTransformCoordinate() && vmtime < ren.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, actor.getProperty().getOpacity());\n var c = model.renderable.getColorMapColors();\n model.haveCellScalars = false;\n var scalarMode = model.renderable.getScalarMode();\n\n if (model.renderable.getScalarVisibility()) {\n // We must figure out how the scalars should be mapped to the polydata.\n if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !poly.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {\n model.haveCellScalars = true;\n }\n }\n\n var representation = actor.getProperty().getRepresentation();\n var tcoords = poly.getPointData().getTCoords();\n\n if (!model.openGLActor2D.getActiveTextures()) {\n tcoords = null;\n }\n\n var transformCoordinate = model.renderable.getTransformCoordinate();\n var view = ren.getRenderWindow().getViews()[0];\n var vsize = view.getViewportSize(ren);\n var toString = \"\".concat(poly.getMTime(), \"A\").concat(representation, \"B\").concat(poly.getMTime()) + \"C\".concat(c ? c.getMTime() : 1) + \"D\".concat(tcoords ? tcoords.getMTime() : 1) + \"E\".concat(transformCoordinate ? ren.getMTime() : 1) + \"F\".concat(vsize);\n\n if (model.VBOBuildString !== toString) {\n // Build the VBOs\n var points = poly.getPoints();\n\n if (transformCoordinate) {\n var p = vtkPoints.newInstance();\n var numPts = points.getNumberOfPoints();\n p.setNumberOfPoints(numPts);\n var point = [];\n\n for (var i = 0; i < numPts; ++i) {\n points.getPoint(i, point);\n transformCoordinate.setValue(point);\n var v = transformCoordinate.getComputedDoubleViewportValue(ren);\n p.setPoint(i, v[0], v[1], 0.0);\n }\n\n points = p;\n }\n\n var options = {\n points: points,\n tcoords: tcoords,\n colors: c,\n cellOffset: 0,\n haveCellScalars: model.haveCellSCalars,\n customAttributes: model.renderable.getCustomShaderAttributes().map(function (arrayName) {\n return poly.getPointData().getArrayByName(arrayName);\n })\n };\n options.cellOffset += model.primitives[primTypes.Points].getCABO().createVBO(poly.getVerts(), 'verts', representation, options);\n options.cellOffset += model.primitives[primTypes.Lines].getCABO().createVBO(poly.getLines(), 'lines', representation, options);\n options.cellOffset += model.primitives[primTypes.Tris].getCABO().createVBO(poly.getPolys(), 'polys', representation, options);\n options.cellOffset += model.primitives[primTypes.TriStrips].getCABO().createVBO(poly.getStrips(), 'strips', representation, options);\n model.VBOBuildTime.modified();\n model.VBOBuildString = toString;\n }\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var representation = actor.getProperty().getRepresentation();\n var gl = model.context;\n gl.depthMask(true); // for every primitive type\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n // if there are entries\n var cabo = model.primitives[i].getCABO();\n\n if (cabo.getElementCount()) {\n model.lastBoundBO = model.primitives[i];\n model.primitiveIDOffset += model.primitives[i].drawArrays(ren, actor, representation, publicAPI);\n }\n }\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {\n if (model.lastBoundBO) {\n model.lastBoundBO.getVAO().release();\n }\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n publicAPI.replaceShaderColor(shaders, ren, actor);\n publicAPI.replaceShaderTCoord(shaders, ren, actor);\n publicAPI.replaceShaderPicking(shaders, ren, actor);\n publicAPI.replaceShaderPositionVC(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderColor = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n\n if (model.haveCellScalars) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', ['uniform samplerBuffer texture1;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', ['gl_FragData[0] = texelFetchBuffer(texture1, gl_PrimitiveID + PrimitiveIDOffset);']).result;\n }\n\n if (model.lastBoundBO.getCABO().getColorComponents() !== 0) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Dec', ['in vec4 diffuseColor;', 'out vec4 fcolorVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Impl', ['fcolorVSOutput = diffuseColor;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Dec', ['in vec4 fcolorVSOutput[];\\n', 'out vec4 fcolorGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Impl', ['fcolorGSOutput = fcolorVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', ['in vec4 fcolorVSOutput;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', ['gl_FragData[0] = fcolorVSOutput;']).result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', ['uniform vec4 diffuseColor;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', ['gl_FragData[0] = diffuseColor;']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderTCoord = function (shaders, ren, actor) {\n if (model.lastBoundBO.getCABO().getTCoordOffset()) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var tcdim = model.lastBoundBO.getCABO().getTCoordComponents();\n\n if (tcdim === 1) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', ['in float tcoordMC;', 'out float tcoordVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', ['tcoordVCVSOutput = tcoordMC;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in float tcoordVCVSOutput[];\\n', 'out float tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, ['//VTK::TCoord::Impl', 'tcoordVCGSOutput = tcoordVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['in float tcoordVCVSOutput;', 'uniform sampler2D texture1;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['gl_FragData[0] = gl_FragData[0]*texture2D(texture1, vec2(tcoordVCVSOutput,0));']).result;\n } else if (tcdim === 2) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordMC;', 'out vec2 tcoordVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', ['tcoordVCVSOutput = tcoordMC;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordVCVSOutput[];\\n', 'out vec2 tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Impl', ['tcoordVCGSOutput = tcoordVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordVCVSOutput;', 'uniform sampler2D texture1;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['gl_FragData[0] = gl_FragData[0]*texture2D(texture1, tcoordVCVSOutput.st);']).result;\n }\n\n if (model.haveCellScalars) {\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::PrimID::Impl', ['gl_PrimitiveID = gl_PrimitiveIDIn;']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.replaceShaderPicking = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', ['uniform vec3 mapperIndex;', 'uniform int picking;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = picking != 0 ? vec4(mapperIndex,1.0) : gl_FragData[0];').result;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n // replace common shader code\n model.lastBoundBO.replaceShaderPositionVC(shaders, ren, actor);\n };\n\n publicAPI.invokeShaderCallbacks = function (cellBO, ren, actor) {\n var listCallbacks = model.renderable.getViewSpecificProperties().ShadersCallbacks;\n\n if (listCallbacks) {\n listCallbacks.forEach(function (object) {\n object.callback(object.userData, cellBO, ren, actor);\n });\n }\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n if (cellBO.getProgram().isUniformUsed('PrimitiveIDOffset')) {\n cellBO.getProgram().setUniformi('PrimitiveIDOffset', model.primitiveIDOffset);\n }\n\n if (cellBO.getProgram().isAttributeUsed('vertexWC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'vertexWC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro('Error setting vertexWC in shader VAO.');\n }\n }\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n model.renderable.getCustomShaderAttributes().forEach(function (attrName, idx) {\n if (cellBO.getProgram().isAttributeUsed(\"\".concat(attrName, \"MC\"))) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), \"\".concat(attrName, \"MC\"), cellBO.getCABO().getCustomData()[idx].offset, cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getCustomData()[idx].components, false)) {\n vtkErrorMacro(\"Error setting \".concat(attrName, \"MC in shader VAO.\"));\n }\n }\n });\n\n if (cellBO.getProgram().isAttributeUsed('tcoordMC') && cellBO.getCABO().getTCoordOffset()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'tcoordMC', cellBO.getCABO().getTCoordOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getTCoordComponents(), false)) {\n vtkErrorMacro('Error setting tcoordMC in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('tcoordMC');\n }\n\n if (model.internalColorTexture && cellBO.getProgram().isUniformUsed('texture1')) {\n cellBO.getProgram().setUniformi('texture1', model.internalColorTexture.getTextureUnit());\n }\n\n var tus = model.openGLActor2D.getActiveTextures();\n\n if (tus) {\n for (var index = 0; index < tus.length; ++index) {\n var tex = tus[index];\n var texUnit = tex.getTextureUnit();\n var tname = \"texture\".concat(texUnit + 1);\n\n if (cellBO.getProgram().isUniformUsed(tname)) {\n cellBO.getProgram().setUniformi(tname, texUnit);\n }\n }\n } // handle wide lines\n\n\n cellBO.setMapperShaderParameters(ren, actor, model._openGLRenderer.getTiledSizeAndOrigin());\n\n var selector = model._openGLRenderer.getSelector();\n\n cellBO.getProgram().setUniform3fArray('mapperIndex', selector ? selector.getPropColorValue() : [0.0, 0.0, 0.0]);\n cellBO.getProgram().setUniformi('picking', selector ? selector.getCurrentPass() + 1 : 0);\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var c = model.renderable.getColorMapColors();\n\n if (!c || c.getNumberOfComponents() === 0) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n var dColor = ppty.getColor();\n var diffuseColor = [dColor[0], dColor[1], dColor[2], opacity];\n program.setUniform4f('diffuseColor', diffuseColor);\n }\n };\n\n publicAPI.setLightingShaderParameters = function (cellBO, ren, actor) {// no-op\n };\n\n function safeMatrixMultiply(matrixArray, matrixType, tmpMat) {\n matrixType.identity(tmpMat);\n return matrixArray.reduce(function (res, matrix, index) {\n if (index === 0) {\n return matrix ? matrixType.copy(res, matrix) : matrixType.identity(res);\n }\n\n return matrix ? matrixType.multiply(res, res, matrix) : res;\n }, tmpMat);\n }\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null; // Get the position of the actor\n\n var view = ren.getRenderWindow().getViews()[0];\n var size = view.getViewportSize(ren);\n var vport = ren.getViewport();\n var actorPos = actor.getActualPositionCoordinate().getComputedDoubleViewportValue(ren); // Get the window info\n // Assume tile viewport is 0 1 based on vtkOpenGLRenderer\n\n var tileViewport = [0.0, 0.0, 1.0, 1.0];\n var visVP = [0.0, 0.0, 1.0, 1.0];\n visVP[0] = vport[0] >= tileViewport[0] ? vport[0] : tileViewport[0];\n visVP[1] = vport[1] >= tileViewport[1] ? vport[1] : tileViewport[1];\n visVP[2] = vport[2] <= tileViewport[2] ? vport[2] : tileViewport[2];\n visVP[3] = vport[3] <= tileViewport[3] ? vport[3] : tileViewport[3];\n\n if (visVP[0] >= visVP[2]) {\n return;\n }\n\n if (visVP[1] >= visVP[3]) {\n return;\n }\n\n size[0] = round(size[0] * (visVP[2] - visVP[0]) / (vport[2] - vport[0]));\n size[1] = round(size[1] * (visVP[3] - visVP[1]) / (vport[3] - vport[1]));\n\n var winSize = model._openGLRenderer.getParent().getSize();\n\n var xoff = round(actorPos[0] - (visVP[0] - vport[0]) * winSize[0]);\n var yoff = round(actorPos[1] - (visVP[1] - vport[1]) * winSize[1]); // set ortho projection\n\n var left = -xoff;\n var right = -xoff + size[0];\n var bottom = -yoff;\n var top = -yoff + size[1]; // it's an error to call glOrtho with\n // either left==right or top==bottom\n\n if (left === right) {\n right = left + 1.0;\n }\n\n if (bottom === top) {\n top = bottom + 1.0;\n } // compute the combined ModelView matrix and send it down to save time in the shader\n\n\n var tmpMat4 = mat4.identity(new Float64Array(16));\n tmpMat4[0] = 2.0 / (right - left);\n tmpMat4[1 * 4 + 1] = 2.0 / (top - bottom);\n tmpMat4[0 * 4 + 3] = -1.0 * (right + left) / (right - left);\n tmpMat4[1 * 4 + 3] = -1.0 * (top + bottom) / (top - bottom);\n tmpMat4[2 * 4 + 2] = 0.0;\n tmpMat4[2 * 4 + 3] = actor.getProperty().getDisplayLocation() === DisplayLocation.FOREGROUND ? -1.0 : 1.0;\n tmpMat4[3 * 4 + 3] = 1.0;\n mat4.transpose(tmpMat4, tmpMat4);\n program.setUniformMatrix('WCVCMatrix', safeMatrixMultiply([tmpMat4, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n VBOBuildTime: 0,\n VBOBuildString: null,\n primitives: null,\n primTypes: null,\n shaderRebuildString: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.primitives = [];\n model.primTypes = primTypes;\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i] = vtkHelper.newInstance();\n model.primitives[i].setPrimitiveType(i);\n model.primitives[i].set({\n lastLightComplexity: 0,\n lastLightCount: 0,\n lastSelectionPass: false\n }, true);\n } // Build VTK API\n\n\n setGet(publicAPI, model, ['context']);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime, {\n mtime: 0\n }); // Object methods\n\n vtkOpenGLPolyDataMapper2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLPolyDataMapper2D'); // ----------------------------------------------------------------------------\n\nvar vtkPolyDataMapper2D = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkMapper2D', newInstance);\n\nexport { vtkPolyDataMapper2D as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport * as d3 from 'd3-scale';\nimport { M as nearestPowerOfTwo } from '../../Common/Core/Math/index.js';\nimport macro from '../../macros.js';\nimport vtkActor from './Actor.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkScalarsToColors from '../../Common/Core/ScalarsToColors.js';\nimport vtkMapper from './Mapper.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkTexture from './Texture.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar VectorMode = vtkScalarsToColors.VectorMode; // ----------------------------------------------------------------------------\n// vtkScalarBarActor\n//\n// Note log scales are currently not supported\n//\n// Developer note: This class is broken into the main class and a helper\n// class. The main class holds view independent properties (those properties\n// that do not change as the view's resolution/aspect ratio change). The\n// helper class is instantiated one per view and holds properties that can\n// depend on view specific values such as resolution. The helper class code\n// could have been left to the View specific implementation (such as\n// vtkWebGPUScalarBarActor) but is instead placed here to it can be shared by\n// multiple rendering backends.\n//\n// ----------------------------------------------------------------------------\n\nfunction applyTextStyle(ctx, style) {\n ctx.strokeStyle = style.strokeColor;\n ctx.lineWidth = style.strokeSize;\n ctx.fillStyle = style.fontColor;\n ctx.font = \"\".concat(style.fontStyle, \" \").concat(style.fontSize, \"px \").concat(style.fontFamily);\n} // ----------------------------------------------------------------------------\n// Default autoLayout function\n// ----------------------------------------------------------------------------\n// compute good values to use based on window size etc a bunch of heuristics\n// here with hand tuned constants These values worked for me but really this\n// method could be redically changed. The basic gist is\n// 1) compute a resonable font size\n// 2) render the text atlas using those font sizes\n// 3) pick horizontal or vertical bsed on window size\n// 4) based on the size of the title and tick labels rendered\n// compute the box size and position such that\n// the text will all fit nicely and the bar will be a resonable size\n// 5) compute the bar segments based on the above settings\n//\n// Note that this function can and should read values from the\n// ScalarBarActor but should only write values to the view dependent helper\n// instance that is provided as those values are the ones that will be used\n// for rendering.\n//\n\n\nfunction defaultAutoLayout(publicAPI, model) {\n return function (helper) {\n // we don't do a linear scale, the proportions for\n // a 700 pixel window differ from a 1400\n var lastSize = helper.getLastSize();\n var xAxisAdjust = Math.pow(lastSize[0] / 700, 0.8);\n var yAxisAdjust = Math.pow(lastSize[1] / 700, 0.8);\n var minAdjust = Math.min(xAxisAdjust, yAxisAdjust);\n var axisTextStyle = helper.getAxisTextStyle();\n var tickTextStyle = helper.getTickTextStyle();\n Object.assign(axisTextStyle, model.axisTextStyle);\n Object.assign(tickTextStyle, model.tickTextStyle); // compute a reasonable font size first\n\n axisTextStyle.fontSize = Math.max(24 * minAdjust, 12);\n\n if (helper.getLastAspectRatio() > 1.0) {\n tickTextStyle.fontSize = Math.max(20 * minAdjust, 10);\n } else {\n tickTextStyle.fontSize = Math.max(16 * minAdjust, 10);\n } // rebuild the text atlas\n\n\n var textSizes = helper.updateTextureAtlas(); // now compute the boxSize and pixel offsets, different algorithm\n // for horizonal versus vertical\n\n helper.setTopTitle(false);\n var boxSize = helper.getBoxSizeByReference(); // if vertical\n\n if (helper.getLastAspectRatio() > 1.0) {\n helper.setTickLabelPixelOffset(0.3 * tickTextStyle.fontSize); // if the title will fit within the width of the bar then that looks\n // nicer to put it at the top (helper.topTitle), otherwise rotate it\n // and place it sideways\n\n if (textSizes.titleWidth <= textSizes.tickWidth + helper.getTickLabelPixelOffset() + 0.8 * tickTextStyle.fontSize) {\n helper.setTopTitle(true);\n helper.setAxisTitlePixelOffset(0.2 * tickTextStyle.fontSize);\n boxSize[0] = 2.0 * (textSizes.tickWidth + helper.getTickLabelPixelOffset() + 0.8 * tickTextStyle.fontSize) / lastSize[0];\n helper.setBoxPosition([0.98 - boxSize[0], -0.92]);\n } else {\n helper.setAxisTitlePixelOffset(0.2 * tickTextStyle.fontSize);\n boxSize[0] = 2.0 * (textSizes.titleHeight + helper.getAxisTitlePixelOffset() + textSizes.tickWidth + helper.getTickLabelPixelOffset() + 0.8 * tickTextStyle.fontSize) / lastSize[0];\n helper.setBoxPosition([0.99 - boxSize[0], -0.92]);\n }\n\n boxSize[1] = Math.max(1.2, Math.min(1.84 / yAxisAdjust, 1.84));\n } else {\n // horizontal\n helper.setAxisTitlePixelOffset(1.2 * tickTextStyle.fontSize);\n helper.setTickLabelPixelOffset(0.1 * tickTextStyle.fontSize);\n var titleHeight = // total offset from top of bar (includes ticks)\n 2.0 * (0.8 * tickTextStyle.fontSize + textSizes.titleHeight + helper.getAxisTitlePixelOffset()) / lastSize[1];\n var tickWidth = 2.0 * textSizes.tickWidth / lastSize[0];\n boxSize[0] = Math.min(1.9, Math.max(1.4, 1.4 * tickWidth * (helper.getTicks().length + 3)));\n boxSize[1] = titleHeight;\n helper.setBoxPosition([-0.5 * boxSize[0], -0.97]);\n } // recomute bar segments based on positioning\n\n\n helper.recomputeBarSegments(textSizes);\n };\n} // ----------------------------------------------------------------------------\n// Default generateTicks function\n// ----------------------------------------------------------------------------\n// This function returns the default function used to generate vtkScalarBarActor ticks.\n// The default function makes use of d3.scaleLinear() to generate 5 tick marks between\n// the minimum and maximum values of the scalar bar. Customize this behavior by passing\n// a function to vtkScalarBarActor.newInstance({ generateTicks: customGenerateTicks })\n// or by calling scalarBarActor.setGenerateTicks(customGenerateTicks).\n\n\nfunction defaultGenerateTicks(publicApi, model) {\n return function (helper) {\n var lastTickBounds = helper.getLastTickBounds();\n var scale = d3.scaleLinear().domain([lastTickBounds[0], lastTickBounds[1]]);\n var ticks = scale.ticks(5);\n var format = scale.tickFormat(5);\n helper.setTicks(ticks);\n helper.setTickStrings(ticks.map(format));\n };\n} // many properties of this actor depend on the API specific view The main\n// dependency being the resolution as that drives what font sizes to use.\n// Bacause of this we need to do some of the calculations in a API specific\n// subclass. But... we don't want a lot of duplicated code between WebGL and\n// WebGPU for example so we have this helper class, that is designed to be\n// fairly API independent so that API specific views can call this to do\n// most of the work.\n\n\nfunction vtkScalarBarActorHelper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkScalarBarActorHelper');\n\n publicAPI.setRenderable = function (renderable) {\n if (model.renderable === renderable) {\n return;\n }\n\n model.renderable = renderable;\n model.barActor.setProperty(renderable.getProperty());\n model.barActor.setParentProp(renderable);\n model.barActor.setCoordinateSystemToDisplay();\n model.tmActor.setProperty(renderable.getProperty());\n model.tmActor.setParentProp(renderable);\n model.tmActor.setCoordinateSystemToDisplay();\n model.generateTicks = renderable.generateTicks;\n model.axisTextStyle = _objectSpread({}, renderable.getAxisTextStyle());\n model.tickTextStyle = _objectSpread({}, renderable.getTickTextStyle());\n publicAPI.modified();\n };\n\n publicAPI.updateAPISpecificData = function (size, camera, renderWindow) {\n // has the size changed?\n if (model.lastSize[0] !== size[0] || model.lastSize[1] !== size[1]) {\n model.lastSize[0] = size[0];\n model.lastSize[1] = size[1];\n model.lastAspectRatio = size[0] / size[1];\n model.forceUpdate = true;\n }\n\n var scalarsToColors = model.renderable.getScalarsToColors();\n\n if (!scalarsToColors || !model.renderable.getVisibility()) {\n return;\n } // make sure the lut is assigned to our mapper\n\n\n model.barMapper.setLookupTable(scalarsToColors); // camera should be the same for all views\n\n model.camera = camera;\n model.renderWindow = renderWindow; // did something significant change? If so rebuild a lot of things\n\n if (model.forceUpdate || Math.max(scalarsToColors.getMTime(), publicAPI.getMTime(), model.renderable.getMTime()) > model.lastRebuildTime.getMTime()) {\n var range = scalarsToColors.getMappingRange();\n model.lastTickBounds = _toConsumableArray(range); // compute tick marks for axes (update for log scale)\n\n model.renderable.getGenerateTicks()(publicAPI);\n\n if (model.renderable.getAutomated()) {\n model.renderable.getAutoLayout()(publicAPI);\n } else {\n // copy values from renderable\n model.axisTextStyle = _objectSpread({}, model.renderable.getAxisTextStyle());\n model.tickTextStyle = _objectSpread({}, model.renderable.getTickTextStyle());\n model.barPosition = _toConsumableArray(model.renderable.getBarPosition());\n model.barSize = _toConsumableArray(model.renderable.getBarSize());\n model.boxPosition = _toConsumableArray(model.renderable.getBoxPosition());\n model.boxSize = _toConsumableArray(model.renderable.getBoxSize());\n model.axisTitlePixelOffset = model.renderable.getAxisTitlePixelOffset();\n model.tickLabelPixelOffset = model.renderable.getTickLabelPixelOffset(); // rebuild the texture only when force or changed bounds, face\n // visibility changes do to change the atlas\n\n var textSizes = publicAPI.updateTextureAtlas(); // recompute bar segments based on positioning\n\n publicAPI.recomputeBarSegments(textSizes);\n }\n\n publicAPI.updatePolyDataForLabels();\n publicAPI.updatePolyDataForBarSegments();\n model.lastRebuildTime.modified();\n model.forceUpdate = false;\n }\n }; // create the texture map atlas that contains the rendering of\n // all the text strings. Only needs to be called when the text strings\n // have changed (labels and ticks)\n\n\n publicAPI.updateTextureAtlas = function () {\n // set the text properties\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left'; // return some factors about the text atlas\n\n var results = {}; // first the axislabel\n\n var newTmAtlas = new Map();\n var maxWidth = 0;\n var totalHeight = 1; // start one pixel in so we have a border\n\n applyTextStyle(model.tmContext, model.axisTextStyle);\n var metrics = model.tmContext.measureText(model.renderable.getAxisLabel());\n var entry = {\n height: metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: metrics.width + 2,\n textStyle: model.axisTextStyle\n };\n newTmAtlas.set(model.renderable.getAxisLabel(), entry);\n totalHeight += entry.height;\n maxWidth = entry.width;\n results.titleWidth = entry.width;\n results.titleHeight = entry.height; // and the ticks, NaN Below and Above\n\n results.tickWidth = 0;\n results.tickHeight = 0;\n applyTextStyle(model.tmContext, model.tickTextStyle);\n var strings = [].concat(_toConsumableArray(publicAPI.getTickStrings()), ['NaN', 'Below', 'Above']);\n\n for (var t = 0; t < strings.length; t++) {\n if (!newTmAtlas.has(strings[t])) {\n metrics = model.tmContext.measureText(strings[t]);\n entry = {\n height: metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: metrics.width + 2,\n textStyle: model.tickTextStyle\n };\n newTmAtlas.set(strings[t], entry);\n totalHeight += entry.height;\n\n if (maxWidth < entry.width) {\n maxWidth = entry.width;\n }\n\n if (results.tickWidth < entry.width) {\n results.tickWidth = entry.width;\n }\n\n if (results.tickHeight < entry.height) {\n results.tickHeight = entry.height;\n }\n }\n } // always use power of two to avoid interpolation\n // in cases where PO2 is required\n\n\n maxWidth = nearestPowerOfTwo(maxWidth);\n totalHeight = nearestPowerOfTwo(totalHeight); // set the tcoord values\n\n newTmAtlas.forEach(function (value) {\n value.tcoords = [0.0, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight) / totalHeight, 0.0, (totalHeight - value.startingHeight) / totalHeight];\n }); // make sure we have power of two dimensions\n\n model.tmCanvas.width = maxWidth;\n model.tmCanvas.height = totalHeight;\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left';\n model.tmContext.clearRect(0, 0, maxWidth, totalHeight); // draw the text onto the texture\n\n newTmAtlas.forEach(function (value, key) {\n applyTextStyle(model.tmContext, value.textStyle);\n model.tmContext.fillText(key, 1, value.startingHeight + value.height - 1);\n });\n model.tmTexture.setCanvas(model.tmCanvas); // mark as modified since the canvas typically doesn't change\n\n model.tmTexture.modified();\n model._tmAtlas = newTmAtlas;\n return results;\n };\n\n publicAPI.computeBarSize = function (textSizes) {\n // compute orientation\n model.vertical = model.boxSize[1] > model.boxSize[0];\n var tickHeight = 2.0 * textSizes.tickHeight / model.lastSize[1];\n var segSize = [1, 1]; // horizontal and vertical have different astetics so adjust based on\n // orientation\n\n if (model.vertical) {\n var tickWidth = 2.0 * (textSizes.tickWidth + model.tickLabelPixelOffset) / model.lastSize[0];\n\n if (model.topTitle) {\n var titleHeight = 2.0 * (textSizes.titleHeight + model.axisTitlePixelOffset) / model.lastSize[1];\n model.barSize[0] = model.boxSize[0] - tickWidth;\n model.barSize[1] = model.boxSize[1] - titleHeight;\n } else {\n // rotated title so width is based off height\n var titleWidth = 2.0 * (textSizes.titleHeight + model.axisTitlePixelOffset) / model.lastSize[0];\n model.barSize[0] = model.boxSize[0] - titleWidth - tickWidth;\n model.barSize[1] = model.boxSize[1];\n }\n\n model.barPosition[0] = model.boxPosition[0] + tickWidth;\n model.barPosition[1] = model.boxPosition[1];\n segSize[1] = tickHeight;\n } else {\n var _tickWidth = (2.0 * textSizes.tickWidth - 8) / model.lastSize[0];\n\n var _titleHeight = 2.0 * (textSizes.titleHeight + model.axisTitlePixelOffset) / model.lastSize[1];\n\n model.barSize[0] = model.boxSize[0];\n model.barPosition[0] = model.boxPosition[0];\n model.barSize[1] = model.boxSize[1] - _titleHeight;\n model.barPosition[1] = model.boxPosition[1];\n segSize[0] = _tickWidth;\n }\n\n return segSize;\n }; // based on all the settins compute a barSegments array\n // containing the segments of the scalar bar\n // each segment contains\n // corners[4][2]\n // title - e.g. NaN, Above, ticks\n // scalars - the normalized scalars values to use for that segment\n //\n // Note that the bar consumes the space in the box that remains after\n // leaving room for the text labels\n\n\n publicAPI.recomputeBarSegments = function (textSizes) {\n var _model$renderable$get, _model$renderable$get2, _model$renderable$get3, _model$renderable$get4;\n\n // first compute the barSize/Position\n var segSize = publicAPI.computeBarSize(textSizes);\n model.barSegments = [];\n var startPos = [0.0, 0.0]; // horizontal and vertical have different astetics so adjust based on\n // orientation\n\n var barAxis = model.vertical ? 1 : 0;\n var segSpace = model.vertical ? 0.01 : 0.02;\n\n function pushSeg(title, scalars) {\n model.barSegments.push({\n corners: [[].concat(startPos), [startPos[0] + segSize[0], startPos[1]], [startPos[0] + segSize[0], startPos[1] + segSize[1]], [startPos[0], startPos[1] + segSize[1]]],\n scalars: scalars,\n title: title\n });\n startPos[barAxis] += segSize[barAxis] + segSpace;\n }\n\n if (model.renderable.getDrawNanAnnotation() && model.renderable.getScalarsToColors().getNanColor()) {\n pushSeg('NaN', [NaN, NaN, NaN, NaN]);\n }\n\n if (model.renderable.getDrawBelowRangeSwatch() && (_model$renderable$get = (_model$renderable$get2 = model.renderable.getScalarsToColors()).getUseBelowRangeColor) !== null && _model$renderable$get !== void 0 && _model$renderable$get.call(_model$renderable$get2)) {\n pushSeg('Below', [-0.1, -0.1, -0.1, -0.1]);\n }\n\n var haveAbove = (_model$renderable$get3 = (_model$renderable$get4 = model.renderable.getScalarsToColors()).getUseAboveRangeColor) === null || _model$renderable$get3 === void 0 ? void 0 : _model$renderable$get3.call(_model$renderable$get4); // extra space around the ticks section\n\n startPos[barAxis] += segSpace;\n var oldSegSize = segSize[barAxis];\n segSize[barAxis] = haveAbove ? 1.0 - 2.0 * segSpace - segSize[barAxis] - startPos[barAxis] : 1.0 - segSpace - startPos[barAxis];\n pushSeg('ticks', model.vertical ? [0, 0, 0.995, 0.995] : [0, 0.995, 0.995, 0]);\n\n if (model.renderable.getDrawAboveRangeSwatch() && haveAbove) {\n segSize[barAxis] = oldSegSize;\n startPos[barAxis] += segSpace;\n pushSeg('Above', [1.1, 1.1, 1.1, 1.1]);\n }\n }; // called by updatePolyDataForLabels\n // modifies class constants tmp2v3\n\n\n var tmp2v3 = new Float64Array(3); // anchor point = pos\n // H alignment = left, middle, right\n // V alignment = bottom, middle, top\n // Text Orientation = horizontal, vertical\n // orientation\n\n publicAPI.createPolyDataForOneLabel = function (text, pos, alignment, orientation, offset, results) {\n var value = model._tmAtlas.get(text);\n\n if (!value) {\n return;\n } // have to find the four corners of the texture polygon for this label\n\n\n var ptIdx = results.ptIdx;\n var cellIdx = results.cellIdx; // get achor point in pixels\n\n tmp2v3[0] = (0.5 * pos[0] + 0.5) * model.lastSize[0];\n tmp2v3[1] = (0.5 * pos[1] + 0.5) * model.lastSize[1];\n tmp2v3[2] = pos[2];\n tmp2v3[0] += offset[0];\n tmp2v3[1] += offset[1]; // get text size in display pixels\n\n var textSize = [];\n var textAxes = orientation === 'vertical' ? [1, 0] : [0, 1];\n\n if (orientation === 'vertical') {\n textSize[0] = value.width;\n textSize[1] = -value.height; // update anchor point based on alignment\n\n if (alignment[0] === 'middle') {\n tmp2v3[1] -= value.width / 2.0;\n } else if (alignment[0] === 'right') {\n tmp2v3[1] -= value.width;\n }\n\n if (alignment[1] === 'middle') {\n tmp2v3[0] += value.height / 2.0;\n } else if (alignment[1] === 'top') {\n tmp2v3[0] += value.height;\n }\n } else {\n textSize[0] = value.width;\n textSize[1] = value.height; // update anchor point based on alignment\n\n if (alignment[0] === 'middle') {\n tmp2v3[0] -= value.width / 2.0;\n } else if (alignment[0] === 'right') {\n tmp2v3[0] -= value.width;\n }\n\n if (alignment[1] === 'middle') {\n tmp2v3[1] -= value.height / 2.0;\n } else if (alignment[1] === 'top') {\n tmp2v3[1] -= value.height;\n }\n }\n\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[0];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[1];\n ptIdx++;\n tmp2v3[textAxes[0]] += textSize[0];\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[2];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[3];\n ptIdx++;\n tmp2v3[textAxes[1]] += textSize[1];\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[4];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[5];\n ptIdx++;\n tmp2v3[textAxes[0]] -= textSize[0];\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[6];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[7];\n ptIdx++; // add the two triangles to represent the quad\n\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 3;\n results.polys[cellIdx * 4 + 3] = ptIdx - 2;\n cellIdx++;\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 2;\n results.polys[cellIdx * 4 + 3] = ptIdx - 1;\n results.ptIdx += 4;\n results.cellIdx += 2;\n }; // update the polydata associated with drawing the text labels\n // specifically the quads used for each label and their associated tcoords\n // etc. This changes every time the camera viewpoint changes\n\n\n var tmpv3 = new Float64Array(3);\n\n publicAPI.updatePolyDataForLabels = function () {\n // update the polydata\n var numLabels = publicAPI.getTickStrings().length + model.barSegments.length;\n var numPts = numLabels * 4;\n var numTris = numLabels * 2;\n var points = new Float64Array(numPts * 3);\n var polys = new Uint16Array(numTris * 4);\n var tcoords = new Float32Array(numPts * 2);\n var results = {\n ptIdx: 0,\n cellIdx: 0,\n polys: polys,\n points: points,\n tcoords: tcoords\n }; // compute the direction vector\n\n var offsetAxis = model.vertical ? 0 : 1;\n var spacedAxis = model.vertical ? 1 : 0;\n tmpv3[2] = -0.99; // near plane\n // draw the title\n\n var alignment = model.vertical ? ['right', 'middle'] : ['middle', 'bottom'];\n var dir = [0, 1];\n var tickOffsets = [0, 0];\n\n if (model.vertical) {\n tickOffsets[0] = -model.tickLabelPixelOffset;\n\n if (model.topTitle) {\n tmpv3[0] = model.boxPosition[0] + 0.5 * model.boxSize[0];\n tmpv3[1] = model.barPosition[1] + model.barSize[1]; // write the axis label\n\n publicAPI.createPolyDataForOneLabel(model.renderable.getAxisLabel(), tmpv3, ['middle', 'bottom'], 'horizontal', [0, model.axisTitlePixelOffset], results);\n } else {\n tmpv3[0] = model.barPosition[0] + model.barSize[0];\n tmpv3[1] = model.barPosition[1] + 0.5 * model.barSize[1]; // write the axis label\n\n publicAPI.createPolyDataForOneLabel(model.renderable.getAxisLabel(), tmpv3, ['middle', 'top'], 'vertical', [model.axisTitlePixelOffset, 0], results);\n }\n\n dir = [-1, 0];\n } else {\n tickOffsets[1] = model.tickLabelPixelOffset;\n tmpv3[0] = model.barPosition[0] + 0.5 * model.barSize[0];\n tmpv3[1] = model.barPosition[1] + model.barSize[1];\n publicAPI.createPolyDataForOneLabel(model.renderable.getAxisLabel(), tmpv3, ['middle', 'bottom'], 'horizontal', [0, model.axisTitlePixelOffset], results);\n }\n\n tmpv3[offsetAxis] = model.barPosition[offsetAxis] + (0.5 * dir[offsetAxis] + 0.5) * model.barSize[offsetAxis];\n tmpv3[spacedAxis] = model.barPosition[spacedAxis] + model.barSize[spacedAxis] * 0.5; // draw bar segment labels\n\n var tickSeg = null;\n\n for (var i = 0; i < model.barSegments.length; i++) {\n var seg = model.barSegments[i];\n\n if (seg.title === 'ticks') {\n // handle ticks below\n tickSeg = seg;\n } else {\n tmpv3[spacedAxis] = model.barPosition[spacedAxis] + 0.5 * model.barSize[spacedAxis] * (seg.corners[2][spacedAxis] + seg.corners[0][spacedAxis]);\n publicAPI.createPolyDataForOneLabel(seg.title, tmpv3, alignment, 'horizontal', tickOffsets, results);\n }\n } // write the tick labels\n\n\n var tickSegmentStart = model.barPosition[spacedAxis] + model.barSize[spacedAxis] * tickSeg.corners[0][spacedAxis];\n var tickSegmentSize = model.barSize[spacedAxis] * (tickSeg.corners[2][spacedAxis] - tickSeg.corners[0][spacedAxis]);\n var ticks = publicAPI.getTicks();\n var tickStrings = publicAPI.getTickStrings();\n\n for (var t = 0; t < ticks.length; t++) {\n var tickPos = (ticks[t] - model.lastTickBounds[0]) / (model.lastTickBounds[1] - model.lastTickBounds[0]);\n tmpv3[spacedAxis] = tickSegmentStart + tickSegmentSize * tickPos;\n publicAPI.createPolyDataForOneLabel(tickStrings[t], tmpv3, alignment, 'horizontal', tickOffsets, results);\n }\n\n var tcoordDA = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoords,\n name: 'TextureCoordinates'\n });\n model.tmPolyData.getPointData().setTCoords(tcoordDA);\n model.tmPolyData.getPoints().setData(points, 3);\n model.tmPolyData.getPoints().modified();\n model.tmPolyData.getPolys().setData(polys, 1);\n model.tmPolyData.getPolys().modified();\n model.tmPolyData.modified();\n };\n\n publicAPI.updatePolyDataForBarSegments = function () {\n var _scalarsToColors$getU, _scalarsToColors$getU2;\n\n var scalarsToColors = model.renderable.getScalarsToColors();\n var numberOfExtraColors = 0;\n\n if (model.renderable.getDrawNanAnnotation() && scalarsToColors.getNanColor()) {\n numberOfExtraColors += 1;\n }\n\n if (model.renderable.getDrawBelowRangeSwatch() && (_scalarsToColors$getU = scalarsToColors.getUseBelowRangeColor) !== null && _scalarsToColors$getU !== void 0 && _scalarsToColors$getU.call(scalarsToColors)) {\n numberOfExtraColors += 1;\n }\n\n if (model.renderable.getDrawAboveRangeSwatch() && (_scalarsToColors$getU2 = scalarsToColors.getUseAboveRangeColor) !== null && _scalarsToColors$getU2 !== void 0 && _scalarsToColors$getU2.call(scalarsToColors)) {\n numberOfExtraColors += 1;\n }\n\n var numPts = 4 * (1 + numberOfExtraColors);\n var numQuads = numPts; // handle vector component mode\n\n var numComps = 1;\n\n if (scalarsToColors.getVectorMode() === VectorMode.COMPONENT) {\n numComps = scalarsToColors.getVectorComponent() + 1;\n } // create the colored bars\n\n\n var points = new Float64Array(numPts * 3);\n var cells = new Uint16Array(numQuads * 5);\n var scalars = new Float32Array(numPts * numComps);\n var ptIdx = 0;\n var cellIdx = 0;\n\n for (var i = 0; i < model.barSegments.length; i++) {\n var seg = model.barSegments[i];\n\n for (var e = 0; e < 4; e++) {\n tmpv3[0] = model.barPosition[0] + seg.corners[e][0] * model.barSize[0];\n tmpv3[1] = model.barPosition[1] + seg.corners[e][1] * model.barSize[1];\n points[ptIdx * 3] = (0.5 * tmpv3[0] + 0.5) * model.lastSize[0];\n points[ptIdx * 3 + 1] = (0.5 * tmpv3[1] + 0.5) * model.lastSize[1];\n points[ptIdx * 3 + 2] = tmpv3[2];\n\n for (var nc = 0; nc < numComps; nc++) {\n scalars[ptIdx * numComps + nc] = model.lastTickBounds[0] + seg.scalars[e] * (model.lastTickBounds[1] - model.lastTickBounds[0]);\n }\n\n ptIdx++;\n }\n\n cells[cellIdx * 5] = 4;\n cells[cellIdx * 5 + 1] = ptIdx - 4;\n cells[cellIdx * 5 + 2] = ptIdx - 3;\n cells[cellIdx * 5 + 3] = ptIdx - 2;\n cells[cellIdx * 5 + 4] = ptIdx - 1;\n cellIdx++;\n }\n\n var scalarsDA = vtkDataArray.newInstance({\n numberOfComponents: numComps,\n values: scalars,\n name: 'Scalars'\n });\n model.polyData.getPointData().setScalars(scalarsDA);\n model.polyData.getPoints().setData(points, 3);\n model.polyData.getPoints().modified();\n model.polyData.getPolys().setData(cells, 1);\n model.polyData.getPolys().modified();\n model.polyData.modified();\n };\n}\n\nvar newScalarBarActorHelper = macro.newInstance(function (publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n renderable: null\n };\n Object.assign(model, {}, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['axisTitlePixelOffset', 'tickLabelPixelOffset', 'renderable', 'topTitle', 'ticks', 'tickStrings']);\n macro.get(publicAPI, model, ['lastSize', 'lastAspectRatio', 'lastTickBounds', 'axisTextStyle', 'tickTextStyle', 'barActor', 'tmActor']);\n macro.getArray(publicAPI, model, ['boxPosition', 'boxSize']);\n macro.setArray(publicAPI, model, ['boxPosition', 'boxSize'], 2);\n model.forceUpdate = false;\n model.lastRebuildTime = {};\n macro.obj(model.lastRebuildTime, {\n mtime: 0\n });\n model.lastSize = [-1, -1];\n model.tmCanvas = document.createElement('canvas');\n model.tmContext = model.tmCanvas.getContext('2d');\n model._tmAtlas = new Map();\n model.barMapper = vtkMapper.newInstance();\n model.barMapper.setInterpolateScalarsBeforeMapping(true);\n model.barMapper.setUseLookupTableScalarRange(true);\n model.polyData = vtkPolyData.newInstance();\n model.barMapper.setInputData(model.polyData);\n model.barActor = vtkActor.newInstance();\n model.barActor.setMapper(model.barMapper); // for texture atlas\n\n model.tmPolyData = vtkPolyData.newInstance();\n model.tmMapper = vtkMapper.newInstance();\n model.tmMapper.setInputData(model.tmPolyData);\n model.tmTexture = vtkTexture.newInstance({\n resizable: true\n });\n model.tmTexture.setInterpolate(false);\n model.tmActor = vtkActor.newInstance({\n parentProp: publicAPI\n });\n model.tmActor.setMapper(model.tmMapper);\n model.tmActor.addTexture(model.tmTexture);\n model.barPosition = [0, 0];\n model.barSize = [0, 0];\n model.boxPosition = [0.88, -0.92];\n model.boxSize = [0.1, 1.1]; // internal variables\n\n model.lastTickBounds = [];\n vtkScalarBarActorHelper(publicAPI, model);\n}, 'vtkScalarBarActorHelper'); //\n// Now we define the public class that the application sets view independent\n// properties on. This class is fairly small as it mainly just holds\n// properties setter and getters leaving all calculations to the helper\n// class.\n//\n\nfunction vtkScalarBarActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkScalarBarActor');\n\n publicAPI.setTickTextStyle = function (tickStyle) {\n model.tickTextStyle = _objectSpread(_objectSpread({}, model.tickTextStyle), tickStyle);\n publicAPI.modified();\n };\n\n publicAPI.setAxisTextStyle = function (axisStyle) {\n model.axisTextStyle = _objectSpread(_objectSpread({}, model.axisTextStyle), axisStyle);\n publicAPI.modified();\n };\n\n publicAPI.resetAutoLayoutToDefault = function () {\n publicAPI.setAutoLayout(defaultAutoLayout(publicAPI, model));\n };\n\n publicAPI.resetGenerateTicksToDefault = function () {\n publicAPI.setGenerateTicks(defaultGenerateTicks());\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n automated: true,\n autoLayout: null,\n axisLabel: 'Scalar Value',\n barPosition: [0, 0],\n barSize: [0, 0],\n boxPosition: [0.88, -0.92],\n boxSize: [0.1, 1.1],\n scalarToColors: null,\n axisTitlePixelOffset: 36.0,\n axisTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 18,\n fontFamily: 'serif'\n },\n tickLabelPixelOffset: 14.0,\n tickTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 14,\n fontFamily: 'serif'\n },\n generateTicks: null,\n drawNanAnnotation: true,\n drawBelowRangeSwatch: true,\n drawAboveRangeSwatch: true\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, defaultValues(initialValues));\n if (!model.autoLayout) model.autoLayout = defaultAutoLayout(publicAPI, model);\n if (!model.generateTicks) model.generateTicks = defaultGenerateTicks(); // Inheritance\n\n vtkActor.extend(publicAPI, model, initialValues);\n publicAPI.getProperty().setDiffuse(0.0);\n publicAPI.getProperty().setAmbient(1.0);\n macro.setGet(publicAPI, model, ['automated', 'autoLayout', 'axisTitlePixelOffset', 'axisLabel', 'scalarsToColors', 'tickLabelPixelOffset', 'generateTicks', 'drawNanAnnotation', 'drawBelowRangeSwatch', 'drawAboveRangeSwatch']);\n macro.get(publicAPI, model, ['axisTextStyle', 'tickTextStyle']);\n macro.getArray(publicAPI, model, ['barPosition', 'barSize', 'boxPosition', 'boxSize']);\n macro.setArray(publicAPI, model, ['barPosition', 'barSize', 'boxPosition', 'boxSize'], 2); // Object methods\n\n vtkScalarBarActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkScalarBarActor'); // ----------------------------------------------------------------------------\n\nvar vtkScalarBarActor$1 = {\n newInstance: newInstance,\n extend: extend,\n newScalarBarActorHelper: newScalarBarActorHelper\n};\n\nexport { vtkScalarBarActor$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkScalarBarActor from '../Core/ScalarBarActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLScalarBarActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLScalarBarActor(publicAPI, model) {\n model.classHierarchy.push('vtkOpenGLScalarBarActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n\n if (!model.scalarBarActorHelper.getRenderable()) {\n model.scalarBarActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.scalarBarActorHelper.getBarActor());\n publicAPI.addMissingNode(model.scalarBarActorHelper.getTmActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model._openGLRenderer ? model._openGLRenderer.getRenderable().getActiveCamera() : null;\n\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n model.scalarBarActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model._openGLRenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.scalarBarActorHelper = vtkScalarBarActor.newScalarBarActorHelper(); // Object methods\n\n vtkOpenGLScalarBarActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLScalarBarActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkScalarBarActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar CoordinateSystem = vtkProp.CoordinateSystem; // ----------------------------------------------------------------------------\n// vtkWebGPUActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow');\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.getBufferShift = function (wgpuRen) {\n publicAPI.getKeyMatrices(wgpuRen);\n return model.bufferShift;\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n model.renderable.computeMatrix();\n var mcwc = model.renderable.getMatrix(); // compute the net shift, only apply stabilized coords with world coordinates\n\n model.bufferShift[0] = mcwc[3];\n model.bufferShift[1] = mcwc[7];\n model.bufferShift[2] = mcwc[11];\n var center = wgpuRen.getStabilizedCenterByReference();\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n model.bufferShift[0] -= center[0];\n model.bufferShift[1] -= center[1];\n model.bufferShift[2] -= center[2];\n }\n\n mat4.transpose(model.keyMatrices.bcwc, mcwc);\n\n if (model.renderable.getIsIdentity()) {\n mat4.identity(model.keyMatrices.normalMatrix);\n } else {\n // we use bcwc BEFORE the translate below (just to get transposed mcvc)\n mat4.copy(model.keyMatrices.normalMatrix, model.keyMatrices.bcwc); // zero out translation\n\n model.keyMatrices.normalMatrix[3] = 0.0;\n model.keyMatrices.normalMatrix[7] = 0.0;\n model.keyMatrices.normalMatrix[11] = 0.0;\n mat4.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n } // only need the buffer shift to get to world\n\n\n mat4.translate(model.keyMatrices.bcwc, model.keyMatrices.bcwc, [-model.bufferShift[0], -model.bufferShift[1], -model.bufferShift[2]]); // to get to stabilized we also need the center\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n } else {\n mat4.copy(model.keyMatrices.bcsc, model.keyMatrices.bcwc);\n }\n\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n keyMatricesTime: null,\n keyMatrices: null,\n propID: undefined,\n bufferShift: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n macro.obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n macro.get(publicAPI, model, ['propID', 'keyMatricesTime']);\n model.bufferShift = [0, 0, 0, 0]; // Object methods\n\n vtkWebGPUActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar CoordinateSystem = vtkProp.CoordinateSystem; // ----------------------------------------------------------------------------\n// vtkWebGPUActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUActor2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUActor2D'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow');\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.getBufferShift = function (wgpuRen) {\n publicAPI.getKeyMatrices(wgpuRen);\n return model.bufferShift;\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n // compute the net shift, only apply stabilized coords with world coordinates\n model.bufferShift[0] = 0.0;\n model.bufferShift[1] = 0.0;\n model.bufferShift[2] = 0.0;\n var center = wgpuRen.getStabilizedCenterByReference();\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n model.bufferShift[0] -= center[0];\n model.bufferShift[1] -= center[1];\n model.bufferShift[2] -= center[2];\n }\n\n mat4.identity(model.keyMatrices.bcwc);\n mat4.identity(model.keyMatrices.normalMatrix); // only meed the buffer shift to get to world\n\n mat4.translate(model.keyMatrices.bcwc, model.keyMatrices.bcwc, [-model.bufferShift[0], -model.bufferShift[1], -model.bufferShift[2]]); // to get to stabilized we also need the center\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n } else {\n mat4.copy(model.keyMatrices.bcsc, model.keyMatrices.bcwc);\n }\n\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n keyMatricesTime: null,\n keyMatrices: null,\n propID: undefined,\n bufferShift: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n macro.obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n macro.get(publicAPI, model, ['propID', 'keyMatricesTime']);\n model.bufferShift = [0, 0, 0, 0]; // Object methods\n\n vtkWebGPUActor2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkActor2D', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkCubeAxesActor from '../Core/CubeAxesActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUCubeAxesActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUCubeAxesActor(publicAPI, model) {\n model.classHierarchy.push('vtkWebGPUCubeAxesActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n\n if (!model.CubeAxesActorHelper.getRenderable()) {\n model.CubeAxesActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.CubeAxesActorHelper.getTmActor());\n publicAPI.addMissingNode(model.renderable.getGridActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model.WebGPURenderer ? model.WebGPURenderer.getRenderable().getActiveCamera() : null;\n var tsize = model.WebGPURenderer.getTiledSizeAndOrigin();\n model.CubeAxesActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model.WebGPURenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.CubeAxesActorHelper = vtkCubeAxesActor.newCubeAxesActorHelper(); // Object methods\n\n vtkWebGPUCubeAxesActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUCubeAxesActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkCubeAxesActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './Property2D/Constants.js';\nimport { Representation } from './Property/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar DisplayLocation = Constants.DisplayLocation; // ----------------------------------------------------------------------------\n// vtkProperty2D methods\n// ----------------------------------------------------------------------------\n\nfunction vtkProperty2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProperty2D');\n\n publicAPI.setDisplayLocationToBackground = function () {\n return publicAPI.setDisplayLocation(DisplayLocation.BACKGROUND);\n };\n\n publicAPI.setDisplayLocationToForeground = function () {\n return publicAPI.setDisplayLocation(DisplayLocation.FOREGROUND);\n };\n\n publicAPI.setRepresentationToWireframe = function () {\n return publicAPI.setRepresentation(Representation.WIREFRAME);\n };\n\n publicAPI.setRepresentationToSurface = function () {\n return publicAPI.setRepresentation(Representation.SURFACE);\n };\n\n publicAPI.setRepresentationToPoints = function () {\n return publicAPI.setRepresentation(Representation.POINTS);\n };\n\n publicAPI.getRepresentationAsString = function () {\n return macro.enumToString(Representation, model.representation);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n color: [1, 1, 1],\n opacity: 1,\n pointSize: 1,\n lineWidth: 1,\n representation: Representation.SURFACE,\n displayLocation: DisplayLocation.FOREGROUND\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['opacity', 'lineWidth', 'pointSize', 'displayLocation', 'representation']);\n macro.setGetArray(publicAPI, model, ['color'], 3); // Object methods\n\n vtkProperty2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProperty2D'); // ----------------------------------------------------------------------------\n\nvar vtkProperty2D$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkProperty2D$1 as default, extend, newInstance };\n","import { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, setGet } from '../../macros.js';\nimport vtkMapper from '../Core/Mapper.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkProperty2D from '../Core/Property2D.js';\nimport vtkTexture from '../Core/Texture.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUUniformBuffer from './UniformBuffer.js';\nimport vtkWebGPUSimpleMapper from './SimpleMapper.js';\nimport vtkWebGPUTypes from './Types.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage,\n PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes;\nvar Representation = vtkProperty.Representation;\nvar ScalarMode = vtkMapper.ScalarMode;\nvar CoordinateSystem = vtkProp.CoordinateSystem;\nvar DisplayLocation = vtkProperty2D.DisplayLocation;\nvar vtkWebGPUPolyDataVS = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::Normal::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@vertex\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : vertexOutput;\\n\\n var vertex: vec4 = vertexBC;\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Select::Impl\\n\\n //VTK::Position::Impl\\n\\n return output;\\n}\\n\";\nvar vtkWebGPUPolyDataFS = \"\\nstruct PBRData {\\n diffuse: vec3,\\n specular: vec3,\\n}\\n\\n// Dot product with the max already in it\\nfn mdot(a: vec3, b: vec3) -> f32 {\\n return max(0.0, dot(a, b));\\n}\\n// Dot product with a max in it that does not allow for negative values\\n// Physically based rendering is accurate as long as normals are accurate,\\n// however this is pretty often not the case. In order to prevent negative\\n// values from ruining light calculations and creating zones of zero light,\\n// this remapping is used, which smoothly clamps the dot product between\\n// zero and one while still maintaining a good amount of accuracy.\\nfn cdot(a: vec3, b: vec3) -> f32 {\\n var d: f32 = max(0.0, dot(a, b));\\n d = pow((d + 1) / 2.0, 2.6);\\n return d;\\n}\\n\\n// Lambertian diffuse model\\nfn lambertDiffuse(base: vec3, N: vec3, L: vec3) -> vec3 {\\n var pi: f32 = 3.14159265359; \\n var NdotL: f32 = mdot(N, L);\\n NdotL = pow(NdotL, 1.5);\\n return (base/pi)*NdotL;\\n}\\n\\n// Yasuhiro Fujii improvement on the Oren-Nayar model\\n// https://mimosa-pudica.net/improved-oren-nayar.html\\n// p is surface color, o is roughness\\nfn fujiiOrenNayar(p: vec3, o: f32, N: vec3, L: vec3, V: vec3) -> vec3 {\\n var invpi: f32 = 0.31830988618; // 1/pi\\n\\n var o2 = o*o;\\n var NdotL: f32 = mdot(N, L);\\n NdotL = pow(NdotL, 1.5); // Less physically accurate, but hides the \\\"seams\\\" between lights better\\n\\n var NdotV: f32 = mdot(N, V);\\n var LdotV: f32 = mdot(L, V);\\n\\n var s: f32 = LdotV - NdotL*NdotV;\\n var t: f32 = mix(1, max(NdotL, NdotV), step(0, s)); // Mix with step is the equivalent of an if statement\\n var A: vec3 = 0.5*(o2 / (o2 + 0.33)) + 0.17*p*(o2 / (o2 + 0.13));\\n A = invpi*(1 - A);\\n var B: f32 = 0.45*(o2 / (o2 + 0.09));\\n B = invpi*B;\\n\\n return p*NdotL*(A + B*(s/t));\\n}\\n\\n// Fresnel portion of BRDF (IOR only, simplified)\\nfn schlickFresnelIOR(V: vec3, N: vec3, ior: f32, k: f32) -> f32 {\\n var NdotV: f32 = mdot(V, N);\\n var F0: f32 = (pow((ior - 1.0), 2) + k*k) / (pow((ior + 1.0), 2) + k*k); // This takes into account the roughness, which the other one does not\\n return F0 + (1 - F0) * pow((1-NdotV), 5); \\n}\\n\\n// Fresnel portion of BRDF (Color ior, better)\\nfn schlickFresnelRGB(V: vec3, N: vec3, F0: vec3) -> vec3 {\\n var NdotV: f32 = mdot(V, N);\\n return F0 + (1 - F0) * pow((1-NdotV), 5); \\n}\\n\\n// Normal portion of BRDF\\n// https://learnopengl.com/PBR/Theory\\n// Trowbridge-Reitz GGX functions: normal, halfway, roughness^2\\nfn trGGX(N: vec3, H: vec3, a: f32) -> f32 {\\n var pi: f32 = 3.14159265359; \\n\\n var a2: f32 = a*a;\\n var NdotH = mdot(N, H);\\n var NdotH2 = NdotH*NdotH;\\n \\n var denom: f32 = NdotH2 * (a2 - 1.0) + 1.0;\\n\\n return a2 / max((pi*denom*denom), 0.000001);\\n}\\n\\n// A VERY bad approximation of anisotropy. Real anisotropic calculations require tangent and bitangent\\nfn anisotrophicTrGGX(N: vec3, H: vec3, O: vec3, s: f32, a: f32) -> f32 {\\n var Op: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(O) * s, 0.)).xyz;\\n\\n var ggx1: f32 = trGGX(N + Op*s, H, a);\\n var ggx2: f32 = trGGX(N - Op*s, H, a);\\n return (0.5 * ggx1 + 0.5 * ggx2);\\n}\\n\\n// Geometry portion of BRDF\\nfn schlickGGX(N: vec3, X: vec3, k: f32) -> f32 {\\n var NdotX = cdot(N, X);\\n return NdotX / max(0.000001, (NdotX*(1-k) + k));\\n}\\n\\nfn smithSurfaceRoughness(N: vec3, V: vec3, L: vec3, k: f32) -> f32 {\\n var ggx1: f32 = min(1, schlickGGX(N, V, k));\\n var ggx2: f32 = min(1, schlickGGX(N, L, k));\\n return ggx1*ggx2;\\n}\\n\\n// BRDF Combination\\nfn cookTorrance(D: f32, F: f32, G: f32, N: vec3, V: vec3, L: vec3) -> f32 {\\n var num: f32 = D*F*G;\\n var denom: f32 = 4*cdot(V, N)*cdot(L, N);\\n\\n return num / max(denom, 0.000001);\\n}\\n\\n// Different lighting calculations for different light sources\\nfn calcDirectionalLight(N: vec3, V: vec3, ior: f32, roughness: f32, metallic: f32, direction: vec3, color: vec3, base: vec3) -> PBRData { \\n var L: vec3 = normalize(direction); // Light Vector\\n var H: vec3 = normalize(L + V); // Halfway Vector\\n\\n var alpha = roughness*roughness;\\n var k: f32 = alpha*alpha / 2;\\n\\n var D: f32 = trGGX(N, H, alpha); // Distribution\\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\\n\\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); // Fresnel term is replaced with 1 because it is added later\\n var incoming: vec3 = color;\\n var angle: f32 = mdot(L, N);\\n angle = pow(angle, 1.5);\\n\\n var specular: vec3 = brdf*incoming*angle;\\n // Oren-Nayar gives a clay-like effect when fully rough which some people may not want, so it might be better to give a separate\\n // control property for the diffuse vs specular roughness\\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V); \\n // Stores the specular and diffuse separately to allow for finer post processing\\n var out = PBRData(diffuse, specular);\\n \\n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\\n}\\n\\n// TODO: find some way to reduce the number of arguments going in here\\nfn calcPointLight(N: vec3, V: vec3, fragPos: vec3, ior: f32, roughness: f32, metallic: f32, position: vec3, color: vec3, base: vec3) -> PBRData {\\n var L: vec3 = normalize(position - fragPos); // Light Vector\\n var H: vec3 = normalize(L + V); // Halfway Vector\\n var dist = distance(position, fragPos);\\n\\n var alpha = roughness*roughness;\\n var k: f32 = alpha*alpha / 2; // could also be pow(alpha + 1.0, 2) / 8\\n\\n var D: f32 = trGGX(N, H, alpha); // Distribution\\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\\n\\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); \\n var incoming: vec3 = color * (1. / (dist*dist));\\n var angle: f32 = mdot(L, N);\\n angle = pow(angle, 1.5); // Smoothing factor makes it less accurate, but reduces ugly \\\"seams\\\" bewteen light sources\\n\\n var specular: vec3 = brdf*incoming*angle;\\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V);\\n\\n // Stores the specular and diffuse separately to allow for finer post processing\\n // Could also be done (propably more properly) with a struct\\n var out = PBRData(diffuse, specular);\\n \\n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\\n}\\n\\n// For a reason unknown to me, spheres dont seem to behave propperly with head-on spot lights\\nfn calcSpotLight(N: vec3, V: vec3, fragPos: vec3, ior: f32, roughness: f32, metallic: f32, position: vec3, direction: vec3, cones: vec2, color: vec3, base: vec3) -> PBRData {\\n var L: vec3 = normalize(position - fragPos);\\n var H: vec3 = normalize(L + V); // Halfway Vector\\n var dist = distance(position, fragPos);\\n\\n var alpha = roughness*roughness;\\n var k: f32 = alpha*alpha / 2; // could also be pow(alpha + 1.0, 2) / 8\\n\\n var D: f32 = trGGX(N, H, alpha); // Distribution\\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\\n\\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); \\n \\n // Cones.x is the inner phi and cones.y is the outer phi\\n var theta: f32 = mdot(normalize(direction), L);\\n var epsilon: f32 = cones.x - cones.y;\\n var intensity: f32 = (theta - cones.y) / epsilon;\\n intensity = clamp(intensity, 0.0, 1.0);\\n intensity /= dist*dist;\\n\\n var incoming: vec3 = color * intensity;\\n\\n var angle: f32 = mdot(L, N);\\n angle = pow(angle, 1.5); // Smoothing factor makes it less accurate, but reduces ugly \\\"seams\\\" bewteen light sources\\n\\n var specular: vec3 = brdf*incoming*angle;\\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V);\\n\\n // Stores the specular and diffuse separately to allow for finer post processing\\n // Could also be done (propably more properly) with a struct\\n var out = PBRData(diffuse, specular);\\n \\n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\\n}\\n\\n// Environment mapping stuff\\n// Takes in a vector and converts it to an equivalent coordinate in a rectilinear texture. Should be replaced with cubemaps at some point\\nfn vecToRectCoord(dir: vec3) -> vec2 {\\n var tau: f32 = 6.28318530718;\\n var pi: f32 = 3.14159265359;\\n var out: vec2 = vec2(0.0);\\n\\n out.x = atan2(dir.z, dir.x) / tau;\\n out.x += 0.5;\\n\\n var phix: f32 = length(vec2(dir.x, dir.z));\\n out.y = atan2(dir.y, phix) / pi + 0.5;\\n\\n return out;\\n}\\n\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::TCoord::Dec\\n\\n// optional surface normal declaration\\n//VTK::Normal::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : fragmentOutput;\\n\\n // Temporary ambient, diffuse, and opacity\\n var ambientColor: vec4 = mapperUBO.AmbientColor;\\n var diffuseColor: vec4 = mapperUBO.DiffuseColor;\\n var opacity: f32 = mapperUBO.Opacity;\\n\\n // This should be declared somewhere else\\n var _diffuseMap: vec4 = vec4(1);\\n var _roughnessMap: vec4 = vec4(1);\\n var _metallicMap: vec4 = vec4(1);\\n var _normalMap: vec4 = vec4(0, 0, 1, 0); // normal map was setting off the normal vector detection in fragment\\n var _ambientOcclusionMap: vec4 = vec4(1);\\n var _emissionMap: vec4 = vec4(0);\\n\\n //VTK::Color::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Normal::Impl\\n\\n var computedColor: vec4 = vec4(diffuseColor.rgb, 1.0);\\n\\n //VTK::Light::Impl\\n\\n //VTK::Select::Impl\\n\\n if (computedColor.a == 0.0) { discard; };\\n\\n //VTK::Position::Impl\\n\\n //VTK::RenderEncoder::Impl\\n\\n return output;\\n}\\n\";\n\nfunction isEdges(hash) {\n // edge pipelines have \"edge\" in them\n return hash.indexOf('edge') >= 0;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUCellArrayMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUCellArrayMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUCellArrayMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (model.is2D) {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor2D');\n model.forceZValue = true;\n } else {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');\n model.forceZValue = false;\n }\n\n model.coordinateSystem = model.WebGPUActor.getRenderable().getCoordinateSystem();\n model.useRendererMatrix = model.coordinateSystem !== CoordinateSystem.DISPLAY;\n model.WebGPURenderer = model.WebGPUActor.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n model.device = model.WebGPURenderWindow.getDevice();\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass) {\n if (prepass) {\n publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());\n model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n }\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());\n model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n }\n };\n\n publicAPI.updateUBO = function () {\n // make sure the data is up to date\n var actor = model.WebGPUActor.getRenderable();\n var ppty = actor.getProperty();\n var utime = model.UBO.getSendTime();\n\n if (publicAPI.getMTime() > utime || ppty.getMTime() > utime || model.renderable.getMTime() > utime) {\n var _ppty$getEdgeColorByR;\n\n // Matricies\n var keyMats = model.WebGPUActor.getKeyMatrices(model.WebGPURenderer);\n model.UBO.setArray('BCWCMatrix', keyMats.bcwc);\n model.UBO.setArray('BCSCMatrix', keyMats.bcsc);\n model.UBO.setArray('MCWCNormals', keyMats.normalMatrix);\n\n if (model.is2D) {\n model.UBO.setValue('ZValue', model.WebGPUActor.getRenderable().getProperty().getDisplayLocation() === DisplayLocation.FOREGROUND ? 1.0 : 0.0);\n\n var _aColor = ppty.getColorByReference();\n\n model.UBO.setValue('AmbientIntensity', 1.0);\n model.UBO.setArray('DiffuseColor', [_aColor[0], _aColor[1], _aColor[2], 1.0]);\n model.UBO.setValue('DiffuseIntensity', 0.0);\n model.UBO.setValue('SpecularIntensity', 0.0);\n } else {\n // Base Colors\n var _aColor2 = ppty.getAmbientColorByReference();\n\n model.UBO.setValue('AmbientIntensity', ppty.getAmbient());\n model.UBO.setArray('AmbientColor', [_aColor2[0], _aColor2[1], _aColor2[2], 1.0]);\n model.UBO.setValue('DiffuseIntensity', ppty.getDiffuse());\n _aColor2 = ppty.getDiffuseColorByReference();\n model.UBO.setArray('DiffuseColor', [_aColor2[0], _aColor2[1], _aColor2[2], 1.0]); // Roughness\n\n model.UBO.setValue('Roughness', ppty.getRoughness());\n model.UBO.setValue('BaseIOR', ppty.getBaseIOR()); // Metallic\n\n model.UBO.setValue('Metallic', ppty.getMetallic()); // Normal\n\n model.UBO.setValue('NormalStrength', ppty.getNormalStrength()); // Emission\n\n model.UBO.setValue('Emission', ppty.getEmission()); // Specular\n\n model.UBO.setValue('SpecularIntensity', ppty.getSpecular());\n _aColor2 = ppty.getSpecularColorByReference();\n model.UBO.setArray('SpecularColor', [_aColor2[0], _aColor2[1], _aColor2[2], 1.0]);\n } // Edge and line rendering\n\n\n var aColor = (_ppty$getEdgeColorByR = ppty.getEdgeColorByReference) === null || _ppty$getEdgeColorByR === void 0 ? void 0 : _ppty$getEdgeColorByR.call(ppty);\n\n if (aColor) {\n model.UBO.setArray('EdgeColor', [aColor[0], aColor[1], aColor[2], 1.0]);\n }\n\n model.UBO.setValue('LineWidth', ppty.getLineWidth());\n model.UBO.setValue('Opacity', ppty.getOpacity());\n model.UBO.setValue('PropID', model.WebGPUActor.getPropID());\n var device = model.WebGPURenderWindow.getDevice();\n model.UBO.sendIfNeeded(device);\n }\n };\n\n publicAPI.haveWideLines = function () {\n var actor = model.WebGPUActor.getRenderable();\n var representation = actor.getProperty().getRepresentation();\n\n if (actor.getProperty().getLineWidth() <= 1.0) {\n return false;\n }\n\n if (model.primitiveType === PrimitiveTypes.Verts) {\n return false;\n }\n\n if (model.primitiveType === PrimitiveTypes.Triangles || model.primitiveType === PrimitiveTypes.TriangleStrips) {\n return representation === Representation.WIREFRAME;\n }\n\n return true;\n };\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n if (!vDesc.hasOutput('vertexVC')) vDesc.addOutput('vec4', 'vertexVC');\n var code = vDesc.getCode();\n\n if (model.useRendererMatrix) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var pCoord: vec4 = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;', ' output.vertexVC = rendererUBO.SCVCMatrix * mapperUBO.BCSCMatrix * vec4(vertexBC.xyz, 1.0);', '//VTK::Position::Impl']).result;\n\n if (model.forceZValue) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', ['pCoord = vec4(pCoord.xyz/pCoord.w, 1.0);', 'pCoord.z = mapperUBO.ZValue;', '//VTK::Position::Impl']).result;\n }\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var pCoord: vec4 = mapperUBO.BCSCMatrix*vertexBC;', ' pCoord.x = 2.0* pCoord.x / rendererUBO.viewportSize.x - 1.0;', ' pCoord.y = 2.0* pCoord.y / rendererUBO.viewportSize.y - 1.0;', ' pCoord.z = 0.5 - 0.5 * pCoord.z;', '//VTK::Position::Impl']).result;\n\n if (model.forceZValue) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' pCoord.z = mapperUBO.ZValue;', '//VTK::Position::Impl']).result;\n }\n }\n\n if (publicAPI.haveWideLines()) {\n vDesc.addBuiltinInput('u32', '@builtin(instance_index) instanceIndex'); // widen the edge\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var tmpPos: vec4 = pCoord;', ' var numSteps: f32 = ceil(mapperUBO.LineWidth - 1.0);', ' var offset: f32 = (mapperUBO.LineWidth - 1.0) * (f32(input.instanceIndex / 2u) - numSteps/2.0) / numSteps;', ' var tmpPos2: vec3 = tmpPos.xyz / tmpPos.w;', ' tmpPos2.x = tmpPos2.x + 2.0 * (f32(input.instanceIndex) % 2.0) * offset / rendererUBO.viewportSize.x;', ' tmpPos2.y = tmpPos2.y + 2.0 * (f32(input.instanceIndex + 1u) % 2.0) * offset / rendererUBO.viewportSize.y;', ' tmpPos2.z = min(1.0, tmpPos2.z + 0.00001);', // could become a setting\n ' pCoord = vec4(tmpPos2.xyz * tmpPos.w, tmpPos.w);', '//VTK::Position::Impl']).result;\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' output.Position = pCoord;']).result;\n vDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.replaceShaderNormal = function (hash, pipeline, vertexInput) {\n var normalBuffer = vertexInput.getBuffer('normalMC');\n var actor = model.WebGPUActor.getRenderable();\n\n if (normalBuffer) {\n var vDesc = pipeline.getShaderDescription('vertex');\n\n if (!vDesc.hasOutput('normalVC')) {\n vDesc.addOutput('vec3', 'normalVC', normalBuffer.getArrayInformation()[0].interpolation);\n }\n\n if (!vDesc.hasOutput('tangentVC')) {\n vDesc.addOutput('vec3', 'tangentVC', normalBuffer.getArrayInformation()[0].interpolation);\n }\n\n if (!vDesc.hasOutput('bitangentVC')) {\n vDesc.addOutput('vec3', 'bitangentVC', normalBuffer.getArrayInformation()[0].interpolation);\n }\n\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' output.normalVC = normalize((rendererUBO.WCVCNormals * mapperUBO.MCWCNormals * normalMC).xyz);', // This is just an approximation, but it happens to work extremely well\n // It only works well for normals that are head on and not super angled though\n // Definitely needs to be replaced\n ' var c1: vec3 = cross(output.normalVC, vec3(0, 0, 1));', ' var c2: vec3 = cross(output.normalVC, vec3(0, 1, 0));', ' var tangent: vec3 = mix(c1, c2, distance(c1, c2));', ' output.tangentVC = normalize(tangent);', ' output.bitangentVC = normalize(cross(output.normalVC, tangent));']).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n\n if (actor.getProperty().getNormalTexture()) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' var normal: vec3 = input.normalVC;', ' if (!input.frontFacing) { normal = -normal; }', ' var tangent: vec3 = input.tangentVC;', ' var bitangent: vec3 = input.bitangentVC;', ' var TCVCMatrix: mat3x3 = mat3x3(', ' tangent.x, bitangent.x, normal.x,', ' tangent.y, bitangent.y, normal.y,', ' tangent.z, bitangent.z, normal.z,', ' );', ' var mappedNormal: vec3 = TCVCMatrix * (_normalMap.xyz * 2 - 1);', ' normal = mix(normal, mappedNormal, mapperUBO.NormalStrength);', ' normal = normalize(normal);']).result;\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' var normal: vec3 = input.normalVC;', ' if (!input.frontFacing) { normal = -normal; }', ' normal = normalize(normal);']).result;\n }\n\n fDesc.setCode(code);\n }\n };\n\n model.shaderReplacements.set('replaceShaderNormal', publicAPI.replaceShaderNormal); // we only apply lighting when there is a \"var normal\" declaration in the\n // fragment shader code. That is the lighting trigger.\n\n publicAPI.replaceShaderLight = function (hash, pipeline, vertexInput) {\n if (hash.includes('sel')) return;\n var vDesc = pipeline.getShaderDescription('vertex');\n if (!vDesc.hasOutput('vertexVC')) vDesc.addOutput('vec4', 'vertexVC');\n var renderer = model.WebGPURenderer.getRenderable();\n var fDesc = pipeline.getShaderDescription('fragment');\n var code = fDesc.getCode(); // Code that runs if the fragment shader includes normals\n\n if (code.includes('var normal:') && model.useRendererMatrix && !isEdges(hash) && !model.is2D && !hash.includes('sel')) {\n var _renderer$getEnvironm;\n\n var lightingCode = [// Constants\n ' var pi: f32 = 3.14159265359;', // Vectors needed for light calculations\n ' var fragPos: vec3 = vec3(input.vertexVC.xyz);', ' var V: vec3 = mix(normalize(-fragPos), vec3(0, 0, 1), f32(rendererUBO.cameraParallel)); // View Vector', // Values needed for light calculations\n ' var baseColor: vec3 = _diffuseMap.rgb * diffuseColor.rgb;', ' var roughness: f32 = max(0.000001, mapperUBO.Roughness * _roughnessMap.r);', // Need to have a different way of sampling greyscale values aside from .r\n ' var metallic: f32 = mapperUBO.Metallic * _metallicMap.r;', ' var alpha: f32 = roughness*roughness;', ' var ior: f32 = mapperUBO.BaseIOR;', ' var k: f32 = alpha*alpha / 2;', // Split diffuse and specular components\n ' var diffuse: vec3 = vec3(0.);', ' var specular: vec3 = vec3(0.);', ' var emission: vec3 = _emissionMap.rgb * mapperUBO.Emission;', // Summing diffuse and specular components of directional lights\n ' {', ' var i: i32 = 0;', ' loop {', ' if !(i < rendererUBO.LightCount) { break; }', ' switch (i32(rendererLightSSBO.values[i].LightData.x)) {', ' // Point Light', ' case 0 {', ' var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;', ' var pos: vec3 = (rendererLightSSBO.values[i].LightPos).xyz;', ' var calculated: PBRData = calcPointLight(normal, V, fragPos, ior, roughness, metallic, pos, color, baseColor);', ' diffuse += max(vec3(0), calculated.diffuse);', ' specular += max(vec3(0), calculated.specular);', ' }', ' // Directional light', ' case 1 {', ' var dir: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(rendererLightSSBO.values[i].LightDir.xyz), 0.)).xyz;', ' dir = normalize(dir);', ' var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;', ' var calculated: PBRData = calcDirectionalLight(normal, V, ior, roughness, metallic, dir, color, baseColor); // diffuseColor.rgb needs to be fixed with a more dynamic diffuse color', ' diffuse += max(vec3(0), calculated.diffuse);', ' specular += max(vec3(0), calculated.specular);', ' }', ' // Spot Light', ' case 2 {', ' var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;', ' var pos: vec3 = (rendererLightSSBO.values[i].LightPos).xyz;', ' var dir: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(rendererLightSSBO.values[i].LightDir.xyz), 0.)).xyz;', ' dir = normalize(dir);', ' var cones: vec2 = vec2(rendererLightSSBO.values[i].LightData.y, rendererLightSSBO.values[i].LightData.z);', ' var calculated: PBRData = calcSpotLight(normal, V, fragPos, ior, roughness, metallic, pos, dir, cones, color, baseColor);', ' diffuse += max(vec3(0), calculated.diffuse);', ' specular += max(vec3(0), calculated.specular);', ' }', ' default { continue; }', ' }', ' continuing { i++; }', ' }', ' }', // Final variables for combining specular and diffuse\n ' var fresnel: f32 = schlickFresnelIOR(V, normal, ior, k); // Fresnel', ' fresnel = min(1, fresnel);', ' // This could be controlled with its own variable (that isnt base color) for better artistic control', ' var fresnelMetallic: vec3 = schlickFresnelRGB(V, normal, baseColor); // Fresnel for metal, takes color into account', ' var kS: vec3 = mix(vec3(fresnel), fresnelMetallic, metallic);', ' kS = min(vec3(1), kS);', ' var kD: vec3 = (1.0 - kS) * (1.0 - metallic);', ' var PBR: vec3 = mapperUBO.DiffuseIntensity*kD*diffuse + kS*specular;', ' PBR += emission;', ' computedColor = vec4(PBR, mapperUBO.Opacity);'];\n\n if ((_renderer$getEnvironm = renderer.getEnvironmentTexture()) !== null && _renderer$getEnvironm !== void 0 && _renderer$getEnvironm.getImageLoaded()) {\n lightingCode.push(' // To get diffuse IBL, the texture is sampled with normals in worldspace', ' var diffuseIBLCoords: vec3 = (transpose(rendererUBO.WCVCNormals) * vec4(normal, 1.)).xyz;', ' var diffuseCoords: vec2 = vecToRectCoord(diffuseIBLCoords);', ' // To get specular IBL, the texture is sampled as the worldspace reflection between the normal and view vectors', ' // Reflections are first calculated in viewspace, then converted to worldspace to sample the environment', ' var VreflN: vec3 = normalize(reflect(-V, normal));', ' var reflectionIBLCoords = (transpose(rendererUBO.WCVCNormals) * vec4(VreflN, 1.)).xyz;', ' var specularCoords: vec2 = vecToRectCoord(reflectionIBLCoords);', ' var diffuseIBL = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, diffuseCoords, rendererUBO.MaxEnvironmentMipLevel);', // Level multiplier should be set by UBO\n ' var level = roughness * rendererUBO.MaxEnvironmentMipLevel;', ' var specularIBL = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, specularCoords, level);', // Manual mip smoothing since not all formats support smooth level sampling\n ' var specularIBLContribution: vec3 = specularIBL.rgb*rendererUBO.BackgroundSpecularStrength;', ' computedColor += vec4(specularIBLContribution*kS, 0);', ' var diffuseIBLContribution: vec3 = diffuseIBL.rgb*rendererUBO.BackgroundDiffuseStrength;', ' diffuseIBLContribution *= baseColor * _ambientOcclusionMap.rgb;', // Multipy by baseColor may be changed\n ' computedColor += vec4(diffuseIBLContribution*kD, 0);');\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', lightingCode).result;\n fDesc.setCode(code); // If theres no normals, just set the specular color to be flat\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', [' var diffuse: vec3 = diffuseColor.rgb;', ' var specular: vec3 = mapperUBO.SpecularColor.rgb * mapperUBO.SpecularColor.a;', ' computedColor = vec4(diffuse * _diffuseMap.rgb, mapperUBO.Opacity);']).result;\n fDesc.setCode(code);\n }\n };\n\n model.shaderReplacements.set('replaceShaderLight', publicAPI.replaceShaderLight);\n\n publicAPI.replaceShaderColor = function (hash, pipeline, vertexInput) {\n // By default, set the colors to be flat\n if (isEdges(hash)) {\n var _fDesc = pipeline.getShaderDescription('fragment');\n\n var _code = _fDesc.getCode();\n\n _code = vtkWebGPUShaderCache.substitute(_code, '//VTK::Color::Impl', ['ambientColor = mapperUBO.EdgeColor;', 'diffuseColor = mapperUBO.EdgeColor;']).result;\n\n _fDesc.setCode(_code);\n\n return;\n } // If there's no vertex color buffer return the shader as is\n\n\n var colorBuffer = vertexInput.getBuffer('colorVI');\n if (!colorBuffer) return; // Modifies the vertex shader to include the vertex colors and interpolation in the outputs\n\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addOutput('vec4', 'color', colorBuffer.getArrayInformation()[0].interpolation);\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', [' output.color = colorVI;']).result;\n vDesc.setCode(code); // Sets the fragment shader to accept the color inputs from the vertex shader\n\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', ['ambientColor = input.color;', 'diffuseColor = input.color;', 'opacity = mapperUBO.Opacity * input.color.a;']).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderColor', publicAPI.replaceShaderColor);\n\n publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {\n var _actor$getProperty$ge, _actor$getProperty, _actor$getProperty$ge2, _actor$getProperty$ge4, _actor$getProperty3, _actor$getProperty$ge5, _actor$getProperty$ge6, _actor$getProperty4, _actor$getProperty$ge7, _actor$getProperty$ge8, _actor$getProperty5, _actor$getProperty$ge9, _actor$getProperty$ge10, _actor$getProperty6, _actor$getProperty$ge11, _actor$getProperty$ge12, _actor$getProperty7, _actor$getProperty$ge13;\n\n if (!vertexInput.hasAttribute('tcoord')) return;\n var vDesc = pipeline.getShaderDescription('vertex');\n var tcoords = vertexInput.getBuffer('tcoord');\n var numComp = vtkWebGPUTypes.getNumberOfComponentsFromBufferFormat(tcoords.getArrayInformation()[0].format);\n var code = vDesc.getCode();\n vDesc.addOutput(\"vec\".concat(numComp, \"\"), 'tcoordVS');\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', [' output.tcoordVS = tcoord;']).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n var actor = model.WebGPUActor.getRenderable();\n\n var checkDims = function checkDims(texture) {\n if (!texture) return false;\n var dims = texture.getDimensionality();\n return dims === numComp;\n };\n\n var usedTextures = [];\n\n if ((_actor$getProperty$ge = (_actor$getProperty = actor.getProperty()).getDiffuseTexture) !== null && _actor$getProperty$ge !== void 0 && (_actor$getProperty$ge2 = _actor$getProperty$ge.call(_actor$getProperty)) !== null && _actor$getProperty$ge2 !== void 0 && _actor$getProperty$ge2.getImageLoaded() || actor.getTextures()[0] || model.colorTexture) {\n var _actor$getProperty$ge3, _actor$getProperty2;\n\n if ( // Chained or statements here are questionable\n checkDims((_actor$getProperty$ge3 = (_actor$getProperty2 = actor.getProperty()).getDiffuseTexture) === null || _actor$getProperty$ge3 === void 0 ? void 0 : _actor$getProperty$ge3.call(_actor$getProperty2)) || checkDims(actor.getTextures()[0]) || checkDims(model.colorTexture)) {\n usedTextures.push('_diffuseMap = textureSample(DiffuseTexture, DiffuseTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge4 = (_actor$getProperty3 = actor.getProperty()).getRoughnessTexture) !== null && _actor$getProperty$ge4 !== void 0 && (_actor$getProperty$ge5 = _actor$getProperty$ge4.call(_actor$getProperty3)) !== null && _actor$getProperty$ge5 !== void 0 && _actor$getProperty$ge5.getImageLoaded()) {\n if (checkDims(actor.getProperty().getRoughnessTexture())) {\n usedTextures.push('_roughnessMap = textureSample(RoughnessTexture, RoughnessTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge6 = (_actor$getProperty4 = actor.getProperty()).getMetallicTexture) !== null && _actor$getProperty$ge6 !== void 0 && (_actor$getProperty$ge7 = _actor$getProperty$ge6.call(_actor$getProperty4)) !== null && _actor$getProperty$ge7 !== void 0 && _actor$getProperty$ge7.getImageLoaded()) {\n if (checkDims(actor.getProperty().getMetallicTexture())) {\n usedTextures.push('_metallicMap = textureSample(MetallicTexture, MetallicTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge8 = (_actor$getProperty5 = actor.getProperty()).getNormalTexture) !== null && _actor$getProperty$ge8 !== void 0 && (_actor$getProperty$ge9 = _actor$getProperty$ge8.call(_actor$getProperty5)) !== null && _actor$getProperty$ge9 !== void 0 && _actor$getProperty$ge9.getImageLoaded()) {\n if (checkDims(actor.getProperty().getNormalTexture())) {\n usedTextures.push('_normalMap = textureSample(NormalTexture, NormalTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge10 = (_actor$getProperty6 = actor.getProperty()).getAmbientOcclusionTexture) !== null && _actor$getProperty$ge10 !== void 0 && (_actor$getProperty$ge11 = _actor$getProperty$ge10.call(_actor$getProperty6)) !== null && _actor$getProperty$ge11 !== void 0 && _actor$getProperty$ge11.getImageLoaded()) {\n if (checkDims(actor.getProperty().getAmbientOcclusionTexture())) {\n usedTextures.push('_ambientOcclusionMap = textureSample(AmbientOcclusionTexture, AmbientOcclusionTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge12 = (_actor$getProperty7 = actor.getProperty()).getEmissionTexture) !== null && _actor$getProperty$ge12 !== void 0 && (_actor$getProperty$ge13 = _actor$getProperty$ge12.call(_actor$getProperty7)) !== null && _actor$getProperty$ge13 !== void 0 && _actor$getProperty$ge13.getImageLoaded()) {\n if (checkDims(actor.getProperty().getEmissionTexture())) {\n usedTextures.push('_emissionMap = textureSample(EmissionTexture, EmissionTextureSampler, input.tcoordVS);');\n }\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', usedTextures).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);\n\n publicAPI.replaceShaderSelect = function (hash, pipeline, vertexInput) {\n if (hash.includes('sel')) {\n var fDesc = pipeline.getShaderDescription('fragment');\n var code = fDesc.getCode(); // by default there are no composites, so just 0\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Select::Impl', [' var compositeID: u32 = 0u;']).result;\n fDesc.setCode(code);\n }\n };\n\n model.shaderReplacements.set('replaceShaderSelect', publicAPI.replaceShaderSelect);\n\n publicAPI.getUsage = function (rep, i) {\n if (rep === Representation.POINTS || i === PrimitiveTypes.Points) {\n return BufferUsage.Verts;\n }\n\n if (i === PrimitiveTypes.Lines) {\n return BufferUsage.Lines;\n }\n\n if (rep === Representation.WIREFRAME) {\n if (i === PrimitiveTypes.Triangles) {\n return BufferUsage.LinesFromTriangles;\n }\n\n return BufferUsage.LinesFromStrips;\n }\n\n if (i === PrimitiveTypes.Triangles) {\n return BufferUsage.Triangles;\n }\n\n if (i === PrimitiveTypes.TriangleStrips) {\n return BufferUsage.Strips;\n }\n\n if (i === PrimitiveTypes.TriangleEdges) {\n return BufferUsage.LinesFromTriangles;\n } // only strip edges left which are lines\n\n\n return BufferUsage.LinesFromStrips;\n };\n\n publicAPI.getHashFromUsage = function (usage) {\n return \"pt\".concat(usage);\n };\n\n publicAPI.getTopologyFromUsage = function (usage) {\n switch (usage) {\n case BufferUsage.Triangles:\n return 'triangle-list';\n\n case BufferUsage.Verts:\n return 'point-list';\n\n case BufferUsage.Lines:\n default:\n return 'line-list';\n }\n }; // TODO: calculate tangents\n\n\n publicAPI.buildVertexInput = function () {\n var _model$renderable$get, _model$renderable;\n\n var pd = model.currentInput;\n var cells = model.cellArray;\n var primType = model.primitiveType;\n var actor = model.WebGPUActor.getRenderable();\n var representation = actor.getProperty().getRepresentation();\n var device = model.WebGPURenderWindow.getDevice();\n var edges = false;\n\n if (primType === PrimitiveTypes.TriangleEdges) {\n edges = true;\n representation = Representation.WIREFRAME;\n }\n\n var vertexInput = model.vertexInput;\n var points = pd.getPoints();\n var indexBuffer; // get the flat mapping indexBuffer for the cells\n\n if (cells) {\n var buffRequest = {\n hash: \"R\".concat(representation, \"P\").concat(primType).concat(cells.getMTime()),\n usage: BufferUsage.Index,\n cells: cells,\n numberOfPoints: points.getNumberOfPoints(),\n primitiveType: primType,\n representation: representation\n };\n indexBuffer = device.getBufferManager().getBuffer(buffRequest);\n vertexInput.setIndexBuffer(indexBuffer);\n } else {\n vertexInput.setIndexBuffer(null);\n } // hash = all things that can change the values on the buffer\n // since mtimes are unique we can use\n // - indexBuffer mtime - because cells drive how we pack\n // - relevant dataArray mtime - the source data\n // - shift - not currently captured\n // - scale - not currently captured\n // - format\n // - usage\n // - packExtra - covered by format\n // points\n\n\n if (points) {\n var shift = model.WebGPUActor.getBufferShift(model.WebGPURenderer);\n var _buffRequest = {\n hash: \"\".concat(points.getMTime(), \"I\").concat(indexBuffer.getMTime()).concat(shift.join(), \"float32x4\"),\n usage: BufferUsage.PointArray,\n format: 'float32x4',\n dataArray: points,\n indexBuffer: indexBuffer,\n shift: shift,\n packExtra: true\n };\n var buff = device.getBufferManager().getBuffer(_buffRequest);\n vertexInput.addBuffer(buff, ['vertexBC']);\n } else {\n vertexInput.removeBufferIfPresent('vertexBC');\n } // normals, only used for surface rendering\n\n\n var usage = publicAPI.getUsage(representation, primType);\n model._usesCellNormals = false;\n\n if (!model.is2D && ( // no lighting on Property2D\n usage === BufferUsage.Triangles || usage === BufferUsage.Strips)) {\n var normals = pd.getPointData().getNormals(); // https://vtk.org/doc/nightly/html/classvtkPolyDataTangents.html\n // Need to find some way of using precomputed tangents (or computing new ones)\n\n var _buffRequest2 = {\n format: 'snorm8x4',\n indexBuffer: indexBuffer,\n packExtra: true,\n shift: 0,\n scale: 127\n };\n\n if (normals) {\n _buffRequest2.hash = \"\".concat(normals.getMTime(), \"I\").concat(indexBuffer.getMTime(), \"snorm8x4\");\n _buffRequest2.dataArray = normals;\n _buffRequest2.usage = BufferUsage.PointArray;\n\n var _buff = device.getBufferManager().getBuffer(_buffRequest2);\n\n vertexInput.addBuffer(_buff, ['normalMC']);\n } else if (primType === PrimitiveTypes.Triangles) {\n model._usesCellNormals = true;\n _buffRequest2.hash = \"PFN\".concat(points.getMTime(), \"I\").concat(indexBuffer.getMTime(), \"snorm8x4\");\n _buffRequest2.dataArray = points;\n _buffRequest2.cells = cells;\n _buffRequest2.usage = BufferUsage.NormalsFromPoints;\n\n var _buff2 = device.getBufferManager().getBuffer(_buffRequest2);\n\n vertexInput.addBuffer(_buff2, ['normalMC']);\n } else {\n vertexInput.removeBufferIfPresent('normalMC');\n }\n } else {\n vertexInput.removeBufferIfPresent('normalMC');\n } // deal with colors but only if modified\n\n\n var haveColors = false;\n\n if (model.renderable.getScalarVisibility()) {\n var c = model.renderable.getColorMapColors();\n\n if (c && !edges) {\n var scalarMode = model.renderable.getScalarMode();\n var haveCellScalars = false; // We must figure out how the scalars should be mapped to the polydata.\n\n if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !pd.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {\n haveCellScalars = true;\n }\n\n var _buffRequest3 = {\n usage: BufferUsage.PointArray,\n format: 'unorm8x4',\n hash: \"\".concat(haveCellScalars).concat(c.getMTime(), \"I\").concat(indexBuffer.getMTime(), \"unorm8x4\"),\n dataArray: c,\n indexBuffer: indexBuffer,\n cellData: haveCellScalars,\n cellOffset: 0\n };\n\n var _buff3 = device.getBufferManager().getBuffer(_buffRequest3);\n\n vertexInput.addBuffer(_buff3, ['colorVI']);\n haveColors = true;\n }\n }\n\n if (!haveColors) {\n vertexInput.removeBufferIfPresent('colorVI');\n }\n\n var tcoords = null;\n\n if ((_model$renderable$get = (_model$renderable = model.renderable).getInterpolateScalarsBeforeMapping) !== null && _model$renderable$get !== void 0 && _model$renderable$get.call(_model$renderable) && model.renderable.getColorCoordinates()) {\n tcoords = model.renderable.getColorCoordinates();\n } else {\n tcoords = pd.getPointData().getTCoords();\n }\n\n if (tcoords && !edges) {\n var _buff4 = device.getBufferManager().getBufferForPointArray(tcoords, vertexInput.getIndexBuffer());\n\n vertexInput.addBuffer(_buff4, ['tcoord']);\n } else {\n vertexInput.removeBufferIfPresent('tcoord');\n }\n };\n\n publicAPI.updateTextures = function () {\n var _model$renderable$get2, _model$renderable2, _actor$getProperty$ge14, _actor$getProperty8, _actor$getProperty$ge15, _actor$getProperty9, _actor$getProperty$ge16, _actor$getProperty10, _actor$getProperty$ge17, _actor$getProperty11, _actor$getProperty$ge18, _actor$getProperty12, _actor$getProperty$ge19, _actor$getProperty13, _renderer$getEnvironm2;\n\n // we keep track of new and used textures so\n // that we can clean up any unused textures so we don't hold onto them\n var usedTextures = [];\n var newTextures = []; // do we have a scalar color texture\n\n var idata = (_model$renderable$get2 = (_model$renderable2 = model.renderable).getColorTextureMap) === null || _model$renderable$get2 === void 0 ? void 0 : _model$renderable$get2.call(_model$renderable2);\n\n if (idata) {\n if (!model.colorTexture) {\n model.colorTexture = vtkTexture.newInstance({\n label: 'polyDataColor'\n });\n }\n\n model.colorTexture.setInputData(idata);\n newTextures.push(['Diffuse', model.colorTexture]);\n } // actor textures?\n\n\n var actor = model.WebGPUActor.getRenderable();\n var renderer = model.WebGPURenderer.getRenderable(); // Reusing the old code for new and old textures, just loading in from properties instead of actor.getTextures()\n\n var textures = []; // Feels like there should be a better way than individually adding all\n\n if ((_actor$getProperty$ge14 = (_actor$getProperty8 = actor.getProperty()).getDiffuseTexture) !== null && _actor$getProperty$ge14 !== void 0 && _actor$getProperty$ge14.call(_actor$getProperty8)) {\n var pair = ['Diffuse', actor.getProperty().getDiffuseTexture()];\n textures.push(pair);\n }\n\n if (actor.getTextures()[0]) {\n var _pair = ['Diffuse', actor.getTextures()[0]];\n textures.push(_pair);\n }\n\n if (model.colorTexture) {\n var _pair2 = ['Diffuse', model.colorTexture];\n textures.push(_pair2);\n }\n\n if ((_actor$getProperty$ge15 = (_actor$getProperty9 = actor.getProperty()).getRoughnessTexture) !== null && _actor$getProperty$ge15 !== void 0 && _actor$getProperty$ge15.call(_actor$getProperty9)) {\n var _pair3 = ['Roughness', actor.getProperty().getRoughnessTexture()];\n textures.push(_pair3);\n }\n\n if ((_actor$getProperty$ge16 = (_actor$getProperty10 = actor.getProperty()).getMetallicTexture) !== null && _actor$getProperty$ge16 !== void 0 && _actor$getProperty$ge16.call(_actor$getProperty10)) {\n var _pair4 = ['Metallic', actor.getProperty().getMetallicTexture()];\n textures.push(_pair4);\n }\n\n if ((_actor$getProperty$ge17 = (_actor$getProperty11 = actor.getProperty()).getNormalTexture) !== null && _actor$getProperty$ge17 !== void 0 && _actor$getProperty$ge17.call(_actor$getProperty11)) {\n var _pair5 = ['Normal', actor.getProperty().getNormalTexture()];\n textures.push(_pair5);\n }\n\n if ((_actor$getProperty$ge18 = (_actor$getProperty12 = actor.getProperty()).getAmbientOcclusionTexture) !== null && _actor$getProperty$ge18 !== void 0 && _actor$getProperty$ge18.call(_actor$getProperty12)) {\n var _pair6 = ['AmbientOcclusion', actor.getProperty().getAmbientOcclusionTexture()];\n textures.push(_pair6);\n }\n\n if ((_actor$getProperty$ge19 = (_actor$getProperty13 = actor.getProperty()).getEmissionTexture) !== null && _actor$getProperty$ge19 !== void 0 && _actor$getProperty$ge19.call(_actor$getProperty13)) {\n var _pair7 = ['Emission', actor.getProperty().getEmissionTexture()];\n textures.push(_pair7);\n }\n\n if ((_renderer$getEnvironm2 = renderer.getEnvironmentTexture) !== null && _renderer$getEnvironm2 !== void 0 && _renderer$getEnvironm2.call(renderer)) {\n var _pair8 = ['Environment', renderer.getEnvironmentTexture()];\n textures.push(_pair8);\n }\n\n for (var i = 0; i < textures.length; i++) {\n if (textures[i][1].getInputData() || textures[i][1].getJsImageData() || textures[i][1].getCanvas()) {\n newTextures.push(textures[i]);\n }\n\n if (textures[i][1].getImage() && textures[i][1].getImageLoaded()) {\n newTextures.push(textures[i]);\n }\n }\n\n for (var _i = 0; _i < newTextures.length; _i++) {\n var srcTexture = newTextures[_i][1];\n var textureName = newTextures[_i][0];\n var newTex = model.device.getTextureManager().getTextureForVTKTexture(srcTexture); // Generates hash\n\n if (newTex.getReady()) {\n // is this a new texture\n var found = false;\n\n for (var t = 0; t < model.textures.length; t++) {\n if (model.textures[t] === newTex) {\n found = true;\n usedTextures[t] = true;\n }\n }\n\n if (!found) {\n usedTextures[model.textures.length] = true;\n var tview = newTex.createView(\"\".concat(textureName, \"Texture\"));\n model.textures.push(newTex);\n model.textureViews.push(tview);\n var interpolate = srcTexture.getInterpolate() ? 'linear' : 'nearest';\n var addressMode = null;\n if (!addressMode && srcTexture.getEdgeClamp() && srcTexture.getRepeat()) addressMode = 'mirror-repeat';\n if (!addressMode && srcTexture.getEdgeClamp()) addressMode = 'clamp-to-edge';\n if (!addressMode && srcTexture.getRepeat()) addressMode = 'repeat';\n\n if (textureName !== 'Environment') {\n tview.addSampler(model.device, {\n addressModeU: addressMode,\n addressModeV: addressMode,\n addressModeW: addressMode,\n minFilter: interpolate,\n magFilter: interpolate\n });\n } else {\n tview.addSampler(model.device, {\n addressModeU: 'repeat',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'repeat',\n minFilter: interpolate,\n magFilter: interpolate,\n mipmapFilter: 'linear'\n });\n }\n }\n }\n } // remove unused textures\n\n\n for (var _i2 = model.textures.length - 1; _i2 >= 0; _i2--) {\n if (!usedTextures[_i2]) {\n model.textures.splice(_i2, 1);\n model.textureViews.splice(_i2, 1);\n }\n }\n }; // compute a unique hash for a pipeline, this needs to be unique enough to\n // capture any pipeline code changes (which includes shader changes)\n // or vertex input changes/ bind groups/ etc\n\n\n publicAPI.computePipelineHash = function () {\n var pipelineHash = \"pd\".concat(model.useRendererMatrix ? 'r' : '').concat(model.forceZValue ? 'z' : '');\n\n if (model.primitiveType === PrimitiveTypes.TriangleEdges || model.primitiveType === PrimitiveTypes.TriangleStripEdges) {\n pipelineHash += 'edge';\n } else {\n if (model.vertexInput.hasAttribute(\"normalMC\")) {\n pipelineHash += \"n\";\n }\n\n if (model.vertexInput.hasAttribute(\"colorVI\")) {\n pipelineHash += \"c\";\n }\n\n if (model.vertexInput.hasAttribute(\"tcoord\")) {\n var tcoords = model.vertexInput.getBuffer('tcoord');\n var numComp = vtkWebGPUTypes.getNumberOfComponentsFromBufferFormat(tcoords.getArrayInformation()[0].format);\n pipelineHash += \"t\".concat(numComp);\n }\n\n if (model.textures.length) {\n pipelineHash += \"tx\".concat(model.textures.length);\n }\n }\n\n if (model._usesCellNormals) {\n pipelineHash += \"cn\";\n }\n\n if (model.SSBO) {\n pipelineHash += \"ssbo\";\n }\n\n var uhash = publicAPI.getHashFromUsage(model.usage);\n pipelineHash += uhash;\n pipelineHash += model.renderEncoder.getPipelineHash();\n model.pipelineHash = pipelineHash;\n };\n\n publicAPI.updateBuffers = function () {\n // handle textures if not edges\n if (model.primitiveType !== PrimitiveTypes.TriangleEdges && model.primitiveType !== PrimitiveTypes.TriangleStripEdges) {\n publicAPI.updateTextures();\n }\n\n var actor = model.WebGPUActor.getRenderable();\n var rep = actor.getProperty().getRepresentation(); // handle per primitive type\n\n model.usage = publicAPI.getUsage(rep, model.primitiveType);\n publicAPI.buildVertexInput();\n var vbo = model.vertexInput.getBuffer('vertexBC');\n publicAPI.setNumberOfVertices(vbo.getSizeInBytes() / vbo.getStrideInBytes());\n publicAPI.setTopology(publicAPI.getTopologyFromUsage(model.usage));\n publicAPI.updateUBO();\n\n if (publicAPI.haveWideLines()) {\n var ppty = actor.getProperty();\n publicAPI.setNumberOfInstances(Math.ceil(ppty.getLineWidth() * 2.0));\n } else {\n publicAPI.setNumberOfInstances(1);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n is2D: false,\n cellArray: null,\n currentInput: null,\n cellOffset: 0,\n primitiveType: 0,\n colorTexture: null,\n renderEncoder: null,\n textures: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initiaLalues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initiaLalues); // Inheritance\n\n vtkWebGPUSimpleMapper.extend(publicAPI, model, initiaLalues);\n model.fragmentShaderTemplate = vtkWebGPUPolyDataFS;\n model.vertexShaderTemplate = vtkWebGPUPolyDataVS;\n model._tmpMat3 = mat3.identity(new Float64Array(9));\n model._tmpMat4 = mat4.identity(new Float64Array(16)); // UBO\n\n model.UBO = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n model.UBO.addEntry('BCWCMatrix', 'mat4x4');\n model.UBO.addEntry('BCSCMatrix', 'mat4x4');\n model.UBO.addEntry('MCWCNormals', 'mat4x4');\n model.UBO.addEntry('AmbientColor', 'vec4');\n model.UBO.addEntry('DiffuseColor', 'vec4');\n model.UBO.addEntry('EdgeColor', 'vec4');\n model.UBO.addEntry('SpecularColor', 'vec4');\n model.UBO.addEntry('AmbientIntensity', 'f32');\n model.UBO.addEntry('DiffuseIntensity', 'f32');\n model.UBO.addEntry('Roughness', 'f32');\n model.UBO.addEntry('Metallic', 'f32');\n model.UBO.addEntry('Ambient', 'f32');\n model.UBO.addEntry('Normal', 'f32');\n model.UBO.addEntry('Emission', 'f32');\n model.UBO.addEntry('NormalStrength', 'f32');\n model.UBO.addEntry('BaseIOR', 'f32');\n model.UBO.addEntry('SpecularIntensity', 'f32');\n model.UBO.addEntry('LineWidth', 'f32');\n model.UBO.addEntry('Opacity', 'f32');\n model.UBO.addEntry('ZValue', 'f32');\n model.UBO.addEntry('PropID', 'u32');\n model.UBO.addEntry('ClipNear', 'f32');\n model.UBO.addEntry('ClipFar', 'f32');\n model.UBO.addEntry('Time', 'u32'); // Build VTK API\n\n setGet(publicAPI, model, ['cellArray', 'currentInput', 'cellOffset', 'is2D', 'primitiveType', 'renderEncoder']);\n model.textures = []; // Object methods\n\n vtkWebGPUCellArrayMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUCellArrayMapper'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUCellArrayMapper$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUCellArrayMapper$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUCellArrayMapper from './CellArrayMapper.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes; // ----------------------------------------------------------------------------\n// vtkWebGPUPolyDataMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPolyDataMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUPolyDataMapper');\n\n publicAPI.createCellArrayMapper = function () {\n return vtkWebGPUCellArrayMapper.newInstance();\n };\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n var poly = model.renderable.getInputData();\n model.renderable.mapScalars(poly, 1.0);\n publicAPI.updateCellArrayMappers(poly);\n }\n };\n\n publicAPI.updateCellArrayMappers = function (poly) {\n var prims = [poly.getVerts(), poly.getLines(), poly.getPolys(), poly.getStrips()]; // we instantiate a cell array mapper for each cellArray that has cells\n // and they handle the rendering of that cell array\n\n var cellMappers = [];\n var cellOffset = 0;\n\n for (var i = PrimitiveTypes.Points; i <= PrimitiveTypes.Triangles; i++) {\n if (prims[i].getNumberOfValues() > 0) {\n if (!model.primitives[i]) {\n model.primitives[i] = publicAPI.createCellArrayMapper();\n }\n\n var cellMapper = model.primitives[i];\n cellMapper.setCellArray(prims[i]);\n cellMapper.setCurrentInput(poly);\n cellMapper.setCellOffset(cellOffset);\n cellMapper.setPrimitiveType(i);\n cellMapper.setRenderable(model.renderable);\n cellOffset += prims[i].getNumberOfCells();\n cellMappers.push(cellMapper);\n } else {\n model.primitives[i] = null;\n }\n }\n\n if (model.WebGPUActor.getRenderable().getProperty().getEdgeVisibility()) {\n for (var _i = PrimitiveTypes.TriangleEdges; _i <= PrimitiveTypes.TriangleStripEdges; _i++) {\n if (prims[_i - 2].getNumberOfValues() > 0) {\n if (!model.primitives[_i]) {\n model.primitives[_i] = publicAPI.createCellArrayMapper();\n }\n\n var _cellMapper = model.primitives[_i];\n\n _cellMapper.setCellArray(prims[_i - 2]);\n\n _cellMapper.setCurrentInput(poly);\n\n _cellMapper.setCellOffset(model.primitives[_i - 2].getCellOffset());\n\n _cellMapper.setPrimitiveType(_i);\n\n _cellMapper.setRenderable(model.renderable);\n\n cellMappers.push(_cellMapper);\n } else {\n model.primitives[_i] = null;\n }\n }\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingChildren(cellMappers);\n publicAPI.removeUnusedNodes();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n primitives: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.primitives = []; // Object methods\n\n vtkWebGPUPolyDataMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUPolyDataMapper'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUPolyDataMapper$1 = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkMapper', newInstance);\n\nexport { vtkWebGPUPolyDataMapper$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUCellArrayMapper from './CellArrayMapper.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes; // ----------------------------------------------------------------------------\n// vtkWebGPUPolyDataMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPolyDataMapper2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUPolyDataMapper2D');\n\n publicAPI.createCellArrayMapper = function () {\n return vtkWebGPUCellArrayMapper.newInstance();\n };\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor2D');\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n var poly = model.renderable.getInputData();\n model.renderable.mapScalars(poly, 1.0);\n publicAPI.updateCellArrayMappers(poly);\n }\n };\n\n publicAPI.updateCellArrayMappers = function (poly) {\n var prims = [poly.getVerts(), poly.getLines(), poly.getPolys(), poly.getStrips()]; // we instantiate a cell array mapper for each cellArray that has cells\n // and they handle the rendering of that cell array\n\n var cellMappers = [];\n var cellOffset = 0;\n\n for (var i = PrimitiveTypes.Points; i <= PrimitiveTypes.Triangles; i++) {\n if (prims[i].getNumberOfValues() > 0) {\n if (!model.primitives[i]) {\n model.primitives[i] = publicAPI.createCellArrayMapper();\n }\n\n var cellMapper = model.primitives[i];\n cellMapper.setCellArray(prims[i]);\n cellMapper.setCurrentInput(poly);\n cellMapper.setCellOffset(cellOffset);\n cellMapper.setPrimitiveType(i);\n cellMapper.setRenderable(model.renderable);\n cellMapper.setIs2D(true);\n cellOffset += prims[i].getNumberOfCells();\n cellMappers.push(cellMapper);\n } else {\n model.primitives[i] = null;\n }\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingChildren(cellMappers);\n publicAPI.removeUnusedNodes();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n primitives: []\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, defaultValues(initialValues)); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.primitives = []; // Object methods\n\n vtkWebGPUPolyDataMapper2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUPolyDataMapper2D'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkMapper2D', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkScalarBarActor from '../Core/ScalarBarActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUScalarBarActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUScalarBarActor(publicAPI, model) {\n model.classHierarchy.push('vtkWebGPUScalarBarActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n\n if (!model.scalarBarActorHelper.getRenderable()) {\n model.scalarBarActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.scalarBarActorHelper.getBarActor());\n publicAPI.addMissingNode(model.scalarBarActorHelper.getTmActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model.WebGPURenderer ? model.WebGPURenderer.getRenderable().getActiveCamera() : null;\n var tsize = model.WebGPURenderer.getTiledSizeAndOrigin();\n model.scalarBarActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model.WebGPURenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.scalarBarActorHelper = vtkScalarBarActor.newScalarBarActorHelper(); // Object methods\n\n vtkWebGPUScalarBarActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUScalarBarActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkScalarBarActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUSampler from './Sampler.js';\nimport vtkWebGPUTypes from './Types.js';\n\n// vtkWebGPUTextureView methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-bitwise */\n\nfunction vtkWebGPUTextureView(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUTextureView');\n\n publicAPI.create = function (texture, options) {\n model.texture = texture;\n model.options = options;\n model.options.dimension = model.options.dimension || '2d';\n model.options.label = model.label;\n model.textureHandle = texture.getHandle();\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupLayoutEntry.texture.viewDimension = model.options.dimension;\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.texture.getFormat());\n model.bindGroupLayoutEntry.texture.sampleType = tDetails.sampleType;\n };\n\n publicAPI.createFromTextureHandle = function (textureHandle, options) {\n model.texture = null;\n model.options = options;\n model.options.dimension = model.options.dimension || '2d';\n model.options.label = model.label;\n model.textureHandle = textureHandle;\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupLayoutEntry.texture.viewDimension = model.options.dimension;\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(options.format);\n model.bindGroupLayoutEntry.texture.sampleType = tDetails.sampleType;\n model.bindGroupTime.modified();\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: publicAPI.getHandle()\n };\n return foo;\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n var ttype = 'f32';\n\n if (model.bindGroupLayoutEntry.texture.sampleType === 'sint') {\n ttype = 'i32';\n } else if (model.bindGroupLayoutEntry.texture.sampleType === 'uint') {\n ttype = 'u32';\n }\n\n var result = \"@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": texture_\").concat(model.options.dimension, \"<\").concat(ttype, \">;\");\n\n if (model.bindGroupLayoutEntry.texture.sampleType === 'depth') {\n result = \"@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": texture_depth_\").concat(model.options.dimension, \";\");\n }\n\n return result;\n };\n\n publicAPI.addSampler = function (device, options) {\n var newSamp = vtkWebGPUSampler.newInstance({\n label: \"\".concat(model.label, \"Sampler\")\n });\n newSamp.create(device, options);\n publicAPI.setSampler(newSamp);\n };\n\n publicAPI.getBindGroupTime = function () {\n // check if the handle changed\n if (model.texture && model.texture.getHandle() !== model.textureHandle) {\n model.textureHandle = model.texture.getHandle();\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupTime.modified();\n }\n\n return model.bindGroupTime;\n }; // if the texture has changed then get a new view\n\n\n publicAPI.getHandle = function () {\n if (model.texture && model.texture.getHandle() !== model.textureHandle) {\n model.textureHandle = model.texture.getHandle();\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupTime.modified();\n }\n\n return model.handle;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n texture: null,\n handle: null,\n sampler: null,\n label: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.bindGroupLayoutEntry = {\n /* eslint-disable no-undef */\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\n /* eslint-enable no-undef */\n texture: {\n sampleType: 'float',\n viewDimension: '2d' // multisampled: false,\n\n }\n };\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n macro.get(publicAPI, model, ['bindGroupTime', 'texture']);\n macro.setGet(publicAPI, model, ['bindGroupLayoutEntry', 'label', 'sampler']);\n vtkWebGPUTextureView(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUTextureView$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUTextureView$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport HalfFloat from '../../Common/Core/HalfFloat.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUTextureView from './TextureView.js';\nimport vtkWebGPUTypes from './Types.js';\nimport vtkTexture from '../Core/Texture.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkWebGPUTexture methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUTexture(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUTexture');\n\n publicAPI.create = function (device, options) {\n model.device = device;\n model.width = options.width;\n model.height = options.height;\n model.depth = options.depth ? options.depth : 1;\n var dimension = model.depth === 1 ? '2d' : '3d';\n model.format = options.format ? options.format : 'rgba8unorm';\n model.mipLevel = options.mipLevel ? options.mipLevel : 0;\n /* eslint-disable no-undef */\n\n /* eslint-disable no-bitwise */\n\n model.usage = options.usage ? options.usage : GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;\n /* eslint-enable no-undef */\n\n /* eslint-enable no-bitwise */\n\n model.handle = model.device.getHandle().createTexture({\n size: [model.width, model.height, model.depth],\n format: model.format,\n // 'rgba8unorm',\n usage: model.usage,\n label: model.label,\n dimension: dimension,\n mipLevelCount: model.mipLevel + 1\n });\n };\n\n publicAPI.assignFromHandle = function (device, handle, options) {\n model.device = device;\n model.handle = handle;\n model.width = options.width;\n model.height = options.height;\n model.depth = options.depth ? options.depth : 1;\n model.format = options.format ? options.format : 'rgba8unorm';\n /* eslint-disable no-undef */\n\n /* eslint-disable no-bitwise */\n\n model.usage = options.usage ? options.usage : GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;\n /* eslint-enable no-undef */\n\n /* eslint-enable no-bitwise */\n };\n\n publicAPI.writeImageData = function (req) {\n var nativeArray = [];\n\n if (req.canvas) {\n model.device.getHandle().queue.copyExternalImageToTexture({\n source: req.canvas,\n flipY: req.flip\n }, {\n texture: model.handle,\n premultipliedAlpha: true\n }, [model.width, model.height, model.depth]);\n model.ready = true;\n return;\n }\n\n if (req.jsImageData && !req.nativeArray) {\n req.width = req.jsImageData.width;\n req.height = req.jsImageData.height;\n req.depth = 1;\n req.format = 'rgba8unorm';\n req.flip = true;\n req.nativeArray = req.jsImageData.data;\n }\n\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);\n var bufferBytesPerRow = model.width * tDetails.stride;\n\n var fixAll = function fixAll(arr, height, depth) {\n // bytesPerRow must be a multiple of 256 so we might need to rebuild\n // the data here before passing to the buffer. e.g. if it is unorm8x4 then\n // we need to have width be a multiple of 64\n var inWidthInBytes = arr.length / (height * depth) * arr.BYTES_PER_ELEMENT; // is this a half float texture?\n\n var halfFloat = tDetails.elementSize === 2 && tDetails.sampleType === 'float'; // if we need to copy the data\n\n if (halfFloat || inWidthInBytes % 256) {\n var inArray = arr;\n var inWidth = inWidthInBytes / inArray.BYTES_PER_ELEMENT;\n var outBytesPerElement = tDetails.elementSize;\n var outWidthInBytes = 256 * Math.floor((inWidth * outBytesPerElement + 255) / 256);\n var outWidth = outWidthInBytes / outBytesPerElement;\n var outArray = macro.newTypedArray(halfFloat ? 'Uint16Array' : inArray.constructor.name, outWidth * height * depth);\n\n for (var v = 0; v < height * depth; v++) {\n if (halfFloat) {\n for (var i = 0; i < inWidth; i++) {\n outArray[v * outWidth + i] = HalfFloat.toHalf(inArray[v * inWidth + i]);\n }\n } else {\n outArray.set(inArray.subarray(v * inWidth, (v + 1) * inWidth), v * outWidth);\n }\n }\n\n return [outArray, outWidthInBytes];\n }\n\n return [arr, inWidthInBytes];\n };\n\n if (req.nativeArray) {\n nativeArray = req.nativeArray;\n }\n\n if (req.image) {\n var canvas = document.createElement('canvas');\n canvas.width = req.image.width;\n canvas.height = req.image.height;\n var ctx = canvas.getContext('2d');\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n ctx.drawImage(req.image, 0, 0, req.image.width, req.image.height, 0, 0, canvas.width, canvas.height);\n var imageData = ctx.getImageData(0, 0, req.image.width, req.image.height);\n nativeArray = imageData.data;\n }\n\n var cmdEnc = model.device.createCommandEncoder();\n\n if (publicAPI.getDimensionality() !== 3) {\n // Non-3D, supports mipmaps\n var mips = vtkTexture.generateMipmaps(nativeArray, model.width, model.height, model.mipLevel);\n var currentWidth = model.width;\n var currentHeight = model.height;\n\n for (var m = 0; m <= model.mipLevel; m++) {\n var fix = fixAll(mips[m], currentHeight, 1);\n bufferBytesPerRow = fix[1];\n var buffRequest = {\n dataArray: req.dataArray ? req.dataArray : null,\n nativeArray: fix[0],\n\n /* eslint-disable no-undef */\n usage: BufferUsage.Texture\n /* eslint-enable no-undef */\n\n };\n var buff = model.device.getBufferManager().getBuffer(buffRequest);\n cmdEnc.copyBufferToTexture({\n buffer: buff.getHandle(),\n offset: 0,\n bytesPerRow: bufferBytesPerRow,\n rowsPerImage: currentHeight\n }, {\n texture: model.handle,\n mipLevel: m\n }, [currentWidth, currentHeight, 1]);\n currentWidth /= 2;\n currentHeight /= 2;\n }\n\n model.device.submitCommandEncoder(cmdEnc);\n model.ready = true;\n } else {\n // 3D, no mipmaps\n var _fix = fixAll(nativeArray, model.height, model.depth);\n\n bufferBytesPerRow = _fix[1];\n var _buffRequest = {\n dataArray: req.dataArray ? req.dataArray : null,\n\n /* eslint-disable no-undef */\n usage: BufferUsage.Texture\n /* eslint-enable no-undef */\n\n };\n _buffRequest.nativeArray = _fix[0];\n\n var _buff = model.device.getBufferManager().getBuffer(_buffRequest);\n\n cmdEnc.copyBufferToTexture({\n buffer: _buff.getHandle(),\n offset: 0,\n bytesPerRow: bufferBytesPerRow,\n rowsPerImage: model.height\n }, {\n texture: model.handle\n }, [model.width, model.height, model.depth]);\n model.device.submitCommandEncoder(cmdEnc);\n model.ready = true;\n }\n }; // when data is pulled out of this texture what scale must be applied to\n // get back to the original source data. For formats such as r8unorm we\n // have to multiply by 255.0, for formats such as r16float it is 1.0\n\n\n publicAPI.getScale = function () {\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);\n var halfFloat = tDetails.elementSize === 2 && tDetails.sampleType === 'float';\n return halfFloat ? 1.0 : 255.0;\n };\n\n publicAPI.getNumberOfComponents = function () {\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);\n return tDetails.numComponents;\n };\n\n publicAPI.getDimensionality = function () {\n var dims = 0;\n if (model.width > 1) dims++;\n if (model.height > 1) dims++;\n if (model.depth > 1) dims++;\n return dims;\n };\n\n publicAPI.resizeToMatch = function (tex) {\n if (tex.getWidth() !== model.width || tex.getHeight() !== model.height || tex.getDepth() !== model.depth) {\n model.width = tex.getWidth();\n model.height = tex.getHeight();\n model.depth = tex.getDepth();\n model.handle = model.device.getHandle().createTexture({\n size: [model.width, model.height, model.depth],\n format: model.format,\n usage: model.usage,\n label: model.label\n });\n }\n };\n\n publicAPI.resize = function (width, height) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n if (width !== model.width || height !== model.height || depth !== model.depth) {\n model.width = width;\n model.height = height;\n model.depth = depth;\n model.handle = model.device.getHandle().createTexture({\n size: [model.width, model.height, model.depth],\n format: model.format,\n usage: model.usage,\n label: model.label\n });\n }\n };\n\n publicAPI.createView = function (label) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // if options is missing values try to add them in\n if (!options.dimension) {\n options.dimension = model.depth === 1 ? '2d' : '3d';\n }\n\n var view = vtkWebGPUTextureView.newInstance({\n label: label\n });\n view.create(publicAPI, options);\n return view;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n buffer: null,\n ready: false,\n label: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['handle', 'ready', 'width', 'height', 'depth', 'format', 'usage']);\n macro.setGet(publicAPI, model, ['device', 'label']);\n vtkWebGPUTexture(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUTexture$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUTexture$1 as default, extend, newInstance };\n","import { Point3, ContourData, IContour } from '../../types';\nimport { ContourType } from '../../enums';\n\ntype ContourProps = {\n id: string;\n data: ContourData;\n color: Point3;\n segmentIndex: number;\n};\n\n/**\n * The `Contour` class implements the `IContour` interface and represents a contour in 3D space.\n * It holds information about the contour's id, size in bytes, points, color, and type.\n * The class also provides methods to retrieve the points, color, and type of the contour.\n * Each Contour is part of a ContourSet, and each ContourSet is part of a Geometry.\n */\nexport class Contour implements IContour {\n readonly id: string;\n readonly sizeInBytes: number;\n points: Point3[];\n color: Point3;\n type: ContourType;\n segmentIndex: number;\n\n constructor(props: ContourProps) {\n const { points, type } = props.data;\n this.id = props.id;\n this.points = points;\n this.type = type;\n this.color = props.color;\n this.segmentIndex = props.segmentIndex;\n\n this.sizeInBytes = this._getSizeInBytes();\n }\n\n _getSizeInBytes(): number {\n let sizeInBytes = 0;\n\n // Assuming each point is 1 byte\n sizeInBytes += this.points.length * 3;\n return sizeInBytes;\n }\n\n /**\n * It returns the value of the points property of the data object\n * @returns The points property of the data object.\n */\n public getPoints(): Point3[] {\n return this.points;\n }\n\n public getFlatPointsArray(): number[] {\n return this.points.map((point) => [...point]).flat();\n }\n\n /**\n * This function returns the color of the contour\n * @returns The color of the contour\n */\n public getColor(): Point3 {\n return this.color;\n }\n\n /**\n * It returns the type of the contour, closed or open\n * @returns The type of the contour.\n */\n public getType(): ContourType {\n return this.type;\n }\n}\n\nexport default Contour;\n","import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';\nimport { Point3, IContourSet, IContour, ContourData } from '../../types';\nimport Contour from './Contour';\n\ntype ContourSetProps = {\n id: string;\n data: ContourData[];\n frameOfReferenceUID: string;\n segmentIndex: number;\n color?: Point3;\n};\n\n/**\n * This class represents a set of contours in 3d space.\n * Usually contours are grouped together in a contour set to represent a meaningful shape.\n */\nexport class ContourSet implements IContourSet {\n readonly id: string;\n readonly sizeInBytes: number;\n readonly frameOfReferenceUID: string;\n private color: Point3 = [200, 0, 0]; // default color\n private segmentIndex: number;\n private polyData: vtkPolyData;\n private centroid: Point3;\n contours: IContour[];\n\n constructor(props: ContourSetProps) {\n this.id = props.id;\n this.contours = [];\n this.color = props.color ?? this.color;\n this.frameOfReferenceUID = props.frameOfReferenceUID;\n this.segmentIndex = props.segmentIndex;\n this._createEachContour(props.data);\n this.sizeInBytes = this._getSizeInBytes();\n }\n\n _createEachContour(contourDataArray: ContourData[]): void {\n contourDataArray.forEach((contourData) => {\n const { points, type, color } = contourData;\n\n const contour = new Contour({\n id: `${this.id}-segment-${this.segmentIndex}`,\n data: {\n points,\n type,\n segmentIndex: this.segmentIndex,\n color: color ?? this.color,\n },\n segmentIndex: this.segmentIndex,\n color: color ?? this.color,\n });\n\n this.contours.push(contour);\n });\n\n this._updateContourSetCentroid();\n }\n\n // Todo: this centroid calculation has limitation in which\n // it will not work for MPR, the reason is that we are finding\n // the centroid of all points but at the end we are picking the\n // closest point to the centroid, which will not work for MPR\n // The reason for picking the closest is a rendering issue since\n // the centroid can be not exactly in the middle of the slice\n // and it might cause the contour to be rendered in the wrong slice\n // or not rendered at all\n _updateContourSetCentroid(): void {\n const numberOfPoints = this.getTotalNumberOfPoints();\n const flatPointsArray = this.getFlatPointsArray();\n\n const sumOfPoints = flatPointsArray.reduce(\n (acc, point) => {\n return [acc[0] + point[0], acc[1] + point[1], acc[2] + point[2]];\n },\n [0, 0, 0]\n );\n\n const centroid = [\n sumOfPoints[0] / numberOfPoints,\n sumOfPoints[1] / numberOfPoints,\n sumOfPoints[2] / numberOfPoints,\n ];\n\n const closestPoint = flatPointsArray.reduce((closestPoint, point) => {\n const distanceToPoint = this._getDistance(centroid, point);\n const distanceToClosestPoint = this._getDistance(centroid, closestPoint);\n\n if (distanceToPoint < distanceToClosestPoint) {\n return point;\n } else {\n return closestPoint;\n }\n }, flatPointsArray[0]);\n\n this.centroid = closestPoint;\n }\n\n _getSizeInBytes(): number {\n return this.contours.reduce((sizeInBytes, contour) => {\n return sizeInBytes + contour.sizeInBytes;\n }, 0);\n }\n\n public getCentroid(): Point3 {\n return this.centroid;\n }\n\n public getSegmentIndex(): number {\n return this.segmentIndex;\n }\n\n public getColor(): Point3 {\n // Currently, all contours in a contour set have the same color.\n // This may change in the future.\n return this.color;\n }\n\n /**\n * This function returns the contours of the image\n * @returns The contours of the image.\n */\n public getContours(): IContour[] {\n return this.contours;\n }\n\n public getSizeInBytes(): number {\n return this.sizeInBytes;\n }\n\n /**\n * It returns an array of all the points in the glyph\n * @returns An array of points.\n */\n public getFlatPointsArray(): Point3[] {\n return this.contours.map((contour) => contour.getPoints()).flat();\n }\n\n /**\n * This function returns the number of contours in the current shape.\n * @returns The number of contours in the glyph.\n */\n public getNumberOfContours(): number {\n return this.contours.length;\n }\n\n /**\n * It loops through each contour in the `contours` array, and adds the number of\n * points in each contour to the `numberOfPoints` variable\n * @returns The number of points in the contours.\n */\n public getTotalNumberOfPoints(): number {\n return this.contours.reduce((numberOfPoints, contour) => {\n return numberOfPoints + contour.getPoints().length;\n }, 0);\n }\n\n /**\n * It returns an array of the number of points in each contour.\n * @returns An array of numbers.\n */\n public getNumberOfPointsArray(): number[] {\n return this.contours.reduce((acc, _, i) => {\n acc[i] = this.getNumberOfPointsInAContour(i);\n return acc;\n }, []);\n }\n\n /**\n * It returns the points in a contour.\n * @param contourIndex - The index of the contour you want to get the\n * points from.\n * @returns An array of Point3 objects.\n */\n public getPointsInContour(contourIndex: number): Point3[] {\n return this.contours[contourIndex].getPoints();\n }\n /**\n * \"This function returns the number of points in a contour.\"\n *\n * @param contourIndex - The index of the contour you want to get the\n * number of points from.\n * @returns The number of points in the contour.\n */\n public getNumberOfPointsInAContour(contourIndex: number): number {\n return this.getPointsInContour(contourIndex).length;\n }\n\n private _getDistance(pointA, pointB) {\n return Math.sqrt(\n (pointA[0] - pointB[0]) ** 2 +\n (pointA[1] - pointB[1]) ** 2 +\n (pointA[2] - pointB[2]) ** 2\n );\n }\n /**\n public convertToClosedSurface(): ClosedSurface {\n const flatPointsArray = this.getFlatPointsArray();\n const numPointsArray = this.getNumberOfPointsArray();\n\n const closedSurfaceData = polySeg.convertToClosedSurface(\n flatPointsArray,\n numPointsArray\n );\n\n const closedSurface = new ClosedSurface({\n id: this.id,\n data: closedSurfaceData,\n color: this.color,\n });\n\n // cache the closed surface\n return closedSurface;\n }\n */\n}\n\nexport default Contour;\n","import '@kitware/vtk.js/Rendering/Profiles/Geometry';\n\nimport cache from '../cache';\nimport { ContourSet } from '../cache/classes/ContourSet';\nimport { GeometryType } from '../enums';\nimport { IGeometry, PublicContourSetData } from '../types';\n\ntype GeometryOptions = {\n type: GeometryType;\n geometryData: PublicContourSetData; // | PublicClosedSurfaceData, ...\n};\n\n/**\n * Todo: currently we are not targeting loading geometry from a file.\n * This is a placeholder for future work. For instance, separate loaders\n * for .vti, .vtk, .obj, .dat etc. can be created and registered here.\n */\n\n/**\n * It creates a geometry object and caches it\n * @param geometryId - A unique identifier for the geometry.\n * @param options - GeometryOptions\n * @returns A promise that resolves to a geometry object.\n */\nasync function createAndCacheGeometry(\n geometryId: string,\n options: GeometryOptions\n): Promise {\n let geometry = cache.getGeometry(geometryId);\n\n if (geometry) {\n return geometry;\n }\n\n if (options.type === GeometryType.CONTOUR) {\n geometry = _createContourSet(geometryId, options.geometryData);\n } else {\n throw new Error('Unknown geometry type, Only CONTOUR is supported');\n }\n\n const geometryLoadObject = {\n promise: Promise.resolve(geometry),\n };\n\n await cache.putGeometryLoadObject(geometryId, geometryLoadObject);\n\n return geometry;\n}\n\n// Todo: this should be moved\nfunction _createContourSet(\n geometryId: string,\n contourSetData: PublicContourSetData\n) {\n // validate the data to make sure it is a valid contour set\n if (!contourSetData || contourSetData.data.length === 0) {\n throw new Error(\n 'Invalid contour set data, see publicContourSetData type for more info'\n );\n }\n\n // make sure it each has id, and each has data of type Point3[]\n if (!contourSetData.id) {\n throw new Error(\n 'Invalid contour set data, each contour set must have an id'\n );\n }\n\n if (!contourSetData.data || !Array.isArray(contourSetData.data)) {\n throw new Error(\n 'Invalid contour set data, each contour set must have an array of contours'\n );\n }\n\n contourSetData.data.forEach((contourData) => {\n if (!contourData.points || !Array.isArray(contourData.points)) {\n throw new Error(\n 'Invalid contour set data, each contour must have an array of points'\n );\n }\n\n contourData.points.forEach((point) => {\n if (!point || !Array.isArray(point) || point.length !== 3) {\n throw new Error(\n 'Invalid contour set data, each point must be an array of length 3'\n );\n }\n });\n });\n\n const contourSet = new ContourSet({\n id: contourSetData.id,\n data: contourSetData.data,\n color: contourSetData.color,\n frameOfReferenceUID: contourSetData.frameOfReferenceUID,\n segmentIndex: contourSetData.segmentIndex,\n });\n\n const geometry: IGeometry = {\n id: geometryId,\n type: GeometryType.CONTOUR,\n data: contourSet,\n sizeInBytes: contourSet.getSizeInBytes(),\n };\n\n return geometry;\n}\n\nexport { createAndCacheGeometry };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkDataArray from './DataArray.js';\nimport { VtkDataTypes } from './DataArray/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction extractCellSizes(cellArray) {\n var currentIdx = 0;\n return cellArray.filter(function (value, index) {\n if (index === currentIdx) {\n currentIdx += value + 1;\n return true;\n }\n\n return false;\n });\n}\n\nfunction getNumberOfCells(cellArray) {\n var cellId = 0;\n\n for (var cellArrayIndex = 0; cellArrayIndex < cellArray.length;) {\n cellArrayIndex += cellArray[cellArrayIndex] + 1;\n cellId++;\n }\n\n return cellId;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n extractCellSizes: extractCellSizes,\n getNumberOfCells: getNumberOfCells\n}; // ----------------------------------------------------------------------------\n// vtkCellArray methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCellArray(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCellArray');\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getNumberOfCells = function (recompute) {\n if (model.numberOfCells !== undefined && !recompute) {\n return model.numberOfCells;\n }\n\n if (model.cellSizes) {\n model.numberOfCells = model.cellSizes.length;\n } else {\n model.numberOfCells = getNumberOfCells(publicAPI.getData());\n }\n\n return model.numberOfCells;\n };\n\n publicAPI.getCellSizes = function (recompute) {\n if (model.cellSizes !== undefined && !recompute) {\n return model.cellSizes;\n }\n\n model.cellSizes = extractCellSizes(publicAPI.getData());\n return model.cellSizes;\n };\n /**\n * When `resize()` is being used, you then MUST use `insertNextCell()`.\n */\n\n\n publicAPI.resize = function (requestedNumTuples) {\n var oldNumTuples = publicAPI.getNumberOfTuples();\n superClass.resize(requestedNumTuples);\n var newNumTuples = publicAPI.getNumberOfTuples();\n\n if (newNumTuples < oldNumTuples) {\n if (newNumTuples === 0) {\n model.numberOfCells = 0;\n model.cellSizes = [];\n } else {\n // We do not know how many cells are left.\n // Set to undefined to ensure insertNextCell works correctly.\n model.numberOfCells = undefined;\n model.cellSizes = undefined;\n }\n }\n };\n\n publicAPI.setData = function (typedArray) {\n superClass.setData(typedArray, 1);\n model.numberOfCells = undefined;\n model.cellSizes = undefined;\n };\n\n publicAPI.getCell = function (loc) {\n var cellLoc = loc;\n var numberOfPoints = model.values[cellLoc++];\n return model.values.subarray(cellLoc, cellLoc + numberOfPoints);\n };\n\n publicAPI.insertNextCell = function (cellPointIds) {\n var cellId = publicAPI.getNumberOfCells();\n publicAPI.insertNextTuples([cellPointIds.length].concat(_toConsumableArray(cellPointIds))); // By computing the number of cells earlier, we made sure that numberOfCells is defined\n\n ++model.numberOfCells;\n\n if (model.cellSizes != null) {\n model.cellSizes.push(cellPointIds.length);\n }\n\n return cellId;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n empty: true,\n numberOfComponents: 1,\n dataType: VtkDataTypes.UNSIGNED_INT\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n vtkDataArray.extend(publicAPI, model, defaultValues(initialValues));\n vtkCellArray(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCellArray'); // ----------------------------------------------------------------------------\n\nvar vtkCellArray$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkCellArray$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport Constants from './DataArray/Constants.js';\nimport { newInstance as newInstance$1, newTypedArray, newTypedArrayFrom, obj, set, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport { n as norm } from './Math/index.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar DefaultDataType = Constants.DefaultDataType; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// Original source from https://www.npmjs.com/package/compute-range\n// Modified to accept type arrays\n\nfunction fastComputeRange(arr, offset, numberOfComponents) {\n var len = arr.length;\n var min;\n var max;\n var x;\n var i;\n\n if (len === 0) {\n return {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE\n };\n }\n\n min = arr[offset];\n max = min;\n\n for (i = offset; i < len; i += numberOfComponents) {\n x = arr[i];\n\n if (x < min) {\n min = x;\n } else if (x > max) {\n max = x;\n }\n }\n\n return {\n min: min,\n max: max\n };\n}\n/**\n * @deprecated please use fastComputeRange instead\n */\n\n\nfunction createRangeHelper() {\n var min = Number.MAX_VALUE;\n var max = -Number.MAX_VALUE;\n var count = 0;\n var sum = 0;\n return {\n add: function add(value) {\n if (min > value) {\n min = value;\n }\n\n if (max < value) {\n max = value;\n }\n\n count++;\n sum += value;\n },\n get: function get() {\n return {\n min: min,\n max: max,\n count: count,\n sum: sum,\n mean: sum / count\n };\n },\n getRange: function getRange() {\n return {\n min: min,\n max: max\n };\n }\n };\n}\n\nfunction computeRange(values) {\n var component = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var numberOfComponents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n if (component < 0 && numberOfComponents > 1) {\n // Compute magnitude\n var size = values.length;\n var numberOfValues = size / numberOfComponents;\n var data = new Float64Array(numberOfValues);\n\n for (var i = 0, j = 0; i < numberOfValues; ++i) {\n var _i;\n\n for (var nextJ = j + numberOfComponents; j < nextJ; ++j) {\n data[i] += values[j] * values[j];\n }\n\n _i = i, data[_i] = Math.pow(data[_i], 0.5);\n }\n\n return fastComputeRange(data, 0, 1);\n }\n\n return fastComputeRange(values, component < 0 ? 0 : component, numberOfComponents);\n}\n\nfunction ensureRangeSize(rangeArray) {\n var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var ranges = rangeArray || []; // Pad ranges with null value to get the\n\n while (ranges.length <= size) {\n ranges.push(null);\n }\n\n return ranges;\n}\n\nfunction getDataType(typedArray) {\n // Expects toString() to return \"[object ...Array]\"\n return Object.prototype.toString.call(typedArray).slice(8, -1);\n}\n\nfunction getMaxNorm(normArray) {\n var numComps = normArray.getNumberOfComponents();\n var maxNorm = 0.0;\n var tuple = new Array(numComps);\n\n for (var i = 0; i < normArray.getNumberOfTuples(); ++i) {\n normArray.getTuple(i, tuple);\n var norm$1 = norm(tuple, numComps);\n\n if (norm$1 > maxNorm) {\n maxNorm = norm$1;\n }\n }\n\n return maxNorm;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n computeRange: computeRange,\n createRangeHelper: createRangeHelper,\n fastComputeRange: fastComputeRange,\n getDataType: getDataType,\n getMaxNorm: getMaxNorm\n}; // ----------------------------------------------------------------------------\n// vtkDataArray methods\n// ----------------------------------------------------------------------------\n\nfunction vtkDataArray(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkDataArray');\n /**\n * Resize model.values and copy the old values to the new array.\n * @param {Number} requestedNumTuples Final expected number of tuples; must be >= 0\n * @returns {Boolean} True if a resize occured, false otherwise\n */\n\n function resize(requestedNumTuples) {\n if (requestedNumTuples < 0) {\n return false;\n }\n\n var numComps = publicAPI.getNumberOfComponents();\n var curNumTuples = model.values.length / (numComps > 0 ? numComps : 1);\n\n if (requestedNumTuples === curNumTuples) {\n return true;\n }\n\n if (requestedNumTuples > curNumTuples) {\n // Requested size is bigger than current size. Allocate enough\n // memory to fit the requested size and be more than double the\n // currently allocated memory.\n var oldValues = model.values;\n model.values = newTypedArray(model.dataType, (requestedNumTuples + curNumTuples) * numComps);\n model.values.set(oldValues);\n return true;\n } // Requested size is smaller than currently allocated size\n\n\n if (model.size > requestedNumTuples * numComps) {\n model.size = requestedNumTuples * numComps;\n publicAPI.dataChange();\n }\n\n return true;\n }\n\n publicAPI.dataChange = function () {\n model.ranges = null;\n publicAPI.modified();\n };\n\n publicAPI.resize = function (requestedNumTuples) {\n resize(requestedNumTuples);\n var newSize = requestedNumTuples * publicAPI.getNumberOfComponents();\n\n if (model.size !== newSize) {\n model.size = newSize;\n publicAPI.dataChange();\n return true;\n }\n\n return false;\n }; // FIXME, to rename into \"clear()\" or \"reset()\"\n\n\n publicAPI.initialize = function () {\n publicAPI.resize(0);\n };\n\n publicAPI.getElementComponentSize = function () {\n return model.values.BYTES_PER_ELEMENT;\n }; // Description:\n // Return the data component at the location specified by tupleIdx and\n // compIdx.\n\n\n publicAPI.getComponent = function (tupleIdx) {\n var compIdx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return model.values[tupleIdx * model.numberOfComponents + compIdx];\n }; // Description:\n // Set the data component at the location specified by tupleIdx and compIdx\n // to value.\n // Note that i is less than NumberOfTuples and j is less than\n // NumberOfComponents. Make sure enough memory has been allocated\n // (use SetNumberOfTuples() and SetNumberOfComponents()).\n\n\n publicAPI.setComponent = function (tupleIdx, compIdx, value) {\n if (value !== model.values[tupleIdx * model.numberOfComponents + compIdx]) {\n model.values[tupleIdx * model.numberOfComponents + compIdx] = value;\n publicAPI.dataChange();\n }\n };\n\n publicAPI.getValue = function (valueIdx) {\n var idx = valueIdx / model.numberOfComponents;\n var comp = valueIdx % model.numberOfComponents;\n return publicAPI.getComponent(idx, comp);\n };\n\n publicAPI.setValue = function (valueIdx, value) {\n var idx = valueIdx / model.numberOfComponents;\n var comp = valueIdx % model.numberOfComponents;\n publicAPI.setComponent(idx, comp, value);\n };\n\n publicAPI.getData = function () {\n return model.size === model.values.length ? model.values : model.values.subarray(0, model.size);\n };\n\n publicAPI.getRange = function () {\n var componentIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;\n var rangeIdx = componentIndex < 0 ? model.numberOfComponents : componentIndex;\n var range = null;\n\n if (!model.ranges) {\n model.ranges = ensureRangeSize(model.ranges, model.numberOfComponents);\n }\n\n range = model.ranges[rangeIdx];\n\n if (range) {\n model.rangeTuple[0] = range.min;\n model.rangeTuple[1] = range.max;\n return model.rangeTuple;\n } // Need to compute ranges...\n\n\n range = computeRange(publicAPI.getData(), componentIndex, model.numberOfComponents);\n model.ranges[rangeIdx] = range;\n model.rangeTuple[0] = range.min;\n model.rangeTuple[1] = range.max;\n return model.rangeTuple;\n };\n\n publicAPI.setRange = function (rangeValue, componentIndex) {\n if (!model.ranges) {\n model.ranges = ensureRangeSize(model.ranges, model.numberOfComponents);\n }\n\n var range = {\n min: rangeValue.min,\n max: rangeValue.max\n };\n model.ranges[componentIndex] = range;\n model.rangeTuple[0] = range.min;\n model.rangeTuple[1] = range.max;\n return model.rangeTuple;\n };\n\n publicAPI.setTuple = function (idx, tuple) {\n var offset = idx * model.numberOfComponents;\n\n for (var i = 0; i < model.numberOfComponents; i++) {\n model.values[offset + i] = tuple[i];\n }\n };\n\n publicAPI.setTuples = function (idx, tuples) {\n var i = idx * model.numberOfComponents;\n var last = Math.min(tuples.length, model.size - i);\n\n for (var j = 0; j < last;) {\n model.values[i++] = tuples[j++];\n }\n };\n\n publicAPI.insertTuple = function (idx, tuple) {\n if (model.size <= idx * model.numberOfComponents) {\n model.size = (idx + 1) * model.numberOfComponents;\n resize(idx + 1);\n }\n\n publicAPI.setTuple(idx, tuple);\n return idx;\n };\n\n publicAPI.insertTuples = function (idx, tuples) {\n var end = idx + tuples.length / model.numberOfComponents;\n\n if (model.size < end * model.numberOfComponents) {\n model.size = end * model.numberOfComponents;\n resize(end);\n }\n\n publicAPI.setTuples(idx, tuples);\n return end;\n };\n\n publicAPI.insertNextTuple = function (tuple) {\n var idx = model.size / model.numberOfComponents;\n return publicAPI.insertTuple(idx, tuple);\n };\n\n publicAPI.insertNextTuples = function (tuples) {\n var idx = model.size / model.numberOfComponents;\n return publicAPI.insertTuples(idx, tuples);\n };\n\n publicAPI.getTuple = function (idx) {\n var tupleToFill = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var numberOfComponents = model.numberOfComponents || 1;\n var offset = idx * numberOfComponents; // Check most common component sizes first\n // to avoid doing a for loop if possible\n\n switch (numberOfComponents) {\n case 4:\n tupleToFill[3] = model.values[offset + 3];\n // eslint-disable-next-line no-fallthrough\n\n case 3:\n tupleToFill[2] = model.values[offset + 2];\n // eslint-disable-next-line no-fallthrough\n\n case 2:\n tupleToFill[1] = model.values[offset + 1];\n // eslint-disable-next-line no-fallthrough\n\n case 1:\n tupleToFill[0] = model.values[offset];\n break;\n\n default:\n for (var i = numberOfComponents - 1; i >= 0; --i) {\n tupleToFill[i] = model.values[offset + i];\n }\n\n }\n\n return tupleToFill;\n };\n\n publicAPI.getTuples = function (fromId, toId) {\n var from = (fromId !== null && fromId !== void 0 ? fromId : 0) * model.numberOfComponents;\n var to = (toId !== null && toId !== void 0 ? toId : publicAPI.getNumberOfTuples()) * model.numberOfComponents;\n var arr = publicAPI.getData().subarray(from, to);\n return arr.length > 0 ? arr : null;\n };\n\n publicAPI.getTupleLocation = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n return idx * model.numberOfComponents;\n };\n\n publicAPI.getNumberOfComponents = function () {\n return model.numberOfComponents;\n };\n\n publicAPI.getNumberOfValues = function () {\n return model.size;\n };\n\n publicAPI.getNumberOfTuples = function () {\n return model.size / model.numberOfComponents;\n };\n\n publicAPI.getDataType = function () {\n return model.dataType;\n };\n /* eslint-disable no-use-before-define */\n\n\n publicAPI.newClone = function () {\n return newInstance({\n empty: true,\n name: model.name,\n dataType: model.dataType,\n numberOfComponents: model.numberOfComponents\n });\n };\n /* eslint-enable no-use-before-define */\n\n\n publicAPI.getName = function () {\n if (!model.name) {\n publicAPI.modified();\n model.name = \"vtkDataArray\".concat(publicAPI.getMTime());\n }\n\n return model.name;\n };\n\n publicAPI.setData = function (typedArray, numberOfComponents) {\n model.values = typedArray;\n model.size = typedArray.length;\n model.dataType = getDataType(typedArray);\n\n if (numberOfComponents) {\n model.numberOfComponents = numberOfComponents;\n }\n\n if (model.size % model.numberOfComponents !== 0) {\n model.numberOfComponents = 1;\n }\n\n publicAPI.dataChange();\n }; // Override serialization support\n\n\n publicAPI.getState = function () {\n if (model.deleted) {\n return null;\n }\n\n var jsonArchive = _objectSpread(_objectSpread({}, model), {}, {\n vtkClass: publicAPI.getClassName()\n }); // Convert typed array to regular array\n\n\n jsonArchive.values = Array.from(jsonArchive.values);\n delete jsonArchive.buffer; // Clean any empty data\n\n Object.keys(jsonArchive).forEach(function (keyName) {\n if (!jsonArchive[keyName]) {\n delete jsonArchive[keyName];\n }\n }); // Sort resulting object by key name\n\n var sortedObj = {};\n Object.keys(jsonArchive).sort().forEach(function (name) {\n sortedObj[name] = jsonArchive[name];\n }); // Remove mtime\n\n if (sortedObj.mtime) {\n delete sortedObj.mtime;\n }\n\n return sortedObj;\n };\n\n publicAPI.deepCopy = function (other) {\n publicAPI.shallowCopy(other);\n publicAPI.setData(other.getData().slice());\n };\n\n publicAPI.interpolateTuple = function (idx, source1, source1Idx, source2, source2Idx, t) {\n var numberOfComponents = model.numberOfComponents || 1;\n\n if (numberOfComponents !== source1.getNumberOfComponents() || numberOfComponents !== source2.getNumberOfComponents()) {\n vtkErrorMacro('numberOfComponents must match');\n }\n\n var tuple1 = source1.getTuple(source1Idx);\n var tuple2 = source2.getTuple(source2Idx);\n var out = [];\n out.length = numberOfComponents; // Check most common component sizes first\n // to avoid doing a for loop if possible\n\n switch (numberOfComponents) {\n case 4:\n out[3] = tuple1[3] + (tuple2[3] - tuple1[3]) * t;\n // eslint-disable-next-line no-fallthrough\n\n case 3:\n out[2] = tuple1[2] + (tuple2[2] - tuple1[2]) * t;\n // eslint-disable-next-line no-fallthrough\n\n case 2:\n out[1] = tuple1[1] + (tuple2[1] - tuple1[1]) * t;\n // eslint-disable-next-line no-fallthrough\n\n case 1:\n out[0] = tuple1[0] + (tuple2[0] - tuple1[0]) * t;\n break;\n\n default:\n for (var i = 0; i < numberOfComponents; i++) {\n out[i] = tuple1[i] + (tuple2[i] - tuple1[i]) * t;\n }\n\n }\n\n return publicAPI.insertTuple(idx, out);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n// size: The current size of the dataArray.\n// NOTE: The underlying typed array may be larger than 'size'.\n\n\nvar DEFAULT_VALUES = {\n name: '',\n numberOfComponents: 1,\n dataType: DefaultDataType,\n rangeTuple: [0, 0] // size: undefined,\n // values: null,\n // ranges: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n if (!model.empty && !model.values && !model.size) {\n throw new TypeError('Cannot create vtkDataArray object without: size > 0, values');\n }\n\n if (!model.values) {\n model.values = newTypedArray(model.dataType, model.size);\n } else if (Array.isArray(model.values)) {\n model.values = newTypedArrayFrom(model.dataType, model.values);\n }\n\n if (model.values) {\n var _model$size;\n\n // Takes the size if provided (can be lower than `model.values`) otherwise the actual length of `values`.\n model.size = (_model$size = model.size) !== null && _model$size !== void 0 ? _model$size : model.values.length;\n model.dataType = getDataType(model.values);\n } // Object methods\n\n\n obj(publicAPI, model);\n set(publicAPI, model, ['name', 'numberOfComponents']); // Object specific methods\n\n vtkDataArray(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkDataArray'); // ----------------------------------------------------------------------------\n\nvar vtkDataArray$1 = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkDataArray$1 as default, extend, newInstance };\n","var DataTypeByteSize = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\nvar VtkDataTypes = {\n VOID: '',\n // not sure to know what that should be\n CHAR: 'Int8Array',\n SIGNED_CHAR: 'Int8Array',\n UNSIGNED_CHAR: 'Uint8Array',\n SHORT: 'Int16Array',\n UNSIGNED_SHORT: 'Uint16Array',\n INT: 'Int32Array',\n UNSIGNED_INT: 'Uint32Array',\n FLOAT: 'Float32Array',\n DOUBLE: 'Float64Array'\n};\nvar DefaultDataType = VtkDataTypes.FLOAT;\nvar Constants = {\n DefaultDataType: DefaultDataType,\n DataTypeByteSize: DataTypeByteSize,\n VtkDataTypes: VtkDataTypes\n};\n\nexport { DataTypeByteSize, DefaultDataType, VtkDataTypes, Constants as default };\n","import macro from '../../macros.js';\nimport { i as isNan, h as hsv2rgb } from './Math/index.js';\nimport vtkScalarsToColors from './ScalarsToColors.js';\nimport { ScalarMappingTarget } from './ScalarsToColors/Constants.js';\nimport { VtkDataTypes } from './DataArray/Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// Add module-level functions or api that you want to expose statically via\n// the next section...\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nvar BELOW_RANGE_COLOR_INDEX = 0;\nvar ABOVE_RANGE_COLOR_INDEX = 1;\nvar NAN_COLOR_INDEX = 2; // ----------------------------------------------------------------------------\n// vtkMyClass methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLookupTable(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLookupTable'); //----------------------------------------------------------------------------\n // Description:\n // Return true if all of the values defining the mapping have an opacity\n // equal to 1. Default implementation return true.\n\n publicAPI.isOpaque = function () {\n if (model.opaqueFlagBuildTime.getMTime() < publicAPI.getMTime()) {\n var opaque = true;\n\n if (model.nanColor[3] < 1.0) {\n opaque = 0;\n }\n\n if (model.useBelowRangeColor && model.belowRangeColor[3] < 1.0) {\n opaque = 0;\n }\n\n if (model.useAboveRangeColor && model.aboveRangeColor[3] < 1.0) {\n opaque = 0;\n }\n\n for (var i = 3; i < model.table.length && opaque; i += 4) {\n if (model.table[i] < 255) {\n opaque = false;\n }\n }\n\n model.opaqueFlag = opaque;\n model.opaqueFlagBuildTime.modified();\n }\n\n return model.opaqueFlag;\n };\n\n publicAPI.usingLogScale = function () {\n return false;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getNumberOfAvailableColors = function () {\n return model.table.length / 4;\n }; //----------------------------------------------------------------------------\n // Apply shift/scale to the scalar value v and return the index.\n\n\n publicAPI.linearIndexLookup = function (v, p) {\n var dIndex = 0;\n\n if (v < p.range[0]) {\n dIndex = p.maxIndex + BELOW_RANGE_COLOR_INDEX + 1.5;\n } else if (v > p.range[1]) {\n dIndex = p.maxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.shift) * p.scale; // This conditional is needed because when v is very close to\n // p.Range[1], it may map above p.MaxIndex in the linear mapping\n // above.\n\n dIndex = dIndex < p.maxIndex ? dIndex : p.maxIndex;\n }\n\n return Math.floor(dIndex);\n };\n\n publicAPI.linearLookup = function (v, table, p) {\n var index = 0;\n\n if (isNan(v)) {\n index = Math.floor(p.maxIndex + 1.5 + NAN_COLOR_INDEX);\n } else {\n index = publicAPI.linearIndexLookup(v, p);\n }\n\n var offset = 4 * index;\n return table.slice(offset, offset + 4);\n };\n\n publicAPI.indexedLookupFunction = function (v, table, p) {\n var index = publicAPI.getAnnotatedValueIndexInternal(v);\n\n if (index === -1) {\n index = model.numberOfColors + NAN_COLOR_INDEX;\n }\n\n var offset = 4 * index;\n return [table[offset], table[offset + 1], table[offset + 2], table[offset + 3]];\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.lookupShiftAndScale = function (range, p) {\n p.shift = -range[0];\n p.scale = Number.MAX_VALUE;\n\n if (range[1] > range[0]) {\n p.scale = (p.maxIndex + 1) / (range[1] - range[0]);\n }\n }; // Public API methods\n\n\n publicAPI.mapScalarsThroughTable = function (input, output, outFormat, inputOffset) {\n var lookupFunc = publicAPI.linearLookup;\n\n if (model.indexedLookup) {\n lookupFunc = publicAPI.indexedLookupFunction;\n }\n\n var trange = publicAPI.getMappingRange();\n var p = {\n maxIndex: publicAPI.getNumberOfColors() - 1,\n range: trange,\n shift: 0.0,\n scale: 0.0\n };\n publicAPI.lookupShiftAndScale(trange, p);\n var alpha = publicAPI.getAlpha();\n var length = input.getNumberOfTuples();\n var inIncr = input.getNumberOfComponents();\n var outputV = output.getData();\n var inputV = input.getData();\n\n if (alpha >= 1.0) {\n if (outFormat === ScalarMappingTarget.RGBA) {\n for (var i = 0; i < length; i++) {\n var cptr = lookupFunc(inputV[i * inIncr + inputOffset], model.table, p);\n outputV[i * 4] = cptr[0];\n outputV[i * 4 + 1] = cptr[1];\n outputV[i * 4 + 2] = cptr[2];\n outputV[i * 4 + 3] = cptr[3];\n }\n }\n } else {\n /* eslint-disable no-lonely-if */\n if (outFormat === ScalarMappingTarget.RGBA) {\n for (var _i = 0; _i < length; _i++) {\n var _cptr = lookupFunc(inputV[_i * inIncr + inputOffset], model.table, p);\n\n outputV[_i * 4] = _cptr[0];\n outputV[_i * 4 + 1] = _cptr[1];\n outputV[_i * 4 + 2] = _cptr[2];\n outputV[_i * 4 + 3] = Math.floor(_cptr[3] * alpha + 0.5);\n }\n }\n } // alpha blending\n\n };\n\n publicAPI.forceBuild = function () {\n var hinc = 0.0;\n var sinc = 0.0;\n var vinc = 0.0;\n var ainc = 0.0;\n var maxIndex = model.numberOfColors - 1;\n\n if (maxIndex) {\n hinc = (model.hueRange[1] - model.hueRange[0]) / maxIndex;\n sinc = (model.saturationRange[1] - model.saturationRange[0]) / maxIndex;\n vinc = (model.valueRange[1] - model.valueRange[0]) / maxIndex;\n ainc = (model.alphaRange[1] - model.alphaRange[0]) / maxIndex;\n }\n\n model.table.length = 4 * maxIndex + 16;\n var hsv = [];\n var rgba = [];\n\n for (var i = 0; i <= maxIndex; i++) {\n hsv[0] = model.hueRange[0] + i * hinc;\n hsv[1] = model.saturationRange[0] + i * sinc;\n hsv[2] = model.valueRange[0] + i * vinc;\n hsv2rgb(hsv, rgba);\n rgba[3] = model.alphaRange[0] + i * ainc; // case VTK_RAMP_LINEAR:\n\n model.table[i * 4] = rgba[0] * 255.0 + 0.5;\n model.table[i * 4 + 1] = rgba[1] * 255.0 + 0.5;\n model.table[i * 4 + 2] = rgba[2] * 255.0 + 0.5;\n model.table[i * 4 + 3] = rgba[3] * 255.0 + 0.5;\n }\n\n publicAPI.buildSpecialColors();\n model.buildTime.modified();\n };\n\n publicAPI.setTable = function (table) {\n if (table.getNumberOfComponents() !== 4) {\n vtkErrorMacro('Expected 4 components for RGBA colors');\n return;\n }\n\n if (table.getDataType() !== VtkDataTypes.UNSIGNED_CHAR) {\n vtkErrorMacro('Expected unsigned char values for RGBA colors');\n return;\n }\n\n model.numberOfColors = table.getNumberOfTuples();\n var data = table.getData();\n model.table.length = data.length;\n\n for (var i = 0; i < data.length; i++) {\n model.table[i] = data[i];\n }\n\n publicAPI.buildSpecialColors();\n model.insertTime.modified();\n publicAPI.modified();\n };\n\n publicAPI.buildSpecialColors = function () {\n // Add \"special\" colors (NaN, below range, above range) to table here.\n var numberOfColors = model.numberOfColors;\n var tptr = model.table;\n var base = (numberOfColors + BELOW_RANGE_COLOR_INDEX) * 4; // Below range color\n\n if (model.useBelowRangeColor || numberOfColors === 0) {\n tptr[base] = model.belowRangeColor[0] * 255.0 + 0.5;\n tptr[base + 1] = model.belowRangeColor[1] * 255.0 + 0.5;\n tptr[base + 2] = model.belowRangeColor[2] * 255.0 + 0.5;\n tptr[base + 3] = model.belowRangeColor[3] * 255.0 + 0.5;\n } else {\n // Duplicate the first color in the table.\n tptr[base] = tptr[0];\n tptr[base + 1] = tptr[1];\n tptr[base + 2] = tptr[2];\n tptr[base + 3] = tptr[3];\n } // Above range color\n\n\n base = (numberOfColors + ABOVE_RANGE_COLOR_INDEX) * 4;\n\n if (model.useAboveRangeColor || numberOfColors === 0) {\n tptr[base] = model.aboveRangeColor[0] * 255.0 + 0.5;\n tptr[base + 1] = model.aboveRangeColor[1] * 255.0 + 0.5;\n tptr[base + 2] = model.aboveRangeColor[2] * 255.0 + 0.5;\n tptr[base + 3] = model.aboveRangeColor[3] * 255.0 + 0.5;\n } else {\n // Duplicate the last color in the table.\n tptr[base] = tptr[4 * (numberOfColors - 1) + 0];\n tptr[base + 1] = tptr[4 * (numberOfColors - 1) + 1];\n tptr[base + 2] = tptr[4 * (numberOfColors - 1) + 2];\n tptr[base + 3] = tptr[4 * (numberOfColors - 1) + 3];\n } // Always use NanColor\n\n\n base = (numberOfColors + NAN_COLOR_INDEX) * 4;\n tptr[base] = model.nanColor[0] * 255.0 + 0.5;\n tptr[base + 1] = model.nanColor[1] * 255.0 + 0.5;\n tptr[base + 2] = model.nanColor[2] * 255.0 + 0.5;\n tptr[base + 3] = model.nanColor[3] * 255.0 + 0.5;\n };\n\n publicAPI.build = function () {\n if (model.table.length < 1 || publicAPI.getMTime() > model.buildTime.getMTime() && model.insertTime.getMTime() <= model.buildTime.getMTime()) {\n publicAPI.forceBuild();\n }\n };\n\n if (model.table.length > 0) {\n // ensure insertTime is more recently modified than buildTime if\n // a table is provided via the constructor\n model.insertTime.modified();\n }\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n numberOfColors: 256,\n // table: null,\n hueRange: [0.0, 0.66667],\n saturationRange: [1.0, 1.0],\n valueRange: [1.0, 1.0],\n alphaRange: [1.0, 1.0],\n nanColor: [0.5, 0.0, 0.0, 1.0],\n belowRangeColor: [0.0, 0.0, 0.0, 1.0],\n aboveRangeColor: [1.0, 1.0, 1.0, 1.0],\n useAboveRangeColor: false,\n useBelowRangeColor: false,\n alpha: 1.0 // buildTime: null,\n // opaqueFlagBuildTime: null,\n // insertTime: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkScalarsToColors.extend(publicAPI, model, initialValues); // Internal objects initialization\n\n if (!model.table) {\n model.table = [];\n }\n\n model.buildTime = {};\n macro.obj(model.buildTime);\n model.opaqueFlagBuildTime = {};\n macro.obj(model.opaqueFlagBuildTime, {\n mtime: 0\n });\n model.insertTime = {};\n macro.obj(model.insertTime, {\n mtime: 0\n }); // Create get-only macros\n\n macro.get(publicAPI, model, ['buildTime']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['numberOfColors', 'useAboveRangeColor', 'useBelowRangeColor']); // Create set macros for array (needs to know size)\n\n macro.setArray(publicAPI, model, ['alphaRange', 'hueRange', 'saturationRange', 'valueRange'], 2);\n macro.setArray(publicAPI, model, ['nanColor', 'belowRangeColor', 'aboveRangeColor'], 4); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['hueRange', 'saturationRange', 'valueRange', 'alphaRange', 'nanColor', 'belowRangeColor', 'aboveRangeColor']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkLookupTable(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkLookupTable'); // ----------------------------------------------------------------------------\n\nvar vtkLookupTable$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkLookupTable$1 as default, extend, newInstance };\n","var IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\nvar IDENTITY_3X3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\nvar EPSILON = 1e-6;\nvar VTK_SMALL_NUMBER = 1.0e-12;\nvar Constants = {\n IDENTITY: IDENTITY,\n IDENTITY_3X3: IDENTITY_3X3,\n EPSILON: EPSILON,\n VTK_SMALL_NUMBER: VTK_SMALL_NUMBER\n};\n\nexport { EPSILON, IDENTITY, IDENTITY_3X3, VTK_SMALL_NUMBER, Constants as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport seedrandom from 'seedrandom';\nimport macro from '../../../macros.js';\nimport { IDENTITY, IDENTITY_3X3, VTK_SMALL_NUMBER, EPSILON } from './Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro,\n vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n\n/* eslint-disable camelcase */\n\n/* eslint-disable no-cond-assign */\n\n/* eslint-disable no-bitwise */\n\n/* eslint-disable no-multi-assign */\n// ----------------------------------------------------------------------------\n\nvar randomSeedValue = 0;\nvar VTK_MAX_ROTATIONS = 20;\n\nfunction notImplemented(method) {\n return function () {\n return vtkErrorMacro(\"vtkMath::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // Swap rows for n by n matrix\n\n\nfunction swapRowsMatrix_nxn(matrix, n, row1, row2) {\n var tmp;\n\n for (var i = 0; i < n; i++) {\n tmp = matrix[row1 * n + i];\n matrix[row1 * n + i] = matrix[row2 * n + i];\n matrix[row2 * n + i] = tmp;\n }\n} // Swap columns for n by n matrix\n\n\nfunction swapColumnsMatrix_nxn(matrix, n, column1, column2) {\n var tmp;\n\n for (var i = 0; i < n; i++) {\n tmp = matrix[i * n + column1];\n matrix[i * n + column1] = matrix[i * n + column2];\n matrix[i * n + column2] = tmp;\n }\n} // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\n\nfunction createArray() {\n var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3;\n // faster than Array.from and/or while loop\n var res = Array(size);\n\n for (var i = 0; i < size; ++i) {\n res[i] = 0;\n }\n\n return res;\n}\nvar Pi = function Pi() {\n return Math.PI;\n};\nfunction radiansFromDegrees(deg) {\n return deg / 180 * Math.PI;\n}\nfunction degreesFromRadians(rad) {\n return rad * 180 / Math.PI;\n}\nvar round = Math.round,\n floor = Math.floor,\n ceil = Math.ceil,\n min = Math.min,\n max = Math.max;\nfunction arrayMin(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var minValue = Infinity;\n\n for (var i = offset, len = arr.length; i < len; i += stride) {\n if (arr[i] < minValue) {\n minValue = arr[i];\n }\n }\n\n return minValue;\n}\nfunction arrayMax(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var maxValue = -Infinity;\n\n for (var i = offset, len = arr.length; i < len; i += stride) {\n if (maxValue < arr[i]) {\n maxValue = arr[i];\n }\n }\n\n return maxValue;\n}\nfunction arrayRange(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var minValue = Infinity;\n var maxValue = -Infinity;\n\n for (var i = offset, len = arr.length; i < len; i += stride) {\n if (arr[i] < minValue) {\n minValue = arr[i];\n }\n\n if (maxValue < arr[i]) {\n maxValue = arr[i];\n }\n }\n\n return [minValue, maxValue];\n}\nvar ceilLog2 = notImplemented('ceilLog2');\nvar factorial = notImplemented('factorial');\nfunction nearestPowerOfTwo(xi) {\n var v = 1;\n\n while (v < xi) {\n v *= 2;\n }\n\n return v;\n}\nfunction isPowerOfTwo(x) {\n return x === nearestPowerOfTwo(x);\n}\nfunction binomial(m, n) {\n var r = 1;\n\n for (var i = 1; i <= n; ++i) {\n r *= (m - i + 1) / i;\n }\n\n return Math.floor(r);\n}\nfunction beginCombination(m, n) {\n if (m < n) {\n return 0;\n }\n\n var r = createArray(n);\n\n for (var i = 0; i < n; ++i) {\n r[i] = i;\n }\n\n return r;\n}\nfunction nextCombination(m, n, r) {\n var status = 0;\n\n for (var i = n - 1; i >= 0; --i) {\n if (r[i] < m - n + i) {\n var j = r[i] + 1;\n\n while (i < n) {\n r[i++] = j++;\n }\n\n status = 1;\n break;\n }\n }\n\n return status;\n}\nfunction randomSeed(seed) {\n seedrandom(\"\".concat(seed), {\n global: true\n });\n randomSeedValue = seed;\n}\nfunction getSeed() {\n return randomSeedValue;\n}\nfunction random() {\n var minValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var maxValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var delta = maxValue - minValue;\n return minValue + delta * Math.random();\n}\nvar gaussian = notImplemented('gaussian'); // Vect3 operations\n\nfunction add(a, b, out) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\nfunction subtract(a, b, out) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\nfunction multiplyScalar(vec, scalar) {\n vec[0] *= scalar;\n vec[1] *= scalar;\n vec[2] *= scalar;\n return vec;\n}\nfunction multiplyScalar2D(vec, scalar) {\n vec[0] *= scalar;\n vec[1] *= scalar;\n return vec;\n}\nfunction multiplyAccumulate(a, b, scalar, out) {\n out[0] = a[0] + b[0] * scalar;\n out[1] = a[1] + b[1] * scalar;\n out[2] = a[2] + b[2] * scalar;\n return out;\n}\nfunction multiplyAccumulate2D(a, b, scalar, out) {\n out[0] = a[0] + b[0] * scalar;\n out[1] = a[1] + b[1] * scalar;\n return out;\n}\nfunction dot(x, y) {\n return x[0] * y[0] + x[1] * y[1] + x[2] * y[2];\n}\nfunction outer(x, y, out_3x3) {\n out_3x3[0] = x[0] * y[0];\n out_3x3[1] = x[0] * y[1];\n out_3x3[2] = x[0] * y[2];\n out_3x3[3] = x[1] * y[0];\n out_3x3[4] = x[1] * y[1];\n out_3x3[5] = x[1] * y[2];\n out_3x3[6] = x[2] * y[0];\n out_3x3[7] = x[2] * y[1];\n out_3x3[8] = x[2] * y[2];\n}\nfunction cross(x, y, out) {\n var Zx = x[1] * y[2] - x[2] * y[1];\n var Zy = x[2] * y[0] - x[0] * y[2];\n var Zz = x[0] * y[1] - x[1] * y[0];\n out[0] = Zx;\n out[1] = Zy;\n out[2] = Zz;\n return out;\n}\nfunction norm(x) {\n var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n\n switch (n) {\n case 1:\n return Math.abs(x);\n\n case 2:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n\n case 3:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);\n\n default:\n {\n var sum = 0;\n\n for (var i = 0; i < n; i++) {\n sum += x[i] * x[i];\n }\n\n return Math.sqrt(sum);\n }\n }\n}\nfunction normalize(x) {\n var den = norm(x);\n\n if (den !== 0.0) {\n x[0] /= den;\n x[1] /= den;\n x[2] /= den;\n }\n\n return den;\n}\nfunction perpendiculars(x, y, z, theta) {\n var x2 = x[0] * x[0];\n var y2 = x[1] * x[1];\n var z2 = x[2] * x[2];\n var r = Math.sqrt(x2 + y2 + z2);\n var dx;\n var dy;\n var dz; // transpose the vector to avoid divide-by-zero error\n\n if (x2 > y2 && x2 > z2) {\n dx = 0;\n dy = 1;\n dz = 2;\n } else if (y2 > z2) {\n dx = 1;\n dy = 2;\n dz = 0;\n } else {\n dx = 2;\n dy = 0;\n dz = 1;\n }\n\n var a = x[dx] / r;\n var b = x[dy] / r;\n var c = x[dz] / r;\n var tmp = Math.sqrt(a * a + c * c);\n\n if (theta !== 0) {\n var sintheta = Math.sin(theta);\n var costheta = Math.cos(theta);\n\n if (y) {\n y[dx] = (c * costheta - a * b * sintheta) / tmp;\n y[dy] = sintheta * tmp;\n y[dz] = (-(a * costheta) - b * c * sintheta) / tmp;\n }\n\n if (z) {\n z[dx] = (-(c * sintheta) - a * b * costheta) / tmp;\n z[dy] = costheta * tmp;\n z[dz] = (a * sintheta - b * c * costheta) / tmp;\n }\n } else {\n if (y) {\n y[dx] = c / tmp;\n y[dy] = 0;\n y[dz] = -a / tmp;\n }\n\n if (z) {\n z[dx] = -a * b / tmp;\n z[dy] = tmp;\n z[dz] = -b * c / tmp;\n }\n }\n}\nfunction projectVector(a, b, projection) {\n var bSquared = dot(b, b);\n\n if (bSquared === 0) {\n projection[0] = 0;\n projection[1] = 0;\n projection[2] = 0;\n return false;\n }\n\n var scale = dot(a, b) / bSquared;\n\n for (var i = 0; i < 3; i++) {\n projection[i] = b[i];\n }\n\n multiplyScalar(projection, scale);\n return true;\n}\nfunction dot2D(x, y) {\n return x[0] * y[0] + x[1] * y[1];\n}\nfunction projectVector2D(a, b, projection) {\n var bSquared = dot2D(b, b);\n\n if (bSquared === 0) {\n projection[0] = 0;\n projection[1] = 0;\n return false;\n }\n\n var scale = dot2D(a, b) / bSquared;\n\n for (var i = 0; i < 2; i++) {\n projection[i] = b[i];\n }\n\n multiplyScalar2D(projection, scale);\n return true;\n}\nfunction distance2BetweenPoints(x, y) {\n return (x[0] - y[0]) * (x[0] - y[0]) + (x[1] - y[1]) * (x[1] - y[1]) + (x[2] - y[2]) * (x[2] - y[2]);\n}\nfunction angleBetweenVectors(v1, v2) {\n var crossVect = [0, 0, 0];\n cross(v1, v2, crossVect);\n return Math.atan2(norm(crossVect), dot(v1, v2));\n}\nfunction signedAngleBetweenVectors(v1, v2, vN) {\n var crossVect = [0, 0, 0];\n cross(v1, v2, crossVect);\n var angle = Math.atan2(norm(crossVect), dot(v1, v2));\n return dot(crossVect, vN) >= 0 ? angle : -angle;\n}\nfunction gaussianAmplitude(mean, variance, position) {\n var distanceFromMean = Math.abs(mean - position);\n return 1 / Math.sqrt(2 * Math.PI * variance) * Math.exp(-Math.pow(distanceFromMean, 2) / (2 * variance));\n}\nfunction gaussianWeight(mean, variance, position) {\n var distanceFromMean = Math.abs(mean - position);\n return Math.exp(-Math.pow(distanceFromMean, 2) / (2 * variance));\n}\nfunction outer2D(x, y, out_2x2) {\n out_2x2[0] = x[0] * y[0];\n out_2x2[1] = x[0] * y[1];\n out_2x2[2] = x[1] * y[0];\n out_2x2[3] = x[1] * y[1];\n}\nfunction norm2D(x2D) {\n return Math.sqrt(x2D[0] * x2D[0] + x2D[1] * x2D[1]);\n}\nfunction normalize2D(x) {\n var den = norm2D(x);\n\n if (den !== 0.0) {\n x[0] /= den;\n x[1] /= den;\n }\n\n return den;\n}\nfunction rowsToMat4(row0, row1, row2, row3, mat) {\n for (var i = 0; i < 4; i++) {\n mat[i] = row0[i];\n mat[4 + i] = row1[i];\n mat[8 + i] = row2[i];\n mat[12 + i] = row3[i];\n }\n\n return mat;\n}\nfunction columnsToMat4(column0, column1, column2, column3, mat) {\n for (var i = 0; i < 4; i++) {\n mat[4 * i] = column0[i];\n mat[4 * i + 1] = column1[i];\n mat[4 * i + 2] = column2[i];\n mat[4 * i + 3] = column3[i];\n }\n\n return mat;\n}\nfunction rowsToMat3(row0, row1, row2, mat) {\n for (var i = 0; i < 3; i++) {\n mat[i] = row0[i];\n mat[3 + i] = row1[i];\n mat[6 + i] = row2[i];\n }\n\n return mat;\n}\nfunction columnsToMat3(column0, column1, column2, mat) {\n for (var i = 0; i < 3; i++) {\n mat[3 * i] = column0[i];\n mat[3 * i + 1] = column1[i];\n mat[3 * i + 2] = column2[i];\n }\n\n return mat;\n}\nfunction determinant2x2() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args.length === 2) {\n return args[0][0] * args[1][1] - args[1][0] * args[0][1];\n }\n\n if (args.length === 4) {\n return args[0] * args[3] - args[1] * args[2];\n }\n\n return Number.NaN;\n}\nfunction LUFactor3x3(mat_3x3, index_3) {\n var maxI;\n var tmp;\n var largest;\n var scale = [0, 0, 0]; // Loop over rows to get implicit scaling information\n\n for (var i = 0; i < 3; i++) {\n largest = Math.abs(mat_3x3[i * 3]);\n\n if ((tmp = Math.abs(mat_3x3[i * 3 + 1])) > largest) {\n largest = tmp;\n }\n\n if ((tmp = Math.abs(mat_3x3[i * 3 + 2])) > largest) {\n largest = tmp;\n }\n\n scale[i] = 1 / largest;\n } // Loop over all columns using Crout's method\n // first column\n\n\n largest = scale[0] * Math.abs(mat_3x3[0]);\n maxI = 0;\n\n if ((tmp = scale[1] * Math.abs(mat_3x3[3])) >= largest) {\n largest = tmp;\n maxI = 1;\n }\n\n if ((tmp = scale[2] * Math.abs(mat_3x3[6])) >= largest) {\n maxI = 2;\n }\n\n if (maxI !== 0) {\n swapRowsMatrix_nxn(mat_3x3, 3, maxI, 0);\n scale[maxI] = scale[0];\n }\n\n index_3[0] = maxI;\n mat_3x3[3] /= mat_3x3[0];\n mat_3x3[6] /= mat_3x3[0]; // second column\n\n mat_3x3[4] -= mat_3x3[3] * mat_3x3[1];\n mat_3x3[7] -= mat_3x3[6] * mat_3x3[1];\n largest = scale[1] * Math.abs(mat_3x3[4]);\n maxI = 1;\n\n if ((tmp = scale[2] * Math.abs(mat_3x3[7])) >= largest) {\n maxI = 2;\n swapRowsMatrix_nxn(mat_3x3, 3, 1, 2);\n scale[2] = scale[1];\n }\n\n index_3[1] = maxI;\n mat_3x3[7] /= mat_3x3[4]; // third column\n\n mat_3x3[5] -= mat_3x3[3] * mat_3x3[2];\n mat_3x3[8] -= mat_3x3[6] * mat_3x3[2] + mat_3x3[7] * mat_3x3[5];\n index_3[2] = 2;\n}\nfunction LUSolve3x3(mat_3x3, index_3, x_3) {\n // forward substitution\n var sum = x_3[index_3[0]];\n x_3[index_3[0]] = x_3[0];\n x_3[0] = sum;\n sum = x_3[index_3[1]];\n x_3[index_3[1]] = x_3[1];\n x_3[1] = sum - mat_3x3[3] * x_3[0];\n sum = x_3[index_3[2]];\n x_3[index_3[2]] = x_3[2];\n x_3[2] = sum - mat_3x3[6] * x_3[0] - mat_3x3[7] * x_3[1]; // back substitution\n\n x_3[2] /= mat_3x3[8];\n x_3[1] = (x_3[1] - mat_3x3[5] * x_3[2]) / mat_3x3[4];\n x_3[0] = (x_3[0] - mat_3x3[1] * x_3[1] - mat_3x3[2] * x_3[2]) / mat_3x3[0];\n}\nfunction linearSolve3x3(mat_3x3, x_3, y_3) {\n var a1 = mat_3x3[0];\n var b1 = mat_3x3[1];\n var c1 = mat_3x3[2];\n var a2 = mat_3x3[3];\n var b2 = mat_3x3[4];\n var c2 = mat_3x3[5];\n var a3 = mat_3x3[6];\n var b3 = mat_3x3[7];\n var c3 = mat_3x3[8]; // Compute the adjoint\n\n var d1 = +determinant2x2(b2, b3, c2, c3);\n var d2 = -determinant2x2(a2, a3, c2, c3);\n var d3 = +determinant2x2(a2, a3, b2, b3);\n var e1 = -determinant2x2(b1, b3, c1, c3);\n var e2 = +determinant2x2(a1, a3, c1, c3);\n var e3 = -determinant2x2(a1, a3, b1, b3);\n var f1 = +determinant2x2(b1, b2, c1, c2);\n var f2 = -determinant2x2(a1, a2, c1, c2);\n var f3 = +determinant2x2(a1, a2, b1, b2); // Compute the determinant\n\n var det = a1 * d1 + b1 * d2 + c1 * d3; // Multiply by the adjoint\n\n var v1 = d1 * x_3[0] + e1 * x_3[1] + f1 * x_3[2];\n var v2 = d2 * x_3[0] + e2 * x_3[1] + f2 * x_3[2];\n var v3 = d3 * x_3[0] + e3 * x_3[1] + f3 * x_3[2]; // Divide by the determinant\n\n y_3[0] = v1 / det;\n y_3[1] = v2 / det;\n y_3[2] = v3 / det;\n}\nfunction multiply3x3_vect3(mat_3x3, in_3, out_3) {\n var x = mat_3x3[0] * in_3[0] + mat_3x3[1] * in_3[1] + mat_3x3[2] * in_3[2];\n var y = mat_3x3[3] * in_3[0] + mat_3x3[4] * in_3[1] + mat_3x3[5] * in_3[2];\n var z = mat_3x3[6] * in_3[0] + mat_3x3[7] * in_3[1] + mat_3x3[8] * in_3[2];\n out_3[0] = x;\n out_3[1] = y;\n out_3[2] = z;\n}\nfunction multiply3x3_mat3(a_3x3, b_3x3, out_3x3) {\n var copyA = _toConsumableArray(a_3x3);\n\n var copyB = _toConsumableArray(b_3x3);\n\n for (var i = 0; i < 3; i++) {\n out_3x3[i] = copyA[0] * copyB[i] + copyA[1] * copyB[i + 3] + copyA[2] * copyB[i + 6];\n out_3x3[i + 3] = copyA[3] * copyB[i] + copyA[4] * copyB[i + 3] + copyA[5] * copyB[i + 6];\n out_3x3[i + 6] = copyA[6] * copyB[i] + copyA[7] * copyB[i + 3] + copyA[8] * copyB[i + 6];\n }\n}\nfunction multiplyMatrix(a, b, rowA, colA, rowB, colB, out_rowXcol) {\n // we need colA == rowB\n if (colA !== rowB) {\n vtkErrorMacro('Number of columns of A must match number of rows of B.');\n } // If a or b is used to store the result, copying them is required\n\n\n var copyA = _toConsumableArray(a);\n\n var copyB = _toConsumableArray(b); // output matrix is rowA*colB\n // output row\n\n\n for (var i = 0; i < rowA; i++) {\n // output col\n for (var j = 0; j < colB; j++) {\n out_rowXcol[i * colB + j] = 0; // sum for this point\n\n for (var k = 0; k < colA; k++) {\n out_rowXcol[i * colB + j] += copyA[i * colA + k] * copyB[j + colB * k];\n }\n }\n }\n}\nfunction transpose3x3(in_3x3, outT_3x3) {\n var tmp; // off-diagonal elements\n\n tmp = in_3x3[3];\n outT_3x3[3] = in_3x3[1];\n outT_3x3[1] = tmp;\n tmp = in_3x3[6];\n outT_3x3[6] = in_3x3[2];\n outT_3x3[2] = tmp;\n tmp = in_3x3[7];\n outT_3x3[7] = in_3x3[5];\n outT_3x3[5] = tmp; // on-diagonal elements\n\n outT_3x3[0] = in_3x3[0];\n outT_3x3[4] = in_3x3[4];\n outT_3x3[8] = in_3x3[8];\n}\nfunction invert3x3(in_3x3, outI_3x3) {\n var a1 = in_3x3[0];\n var b1 = in_3x3[1];\n var c1 = in_3x3[2];\n var a2 = in_3x3[3];\n var b2 = in_3x3[4];\n var c2 = in_3x3[5];\n var a3 = in_3x3[6];\n var b3 = in_3x3[7];\n var c3 = in_3x3[8]; // Compute the adjoint\n\n var d1 = +determinant2x2(b2, b3, c2, c3);\n var d2 = -determinant2x2(a2, a3, c2, c3);\n var d3 = +determinant2x2(a2, a3, b2, b3);\n var e1 = -determinant2x2(b1, b3, c1, c3);\n var e2 = +determinant2x2(a1, a3, c1, c3);\n var e3 = -determinant2x2(a1, a3, b1, b3);\n var f1 = +determinant2x2(b1, b2, c1, c2);\n var f2 = -determinant2x2(a1, a2, c1, c2);\n var f3 = +determinant2x2(a1, a2, b1, b2); // Divide by the determinant\n\n var det = a1 * d1 + b1 * d2 + c1 * d3;\n\n if (det === 0) {\n vtkWarningMacro('Matrix has 0 determinant');\n }\n\n outI_3x3[0] = d1 / det;\n outI_3x3[3] = d2 / det;\n outI_3x3[6] = d3 / det;\n outI_3x3[1] = e1 / det;\n outI_3x3[4] = e2 / det;\n outI_3x3[7] = e3 / det;\n outI_3x3[2] = f1 / det;\n outI_3x3[5] = f2 / det;\n outI_3x3[8] = f3 / det;\n}\nfunction determinant3x3(mat_3x3) {\n return mat_3x3[0] * mat_3x3[4] * mat_3x3[8] + mat_3x3[3] * mat_3x3[7] * mat_3x3[2] + mat_3x3[6] * mat_3x3[1] * mat_3x3[5] - mat_3x3[0] * mat_3x3[7] * mat_3x3[5] - mat_3x3[3] * mat_3x3[1] * mat_3x3[8] - mat_3x3[6] * mat_3x3[4] * mat_3x3[2];\n}\n/**\n * Returns true if elements of both arrays are equals.\n * @param {Array} a an array of numbers (vector, point, matrix...)\n * @param {Array} b an array of numbers (vector, point, matrix...)\n * @param {Number} eps tolerance\n */\n\nfunction areEquals(a, b) {\n var eps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n\n if (a.length !== b.length) {\n return false;\n }\n\n function isEqual(element, index) {\n return Math.abs(element - b[index]) <= eps;\n }\n\n return a.every(isEqual);\n}\nvar areMatricesEqual = areEquals;\nfunction identity3x3(mat_3x3) {\n for (var i = 0; i < 3; i++) {\n /* eslint-disable-next-line no-multi-assign */\n mat_3x3[i * 3] = mat_3x3[i * 3 + 1] = mat_3x3[i * 3 + 2] = 0;\n mat_3x3[i * 3 + i] = 1;\n }\n}\nfunction identity(n, mat) {\n for (var i = 0; i < n; i++) {\n for (var j = 0; j < n; j++) {\n mat[i * n + j] = 0;\n }\n\n mat[i * n + i] = 1;\n }\n\n return mat;\n}\nfunction isIdentity(mat) {\n var eps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EPSILON;\n return areMatricesEqual(mat, IDENTITY, eps);\n}\nfunction isIdentity3x3(mat) {\n var eps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EPSILON;\n return areMatricesEqual(mat, IDENTITY_3X3, eps);\n}\nfunction quaternionToMatrix3x3(quat_4, mat_3x3) {\n var ww = quat_4[0] * quat_4[0];\n var wx = quat_4[0] * quat_4[1];\n var wy = quat_4[0] * quat_4[2];\n var wz = quat_4[0] * quat_4[3];\n var xx = quat_4[1] * quat_4[1];\n var yy = quat_4[2] * quat_4[2];\n var zz = quat_4[3] * quat_4[3];\n var xy = quat_4[1] * quat_4[2];\n var xz = quat_4[1] * quat_4[3];\n var yz = quat_4[2] * quat_4[3];\n var rr = xx + yy + zz; // normalization factor, just in case quaternion was not normalized\n\n var f = 1 / (ww + rr);\n var s = (ww - rr) * f;\n f *= 2;\n mat_3x3[0] = xx * f + s;\n mat_3x3[3] = (xy + wz) * f;\n mat_3x3[6] = (xz - wy) * f;\n mat_3x3[1] = (xy - wz) * f;\n mat_3x3[4] = yy * f + s;\n mat_3x3[7] = (yz + wx) * f;\n mat_3x3[2] = (xz + wy) * f;\n mat_3x3[5] = (yz - wx) * f;\n mat_3x3[8] = zz * f + s;\n}\nfunction roundNumber(num) {\n var digits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!\"\".concat(num).includes('e')) {\n return +\"\".concat(Math.round(\"\".concat(num, \"e+\").concat(digits)), \"e-\").concat(digits);\n }\n\n var arr = \"\".concat(num).split('e');\n var sig = '';\n\n if (+arr[1] + digits > 0) {\n sig = '+';\n }\n\n return +\"\".concat(Math.round(\"\".concat(+arr[0], \"e\").concat(sig).concat(+arr[1] + digits)), \"e-\").concat(digits);\n}\nfunction roundVector(vector) {\n var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0];\n var digits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n out[0] = roundNumber(vector[0], digits);\n out[1] = roundNumber(vector[1], digits);\n out[2] = roundNumber(vector[2], digits);\n return out;\n}\nfunction jacobiN(a, n, w, v) {\n var i;\n var j;\n var k;\n var iq;\n var ip;\n var numPos;\n var tresh;\n var theta;\n var t;\n var tau;\n var sm;\n var s;\n var h;\n var g;\n var c;\n var tmp;\n var b = createArray(n);\n var z = createArray(n);\n\n var vtkROTATE = function vtkROTATE(aa, ii, jj) {\n g = aa[ii];\n h = aa[jj];\n aa[ii] = g - s * (h + g * tau);\n aa[jj] = h + s * (g - h * tau);\n }; // initialize\n\n\n identity(n, v);\n\n for (ip = 0; ip < n; ip++) {\n b[ip] = w[ip] = a[ip + ip * n];\n z[ip] = 0.0;\n } // begin rotation sequence\n\n\n for (i = 0; i < VTK_MAX_ROTATIONS; i++) {\n sm = 0.0;\n\n for (ip = 0; ip < n - 1; ip++) {\n for (iq = ip + 1; iq < n; iq++) {\n sm += Math.abs(a[ip * n + iq]);\n }\n }\n\n if (sm === 0.0) {\n break;\n } // first 3 sweeps\n\n\n if (i < 3) {\n tresh = 0.2 * sm / (n * n);\n } else {\n tresh = 0.0;\n }\n\n for (ip = 0; ip < n - 1; ip++) {\n for (iq = ip + 1; iq < n; iq++) {\n g = 100.0 * Math.abs(a[ip * n + iq]); // after 4 sweeps\n\n if (i > 3 && Math.abs(w[ip]) + g === Math.abs(w[ip]) && Math.abs(w[iq]) + g === Math.abs(w[iq])) {\n a[ip * n + iq] = 0.0;\n } else if (Math.abs(a[ip * n + iq]) > tresh) {\n h = w[iq] - w[ip];\n\n if (Math.abs(h) + g === Math.abs(h)) {\n t = a[ip * n + iq] / h;\n } else {\n theta = 0.5 * h / a[ip * n + iq];\n t = 1.0 / (Math.abs(theta) + Math.sqrt(1.0 + theta * theta));\n\n if (theta < 0.0) {\n t = -t;\n }\n }\n\n c = 1.0 / Math.sqrt(1 + t * t);\n s = t * c;\n tau = s / (1.0 + c);\n h = t * a[ip * n + iq];\n z[ip] -= h;\n z[iq] += h;\n w[ip] -= h;\n w[iq] += h;\n a[ip * n + iq] = 0.0; // ip already shifted left by 1 unit\n\n for (j = 0; j <= ip - 1; j++) {\n vtkROTATE(a, j * n + ip, j * n + iq);\n } // ip and iq already shifted left by 1 unit\n\n\n for (j = ip + 1; j <= iq - 1; j++) {\n vtkROTATE(a, ip * n + j, j * n + iq);\n } // iq already shifted left by 1 unit\n\n\n for (j = iq + 1; j < n; j++) {\n vtkROTATE(a, ip * n + j, iq * n + j);\n }\n\n for (j = 0; j < n; j++) {\n vtkROTATE(v, j * n + ip, j * n + iq);\n }\n }\n }\n }\n\n for (ip = 0; ip < n; ip++) {\n b[ip] += z[ip];\n w[ip] = b[ip];\n z[ip] = 0.0;\n }\n } // this is NEVER called\n\n\n if (i >= VTK_MAX_ROTATIONS) {\n vtkWarningMacro('vtkMath::Jacobi: Error extracting eigenfunctions');\n return 0;\n } // sort eigenfunctions: these changes do not affect accuracy\n\n\n for (j = 0; j < n - 1; j++) {\n // boundary incorrect\n k = j;\n tmp = w[k];\n\n for (i = j + 1; i < n; i++) {\n // boundary incorrect, shifted already\n if (w[i] >= tmp || Math.abs(w[i] - tmp) < VTK_SMALL_NUMBER) {\n // why exchange if same?\n k = i;\n tmp = w[k];\n }\n }\n\n if (k !== j) {\n w[k] = w[j];\n w[j] = tmp;\n swapColumnsMatrix_nxn(v, n, j, k);\n }\n } // ensure eigenvector consistency (i.e., Jacobi can compute vectors that\n // are negative of one another (.707,.707,0) and (-.707,-.707,0). This can\n // reek havoc in hyperstreamline/other stuff. We will select the most\n // positive eigenvector.\n\n\n var ceil_half_n = (n >> 1) + (n & 1);\n\n for (numPos = 0, i = 0; i < n * n; i++) {\n if (v[i] >= 0.0) {\n numPos++;\n }\n } // if ( numPos < ceil(double(n)/double(2.0)) )\n\n\n if (numPos < ceil_half_n) {\n for (i = 0; i < n; i++) {\n v[i * n + j] *= -1.0;\n }\n }\n\n return 1;\n}\nfunction matrix3x3ToQuaternion(mat_3x3, quat_4) {\n var tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // on-diagonal elements\n\n tmp[0] = mat_3x3[0] + mat_3x3[4] + mat_3x3[8];\n tmp[5] = mat_3x3[0] - mat_3x3[4] - mat_3x3[8];\n tmp[10] = -mat_3x3[0] + mat_3x3[4] - mat_3x3[8];\n tmp[15] = -mat_3x3[0] - mat_3x3[4] + mat_3x3[8]; // off-diagonal elements\n\n tmp[1] = tmp[4] = mat_3x3[7] - mat_3x3[5];\n tmp[2] = tmp[8] = mat_3x3[2] - mat_3x3[6];\n tmp[3] = tmp[12] = mat_3x3[3] - mat_3x3[1];\n tmp[6] = tmp[9] = mat_3x3[3] + mat_3x3[1];\n tmp[7] = tmp[13] = mat_3x3[2] + mat_3x3[6];\n tmp[11] = tmp[14] = mat_3x3[7] + mat_3x3[5];\n var eigenvectors = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n var eigenvalues = [0, 0, 0, 0]; // convert into format that JacobiN can use,\n // then use Jacobi to find eigenvalues and eigenvectors\n // tmp is copied because jacobiN may modify it\n\n var NTemp = [].concat(tmp);\n jacobiN(NTemp, 4, eigenvalues, eigenvectors); // the first eigenvector is the one we want\n\n quat_4[0] = eigenvectors[0];\n quat_4[1] = eigenvectors[4];\n quat_4[2] = eigenvectors[8];\n quat_4[3] = eigenvectors[12];\n}\nfunction multiplyQuaternion(quat_1, quat_2, quat_out) {\n var ww = quat_1[0] * quat_2[0];\n var wx = quat_1[0] * quat_2[1];\n var wy = quat_1[0] * quat_2[2];\n var wz = quat_1[0] * quat_2[3];\n var xw = quat_1[1] * quat_2[0];\n var xx = quat_1[1] * quat_2[1];\n var xy = quat_1[1] * quat_2[2];\n var xz = quat_1[1] * quat_2[3];\n var yw = quat_1[2] * quat_2[0];\n var yx = quat_1[2] * quat_2[1];\n var yy = quat_1[2] * quat_2[2];\n var yz = quat_1[2] * quat_2[3];\n var zw = quat_1[3] * quat_2[0];\n var zx = quat_1[3] * quat_2[1];\n var zy = quat_1[3] * quat_2[2];\n var zz = quat_1[3] * quat_2[3];\n quat_out[0] = ww - xx - yy - zz;\n quat_out[1] = wx + xw + yz - zy;\n quat_out[2] = wy - xz + yw + zx;\n quat_out[3] = wz + xy - yx + zw;\n}\nfunction orthogonalize3x3(a_3x3, out_3x3) {\n // copy the matrix\n for (var i = 0; i < 9; i++) {\n out_3x3[i] = a_3x3[i];\n } // Pivot the matrix to improve accuracy\n\n\n var scale = createArray(3);\n var index = createArray(3);\n var largest; // Loop over rows to get implicit scaling information\n\n for (var _i = 0; _i < 3; _i++) {\n var _x = Math.abs(out_3x3[_i * 3]);\n\n var _x2 = Math.abs(out_3x3[_i * 3 + 1]);\n\n var _x3 = Math.abs(out_3x3[_i * 3 + 2]);\n\n largest = _x2 > _x ? _x2 : _x;\n largest = _x3 > largest ? _x3 : largest;\n scale[_i] = 1;\n\n if (largest !== 0) {\n scale[_i] /= largest;\n }\n } // first column\n\n\n var x1 = Math.abs(out_3x3[0]) * scale[0];\n var x2 = Math.abs(out_3x3[3]) * scale[1];\n var x3 = Math.abs(out_3x3[6]) * scale[2];\n index[0] = 0;\n largest = x1;\n\n if (x2 >= largest) {\n largest = x2;\n index[0] = 1;\n }\n\n if (x3 >= largest) {\n index[0] = 2;\n }\n\n if (index[0] !== 0) {\n // swap vectors\n swapColumnsMatrix_nxn(out_3x3, 3, index[0], 0);\n scale[index[0]] = scale[0];\n } // second column\n\n\n var y2 = Math.abs(out_3x3[4]) * scale[1];\n var y3 = Math.abs(out_3x3[7]) * scale[2];\n index[1] = 1;\n largest = y2;\n\n if (y3 >= largest) {\n index[1] = 2; // swap vectors\n\n swapColumnsMatrix_nxn(out_3x3, 3, 1, 2);\n } // third column\n\n\n index[2] = 2; // A quaternion can only describe a pure rotation, not\n // a rotation with a flip, therefore the flip must be\n // removed before the matrix is converted to a quaternion.\n\n var flip = 0;\n\n if (determinant3x3(out_3x3) < 0) {\n flip = 1;\n\n for (var _i2 = 0; _i2 < 9; _i2++) {\n out_3x3[_i2] = -out_3x3[_i2];\n }\n } // Do orthogonalization using a quaternion intermediate\n // (this, essentially, does the orthogonalization via\n // diagonalization of an appropriately constructed symmetric\n // 4x4 matrix rather than by doing SVD of the 3x3 matrix)\n\n\n var quat = createArray(4);\n matrix3x3ToQuaternion(out_3x3, quat);\n quaternionToMatrix3x3(quat, out_3x3); // Put the flip back into the orthogonalized matrix.\n\n if (flip) {\n for (var _i3 = 0; _i3 < 9; _i3++) {\n out_3x3[_i3] = -out_3x3[_i3];\n }\n } // Undo the pivoting\n\n\n if (index[1] !== 1) {\n swapColumnsMatrix_nxn(out_3x3, 3, index[1], 1);\n }\n\n if (index[0] !== 0) {\n swapColumnsMatrix_nxn(out_3x3, 3, index[0], 0);\n }\n}\nfunction diagonalize3x3(a_3x3, w_3, v_3x3) {\n var i;\n var j;\n var k;\n var maxI;\n var tmp;\n var maxVal; // a is copied because jacobiN may modify it\n\n var copyA = _toConsumableArray(a_3x3); // diagonalize using Jacobi\n\n\n jacobiN(copyA, 3, w_3, v_3x3); // if all the eigenvalues are the same, return identity matrix\n\n if (w_3[0] === w_3[1] && w_3[0] === w_3[2]) {\n identity3x3(v_3x3);\n return;\n } // transpose temporarily, it makes it easier to sort the eigenvectors\n\n\n transpose3x3(v_3x3, v_3x3); // if two eigenvalues are the same, re-orthogonalize to optimally line\n // up the eigenvectors with the x, y, and z axes\n\n for (i = 0; i < 3; i++) {\n // two eigenvalues are the same\n if (w_3[(i + 1) % 3] === w_3[(i + 2) % 3]) {\n // find maximum element of the independent eigenvector\n maxVal = Math.abs(v_3x3[i * 3]);\n maxI = 0;\n\n for (j = 1; j < 3; j++) {\n if (maxVal < (tmp = Math.abs(v_3x3[i * 3 + j]))) {\n maxVal = tmp;\n maxI = j;\n }\n } // swap the eigenvector into its proper position\n\n\n if (maxI !== i) {\n tmp = w_3[maxI];\n w_3[maxI] = w_3[i];\n w_3[i] = tmp;\n swapRowsMatrix_nxn(v_3x3, 3, i, maxI);\n } // maximum element of eigenvector should be positive\n\n\n if (v_3x3[maxI * 3 + maxI] < 0) {\n v_3x3[maxI * 3] = -v_3x3[maxI * 3];\n v_3x3[maxI * 3 + 1] = -v_3x3[maxI * 3 + 1];\n v_3x3[maxI * 3 + 2] = -v_3x3[maxI * 3 + 2];\n } // re-orthogonalize the other two eigenvectors\n\n\n j = (maxI + 1) % 3;\n k = (maxI + 2) % 3;\n v_3x3[j * 3] = 0.0;\n v_3x3[j * 3 + 1] = 0.0;\n v_3x3[j * 3 + 2] = 0.0;\n v_3x3[j * 3 + j] = 1.0;\n var vectTmp1 = cross([v_3x3[maxI * 3], v_3x3[maxI * 3 + 1], v_3x3[maxI * 3 + 2]], [v_3x3[j * 3], v_3x3[j * 3 + 1], v_3x3[j * 3 + 2]], []);\n normalize(vectTmp1);\n var vectTmp2 = cross(vectTmp1, [v_3x3[maxI * 3], v_3x3[maxI * 3 + 1], v_3x3[maxI * 3 + 2]], []);\n\n for (var t = 0; t < 3; t++) {\n v_3x3[k * 3 + t] = vectTmp1[t];\n v_3x3[j * 3 + t] = vectTmp2[t];\n } // transpose vectors back to columns\n\n\n transpose3x3(v_3x3, v_3x3);\n return;\n }\n } // the three eigenvalues are different, just sort the eigenvectors\n // to align them with the x, y, and z axes\n // find the vector with the largest x element, make that vector\n // the first vector\n\n\n maxVal = Math.abs(v_3x3[0]);\n maxI = 0;\n\n for (i = 1; i < 3; i++) {\n if (maxVal < (tmp = Math.abs(v_3x3[i * 3]))) {\n maxVal = tmp;\n maxI = i;\n }\n } // swap eigenvalue and eigenvector\n\n\n if (maxI !== 0) {\n var eigenValTmp = w_3[maxI];\n w_3[maxI] = w_3[0];\n w_3[0] = eigenValTmp;\n swapRowsMatrix_nxn(v_3x3, 3, maxI, 0);\n } // do the same for the y element\n\n\n if (Math.abs(v_3x3[4]) < Math.abs(v_3x3[7])) {\n var _eigenValTmp = w_3[2];\n w_3[2] = w_3[1];\n w_3[1] = _eigenValTmp;\n swapRowsMatrix_nxn(v_3x3, 3, 1, 2);\n } // ensure that the sign of the eigenvectors is correct\n\n\n for (i = 0; i < 2; i++) {\n if (v_3x3[i * 3 + i] < 0) {\n v_3x3[i * 3] = -v_3x3[i * 3];\n v_3x3[i * 3 + 1] = -v_3x3[i * 3 + 1];\n v_3x3[i * 3 + 2] = -v_3x3[i * 3 + 2];\n }\n } // set sign of final eigenvector to ensure that determinant is positive\n\n\n if (determinant3x3(v_3x3) < 0) {\n v_3x3[6] = -v_3x3[6];\n v_3x3[7] = -v_3x3[7];\n v_3x3[8] = -v_3x3[8];\n } // transpose the eigenvectors back again\n\n\n transpose3x3(v_3x3, v_3x3);\n}\nfunction singularValueDecomposition3x3(a_3x3, u_3x3, w_3, vT_3x3) {\n var i; // copy so that A can be used for U or VT without risk\n\n var B = _toConsumableArray(a_3x3); // temporarily flip if determinant is negative\n\n\n var d = determinant3x3(B);\n\n if (d < 0) {\n for (i = 0; i < 9; i++) {\n B[i] = -B[i];\n }\n } // orthogonalize, diagonalize, etc.\n\n\n orthogonalize3x3(B, u_3x3);\n transpose3x3(B, B);\n multiply3x3_mat3(B, u_3x3, vT_3x3);\n diagonalize3x3(vT_3x3, w_3, vT_3x3);\n multiply3x3_mat3(u_3x3, vT_3x3, u_3x3);\n transpose3x3(vT_3x3, vT_3x3); // re-create the flip\n\n if (d < 0) {\n w_3[0] = -w_3[0];\n w_3[1] = -w_3[1];\n w_3[2] = -w_3[2];\n }\n}\n/**\n * Factor linear equations Ax = b using LU decomposition A = LU. Output factorization LU is in matrix A.\n * @param {Matrix} A square matrix\n * @param {Number} index integer array of pivot indices index[0->n-1]\n * @param {Number} size matrix size\n */\n\nfunction luFactorLinearSystem(A, index, size) {\n var i;\n var j;\n var k;\n var largest;\n var maxI = 0;\n var sum;\n var temp1;\n var temp2;\n var scale = createArray(size); //\n // Loop over rows to get implicit scaling information\n //\n\n for (i = 0; i < size; i++) {\n for (largest = 0.0, j = 0; j < size; j++) {\n if ((temp2 = Math.abs(A[i * size + j])) > largest) {\n largest = temp2;\n }\n }\n\n if (largest === 0.0) {\n vtkWarningMacro('Unable to factor linear system');\n return 0;\n }\n\n scale[i] = 1.0 / largest;\n } //\n // Loop over all columns using Crout's method\n //\n\n\n for (j = 0; j < size; j++) {\n for (i = 0; i < j; i++) {\n sum = A[i * size + j];\n\n for (k = 0; k < i; k++) {\n sum -= A[i * size + k] * A[k * size + j];\n }\n\n A[i * size + j] = sum;\n } //\n // Begin search for largest pivot element\n //\n\n\n for (largest = 0.0, i = j; i < size; i++) {\n sum = A[i * size + j];\n\n for (k = 0; k < j; k++) {\n sum -= A[i * size + k] * A[k * size + j];\n }\n\n A[i * size + j] = sum;\n\n if ((temp1 = scale[i] * Math.abs(sum)) >= largest) {\n largest = temp1;\n maxI = i;\n }\n } //\n // Check for row interchange\n //\n\n\n if (j !== maxI) {\n for (k = 0; k < size; k++) {\n temp1 = A[maxI * size + k];\n A[maxI * size + k] = A[j * size + k];\n A[j * size + k] = temp1;\n }\n\n scale[maxI] = scale[j];\n } //\n // Divide by pivot element and perform elimination\n //\n\n\n index[j] = maxI;\n\n if (Math.abs(A[j * size + j]) <= VTK_SMALL_NUMBER) {\n vtkWarningMacro('Unable to factor linear system');\n return 0;\n }\n\n if (j !== size - 1) {\n temp1 = 1.0 / A[j * size + j];\n\n for (i = j + 1; i < size; i++) {\n A[i * size + j] *= temp1;\n }\n }\n }\n\n return 1;\n}\nfunction luSolveLinearSystem(A, index, x, size) {\n var i;\n var j;\n var ii;\n var idx;\n var sum; //\n // Proceed with forward and backsubstitution for L and U\n // matrices. First, forward substitution.\n //\n\n for (ii = -1, i = 0; i < size; i++) {\n idx = index[i];\n sum = x[idx];\n x[idx] = x[i];\n\n if (ii >= 0) {\n for (j = ii; j <= i - 1; j++) {\n sum -= A[i * size + j] * x[j];\n }\n } else if (sum !== 0.0) {\n ii = i;\n }\n\n x[i] = sum;\n } //\n // Now, back substitution\n //\n\n\n for (i = size - 1; i >= 0; i--) {\n sum = x[i];\n\n for (j = i + 1; j < size; j++) {\n sum -= A[i * size + j] * x[j];\n }\n\n x[i] = sum / A[i * size + i];\n }\n}\nfunction solveLinearSystem(A, x, size) {\n // if we solving something simple, just solve it\n if (size === 2) {\n var y = createArray(2);\n var det = determinant2x2(A[0], A[1], A[2], A[3]);\n\n if (det === 0.0) {\n // Unable to solve linear system\n return 0;\n }\n\n y[0] = (A[3] * x[0] - A[1] * x[1]) / det;\n y[1] = (-(A[2] * x[0]) + A[0] * x[1]) / det;\n x[0] = y[0];\n x[1] = y[1];\n return 1;\n }\n\n if (size === 1) {\n if (A[0] === 0.0) {\n // Unable to solve linear system\n return 0;\n }\n\n x[0] /= A[0];\n return 1;\n } //\n // System of equations is not trivial, use Crout's method\n //\n // Check on allocation of working vectors\n\n\n var index = createArray(size); // Factor and solve matrix\n\n if (luFactorLinearSystem(A, index, size) === 0) {\n return 0;\n }\n\n luSolveLinearSystem(A, index, x, size);\n return 1;\n} // Note that A is modified during the inversion !\n\nfunction invertMatrix(A, AI, size) {\n var index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var column = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n var tmp1Size = index || createArray(size);\n var tmp2Size = column || createArray(size); // Factor matrix; then begin solving for inverse one column at a time.\n // Note: tmp1Size returned value is used later, tmp2Size is just working\n // memory whose values are not used in LUSolveLinearSystem\n\n if (luFactorLinearSystem(A, tmp1Size, size) === 0) {\n return null;\n }\n\n for (var j = 0; j < size; j++) {\n for (var i = 0; i < size; i++) {\n tmp2Size[i] = 0.0;\n }\n\n tmp2Size[j] = 1.0;\n luSolveLinearSystem(A, tmp1Size, tmp2Size, size);\n\n for (var _i4 = 0; _i4 < size; _i4++) {\n AI[_i4 * size + j] = tmp2Size[_i4];\n }\n }\n\n return AI;\n}\nfunction estimateMatrixCondition(A, size) {\n var minValue = +Number.MAX_VALUE;\n var maxValue = -Number.MAX_VALUE; // find the maximum value\n\n for (var i = 0; i < size; i++) {\n for (var j = i; j < size; j++) {\n if (Math.abs(A[i * size + j]) > maxValue) {\n maxValue = Math.abs(A[i * size + j]);\n }\n }\n } // find the minimum diagonal value\n\n\n for (var _i5 = 0; _i5 < size; _i5++) {\n if (Math.abs(A[_i5 * size + _i5]) < minValue) {\n minValue = Math.abs(A[_i5 * size + _i5]);\n }\n }\n\n if (minValue === 0.0) {\n return Number.MAX_VALUE;\n }\n\n return maxValue / minValue;\n}\nfunction jacobi(a_3x3, w, v) {\n return jacobiN(a_3x3, 3, w, v);\n}\nfunction solveHomogeneousLeastSquares(numberOfSamples, xt, xOrder, mt) {\n // check dimensional consistency\n if (numberOfSamples < xOrder) {\n vtkWarningMacro('Insufficient number of samples. Underdetermined.');\n return 0;\n }\n\n var i;\n var j;\n var k; // set up intermediate variables\n // Allocate matrix to hold X times transpose of X\n\n var XXt = createArray(xOrder * xOrder); // size x by x\n // Allocate the array of eigenvalues and eigenvectors\n\n var eigenvals = createArray(xOrder);\n var eigenvecs = createArray(xOrder * xOrder); // Calculate XXt upper half only, due to symmetry\n\n for (k = 0; k < numberOfSamples; k++) {\n for (i = 0; i < xOrder; i++) {\n for (j = i; j < xOrder; j++) {\n XXt[i * xOrder + j] += xt[k * xOrder + i] * xt[k * xOrder + j];\n }\n }\n } // now fill in the lower half of the XXt matrix\n\n\n for (i = 0; i < xOrder; i++) {\n for (j = 0; j < i; j++) {\n XXt[i * xOrder + j] = XXt[j * xOrder + i];\n }\n } // Compute the eigenvectors and eigenvalues\n\n\n jacobiN(XXt, xOrder, eigenvals, eigenvecs); // Smallest eigenval is at the end of the list (xOrder-1), and solution is\n // corresponding eigenvec.\n\n for (i = 0; i < xOrder; i++) {\n mt[i] = eigenvecs[i * xOrder + xOrder - 1];\n }\n\n return 1;\n}\nfunction solveLeastSquares(numberOfSamples, xt, xOrder, yt, yOrder, mt) {\n var checkHomogeneous = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n\n // check dimensional consistency\n if (numberOfSamples < xOrder || numberOfSamples < yOrder) {\n vtkWarningMacro('Insufficient number of samples. Underdetermined.');\n return 0;\n }\n\n var homogenFlags = createArray(yOrder);\n var allHomogeneous = 1;\n var hmt;\n var homogRC = 0;\n var i;\n var j;\n var k;\n var someHomogeneous = 0; // Ok, first init some flags check and see if all the systems are homogeneous\n\n if (checkHomogeneous) {\n // If Y' is zero, it's a homogeneous system and can't be solved via\n // the pseudoinverse method. Detect this case, warn the user, and\n // invoke SolveHomogeneousLeastSquares instead. Note that it doesn't\n // really make much sense for yOrder to be greater than one in this case,\n // since that's just yOrder occurrences of a 0 vector on the RHS, but\n // we allow it anyway. N\n // Initialize homogeneous flags on a per-right-hand-side basis\n for (j = 0; j < yOrder; j++) {\n homogenFlags[j] = 1;\n }\n\n for (i = 0; i < numberOfSamples; i++) {\n for (j = 0; j < yOrder; j++) {\n if (Math.abs(yt[i * yOrder + j]) > VTK_SMALL_NUMBER) {\n allHomogeneous = 0;\n homogenFlags[j] = 0;\n }\n }\n } // If we've got one system, and it's homogeneous, do it and bail out quickly.\n\n\n if (allHomogeneous && yOrder === 1) {\n vtkWarningMacro('Detected homogeneous system (Y=0), calling SolveHomogeneousLeastSquares()');\n return solveHomogeneousLeastSquares(numberOfSamples, xt, xOrder, mt);\n } // Ok, we've got more than one system of equations.\n // Figure out if we need to calculate the homogeneous equation solution for\n // any of them.\n\n\n if (allHomogeneous) {\n someHomogeneous = 1;\n } else {\n for (j = 0; j < yOrder; j++) {\n if (homogenFlags[j]) {\n someHomogeneous = 1;\n }\n }\n }\n } // If necessary, solve the homogeneous problem\n\n\n if (someHomogeneous) {\n // hmt is the homogeneous equation version of mt, the general solution.\n // hmt should be xOrder x yOrder, but since we are solving only the homogeneous part, here it is xOrder x 1\n hmt = createArray(xOrder); // Ok, solve the homogeneous problem\n\n homogRC = solveHomogeneousLeastSquares(numberOfSamples, xt, xOrder, hmt);\n } // set up intermediate variables\n\n\n var XXt = createArray(xOrder * xOrder); // size x by x\n\n var XXtI = createArray(xOrder * xOrder); // size x by x\n\n var XYt = createArray(xOrder * yOrder); // size x by y\n // first find the pseudoinverse matrix\n\n for (k = 0; k < numberOfSamples; k++) {\n for (i = 0; i < xOrder; i++) {\n // first calculate the XXt matrix, only do the upper half (symmetrical)\n for (j = i; j < xOrder; j++) {\n XXt[i * xOrder + j] += xt[k * xOrder + i] * xt[k * xOrder + j];\n } // now calculate the XYt matrix\n\n\n for (j = 0; j < yOrder; j++) {\n XYt[i * yOrder + j] += xt[k * xOrder + i] * yt[k * yOrder + j];\n }\n }\n } // now fill in the lower half of the XXt matrix\n\n\n for (i = 0; i < xOrder; i++) {\n for (j = 0; j < i; j++) {\n XXt[i * xOrder + j] = XXt[j * xOrder + i];\n }\n }\n\n var successFlag = invertMatrix(XXt, XXtI, xOrder); // next get the inverse of XXt\n\n if (successFlag) {\n for (i = 0; i < xOrder; i++) {\n for (j = 0; j < yOrder; j++) {\n mt[i * yOrder + j] = 0.0;\n\n for (k = 0; k < xOrder; k++) {\n mt[i * yOrder + j] += XXtI[i * xOrder + k] * XYt[k * yOrder + j];\n }\n }\n }\n } // Fix up any of the solutions that correspond to the homogeneous equation\n // problem.\n\n\n if (someHomogeneous) {\n for (j = 0; j < yOrder; j++) {\n if (homogenFlags[j]) {\n // Fix this one\n for (i = 0; i < xOrder; i++) {\n mt[i * yOrder + j] = hmt[i * yOrder];\n }\n }\n }\n }\n\n if (someHomogeneous) {\n return homogRC && successFlag;\n }\n\n return successFlag;\n}\nfunction hex2float(hexStr) {\n var outFloatArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0.5, 1];\n\n switch (hexStr.length) {\n case 3:\n // abc => #aabbcc\n outFloatArray[0] = parseInt(hexStr[0], 16) * 17 / 255;\n outFloatArray[1] = parseInt(hexStr[1], 16) * 17 / 255;\n outFloatArray[2] = parseInt(hexStr[2], 16) * 17 / 255;\n return outFloatArray;\n\n case 4:\n // #abc => #aabbcc\n outFloatArray[0] = parseInt(hexStr[1], 16) * 17 / 255;\n outFloatArray[1] = parseInt(hexStr[2], 16) * 17 / 255;\n outFloatArray[2] = parseInt(hexStr[3], 16) * 17 / 255;\n return outFloatArray;\n\n case 6:\n // ab01df => #ab01df\n outFloatArray[0] = parseInt(hexStr.substr(0, 2), 16) / 255;\n outFloatArray[1] = parseInt(hexStr.substr(2, 2), 16) / 255;\n outFloatArray[2] = parseInt(hexStr.substr(4, 2), 16) / 255;\n return outFloatArray;\n\n case 7:\n // #ab01df\n outFloatArray[0] = parseInt(hexStr.substr(1, 2), 16) / 255;\n outFloatArray[1] = parseInt(hexStr.substr(3, 2), 16) / 255;\n outFloatArray[2] = parseInt(hexStr.substr(5, 2), 16) / 255;\n return outFloatArray;\n\n case 9:\n // #ab01df00\n outFloatArray[0] = parseInt(hexStr.substr(1, 2), 16) / 255;\n outFloatArray[1] = parseInt(hexStr.substr(3, 2), 16) / 255;\n outFloatArray[2] = parseInt(hexStr.substr(5, 2), 16) / 255;\n outFloatArray[3] = parseInt(hexStr.substr(7, 2), 16) / 255;\n return outFloatArray;\n\n default:\n return outFloatArray;\n }\n}\nfunction rgb2hsv(rgb, hsv) {\n var h;\n var s;\n\n var _rgb = _slicedToArray(rgb, 3),\n r = _rgb[0],\n g = _rgb[1],\n b = _rgb[2];\n\n var onethird = 1.0 / 3.0;\n var onesixth = 1.0 / 6.0;\n var twothird = 2.0 / 3.0;\n var cmax = r;\n var cmin = r;\n\n if (g > cmax) {\n cmax = g;\n } else if (g < cmin) {\n cmin = g;\n }\n\n if (b > cmax) {\n cmax = b;\n } else if (b < cmin) {\n cmin = b;\n }\n\n var v = cmax;\n\n if (v > 0.0) {\n s = (cmax - cmin) / cmax;\n } else {\n s = 0.0;\n }\n\n if (s > 0) {\n if (r === cmax) {\n h = onesixth * (g - b) / (cmax - cmin);\n } else if (g === cmax) {\n h = onethird + onesixth * (b - r) / (cmax - cmin);\n } else {\n h = twothird + onesixth * (r - g) / (cmax - cmin);\n }\n\n if (h < 0.0) {\n h += 1.0;\n }\n } else {\n h = 0.0;\n } // Set the values back to the array\n\n\n hsv[0] = h;\n hsv[1] = s;\n hsv[2] = v;\n}\nfunction hsv2rgb(hsv, rgb) {\n var _hsv = _slicedToArray(hsv, 3),\n h = _hsv[0],\n s = _hsv[1],\n v = _hsv[2];\n\n var onethird = 1.0 / 3.0;\n var onesixth = 1.0 / 6.0;\n var twothird = 2.0 / 3.0;\n var fivesixth = 5.0 / 6.0;\n var r;\n var g;\n var b; // compute RGB from HSV\n\n if (h > onesixth && h <= onethird) {\n // green/red\n g = 1.0;\n r = (onethird - h) / onesixth;\n b = 0.0;\n } else if (h > onethird && h <= 0.5) {\n // green/blue\n g = 1.0;\n b = (h - onethird) / onesixth;\n r = 0.0;\n } else if (h > 0.5 && h <= twothird) {\n // blue/green\n b = 1.0;\n g = (twothird - h) / onesixth;\n r = 0.0;\n } else if (h > twothird && h <= fivesixth) {\n // blue/red\n b = 1.0;\n r = (h - twothird) / onesixth;\n g = 0.0;\n } else if (h > fivesixth && h <= 1.0) {\n // red/blue\n r = 1.0;\n b = (1.0 - h) / onesixth;\n g = 0.0;\n } else {\n // red/green\n r = 1.0;\n g = h / onesixth;\n b = 0.0;\n } // add Saturation to the equation.\n\n\n r = s * r + (1.0 - s);\n g = s * g + (1.0 - s);\n b = s * b + (1.0 - s);\n r *= v;\n g *= v;\n b *= v; // Assign back to the array\n\n rgb[0] = r;\n rgb[1] = g;\n rgb[2] = b;\n}\nfunction lab2xyz(lab, xyz) {\n // LAB to XYZ\n var _lab = _slicedToArray(lab, 3),\n L = _lab[0],\n a = _lab[1],\n b = _lab[2];\n\n var var_Y = (L + 16) / 116;\n var var_X = a / 500 + var_Y;\n var var_Z = var_Y - b / 200;\n\n if (Math.pow(var_Y, 3) > 0.008856) {\n var_Y = Math.pow(var_Y, 3);\n } else {\n var_Y = (var_Y - 16.0 / 116.0) / 7.787;\n }\n\n if (Math.pow(var_X, 3) > 0.008856) {\n var_X = Math.pow(var_X, 3);\n } else {\n var_X = (var_X - 16.0 / 116.0) / 7.787;\n }\n\n if (Math.pow(var_Z, 3) > 0.008856) {\n var_Z = Math.pow(var_Z, 3);\n } else {\n var_Z = (var_Z - 16.0 / 116.0) / 7.787;\n }\n\n var ref_X = 0.9505;\n var ref_Y = 1.0;\n var ref_Z = 1.089;\n xyz[0] = ref_X * var_X; // ref_X = 0.9505 Observer= 2 deg Illuminant= D65\n\n xyz[1] = ref_Y * var_Y; // ref_Y = 1.000\n\n xyz[2] = ref_Z * var_Z; // ref_Z = 1.089\n}\nfunction xyz2lab(xyz, lab) {\n var _xyz = _slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var ref_X = 0.9505;\n var ref_Y = 1.0;\n var ref_Z = 1.089;\n var var_X = x / ref_X; // ref_X = 0.9505 Observer= 2 deg, Illuminant= D65\n\n var var_Y = y / ref_Y; // ref_Y = 1.000\n\n var var_Z = z / ref_Z; // ref_Z = 1.089\n\n if (var_X > 0.008856) var_X = Math.pow(var_X, 1.0 / 3.0);else var_X = 7.787 * var_X + 16.0 / 116.0;\n if (var_Y > 0.008856) var_Y = Math.pow(var_Y, 1.0 / 3.0);else var_Y = 7.787 * var_Y + 16.0 / 116.0;\n if (var_Z > 0.008856) var_Z = Math.pow(var_Z, 1.0 / 3.0);else var_Z = 7.787 * var_Z + 16.0 / 116.0;\n lab[0] = 116 * var_Y - 16;\n lab[1] = 500 * (var_X - var_Y);\n lab[2] = 200 * (var_Y - var_Z);\n}\nfunction xyz2rgb(xyz, rgb) {\n var _xyz2 = _slicedToArray(xyz, 3),\n x = _xyz2[0],\n y = _xyz2[1],\n z = _xyz2[2];\n\n var r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n var g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n var b = x * 0.0557 + y * -0.204 + z * 1.057; // The following performs a \"gamma correction\" specified by the sRGB color\n // space. sRGB is defined by a canonical definition of a display monitor and\n // has been standardized by the International Electrotechnical Commission (IEC\n // 61966-2-1). The nonlinearity of the correction is designed to make the\n // colors more perceptually uniform. This color space has been adopted by\n // several applications including Adobe Photoshop and Microsoft Windows color\n // management. OpenGL is agnostic on its RGB color space, but it is reasonable\n // to assume it is close to this one.\n\n if (r > 0.0031308) r = 1.055 * Math.pow(r, 1 / 2.4) - 0.055;else r *= 12.92;\n if (g > 0.0031308) g = 1.055 * Math.pow(g, 1 / 2.4) - 0.055;else g *= 12.92;\n if (b > 0.0031308) b = 1.055 * Math.pow(b, 1 / 2.4) - 0.055;else b *= 12.92; // Clip colors. ideally we would do something that is perceptually closest\n // (since we can see colors outside of the display gamut), but this seems to\n // work well enough.\n\n var maxVal = r;\n if (maxVal < g) maxVal = g;\n if (maxVal < b) maxVal = b;\n\n if (maxVal > 1.0) {\n r /= maxVal;\n g /= maxVal;\n b /= maxVal;\n }\n\n if (r < 0) r = 0;\n if (g < 0) g = 0;\n if (b < 0) b = 0; // Push values back to array\n\n rgb[0] = r;\n rgb[1] = g;\n rgb[2] = b;\n}\nfunction rgb2xyz(rgb, xyz) {\n var _rgb2 = _slicedToArray(rgb, 3),\n r = _rgb2[0],\n g = _rgb2[1],\n b = _rgb2[2]; // The following performs a \"gamma correction\" specified by the sRGB color\n // space. sRGB is defined by a canonical definition of a display monitor and\n // has been standardized by the International Electrotechnical Commission (IEC\n // 61966-2-1). The nonlinearity of the correction is designed to make the\n // colors more perceptually uniform. This color space has been adopted by\n // several applications including Adobe Photoshop and Microsoft Windows color\n // management. OpenGL is agnostic on its RGB color space, but it is reasonable\n // to assume it is close to this one.\n\n\n if (r > 0.04045) r = Math.pow((r + 0.055) / 1.055, 2.4);else r /= 12.92;\n if (g > 0.04045) g = Math.pow((g + 0.055) / 1.055, 2.4);else g /= 12.92;\n if (b > 0.04045) b = Math.pow((b + 0.055) / 1.055, 2.4);else b /= 12.92; // Observer. = 2 deg, Illuminant = D65\n\n xyz[0] = r * 0.4124 + g * 0.3576 + b * 0.1805;\n xyz[1] = r * 0.2126 + g * 0.7152 + b * 0.0722;\n xyz[2] = r * 0.0193 + g * 0.1192 + b * 0.9505;\n}\nfunction rgb2lab(rgb, lab) {\n var xyz = [0, 0, 0];\n rgb2xyz(rgb, xyz);\n xyz2lab(xyz, lab);\n}\nfunction lab2rgb(lab, rgb) {\n var xyz = [0, 0, 0];\n lab2xyz(lab, xyz);\n xyz2rgb(xyz, rgb);\n}\nfunction uninitializeBounds(bounds) {\n bounds[0] = 1.0;\n bounds[1] = -1.0;\n bounds[2] = 1.0;\n bounds[3] = -1.0;\n bounds[4] = 1.0;\n bounds[5] = -1.0;\n return bounds;\n}\nfunction areBoundsInitialized(bounds) {\n return !(bounds[1] - bounds[0] < 0.0);\n}\n/**\n * @deprecated please use vtkBoundingBox.addPoints(vtkBoundingBox.reset([]), points)\n */\n\nfunction computeBoundsFromPoints(point1, point2, bounds) {\n bounds[0] = Math.min(point1[0], point2[0]);\n bounds[1] = Math.max(point1[0], point2[0]);\n bounds[2] = Math.min(point1[1], point2[1]);\n bounds[3] = Math.max(point1[1], point2[1]);\n bounds[4] = Math.min(point1[2], point2[2]);\n bounds[5] = Math.max(point1[2], point2[2]);\n return bounds;\n}\nfunction clampValue(value, minValue, maxValue) {\n if (value < minValue) {\n return minValue;\n }\n\n if (value > maxValue) {\n return maxValue;\n }\n\n return value;\n}\nfunction clampVector(vector, minVector, maxVector) {\n var out = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [0, 0, 0];\n out[0] = clampValue(vector[0], minVector[0], maxVector[0]);\n out[1] = clampValue(vector[1], minVector[1], maxVector[1]);\n out[2] = clampValue(vector[2], minVector[2], maxVector[2]);\n return out;\n}\nfunction clampAndNormalizeValue(value, range) {\n var result = 0;\n\n if (range[0] !== range[1]) {\n // clamp\n if (value < range[0]) {\n result = range[0];\n } else if (value > range[1]) {\n result = range[1];\n } else {\n result = value;\n } // normalize\n\n\n result = (result - range[0]) / (range[1] - range[0]);\n }\n\n return result;\n}\nvar getScalarTypeFittingRange = notImplemented('GetScalarTypeFittingRange');\nvar getAdjustedScalarRange = notImplemented('GetAdjustedScalarRange');\nfunction extentIsWithinOtherExtent(extent1, extent2) {\n if (!extent1 || !extent2) {\n return 0;\n }\n\n for (var i = 0; i < 6; i += 2) {\n if (extent1[i] < extent2[i] || extent1[i] > extent2[i + 1] || extent1[i + 1] < extent2[i] || extent1[i + 1] > extent2[i + 1]) {\n return 0;\n }\n }\n\n return 1;\n}\nfunction boundsIsWithinOtherBounds(bounds1_6, bounds2_6, delta_3) {\n if (!bounds1_6 || !bounds2_6) {\n return 0;\n }\n\n for (var i = 0; i < 6; i += 2) {\n if (bounds1_6[i] + delta_3[i / 2] < bounds2_6[i] || bounds1_6[i] - delta_3[i / 2] > bounds2_6[i + 1] || bounds1_6[i + 1] + delta_3[i / 2] < bounds2_6[i] || bounds1_6[i + 1] - delta_3[i / 2] > bounds2_6[i + 1]) {\n return 0;\n }\n }\n\n return 1;\n}\nfunction pointIsWithinBounds(point_3, bounds_6, delta_3) {\n if (!point_3 || !bounds_6 || !delta_3) {\n return 0;\n }\n\n for (var i = 0; i < 3; i++) {\n if (point_3[i] + delta_3[i] < bounds_6[2 * i] || point_3[i] - delta_3[i] > bounds_6[2 * i + 1]) {\n return 0;\n }\n }\n\n return 1;\n}\nfunction solve3PointCircle(p1, p2, p3, center) {\n var v21 = createArray(3);\n var v32 = createArray(3);\n var v13 = createArray(3);\n var v12 = createArray(3);\n var v23 = createArray(3);\n var v31 = createArray(3);\n\n for (var i = 0; i < 3; ++i) {\n v21[i] = p1[i] - p2[i];\n v32[i] = p2[i] - p3[i];\n v13[i] = p3[i] - p1[i];\n v12[i] = -v21[i];\n v23[i] = -v32[i];\n v31[i] = -v13[i];\n }\n\n var norm12 = norm(v12);\n var norm23 = norm(v23);\n var norm13 = norm(v13);\n var crossv21v32 = createArray(3);\n cross(v21, v32, crossv21v32);\n var normCross = norm(crossv21v32);\n var radius = norm12 * norm23 * norm13 / (2 * normCross);\n var normCross22 = 2 * normCross * normCross;\n var alpha = norm23 * norm23 * dot(v21, v31) / normCross22;\n var beta = norm13 * norm13 * dot(v12, v32) / normCross22;\n var gamma = norm12 * norm12 * dot(v13, v23) / normCross22;\n\n for (var _i6 = 0; _i6 < 3; ++_i6) {\n center[_i6] = alpha * p1[_i6] + beta * p2[_i6] + gamma * p3[_i6];\n }\n\n return radius;\n}\nvar inf = Infinity;\nvar negInf = -Infinity;\nvar isInf = function isInf(value) {\n return !Number.isFinite(value);\n};\nvar isFinite = Number.isFinite,\n isNaN = Number.isNaN;\nvar isNan = isNaN; // JavaScript - add-on ----------------------\n\nfunction createUninitializedBounds() {\n return [].concat([Number.MAX_VALUE, -Number.MAX_VALUE, // X\n Number.MAX_VALUE, -Number.MAX_VALUE, // Y\n Number.MAX_VALUE, -Number.MAX_VALUE // Z\n ]);\n}\nfunction getMajorAxisIndex(vector) {\n var maxValue = -1;\n var axisIndex = -1;\n\n for (var i = 0; i < vector.length; i++) {\n var value = Math.abs(vector[i]);\n\n if (value > maxValue) {\n axisIndex = i;\n maxValue = value;\n }\n }\n\n return axisIndex;\n}\nfunction floatToHex2(value) {\n var integer = Math.floor(value * 255);\n\n if (integer > 15) {\n return integer.toString(16);\n }\n\n return \"0\".concat(integer.toString(16));\n}\nfunction floatRGB2HexCode(rgbArray) {\n var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '#';\n return \"\".concat(prefix).concat(rgbArray.map(floatToHex2).join(''));\n}\n\nfunction floatToChar(f) {\n return Math.round(f * 255);\n}\n\nfunction float2CssRGBA(rgbArray) {\n if (rgbArray.length === 3) {\n return \"rgb(\".concat(rgbArray.map(floatToChar).join(', '), \")\");\n }\n\n return \"rgba(\".concat(floatToChar(rgbArray[0] || 0), \", \").concat(floatToChar(rgbArray[1] || 0), \", \").concat(floatToChar(rgbArray[2] || 0), \", \").concat(rgbArray[3] || 0, \")\");\n} // ----------------------------------------------------------------------------\n// Only Static API\n// ----------------------------------------------------------------------------\n\nvar vtkMath = {\n Pi: Pi,\n radiansFromDegrees: radiansFromDegrees,\n degreesFromRadians: degreesFromRadians,\n round: round,\n floor: floor,\n ceil: ceil,\n ceilLog2: ceilLog2,\n min: min,\n max: max,\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n arrayRange: arrayRange,\n isPowerOfTwo: isPowerOfTwo,\n nearestPowerOfTwo: nearestPowerOfTwo,\n factorial: factorial,\n binomial: binomial,\n beginCombination: beginCombination,\n nextCombination: nextCombination,\n randomSeed: randomSeed,\n getSeed: getSeed,\n random: random,\n gaussian: gaussian,\n add: add,\n subtract: subtract,\n multiplyScalar: multiplyScalar,\n multiplyScalar2D: multiplyScalar2D,\n multiplyAccumulate: multiplyAccumulate,\n multiplyAccumulate2D: multiplyAccumulate2D,\n dot: dot,\n outer: outer,\n cross: cross,\n norm: norm,\n normalize: normalize,\n perpendiculars: perpendiculars,\n projectVector: projectVector,\n projectVector2D: projectVector2D,\n distance2BetweenPoints: distance2BetweenPoints,\n angleBetweenVectors: angleBetweenVectors,\n gaussianAmplitude: gaussianAmplitude,\n gaussianWeight: gaussianWeight,\n dot2D: dot2D,\n outer2D: outer2D,\n norm2D: norm2D,\n normalize2D: normalize2D,\n determinant2x2: determinant2x2,\n LUFactor3x3: LUFactor3x3,\n LUSolve3x3: LUSolve3x3,\n linearSolve3x3: linearSolve3x3,\n multiply3x3_vect3: multiply3x3_vect3,\n multiply3x3_mat3: multiply3x3_mat3,\n multiplyMatrix: multiplyMatrix,\n transpose3x3: transpose3x3,\n invert3x3: invert3x3,\n identity3x3: identity3x3,\n identity: identity,\n isIdentity: isIdentity,\n isIdentity3x3: isIdentity3x3,\n determinant3x3: determinant3x3,\n quaternionToMatrix3x3: quaternionToMatrix3x3,\n areEquals: areEquals,\n areMatricesEqual: areMatricesEqual,\n roundNumber: roundNumber,\n roundVector: roundVector,\n matrix3x3ToQuaternion: matrix3x3ToQuaternion,\n multiplyQuaternion: multiplyQuaternion,\n orthogonalize3x3: orthogonalize3x3,\n diagonalize3x3: diagonalize3x3,\n singularValueDecomposition3x3: singularValueDecomposition3x3,\n solveLinearSystem: solveLinearSystem,\n invertMatrix: invertMatrix,\n luFactorLinearSystem: luFactorLinearSystem,\n luSolveLinearSystem: luSolveLinearSystem,\n estimateMatrixCondition: estimateMatrixCondition,\n jacobi: jacobi,\n jacobiN: jacobiN,\n solveHomogeneousLeastSquares: solveHomogeneousLeastSquares,\n solveLeastSquares: solveLeastSquares,\n hex2float: hex2float,\n rgb2hsv: rgb2hsv,\n hsv2rgb: hsv2rgb,\n lab2xyz: lab2xyz,\n xyz2lab: xyz2lab,\n xyz2rgb: xyz2rgb,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n lab2rgb: lab2rgb,\n uninitializeBounds: uninitializeBounds,\n areBoundsInitialized: areBoundsInitialized,\n computeBoundsFromPoints: computeBoundsFromPoints,\n clampValue: clampValue,\n clampVector: clampVector,\n clampAndNormalizeValue: clampAndNormalizeValue,\n getScalarTypeFittingRange: getScalarTypeFittingRange,\n getAdjustedScalarRange: getAdjustedScalarRange,\n extentIsWithinOtherExtent: extentIsWithinOtherExtent,\n boundsIsWithinOtherBounds: boundsIsWithinOtherBounds,\n pointIsWithinBounds: pointIsWithinBounds,\n solve3PointCircle: solve3PointCircle,\n inf: inf,\n negInf: negInf,\n isInf: isInf,\n isNan: isNaN,\n isNaN: isNaN,\n isFinite: isFinite,\n // JS add-on\n createUninitializedBounds: createUninitializedBounds,\n getMajorAxisIndex: getMajorAxisIndex,\n floatToHex2: floatToHex2,\n floatRGB2HexCode: floatRGB2HexCode,\n float2CssRGBA: float2CssRGBA\n};\n\nvar vtkMath$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n createArray: createArray,\n Pi: Pi,\n radiansFromDegrees: radiansFromDegrees,\n degreesFromRadians: degreesFromRadians,\n round: round,\n floor: floor,\n ceil: ceil,\n min: min,\n max: max,\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n arrayRange: arrayRange,\n ceilLog2: ceilLog2,\n factorial: factorial,\n nearestPowerOfTwo: nearestPowerOfTwo,\n isPowerOfTwo: isPowerOfTwo,\n binomial: binomial,\n beginCombination: beginCombination,\n nextCombination: nextCombination,\n randomSeed: randomSeed,\n getSeed: getSeed,\n random: random,\n gaussian: gaussian,\n add: add,\n subtract: subtract,\n multiplyScalar: multiplyScalar,\n multiplyScalar2D: multiplyScalar2D,\n multiplyAccumulate: multiplyAccumulate,\n multiplyAccumulate2D: multiplyAccumulate2D,\n dot: dot,\n outer: outer,\n cross: cross,\n norm: norm,\n normalize: normalize,\n perpendiculars: perpendiculars,\n projectVector: projectVector,\n dot2D: dot2D,\n projectVector2D: projectVector2D,\n distance2BetweenPoints: distance2BetweenPoints,\n angleBetweenVectors: angleBetweenVectors,\n signedAngleBetweenVectors: signedAngleBetweenVectors,\n gaussianAmplitude: gaussianAmplitude,\n gaussianWeight: gaussianWeight,\n outer2D: outer2D,\n norm2D: norm2D,\n normalize2D: normalize2D,\n rowsToMat4: rowsToMat4,\n columnsToMat4: columnsToMat4,\n rowsToMat3: rowsToMat3,\n columnsToMat3: columnsToMat3,\n determinant2x2: determinant2x2,\n LUFactor3x3: LUFactor3x3,\n LUSolve3x3: LUSolve3x3,\n linearSolve3x3: linearSolve3x3,\n multiply3x3_vect3: multiply3x3_vect3,\n multiply3x3_mat3: multiply3x3_mat3,\n multiplyMatrix: multiplyMatrix,\n transpose3x3: transpose3x3,\n invert3x3: invert3x3,\n determinant3x3: determinant3x3,\n areEquals: areEquals,\n areMatricesEqual: areMatricesEqual,\n identity3x3: identity3x3,\n identity: identity,\n isIdentity: isIdentity,\n isIdentity3x3: isIdentity3x3,\n quaternionToMatrix3x3: quaternionToMatrix3x3,\n roundNumber: roundNumber,\n roundVector: roundVector,\n jacobiN: jacobiN,\n matrix3x3ToQuaternion: matrix3x3ToQuaternion,\n multiplyQuaternion: multiplyQuaternion,\n orthogonalize3x3: orthogonalize3x3,\n diagonalize3x3: diagonalize3x3,\n singularValueDecomposition3x3: singularValueDecomposition3x3,\n luFactorLinearSystem: luFactorLinearSystem,\n luSolveLinearSystem: luSolveLinearSystem,\n solveLinearSystem: solveLinearSystem,\n invertMatrix: invertMatrix,\n estimateMatrixCondition: estimateMatrixCondition,\n jacobi: jacobi,\n solveHomogeneousLeastSquares: solveHomogeneousLeastSquares,\n solveLeastSquares: solveLeastSquares,\n hex2float: hex2float,\n rgb2hsv: rgb2hsv,\n hsv2rgb: hsv2rgb,\n lab2xyz: lab2xyz,\n xyz2lab: xyz2lab,\n xyz2rgb: xyz2rgb,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n lab2rgb: lab2rgb,\n uninitializeBounds: uninitializeBounds,\n areBoundsInitialized: areBoundsInitialized,\n computeBoundsFromPoints: computeBoundsFromPoints,\n clampValue: clampValue,\n clampVector: clampVector,\n clampAndNormalizeValue: clampAndNormalizeValue,\n getScalarTypeFittingRange: getScalarTypeFittingRange,\n getAdjustedScalarRange: getAdjustedScalarRange,\n extentIsWithinOtherExtent: extentIsWithinOtherExtent,\n boundsIsWithinOtherBounds: boundsIsWithinOtherBounds,\n pointIsWithinBounds: pointIsWithinBounds,\n solve3PointCircle: solve3PointCircle,\n inf: inf,\n negInf: negInf,\n isInf: isInf,\n isFinite: isFinite,\n isNaN: isNaN,\n isNan: isNan,\n createUninitializedBounds: createUninitializedBounds,\n getMajorAxisIndex: getMajorAxisIndex,\n floatToHex2: floatToHex2,\n floatRGB2HexCode: floatRGB2HexCode,\n float2CssRGBA: float2CssRGBA,\n 'default': vtkMath\n});\n\nexport { factorial as $, degreesFromRadians as A, areEquals as B, clampValue as C, arrayRange as D, getMajorAxisIndex as E, isInf as F, rgb2hsv as G, rgb2lab as H, lab2rgb as I, floor as J, round as K, normalize2D as L, nearestPowerOfTwo as M, createUninitializedBounds as N, multiply3x3_vect3 as O, areBoundsInitialized as P, isPowerOfTwo as Q, angleBetweenVectors as R, signedAngleBetweenVectors as S, createArray as T, Pi as U, ceil as V, min as W, max as X, arrayMin as Y, arrayMax as Z, ceilLog2 as _, areMatricesEqual as a, binomial as a0, beginCombination as a1, nextCombination as a2, randomSeed as a3, getSeed as a4, gaussian as a5, multiplyScalar2D as a6, multiplyAccumulate2D as a7, outer as a8, projectVector as a9, singularValueDecomposition3x3 as aA, luFactorLinearSystem as aB, luSolveLinearSystem as aC, invertMatrix as aD, estimateMatrixCondition as aE, solveHomogeneousLeastSquares as aF, solveLeastSquares as aG, hex2float as aH, lab2xyz as aI, xyz2lab as aJ, xyz2rgb as aK, rgb2xyz as aL, computeBoundsFromPoints as aM, clampAndNormalizeValue as aN, getScalarTypeFittingRange as aO, getAdjustedScalarRange as aP, extentIsWithinOtherExtent as aQ, boundsIsWithinOtherBounds as aR, pointIsWithinBounds as aS, solve3PointCircle as aT, inf as aU, negInf as aV, isFinite as aW, isNaN as aX, floatToHex2 as aY, floatRGB2HexCode as aZ, float2CssRGBA as a_, dot2D as aa, projectVector2D as ab, gaussianAmplitude as ac, gaussianWeight as ad, outer2D as ae, norm2D as af, rowsToMat4 as ag, columnsToMat4 as ah, columnsToMat3 as ai, LUFactor3x3 as aj, LUSolve3x3 as ak, linearSolve3x3 as al, multiply3x3_mat3 as am, multiplyMatrix as an, transpose3x3 as ao, invert3x3 as ap, identity3x3 as aq, identity as ar, isIdentity as as, isIdentity3x3 as at, quaternionToMatrix3x3 as au, roundNumber as av, matrix3x3ToQuaternion as aw, multiplyQuaternion as ax, orthogonalize3x3 as ay, diagonalize3x3 as az, roundVector as b, clampVector as c, dot as d, distance2BetweenPoints as e, vtkMath as f, solveLinearSystem as g, hsv2rgb as h, isNan as i, cross as j, add as k, normalize as l, multiplyAccumulate as m, norm as n, determinant2x2 as o, jacobiN as p, perpendiculars as q, radiansFromDegrees as r, subtract as s, jacobi as t, uninitializeBounds as u, vtkMath$1 as v, multiplyScalar as w, random as x, determinant3x3 as y, rowsToMat3 as z };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport { vec3, mat4, glMatrix } from 'gl-matrix';\nimport { a as areMatricesEqual } from './Math/index.js';\nimport { IDENTITY } from './Math/Constants.js';\n\nvar NoOp = function NoOp(v) {\n return v;\n};\n\nvar EPSILON = 1e-6;\n\nvar Transform = /*#__PURE__*/function () {\n function Transform() {\n var useDegree = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Transform);\n\n this.matrix = mat4.identity(new Float64Array(16));\n this.tmp = new Float64Array(3);\n this.angleConv = useDegree ? glMatrix.toRadian : NoOp;\n }\n\n _createClass(Transform, [{\n key: \"rotateFromDirections\",\n value: function rotateFromDirections(originDirection, targetDirection) {\n var src = new Float64Array(3);\n var dst = new Float64Array(3);\n var transf = new Float64Array(16);\n vec3.set(src, originDirection[0], originDirection[1], originDirection[2]);\n vec3.set(dst, targetDirection[0], targetDirection[1], targetDirection[2]);\n vec3.normalize(src, src);\n vec3.normalize(dst, dst);\n var cosAlpha = vec3.dot(src, dst);\n\n if (cosAlpha >= 1) {\n return this;\n }\n\n vec3.cross(this.tmp, src, dst);\n\n if (vec3.length(this.tmp) < EPSILON) {\n // cross product is 0, so pick arbitrary axis perpendicular\n // to originDirection.\n vec3.cross(this.tmp, [1, 0, 0], originDirection);\n\n if (vec3.length(this.tmp) < EPSILON) {\n vec3.cross(this.tmp, [0, 1, 0], originDirection);\n }\n }\n\n mat4.fromRotation(transf, Math.acos(cosAlpha), this.tmp);\n mat4.multiply(this.matrix, this.matrix, transf);\n return this;\n }\n }, {\n key: \"rotate\",\n value: function rotate(angle, axis) {\n vec3.set.apply(vec3, [this.tmp].concat(_toConsumableArray(axis)));\n vec3.normalize(this.tmp, this.tmp);\n mat4.rotate(this.matrix, this.matrix, this.angleConv(angle), this.tmp);\n return this;\n }\n }, {\n key: \"rotateX\",\n value: function rotateX(angle) {\n mat4.rotateX(this.matrix, this.matrix, this.angleConv(angle));\n return this;\n }\n }, {\n key: \"rotateY\",\n value: function rotateY(angle) {\n mat4.rotateY(this.matrix, this.matrix, this.angleConv(angle));\n return this;\n }\n }, {\n key: \"rotateZ\",\n value: function rotateZ(angle) {\n mat4.rotateZ(this.matrix, this.matrix, this.angleConv(angle));\n return this;\n }\n }, {\n key: \"translate\",\n value: function translate(x, y, z) {\n vec3.set(this.tmp, x, y, z);\n mat4.translate(this.matrix, this.matrix, this.tmp);\n return this;\n }\n }, {\n key: \"scale\",\n value: function scale(sx, sy, sz) {\n vec3.set(this.tmp, sx, sy, sz);\n mat4.scale(this.matrix, this.matrix, this.tmp);\n return this;\n }\n }, {\n key: \"multiply\",\n value: function multiply(mat4x4) {\n mat4.multiply(this.matrix, this.matrix, mat4x4);\n return this;\n }\n }, {\n key: \"multiply3x3\",\n value: function multiply3x3(mat3x3) {\n mat4.multiply(this.matrix, this.matrix, [mat3x3[0], mat3x3[1], mat3x3[2], 0, mat3x3[3], mat3x3[4], mat3x3[5], 0, mat3x3[6], mat3x3[7], mat3x3[8], 0, 0, 0, 0, 1]);\n return this;\n }\n }, {\n key: \"invert\",\n value: function invert() {\n mat4.invert(this.matrix, this.matrix);\n return this;\n }\n }, {\n key: \"identity\",\n value: function identity() {\n mat4.identity(this.matrix);\n return this;\n } //-----------\n\n }, {\n key: \"apply\",\n value: function apply(typedArray) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var nbIterations = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n\n if (areMatricesEqual(IDENTITY, this.matrix)) {\n // Make sure we can chain apply...\n return this;\n }\n\n var size = nbIterations === -1 ? typedArray.length : offset + nbIterations * 3;\n\n for (var i = offset; i < size; i += 3) {\n vec3.set(this.tmp, typedArray[i], typedArray[i + 1], typedArray[i + 2]);\n vec3.transformMat4(this.tmp, this.tmp, this.matrix);\n typedArray[i] = this.tmp[0];\n typedArray[i + 1] = this.tmp[1];\n typedArray[i + 2] = this.tmp[2];\n } // Make sure we can chain apply...\n\n\n return this;\n }\n }, {\n key: \"getMatrix\",\n value: function getMatrix() {\n return this.matrix;\n }\n }, {\n key: \"setMatrix\",\n value: function setMatrix(mat4x4) {\n if (!!mat4x4 && mat4x4.length === 16) {\n mat4.copy(this.matrix, mat4x4);\n }\n\n return this;\n }\n }]);\n\n return Transform;\n}();\n\nfunction buildFromDegree() {\n return new Transform(true);\n}\n\nfunction buildFromRadian() {\n return new Transform(false);\n}\n\nvar vtkMatrixBuilder = {\n buildFromDegree: buildFromDegree,\n buildFromRadian: buildFromRadian\n};\n\nexport { vtkMatrixBuilder as default };\n","import macro from '../../macros.js';\nimport vtkDataArray from './DataArray.js';\nimport { VtkDataTypes } from './DataArray/Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar INVALID_BOUNDS = [1, -1, 1, -1, 1, -1]; // ----------------------------------------------------------------------------\n// vtkPoints methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPoints(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPoints'); // Forwarding methods\n\n publicAPI.getNumberOfPoints = publicAPI.getNumberOfTuples;\n\n publicAPI.setNumberOfPoints = function (nbPoints) {\n var dimension = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n\n if (publicAPI.getNumberOfPoints() !== nbPoints) {\n model.size = nbPoints * dimension;\n model.values = macro.newTypedArray(model.dataType, model.size);\n publicAPI.setNumberOfComponents(dimension);\n publicAPI.modified();\n }\n };\n\n publicAPI.setPoint = function (idx) {\n for (var _len = arguments.length, xyz = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n xyz[_key - 1] = arguments[_key];\n }\n\n publicAPI.setTuple(idx, xyz);\n };\n\n publicAPI.getPoint = publicAPI.getTuple;\n\n publicAPI.insertNextPoint = function (x, y, z) {\n return publicAPI.insertNextTuple([x, y, z]);\n };\n\n publicAPI.getBounds = function () {\n if (publicAPI.getNumberOfComponents() === 3) {\n var _xRange = publicAPI.getRange(0);\n\n model.bounds[0] = _xRange[0];\n model.bounds[1] = _xRange[1];\n\n var _yRange = publicAPI.getRange(1);\n\n model.bounds[2] = _yRange[0];\n model.bounds[3] = _yRange[1];\n var zRange = publicAPI.getRange(2);\n model.bounds[4] = zRange[0];\n model.bounds[5] = zRange[1];\n return model.bounds;\n }\n\n if (publicAPI.getNumberOfComponents() !== 2) {\n vtkErrorMacro(\"getBounds called on an array with components of\\n \".concat(publicAPI.getNumberOfComponents()));\n return INVALID_BOUNDS;\n }\n\n var xRange = publicAPI.getRange(0);\n model.bounds[0] = xRange[0];\n model.bounds[1] = xRange[1];\n var yRange = publicAPI.getRange(1);\n model.bounds[2] = yRange[0];\n model.bounds[3] = yRange[1];\n model.bounds[4] = 0;\n model.bounds[5] = 0;\n return model.bounds;\n }; // Trigger the computation of bounds\n\n\n publicAPI.computeBounds = publicAPI.getBounds; // Initialize\n\n publicAPI.setNumberOfComponents(model.numberOfComponents < 2 ? 3 : model.numberOfComponents);\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n empty: true,\n numberOfComponents: 3,\n dataType: VtkDataTypes.FLOAT,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkDataArray.extend(publicAPI, model, initialValues);\n vtkPoints(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPoints'); // ----------------------------------------------------------------------------\n\nvar vtkPoints$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkPoints$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkDataArray from './DataArray.js';\nimport vtkScalarsToColors$2 from './ScalarsToColors/Constants.js';\nimport Constants from '../../Rendering/Core/Mapper/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nvar ScalarMappingTarget = vtkScalarsToColors$2.ScalarMappingTarget,\n VectorMode = vtkScalarsToColors$2.VectorMode;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes;\nvar ColorMode = Constants.ColorMode;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// Add module-level functions or api that you want to expose statically via\n// the next section...\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nfunction intColorToUChar(c) {\n return c;\n}\n\nfunction floatColorToUChar(c) {\n return Math.floor(c * 255.0 + 0.5);\n} // ----------------------------------------------------------------------------\n// vtkScalarsToColors methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkScalarsToColors(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkScalarsToColors');\n\n publicAPI.setVectorModeToMagnitude = function () {\n return publicAPI.setVectorMode(VectorMode.MAGNITUDE);\n };\n\n publicAPI.setVectorModeToComponent = function () {\n return publicAPI.setVectorMode(VectorMode.COMPONENT);\n };\n\n publicAPI.setVectorModeToRGBColors = function () {\n return publicAPI.setVectorMode(VectorMode.RGBCOLORS);\n };\n\n publicAPI.build = function () {};\n\n publicAPI.isOpaque = function () {\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setAnnotations = function (values, annotations) {\n if (values && !annotations || !values && annotations) {\n return;\n }\n\n if (values && annotations && values.length !== annotations.length) {\n vtkErrorMacro('Values and annotations do not have the same number of tuples so ignoring');\n return;\n }\n\n model.annotationArray = [];\n\n if (annotations && values) {\n var num = annotations.length;\n\n for (var i = 0; i < num; i++) {\n model.annotationArray.push({\n value: values[i],\n annotation: String(annotations[i])\n });\n }\n }\n\n publicAPI.updateAnnotatedValueMap();\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setAnnotation = function (value, annotation) {\n var i = publicAPI.checkForAnnotatedValue(value);\n var modified = false;\n\n if (i >= 0) {\n if (model.annotationArray[i].annotation !== annotation) {\n model.annotationArray[i].annotation = annotation;\n modified = true;\n }\n } else {\n model.annotationArray.push({\n value: value,\n annotation: annotation\n });\n i = model.annotationArray.length - 1;\n modified = true;\n }\n\n if (modified) {\n publicAPI.updateAnnotatedValueMap();\n publicAPI.modified();\n }\n\n return i;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getNumberOfAnnotatedValues = function () {\n return model.annotationArray.length;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotatedValue = function (idx) {\n if (idx < 0 || idx >= model.annotationArray.length) {\n return null;\n }\n\n return model.annotationArray[idx].value;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotation = function (idx) {\n if (model.annotationArray[idx] === undefined) {\n return null;\n }\n\n return model.annotationArray[idx].annotation;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotatedValueIndex = function (val) {\n return model.annotationArray.length ? publicAPI.checkForAnnotatedValue(val) : -1;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.removeAnnotation = function (value) {\n var i = publicAPI.checkForAnnotatedValue(value);\n var needToRemove = i >= 0;\n\n if (needToRemove) {\n model.annotationArray.splice(i, 1);\n publicAPI.updateAnnotatedValueMap();\n publicAPI.modified();\n }\n\n return needToRemove;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.resetAnnotations = function () {\n model.annotationArray = [];\n model.annotatedValueMap = [];\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotationColor = function (val, rgba) {\n if (model.indexedLookup) {\n var i = publicAPI.getAnnotatedValueIndex(val);\n publicAPI.getIndexedColor(i, rgba);\n } else {\n publicAPI.getColor(parseFloat(val), rgba);\n rgba[3] = 1.0;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.checkForAnnotatedValue = function (value) {\n return publicAPI.getAnnotatedValueIndexInternal(value);\n }; //----------------------------------------------------------------------------\n // An unsafe version of vtkScalarsToColors::CheckForAnnotatedValue for\n // internal use (no pointer checks performed)\n\n\n publicAPI.getAnnotatedValueIndexInternal = function (value) {\n if (model.annotatedValueMap[value] !== undefined) {\n var na = model.annotationArray.length;\n return model.annotatedValueMap[value] % na;\n } // Treat as a NaN\n\n\n return -1;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getIndexedColor = function (val, rgba) {\n rgba[0] = 0.0;\n rgba[1] = 0.0;\n rgba[2] = 0.0;\n rgba[3] = 0.0;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.updateAnnotatedValueMap = function () {\n model.annotatedValueMap = [];\n var na = model.annotationArray.length;\n\n for (var i = 0; i < na; i++) {\n model.annotatedValueMap[model.annotationArray[i].value] = i;\n }\n }; // Description:\n // Internal methods that map a data array into a 4-component,\n // unsigned char RGBA array. The color mode determines the behavior\n // of mapping. If ColorMode.DEFAULT is set, then unsigned char\n // data arrays are treated as colors (and converted to RGBA if\n // necessary); If ColorMode.DIRECT_SCALARS is set, then all arrays\n // are treated as colors (integer types are clamped in the range 0-255,\n // floating point arrays are clamped in the range 0.0-1.0. Note 'char' does\n // not have enough values to represent a color so mapping this type is\n // considered an error);\n // otherwise, the data is mapped through this instance\n // of ScalarsToColors. The component argument is used for data\n // arrays with more than one component; it indicates which component\n // to use to do the blending. When the component argument is -1,\n // then the this object uses its own selected technique to change a\n // vector into a scalar to map.\n\n\n publicAPI.mapScalars = function (scalars, colorMode, componentIn) {\n var numberOfComponents = scalars.getNumberOfComponents();\n var newColors = null; // map scalars through lookup table only if needed\n\n if (colorMode === ColorMode.DEFAULT && scalars.getDataType() === VtkDataTypes.UNSIGNED_CHAR || colorMode === ColorMode.DIRECT_SCALARS && scalars) {\n newColors = publicAPI.convertToRGBA(scalars, numberOfComponents, scalars.getNumberOfTuples());\n } else {\n var newscalars = {\n type: 'vtkDataArray',\n name: 'temp',\n numberOfComponents: 4,\n dataType: VtkDataTypes.UNSIGNED_CHAR\n };\n var s = macro.newTypedArray(newscalars.dataType, 4 * scalars.getNumberOfTuples());\n newscalars.values = s;\n newscalars.size = s.length;\n newColors = vtkDataArray.newInstance(newscalars);\n var component = componentIn; // If mapper did not specify a component, use the VectorMode\n\n if (component < 0 && numberOfComponents > 1) {\n publicAPI.mapVectorsThroughTable(scalars, newColors, ScalarMappingTarget.RGBA, -1, -1);\n } else {\n if (component < 0) {\n component = 0;\n }\n\n if (component >= numberOfComponents) {\n component = numberOfComponents - 1;\n } // Map the scalars to colors\n\n\n publicAPI.mapScalarsThroughTable(scalars, newColors, ScalarMappingTarget.RGBA, component);\n }\n }\n\n return newColors;\n };\n\n publicAPI.mapVectorsToMagnitude = function (input, output, compsToUse) {\n var length = input.getNumberOfTuples();\n var inIncr = input.getNumberOfComponents();\n var outputV = output.getData();\n var inputV = input.getData();\n\n for (var i = 0; i < length; i++) {\n var sum = 0.0;\n\n for (var j = 0; j < compsToUse; j++) {\n sum += inputV[i * inIncr + j] * inputV[i * inIncr + j];\n }\n\n outputV[i] = Math.sqrt(sum);\n }\n }; //----------------------------------------------------------------------------\n // Map a set of vector values through the table\n\n\n publicAPI.mapVectorsThroughTable = function (input, output, outputFormat, vectorComponentIn, vectorSizeIn) {\n var vectorMode = publicAPI.getVectorMode();\n var vectorSize = vectorSizeIn;\n var vectorComponent = vectorComponentIn;\n var inComponents = input.getNumberOfComponents();\n\n if (vectorMode === VectorMode.COMPONENT) {\n // make sure vectorComponent is within allowed range\n if (vectorComponent === -1) {\n // if set to -1, use default value provided by table\n vectorComponent = publicAPI.getVectorComponent();\n }\n\n if (vectorComponent < 0) {\n vectorComponent = 0;\n }\n\n if (vectorComponent >= inComponents) {\n vectorComponent = inComponents - 1;\n }\n } else {\n // make sure vectorSize is within allowed range\n if (vectorSize === -1) {\n // if set to -1, use default value provided by table\n vectorSize = publicAPI.getVectorSize();\n }\n\n if (vectorSize <= 0) {\n vectorComponent = 0;\n vectorSize = inComponents;\n } else {\n if (vectorComponent < 0) {\n vectorComponent = 0;\n }\n\n if (vectorComponent >= inComponents) {\n vectorComponent = inComponents - 1;\n }\n\n if (vectorComponent + vectorSize > inComponents) {\n vectorSize = inComponents - vectorComponent;\n }\n }\n\n if (vectorMode === VectorMode.MAGNITUDE && (inComponents === 1 || vectorSize === 1)) {\n vectorMode = VectorMode.COMPONENT;\n }\n } // increment input pointer to the first component to map\n\n\n var inputOffset = 0;\n\n if (vectorComponent > 0) {\n inputOffset = vectorComponent;\n } // map according to the current vector mode\n\n\n switch (vectorMode) {\n case VectorMode.COMPONENT:\n {\n publicAPI.mapScalarsThroughTable(input, output, outputFormat, inputOffset);\n break;\n }\n\n case VectorMode.RGBCOLORS:\n {\n // publicAPI.mapColorsToColors(\n // input, output, inComponents, vectorSize,\n // outputFormat);\n break;\n }\n // MAGNITUDE is considered default\n\n case VectorMode.MAGNITUDE:\n default:\n {\n var magValues = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: new Float32Array(input.getNumberOfTuples())\n });\n publicAPI.mapVectorsToMagnitude(input, magValues, vectorSize);\n publicAPI.mapScalarsThroughTable(magValues, output, outputFormat, 0);\n break;\n }\n }\n };\n\n publicAPI.luminanceToRGBA = function (newColors, colors, alpha, convtFun) {\n var a = convtFun(alpha);\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 1;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n var l = convtFun(values[i]);\n newValues[count * 4] = l;\n newValues[count * 4 + 1] = l;\n newValues[count * 4 + 2] = l;\n newValues[count * 4 + 3] = a;\n count++;\n }\n };\n\n publicAPI.luminanceAlphaToRGBA = function (newColors, colors, alpha, convtFun) {\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 2;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n var l = convtFun(values[i]);\n newValues[count] = l;\n newValues[count + 1] = l;\n newValues[count + 2] = l;\n newValues[count + 3] = convtFun(values[i + 1]) * alpha;\n count += 4;\n }\n };\n\n publicAPI.rGBToRGBA = function (newColors, colors, alpha, convtFun) {\n var a = floatColorToUChar(alpha);\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 3;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n newValues[count * 4] = convtFun(values[i]);\n newValues[count * 4 + 1] = convtFun(values[i + 1]);\n newValues[count * 4 + 2] = convtFun(values[i + 2]);\n newValues[count * 4 + 3] = a;\n count++;\n }\n };\n\n publicAPI.rGBAToRGBA = function (newColors, colors, alpha, convtFun) {\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 4;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n newValues[count * 4] = convtFun(values[i]);\n newValues[count * 4 + 1] = convtFun(values[i + 1]);\n newValues[count * 4 + 2] = convtFun(values[i + 2]);\n newValues[count * 4 + 3] = convtFun(values[i + 3]) * alpha;\n count++;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.convertToRGBA = function (colors, numComp, numTuples) {\n var alpha = model.alpha;\n\n if (numComp === 4 && alpha >= 1.0 && colors.getDataType() === VtkDataTypes.UNSIGNED_CHAR) {\n return colors;\n }\n\n var newColors = vtkDataArray.newInstance({\n numberOfComponents: 4,\n empty: true,\n size: 4 * numTuples,\n dataType: VtkDataTypes.UNSIGNED_CHAR\n });\n\n if (numTuples <= 0) {\n return newColors;\n }\n\n alpha = alpha > 0 ? alpha : 0;\n alpha = alpha < 1 ? alpha : 1;\n var convtFun = intColorToUChar;\n\n if (colors.getDataType() === VtkDataTypes.FLOAT || colors.getDataType() === VtkDataTypes.DOUBLE) {\n convtFun = floatColorToUChar;\n }\n\n switch (numComp) {\n case 1:\n publicAPI.luminanceToRGBA(newColors, colors, alpha, convtFun);\n break;\n\n case 2:\n publicAPI.luminanceAlphaToRGBA(newColors, colors, convtFun);\n break;\n\n case 3:\n publicAPI.rGBToRGBA(newColors, colors, alpha, convtFun);\n break;\n\n case 4:\n publicAPI.rGBAToRGBA(newColors, colors, alpha, convtFun);\n break;\n\n default:\n vtkErrorMacro('Cannot convert colors');\n return null;\n }\n\n return newColors;\n };\n\n publicAPI.usingLogScale = function () {\n return false;\n };\n\n publicAPI.getNumberOfAvailableColors = function () {\n return 256 * 256 * 256;\n };\n\n publicAPI.setRange = function (min, max) {\n return publicAPI.setMappingRange(min, max);\n };\n\n publicAPI.getRange = function () {\n return publicAPI.getMappingRange();\n };\n\n publicAPI.areScalarsOpaque = function (scalars, colorMode, componentIn) {\n if (!scalars) {\n return publicAPI.isOpaque();\n }\n\n var numberOfComponents = scalars.getNumberOfComponents(); // map scalars through lookup table only if needed\n\n if (colorMode === ColorMode.DEFAULT && scalars.getDataType() === VtkDataTypes.UNSIGNED_CHAR || colorMode === ColorMode.DIRECT_SCALARS) {\n // we will be using the scalars directly, so look at the number of\n // components and the range\n if (numberOfComponents === 3 || numberOfComponents === 1) {\n return model.alpha >= 1.0;\n } // otherwise look at the range of the alpha channel\n\n\n var range = scalars.getRange(numberOfComponents - 1);\n return range[0] === 255;\n }\n\n return true;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n alpha: 1.0,\n vectorComponent: 0,\n vectorSize: -1,\n vectorMode: VectorMode.COMPONENT,\n mappingRange: null,\n annotationArray: null,\n annotatedValueMap: null,\n indexedLookup: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.mappingRange = [0, 255];\n model.annotationArray = [];\n model.annotatedValueMap = []; // Create get-set macros\n\n macro.setGet(publicAPI, model, ['vectorSize', 'vectorComponent', 'vectorMode', 'alpha', 'indexedLookup']); // Create set macros for array (needs to know size)\n\n macro.setArray(publicAPI, model, ['mappingRange'], 2); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['mappingRange']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkScalarsToColors(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkScalarsToColors'); // ----------------------------------------------------------------------------\n\nvar vtkScalarsToColors$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, vtkScalarsToColors$2);\n\nexport { vtkScalarsToColors$1 as default, extend, newInstance };\n","var VectorMode = {\n MAGNITUDE: 0,\n COMPONENT: 1,\n RGBCOLORS: 2\n};\nvar ScalarMappingTarget = {\n LUMINANCE: 1,\n LUMINANCE_ALPHA: 2,\n RGB: 3,\n RGBA: 4\n};\nvar vtkScalarsToColors = {\n VectorMode: VectorMode,\n ScalarMappingTarget: ScalarMappingTarget\n};\n\nexport { ScalarMappingTarget, VectorMode, vtkScalarsToColors as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport { d as dot } from '../Core/Math/index.js';\nimport { vec3 } from 'gl-matrix';\nimport vtkPlane from './Plane.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar INIT_BOUNDS = [Number.MAX_VALUE, -Number.MAX_VALUE, // X\nNumber.MAX_VALUE, -Number.MAX_VALUE, // Y\nNumber.MAX_VALUE, -Number.MAX_VALUE // Z\n]; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction _equals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n}\n\nfunction _isValid(bounds) {\n return bounds[0] <= bounds[1] && bounds[2] <= bounds[3] && bounds[4] <= bounds[5];\n}\n\nfunction _setBounds(bounds, otherBounds) {\n bounds[0] = otherBounds[0];\n bounds[1] = otherBounds[1];\n bounds[2] = otherBounds[2];\n bounds[3] = otherBounds[3];\n bounds[4] = otherBounds[4];\n bounds[5] = otherBounds[5];\n return bounds;\n}\n\nfunction _reset(bounds) {\n return _setBounds(bounds, INIT_BOUNDS);\n}\n\nfunction _addPoint(bounds, x, y, z) {\n var _bounds = _slicedToArray(bounds, 6),\n xMin = _bounds[0],\n xMax = _bounds[1],\n yMin = _bounds[2],\n yMax = _bounds[3],\n zMin = _bounds[4],\n zMax = _bounds[5];\n\n bounds[0] = xMin < x ? xMin : x;\n bounds[1] = xMax > x ? xMax : x;\n bounds[2] = yMin < y ? yMin : y;\n bounds[3] = yMax > y ? yMax : y;\n bounds[4] = zMin < z ? zMin : z;\n bounds[5] = zMax > z ? zMax : z;\n return bounds;\n}\n\nfunction _addPoints(bounds, points) {\n if (points.length === 0) {\n return bounds;\n }\n\n if (Array.isArray(points[0])) {\n for (var i = 0; i < points.length; ++i) {\n _addPoint.apply(void 0, [bounds].concat(_toConsumableArray(points[i])));\n }\n } else {\n for (var _i = 0; _i < points.length; _i += 3) {\n _addPoint.apply(void 0, [bounds].concat(_toConsumableArray(points.slice(_i, _i + 3))));\n }\n }\n\n return bounds;\n}\n\nfunction _addBounds(bounds, xMin, xMax, yMin, yMax, zMin, zMax) {\n var _bounds2 = _slicedToArray(bounds, 6),\n _xMin = _bounds2[0],\n _xMax = _bounds2[1],\n _yMin = _bounds2[2],\n _yMax = _bounds2[3],\n _zMin = _bounds2[4],\n _zMax = _bounds2[5];\n\n if (zMax === undefined) {\n bounds[0] = Math.min(xMin[0], _xMin);\n bounds[1] = Math.max(xMin[1], _xMax);\n bounds[2] = Math.min(xMin[2], _yMin);\n bounds[3] = Math.max(xMin[3], _yMax);\n bounds[4] = Math.min(xMin[4], _zMin);\n bounds[5] = Math.max(xMin[5], _zMax);\n } else {\n bounds[0] = Math.min(xMin, _xMin);\n bounds[1] = Math.max(xMax, _xMax);\n bounds[2] = Math.min(yMin, _yMin);\n bounds[3] = Math.max(yMax, _yMax);\n bounds[4] = Math.min(zMin, _zMin);\n bounds[5] = Math.max(zMax, _zMax);\n }\n\n return bounds;\n}\n\nfunction _setMinPoint(bounds, x, y, z) {\n var _bounds3 = _slicedToArray(bounds, 6),\n xMin = _bounds3[0],\n xMax = _bounds3[1],\n yMin = _bounds3[2],\n yMax = _bounds3[3],\n zMin = _bounds3[4],\n zMax = _bounds3[5];\n\n bounds[0] = x;\n bounds[1] = x > xMax ? x : xMax;\n bounds[2] = y;\n bounds[3] = y > yMax ? y : yMax;\n bounds[4] = z;\n bounds[5] = z > zMax ? z : zMax;\n return xMin !== x || yMin !== y || zMin !== z;\n}\n\nfunction _setMaxPoint(bounds, x, y, z) {\n var _bounds4 = _slicedToArray(bounds, 6),\n xMin = _bounds4[0],\n xMax = _bounds4[1],\n yMin = _bounds4[2],\n yMax = _bounds4[3],\n zMin = _bounds4[4],\n zMax = _bounds4[5];\n\n bounds[0] = x < xMin ? x : xMin;\n bounds[1] = x;\n bounds[2] = y < yMin ? y : yMin;\n bounds[3] = y;\n bounds[4] = z < zMin ? z : zMin;\n bounds[5] = z;\n return xMax !== x || yMax !== y || zMax !== z;\n}\n\nfunction _inflate(bounds, delta) {\n bounds[0] -= delta;\n bounds[1] += delta;\n bounds[2] -= delta;\n bounds[3] += delta;\n bounds[4] -= delta;\n bounds[5] += delta;\n return bounds;\n}\n\nfunction _scale(bounds, sx, sy, sz) {\n if (!_isValid(bounds)) {\n return false;\n }\n\n if (sx >= 0.0) {\n bounds[0] *= sx;\n bounds[1] *= sx;\n } else {\n bounds[0] = sx * bounds[1];\n bounds[1] = sx * bounds[0];\n }\n\n if (sy >= 0.0) {\n bounds[2] *= sy;\n bounds[3] *= sy;\n } else {\n bounds[2] = sy * bounds[3];\n bounds[3] = sy * bounds[2];\n }\n\n if (sz >= 0.0) {\n bounds[4] *= sz;\n bounds[5] *= sz;\n } else {\n bounds[4] = sz * bounds[5];\n bounds[5] = sz * bounds[4];\n }\n\n return true;\n}\n\nfunction _getCenter(bounds) {\n return [0.5 * (bounds[0] + bounds[1]), 0.5 * (bounds[2] + bounds[3]), 0.5 * (bounds[4] + bounds[5])];\n}\nfunction scaleAboutCenter(bounds, sx, sy, sz) {\n if (!_isValid(bounds)) {\n return false;\n }\n\n var center = _getCenter(bounds);\n\n bounds[0] -= center[0];\n bounds[1] -= center[0];\n bounds[2] -= center[1];\n bounds[3] -= center[1];\n bounds[4] -= center[2];\n bounds[5] -= center[2];\n\n _scale(bounds, sx, sy, sz);\n\n bounds[0] += center[0];\n bounds[1] += center[0];\n bounds[2] += center[1];\n bounds[3] += center[1];\n bounds[4] += center[2];\n bounds[5] += center[2];\n return true;\n}\n\nfunction _getLength(bounds, index) {\n return bounds[index * 2 + 1] - bounds[index * 2];\n}\n\nfunction _getLengths(bounds) {\n return [_getLength(bounds, 0), _getLength(bounds, 1), _getLength(bounds, 2)];\n}\n\nfunction _getXRange(bounds) {\n return bounds.slice(0, 2);\n}\n\nfunction _getYRange(bounds) {\n return bounds.slice(2, 4);\n}\n\nfunction _getZRange(bounds) {\n return bounds.slice(4, 6);\n}\n\nfunction _getMaxLength(bounds) {\n var l = _getLengths(bounds);\n\n if (l[0] > l[1]) {\n if (l[0] > l[2]) {\n return l[0];\n }\n\n return l[2];\n }\n\n if (l[1] > l[2]) {\n return l[1];\n }\n\n return l[2];\n}\n\nfunction _getDiagonalLength(bounds) {\n if (_isValid(bounds)) {\n var l = _getLengths(bounds);\n\n return Math.sqrt(l[0] * l[0] + l[1] * l[1] + l[2] * l[2]);\n }\n\n return null;\n}\n\nfunction _getMinPoint(bounds) {\n return [bounds[0], bounds[2], bounds[4]];\n}\n\nfunction _getMaxPoint(bounds) {\n return [bounds[1], bounds[3], bounds[5]];\n}\n\nfunction oppositeSign(a, b) {\n return a <= 0 && b >= 0 || a >= 0 && b <= 0;\n}\n\nfunction _getCorners(bounds, corners) {\n var count = 0;\n\n for (var ix = 0; ix < 2; ix++) {\n for (var iy = 2; iy < 4; iy++) {\n for (var iz = 4; iz < 6; iz++) {\n corners[count] = [bounds[ix], bounds[iy], bounds[iz]];\n count++;\n }\n }\n }\n\n return corners;\n} // Computes the two corners with minimal and miximal coordinates\n\nfunction _computeCornerPoints(bounds, point1, point2) {\n point1[0] = bounds[0];\n point1[1] = bounds[2];\n point1[2] = bounds[4];\n point2[0] = bounds[1];\n point2[1] = bounds[3];\n point2[2] = bounds[5];\n return point1;\n}\n\nfunction _transformBounds(bounds, transform) {\n var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n if (out.length < 6) {\n _reset(out);\n }\n\n var corners = _getCorners(bounds, []);\n\n for (var i = 0; i < corners.length; ++i) {\n vec3.transformMat4(corners[i], corners[i], transform);\n }\n\n return _addPoints(out, corners);\n}\n\nfunction _computeScale(bounds) {\n var scale3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n scale3[0] = 0.5 * (bounds[1] - bounds[0]);\n scale3[1] = 0.5 * (bounds[3] - bounds[2]);\n scale3[2] = 0.5 * (bounds[5] - bounds[4]);\n return scale3;\n}\n\nfunction _computeLocalBounds(points, u, v, w) {\n var bounds = [].concat(INIT_BOUNDS);\n var pointsData = points.getData();\n\n for (var i = 0; i < pointsData.length; i += 3) {\n var point = [pointsData[i], pointsData[i + 1], pointsData[i + 2]];\n var du = dot(point, u);\n bounds[0] = Math.min(du, bounds[0]);\n bounds[1] = Math.max(du, bounds[1]);\n var dv = dot(point, v);\n bounds[2] = Math.min(dv, bounds[2]);\n bounds[3] = Math.max(dv, bounds[3]);\n var dw = dot(point, w);\n bounds[4] = Math.min(dw, bounds[4]);\n bounds[5] = Math.max(dw, bounds[5]);\n }\n\n return bounds;\n} // The method returns a non-zero value if the bounding box is hit.\n\nfunction _intersectBox(bounds, origin, dir, coord, tolerance) {\n var inside = true;\n var quadrant = [];\n var whichPlane = 0;\n var maxT = [];\n var candidatePlane = [0.0, 0.0, 0.0];\n var RIGHT = 0;\n var LEFT = 1;\n var MIDDLE = 2; // First find closest planes\n\n for (var i = 0; i < 3; i++) {\n if (origin[i] < bounds[2 * i]) {\n quadrant[i] = LEFT;\n candidatePlane[i] = bounds[2 * i];\n inside = false;\n } else if (origin[i] > bounds[2 * i + 1]) {\n quadrant[i] = RIGHT;\n candidatePlane[i] = bounds[2 * i + 1];\n inside = false;\n } else {\n quadrant[i] = MIDDLE;\n }\n } // Check whether origin of ray is inside bbox\n\n\n if (inside) {\n coord[0] = origin[0];\n coord[1] = origin[1];\n coord[2] = origin[2];\n tolerance[0] = 0;\n return 1;\n } // Calculate parametric distance to plane\n\n\n for (var _i2 = 0; _i2 < 3; _i2++) {\n if (quadrant[_i2] !== MIDDLE && dir[_i2] !== 0.0) {\n maxT[_i2] = (candidatePlane[_i2] - origin[_i2]) / dir[_i2];\n } else {\n maxT[_i2] = -1.0;\n }\n } // Find the largest parametric value of intersection\n\n\n for (var _i3 = 0; _i3 < 3; _i3++) {\n if (maxT[whichPlane] < maxT[_i3]) {\n whichPlane = _i3;\n }\n } // Check for valie intersection along line\n\n\n if (maxT[whichPlane] > 1.0 || maxT[whichPlane] < 0.0) {\n return 0;\n }\n\n tolerance[0] = maxT[whichPlane]; // Intersection point along line is okay. Check bbox.\n\n for (var _i4 = 0; _i4 < 3; _i4++) {\n if (whichPlane !== _i4) {\n coord[_i4] = origin[_i4] + maxT[whichPlane] * dir[_i4];\n\n if (coord[_i4] < bounds[2 * _i4] || coord[_i4] > bounds[2 * _i4 + 1]) {\n return 0;\n }\n } else {\n coord[_i4] = candidatePlane[_i4];\n }\n }\n\n return 1;\n} // Plane intersection with box\n\nfunction _intersectPlane(bounds, origin, normal) {\n var p = [];\n var d = 0;\n var sign = 1;\n var firstOne = 1; // Evaluate the eight points. If there is a sign change, there is an intersection\n\n for (var z = 4; z <= 5; ++z) {\n p[2] = bounds[z];\n\n for (var y = 2; y <= 3; ++y) {\n p[1] = bounds[y];\n\n for (var x = 0; x <= 1; ++x) {\n p[0] = bounds[x];\n d = vtkPlane.evaluate(normal, origin, p);\n\n if (firstOne) {\n sign = d >= 0 ? 1 : -1;\n firstOne = 0;\n }\n\n if (d === 0.0 || sign > 0 && d < 0.0 || sign < 0 && d > 0.0) {\n return 1;\n }\n }\n }\n }\n\n return 0; // no intersection\n}\n\nfunction _intersect(bounds, bBounds) {\n if (!(_isValid(bounds) && _isValid(bBounds))) {\n return false;\n }\n\n var newBounds = [0, 0, 0, 0, 0, 0];\n var intersection;\n\n for (var i = 0; i < 3; i++) {\n intersection = false;\n\n if (bBounds[i * 2] >= bounds[i * 2] && bBounds[i * 2] <= bounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2] = bBounds[i * 2];\n } else if (bounds[i * 2] >= bBounds[i * 2] && bounds[i * 2] <= bBounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2] = bounds[i * 2];\n }\n\n if (bBounds[i * 2 + 1] >= bounds[i * 2] && bBounds[i * 2 + 1] <= bounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2 + 1] = bBounds[2 * i + 1];\n } else if (bounds[i * 2 + 1] >= bBounds[i * 2] && bounds[i * 2 + 1] <= bBounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2 + 1] = bounds[i * 2 + 1];\n }\n\n if (!intersection) {\n return false;\n }\n } // OK they did intersect - set the box to be the result\n\n\n bounds[0] = newBounds[0];\n bounds[1] = newBounds[1];\n bounds[2] = newBounds[2];\n bounds[3] = newBounds[3];\n bounds[4] = newBounds[4];\n bounds[5] = newBounds[5];\n return true;\n}\n\nfunction _intersects(bounds, bBounds) {\n if (!(_isValid(bounds) && _isValid(bBounds))) {\n return false;\n }\n /* eslint-disable no-continue */\n\n\n for (var i = 0; i < 3; i++) {\n if (bBounds[i * 2] >= bounds[i * 2] && bBounds[i * 2] <= bounds[i * 2 + 1]) {\n continue;\n } else if (bounds[i * 2] >= bBounds[i * 2] && bounds[i * 2] <= bBounds[i * 2 + 1]) {\n continue;\n }\n\n if (bBounds[i * 2 + 1] >= bounds[i * 2] && bBounds[i * 2 + 1] <= bounds[i * 2 + 1]) {\n continue;\n } else if (bounds[i * 2 + 1] >= bBounds[i * 2] && bounds[i * 2 + 1] <= bBounds[i * 2 + 1]) {\n continue;\n }\n\n return false;\n }\n /* eslint-enable no-continue */\n\n\n return true;\n}\n\nfunction _containsPoint(bounds, x, y, z) {\n if (x < bounds[0] || x > bounds[1]) {\n return false;\n }\n\n if (y < bounds[2] || y > bounds[3]) {\n return false;\n }\n\n if (z < bounds[4] || z > bounds[5]) {\n return false;\n }\n\n return true;\n}\nfunction contains(bounds, otherBounds) {\n // if either box is not valid or they don't intersect\n if (!_intersects(bounds, otherBounds)) {\n return false;\n }\n\n if (!_containsPoint.apply(void 0, [bounds].concat(_toConsumableArray(_getMinPoint(otherBounds))))) {\n return false;\n }\n\n if (!_containsPoint.apply(void 0, [bounds].concat(_toConsumableArray(_getMaxPoint(otherBounds))))) {\n return false;\n }\n\n return true;\n}\n/**\n * Returns true if plane intersects bounding box.\n * If so, the box is cut by the plane\n * @param {array} origin\n * @param {array} normal\n */\n\nfunction _cutWithPlane(bounds, origin, normal) {\n // Index[0..2] represents the order of traversing the corners of a cube\n // in (x,y,z), (y,x,z) and (z,x,y) ordering, respectively\n var index = [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 4, 5, 2, 3, 6, 7], [0, 2, 4, 6, 1, 3, 5, 7]]; // stores the signed distance to a plane\n\n var d = [0, 0, 0, 0, 0, 0, 0, 0];\n var idx = 0;\n\n for (var ix = 0; ix < 2; ix++) {\n for (var iy = 2; iy < 4; iy++) {\n for (var iz = 4; iz < 6; iz++) {\n var x = [bounds[ix], bounds[iy], bounds[iz]];\n d[idx++] = vtkPlane.evaluate(normal, origin, x);\n }\n }\n }\n\n var dir = 2;\n\n while (dir--) {\n // in each direction, we test if the vertices of two orthogonal faces\n // are on either side of the plane\n if (oppositeSign(d[index[dir][0]], d[index[dir][4]]) && oppositeSign(d[index[dir][1]], d[index[dir][5]]) && oppositeSign(d[index[dir][2]], d[index[dir][6]]) && oppositeSign(d[index[dir][3]], d[index[dir][7]])) {\n break;\n }\n }\n\n if (dir < 0) {\n return false;\n }\n\n var sign = Math.sign(normal[dir]);\n var size = Math.abs((bounds[dir * 2 + 1] - bounds[dir * 2]) * normal[dir]);\n var t = sign > 0 ? 1 : 0;\n /* eslint-disable no-continue */\n\n for (var i = 0; i < 4; i++) {\n if (size === 0) {\n continue; // shouldn't happen\n }\n\n var ti = Math.abs(d[index[dir][i]]) / size;\n\n if (sign > 0 && ti < t) {\n t = ti;\n }\n\n if (sign < 0 && ti > t) {\n t = ti;\n }\n }\n /* eslint-enable no-continue */\n\n\n var bound = (1.0 - t) * bounds[dir * 2] + t * bounds[dir * 2 + 1];\n\n if (sign > 0) {\n bounds[dir * 2] = bound;\n } else {\n bounds[dir * 2 + 1] = bound;\n }\n\n return true;\n} // ----------------------------------------------------------------------------\n\nvar BoundingBox = /*#__PURE__*/function () {\n function BoundingBox(refBounds) {\n _classCallCheck(this, BoundingBox);\n\n this.bounds = refBounds;\n\n if (!this.bounds) {\n this.bounds = new Float64Array(INIT_BOUNDS);\n }\n }\n\n _createClass(BoundingBox, [{\n key: \"getBounds\",\n value: function getBounds() {\n return this.bounds;\n }\n }, {\n key: \"equals\",\n value: function equals(otherBounds) {\n return _equals(this.bounds, otherBounds);\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return _isValid(this.bounds);\n }\n }, {\n key: \"setBounds\",\n value: function setBounds(otherBounds) {\n return _setBounds(this.bounds, otherBounds);\n }\n }, {\n key: \"reset\",\n value: function reset() {\n return _reset(this.bounds);\n }\n }, {\n key: \"addPoint\",\n value: function addPoint() {\n for (var _len = arguments.length, xyz = new Array(_len), _key = 0; _key < _len; _key++) {\n xyz[_key] = arguments[_key];\n }\n\n return _addPoint.apply(void 0, [this.bounds].concat(xyz));\n }\n }, {\n key: \"addPoints\",\n value: function addPoints(points) {\n return _addPoints(this.bounds, points);\n }\n }, {\n key: \"addBounds\",\n value: function addBounds(xMin, xMax, yMin, yMax, zMin, zMax) {\n return _addBounds(this.bounds, xMin, xMax, yMin, yMax, zMin, zMax);\n }\n }, {\n key: \"setMinPoint\",\n value: function setMinPoint(x, y, z) {\n return _setMinPoint(this.bounds, x, y, z);\n }\n }, {\n key: \"setMaxPoint\",\n value: function setMaxPoint(x, y, z) {\n return _setMaxPoint(this.bounds, x, y, z);\n }\n }, {\n key: \"inflate\",\n value: function inflate(delta) {\n return _inflate(this.bounds, delta);\n }\n }, {\n key: \"scale\",\n value: function scale(sx, sy, sz) {\n return _scale(this.bounds, sx, sy, sz);\n }\n }, {\n key: \"getCenter\",\n value: function getCenter() {\n return _getCenter(this.bounds);\n }\n }, {\n key: \"getLength\",\n value: function getLength(index) {\n return _getLength(this.bounds, index);\n }\n }, {\n key: \"getLengths\",\n value: function getLengths() {\n return _getLengths(this.bounds);\n }\n }, {\n key: \"getMaxLength\",\n value: function getMaxLength() {\n return _getMaxLength(this.bounds);\n }\n }, {\n key: \"getDiagonalLength\",\n value: function getDiagonalLength() {\n return _getDiagonalLength(this.bounds);\n }\n }, {\n key: \"getMinPoint\",\n value: function getMinPoint() {\n return _getMinPoint(this.bounds);\n }\n }, {\n key: \"getMaxPoint\",\n value: function getMaxPoint() {\n return _getMaxPoint(this.bounds);\n }\n }, {\n key: \"getXRange\",\n value: function getXRange() {\n return _getXRange(this.bounds);\n }\n }, {\n key: \"getYRange\",\n value: function getYRange() {\n return _getYRange(this.bounds);\n }\n }, {\n key: \"getZRange\",\n value: function getZRange() {\n return _getZRange(this.bounds);\n }\n }, {\n key: \"getCorners\",\n value: function getCorners(corners) {\n return _getCorners(this.bounds, corners);\n }\n }, {\n key: \"computeCornerPoints\",\n value: function computeCornerPoints(point1, point2) {\n return _computeCornerPoints(this.bounds, point1, point2);\n }\n }, {\n key: \"computeLocalBounds\",\n value: function computeLocalBounds(u, v, w) {\n return _computeLocalBounds(this.bounds, u, v, w);\n }\n }, {\n key: \"transformBounds\",\n value: function transformBounds(transform) {\n var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return _transformBounds(this.bounds, transform, out);\n }\n }, {\n key: \"computeScale3\",\n value: function computeScale3(scale3) {\n return _computeScale(this.bounds, scale3);\n }\n }, {\n key: \"cutWithPlane\",\n value: function cutWithPlane(origin, normal) {\n return _cutWithPlane(this.bounds, origin, normal);\n }\n }, {\n key: \"intersectBox\",\n value: function intersectBox(origin, dir, coord, tolerance) {\n return _intersectBox(this.bounds, origin, dir, coord, tolerance);\n }\n }, {\n key: \"intersectPlane\",\n value: function intersectPlane(origin, normal) {\n return _intersectPlane(this.bounds, origin, normal);\n }\n }, {\n key: \"intersect\",\n value: function intersect(otherBounds) {\n return _intersect(this.bounds, otherBounds);\n }\n }, {\n key: \"intersects\",\n value: function intersects(otherBounds) {\n return _intersects(this.bounds, otherBounds);\n }\n }, {\n key: \"containsPoint\",\n value: function containsPoint(x, y, z) {\n return _containsPoint(this.bounds, x, y, z);\n }\n }, {\n key: \"contains\",\n value: function contains(otherBounds) {\n return _intersects(this.bounds, otherBounds);\n }\n }]);\n\n return BoundingBox;\n}();\n\nfunction newInstance(initialValues) {\n var bounds = initialValues && initialValues.bounds;\n return new BoundingBox(bounds);\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n equals: _equals,\n isValid: _isValid,\n setBounds: _setBounds,\n reset: _reset,\n addPoint: _addPoint,\n addPoints: _addPoints,\n addBounds: _addBounds,\n setMinPoint: _setMinPoint,\n setMaxPoint: _setMaxPoint,\n inflate: _inflate,\n scale: _scale,\n scaleAboutCenter: scaleAboutCenter,\n getCenter: _getCenter,\n getLength: _getLength,\n getLengths: _getLengths,\n getMaxLength: _getMaxLength,\n getDiagonalLength: _getDiagonalLength,\n getMinPoint: _getMinPoint,\n getMaxPoint: _getMaxPoint,\n getXRange: _getXRange,\n getYRange: _getYRange,\n getZRange: _getZRange,\n getCorners: _getCorners,\n computeCornerPoints: _computeCornerPoints,\n computeLocalBounds: _computeLocalBounds,\n transformBounds: _transformBounds,\n computeScale3: _computeScale,\n cutWithPlane: _cutWithPlane,\n intersectBox: _intersectBox,\n intersectPlane: _intersectPlane,\n intersect: _intersect,\n intersects: _intersects,\n containsPoint: _containsPoint,\n contains: contains,\n INIT_BOUNDS: INIT_BOUNDS\n};\nvar vtkBoundingBox = _objectSpread({\n newInstance: newInstance\n}, STATIC);\n\nexport { STATIC, _addBounds as addBounds, _addPoint as addPoint, _addPoints as addPoints, _computeCornerPoints as computeCornerPoints, _computeLocalBounds as computeLocalBounds, _computeScale as computeScale3, contains, _containsPoint as containsPoint, _cutWithPlane as cutWithPlane, vtkBoundingBox as default, _equals as equals, _getCenter as getCenter, _getCorners as getCorners, _getDiagonalLength as getDiagonalLength, _getLength as getLength, _getLengths as getLengths, _getMaxLength as getMaxLength, _getMaxPoint as getMaxPoint, _getMinPoint as getMinPoint, _getXRange as getXRange, _getYRange as getYRange, _getZRange as getZRange, _inflate as inflate, _intersect as intersect, _intersectBox as intersectBox, _intersectPlane as intersectPlane, _intersects as intersects, _isValid as isValid, _reset as reset, _scale as scale, scaleAboutCenter, _setBounds as setBounds, _setMaxPoint as setMaxPoint, _setMinPoint as setMinPoint, _transformBounds as transformBounds };\n","import vtk from '../../../vtk.js';\nimport macro from '../../../macros.js';\nimport vtkDataArray from '../../Core/DataArray.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro,\n vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n// vtkFieldData methods\n// ----------------------------------------------------------------------------\n\nfunction vtkFieldData(publicAPI, model) {\n model.classHierarchy.push('vtkFieldData');\n var superGetState = publicAPI.getState; // Decode serialized data if any\n\n if (model.arrays) {\n model.arrays = model.arrays.map(function (item) {\n return {\n data: vtk(item.data)\n };\n });\n }\n\n publicAPI.initialize = function () {\n publicAPI.initializeFields();\n publicAPI.copyAllOn();\n publicAPI.clearFieldFlags();\n };\n\n publicAPI.initializeFields = function () {\n model.arrays = [];\n model.copyFieldFlags = {};\n publicAPI.modified();\n };\n\n publicAPI.copyStructure = function (other) {\n publicAPI.initializeFields();\n model.copyFieldFlags = other.getCopyFieldFlags().map(function (x) {\n return x;\n }); // Deep-copy\n\n model.arrays = other.arrays().map(function (x) {\n return {\n array: x\n };\n }); // Deep-copy\n // TODO: Copy array information objects (once we support information objects)\n };\n\n publicAPI.getNumberOfArrays = function () {\n return model.arrays.length;\n };\n\n publicAPI.getNumberOfActiveArrays = function () {\n return model.arrays.length;\n };\n\n publicAPI.addArray = function (arr) {\n var name = arr.getName();\n\n var _publicAPI$getArrayWi = publicAPI.getArrayWithIndex(name),\n array = _publicAPI$getArrayWi.array,\n index = _publicAPI$getArrayWi.index;\n\n if (array != null) {\n model.arrays[index] = {\n data: arr\n };\n return index;\n }\n\n model.arrays = [].concat(model.arrays, {\n data: arr\n });\n return model.arrays.length - 1;\n };\n\n publicAPI.removeAllArrays = function () {\n model.arrays = [];\n };\n\n publicAPI.removeArray = function (arrayName) {\n var index = model.arrays.findIndex(function (array) {\n return array.getName() === arrayName;\n });\n return publicAPI.removeArrayByIndex(index);\n };\n\n publicAPI.removeArrayByIndex = function (arrayIdx) {\n if (arrayIdx !== -1 && arrayIdx < model.arrays.length) {\n model.arrays.splice(arrayIdx, 1); // TBD modified() ?\n\n return true;\n }\n\n return false;\n };\n\n publicAPI.getArrays = function () {\n return model.arrays.map(function (entry) {\n return entry.data;\n });\n };\n\n publicAPI.getArray = function (arraySpec) {\n return typeof arraySpec === 'number' ? publicAPI.getArrayByIndex(arraySpec) : publicAPI.getArrayByName(arraySpec);\n };\n\n publicAPI.getArrayByName = function (arrayName) {\n return model.arrays.reduce(function (a, b, i) {\n return b.data.getName() === arrayName ? b.data : a;\n }, null);\n };\n\n publicAPI.getArrayWithIndex = function (arrayName) {\n var index = model.arrays.findIndex(function (array) {\n return array.data.getName() === arrayName;\n });\n return {\n array: index !== -1 ? model.arrays[index].data : null,\n index: index\n };\n };\n\n publicAPI.getArrayByIndex = function (idx) {\n return idx >= 0 && idx < model.arrays.length ? model.arrays[idx].data : null;\n };\n\n publicAPI.hasArray = function (arrayName) {\n return publicAPI.getArrayWithIndex(arrayName).index >= 0;\n };\n\n publicAPI.getArrayName = function (idx) {\n var arr = model.arrays[idx];\n return arr ? arr.data.getName() : '';\n };\n\n publicAPI.getCopyFieldFlags = function () {\n return model.copyFieldFlags;\n };\n\n publicAPI.getFlag = function (arrayName) {\n return model.copyFieldFlags[arrayName];\n };\n\n publicAPI.passData = function (other) {\n var fromId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n var toId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n other.getArrays().forEach(function (arr) {\n var copyFlag = publicAPI.getFlag(arr.getName());\n\n if (copyFlag !== false && !(model.doCopyAllOff && copyFlag !== true) && arr) {\n var destArr = publicAPI.getArrayByName(arr.getName());\n\n if (!destArr) {\n if (fromId < 0 || fromId > arr.getNumberOfTuples()) {\n // TBD: should this be a deep or a shallow copy?\n publicAPI.addArray(arr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(arr, attrType);\n });\n } else {\n var ncomps = arr.getNumberOfComponents();\n var newSize = arr.getNumberOfValues();\n var tId = toId > -1 ? toId : fromId;\n\n if (newSize <= tId * ncomps) {\n newSize = (tId + 1) * ncomps;\n }\n\n destArr = vtkDataArray.newInstance({\n name: arr.getName(),\n dataType: arr.getDataType(),\n numberOfComponents: ncomps,\n values: macro.newTypedArray(arr.getDataType(), newSize),\n size: 0\n });\n destArr.insertTuple(tId, arr.getTuple(fromId));\n publicAPI.addArray(destArr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(destArr, attrType);\n });\n }\n } else if (arr.getNumberOfComponents() === destArr.getNumberOfComponents()) {\n if (fromId > -1 && fromId < arr.getNumberOfTuples()) {\n var _tId = toId > -1 ? toId : fromId;\n\n destArr.insertTuple(_tId, arr.getTuple(fromId));\n } else {\n // if `fromId` is not provided, just copy all (or as much possible)\n // from `arr` to `destArr`.\n destArr.insertTuples(0, arr.getTuples());\n }\n } else {\n vtkErrorMacro('Unhandled case in passData');\n }\n }\n });\n };\n\n publicAPI.interpolateData = function (other) {\n var fromId1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n var fromId2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n var toId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1;\n var t = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.5;\n other.getArrays().forEach(function (arr) {\n var copyFlag = publicAPI.getFlag(arr.getName());\n\n if (copyFlag !== false && !(model.doCopyAllOff && copyFlag !== true) && arr) {\n var destArr = publicAPI.getArrayByName(arr.getName());\n\n if (!destArr) {\n if (fromId1 < 0 || fromId2 < 0 || fromId1 > arr.getNumberOfTuples()) {\n // TBD: should this be a deep or a shallow copy?\n publicAPI.addArray(arr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(arr, attrType);\n });\n } else {\n var ncomps = arr.getNumberOfComponents();\n var newSize = arr.getNumberOfValues(); // TODO: Is this supposed to happen?\n\n var tId = toId > -1 ? toId : fromId1;\n\n if (newSize <= tId * ncomps) {\n newSize = (tId + 1) * ncomps;\n }\n\n destArr = vtkDataArray.newInstance({\n name: arr.getName(),\n dataType: arr.getDataType(),\n numberOfComponents: ncomps,\n values: macro.newTypedArray(arr.getDataType(), newSize),\n size: 0\n });\n destArr.interpolateTuple(tId, arr, fromId1, arr, fromId2, t);\n publicAPI.addArray(destArr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(destArr, attrType);\n });\n }\n } else if (arr.getNumberOfComponents() === destArr.getNumberOfComponents()) {\n if (fromId1 > -1 && fromId1 < arr.getNumberOfTuples()) {\n var _tId2 = toId > -1 ? toId : fromId1;\n\n destArr.interpolateTuple(_tId2, arr, fromId1, arr, fromId2, t);\n vtkWarningMacro('Unexpected case in interpolateData');\n } else {\n // if `fromId` is not provided, just copy all (or as much possible)\n // from `arr` to `destArr`.\n destArr.insertTuples(arr.getTuples());\n }\n } else {\n vtkErrorMacro('Unhandled case in interpolateData');\n }\n }\n });\n };\n\n publicAPI.copyFieldOn = function (arrayName) {\n model.copyFieldFlags[arrayName] = true;\n };\n\n publicAPI.copyFieldOff = function (arrayName) {\n model.copyFieldFlags[arrayName] = false;\n };\n\n publicAPI.copyAllOn = function () {\n if (!model.doCopyAllOn || model.doCopyAllOff) {\n model.doCopyAllOn = true;\n model.doCopyAllOff = false;\n publicAPI.modified();\n }\n };\n\n publicAPI.copyAllOff = function () {\n if (model.doCopyAllOn || !model.doCopyAllOff) {\n model.doCopyAllOn = false;\n model.doCopyAllOff = true;\n publicAPI.modified();\n }\n };\n\n publicAPI.clearFieldFlags = function () {\n model.copyFieldFlags = {};\n };\n\n publicAPI.deepCopy = function (other) {\n model.arrays = other.getArrays().map(function (arr) {\n var arrNew = arr.newClone();\n arrNew.deepCopy(arr);\n return {\n data: arrNew\n };\n });\n };\n\n publicAPI.copyFlags = function (other) {\n return other.getCopyFieldFlags().map(function (x) {\n return x;\n });\n }; // TODO: publicAPI.squeeze = () => model.arrays.forEach(entry => entry.data.squeeze());\n\n\n publicAPI.reset = function () {\n return model.arrays.forEach(function (entry) {\n return entry.data.reset();\n });\n }; // TODO: getActualMemorySize\n\n\n publicAPI.getMTime = function () {\n return model.arrays.reduce(function (a, b) {\n return b.data.getMTime() > a ? b.data.getMTime() : a;\n }, model.mtime);\n }; // TODO: publicAPI.getField = (ids, other) => { copy ids from other into this model's arrays }\n // TODO: publicAPI.getArrayContainingComponent = (component) => ...\n\n\n publicAPI.getNumberOfComponents = function () {\n return model.arrays.reduce(function (a, b) {\n return a + b.data.getNumberOfComponents();\n }, 0);\n };\n\n publicAPI.getNumberOfTuples = function () {\n return model.arrays.length > 0 ? model.arrays[0].getNumberOfTuples() : 0;\n };\n\n publicAPI.getState = function () {\n var result = superGetState();\n\n if (result) {\n result.arrays = model.arrays.map(function (item) {\n return {\n data: item.data.getState()\n };\n });\n }\n\n return result;\n };\n}\n\nvar DEFAULT_VALUES = {\n arrays: [],\n copyFieldFlags: [],\n // fields not to copy\n doCopyAllOn: true,\n doCopyAllOff: false\n};\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n vtkFieldData(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkFieldData'); // ----------------------------------------------------------------------------\n\nvar vtkFieldData$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkFieldData$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkFieldData from './DataSetAttributes/FieldData.js';\nimport Constants from './DataSetAttributes/Constants.js';\nimport vtkDataArray from '../Core/DataArray.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar AttributeTypes = Constants.AttributeTypes,\n AttributeCopyOperations = Constants.AttributeCopyOperations;\nvar vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n// vtkDataSetAttributes methods\n// ----------------------------------------------------------------------------\n\nfunction vtkDataSetAttributes(publicAPI, model) {\n var attrTypes = ['Scalars', 'Vectors', 'Normals', 'TCoords', 'Tensors', 'GlobalIds', 'PedigreeIds'];\n\n function cleanAttributeType(attType) {\n // Given an integer or string, convert the result to one of the\n // strings in the \"attrTypes\" array above or null (if\n // no match is found)\n var cleanAttType = attrTypes.find(function (ee) {\n return AttributeTypes[ee.toUpperCase()] === attType || typeof attType !== 'number' && ee.toLowerCase() === attType.toLowerCase();\n });\n\n if (typeof cleanAttType === 'undefined') {\n cleanAttType = null;\n }\n\n return cleanAttType;\n } // Set our className\n\n\n model.classHierarchy.push('vtkDataSetAttributes');\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.checkNumberOfComponents = function (x) {\n return true;\n }; // TODO\n\n\n publicAPI.setAttribute = function (arr, uncleanAttType) {\n var attType = cleanAttributeType(uncleanAttType);\n\n if (arr && attType.toUpperCase() === 'PEDIGREEIDS' && !arr.isA('vtkDataArray')) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". The attribute must be a vtkDataArray.\"));\n return -1;\n }\n\n if (arr && !publicAPI.checkNumberOfComponents(arr, attType)) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". Incorrect number of components.\"));\n return -1;\n }\n\n var currentAttribute = model[\"active\".concat(attType)];\n\n if (currentAttribute >= 0 && currentAttribute < model.arrays.length) {\n if (model.arrays[currentAttribute] === arr) {\n return currentAttribute;\n } // FIXME setting an array actually changes its index\n\n\n publicAPI.removeArrayByIndex(currentAttribute);\n }\n\n if (arr) {\n currentAttribute = publicAPI.addArray(arr);\n model[\"active\".concat(attType)] = currentAttribute;\n } else {\n model[\"active\".concat(attType)] = -1;\n }\n\n publicAPI.modified();\n return model[\"active\".concat(attType)];\n };\n\n publicAPI.getAttributes = function (arr) {\n return attrTypes.filter(function (attrType) {\n return publicAPI[\"get\".concat(attrType)]() === arr;\n });\n };\n\n publicAPI.setActiveAttributeByName = function (arrayName, attType) {\n return publicAPI.setActiveAttributeByIndex(publicAPI.getArrayWithIndex(arrayName).index, attType);\n };\n\n publicAPI.setActiveAttributeByIndex = function (arrayIdx, uncleanAttType) {\n var attType = cleanAttributeType(uncleanAttType);\n\n if (arrayIdx >= 0 && arrayIdx < model.arrays.length) {\n if (attType.toUpperCase() !== 'PEDIGREEIDS') {\n var arr = publicAPI.getArrayByIndex(arrayIdx);\n\n if (!arr.isA('vtkDataArray')) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". Only vtkDataArray subclasses can be set as active attributes.\"));\n return -1;\n }\n\n if (!publicAPI.checkNumberOfComponents(arr, attType)) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". Incorrect number of components.\"));\n return -1;\n }\n }\n\n model[\"active\".concat(attType)] = arrayIdx;\n publicAPI.modified();\n return arrayIdx;\n }\n\n if (arrayIdx === -1) {\n model[\"active\".concat(attType)] = arrayIdx;\n publicAPI.modified();\n }\n\n return -1;\n };\n\n publicAPI.getActiveAttribute = function (attType) {\n // Given an integer enum value or a string (with random capitalization),\n // find the matching string in attrTypes.\n var cleanAttType = cleanAttributeType(attType);\n return publicAPI[\"get\".concat(cleanAttType)]();\n }; // Override to allow proper handling of active attributes\n\n\n publicAPI.removeAllArrays = function () {\n attrTypes.forEach(function (attType) {\n model[\"active\".concat(attType)] = -1;\n });\n superClass.removeAllArrays();\n }; // Override to allow proper handling of active attributes\n\n\n publicAPI.removeArrayByIndex = function (arrayIdx) {\n if (arrayIdx !== -1) {\n attrTypes.forEach(function (attType) {\n if (arrayIdx === model[\"active\".concat(attType)]) {\n model[\"active\".concat(attType)] = -1;\n } else if (arrayIdx < model[\"active\".concat(attType)]) {\n model[\"active\".concat(attType)] -= 1;\n }\n });\n }\n\n return superClass.removeArrayByIndex(arrayIdx);\n };\n\n attrTypes.forEach(function (value) {\n var activeVal = \"active\".concat(value);\n\n publicAPI[\"get\".concat(value)] = function () {\n return publicAPI.getArrayByIndex(model[activeVal]);\n };\n\n publicAPI[\"set\".concat(value)] = function (da) {\n return publicAPI.setAttribute(da, value);\n };\n\n publicAPI[\"setActive\".concat(value)] = function (arrayName) {\n return publicAPI.setActiveAttributeByIndex(publicAPI.getArrayWithIndex(arrayName).index, value);\n };\n\n publicAPI[\"copy\".concat(value, \"Off\")] = function () {\n var attType = value.toUpperCase();\n model.copyAttributeFlags[AttributeCopyOperations.PASSDATA][AttributeTypes[attType]] = false;\n };\n\n publicAPI[\"copy\".concat(value, \"On\")] = function () {\n var attType = value.toUpperCase();\n model.copyAttributeFlags[AttributeCopyOperations.PASSDATA][AttributeTypes[attType]] = true;\n };\n });\n\n publicAPI.initializeAttributeCopyFlags = function () {\n // Default to copying all attributes in every circumstance:\n model.copyAttributeFlags = [];\n Object.keys(AttributeCopyOperations).filter(function (op) {\n return op !== 'ALLCOPY';\n }).forEach(function (attCopyOp) {\n model.copyAttributeFlags[AttributeCopyOperations[attCopyOp]] = Object.keys(AttributeTypes).filter(function (ty) {\n return ty !== 'NUM_ATTRIBUTES';\n }).reduce(function (a, b) {\n a[AttributeTypes[b]] = true;\n return a;\n }, []);\n }); // Override some operations where we don't want to copy:\n\n model.copyAttributeFlags[AttributeCopyOperations.COPYTUPLE][AttributeTypes.GLOBALIDS] = false;\n model.copyAttributeFlags[AttributeCopyOperations.INTERPOLATE][AttributeTypes.GLOBALIDS] = false;\n model.copyAttributeFlags[AttributeCopyOperations.COPYTUPLE][AttributeTypes.PEDIGREEIDS] = false;\n };\n\n publicAPI.initialize = macro.chain(publicAPI.initialize, publicAPI.initializeAttributeCopyFlags); // Process dataArrays if any\n\n if (model.dataArrays && Object.keys(model.dataArrays).length) {\n Object.keys(model.dataArrays).forEach(function (name) {\n if (!model.dataArrays[name].ref && model.dataArrays[name].type === 'vtkDataArray') {\n publicAPI.addArray(vtkDataArray.newInstance(model.dataArrays[name]));\n }\n });\n }\n\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other, debug) {\n superShallowCopy(other, debug);\n model.arrays = other.getArrays().map(function (arr) {\n var arrNew = arr.newClone();\n arrNew.shallowCopy(arr, debug);\n return {\n data: arrNew\n };\n });\n };\n\n publicAPI.initializeAttributeCopyFlags();\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n activeScalars: -1,\n activeVectors: -1,\n activeTensors: -1,\n activeNormals: -1,\n activeTCoords: -1,\n activeGlobalIds: -1,\n activePedigreeIds: -1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n vtkFieldData.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['activeScalars', 'activeNormals', 'activeTCoords', 'activeVectors', 'activeTensors', 'activeGlobalIds', 'activePedigreeIds']);\n\n if (!model.arrays) {\n model.arrays = {};\n } // Object specific methods\n\n\n vtkDataSetAttributes(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkDataSetAttributes'); // ----------------------------------------------------------------------------\n\nvar vtkDataSetAttributes$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkDataSetAttributes$1 as default, extend, newInstance };\n","// Specify how data arrays can be used by data objects\nvar FieldDataTypes = {\n UNIFORM: 0,\n // data that does not vary over points/cells/etc.\n DATA_OBJECT_FIELD: 0,\n // to match VTK\n COORDINATE: 1,\n // data that specifies the location of each point\n POINT_DATA: 1,\n // to match VTK\n POINT: 2,\n // data defined at each point, but that does not specify the point location\n POINT_FIELD_DATA: 2,\n // to match VTK\n CELL: 3,\n // data defined at each cell, but that does not specify the cell\n CELL_FIELD_DATA: 3,\n // to match VTK\n VERTEX: 4,\n // data defined at each graph vertex, but that does not specify the graph vertex\n VERTEX_FIELD_DATA: 4,\n // to match VTK\n EDGE: 5,\n // data defined at each graph edge, but that does not specify the graph edge\n EDGE_FIELD_DATA: 5,\n // to match VTK\n ROW: 6,\n // data specifying a table row\n ROW_DATA: 6 // to match VTK\n\n};\nvar FieldAssociations = {\n FIELD_ASSOCIATION_POINTS: 0,\n FIELD_ASSOCIATION_CELLS: 1,\n FIELD_ASSOCIATION_NONE: 2,\n FIELD_ASSOCIATION_POINTS_THEN_CELLS: 3,\n FIELD_ASSOCIATION_VERTICES: 4,\n FIELD_ASSOCIATION_EDGES: 5,\n FIELD_ASSOCIATION_ROWS: 6,\n NUMBER_OF_ASSOCIATIONS: 7\n};\nvar Constants = {\n FieldDataTypes: FieldDataTypes,\n FieldAssociations: FieldAssociations\n};\n\nexport { FieldAssociations, FieldDataTypes, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtk from '../../vtk.js';\nimport vtkDataSetAttributes from './DataSetAttributes.js';\nimport Constants from './DataSet/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// import * as vtkMath from '../../Core/Math';\n//\n// function getBounds(dataset) {\n// if (dataset.bounds) {\n// return dataset.bounds;\n// }\n// if (dataset.type && dataset[dataset.type]) {\n// const ds = dataset[dataset.type];\n// if (ds.bounds) {\n// return ds.bounds;\n// }\n// if (ds.Points && ds.Points.bounds) {\n// return ds.Points.bounds;\n// }\n// if (ds.Points && ds.Points.values) {\n// const array = ds.Points.values;\n// const bbox = [...vtkBoundingBox.INIT_BOUNDS];\n// const size = array.length;\n// const delta = ds.Points.numberOfComponents ? ds.Points.numberOfComponents : 3;\n// for (let idx = 0; idx < size; idx += delta) {\n// vtkBoundingBox.addPoint(bbox, array[idx * delta], array[(idx * delta) + 1], array[(idx * delta) + 2]);\n// }\n// ds.Points.bounds = bbox;\n// return ds.Points.bounds;\n// }\n// }\n// return vtkMath.createUninitializedBounds();\n// }\n// ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nvar DATASET_FIELDS = ['pointData', 'cellData', 'fieldData']; // ----------------------------------------------------------------------------\n// vtkDataSet methods\n// ----------------------------------------------------------------------------\n\nfunction vtkDataSet(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkDataSet'); // Add dataset attributes\n\n DATASET_FIELDS.forEach(function (fieldName) {\n if (!model[fieldName]) {\n model[fieldName] = vtkDataSetAttributes.newInstance();\n } else {\n model[fieldName] = vtk(model[fieldName]);\n }\n });\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n superShallowCopy(other, debug);\n DATASET_FIELDS.forEach(function (fieldName) {\n model[fieldName] = vtkDataSetAttributes.newInstance();\n model[fieldName].shallowCopy(other.getReferenceByName(fieldName));\n });\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// pointData: null,\n // cellData: null,\n // fieldData: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, DATASET_FIELDS); // Object specific methods\n\n vtkDataSet(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkDataSet'); // ----------------------------------------------------------------------------\n\nvar vtkDataSet$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkDataSet$1 as default, extend, newInstance };\n","var AttributeTypes = {\n SCALARS: 0,\n VECTORS: 1,\n NORMALS: 2,\n TCOORDS: 3,\n TENSORS: 4,\n GLOBALIDS: 5,\n PEDIGREEIDS: 6,\n EDGEFLAG: 7,\n NUM_ATTRIBUTES: 8\n};\nvar AttributeLimitTypes = {\n MAX: 0,\n EXACT: 1,\n NOLIMIT: 2\n};\nvar CellGhostTypes = {\n DUPLICATECELL: 1,\n // the cell is present on multiple processors\n HIGHCONNECTIVITYCELL: 2,\n // the cell has more neighbors than in a regular mesh\n LOWCONNECTIVITYCELL: 4,\n // the cell has less neighbors than in a regular mesh\n REFINEDCELL: 8,\n // other cells are present that refines it.\n EXTERIORCELL: 16,\n // the cell is on the exterior of the data set\n HIDDENCELL: 32 // the cell is needed to maintain connectivity, but the data values should be ignored.\n\n};\nvar PointGhostTypes = {\n DUPLICATEPOINT: 1,\n // the cell is present on multiple processors\n HIDDENPOINT: 2 // the point is needed to maintain connectivity, but the data values should be ignored.\n\n};\nvar AttributeCopyOperations = {\n COPYTUPLE: 0,\n INTERPOLATE: 1,\n PASSDATA: 2,\n ALLCOPY: 3 // all of the above\n\n};\nvar ghostArrayName = 'vtkGhostType';\nvar DesiredOutputPrecision = {\n DEFAULT: 0,\n // use the point type that does not truncate any data\n SINGLE: 1,\n // use Float32Array\n DOUBLE: 2 // use Float64Array\n\n};\nvar Constants = {\n AttributeCopyOperations: AttributeCopyOperations,\n AttributeLimitTypes: AttributeLimitTypes,\n AttributeTypes: AttributeTypes,\n CellGhostTypes: CellGhostTypes,\n DesiredOutputPrecision: DesiredOutputPrecision,\n PointGhostTypes: PointGhostTypes,\n ghostArrayName: ghostArrayName\n};\n\nexport { AttributeCopyOperations, AttributeLimitTypes, AttributeTypes, CellGhostTypes, DesiredOutputPrecision, PointGhostTypes, Constants as default, ghostArrayName };\n","var StructuredType = {\n UNCHANGED: 0,\n SINGLE_POINT: 1,\n X_LINE: 2,\n Y_LINE: 3,\n Z_LINE: 4,\n XY_PLANE: 5,\n YZ_PLANE: 6,\n XZ_PLANE: 7,\n XYZ_GRID: 8,\n EMPTY: 9\n};\nvar Constants = {\n StructuredType: StructuredType\n};\n\nexport { StructuredType, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport Constants from './StructuredData/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar StructuredType = Constants.StructuredType;\nfunction getDataDescriptionFromExtent(inExt) {\n var dataDim = 0;\n\n for (var i = 0; i < 3; ++i) {\n if (inExt[i * 2] < inExt[i * 2 + 1]) {\n dataDim++;\n }\n }\n\n if (inExt[0] > inExt[1] || inExt[2] > inExt[3] || inExt[4] > inExt[5]) {\n return StructuredType.EMPTY;\n }\n\n if (dataDim === 3) {\n return StructuredType.XYZ_GRID;\n }\n\n if (dataDim === 2) {\n if (inExt[0] === inExt[1]) {\n return StructuredType.YZ_PLANE;\n }\n\n if (inExt[2] === inExt[3]) {\n return StructuredType.XZ_PLANE;\n }\n\n return StructuredType.XY_PLANE;\n }\n\n if (dataDim === 1) {\n if (inExt[0] < inExt[1]) {\n return StructuredType.X_LINE;\n }\n\n if (inExt[2] < inExt[3]) {\n return StructuredType.Y_LINE;\n }\n\n return StructuredType.Z_LINE;\n }\n\n return StructuredType.SINGLE_POINT;\n}\nvar vtkStructuredData = _objectSpread({\n getDataDescriptionFromExtent: getDataDescriptionFromExtent\n}, Constants);\n\nexport { vtkStructuredData as default, getDataDescriptionFromExtent };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport { b as roundVector, c as clampVector } from '../Core/Math/index.js';\nimport vtkBoundingBox from './BoundingBox.js';\nimport vtkDataSet from './DataSet.js';\nimport vtkStructuredData from './StructuredData.js';\nimport { StructuredType } from './StructuredData/Constants.js';\nimport { mat3, mat4, vec3 } from 'gl-matrix';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkImageData methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageData(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageData');\n\n publicAPI.setExtent = function () {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return false;\n }\n\n for (var _len = arguments.length, inExtent = new Array(_len), _key = 0; _key < _len; _key++) {\n inExtent[_key] = arguments[_key];\n }\n\n var extentArray = inExtent.length === 1 ? inExtent[0] : inExtent;\n\n if (extentArray.length !== 6) {\n return false;\n }\n\n var changeDetected = model.extent.some(function (item, index) {\n return item !== extentArray[index];\n });\n\n if (changeDetected) {\n model.extent = extentArray.slice();\n model.dataDescription = vtkStructuredData.getDataDescriptionFromExtent(model.extent);\n publicAPI.modified();\n }\n\n return changeDetected;\n };\n\n publicAPI.setDimensions = function () {\n var i;\n var j;\n var k;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (arguments.length === 1) {\n var array = arguments.length <= 0 ? undefined : arguments[0];\n i = array[0];\n j = array[1];\n k = array[2];\n } else if (arguments.length === 3) {\n i = arguments.length <= 0 ? undefined : arguments[0];\n j = arguments.length <= 1 ? undefined : arguments[1];\n k = arguments.length <= 2 ? undefined : arguments[2];\n } else {\n vtkErrorMacro('Bad dimension specification');\n return;\n }\n\n publicAPI.setExtent(0, i - 1, 0, j - 1, 0, k - 1);\n };\n\n publicAPI.getDimensions = function () {\n return [model.extent[1] - model.extent[0] + 1, model.extent[3] - model.extent[2] + 1, model.extent[5] - model.extent[4] + 1];\n };\n\n publicAPI.getNumberOfCells = function () {\n var dims = publicAPI.getDimensions();\n var nCells = 1;\n\n for (var i = 0; i < 3; i++) {\n if (dims[i] === 0) {\n return 0;\n }\n\n if (dims[i] > 1) {\n nCells *= dims[i] - 1;\n }\n }\n\n return nCells;\n };\n\n publicAPI.getNumberOfPoints = function () {\n var dims = publicAPI.getDimensions();\n return dims[0] * dims[1] * dims[2];\n };\n\n publicAPI.getPoint = function (index) {\n var dims = publicAPI.getDimensions();\n\n if (dims[0] === 0 || dims[1] === 0 || dims[2] === 0) {\n vtkErrorMacro('Requesting a point from an empty image.');\n return null;\n }\n\n var ijk = new Float64Array(3);\n\n switch (model.dataDescription) {\n case StructuredType.EMPTY:\n return null;\n\n case StructuredType.SINGLE_POINT:\n break;\n\n case StructuredType.X_LINE:\n ijk[0] = index;\n break;\n\n case StructuredType.Y_LINE:\n ijk[1] = index;\n break;\n\n case StructuredType.Z_LINE:\n ijk[2] = index;\n break;\n\n case StructuredType.XY_PLANE:\n ijk[0] = index % dims[0];\n ijk[1] = index / dims[0];\n break;\n\n case StructuredType.YZ_PLANE:\n ijk[1] = index % dims[1];\n ijk[2] = index / dims[1];\n break;\n\n case StructuredType.XZ_PLANE:\n ijk[0] = index % dims[0];\n ijk[2] = index / dims[0];\n break;\n\n case StructuredType.XYZ_GRID:\n ijk[0] = index % dims[0];\n ijk[1] = index / dims[0] % dims[1];\n ijk[2] = index / (dims[0] * dims[1]);\n break;\n\n default:\n vtkErrorMacro('Invalid dataDescription');\n break;\n }\n\n var coords = [0, 0, 0];\n publicAPI.indexToWorld(ijk, coords);\n return coords;\n }; // vtkCell *GetCell(vtkIdType cellId) VTK_OVERRIDE;\n // void GetCell(vtkIdType cellId, vtkGenericCell *cell) VTK_OVERRIDE;\n // void GetCellBounds(vtkIdType cellId, double bounds[6]) VTK_OVERRIDE;\n // virtual vtkIdType FindPoint(double x, double y, double z)\n // {\n // return this->vtkDataSet::FindPoint(x, y, z);\n // }\n // vtkIdType FindPoint(double x[3]) VTK_OVERRIDE;\n // vtkIdType FindCell(\n // double x[3], vtkCell *cell, vtkIdType cellId, double tol2,\n // int& subId, double pcoords[3], double *weights) VTK_OVERRIDE;\n // vtkIdType FindCell(\n // double x[3], vtkCell *cell, vtkGenericCell *gencell,\n // vtkIdType cellId, double tol2, int& subId,\n // double pcoords[3], double *weights) VTK_OVERRIDE;\n // vtkCell *FindAndGetCell(double x[3], vtkCell *cell, vtkIdType cellId,\n // double tol2, int& subId, double pcoords[3],\n // double *weights) VTK_OVERRIDE;\n // int GetCellType(vtkIdType cellId) VTK_OVERRIDE;\n // void GetCellPoints(vtkIdType cellId, vtkIdList *ptIds) VTK_OVERRIDE\n // {vtkStructuredData::GetCellPoints(cellId,ptIds,this->DataDescription,\n // this->GetDimensions());}\n // void GetPointCells(vtkIdType ptId, vtkIdList *cellIds) VTK_OVERRIDE\n // {vtkStructuredData::GetPointCells(ptId,cellIds,this->GetDimensions());}\n // void ComputeBounds() VTK_OVERRIDE;\n // int GetMaxCellSize() VTK_OVERRIDE {return 8;}; //voxel is the largest\n\n\n publicAPI.getBounds = function () {\n return publicAPI.extentToBounds(publicAPI.getSpatialExtent());\n };\n\n publicAPI.extentToBounds = function (ex) {\n return vtkBoundingBox.transformBounds(ex, model.indexToWorld);\n };\n\n publicAPI.getSpatialExtent = function () {\n return vtkBoundingBox.inflate(_toConsumableArray(model.extent), 0.5);\n }; // Internal, shouldn't need to call this manually.\n\n\n publicAPI.computeTransforms = function () {\n mat4.fromTranslation(model.indexToWorld, model.origin);\n model.indexToWorld[0] = model.direction[0];\n model.indexToWorld[1] = model.direction[1];\n model.indexToWorld[2] = model.direction[2];\n model.indexToWorld[4] = model.direction[3];\n model.indexToWorld[5] = model.direction[4];\n model.indexToWorld[6] = model.direction[5];\n model.indexToWorld[8] = model.direction[6];\n model.indexToWorld[9] = model.direction[7];\n model.indexToWorld[10] = model.direction[8];\n mat4.scale(model.indexToWorld, model.indexToWorld, model.spacing);\n mat4.invert(model.worldToIndex, model.indexToWorld);\n };\n\n publicAPI.indexToWorld = function (ain) {\n var aout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n vec3.transformMat4(aout, ain, model.indexToWorld);\n return aout;\n };\n\n publicAPI.indexToWorldVec3 = publicAPI.indexToWorld;\n\n publicAPI.worldToIndex = function (ain) {\n var aout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n vec3.transformMat4(aout, ain, model.worldToIndex);\n return aout;\n };\n\n publicAPI.worldToIndexVec3 = publicAPI.worldToIndex;\n\n publicAPI.indexToWorldBounds = function (bin) {\n var bout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return vtkBoundingBox.transformBounds(bin, model.indexToWorld, bout);\n };\n\n publicAPI.worldToIndexBounds = function (bin) {\n var bout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return vtkBoundingBox.transformBounds(bin, model.worldToIndex, bout);\n }; // Make sure the transform is correct\n\n\n publicAPI.onModified(publicAPI.computeTransforms);\n publicAPI.computeTransforms();\n\n publicAPI.getCenter = function () {\n return vtkBoundingBox.getCenter(publicAPI.getBounds());\n };\n\n publicAPI.computeHistogram = function (worldBounds) {\n var voxelFunc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var bounds = [0, 0, 0, 0, 0, 0];\n publicAPI.worldToIndexBounds(worldBounds, bounds);\n var point1 = [0, 0, 0];\n var point2 = [0, 0, 0];\n vtkBoundingBox.computeCornerPoints(bounds, point1, point2);\n roundVector(point1, point1);\n roundVector(point2, point2);\n var dimensions = publicAPI.getDimensions();\n clampVector(point1, [0, 0, 0], [dimensions[0] - 1, dimensions[1] - 1, dimensions[2] - 1], point1);\n clampVector(point2, [0, 0, 0], [dimensions[0] - 1, dimensions[1] - 1, dimensions[2] - 1], point2);\n var yStride = dimensions[0];\n var zStride = dimensions[0] * dimensions[1];\n var pixels = publicAPI.getPointData().getScalars().getData();\n var maximum = -Infinity;\n var minimum = Infinity;\n var sumOfSquares = 0;\n var isum = 0;\n var inum = 0;\n\n for (var z = point1[2]; z <= point2[2]; z++) {\n for (var y = point1[1]; y <= point2[1]; y++) {\n var index = point1[0] + y * yStride + z * zStride;\n\n for (var x = point1[0]; x <= point2[0]; x++) {\n if (!voxelFunc || voxelFunc([x, y, z], bounds)) {\n var pixel = pixels[index];\n if (pixel > maximum) maximum = pixel;\n if (pixel < minimum) minimum = pixel;\n sumOfSquares += pixel * pixel;\n isum += pixel;\n inum += 1;\n }\n\n ++index;\n }\n }\n }\n\n var average = inum > 0 ? isum / inum : 0;\n var variance = inum ? Math.abs(sumOfSquares / inum - average * average) : 0;\n var sigma = Math.sqrt(variance);\n return {\n minimum: minimum,\n maximum: maximum,\n average: average,\n variance: variance,\n sigma: sigma,\n count: inum\n };\n }; // TODO: use the unimplemented `vtkDataSetAttributes` for scalar length, that is currently also a TODO (GetNumberOfComponents).\n // Scalar data could be tuples for color information?\n\n\n publicAPI.computeIncrements = function (extent) {\n var numberOfComponents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var increments = [];\n var incr = numberOfComponents; // Calculate array increment offsets\n // similar to c++ vtkImageData::ComputeIncrements\n\n for (var idx = 0; idx < 3; ++idx) {\n increments[idx] = incr;\n incr *= extent[idx * 2 + 1] - extent[idx * 2] + 1;\n }\n\n return increments;\n };\n /**\n * @param {Number[]} index the localized `[i,j,k]` pixel array position. Float values will be rounded.\n * @return {Number} the corresponding flattened index in the scalar array\n */\n\n\n publicAPI.computeOffsetIndex = function (_ref) {\n var _ref2 = _slicedToArray(_ref, 3),\n i = _ref2[0],\n j = _ref2[1],\n k = _ref2[2];\n\n var extent = publicAPI.getExtent();\n var numberOfComponents = publicAPI.getPointData().getScalars().getNumberOfComponents();\n var increments = publicAPI.computeIncrements(extent, numberOfComponents); // Use the array increments to find the pixel index\n // similar to c++ vtkImageData::GetArrayPointer\n // Math.floor to catch \"practically 0\" e^-15 scenarios.\n\n return Math.floor((Math.round(i) - extent[0]) * increments[0] + (Math.round(j) - extent[2]) * increments[1] + (Math.round(k) - extent[4]) * increments[2]);\n };\n /**\n * @param {Number[]} xyz the [x,y,z] Array in world coordinates\n * @return {Number|NaN} the corresponding pixel's index in the scalar array\n */\n\n\n publicAPI.getOffsetIndexFromWorld = function (xyz) {\n var extent = publicAPI.getExtent();\n var index = publicAPI.worldToIndex(xyz); // Confirm indexed i,j,k coords are within the bounds of the volume\n\n for (var idx = 0; idx < 3; ++idx) {\n if (index[idx] < extent[idx * 2] || index[idx] > extent[idx * 2 + 1]) {\n vtkErrorMacro(\"GetScalarPointer: Pixel \".concat(index, \" is not in memory. Current extent = \").concat(extent));\n return NaN;\n }\n } // Assumed the index here is within 0 <-> scalarData.length, but doesn't hurt to check upstream\n\n\n return publicAPI.computeOffsetIndex(index);\n };\n /**\n * @param {Number[]} xyz the [x,y,z] Array in world coordinates\n * @param {Number?} comp the scalar component index for multi-component scalars\n * @return {Number|NaN} the corresponding pixel's scalar value\n */\n\n\n publicAPI.getScalarValueFromWorld = function (xyz) {\n var comp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var numberOfComponents = publicAPI.getPointData().getScalars().getNumberOfComponents();\n\n if (comp < 0 || comp >= numberOfComponents) {\n vtkErrorMacro(\"GetScalarPointer: Scalar Component \".concat(comp, \" is not within bounds. Current Scalar numberOfComponents: \").concat(numberOfComponents));\n return NaN;\n }\n\n var offsetIndex = publicAPI.getOffsetIndexFromWorld(xyz);\n\n if (Number.isNaN(offsetIndex)) {\n // VTK Error Macro will have been tripped already, no need to do it again,\n return offsetIndex;\n }\n\n return publicAPI.getPointData().getScalars().getComponent(offsetIndex, comp);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n direction: null,\n // a mat3\n indexToWorld: null,\n // a mat4\n worldToIndex: null,\n // a mat4\n spacing: [1.0, 1.0, 1.0],\n origin: [0.0, 0.0, 0.0],\n extent: [0, -1, 0, -1, 0, -1],\n dataDescription: StructuredType.EMPTY\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkDataSet.extend(publicAPI, model, initialValues);\n\n if (!model.direction) {\n model.direction = mat3.identity(new Float64Array(9));\n } else if (Array.isArray(model.direction)) {\n model.direction = new Float64Array(model.direction.slice(0, 9));\n }\n\n model.indexToWorld = new Float64Array(16);\n model.worldToIndex = new Float64Array(16); // Set/Get methods\n\n macro.get(publicAPI, model, ['indexToWorld', 'worldToIndex']);\n macro.setGetArray(publicAPI, model, ['origin', 'spacing'], 3);\n macro.setGetArray(publicAPI, model, ['direction'], 9);\n macro.getArray(publicAPI, model, ['extent'], 6); // Object specific methods\n\n vtkImageData(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageData'); // ----------------------------------------------------------------------------\n\nvar vtkImageData$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageData$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkPiecewiseFunction methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPiecewiseFunction(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPiecewiseFunction'); // Return the number of points which specify this function\n\n publicAPI.getSize = function () {\n return model.nodes.length;\n }; // Return the type of function stored in object:\n // Function Types:\n // 0 : Constant (No change in slope between end points)\n // 1 : NonDecreasing (Always increasing or zero slope)\n // 2 : NonIncreasing (Always decreasing or zero slope)\n // 3 : Varied (Contains both decreasing and increasing slopes)\n // 4 : Unknown (Error condition)\n //\n\n\n publicAPI.getType = function () {\n var value;\n var prevValue = 0.0;\n var functionType = 0;\n\n if (model.nodes.length > 0) {\n prevValue = model.nodes[0].y;\n }\n\n for (var i = 1; i < model.nodes.length; i++) {\n value = model.nodes[i].y; // Do not change the function type if equal\n\n if (value !== prevValue) {\n if (value > prevValue) {\n switch (functionType) {\n case 0:\n case 1:\n // NonDecreasing\n functionType = 1;\n break;\n\n case 2:\n default:\n // Varied\n functionType = 3;\n break;\n }\n } else {\n // value < prev_value\n switch (functionType) {\n case 0:\n case 2:\n // NonIncreasing\n functionType = 2;\n break;\n\n case 1:\n default:\n // Varied\n functionType = 3;\n break;\n }\n }\n }\n\n prevValue = value; // Exit loop if we find a Varied function\n\n if (functionType === 3) {\n break;\n }\n }\n\n switch (functionType) {\n case 0:\n return 'Constant';\n\n case 1:\n return 'NonDecreasing';\n\n case 2:\n return 'NonIncreasing';\n\n case 3:\n default:\n return 'Varied';\n }\n }; // Since we no longer store the data in an array, we must\n // copy out of the vector into an array. No modified check -\n // could be added if performance is a problem\n\n\n publicAPI.getDataPointer = function () {\n var size = model.nodes.length;\n model.function = null;\n\n if (size > 0) {\n model.function = [];\n\n for (var i = 0; i < size; i++) {\n model.function[2 * i] = model.nodes[i].x;\n model.function[2 * i + 1] = model.nodes[i].y;\n }\n }\n\n return model.function;\n }; // Returns the first point location which starts a non-zero segment of the\n // function. Note that the value at this point may be zero.\n\n\n publicAPI.getFirstNonZeroValue = function () {\n // Check if no points specified\n if (model.nodes.length === 0) {\n return 0;\n }\n\n var allZero = 1;\n var x = 0.0;\n var i = 0;\n\n for (; i < model.nodes.length; i++) {\n if (model.nodes[i].y !== 0.0) {\n allZero = 0;\n break;\n }\n } // If every specified point has a zero value then return\n // a large value\n\n\n if (allZero) {\n x = Number.MAX_VALUE;\n } else if (i > 0) {\n // A point was found with a non-zero value\n // Return the value of the point that precedes this one\n x = model.nodes[i - 1].x;\n } else if (model.clamping) {\n // If this is the first point in the function, return its\n // value is clamping is off, otherwise VTK_DOUBLE_MIN if\n // clamping is on.\n x = -Number.MAX_VALUE;\n } else {\n x = model.nodes[0].x;\n }\n\n return x;\n }; // For a specified index value, get the node parameters\n\n\n publicAPI.getNodeValue = function (index, val) {\n var size = model.nodes.length;\n\n if (index < 0 || index >= size) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n val[0] = model.nodes[index].x;\n val[1] = model.nodes[index].y;\n val[2] = model.nodes[index].midpoint;\n val[3] = model.nodes[index].sharpness;\n return 1;\n }; // For a specified index value, get the node parameters\n\n\n publicAPI.setNodeValue = function (index, val) {\n var size = model.nodes.length;\n\n if (index < 0 || index >= size) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n var oldX = model.nodes[index].x;\n model.nodes[index].x = val[0];\n model.nodes[index].y = val[1];\n model.nodes[index].midpoint = val[2];\n model.nodes[index].sharpness = val[3];\n\n if (oldX !== val[0]) {\n // The point has been moved, the order of points or the range might have\n // been modified.\n publicAPI.sortAndUpdateRange(); // No need to call Modified() here because SortAndUpdateRange() has done it\n // already.\n } else {\n publicAPI.modified();\n }\n\n return 1;\n }; // Adds a point to the function. If a duplicate point is inserted\n // then the function value at that location is set to the new value.\n // This is the legacy version that assumes midpoint = 0.5 and\n // sharpness = 0.0\n\n\n publicAPI.addPoint = function (x, y) {\n return publicAPI.addPointLong(x, y, 0.5, 0.0);\n }; // Adds a point to the function and returns the array index of the point.\n\n\n publicAPI.addPointLong = function (x, y, midpoint, sharpness) {\n // Error check\n if (midpoint < 0.0 || midpoint > 1.0) {\n vtkErrorMacro('Midpoint outside range [0.0, 1.0]');\n return -1;\n }\n\n if (sharpness < 0.0 || sharpness > 1.0) {\n vtkErrorMacro('Sharpness outside range [0.0, 1.0]');\n return -1;\n } // remove any node already at this X location\n\n\n if (!model.allowDuplicateScalars) {\n publicAPI.removePoint(x);\n } // Create the new node\n\n\n var node = {\n x: x,\n y: y,\n midpoint: midpoint,\n sharpness: sharpness\n }; // Add it, then sort to get everything in order\n\n model.nodes.push(node);\n publicAPI.sortAndUpdateRange(); // Now find this node so we can return the index\n\n var i;\n\n for (i = 0; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n } // If we didn't find it, something went horribly wrong so\n // return -1\n\n\n if (i < model.nodes.length) {\n return i;\n }\n\n return -1;\n };\n\n publicAPI.setNodes = function (nodes) {\n if (model.nodes !== nodes) {\n model.nodes = nodes;\n publicAPI.sortAndUpdateRange();\n }\n }; // Sort the vector in increasing order, then fill in\n // the Range\n\n\n publicAPI.sortAndUpdateRange = function () {\n model.nodes.sort(function (a, b) {\n return a.x - b.x;\n });\n var modifiedInvoked = publicAPI.updateRange(); // If range is updated, Modified() has been called, don't call it again.\n\n if (!modifiedInvoked) {\n publicAPI.modified();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.updateRange = function () {\n var oldRange = model.range.slice();\n var size = model.nodes.length;\n\n if (size) {\n model.range[0] = model.nodes[0].x;\n model.range[1] = model.nodes[size - 1].x;\n } else {\n model.range[0] = 0;\n model.range[1] = 0;\n } // If the rage is the same, then no need to call Modified()\n\n\n if (oldRange[0] === model.range[0] && oldRange[1] === model.range[1]) {\n return false;\n }\n\n publicAPI.modified();\n return true;\n }; // Removes a point from the function. If no point is found then function\n // remains the same.\n\n\n publicAPI.removePoint = function (x) {\n // First find the node since we need to know its\n // index as our return value\n var i;\n\n for (i = 0; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n } // If the node doesn't exist, we return -1\n\n\n if (i >= model.nodes.length) {\n return -1;\n }\n\n var retVal = i; // If the first or last point has been removed, then we update the range\n // No need to sort here as the order of points hasn't changed.\n\n var modifiedInvoked = false;\n model.nodes.splice(i, 1);\n\n if (i === 0 || i === model.nodes.length) {\n modifiedInvoked = publicAPI.updateRange();\n }\n\n if (!modifiedInvoked) {\n publicAPI.modified();\n }\n\n return retVal;\n }; // Removes all points from the function.\n\n\n publicAPI.removeAllPoints = function () {\n model.nodes = [];\n publicAPI.sortAndUpdateRange();\n }; // Add in end points of line and remove any points between them\n // Legacy method with no way to specify midpoint and sharpness\n\n\n publicAPI.addSegment = function (x1, y1, x2, y2) {\n // First, find all points in this range and remove them\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= x1 && model.nodes[i].x <= x2) {\n model.nodes.splice(i, 1);\n } else {\n i++;\n }\n } // Now add the points\n\n\n publicAPI.addPoint(x1, y1, 0.5, 0.0);\n publicAPI.addPoint(x2, y2, 0.5, 0.0);\n }; // Return the value of the function at a position\n\n\n publicAPI.getValue = function (x) {\n var table = [];\n publicAPI.getTable(x, x, 1, table);\n return table[0];\n }; // Remove all points outside the range, and make sure a point\n // exists at each end of the range. Used as a convenience method\n // for transfer function editors\n\n\n publicAPI.adjustRange = function (range) {\n if (range.length < 2) {\n return 0;\n }\n\n var functionRange = publicAPI.getRange(); // Make sure we have points at each end of the range\n\n if (functionRange[0] < range[0]) {\n publicAPI.addPoint(range[0], publicAPI.getValue(range[0]));\n } else {\n publicAPI.addPoint(range[0], publicAPI.getValue(functionRange[0]));\n }\n\n if (functionRange[1] > range[1]) {\n publicAPI.addPoint(range[1], publicAPI.getValue(range[1]));\n } else {\n publicAPI.addPoint(range[1], publicAPI.getValue(functionRange[1]));\n } // Remove all points out-of-range\n\n\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= range[0] && model.nodes[i].x <= range[1]) {\n model.nodes.splice(i, 1);\n } else {\n ++i;\n }\n }\n\n publicAPI.sortAndUpdateRange();\n return 1;\n }; //--------------------------------------------------------------------------\n\n\n publicAPI.estimateMinNumberOfSamples = function (x1, x2) {\n var d = publicAPI.findMinimumXDistance();\n return Math.ceil((x2 - x1) / d);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.findMinimumXDistance = function () {\n var size = model.nodes.length;\n\n if (size < 2) {\n return -1.0;\n }\n\n var distance = model.nodes[1].x - model.nodes[0].x;\n\n for (var i = 0; i < size - 1; i++) {\n var currentDist = model.nodes[i + 1].x - model.nodes[i].x;\n\n if (currentDist < distance) {\n distance = currentDist;\n }\n }\n\n return distance;\n }; // Returns a table of function values evaluated at regular intervals\n\n /* eslint-disable prefer-destructuring */\n\n /* eslint-disable no-continue */\n\n\n publicAPI.getTable = function (xStart, xEnd, size, table) {\n var stride = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n var i;\n var idx = 0;\n var numNodes = model.nodes.length; // Need to keep track of the last value so that\n // we can fill in table locations past this with\n // this value if Clamping is On.\n\n var lastValue = 0.0;\n\n if (numNodes !== 0) {\n lastValue = model.nodes[numNodes - 1].y;\n }\n\n var x = 0.0;\n var x1 = 0.0;\n var x2 = 0.0;\n var y1 = 0.0;\n var y2 = 0.0;\n var midpoint = 0.0;\n var sharpness = 0.0; // For each table entry\n\n for (i = 0; i < size; i++) {\n // Find our location in the table\n var tidx = stride * i; // Find our X location. If we are taking only 1 sample, make\n // it halfway between start and end (usually start and end will\n // be the same in this case)\n\n if (size > 1) {\n x = xStart + i / (size - 1.0) * (xEnd - xStart);\n } else {\n x = 0.5 * (xStart + xEnd);\n } // Do we need to move to the next node?\n\n\n while (idx < numNodes && x > model.nodes[idx].x) {\n idx++; // If we are at a valid point index, fill in\n // the value at this node, and the one before (the\n // two that surround our current sample location)\n // idx cannot be 0 since we just incremented it.\n\n if (idx < numNodes) {\n x1 = model.nodes[idx - 1].x;\n x2 = model.nodes[idx].x;\n y1 = model.nodes[idx - 1].y;\n y2 = model.nodes[idx].y; // We only need the previous midpoint and sharpness\n // since these control this region\n\n midpoint = model.nodes[idx - 1].midpoint;\n sharpness = model.nodes[idx - 1].sharpness; // Move midpoint away from extreme ends of range to avoid\n // degenerate math\n\n if (midpoint < 0.00001) {\n midpoint = 0.00001;\n }\n\n if (midpoint > 0.99999) {\n midpoint = 0.99999;\n }\n }\n } // Are we at the end? If so, just use the last value\n\n\n if (idx >= numNodes) {\n table[tidx] = model.clamping ? lastValue : 0.0;\n } else if (idx === 0) {\n // Are we before the first node? If so, duplicate this nodes values\n table[tidx] = model.clamping ? model.nodes[0].y : 0.0;\n } else {\n // Otherwise, we are between two nodes - interpolate\n // Our first attempt at a normalized location [0,1] -\n // we will be modifying this based on midpoint and\n // sharpness to get the curve shape we want and to have\n // it pass through (y1+y2)/2 at the midpoint.\n var s = (x - x1) / (x2 - x1); // Readjust based on the midpoint - linear adjustment\n\n if (s < midpoint) {\n s = 0.5 * s / midpoint;\n } else {\n s = 0.5 + 0.5 * (s - midpoint) / (1.0 - midpoint);\n } // override for sharpness > 0.99\n // In this case we just want piecewise constant\n\n\n if (sharpness > 0.99) {\n // Use the first value since we are below the midpoint\n if (s < 0.5) {\n table[tidx] = y1;\n continue;\n } else {\n // Use the second value at or above the midpoint\n table[tidx] = y2;\n continue;\n }\n } // Override for sharpness < 0.01\n // In this case we want piecewise linear\n\n\n if (sharpness < 0.01) {\n // Simple linear interpolation\n table[tidx] = (1 - s) * y1 + s * y2;\n continue;\n } // We have a sharpness between [0.01, 0.99] - we will\n // used a modified hermite curve interpolation where we\n // derive the slope based on the sharpness, and we compress\n // the curve non-linearly based on the sharpness\n // First, we will adjust our position based on sharpness in\n // order to make the curve sharper (closer to piecewise constant)\n\n\n if (s < 0.5) {\n s = 0.5 * Math.pow(s * 2, 1.0 + 10 * sharpness);\n } else if (s > 0.5) {\n s = 1.0 - 0.5 * Math.pow((1.0 - s) * 2, 1 + 10 * sharpness);\n } // Compute some coefficients we will need for the hermite curve\n\n\n var ss = s * s;\n var sss = ss * s;\n var h1 = 2 * sss - 3 * ss + 1;\n var h2 = -2 * sss + 3 * ss;\n var h3 = sss - 2 * ss + s;\n var h4 = sss - ss; // Use one slope for both end points\n\n var slope = y2 - y1;\n var t = (1.0 - sharpness) * slope; // Compute the value\n\n table[tidx] = h1 * y1 + h2 * y2 + h3 * t + h4 * t; // Final error check to make sure we don't go outside\n // the Y range\n\n var min = y1 < y2 ? y1 : y2;\n var max = y1 > y2 ? y1 : y2;\n table[tidx] = table[tidx] < min ? min : table[tidx];\n table[tidx] = table[tidx] > max ? max : table[tidx];\n }\n }\n };\n}\n/* eslint-enable prefer-destructuring */\n\n/* eslint-enable no-continue */\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // model.function = NULL;\n range: [0, 0],\n clamping: true,\n allowDuplicateScalars: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n macro.obj(publicAPI, model); // Internal objects initialization\n\n model.nodes = []; // Create get-set macros\n\n macro.setGet(publicAPI, model, ['allowDuplicateScalars', 'clamping']);\n macro.setArray(publicAPI, model, ['range'], 2); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['range']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkPiecewiseFunction(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPiecewiseFunction'); // ----------------------------------------------------------------------------\n\nvar vtkPiecewiseFunction$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkPiecewiseFunction$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { s as subtract, d as dot, j as cross, k as add } from '../Core/Math/index.js';\nimport macro from '../../macros.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar PLANE_TOLERANCE = 1.0e-6;\nvar COINCIDE = 'coincide';\nvar DISJOINT = 'disjoint'; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction evaluate(normal, origin, x) {\n return normal[0] * (x[0] - origin[0]) + normal[1] * (x[1] - origin[1]) + normal[2] * (x[2] - origin[2]);\n}\n\nfunction distanceToPlane(x, origin, normal) {\n var distance = normal[0] * (x[0] - origin[0]) + normal[1] * (x[1] - origin[1]) + normal[2] * (x[2] - origin[2]);\n return Math.abs(distance);\n}\n\nfunction projectPoint(x, origin, normal, xproj) {\n var xo = [];\n subtract(x, origin, xo);\n var t = dot(normal, xo);\n xproj[0] = x[0] - t * normal[0];\n xproj[1] = x[1] - t * normal[1];\n xproj[2] = x[2] - t * normal[2];\n}\n\nfunction projectVector(v, normal, vproj) {\n var t = dot(v, normal);\n var n2 = dot(normal, normal);\n\n if (n2 === 0) {\n n2 = 1.0;\n }\n\n vproj[0] = v[0] - t * normal[0] / n2;\n vproj[1] = v[1] - t * normal[1] / n2;\n vproj[2] = v[2] - t * normal[2] / n2;\n return vproj;\n}\n\nfunction generalizedProjectPoint(x, origin, normal, xproj) {\n var xo = [];\n subtract(x, origin, xo);\n var t = dot(normal, xo);\n var n2 = dot(normal, normal);\n\n if (n2 !== 0) {\n xproj[0] = x[0] - t * normal[0] / n2;\n xproj[1] = x[1] - t * normal[1] / n2;\n xproj[2] = x[2] - t * normal[2] / n2;\n } else {\n xproj[0] = x[0];\n xproj[1] = x[1];\n xproj[2] = x[2];\n }\n}\n\nfunction intersectWithLine(p1, p2, origin, normal) {\n var outObj = {\n intersection: false,\n betweenPoints: false,\n t: Number.MAX_VALUE,\n x: []\n };\n var p21 = [];\n var p1Origin = []; // Compute line vector\n\n subtract(p2, p1, p21);\n subtract(origin, p1, p1Origin); // Compute denominator. If ~0, line and plane are parallel.\n // const num = vtkMath.dot(normal, origin) - vtkMath.dot(normal, p1);\n\n var num = dot(normal, p1Origin);\n var den = dot(normal, p21); // If denominator with respect to numerator is \"zero\", then the line and\n // plane are considered parallel.\n\n var fabsden;\n var fabstolerance; // Trying to avoid an expensive call to fabs()\n\n if (den < 0.0) {\n fabsden = -den;\n } else {\n fabsden = den;\n }\n\n if (num < 0.0) {\n fabstolerance = -num * PLANE_TOLERANCE;\n } else {\n fabstolerance = num * PLANE_TOLERANCE;\n }\n\n if (fabsden <= fabstolerance) {\n return outObj;\n } // Where on the line between p1 and p2 is the intersection\n // If between 0 and 1, it is between the two points. If < 0 it's before p1, if > 1 it's after p2\n\n\n outObj.t = num / den;\n outObj.x[0] = p1[0] + outObj.t * p21[0];\n outObj.x[1] = p1[1] + outObj.t * p21[1];\n outObj.x[2] = p1[2] + outObj.t * p21[2];\n outObj.intersection = true;\n outObj.betweenPoints = outObj.t >= 0.0 && outObj.t <= 1.0;\n return outObj;\n}\n\nfunction intersectWithPlane(plane1Origin, plane1Normal, plane2Origin, plane2Normal) {\n var outObj = {\n intersection: false,\n l0: [],\n l1: [],\n error: null\n };\n var cross$1 = [];\n cross(plane1Normal, plane2Normal, cross$1);\n var absCross = cross$1.map(function (n) {\n return Math.abs(n);\n }); // test if the two planes are parallel\n\n if (absCross[0] + absCross[1] + absCross[2] < PLANE_TOLERANCE) {\n // test if disjoint or coincide\n var v = [];\n subtract(plane1Origin, plane2Origin, v);\n\n if (dot(plane1Normal, v) === 0) {\n outObj.error = COINCIDE;\n } else {\n outObj.error = DISJOINT;\n }\n\n return outObj;\n } // Plane1 and Plane2 intersect in a line\n // first determine max abs coordinate of the cross product\n\n\n var maxc;\n\n if (absCross[0] > absCross[1] && absCross[0] > absCross[2]) {\n maxc = 'x';\n } else if (absCross[1] > absCross[2]) {\n maxc = 'y';\n } else {\n maxc = 'z';\n } // To get a point on the intersect line, zero the max coord, and solve for the other two\n\n\n var iP = []; // intersectionPoint\n // the constants in the 2 plane equations\n\n var d1 = -dot(plane1Normal, plane1Origin);\n var d2 = -dot(plane2Normal, plane2Origin); // eslint-disable-next-line default-case\n\n switch (maxc) {\n case 'x':\n // intersect with x=0\n iP[0] = 0;\n iP[1] = (d2 * plane1Normal[2] - d1 * plane2Normal[2]) / cross$1[0];\n iP[2] = (d1 * plane2Normal[1] - d2 * plane1Normal[1]) / cross$1[0];\n break;\n\n case 'y':\n // intersect with y=0\n iP[0] = (d1 * plane2Normal[2] - d2 * plane1Normal[2]) / cross$1[1];\n iP[1] = 0;\n iP[2] = (d2 * plane1Normal[0] - d1 * plane2Normal[0]) / cross$1[1];\n break;\n\n case 'z':\n // intersect with z=0\n iP[0] = (d2 * plane1Normal[1] - d1 * plane2Normal[1]) / cross$1[2];\n iP[1] = (d1 * plane2Normal[0] - d2 * plane1Normal[0]) / cross$1[2];\n iP[2] = 0;\n break;\n }\n\n outObj.l0 = iP;\n add(iP, cross$1, outObj.l1);\n outObj.intersection = true;\n return outObj;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n evaluate: evaluate,\n distanceToPlane: distanceToPlane,\n projectPoint: projectPoint,\n projectVector: projectVector,\n generalizedProjectPoint: generalizedProjectPoint,\n intersectWithLine: intersectWithLine,\n intersectWithPlane: intersectWithPlane,\n DISJOINT: DISJOINT,\n COINCIDE: COINCIDE\n}; // ----------------------------------------------------------------------------\n// vtkPlane methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPlane(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPlane');\n\n publicAPI.distanceToPlane = function (x) {\n return distanceToPlane(x, model.origin, model.normal);\n };\n\n publicAPI.projectPoint = function (x, xproj) {\n projectPoint(x, model.origin, model.normal, xproj);\n };\n\n publicAPI.projectVector = function (v, vproj) {\n return projectVector(v, model.normal, vproj);\n };\n\n publicAPI.push = function (distance) {\n if (distance === 0.0) {\n return;\n }\n\n for (var i = 0; i < 3; i++) {\n model.origin[i] += distance * model.normal[i];\n }\n };\n\n publicAPI.generalizedProjectPoint = function (x, xproj) {\n generalizedProjectPoint(x, model.origin, model.normal, xproj);\n };\n\n publicAPI.evaluateFunction = function (x, y, z) {\n if (!Array.isArray(x)) {\n return model.normal[0] * (x - model.origin[0]) + model.normal[1] * (y - model.origin[1]) + model.normal[2] * (z - model.origin[2]);\n }\n\n return model.normal[0] * (x[0] - model.origin[0]) + model.normal[1] * (x[1] - model.origin[1]) + model.normal[2] * (x[2] - model.origin[2]);\n };\n\n publicAPI.evaluateGradient = function (xyz) {\n var retVal = [model.normal[0], model.normal[1], model.normal[2]];\n return retVal;\n };\n\n publicAPI.intersectWithLine = function (p1, p2) {\n return intersectWithLine(p1, p2, model.origin, model.normal);\n };\n\n publicAPI.intersectWithPlane = function (planeOrigin, planeNormal) {\n return intersectWithPlane(planeOrigin, planeNormal, model.origin, model.normal);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nvar DEFAULT_VALUES = {\n normal: [0.0, 0.0, 1.0],\n origin: [0.0, 0.0, 0.0]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.setGetArray(publicAPI, model, ['normal', 'origin'], 3);\n vtkPlane(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPlane'); // ----------------------------------------------------------------------------\n\nvar vtkPlane$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkPlane$1 as default, extend, newInstance, vtkPlane };\n","import macro from '../../macros.js';\nimport { u as uninitializeBounds } from '../Core/Math/index.js';\nimport vtkPoints from '../Core/Points.js';\n\n// vtkCell methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCell(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCell');\n\n publicAPI.initialize = function (points) {\n var pointIdsList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (!pointIdsList) {\n model.points = points;\n model.pointsIds = new Array(points.getNumberOfPoints());\n\n for (var i = points.getNumberOfPoints() - 1; i >= 0; --i) {\n model.pointsIds[i] = i;\n }\n } else {\n model.pointsIds = pointIdsList;\n var triangleData = model.points.getData();\n\n if (triangleData.length !== 3 * model.pointsIds.length) {\n triangleData = macro.newTypedArray(points.getDataType(), 3 * model.pointsIds.length);\n }\n\n var pointsData = points.getData();\n model.pointsIds.forEach(function (pointId, index) {\n // const start = 3 * pointId;\n // pointsData.set(p.subarray(start, start + 3), 3 * index);\n var pointOffset = 3 * pointId;\n var trianglePointOffset = 3 * index;\n triangleData[trianglePointOffset] = pointsData[pointOffset];\n triangleData[++trianglePointOffset] = pointsData[++pointOffset];\n triangleData[++trianglePointOffset] = pointsData[++pointOffset];\n });\n model.points.setData(triangleData);\n }\n };\n\n publicAPI.getBounds = function () {\n var nbPoints = model.points.getNumberOfPoints();\n var x = [];\n\n if (nbPoints) {\n model.points.getPoint(0, x);\n model.bounds[0] = x[0];\n model.bounds[1] = x[0];\n model.bounds[2] = x[1];\n model.bounds[3] = x[1];\n model.bounds[4] = x[2];\n model.bounds[5] = x[2];\n\n for (var i = 1; i < nbPoints; i++) {\n model.points.getPoint(i, x);\n model.bounds[0] = x[0] < model.bounds[0] ? x[0] : model.bounds[0];\n model.bounds[1] = x[0] > model.bounds[1] ? x[0] : model.bounds[1];\n model.bounds[2] = x[1] < model.bounds[2] ? x[1] : model.bounds[2];\n model.bounds[3] = x[1] > model.bounds[3] ? x[1] : model.bounds[3];\n model.bounds[4] = x[2] < model.bounds[4] ? x[2] : model.bounds[4];\n model.bounds[5] = x[2] > model.bounds[5] ? x[2] : model.bounds[5];\n }\n } else {\n uninitializeBounds(model.bounds);\n }\n\n return model.bounds;\n };\n\n publicAPI.getLength2 = function () {\n publicAPI.getBounds();\n var length = 0.0;\n var diff = 0;\n\n for (var i = 0; i < 3; i++) {\n diff = model.bounds[2 * i + 1] - model.bounds[2 * i];\n length += diff * diff;\n }\n\n return length;\n };\n\n publicAPI.getParametricDistance = function (pcoords) {\n var pDist;\n var pDistMax = 0.0;\n\n for (var i = 0; i < 3; i++) {\n if (pcoords[i] < 0.0) {\n pDist = -pcoords[i];\n } else if (pcoords[i] > 1.0) {\n pDist = pcoords[i] - 1.0;\n } else {\n // inside the cell in the parametric direction\n pDist = 0.0;\n }\n\n if (pDist > pDistMax) {\n pDistMax = pDist;\n }\n }\n\n return pDistMax;\n };\n\n publicAPI.getNumberOfPoints = function () {\n return model.points.getNumberOfPoints();\n };\n\n publicAPI.deepCopy = function (cell) {\n cell.initialize(model.points, model.pointsIds);\n };\n\n publicAPI.getCellDimension = function () {}; // virtual\n\n\n publicAPI.intersectWithLine = function (p1, p2, tol, t, x, pcoords, subId) {}; // virtual\n\n\n publicAPI.evaluatePosition = function (x, closestPoint, subId, pcoords, dist2, weights) {\n macro.vtkErrorMacro('vtkCell.evaluatePosition is not implemented.');\n }; // virtual\n\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bounds: [-1, -1, -1, -1, -1, -1],\n pointsIds: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n\n if (!model.points) {\n model.points = vtkPoints.newInstance();\n }\n\n macro.get(publicAPI, model, ['points', 'pointsIds']);\n vtkCell(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCell'); // ----------------------------------------------------------------------------\n\nvar vtkCell$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCell$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkCell from './Cell.js';\n\n// Global methods\n// ----------------------------------------------------------------------------\n\nvar InitLink = {\n ncells: 0,\n cells: null\n};\n\nfunction resize(model, sz) {\n var newSize = sz;\n\n if (sz >= model.array.length) {\n newSize += model.array.length;\n }\n\n while (newSize > model.array.length) {\n model.array.push({\n ncells: 0,\n cells: null\n });\n }\n\n model.array.length = newSize;\n} // ----------------------------------------------------------------------------\n// vtkCellLinks methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkCellLinks(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCellLinks');\n /**\n * Build the link list array. All subclasses of vtkAbstractCellLinks\n * must support this method.\n */\n\n publicAPI.buildLinks = function (data) {\n var numPts = data.getPoints().getNumberOfPoints();\n var numCells = data.getNumberOfCells(); // fill out lists with number of references to cells\n\n var linkLoc = new Uint32Array(numPts); // Use fast path if polydata\n\n if (data.isA('vtkPolyData')) {\n // traverse data to determine number of uses of each point\n for (var cellId = 0; cellId < numCells; ++cellId) {\n var _data$getCellPoints = data.getCellPoints(cellId),\n cellPointIds = _data$getCellPoints.cellPointIds;\n\n cellPointIds.forEach(function (cellPointId) {\n publicAPI.incrementLinkCount(cellPointId);\n });\n } // now allocate storage for the links\n\n\n publicAPI.allocateLinks(numPts);\n model.maxId = numPts - 1;\n\n var _loop = function _loop(_cellId) {\n var _data$getCellPoints2 = data.getCellPoints(_cellId),\n cellPointIds = _data$getCellPoints2.cellPointIds;\n\n cellPointIds.forEach(function (cellPointId) {\n publicAPI.insertCellReference(cellPointId, linkLoc[cellPointId]++, _cellId);\n });\n };\n\n for (var _cellId = 0; _cellId < numCells; ++_cellId) {\n _loop(_cellId);\n }\n } // any other type of dataset\n else {\n // traverse data to determine number of uses of each point\n for (var _cellId2 = 0; _cellId2 < numCells; _cellId2++) {\n // TODO: Currently not supported: const cell = data.getCell(cellId);\n var cell = vtkCell.newInstance();\n cell.getPointsIds().forEach(function (cellPointId) {\n publicAPI.incrementLinkCount(cellPointId);\n });\n } // now allocate storage for the links\n\n\n publicAPI.allocateLinks(numPts);\n model.maxId = numPts - 1;\n\n var _loop2 = function _loop2(_cellId3) {\n // TODO: Currently not supported: const cell = data.getCell(cellId);\n var cell = vtkCell.newInstance();\n cell.getPointsIds().forEach(function (cellPointId) {\n publicAPI.insertCellReference(cellPointId, linkLoc[cellPointId]++, _cellId3);\n });\n };\n\n for (var _cellId3 = 0; _cellId3 < numCells; ++_cellId3) {\n _loop2(_cellId3);\n }\n } // end else\n\n };\n /**\n * Build the link list array with a provided connectivity array.\n */\n // publicAPI.buildLinks = (data, connectivity) => {};\n\n /**\n * Allocate the specified number of links (i.e., number of points) that\n * will be built.\n */\n\n\n publicAPI.allocate = function (numLinks) {\n var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n model.array = Array(numLinks).fill().map(function () {\n return {\n ncells: 0,\n cells: null\n };\n });\n model.extend = ext;\n model.maxId = -1;\n };\n\n publicAPI.initialize = function () {\n model.array = null;\n };\n /**\n * Get a link structure given a point id.\n */\n\n\n publicAPI.getLink = function (ptId) {\n return model.array[ptId];\n };\n /**\n * Get the number of cells using the point specified by ptId.\n */\n\n\n publicAPI.getNcells = function (ptId) {\n return model.array[ptId].ncells;\n };\n /**\n * Return a list of cell ids using the point.\n */\n\n\n publicAPI.getCells = function (ptId) {\n return model.array[ptId].cells;\n };\n /**\n * Insert a new point into the cell-links data structure. The size parameter\n * is the initial size of the list.\n */\n\n\n publicAPI.insertNextPoint = function (numLinks) {\n model.array.push({\n ncells: numLinks,\n cells: Array(numLinks)\n });\n ++model.maxId;\n };\n /**\n * Insert a cell id into the list of cells (at the end) using the cell id\n * provided. (Make sure to extend the link list (if necessary) using the\n * method resizeCellList().)\n */\n\n\n publicAPI.insertNextCellReference = function (ptId, cellId) {\n model.array[ptId].cells[model.array[ptId].ncells++] = cellId;\n };\n /**\n * Delete point (and storage) by destroying links to using cells.\n */\n\n\n publicAPI.deletePoint = function (ptId) {\n model.array[ptId].ncells = 0;\n model.array[ptId].cells = null;\n };\n /**\n * Delete the reference to the cell (cellId) from the point (ptId). This\n * removes the reference to the cellId from the cell list, but does not\n * resize the list (recover memory with resizeCellList(), if necessary).\n */\n\n\n publicAPI.removeCellReference = function (cellId, ptId) {\n model.array[ptId].cells = model.array[ptId].cells.filter(function (cell) {\n return cell !== cellId;\n });\n model.array[ptId].ncells = model.array[ptId].cells.length;\n };\n /**\n * Add the reference to the cell (cellId) from the point (ptId). This\n * adds a reference to the cellId from the cell list, but does not resize\n * the list (extend memory with resizeCellList(), if necessary).\n */\n\n\n publicAPI.addCellReference = function (cellId, ptId) {\n model.array[ptId].cells[model.array[ptId].ncells++] = cellId;\n };\n /**\n * Change the length of a point's link list (i.e., list of cells using a\n * point) by the size specified.\n */\n\n\n publicAPI.resizeCellList = function (ptId, size) {\n model.array[ptId].cells.length = size;\n };\n /**\n * Reclaim any unused memory.\n */\n\n\n publicAPI.squeeze = function () {\n resize(model, model.maxId + 1);\n };\n /**\n * Reset to a state of no entries without freeing the memory.\n */\n\n\n publicAPI.reset = function () {\n model.maxId = -1;\n };\n /**\n * Standard DeepCopy method. Since this object contains no reference\n * to other objects, there is no ShallowCopy.\n */\n\n\n publicAPI.deepCopy = function (src) {\n model.array = _toConsumableArray(src.array);\n model.extend = src.extend;\n model.maxId = src.maxId;\n };\n /**\n * Increment the count of the number of cells using the point.\n */\n\n\n publicAPI.incrementLinkCount = function (ptId) {\n ++model.array[ptId].ncells;\n };\n\n publicAPI.allocateLinks = function (n) {\n for (var i = 0; i < n; ++i) {\n model.array[i].cells = new Array(model.array[i].ncells);\n }\n };\n /**\n * Insert a cell id into the list of cells using the point.\n */\n\n\n publicAPI.insertCellReference = function (ptId, pos, cellId) {\n model.array[ptId].cells[pos] = cellId;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n array: null,\n // pointer to data\n maxId: 0,\n // maximum index inserted thus far\n extend: 0 // grow array by this point\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n vtkCellLinks(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCellLinks'); // ----------------------------------------------------------------------------\n\nvar vtkCellLinks$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { InitLink, vtkCellLinks$1 as default, extend, newInstance };\n","var CellType = {\n // Linear cells\n VTK_EMPTY_CELL: 0,\n VTK_VERTEX: 1,\n VTK_POLY_VERTEX: 2,\n VTK_LINE: 3,\n VTK_POLY_LINE: 4,\n VTK_TRIANGLE: 5,\n VTK_TRIANGLE_STRIP: 6,\n VTK_POLYGON: 7,\n VTK_PIXEL: 8,\n VTK_QUAD: 9,\n VTK_TETRA: 10,\n VTK_VOXEL: 11,\n VTK_HEXAHEDRON: 12,\n VTK_WEDGE: 13,\n VTK_PYRAMID: 14,\n VTK_PENTAGONAL_PRISM: 15,\n VTK_HEXAGONAL_PRISM: 16,\n // Quadratic, isoparametric cells\n VTK_QUADRATIC_EDGE: 21,\n VTK_QUADRATIC_TRIANGLE: 22,\n VTK_QUADRATIC_QUAD: 23,\n VTK_QUADRATIC_POLYGON: 36,\n VTK_QUADRATIC_TETRA: 24,\n VTK_QUADRATIC_HEXAHEDRON: 25,\n VTK_QUADRATIC_WEDGE: 26,\n VTK_QUADRATIC_PYRAMID: 27,\n VTK_BIQUADRATIC_QUAD: 28,\n VTK_TRIQUADRATIC_HEXAHEDRON: 29,\n VTK_QUADRATIC_LINEAR_QUAD: 30,\n VTK_QUADRATIC_LINEAR_WEDGE: 31,\n VTK_BIQUADRATIC_QUADRATIC_WEDGE: 32,\n VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON: 33,\n VTK_BIQUADRATIC_TRIANGLE: 34,\n // Cubic, isoparametric cell\n VTK_CUBIC_LINE: 35,\n // Special class of cells formed by convex group of points\n VTK_CONVEX_POINT_SET: 41,\n // Polyhedron cell (consisting of polygonal faces)\n VTK_POLYHEDRON: 42,\n // Higher order cells in parametric form\n VTK_PARAMETRIC_CURVE: 51,\n VTK_PARAMETRIC_SURFACE: 52,\n VTK_PARAMETRIC_TRI_SURFACE: 53,\n VTK_PARAMETRIC_QUAD_SURFACE: 54,\n VTK_PARAMETRIC_TETRA_REGION: 55,\n VTK_PARAMETRIC_HEX_REGION: 56,\n // Higher order cells\n VTK_HIGHER_ORDER_EDGE: 60,\n VTK_HIGHER_ORDER_TRIANGLE: 61,\n VTK_HIGHER_ORDER_QUAD: 62,\n VTK_HIGHER_ORDER_POLYGON: 63,\n VTK_HIGHER_ORDER_TETRAHEDRON: 64,\n VTK_HIGHER_ORDER_WEDGE: 65,\n VTK_HIGHER_ORDER_PYRAMID: 66,\n VTK_HIGHER_ORDER_HEXAHEDRON: 67,\n // Arbitrary order Lagrange elements (formulated separated from generic higher order cells)\n VTK_LAGRANGE_CURVE: 68,\n VTK_LAGRANGE_TRIANGLE: 69,\n VTK_LAGRANGE_QUADRILATERAL: 70,\n VTK_LAGRANGE_TETRAHEDRON: 71,\n VTK_LAGRANGE_HEXAHEDRON: 72,\n VTK_LAGRANGE_WEDGE: 73,\n VTK_LAGRANGE_PYRAMID: 74,\n VTK_NUMBER_OF_CELL_TYPES: 75\n}; // This list should contain the cell class names in\n// the same order as in CellType.\n\nvar CellTypesStrings = ['vtkEmptyCell', 'vtkVertex', 'vtkPolyVertex', 'vtkLine', 'vtkPolyLine', 'vtkTriangle', 'vtkTriangleStrip', 'vtkPolygon', 'vtkPixel', 'vtkQuad', 'vtkTetra', 'vtkVoxel', 'vtkHexahedron', 'vtkWedge', 'vtkPyramid', 'vtkPentagonalPrism', 'vtkHexagonalPrism', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkQuadraticEdge', 'vtkQuadraticTriangle', 'vtkQuadraticQuad', 'vtkQuadraticTetra', 'vtkQuadraticHexahedron', 'vtkQuadraticWedge', 'vtkQuadraticPyramid', 'vtkBiQuadraticQuad', 'vtkTriQuadraticHexahedron', 'vtkQuadraticLinearQuad', 'vtkQuadraticLinearWedge', 'vtkBiQuadraticQuadraticWedge', 'vtkBiQuadraticQuadraticHexahedron', 'vtkBiQuadraticTriangle', 'vtkCubicLine', 'vtkQuadraticPolygon', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkConvexPointSet', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkParametricCurve', 'vtkParametricSurface', 'vtkParametricTriSurface', 'vtkParametricQuadSurface', 'vtkParametricTetraRegion', 'vtkParametricHexRegion', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkHigherOrderEdge', 'vtkHigherOrderTriangle', 'vtkHigherOrderQuad', 'vtkHigherOrderPolygon', 'vtkHigherOrderTetrahedron', 'vtkHigherOrderWedge', 'vtkHigherOrderPyramid', 'vtkHigherOrderHexahedron'];\nvar Constants = {\n CellType: CellType,\n CellTypesStrings: CellTypesStrings\n};\n\nexport { CellType, CellTypesStrings, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { CellTypesStrings, CellType } from './CellTypes/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// Global methods\n// ----------------------------------------------------------------------------\n\n/**\n * Given an int (as defined in vtkCellType.h) identifier for a class\n * return it's classname.\n */\n\nfunction getClassNameFromTypeId(typeId) {\n return typeId < CellTypesStrings.length ? CellTypesStrings[typeId] : 'UnknownClass';\n}\n/**\n * Given a data object classname, return it's int identified (as\n * defined in vtkCellType.h)\n */\n\n\nfunction getTypeIdFromClassName(cellTypeString) {\n return CellTypesStrings.findIndex(cellTypeString);\n}\n/**\n * This convenience method is a fast check to determine if a cell type\n * represents a linear or nonlinear cell. This is generally much more\n * efficient than getting the appropriate vtkCell and checking its IsLinear\n * method.\n */\n\n\nfunction isLinear(type) {\n return type < CellType.VTK_QUADRATIC_EDGE || type === CellType.VTK_CONVEX_POINT_SET || type === CellType.VTK_POLYHEDRON;\n}\n\nfunction hasSubCells(cellType) {\n return cellType === CellType.VTK_TRIANGLE_STRIP || cellType === CellType.VTK_POLY_LINE || cellType === CellType.VTK_POLY_VERTEX;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n getClassNameFromTypeId: getClassNameFromTypeId,\n getTypeIdFromClassName: getTypeIdFromClassName,\n isLinear: isLinear,\n hasSubCells: hasSubCells\n}; // ----------------------------------------------------------------------------\n// vtkCellTypes methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCellTypes(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCellTypes');\n /**\n * Allocate memory for this array. Delete old storage only if necessary.\n */\n\n publicAPI.allocate = function () {\n var sz = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 512;\n var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n model.size = sz > 0 ? sz : 1;\n model.extend = ext > 0 ? ext : 1;\n model.maxId = -1;\n model.typeArray = new Uint8Array(sz);\n model.locationArray = new Uint32Array(sz);\n };\n /**\n * Add a cell at specified id.\n */\n\n\n publicAPI.insertCell = function (cellId, type, loc) {\n model.typeArray[cellId] = type;\n model.locationArray[cellId] = loc;\n\n if (cellId > model.maxId) {\n model.maxId = cellId;\n }\n };\n /**\n * Add a cell to the object in the next available slot.\n */\n\n\n publicAPI.insertNextCell = function (type, loc) {\n publicAPI.insertCell(++model.maxId, type, loc);\n return model.maxId;\n };\n /**\n * Specify a group of cell types. This version is provided to maintain\n * backwards compatibility and does a copy of the cellLocations\n */\n\n\n publicAPI.setCellTypes = function (ncells, cellTypes, cellLocations) {\n model.size = ncells;\n model.typeArray = cellTypes;\n model.locationArray = cellLocations;\n model.maxId = ncells - 1;\n };\n /**\n * Return the location of the cell in the associated vtkCellArray.\n */\n\n\n publicAPI.getCellLocation = function (cellId) {\n return model.locationArray[cellId];\n };\n /**\n * Delete cell by setting to nullptr cell type.\n */\n\n\n publicAPI.deleteCell = function (cellId) {\n model.typeArray[cellId] = CellType.VTK_EMPTY_CELL;\n };\n /**\n * Return the number of types in the list.\n */\n\n\n publicAPI.getNumberOfTypes = function () {\n return model.maxId + 1;\n };\n /**\n * Return true if type specified is contained in list; false otherwise.\n */\n\n\n publicAPI.isType = function (type) {\n var numTypes = publicAPI.getNumberOfTypes();\n\n for (var i = 0; i < numTypes; ++i) {\n if (type === publicAPI.getCellType(i)) {\n return true;\n }\n }\n\n return false;\n };\n /**\n * Add the type specified to the end of the list. Range checking is performed.\n */\n\n\n publicAPI.insertNextType = function (type) {\n return publicAPI.insertNextCell(type, -1);\n };\n /**\n * Return the type of cell.\n */\n\n\n publicAPI.getCellType = function (cellId) {\n return model.typeArray[cellId];\n };\n /**\n * Reclaim any extra memory.\n */\n // TODO: publicAPI.squeeze = () => {};\n\n /**\n * Initialize object without releasing memory.\n */\n\n\n publicAPI.reset = function () {\n model.maxId = -1;\n };\n /**\n * Standard DeepCopy method. Since this object contains no reference\n * to other objects, there is no ShallowCopy.\n */\n\n\n publicAPI.deepCopy = function (src) {\n publicAPI.allocate(src.getSize(), src.getExtend());\n model.typeArray.set(src.getTypeArray());\n model.locationArray.set(src.getLocationArray());\n model.maxId = src.getMaxId();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // typeArray: null, // pointer to types array\n // locationArray: null; // pointer to array of offsets\n size: 0,\n // allocated size of data\n maxId: -1,\n // maximum index inserted thus far\n extend: 1000 // grow array by this point\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['size', 'maxId', 'extend']);\n macro.getArray(publicAPI, model, ['typeArray', 'locationArray']);\n vtkCellTypes(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCellTypes'); // ----------------------------------------------------------------------------\n\nvar vtkCellTypes$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkCellTypes$1 as default, extend, newInstance };\n","var IntersectionState = {\n NO_INTERSECTION: 0,\n YES_INTERSECTION: 1,\n ON_LINE: 2\n};\nvar Constants = {\n IntersectionState: IntersectionState\n};\n\nexport { IntersectionState, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './Line/Constants.js';\nimport vtkCell from './Cell.js';\nimport { d as dot, e as distance2BetweenPoints, s as subtract, g as solveLinearSystem } from '../Core/Math/index.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar IntersectionState = Constants.IntersectionState; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction distanceToLine(x, p1, p2) {\n var closestPoint = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var outObj = {\n t: Number.MIN_VALUE,\n distance: 0\n };\n var p21 = [];\n var closest; // Determine appropriate vector\n\n p21[0] = p2[0] - p1[0];\n p21[1] = p2[1] - p1[1];\n p21[2] = p2[2] - p1[2]; // Get parametric location\n\n var num = p21[0] * (x[0] - p1[0]) + p21[1] * (x[1] - p1[1]) + p21[2] * (x[2] - p1[2]);\n var denom = dot(p21, p21); // trying to avoid an expensive fabs\n\n var tolerance = 1e-5 * num;\n\n if (denom !== 0.0) {\n outObj.t = num / denom;\n }\n\n if (tolerance < 0.0) {\n tolerance = -tolerance;\n }\n\n if (-tolerance < denom && denom < tolerance) {\n closest = p1;\n } else if (denom <= 0.0 || outObj.t < 0.0) {\n // If parametric coordinate is within 0<=p<=1, then the point is closest to\n // the line. Otherwise, it's closest to a point at the end of the line.\n closest = p1;\n } else if (outObj.t > 1.0) {\n closest = p2;\n } else {\n closest = p21;\n p21[0] = p1[0] + outObj.t * p21[0];\n p21[1] = p1[1] + outObj.t * p21[1];\n p21[2] = p1[2] + outObj.t * p21[2];\n }\n\n if (closestPoint) {\n closestPoint[0] = closest[0];\n closestPoint[1] = closest[1];\n closestPoint[2] = closest[2];\n }\n\n outObj.distance = distance2BetweenPoints(closest, x);\n return outObj;\n}\n\nfunction intersection(a1, a2, b1, b2, u, v) {\n var a21 = [];\n var b21 = [];\n var b1a1 = [];\n u[0] = 0.0;\n v[0] = 0.0; // Determine line vectors.\n\n subtract(a2, a1, a21);\n subtract(b2, b1, b21);\n subtract(b1, a1, b1a1); // Compute the system (least squares) matrix.\n\n var A = [dot(a21, a21), -dot(a21, b21), -dot(a21, b21), dot(b21, b21)]; // Compute the least squares system constant term.\n\n var c = [];\n c[0] = dot(a21, b1a1);\n c[1] = -dot(b21, b1a1); // Solve the system of equations\n\n if (solveLinearSystem(A, c, 2) === 0) {\n // The lines are colinear. Therefore, one of the four endpoints is the\n // point of closest approach\n var minDist = Number.MAX_VALUE;\n var p = [a1, a2, b1, b2];\n var l1 = [b1, b1, a1, a1];\n var l2 = [b2, b2, a2, a2];\n var uv1 = [v[0], v[0], u[0], u[0]];\n var uv2 = [u[0], u[0], v[0], v[0]];\n var obj;\n\n for (var i = 0; i < 4; i++) {\n obj = distanceToLine(p[i], l1[i], l2[i]);\n\n if (obj.distance < minDist) {\n minDist = obj.distance;\n uv1[i] = obj.t;\n uv2[i] = i % 2;\n }\n }\n\n return IntersectionState.ON_LINE;\n }\n\n u[0] = c[0];\n v[0] = c[1]; // Check parametric coordinates for intersection.\n\n if (u[0] >= 0.0 && u[0] <= 1.0 && v[0] >= 0.0 && v[0] <= 1.0) {\n return IntersectionState.YES_INTERSECTION;\n }\n\n return IntersectionState.NO_INTERSECTION;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n distanceToLine: distanceToLine,\n intersection: intersection\n}; // ----------------------------------------------------------------------------\n// vtkLine methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLine(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLine');\n\n function isBetweenPoints(t) {\n return t >= 0.0 && t <= 1.0;\n }\n\n publicAPI.getCellDimension = function () {\n return 1;\n };\n\n publicAPI.intersectWithLine = function (p1, p2, tol, x, pcoords) {\n var outObj = {\n intersect: 0,\n t: Number.MAX_VALUE,\n subId: 0,\n betweenPoints: null\n };\n pcoords[1] = 0.0;\n pcoords[2] = 0.0;\n var projXYZ = [];\n var a1 = [];\n var a2 = [];\n model.points.getPoint(0, a1);\n model.points.getPoint(1, a2);\n var u = [];\n var v = [];\n var intersect = intersection(p1, p2, a1, a2, u, v);\n outObj.t = u[0];\n outObj.betweenPoints = isBetweenPoints(outObj.t);\n pcoords[0] = v[0];\n\n if (intersect === IntersectionState.YES_INTERSECTION) {\n // make sure we are within tolerance\n for (var i = 0; i < 3; i++) {\n x[i] = a1[i] + pcoords[0] * (a2[i] - a1[i]);\n projXYZ[i] = p1[i] + outObj.t * (p2[i] - p1[i]);\n }\n\n if (distance2BetweenPoints(x, projXYZ) <= tol * tol) {\n outObj.intersect = 1;\n return outObj;\n }\n } else {\n var outDistance; // check to see if it lies within tolerance\n // one of the parametric coords must be outside 0-1\n\n if (outObj.t < 0.0) {\n outDistance = distanceToLine(p1, a1, a2, x);\n\n if (outDistance.distance <= tol * tol) {\n outObj.t = 0.0;\n outObj.intersect = 1;\n outObj.betweenPoints = true; // Intersection is near p1\n\n return outObj;\n }\n\n return outObj;\n }\n\n if (outObj.t > 1.0) {\n outDistance = distanceToLine(p2, a1, a2, x);\n\n if (outDistance.distance <= tol * tol) {\n outObj.t = 1.0;\n outObj.intersect = 1;\n outObj.betweenPoints = true; // Intersection is near p2\n\n return outObj;\n }\n\n return outObj;\n }\n\n if (pcoords[0] < 0.0) {\n pcoords[0] = 0.0;\n outDistance = distanceToLine(a1, p1, p2, x);\n outObj.t = outDistance.t;\n\n if (outDistance.distance <= tol * tol) {\n outObj.intersect = 1;\n return outObj;\n }\n\n return outObj;\n }\n\n if (pcoords[0] > 1.0) {\n pcoords[0] = 1.0;\n outDistance = distanceToLine(a2, p1, p2, x);\n outObj.t = outDistance.t;\n\n if (outDistance.distance <= tol * tol) {\n outObj.intersect = 1;\n return outObj;\n }\n\n return outObj;\n }\n }\n\n return outObj;\n };\n\n publicAPI.evaluateLocation = function (pcoords, x, weights) {\n var a1 = [];\n var a2 = [];\n model.points.getPoint(0, a1);\n model.points.getPoint(1, a2);\n\n for (var i = 0; i < 3; i++) {\n x[i] = a1[i] + pcoords[0] * (a2[i] - a1[i]);\n }\n\n weights[0] = 1.0 - pcoords[0];\n weights[1] = pcoords[0];\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkCell.extend(publicAPI, model, initialValues);\n vtkLine(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkLine'); // ----------------------------------------------------------------------------\n\nvar vtkLine$1 = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkLine$1 as default, extend, newInstance };\n","import vtk from '../../vtk.js';\nimport macro from '../../macros.js';\nimport vtkDataSet from './DataSet.js';\nimport vtkPoints from '../Core/Points.js';\n\n// Global methods\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkPointSet methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPointSet(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPointSet'); // Create empty points\n\n if (!model.points) {\n model.points = vtkPoints.newInstance();\n } else {\n model.points = vtk(model.points);\n }\n\n publicAPI.getNumberOfPoints = function () {\n return model.points.getNumberOfPoints();\n };\n\n publicAPI.getBounds = function () {\n return model.points.getBounds();\n };\n\n publicAPI.computeBounds = function () {\n publicAPI.getBounds();\n };\n\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n superShallowCopy(other, debug);\n model.points = vtkPoints.newInstance();\n model.points.shallowCopy(other.getPoints());\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// points: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkDataSet.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['points']); // Object specific methods\n\n vtkPointSet(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPointSet'); // ----------------------------------------------------------------------------\n\nvar vtkPointSet$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkPointSet$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkCell from './Cell.js';\nimport { d as dot, j as cross, l as normalize, m as multiplyAccumulate, e as distance2BetweenPoints, o as determinant2x2 } from '../Core/Math/index.js';\nimport vtkLine from './Line.js';\nimport vtkPlane from './Plane.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction computeNormalDirection(v1, v2, v3, n) {\n // order is important!!! maintain consistency with triangle vertex order\n var ax = v3[0] - v2[0];\n var ay = v3[1] - v2[1];\n var az = v3[2] - v2[2];\n var bx = v1[0] - v2[0];\n var by = v1[1] - v2[1];\n var bz = v1[2] - v2[2];\n n[0] = ay * bz - az * by;\n n[1] = az * bx - ax * bz;\n n[2] = ax * by - ay * bx;\n}\n\nfunction computeNormal(v1, v2, v3, n) {\n computeNormalDirection(v1, v2, v3, n);\n var length = Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]);\n\n if (length !== 0.0) {\n n[0] /= length;\n n[1] /= length;\n n[2] /= length;\n }\n}\n\nfunction intersectWithTriangle(p1, q1, r1, p2, q2, r2) {\n var tolerance = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 1e-6;\n var coplanar = false;\n var pt1 = [];\n var pt2 = [];\n var surfaceId = [];\n var n1 = [];\n var n2 = []; // Compute supporting plane normals.\n\n computeNormal(p1, q1, r1, n1);\n computeNormal(p2, q2, r2, n2);\n var s1 = -dot(n1, p1);\n var s2 = -dot(n2, p2); // Compute signed distances of points p1, q1, r1 from supporting\n // plane of second triangle.\n\n var dist1 = [dot(n2, p1) + s2, dot(n2, q1) + s2, dot(n2, r1) + s2]; // If signs of all points are the same, all the points lie on the\n // same side of the supporting plane, and we can exit early.\n\n if (dist1[0] * dist1[1] > tolerance && dist1[0] * dist1[2] > tolerance) {\n // vtkDebugMacro(<<\"Same side supporting plane 1!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // Do the same for p2, q2, r2 and supporting plane of first\n // triangle.\n\n\n var dist2 = [dot(n1, p2) + s1, dot(n1, q2) + s1, dot(n1, r2) + s1]; // If signs of all points are the same, all the points lie on the\n // same side of the supporting plane, and we can exit early.\n\n if (dist2[0] * dist2[1] > tolerance && dist2[0] * dist2[2] > tolerance) {\n // vtkDebugMacro(<<\"Same side supporting plane 2!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // Check for coplanarity of the supporting planes.\n\n\n if (Math.abs(n1[0] - n2[0]) < 1e-9 && Math.abs(n1[1] - n2[1]) < 1e-9 && Math.abs(n1[2] - n2[2]) < 1e-9 && Math.abs(s1 - s2) < 1e-9) {\n coplanar = true; // vtkDebugMacro(<<\"Coplanar!\");\n\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // There are more efficient ways to find the intersection line (if\n // it exists), but this is clear enough.\n\n\n var pts1 = [p1, q1, r1];\n var pts2 = [p2, q2, r2]; // Find line of intersection (L = p + t*v) between two planes.\n\n var n1n2 = dot(n1, n2);\n var a = (s1 - s2 * n1n2) / (n1n2 * n1n2 - 1.0);\n var b = (s2 - s1 * n1n2) / (n1n2 * n1n2 - 1.0);\n var p = [a * n1[0] + b * n2[0], a * n1[1] + b * n2[1], a * n1[2] + b * n2[2]];\n var v = cross(n1, n2, []);\n normalize(v);\n var index1 = 0;\n var index2 = 0;\n var t1 = [];\n var t2 = [];\n var ts1 = 50;\n var ts2 = 50;\n\n for (var i = 0; i < 3; i++) {\n var id1 = i;\n var id2 = (i + 1) % 3; // Find t coordinate on line of intersection between two planes.\n\n var val1 = vtkPlane.intersectWithLine(pts1[id1], pts1[id2], p2, n2);\n\n if (val1.intersection && val1.t > 0 - tolerance && val1.t < 1 + tolerance) {\n if (val1.t < 1 + tolerance && val1.t > 1 - tolerance) {\n ts1 = index1;\n }\n\n t1[index1++] = dot(val1.x, v) - dot(p, v);\n }\n\n var val2 = vtkPlane.intersectWithLine(pts2[id1], pts2[id2], p1, n1);\n\n if (val2.intersection && val2.t > 0 - tolerance && val2.t < 1 + tolerance) {\n if (val2.t < 1 + tolerance && val2.t > 1 - tolerance) {\n ts2 = index2;\n }\n\n t2[index2++] = dot(val2.x, v) - dot(p, v);\n }\n } // If the value of the index is greater than 2, the intersecting point\n // actually is intersected by all three edges. In this case, set the two\n // edges to the two edges where the intersecting point is not the end point\n\n\n if (index1 > 2) {\n index1--; // swap\n\n var t12 = t1[2];\n t1[2] = t1[ts1];\n t1[ts1] = t12;\n }\n\n if (index2 > 2) {\n index2--;\n var t22 = t2[2];\n t2[2] = t2[ts2];\n t2[ts2] = t22;\n } // Check if only one edge or all edges intersect the supporting\n // planes intersection.\n\n\n if (index1 !== 2 || index2 !== 2) {\n // vtkDebugMacro(<<\"Only one edge intersecting!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // Check for NaNs\n\n\n if (Number.isNaN(t1[0]) || Number.isNaN(t1[1]) || Number.isNaN(t2[0]) || Number.isNaN(t2[1])) {\n // vtkWarningMacro(<<\"NaNs!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n }\n\n if (t1[0] > t1[1]) {\n // swap\n var t11 = t1[1];\n t1[1] = t1[0];\n t1[0] = t11;\n }\n\n if (t2[0] > t2[1]) {\n // swap\n var t21 = t2[1];\n t2[1] = t2[0];\n t2[0] = t21;\n } // Handle the different interval configuration cases.\n\n\n var tt1;\n var tt2;\n\n if (t1[1] < t2[0] || t2[1] < t1[0]) {\n // vtkDebugMacro(<<\"No Overlap!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n }; // No overlap\n }\n\n if (t1[0] < t2[0]) {\n if (t1[1] < t2[1]) {\n // First point on surface 2, second point on surface 1\n surfaceId[0] = 2;\n surfaceId[1] = 1;\n tt1 = t2[0];\n tt2 = t1[1];\n } else {\n // Both points belong to lines on surface 2\n surfaceId[0] = 2;\n surfaceId[1] = 2;\n tt1 = t2[0];\n tt2 = t2[1];\n }\n } // t1[0] >= t2[0]\n else if (t1[1] < t2[1]) {\n // Both points belong to lines on surface 1\n surfaceId[0] = 1;\n surfaceId[1] = 1;\n tt1 = t1[0];\n tt2 = t1[1];\n } else {\n // First point on surface 1, second point on surface 2\n surfaceId[0] = 1;\n surfaceId[1] = 2;\n tt1 = t1[0];\n tt2 = t2[1];\n } // Create actual intersection points.\n\n\n multiplyAccumulate(p, v, tt1, pt1);\n multiplyAccumulate(p, v, tt2, pt2);\n return {\n intersect: true,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n computeNormalDirection: computeNormalDirection,\n computeNormal: computeNormal,\n intersectWithTriangle: intersectWithTriangle\n}; // ----------------------------------------------------------------------------\n// vtkTriangle methods\n// ----------------------------------------------------------------------------\n\nfunction vtkTriangle(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkTriangle');\n\n publicAPI.getCellDimension = function () {\n return 2;\n };\n\n publicAPI.intersectWithLine = function (p1, p2, tol, x, pcoords) {\n var outObj = {\n subId: 0,\n t: Number.MAX_VALUE,\n intersect: 0,\n betweenPoints: false\n };\n pcoords[2] = 0.0;\n var closestPoint = [];\n var tol2 = tol * tol; // Get normal for triangle\n\n var pt1 = [];\n var pt2 = [];\n var pt3 = [];\n model.points.getPoint(0, pt1);\n model.points.getPoint(1, pt2);\n model.points.getPoint(2, pt3);\n var n = [];\n var weights = [];\n computeNormal(pt1, pt2, pt3, n);\n\n if (n[0] !== 0 || n[1] !== 0 || n[2] !== 0) {\n // Intersect plane of triangle with line\n var plane = vtkPlane.intersectWithLine(p1, p2, pt1, n);\n outObj.betweenPoints = plane.betweenPoints;\n outObj.t = plane.t;\n x[0] = plane.x[0];\n x[1] = plane.x[1];\n x[2] = plane.x[2];\n\n if (!plane.intersection) {\n pcoords[0] = 0.0;\n pcoords[1] = 0.0;\n outObj.intersect = 0;\n return outObj;\n } // Evaluate position\n\n\n var inside = publicAPI.evaluatePosition(x, closestPoint, pcoords, weights);\n\n if (inside.evaluation >= 0) {\n if (inside.dist2 <= tol2) {\n outObj.intersect = 1;\n return outObj;\n }\n\n outObj.intersect = inside.evaluation;\n return outObj;\n }\n } // Normals are null, so the triangle is degenerated and\n // we still need to check intersection between line and\n // the longest edge.\n\n\n var dist2Pt1Pt2 = distance2BetweenPoints(pt1, pt2);\n var dist2Pt2Pt3 = distance2BetweenPoints(pt2, pt3);\n var dist2Pt3Pt1 = distance2BetweenPoints(pt3, pt1);\n\n if (!model.line) {\n model.line = vtkLine.newInstance();\n }\n\n if (dist2Pt1Pt2 > dist2Pt2Pt3 && dist2Pt1Pt2 > dist2Pt3Pt1) {\n model.line.getPoints().setPoint(0, pt1);\n model.line.getPoints().setPoint(1, pt2);\n } else if (dist2Pt2Pt3 > dist2Pt3Pt1 && dist2Pt2Pt3 > dist2Pt1Pt2) {\n model.line.getPoints().setPoint(0, pt2);\n model.line.getPoints().setPoint(1, pt3);\n } else {\n model.line.getPoints().setPoint(0, pt3);\n model.line.getPoints().setPoint(1, pt1);\n }\n\n var intersectLine = model.line.intersectWithLine(p1, p2, tol, x, pcoords);\n outObj.betweenPoints = intersectLine.betweenPoints;\n outObj.t = intersectLine.t;\n\n if (intersectLine.intersect) {\n var pt3Pt1 = [];\n var pt3Pt2 = [];\n var pt3X = []; // Compute r and s manually, using dot and norm.\n\n for (var i = 0; i < 3; i++) {\n pt3Pt1[i] = pt1[i] - pt3[i];\n pt3Pt2[i] = pt2[i] - pt3[i];\n pt3X[i] = x[i] - pt3[i];\n }\n\n pcoords[0] = dot(pt3X, pt3Pt1) / dist2Pt3Pt1;\n pcoords[1] = dot(pt3X, pt3Pt2) / dist2Pt2Pt3;\n outObj.intersect = 1;\n return outObj;\n }\n\n pcoords[0] = 0.0;\n pcoords[1] = 0.0;\n outObj.intersect = 0;\n return outObj;\n };\n\n publicAPI.evaluatePosition = function (x, closestPoint, pcoords, weights) {\n // will return obj\n var outObj = {\n subId: 0,\n dist2: 0,\n evaluation: -1\n };\n var i;\n var j;\n var pt1 = [];\n var pt2 = [];\n var pt3 = [];\n var n = [];\n var fabsn;\n var rhs = [];\n var c1 = [];\n var c2 = [];\n var det = 0;\n var idx = 0;\n var indices = [];\n var dist2Point;\n var dist2Line1;\n var dist2Line2;\n var closest = [];\n var closestPoint1 = [];\n var closestPoint2 = [];\n var cp = [];\n outObj.subId = 0;\n pcoords[2] = 0.0; // Get normal for triangle, only the normal direction is needed, i.e. the\n // normal need not be normalized (unit length)\n //\n\n model.points.getPoint(1, pt1);\n model.points.getPoint(2, pt2);\n model.points.getPoint(0, pt3);\n computeNormalDirection(pt1, pt2, pt3, n); // Project point to plane\n\n vtkPlane.generalizedProjectPoint(x, pt1, n, cp); // Construct matrices. Since we have over determined system, need to find\n // which 2 out of 3 equations to use to develop equations. (Any 2 should\n // work since we've projected point to plane.)\n\n var maxComponent = 0.0;\n\n for (i = 0; i < 3; i++) {\n // trying to avoid an expensive call to fabs()\n if (n[i] < 0) {\n fabsn = -n[i];\n } else {\n fabsn = n[i];\n }\n\n if (fabsn > maxComponent) {\n maxComponent = fabsn;\n idx = i;\n }\n }\n\n for (j = 0, i = 0; i < 3; i++) {\n if (i !== idx) {\n indices[j++] = i;\n }\n }\n\n for (i = 0; i < 2; i++) {\n rhs[i] = cp[indices[i]] - pt3[indices[i]];\n c1[i] = pt1[indices[i]] - pt3[indices[i]];\n c2[i] = pt2[indices[i]] - pt3[indices[i]];\n }\n\n det = determinant2x2(c1, c2);\n\n if (det === 0.0) {\n pcoords[0] = 0.0;\n pcoords[1] = 0.0;\n outObj.evaluation = -1;\n return outObj;\n }\n\n pcoords[0] = determinant2x2(rhs, c2) / det;\n pcoords[1] = determinant2x2(c1, rhs) / det; // Okay, now find closest point to element\n\n weights[0] = 1 - (pcoords[0] + pcoords[1]);\n weights[1] = pcoords[0];\n weights[2] = pcoords[1];\n\n if (weights[0] >= 0.0 && weights[0] <= 1.0 && weights[1] >= 0.0 && weights[1] <= 1.0 && weights[2] >= 0.0 && weights[2] <= 1.0) {\n // projection distance\n if (closestPoint) {\n outObj.dist2 = distance2BetweenPoints(cp, x);\n closestPoint[0] = cp[0];\n closestPoint[1] = cp[1];\n closestPoint[2] = cp[2];\n }\n\n outObj.evaluation = 1;\n } else {\n var t;\n\n if (closestPoint) {\n if (weights[1] < 0.0 && weights[2] < 0.0) {\n dist2Point = distance2BetweenPoints(x, pt3);\n dist2Line1 = vtkLine.distanceToLine(x, pt1, pt3, t, closestPoint1);\n dist2Line2 = vtkLine.distanceToLine(x, pt3, pt2, t, closestPoint2);\n\n if (dist2Point < dist2Line1) {\n outObj.dist2 = dist2Point;\n closest = pt3;\n } else {\n outObj.dist2 = dist2Line1;\n closest = closestPoint1;\n }\n\n if (dist2Line2 < outObj.dist2) {\n outObj.dist2 = dist2Line2;\n closest = closestPoint2;\n }\n\n for (i = 0; i < 3; i++) {\n closestPoint[i] = closest[i];\n }\n } else if (weights[2] < 0.0 && weights[0] < 0.0) {\n dist2Point = distance2BetweenPoints(x, pt1);\n dist2Line1 = vtkLine.distanceToLine(x, pt1, pt3, t, closestPoint1);\n dist2Line2 = vtkLine.distanceToLine(x, pt1, pt2, t, closestPoint2);\n\n if (dist2Point < dist2Line1) {\n outObj.dist2 = dist2Point;\n closest = pt1;\n } else {\n outObj.dist2 = dist2Line1;\n closest = closestPoint1;\n }\n\n if (dist2Line2 < outObj.dist2) {\n outObj.dist2 = dist2Line2;\n closest = closestPoint2;\n }\n\n for (i = 0; i < 3; i++) {\n closestPoint[i] = closest[i];\n }\n } else if (weights[1] < 0.0 && weights[0] < 0.0) {\n dist2Point = distance2BetweenPoints(x, pt2);\n dist2Line1 = vtkLine.distanceToLine(x, pt2, pt3, t, closestPoint1);\n dist2Line2 = vtkLine.distanceToLine(x, pt1, pt2, t, closestPoint2);\n\n if (dist2Point < dist2Line1) {\n outObj.dist2 = dist2Point;\n closest = pt2;\n } else {\n outObj.dist2 = dist2Line1;\n closest = closestPoint1;\n }\n\n if (dist2Line2 < outObj.dist2) {\n outObj.dist2 = dist2Line2;\n closest = closestPoint2;\n }\n\n for (i = 0; i < 3; i++) {\n closestPoint[i] = closest[i];\n }\n } else if (weights[0] < 0.0) {\n var lineDistance = vtkLine.distanceToLine(x, pt1, pt2, closestPoint);\n outObj.dist2 = lineDistance.distance;\n } else if (weights[1] < 0.0) {\n var _lineDistance = vtkLine.distanceToLine(x, pt2, pt3, closestPoint);\n\n outObj.dist2 = _lineDistance.distance;\n } else if (weights[2] < 0.0) {\n var _lineDistance2 = vtkLine.distanceToLine(x, pt1, pt3, closestPoint);\n\n outObj.dist2 = _lineDistance2.distance;\n }\n }\n\n outObj.evaluation = 0;\n }\n\n return outObj;\n };\n\n publicAPI.evaluateLocation = function (pcoords, x, weights) {\n var p0 = [];\n var p1 = [];\n var p2 = [];\n model.points.getPoint(0, p0);\n model.points.getPoint(1, p1);\n model.points.getPoint(2, p2);\n var u3 = 1.0 - pcoords[0] - pcoords[1];\n\n for (var i = 0; i < 3; i++) {\n x[i] = p0[i] * u3 + p1[i] * pcoords[0] + p2[i] * pcoords[1];\n }\n\n weights[0] = u3;\n weights[1] = pcoords[0];\n weights[2] = pcoords[1];\n };\n\n publicAPI.getParametricDistance = function (pcoords) {\n var pDist;\n var pDistMax = 0.0;\n var pc = [];\n pc[0] = pcoords[0];\n pc[1] = pcoords[1];\n pc[2] = 1.0 - pcoords[0] - pcoords[1];\n\n for (var i = 0; i < 3; i++) {\n if (pc[i] < 0.0) {\n pDist = -pc[i];\n } else if (pc[i] > 1.0) {\n pDist = pc[i] - 1.0;\n } else {\n // inside the cell in the parametric direction\n pDist = 0.0;\n }\n\n if (pDist > pDistMax) {\n pDistMax = pDist;\n }\n }\n\n return pDistMax;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkCell.extend(publicAPI, model, initialValues);\n vtkTriangle(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkTriangle'); // ----------------------------------------------------------------------------\n\nvar vtkTriangle$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkTriangle$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtk from '../../vtk.js';\nimport vtkCellArray from '../Core/CellArray.js';\nimport vtkCellLinks from './CellLinks.js';\nimport vtkCellTypes from './CellTypes.js';\nimport vtkLine from './Line.js';\nimport vtkPointSet from './PointSet.js';\nimport vtkTriangle from './Triangle.js';\nimport { CellType } from './CellTypes/Constants.js';\nimport { POLYDATA_FIELDS } from './PolyData/Constants.js';\n\nvar _CELL_FACTORY;\nvar vtkWarningMacro = macro.vtkWarningMacro;\nvar CELL_FACTORY = (_CELL_FACTORY = {}, _defineProperty(_CELL_FACTORY, CellType.VTK_LINE, vtkLine), _defineProperty(_CELL_FACTORY, CellType.VTK_POLY_LINE, vtkLine), _defineProperty(_CELL_FACTORY, CellType.VTK_TRIANGLE, vtkTriangle), _CELL_FACTORY); // ----------------------------------------------------------------------------\n// vtkPolyData methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPolyData(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPolyData');\n\n function camelize(str) {\n return str.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (letter) {\n return letter.toUpperCase();\n }).replace(/\\s+/g, '');\n } // build empty cell arrays and set methods\n\n\n POLYDATA_FIELDS.forEach(function (type) {\n publicAPI[\"getNumberOf\".concat(camelize(type))] = function () {\n return model[type].getNumberOfCells();\n };\n\n if (!model[type]) {\n model[type] = vtkCellArray.newInstance();\n } else {\n model[type] = vtk(model[type]);\n }\n });\n\n publicAPI.getNumberOfCells = function () {\n return POLYDATA_FIELDS.reduce(function (num, cellType) {\n return num + model[cellType].getNumberOfCells();\n }, 0);\n };\n\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n superShallowCopy(other, debug);\n POLYDATA_FIELDS.forEach(function (type) {\n model[type] = vtkCellArray.newInstance();\n model[type].shallowCopy(other.getReferenceByName(type));\n });\n };\n\n publicAPI.buildCells = function () {\n // here are the number of cells we have\n var nVerts = publicAPI.getNumberOfVerts();\n var nLines = publicAPI.getNumberOfLines();\n var nPolys = publicAPI.getNumberOfPolys();\n var nStrips = publicAPI.getNumberOfStrips(); // pre-allocate the space we need\n\n var nCells = nVerts + nLines + nPolys + nStrips;\n var types = new Uint8Array(nCells);\n var pTypes = types;\n var locs = new Uint32Array(nCells);\n var pLocs = locs; // record locations and type of each cell.\n // verts\n\n if (nVerts) {\n var nextCellPts = 0;\n model.verts.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = nextCellPts;\n pTypes[index] = numCellPts > 1 ? CellType.VTK_POLY_VERTEX : CellType.VTK_VERTEX;\n nextCellPts += numCellPts + 1;\n });\n pLocs = pLocs.subarray(nVerts);\n pTypes = pTypes.subarray(nVerts);\n } // lines\n\n\n if (nLines) {\n var _nextCellPts = 0;\n model.lines.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = _nextCellPts;\n pTypes[index] = numCellPts > 2 ? CellType.VTK_POLY_LINE : CellType.VTK_LINE;\n\n if (numCellPts === 1) {\n vtkWarningMacro('Building VTK_LINE ', index, ' with only one point, but VTK_LINE needs at least two points. Check the input.');\n }\n\n _nextCellPts += numCellPts + 1;\n });\n pLocs = pLocs.subarray(nLines);\n pTypes = pTypes.subarray(nLines);\n } // polys\n\n\n if (nPolys) {\n var _nextCellPts2 = 0;\n model.polys.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = _nextCellPts2;\n\n switch (numCellPts) {\n case 3:\n pTypes[index] = CellType.VTK_TRIANGLE;\n break;\n\n case 4:\n pTypes[index] = CellType.VTK_QUAD;\n break;\n\n default:\n pTypes[index] = CellType.VTK_POLYGON;\n break;\n }\n\n if (numCellPts < 3) {\n vtkWarningMacro('Building VTK_TRIANGLE ', index, ' with less than three points, but VTK_TRIANGLE needs at least three points. Check the input.');\n }\n\n _nextCellPts2 += numCellPts + 1;\n });\n pLocs += pLocs.subarray(nPolys);\n pTypes += pTypes.subarray(nPolys);\n } // strips\n\n\n if (nStrips) {\n var _nextCellPts3 = 0;\n pTypes.fill(CellType.VTK_TRIANGLE_STRIP, 0, nStrips);\n model.strips.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = _nextCellPts3;\n _nextCellPts3 += numCellPts + 1;\n });\n } // set up the cell types data structure\n\n\n model.cells = vtkCellTypes.newInstance();\n model.cells.setCellTypes(nCells, types, locs);\n };\n /**\n * Create upward links from points to cells that use each point. Enables\n * topologically complex queries.\n */\n\n\n publicAPI.buildLinks = function () {\n var initialSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (model.cells === undefined) {\n publicAPI.buildCells();\n }\n\n model.links = vtkCellLinks.newInstance();\n\n if (initialSize > 0) {\n model.links.allocate(initialSize);\n } else {\n model.links.allocate(publicAPI.getPoints().getNumberOfPoints());\n }\n\n model.links.buildLinks(publicAPI);\n };\n\n publicAPI.getCellType = function (cellId) {\n return model.cells.getCellType(cellId);\n };\n\n publicAPI.getCellPoints = function (cellId) {\n var cellType = publicAPI.getCellType(cellId);\n var cells = null;\n\n switch (cellType) {\n case CellType.VTK_VERTEX:\n case CellType.VTK_POLY_VERTEX:\n cells = model.verts;\n break;\n\n case CellType.VTK_LINE:\n case CellType.VTK_POLY_LINE:\n cells = model.lines;\n break;\n\n case CellType.VTK_TRIANGLE:\n case CellType.VTK_QUAD:\n case CellType.VTK_POLYGON:\n cells = model.polys;\n break;\n\n case CellType.VTK_TRIANGLE_STRIP:\n cells = model.strips;\n break;\n\n default:\n cells = null;\n return {\n type: 0,\n cellPointIds: null\n };\n }\n\n var loc = model.cells.getCellLocation(cellId);\n var cellPointIds = cells.getCell(loc);\n return {\n cellType: cellType,\n cellPointIds: cellPointIds\n };\n };\n\n publicAPI.getPointCells = function (ptId) {\n return model.links.getCells(ptId);\n };\n\n publicAPI.getCellEdgeNeighbors = function (cellId, point1, point2) {\n var link1 = model.links.getLink(point1);\n var link2 = model.links.getLink(point2);\n return link1.cells.filter(function (cell) {\n return cell !== cellId && link2.cells.indexOf(cell) !== -1;\n });\n };\n /**\n * If you know the type of cell, you may provide it to improve performances.\n */\n\n\n publicAPI.getCell = function (cellId) {\n var cellHint = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var cellInfo = publicAPI.getCellPoints(cellId);\n var cell = cellHint || CELL_FACTORY[cellInfo.cellType].newInstance();\n cell.initialize(publicAPI.getPoints(), cellInfo.cellPointIds);\n return cell;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// verts: null,\n // lines: null,\n // polys: null,\n // strips: null,\n // cells: null,\n // links: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkPointSet.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['cells', 'links']);\n macro.setGet(publicAPI, model, ['verts', 'lines', 'polys', 'strips']); // Object specific methods\n\n vtkPolyData(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPolyData'); // ----------------------------------------------------------------------------\n\nvar vtkPolyData$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { CELL_FACTORY, vtkPolyData$1 as default, extend, newInstance };\n","var POLYDATA_FIELDS = ['verts', 'lines', 'polys', 'strips'];\nvar Constants = {\n POLYDATA_FIELDS: POLYDATA_FIELDS\n};\n\nexport { POLYDATA_FIELDS, Constants as default };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkMatrixBuilder from '../../Common/Core/MatrixBuilder.js';\n\n// vtkCubeSource methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCubeSource(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCubeSource');\n\n function requestData(inData, outData) {\n var _vtkMatrixBuilder$bui;\n\n if (model.deleted) {\n return;\n }\n\n var polyData = vtkPolyData.newInstance();\n outData[0] = polyData;\n var numberOfPolys = 6;\n var numberOfPoints = 24; // Define points\n\n var points = macro.newTypedArray(model.pointType, numberOfPoints * 3);\n polyData.getPoints().setData(points, 3);\n var normals = macro.newTypedArray(model.pointType, numberOfPoints * 3);\n var normalArray = vtkDataArray.newInstance({\n name: 'Normals',\n values: normals,\n numberOfComponents: 3\n });\n polyData.getPointData().setNormals(normalArray);\n var tcdim = 2;\n\n if (model.generate3DTextureCoordinates === true) {\n tcdim = 3;\n }\n\n var textureCoords = macro.newTypedArray(model.pointType, numberOfPoints * tcdim);\n var tcoords = vtkDataArray.newInstance({\n name: 'TextureCoordinates',\n values: textureCoords,\n numberOfComponents: tcdim\n });\n polyData.getPointData().setTCoords(tcoords);\n var x = [0.0, 0.0, 0.0];\n var n = [0.0, 0.0, 0.0];\n var tc = [0.0, 0.0];\n var pointIndex = 0;\n x[0] = -model.xLength / 2.0;\n n[0] = -1.0;\n n[1] = 0.0;\n n[2] = 0.0;\n\n for (var i = 0; i < 2; i++) {\n x[1] = -model.yLength / 2.0;\n\n for (var j = 0; j < 2; j++) {\n tc[1] = x[1] + 0.5;\n x[2] = -model.zLength / 2.0;\n\n for (var k = 0; k < 2; k++) {\n tc[0] = (x[2] + 0.5) * (1 - 2 * i);\n points[pointIndex * 3] = x[0];\n points[pointIndex * 3 + 1] = x[1];\n points[pointIndex * 3 + 2] = x[2];\n normals[pointIndex * 3] = n[0];\n normals[pointIndex * 3 + 1] = n[1];\n normals[pointIndex * 3 + 2] = n[2];\n\n if (tcdim === 2) {\n textureCoords[pointIndex * tcdim] = tc[0];\n textureCoords[pointIndex * tcdim + 1] = tc[1];\n } else {\n textureCoords[pointIndex * tcdim] = 2 * i - 1;\n textureCoords[pointIndex * tcdim + 1] = 2 * j - 1;\n textureCoords[pointIndex * tcdim + 2] = 2 * k - 1;\n }\n\n pointIndex++;\n x[2] += model.zLength;\n }\n\n x[1] += model.yLength;\n }\n\n x[0] += model.xLength;\n n[0] += 2.0;\n }\n\n x[1] = -model.yLength / 2.0;\n n[1] = -1.0;\n n[0] = 0.0;\n n[2] = 0.0;\n\n for (var _i = 0; _i < 2; _i++) {\n x[0] = -model.xLength / 2.0;\n\n for (var _j = 0; _j < 2; _j++) {\n tc[0] = (x[0] + 0.5) * (2 * _i - 1);\n x[2] = -model.zLength / 2.0;\n\n for (var _k = 0; _k < 2; _k++) {\n tc[1] = (x[2] + 0.5) * -1;\n points[pointIndex * 3] = x[0];\n points[pointIndex * 3 + 1] = x[1];\n points[pointIndex * 3 + 2] = x[2];\n normals[pointIndex * 3] = n[0];\n normals[pointIndex * 3 + 1] = n[1];\n normals[pointIndex * 3 + 2] = n[2];\n\n if (tcdim === 2) {\n textureCoords[pointIndex * tcdim] = tc[0];\n textureCoords[pointIndex * tcdim + 1] = tc[1];\n } else {\n textureCoords[pointIndex * tcdim] = 2 * _j - 1;\n textureCoords[pointIndex * tcdim + 1] = 2 * _i - 1;\n textureCoords[pointIndex * tcdim + 2] = 2 * _k - 1;\n }\n\n pointIndex++;\n x[2] += model.zLength;\n }\n\n x[0] += model.xLength;\n }\n\n x[1] += model.yLength;\n n[1] += 2.0;\n }\n\n x[2] = -model.zLength / 2.0;\n n[2] = -1.0;\n n[0] = 0.0;\n n[1] = 0.0;\n\n for (var _i2 = 0; _i2 < 2; _i2++) {\n x[1] = -model.yLength / 2.0;\n\n for (var _j2 = 0; _j2 < 2; _j2++) {\n tc[1] = x[1] + 0.5;\n x[0] = -model.xLength / 2.0;\n\n for (var _k2 = 0; _k2 < 2; _k2++) {\n tc[0] = (x[0] + 0.5) * (2 * _i2 - 1);\n points[pointIndex * 3] = x[0];\n points[pointIndex * 3 + 1] = x[1];\n points[pointIndex * 3 + 2] = x[2];\n normals[pointIndex * 3] = n[0];\n normals[pointIndex * 3 + 1] = n[1];\n normals[pointIndex * 3 + 2] = n[2];\n\n if (tcdim === 2) {\n textureCoords[pointIndex * tcdim] = tc[0];\n textureCoords[pointIndex * tcdim + 1] = tc[1];\n } else {\n textureCoords[pointIndex * tcdim] = 2 * _k2 - 1;\n textureCoords[pointIndex * tcdim + 1] = 2 * _j2 - 1;\n textureCoords[pointIndex * tcdim + 2] = 2 * _i2 - 1;\n }\n\n pointIndex++;\n x[0] += model.xLength;\n }\n\n x[1] += model.yLength;\n }\n\n x[2] += model.zLength;\n n[2] += 2.0;\n } // Apply rotation to the points coordinates and normals\n\n\n vtkMatrixBuilder.buildFromDegree().rotateX(model.rotations[0]).rotateY(model.rotations[1]).rotateZ(model.rotations[2]).apply(points).apply(normals); // Apply transformation to the points coordinates\n\n (_vtkMatrixBuilder$bui = vtkMatrixBuilder.buildFromRadian()).translate.apply(_vtkMatrixBuilder$bui, _toConsumableArray(model.center)).apply(points); // Define quads\n\n\n var polys = new Uint16Array(numberOfPolys * 5);\n polyData.getPolys().setData(polys, 1);\n var polyIndex = 0;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 0;\n polys[polyIndex++] = 1;\n polys[polyIndex++] = 3;\n polys[polyIndex++] = 2;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 6;\n polys[polyIndex++] = 7;\n polys[polyIndex++] = 5;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 8;\n polys[polyIndex++] = 10;\n polys[polyIndex++] = 11;\n polys[polyIndex++] = 9;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 12;\n polys[polyIndex++] = 13;\n polys[polyIndex++] = 15;\n polys[polyIndex++] = 14;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 16;\n polys[polyIndex++] = 18;\n polys[polyIndex++] = 19;\n polys[polyIndex++] = 17;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 20;\n polys[polyIndex++] = 21;\n polys[polyIndex++] = 23;\n polys[polyIndex] = 22;\n }\n\n publicAPI.setBounds = function () {\n var boundsArray = [];\n\n if (Array.isArray(arguments.length <= 0 ? undefined : arguments[0])) {\n boundsArray = arguments.length <= 0 ? undefined : arguments[0];\n } else {\n for (var i = 0; i < arguments.length; i++) {\n boundsArray.push(i < 0 || arguments.length <= i ? undefined : arguments[i]);\n }\n }\n\n if (boundsArray.length !== 6) {\n return;\n }\n\n model.xLength = boundsArray[1] - boundsArray[0];\n model.yLength = boundsArray[3] - boundsArray[2];\n model.zLength = boundsArray[5] - boundsArray[4];\n model.center = [(boundsArray[0] + boundsArray[1]) / 2.0, (boundsArray[2] + boundsArray[3]) / 2.0, (boundsArray[4] + boundsArray[5]) / 2.0];\n }; // Expose methods\n\n\n publicAPI.requestData = requestData;\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n xLength: 1.0,\n yLength: 1.0,\n zLength: 1.0,\n center: [0.0, 0.0, 0.0],\n rotations: [0.0, 0.0, 0.0],\n pointType: 'Float64Array',\n generate3DTextureCoordinates: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['xLength', 'yLength', 'zLength', 'generate3DTextureCoordinates']);\n macro.setGetArray(publicAPI, model, ['center', 'rotations'], 3);\n macro.algo(publicAPI, model, 0, 1);\n vtkCubeSource(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCubeSource'); // ----------------------------------------------------------------------------\n\nvar vtkCubeSource$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCubeSource$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n// vtkAbstractMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkAbstractMapper(publicAPI, model) {\n model.classHierarchy.push('vtkAbstractMapper');\n\n publicAPI.update = function () {\n publicAPI.getInputData();\n };\n\n publicAPI.addClippingPlane = function (plane) {\n if (!plane.isA('vtkPlane')) {\n return false;\n }\n\n if (!model.clippingPlanes.includes(plane)) {\n model.clippingPlanes.push(plane);\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n\n publicAPI.getNumberOfClippingPlanes = function () {\n return model.clippingPlanes.length;\n };\n\n publicAPI.removeAllClippingPlanes = function () {\n if (model.clippingPlanes.length === 0) {\n return false;\n }\n\n model.clippingPlanes.length = 0;\n publicAPI.modified();\n return true;\n };\n\n publicAPI.removeClippingPlane = function (clippingPlane) {\n var i = model.clippingPlanes.indexOf(clippingPlane);\n\n if (i === -1) {\n return false;\n }\n\n model.clippingPlanes.splice(i, 1);\n publicAPI.modified();\n return true;\n };\n\n publicAPI.getClippingPlanes = function () {\n return model.clippingPlanes;\n };\n\n publicAPI.setClippingPlanes = function (planes) {\n if (!planes) {\n return;\n }\n\n if (!Array.isArray(planes)) {\n publicAPI.addClippingPlane(planes);\n } else {\n var nbPlanes = planes.length;\n\n for (var i = 0; i < nbPlanes && i < 6; i++) {\n publicAPI.addClippingPlane(planes[i]);\n }\n }\n };\n\n publicAPI.getClippingPlaneInDataCoords = function (propMatrix, i, hnormal) {\n var clipPlanes = model.clippingPlanes;\n var mat = propMatrix;\n\n if (clipPlanes) {\n var n = clipPlanes.length;\n\n if (i >= 0 && i < n) {\n // Get the plane\n var plane = clipPlanes[i];\n var normal = plane.getNormal();\n var origin = plane.getOrigin(); // Compute the plane equation\n\n var v1 = normal[0];\n var v2 = normal[1];\n var v3 = normal[2];\n var v4 = -(v1 * origin[0] + v2 * origin[1] + v3 * origin[2]); // Transform normal from world to data coords\n\n hnormal[0] = v1 * mat[0] + v2 * mat[4] + v3 * mat[8] + v4 * mat[12];\n hnormal[1] = v1 * mat[1] + v2 * mat[5] + v3 * mat[9] + v4 * mat[13];\n hnormal[2] = v1 * mat[2] + v2 * mat[6] + v3 * mat[10] + v4 * mat[14];\n hnormal[3] = v1 * mat[3] + v2 * mat[7] + v3 * mat[11] + v4 * mat[15];\n return;\n }\n }\n\n macro.vtkErrorMacro(\"Clipping plane index \".concat(i, \" is out of range.\"));\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n clippingPlanes: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.algo(publicAPI, model, 1, 0);\n\n if (!model.clippingPlanes) {\n model.clippingPlanes = [];\n }\n\n vtkAbstractMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar vtkAbstractMapper$1 = {\n extend: extend\n};\n\nexport { vtkAbstractMapper$1 as default, extend };\n","import macro from '../../macros.js';\nimport vtkAbstractMapper from './AbstractMapper.js';\nimport { u as uninitializeBounds } from '../../Common/Core/Math/index.js';\n\n// vtkAbstractMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkAbstractMapper3D(publicAPI, model) {\n publicAPI.getBounds = function () {\n return 0;\n };\n\n publicAPI.getBounds = function (bounds) {\n publicAPI.getBounds();\n\n for (var i = 0; i < 6; i++) {\n bounds[i] = model.bounds[i];\n }\n };\n\n publicAPI.getCenter = function () {\n publicAPI.getBounds();\n\n for (var i = 0; i < 3; i++) {\n model.center[i] = (model.bounds[2 * i + 1] + model.bounds[2 * i]) / 2.0;\n }\n\n return model.center.slice();\n };\n\n publicAPI.getLength = function () {\n var diff = 0.0;\n var l = 0.0;\n publicAPI.getBounds();\n\n for (var i = 0; i < 3; i++) {\n diff = model.bounds[2 * i + 1] - model.bounds[2 * i];\n l += diff * diff;\n }\n\n return Math.sqrt(l);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bounds: [1, -1, 1, -1, 1, -1],\n center: [0, 0, 0],\n viewSpecificProperties: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkAbstractMapper.extend(publicAPI, model, initialValues);\n\n if (!model.bounds) {\n uninitializeBounds(model.bounds);\n }\n\n if (!model.center) {\n model.center = [0.0, 0.0, 0.0];\n }\n\n macro.setGet(publicAPI, model, ['viewSpecificProperties']);\n\n if (!model.viewSpecificProperties) {\n model.viewSpecificProperties = {};\n }\n\n vtkAbstractMapper3D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar vtkAbstractMapper3D$1 = {\n extend: extend\n};\n\nexport { vtkAbstractMapper3D$1 as default, extend };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat4, vec3 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkProp3D from './Prop3D.js';\nimport vtkProperty from './Property.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkActor'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getActors = function () {\n return [publicAPI];\n };\n\n publicAPI.getIsOpaque = function () {\n if (model.forceOpaque) {\n return true;\n }\n\n if (model.forceTranslucent) {\n return false;\n } // make sure we have a property\n\n\n if (!model.property) {\n // force creation of a property\n publicAPI.getProperty();\n }\n\n var isOpaque = model.property.getOpacity() >= 1.0; // are we using an opaque texture, if any?\n\n isOpaque = isOpaque && (!model.texture || !model.texture.isTranslucent()); // are we using an opaque scalar array, if any?\n\n isOpaque = isOpaque && (!model.mapper || model.mapper.getIsOpaque());\n return isOpaque;\n };\n\n publicAPI.hasTranslucentPolygonalGeometry = function () {\n if (model.mapper === null) {\n return false;\n } // make sure we have a property\n\n\n if (model.property === null) {\n // force creation of a property\n publicAPI.setProperty(publicAPI.makeProperty());\n } // is this actor opaque ?\n\n\n return !publicAPI.getIsOpaque();\n };\n\n publicAPI.makeProperty = vtkProperty.newInstance;\n\n publicAPI.getProperty = function () {\n if (model.property === null) {\n model.property = publicAPI.makeProperty();\n }\n\n return model.property;\n };\n\n publicAPI.getBounds = function () {\n if (model.mapper === null) {\n return model.bounds;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.mapper.getBounds();\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n model.bounds = [1, -1, 1, -1, 1, -1];\n model.boundsMTime.modified();\n return bds;\n } // Check if we have cached values for these bounds - we cache the\n // values returned by model.mapper.getBounds() and we store the time\n // of caching. If the values returned this time are different, or\n // the modified time of this class is newer than the cached time,\n // then we need to rebuild.\n\n\n if (!model.mapperBounds || bds[0] !== model.mapperBounds[0] || bds[1] !== model.mapperBounds[1] || bds[2] !== model.mapperBounds[2] || bds[3] !== model.mapperBounds[3] || bds[4] !== model.mapperBounds[4] || bds[5] !== model.mapperBounds[5] || publicAPI.getMTime() > model.boundsMTime.getMTime()) {\n vtkDebugMacro('Recomputing bounds...');\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n /* eslint-disable no-multi-assign */\n\n model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;\n model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;\n /* eslint-enable no-multi-assign */\n\n model.bounds = model.bounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n model.boundsMTime.modified();\n }\n\n return model.bounds;\n };\n\n publicAPI.getMTime = function () {\n var mt = superClass.getMTime();\n\n if (model.property !== null) {\n var time = model.property.getMTime();\n mt = time > mt ? time : mt;\n }\n\n if (model.backfaceProperty !== null) {\n var _time = model.backfaceProperty.getMTime();\n\n mt = _time > mt ? _time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getRedrawMTime = function () {\n var mt = model.mtime;\n\n if (model.mapper !== null) {\n var time = model.mapper.getMTime();\n mt = time > mt ? time : mt;\n\n if (model.mapper.getInput() !== null) {\n // FIXME !!! getInputAlgorithm / getInput\n model.mapper.getInputAlgorithm().update();\n time = model.mapper.getInput().getMTime();\n mt = time > mt ? time : mt;\n }\n }\n\n return mt;\n };\n\n publicAPI.getSupportsSelection = function () {\n return model.mapper ? model.mapper.getSupportsSelection() : false;\n };\n\n publicAPI.processSelectorPixelBuffers = function (selector, pixelOffsets) {\n if (model.mapper && model.mapper.processSelectorPixelBuffers) {\n model.mapper.processSelectorPixelBuffers(selector, pixelOffsets);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n mapper: null,\n property: null,\n backfaceProperty: null,\n forceOpaque: false,\n forceTranslucent: false,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp3D.extend(publicAPI, model, initialValues); // vtkTimeStamp\n\n model.boundsMTime = {};\n macro.obj(model.boundsMTime); // Build VTK API\n\n macro.set(publicAPI, model, ['property']);\n macro.setGet(publicAPI, model, ['backfaceProperty', 'forceOpaque', 'forceTranslucent', 'mapper']); // Object methods\n\n vtkActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkActor'); // ----------------------------------------------------------------------------\n\nvar vtkActor$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkActor$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport { mat4, vec4, vec3, quat } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport { r as radiansFromDegrees, k as add, j as cross } from '../../Common/Core/Math/index.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro;\n/* eslint-disable new-cap */\n\n/*\n * Convenience function to access elements of a gl-matrix. If it turns\n * out I have rows and columns swapped everywhere, then I'll just change\n * the order of 'row' and 'col' parameters in this function\n */\n// function getMatrixElement(matrix, row, col) {\n// const idx = (row * 4) + col;\n// return matrix[idx];\n// }\n// ----------------------------------------------------------------------------\n// vtkCamera methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCamera(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCamera'); // Set up private variables and methods\n\n var origin = new Float64Array(3);\n var dopbasis = new Float64Array([0.0, 0.0, -1.0]);\n var upbasis = new Float64Array([0.0, 1.0, 0.0]);\n var tmpMatrix = mat4.identity(new Float64Array(16));\n var tmpMatrix2 = mat4.identity(new Float64Array(16));\n var tmpvec1 = new Float64Array(3);\n var tmpvec2 = new Float64Array(3);\n var tmpvec3 = new Float64Array(3);\n var rotateMatrix = mat4.identity(new Float64Array(16));\n var trans = mat4.identity(new Float64Array(16));\n var newPosition = new Float64Array(3);\n var newFocalPoint = new Float64Array(3); // Internal Functions that don't need to be public\n\n function computeViewPlaneNormal() {\n // VPN is -DOP\n model.viewPlaneNormal[0] = -model.directionOfProjection[0];\n model.viewPlaneNormal[1] = -model.directionOfProjection[1];\n model.viewPlaneNormal[2] = -model.directionOfProjection[2];\n }\n\n publicAPI.orthogonalizeViewUp = function () {\n var vt = publicAPI.getViewMatrix();\n model.viewUp[0] = vt[4];\n model.viewUp[1] = vt[5];\n model.viewUp[2] = vt[6];\n publicAPI.modified();\n };\n\n publicAPI.setPosition = function (x, y, z) {\n if (x === model.position[0] && y === model.position[1] && z === model.position[2]) {\n return;\n }\n\n model.position[0] = x;\n model.position[1] = y;\n model.position[2] = z; // recompute the focal distance\n\n publicAPI.computeDistance();\n publicAPI.modified();\n };\n\n publicAPI.setFocalPoint = function (x, y, z) {\n if (x === model.focalPoint[0] && y === model.focalPoint[1] && z === model.focalPoint[2]) {\n return;\n }\n\n model.focalPoint[0] = x;\n model.focalPoint[1] = y;\n model.focalPoint[2] = z; // recompute the focal distance\n\n publicAPI.computeDistance();\n publicAPI.modified();\n };\n\n publicAPI.setDistance = function (d) {\n if (model.distance === d) {\n return;\n }\n\n model.distance = d;\n\n if (model.distance < 1e-20) {\n model.distance = 1e-20;\n vtkDebugMacro('Distance is set to minimum.');\n } // we want to keep the camera pointing in the same direction\n\n\n var vec = model.directionOfProjection; // recalculate FocalPoint\n\n model.focalPoint[0] = model.position[0] + vec[0] * model.distance;\n model.focalPoint[1] = model.position[1] + vec[1] * model.distance;\n model.focalPoint[2] = model.position[2] + vec[2] * model.distance;\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n // This method must be called when the focal point or camera position changes\n\n\n publicAPI.computeDistance = function () {\n var dx = model.focalPoint[0] - model.position[0];\n var dy = model.focalPoint[1] - model.position[1];\n var dz = model.focalPoint[2] - model.position[2];\n model.distance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\n if (model.distance < 1e-20) {\n model.distance = 1e-20;\n vtkDebugMacro('Distance is set to minimum.');\n var vec = model.directionOfProjection; // recalculate FocalPoint\n\n model.focalPoint[0] = model.position[0] + vec[0] * model.distance;\n model.focalPoint[1] = model.position[1] + vec[1] * model.distance;\n model.focalPoint[2] = model.position[2] + vec[2] * model.distance;\n }\n\n model.directionOfProjection[0] = dx / model.distance;\n model.directionOfProjection[1] = dy / model.distance;\n model.directionOfProjection[2] = dz / model.distance;\n computeViewPlaneNormal();\n }; //----------------------------------------------------------------------------\n // Move the position of the camera along the view plane normal. Moving\n // towards the focal point (e.g., > 1) is a dolly-in, moving away\n // from the focal point (e.g., < 1) is a dolly-out.\n\n\n publicAPI.dolly = function (amount) {\n if (amount <= 0.0) {\n return;\n } // dolly moves the camera towards the focus\n\n\n var d = model.distance / amount;\n publicAPI.setPosition(model.focalPoint[0] - d * model.directionOfProjection[0], model.focalPoint[1] - d * model.directionOfProjection[1], model.focalPoint[2] - d * model.directionOfProjection[2]);\n };\n\n publicAPI.roll = function (angle) {\n var eye = model.position;\n var at = model.focalPoint;\n var up = model.viewUp;\n var viewUpVec4 = new Float64Array([up[0], up[1], up[2], 0.0]);\n mat4.identity(rotateMatrix);\n var viewDir = new Float64Array([at[0] - eye[0], at[1] - eye[1], at[2] - eye[2]]);\n mat4.rotate(rotateMatrix, rotateMatrix, radiansFromDegrees(angle), viewDir);\n vec4.transformMat4(viewUpVec4, viewUpVec4, rotateMatrix);\n model.viewUp[0] = viewUpVec4[0];\n model.viewUp[1] = viewUpVec4[1];\n model.viewUp[2] = viewUpVec4[2];\n publicAPI.modified();\n };\n\n publicAPI.azimuth = function (angle) {\n var fp = model.focalPoint;\n mat4.identity(trans); // translate the focal point to the origin,\n // rotate about view up,\n // translate back again\n\n mat4.translate(trans, trans, fp);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), model.viewUp);\n mat4.translate(trans, trans, [-fp[0], -fp[1], -fp[2]]); // apply the transform to the position\n\n vec3.transformMat4(newPosition, model.position, trans);\n publicAPI.setPosition(newPosition[0], newPosition[1], newPosition[2]);\n };\n\n publicAPI.yaw = function (angle) {\n var position = model.position;\n mat4.identity(trans); // translate the camera to the origin,\n // rotate about axis,\n // translate back again\n\n mat4.translate(trans, trans, position);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), model.viewUp);\n mat4.translate(trans, trans, [-position[0], -position[1], -position[2]]); // apply the transform to the position\n\n vec3.transformMat4(newFocalPoint, model.focalPoint, trans);\n publicAPI.setFocalPoint(newFocalPoint[0], newFocalPoint[1], newFocalPoint[2]);\n };\n\n publicAPI.elevation = function (angle) {\n var fp = model.focalPoint; // get the eye / camera position from the viewMatrix\n\n var vt = publicAPI.getViewMatrix();\n var axis = [-vt[0], -vt[1], -vt[2]];\n mat4.identity(trans); // translate the focal point to the origin,\n // rotate about view up,\n // translate back again\n\n mat4.translate(trans, trans, fp);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), axis);\n mat4.translate(trans, trans, [-fp[0], -fp[1], -fp[2]]); // apply the transform to the position\n\n vec3.transformMat4(newPosition, model.position, trans);\n publicAPI.setPosition(newPosition[0], newPosition[1], newPosition[2]);\n };\n\n publicAPI.pitch = function (angle) {\n var position = model.position;\n var vt = publicAPI.getViewMatrix();\n var axis = [vt[0], vt[1], vt[2]];\n mat4.identity(trans); // translate the camera to the origin,\n // rotate about axis,\n // translate back again\n\n mat4.translate(trans, trans, position);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), axis);\n mat4.translate(trans, trans, [-position[0], -position[1], -position[2]]); // apply the transform to the focal point\n\n vec3.transformMat4(newFocalPoint, model.focalPoint, trans);\n publicAPI.setFocalPoint.apply(publicAPI, _toConsumableArray(newFocalPoint));\n };\n\n publicAPI.zoom = function (factor) {\n if (factor <= 0) {\n return;\n }\n\n if (model.parallelProjection) {\n model.parallelScale /= factor;\n } else {\n model.viewAngle /= factor;\n }\n\n publicAPI.modified();\n };\n\n publicAPI.translate = function (x, y, z) {\n var offset = [x, y, z];\n add(model.position, offset, model.position);\n add(model.focalPoint, offset, model.focalPoint);\n publicAPI.computeDistance();\n publicAPI.modified();\n };\n\n publicAPI.applyTransform = function (transformMat4) {\n var vuOld = [].concat(_toConsumableArray(model.viewUp), [1.0]);\n var posNew = [];\n var fpNew = [];\n var vuNew = [];\n vuOld[0] += model.position[0];\n vuOld[1] += model.position[1];\n vuOld[2] += model.position[2];\n vec4.transformMat4(posNew, [].concat(_toConsumableArray(model.position), [1.0]), transformMat4);\n vec4.transformMat4(fpNew, [].concat(_toConsumableArray(model.focalPoint), [1.0]), transformMat4);\n vec4.transformMat4(vuNew, vuOld, transformMat4);\n vuNew[0] -= posNew[0];\n vuNew[1] -= posNew[1];\n vuNew[2] -= posNew[2];\n publicAPI.setPosition.apply(publicAPI, _toConsumableArray(posNew.slice(0, 3)));\n publicAPI.setFocalPoint.apply(publicAPI, _toConsumableArray(fpNew.slice(0, 3)));\n publicAPI.setViewUp.apply(publicAPI, _toConsumableArray(vuNew.slice(0, 3)));\n };\n\n publicAPI.getThickness = function () {\n return model.clippingRange[1] - model.clippingRange[0];\n };\n\n publicAPI.setThickness = function (thickness) {\n var t = thickness;\n\n if (t < 1e-20) {\n t = 1e-20;\n vtkDebugMacro('Thickness is set to minimum.');\n }\n\n publicAPI.setClippingRange(model.clippingRange[0], model.clippingRange[0] + t);\n };\n\n publicAPI.setThicknessFromFocalPoint = function (thickness) {\n var t = thickness;\n\n if (t < 1e-20) {\n t = 1e-20;\n vtkDebugMacro('Thickness is set to minimum.');\n }\n\n publicAPI.setClippingRange(model.distance - t / 2, model.distance + t / 2);\n }; // Unimplemented functions\n\n\n publicAPI.setRoll = function (angle) {}; // dependency on GetOrientation() and a model.ViewTransform object, see https://github.com/Kitware/VTK/blob/master/Common/Transforms/vtkTransform.cxx and https://vtk.org/doc/nightly/html/classvtkTransform.html\n\n\n publicAPI.getRoll = function () {};\n\n publicAPI.setObliqueAngles = function (alpha, beta) {};\n\n publicAPI.getOrientation = function () {};\n\n publicAPI.getOrientationWXYZ = function () {};\n\n publicAPI.getFrustumPlanes = function (aspect) {// Return array of 24 params (4 params for each of 6 plane equations)\n };\n\n publicAPI.getCameraLightTransformMatrix = function (matrix) {\n mat4.copy(matrix, model.cameraLightTransform);\n return matrix;\n };\n\n publicAPI.computeCameraLightTransform = function () {\n // not sure if this is the correct transformation, based on the same funciton in VTK\n mat4.copy(tmpMatrix, publicAPI.getViewMatrix());\n mat4.invert(tmpMatrix, tmpMatrix);\n mat4.fromScaling(tmpMatrix2, [model.distance, model.distance, model.distance]);\n mat4.multiply(tmpMatrix, tmpMatrix, tmpMatrix2);\n mat4.identity(model.cameraLightTransform);\n mat4.translate(model.cameraLightTransform, tmpMatrix, [0.0, 0.0, -1.0]);\n };\n\n publicAPI.deepCopy = function (sourceCamera) {};\n\n publicAPI.physicalOrientationToWorldDirection = function (ori) {\n // push the x axis through the orientation quat\n var oriq = quat.fromValues(ori[0], ori[1], ori[2], ori[3]);\n var coriq = quat.create();\n var qdir = quat.fromValues(0.0, 0.0, 1.0, 0.0);\n quat.conjugate(coriq, oriq); // rotate the z axis by the quat\n\n quat.multiply(qdir, oriq, qdir);\n quat.multiply(qdir, qdir, coriq); // return the z axis in world coords\n\n return [qdir[0], qdir[1], qdir[2]];\n };\n\n publicAPI.getPhysicalToWorldMatrix = function (result) {\n publicAPI.getWorldToPhysicalMatrix(result);\n mat4.invert(result, result);\n };\n\n publicAPI.getWorldToPhysicalMatrix = function (result) {\n mat4.identity(result); // now the physical to vtk world rotation tform\n\n var physVRight = [3];\n cross(model.physicalViewNorth, model.physicalViewUp, physVRight);\n result[0] = physVRight[0];\n result[1] = physVRight[1];\n result[2] = physVRight[2];\n result[4] = model.physicalViewUp[0];\n result[5] = model.physicalViewUp[1];\n result[6] = model.physicalViewUp[2];\n result[8] = -model.physicalViewNorth[0];\n result[9] = -model.physicalViewNorth[1];\n result[10] = -model.physicalViewNorth[2];\n mat4.transpose(result, result);\n vec3.set(tmpvec1, 1 / model.physicalScale, 1 / model.physicalScale, 1 / model.physicalScale);\n mat4.scale(result, result, tmpvec1);\n mat4.translate(result, result, model.physicalTranslation);\n };\n\n publicAPI.computeViewParametersFromViewMatrix = function (vmat) {\n // invert to get view to world\n mat4.invert(tmpMatrix, vmat); // note with glmatrix operations happen in\n // the reverse order\n // mat.scale\n // mat.translate\n // will result in the translation then the scale\n // mat.mult(a,b)\n // results in perform the B transformation then A\n // then extract the params position, orientation\n // push 0,0,0 through to get a translation\n\n vec3.transformMat4(tmpvec1, origin, tmpMatrix);\n publicAPI.computeDistance();\n var oldDist = model.distance;\n publicAPI.setPosition(tmpvec1[0], tmpvec1[1], tmpvec1[2]); // push basis vectors to get orientation\n\n vec3.transformMat4(tmpvec2, dopbasis, tmpMatrix);\n vec3.subtract(tmpvec2, tmpvec2, tmpvec1);\n vec3.normalize(tmpvec2, tmpvec2);\n publicAPI.setDirectionOfProjection(tmpvec2[0], tmpvec2[1], tmpvec2[2]);\n vec3.transformMat4(tmpvec3, upbasis, tmpMatrix);\n vec3.subtract(tmpvec3, tmpvec3, tmpvec1);\n vec3.normalize(tmpvec3, tmpvec3);\n publicAPI.setViewUp(tmpvec3[0], tmpvec3[1], tmpvec3[2]);\n publicAPI.setDistance(oldDist);\n }; // the provided matrix should include\n // translation and orientation only\n // mat is physical to view\n\n\n publicAPI.computeViewParametersFromPhysicalMatrix = function (mat) {\n // get the WorldToPhysicalMatrix\n publicAPI.getWorldToPhysicalMatrix(tmpMatrix); // first convert the physical -> view matrix to be\n // world -> view\n\n mat4.multiply(tmpMatrix, mat, tmpMatrix);\n publicAPI.computeViewParametersFromViewMatrix(tmpMatrix);\n };\n\n publicAPI.setViewMatrix = function (mat) {\n model.viewMatrix = mat;\n\n if (model.viewMatrix) {\n mat4.copy(tmpMatrix, model.viewMatrix);\n publicAPI.computeViewParametersFromViewMatrix(tmpMatrix);\n mat4.transpose(model.viewMatrix, model.viewMatrix);\n }\n };\n\n publicAPI.getViewMatrix = function () {\n if (model.viewMatrix) {\n return model.viewMatrix;\n }\n\n mat4.lookAt(tmpMatrix, model.position, // eye\n model.focalPoint, // at\n model.viewUp // up\n );\n mat4.transpose(tmpMatrix, tmpMatrix);\n var result = new Float64Array(16);\n mat4.copy(result, tmpMatrix);\n return result;\n };\n\n publicAPI.setProjectionMatrix = function (mat) {\n model.projectionMatrix = mat;\n };\n\n publicAPI.getProjectionMatrix = function (aspect, nearz, farz) {\n var result = new Float64Array(16);\n mat4.identity(result);\n\n if (model.projectionMatrix) {\n var scale = 1 / model.physicalScale;\n vec3.set(tmpvec1, scale, scale, scale);\n mat4.copy(result, model.projectionMatrix);\n mat4.scale(result, result, tmpvec1);\n mat4.transpose(result, result);\n return result;\n }\n\n mat4.identity(tmpMatrix); // FIXME: Not sure what to do about adjust z buffer here\n // adjust Z-buffer range\n // this->ProjectionTransform->AdjustZBuffer( -1, +1, nearz, farz );\n\n var cWidth = model.clippingRange[1] - model.clippingRange[0];\n var cRange = [model.clippingRange[0] + (nearz + 1) * cWidth / 2.0, model.clippingRange[0] + (farz + 1) * cWidth / 2.0];\n\n if (model.parallelProjection) {\n // set up a rectangular parallelipiped\n var width = model.parallelScale * aspect;\n var height = model.parallelScale;\n var xmin = (model.windowCenter[0] - 1.0) * width;\n var xmax = (model.windowCenter[0] + 1.0) * width;\n var ymin = (model.windowCenter[1] - 1.0) * height;\n var ymax = (model.windowCenter[1] + 1.0) * height;\n mat4.ortho(tmpMatrix, xmin, xmax, ymin, ymax, cRange[0], cRange[1]);\n mat4.transpose(tmpMatrix, tmpMatrix);\n } else if (model.useOffAxisProjection) {\n throw new Error('Off-Axis projection is not supported at this time');\n } else {\n var tmp = Math.tan(radiansFromDegrees(model.viewAngle) / 2.0);\n\n var _width;\n\n var _height;\n\n if (model.useHorizontalViewAngle === true) {\n _width = model.clippingRange[0] * tmp;\n _height = model.clippingRange[0] * tmp / aspect;\n } else {\n _width = model.clippingRange[0] * tmp * aspect;\n _height = model.clippingRange[0] * tmp;\n }\n\n var _xmin = (model.windowCenter[0] - 1.0) * _width;\n\n var _xmax = (model.windowCenter[0] + 1.0) * _width;\n\n var _ymin = (model.windowCenter[1] - 1.0) * _height;\n\n var _ymax = (model.windowCenter[1] + 1.0) * _height;\n\n var znear = cRange[0];\n var zfar = cRange[1];\n tmpMatrix[0] = 2.0 * znear / (_xmax - _xmin);\n tmpMatrix[5] = 2.0 * znear / (_ymax - _ymin);\n tmpMatrix[2] = (_xmin + _xmax) / (_xmax - _xmin);\n tmpMatrix[6] = (_ymin + _ymax) / (_ymax - _ymin);\n tmpMatrix[10] = -(znear + zfar) / (zfar - znear);\n tmpMatrix[14] = -1.0;\n tmpMatrix[11] = -2.0 * znear * zfar / (zfar - znear);\n tmpMatrix[15] = 0.0;\n }\n\n mat4.copy(result, tmpMatrix);\n return result;\n };\n\n publicAPI.getCompositeProjectionMatrix = function (aspect, nearz, farz) {\n var vMat = publicAPI.getViewMatrix();\n var pMat = publicAPI.getProjectionMatrix(aspect, nearz, farz); // mats are transposed so the order is A then B\n // we reuse pMat as it is a copy so we can do what we want with it\n\n mat4.multiply(pMat, vMat, pMat);\n return pMat;\n };\n\n publicAPI.setDirectionOfProjection = function (x, y, z) {\n if (model.directionOfProjection[0] === x && model.directionOfProjection[1] === y && model.directionOfProjection[2] === z) {\n return;\n }\n\n model.directionOfProjection[0] = x;\n model.directionOfProjection[1] = y;\n model.directionOfProjection[2] = z;\n var vec = model.directionOfProjection; // recalculate FocalPoint\n\n model.focalPoint[0] = model.position[0] + vec[0] * model.distance;\n model.focalPoint[1] = model.position[1] + vec[1] * model.distance;\n model.focalPoint[2] = model.position[2] + vec[2] * model.distance;\n computeViewPlaneNormal();\n }; // used to handle convert js device orientation angles\n // when you use this method the camera will adjust to the\n // device orientation such that the physicalViewUp you set\n // in world coordinates looks up, and the physicalViewNorth\n // you set in world coorindates will (maybe) point north\n //\n // NOTE WARNING - much of the documentation out there on how\n // orientation works is seriously wrong. Even worse the Chrome\n // device orientation simulator is completely wrong and should\n // never be used. OMG it is so messed up.\n //\n // how it seems to work on iOS is that the device orientation\n // is specified in extrinsic angles with a alpha, beta, gamma\n // convention with axes of Z, X, Y (the code below substitutes\n // the physical coordinate system for these axes to get the right\n // modified coordinate system.\n\n\n publicAPI.setDeviceAngles = function (alpha, beta, gamma, screen) {\n var physVRight = [3];\n cross(model.physicalViewNorth, model.physicalViewUp, physVRight); // phone to physical coordinates\n\n var rotmat = mat4.identity(new Float64Array(16));\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(alpha), model.physicalViewUp);\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(beta), physVRight);\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(gamma), model.physicalViewNorth);\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(-screen), model.physicalViewUp);\n var dop = new Float64Array([-model.physicalViewUp[0], -model.physicalViewUp[1], -model.physicalViewUp[2]]);\n var vup = new Float64Array(model.physicalViewNorth);\n vec3.transformMat4(dop, dop, rotmat);\n vec3.transformMat4(vup, vup, rotmat);\n publicAPI.setDirectionOfProjection(dop[0], dop[1], dop[2]);\n publicAPI.setViewUp(vup[0], vup[1], vup[2]);\n publicAPI.modified();\n };\n\n publicAPI.setOrientationWXYZ = function (degrees, x, y, z) {\n var quatMat = mat4.identity(new Float64Array(16));\n\n if (degrees !== 0.0 && (x !== 0.0 || y !== 0.0 || z !== 0.0)) {\n // convert to radians\n var angle = radiansFromDegrees(degrees);\n var q = quat.create();\n quat.setAxisAngle(q, [x, y, z], angle);\n mat4.fromQuat(quatMat, q);\n }\n\n var newdop = new Float64Array(3);\n vec3.transformMat4(newdop, [0.0, 0.0, -1.0], quatMat);\n var newvup = new Float64Array(3);\n vec3.transformMat4(newvup, [0.0, 1.0, 0.0], quatMat);\n publicAPI.setDirectionOfProjection.apply(publicAPI, _toConsumableArray(newdop));\n publicAPI.setViewUp.apply(publicAPI, _toConsumableArray(newvup));\n publicAPI.modified();\n };\n\n publicAPI.computeClippingRange = function (bounds) {\n var vn = null;\n var position = null;\n vn = model.viewPlaneNormal;\n position = model.position;\n var a = -vn[0];\n var b = -vn[1];\n var c = -vn[2];\n var d = -(a * position[0] + b * position[1] + c * position[2]); // Set the max near clipping plane and the min far clipping plane\n\n var range = [a * bounds[0] + b * bounds[2] + c * bounds[4] + d, 1e-18]; // Find the closest / farthest bounding box vertex\n\n for (var k = 0; k < 2; k++) {\n for (var j = 0; j < 2; j++) {\n for (var i = 0; i < 2; i++) {\n var dist = a * bounds[i] + b * bounds[2 + j] + c * bounds[4 + k] + d;\n range[0] = dist < range[0] ? dist : range[0];\n range[1] = dist > range[1] ? dist : range[1];\n }\n }\n }\n\n return range;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n position: [0, 0, 1],\n focalPoint: [0, 0, 0],\n viewUp: [0, 1, 0],\n directionOfProjection: [0, 0, -1],\n parallelProjection: false,\n useHorizontalViewAngle: false,\n viewAngle: 30,\n parallelScale: 1,\n clippingRange: [0.01, 1000.01],\n windowCenter: [0, 0],\n viewPlaneNormal: [0, 0, 1],\n useOffAxisProjection: false,\n screenBottomLeft: [-0.5, -0.5, -0.5],\n screenBottomRight: [0.5, -0.5, -0.5],\n screenTopRight: [0.5, 0.5, -0.5],\n freezeFocalPoint: false,\n projectionMatrix: null,\n viewMatrix: null,\n cameraLightTransform: mat4.create(),\n // used for world to physical transformations\n physicalTranslation: [0, 0, 0],\n physicalScale: 1.0,\n physicalViewUp: [0, 1, 0],\n physicalViewNorth: [0, 0, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['distance']);\n macro.setGet(publicAPI, model, ['parallelProjection', 'useHorizontalViewAngle', 'viewAngle', 'parallelScale', 'useOffAxisProjection', 'freezeFocalPoint', 'physicalScale']);\n macro.getArray(publicAPI, model, ['directionOfProjection', 'viewPlaneNormal', 'position', 'focalPoint']);\n macro.setGetArray(publicAPI, model, ['clippingRange', 'windowCenter'], 2);\n macro.setGetArray(publicAPI, model, ['viewUp', 'screenBottomLeft', 'screenBottomRight', 'screenTopRight', 'physicalTranslation', 'physicalViewUp', 'physicalViewNorth'], 3); // Object methods\n\n vtkCamera(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCamera'); // ----------------------------------------------------------------------------\n\nvar vtkCamera$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { DEFAULT_VALUES, vtkCamera$1 as default, extend, newInstance };\n","var ColorSpace = {\n RGB: 0,\n HSV: 1,\n LAB: 2,\n DIVERGING: 3\n};\nvar Scale = {\n LINEAR: 0,\n LOG10: 1\n};\nvar Constants = {\n ColorSpace: ColorSpace,\n Scale: Scale\n};\n\nexport { ColorSpace, Scale, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { h as hsv2rgb, i as isNan, F as isInf, G as rgb2hsv, H as rgb2lab, I as lab2rgb, J as floor } from '../../Common/Core/Math/index.js';\nimport vtkScalarsToColors from '../../Common/Core/ScalarsToColors.js';\nimport Constants from './ColorTransferFunction/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar ColorSpace = Constants.ColorSpace,\n Scale = Constants.Scale;\nvar ScalarMappingTarget = vtkScalarsToColors.ScalarMappingTarget;\nvar vtkDebugMacro = macro.vtkDebugMacro,\n vtkErrorMacro = macro.vtkErrorMacro,\n vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-continue */\n// Convert to and from a special polar version of CIELAB (useful for creating\n// continuous diverging color maps).\n\nfunction vtkColorTransferFunctionLabToMsh(lab, msh) {\n var L = lab[0];\n var a = lab[1];\n var b = lab[2];\n var M = Math.sqrt(L * L + a * a + b * b);\n var s = M > 0.001 ? Math.acos(L / M) : 0.0;\n var h = s > 0.001 ? Math.atan2(b, a) : 0.0;\n msh[0] = M;\n msh[1] = s;\n msh[2] = h;\n}\n\nfunction vtkColorTransferFunctionMshToLab(msh, lab) {\n var M = msh[0];\n var s = msh[1];\n var h = msh[2];\n lab[0] = M * Math.cos(s);\n lab[1] = M * Math.sin(s) * Math.cos(h);\n lab[2] = M * Math.sin(s) * Math.sin(h);\n} // For the case when interpolating from a saturated color to an unsaturated\n// color, find a hue for the unsaturated color that makes sense.\n\n\nfunction vtkColorTransferFunctionAdjustHue(msh, unsatM) {\n if (msh[0] >= unsatM - 0.1) {\n // The best we can do is hold hue constant.\n return msh[2];\n } // This equation is designed to make the perceptual change of the\n // interpolation to be close to constant.\n\n\n var hueSpin = msh[1] * Math.sqrt(unsatM * unsatM - msh[0] * msh[0]) / (msh[0] * Math.sin(msh[1])); // Spin hue away from 0 except in purple hues.\n\n if (msh[2] > -0.3 * Math.PI) {\n return msh[2] + hueSpin;\n }\n\n return msh[2] - hueSpin;\n}\n\nfunction vtkColorTransferFunctionAngleDiff(a1, a2) {\n var adiff = a1 - a2;\n\n if (adiff < 0.0) {\n adiff = -adiff;\n }\n\n while (adiff >= 2.0 * Math.PI) {\n adiff -= 2.0 * Math.PI;\n }\n\n if (adiff > Math.PI) {\n adiff = 2.0 * Math.PI - adiff;\n }\n\n return adiff;\n} // Interpolate a diverging color map.\n\n\nfunction vtkColorTransferFunctionInterpolateDiverging(s, rgb1, rgb2, result) {\n var lab1 = [];\n var lab2 = [];\n rgb2lab(rgb1, lab1);\n rgb2lab(rgb2, lab2);\n var msh1 = [];\n var msh2 = [];\n vtkColorTransferFunctionLabToMsh(lab1, msh1);\n vtkColorTransferFunctionLabToMsh(lab2, msh2); // If the endpoints are distinct saturated colors, then place white in between\n // them.\n\n var localS = s;\n\n if (msh1[1] > 0.05 && msh2[1] > 0.05 && vtkColorTransferFunctionAngleDiff(msh1[2], msh2[2]) > 0.33 * Math.PI) {\n // Insert the white midpoint by setting one end to white and adjusting the\n // scalar value.\n var Mmid = Math.max(msh1[0], msh2[0]);\n Mmid = Math.max(88.0, Mmid);\n\n if (s < 0.5) {\n msh2[0] = Mmid;\n msh2[1] = 0.0;\n msh2[2] = 0.0;\n localS *= 2.0;\n } else {\n msh1[0] = Mmid;\n msh1[1] = 0.0;\n msh1[2] = 0.0;\n localS = 2.0 * localS - 1.0;\n }\n } // If one color has no saturation, then its hue value is invalid. In this\n // case, we want to set it to something logical so that the interpolation of\n // hue makes sense.\n\n\n if (msh1[1] < 0.05 && msh2[1] > 0.05) {\n msh1[2] = vtkColorTransferFunctionAdjustHue(msh2, msh1[0]);\n } else if (msh2[1] < 0.05 && msh1[1] > 0.05) {\n msh2[2] = vtkColorTransferFunctionAdjustHue(msh1, msh2[0]);\n }\n\n var mshTmp = [];\n mshTmp[0] = (1 - localS) * msh1[0] + localS * msh2[0];\n mshTmp[1] = (1 - localS) * msh1[1] + localS * msh2[1];\n mshTmp[2] = (1 - localS) * msh1[2] + localS * msh2[2]; // Now convert back to RGB\n\n var labTmp = [];\n vtkColorTransferFunctionMshToLab(mshTmp, labTmp);\n lab2rgb(labTmp, result);\n} // ----------------------------------------------------------------------------\n// vtkColorTransferFunction methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkColorTransferFunction(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkColorTransferFunction'); // Return the number of points which specify this function\n\n publicAPI.getSize = function () {\n return model.nodes.length;\n }; //----------------------------------------------------------------------------\n // Add a point defined in RGB\n\n\n publicAPI.addRGBPoint = function (x, r, g, b) {\n return publicAPI.addRGBPointLong(x, r, g, b, 0.5, 0.0);\n }; //----------------------------------------------------------------------------\n // Add a point defined in RGB\n\n\n publicAPI.addRGBPointLong = function (x, r, g, b) {\n var midpoint = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.5;\n var sharpness = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0.0;\n\n // Error check\n if (midpoint < 0.0 || midpoint > 1.0) {\n vtkErrorMacro('Midpoint outside range [0.0, 1.0]');\n return -1;\n }\n\n if (sharpness < 0.0 || sharpness > 1.0) {\n vtkErrorMacro('Sharpness outside range [0.0, 1.0]');\n return -1;\n } // remove any node already at this X location\n\n\n if (!model.allowDuplicateScalars) {\n publicAPI.removePoint(x);\n } // Create the new node\n\n\n var node = {\n x: x,\n r: r,\n g: g,\n b: b,\n midpoint: midpoint,\n sharpness: sharpness\n }; // Add it, then sort to get everything in order\n\n model.nodes.push(node);\n publicAPI.sortAndUpdateRange(); // We need to find the index of the node we just added in order\n // to return this value\n\n var i = 0;\n\n for (; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n } // If we didn't find it, something went horribly wrong so\n // return -1\n\n\n if (i < model.nodes.length) {\n return i;\n }\n\n return -1;\n }; //----------------------------------------------------------------------------\n // Add a point defined in HSV\n\n\n publicAPI.addHSVPoint = function (x, h, s, v) {\n return publicAPI.addHSVPointLong(x, h, s, v, 0.5, 0.0);\n }; //----------------------------------------------------------------------------\n // Add a point defined in HSV\n\n\n publicAPI.addHSVPointLong = function (x, h, s, v) {\n var midpoint = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.5;\n var sharpness = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0.0;\n var rgb = [];\n var hsv = [h, s, v];\n hsv2rgb(hsv, rgb);\n return publicAPI.addRGBPoint(x, rgb[0], rgb[1], rgb[2], midpoint, sharpness);\n }; //----------------------------------------------------------------------------\n // Set nodes directly\n\n\n publicAPI.setNodes = function (nodes) {\n if (model.nodes !== nodes) {\n var before = JSON.stringify(model.nodes);\n model.nodes = nodes;\n var after = JSON.stringify(model.nodes);\n\n if (publicAPI.sortAndUpdateRange() || before !== after) {\n publicAPI.modified();\n return true;\n }\n }\n\n return false;\n }; //----------------------------------------------------------------------------\n // Sort the vector in increasing order, then fill in\n // the Range\n\n\n publicAPI.sortAndUpdateRange = function () {\n var before = JSON.stringify(model.nodes);\n model.nodes.sort(function (a, b) {\n return a.x - b.x;\n });\n var after = JSON.stringify(model.nodes);\n var modifiedInvoked = publicAPI.updateRange(); // If range is updated, Modified() has been called, don't call it again.\n\n if (!modifiedInvoked && before !== after) {\n publicAPI.modified();\n return true;\n }\n\n return modifiedInvoked;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.updateRange = function () {\n var oldRange = [2];\n oldRange[0] = model.mappingRange[0];\n oldRange[1] = model.mappingRange[1];\n var size = model.nodes.length;\n\n if (size) {\n model.mappingRange[0] = model.nodes[0].x;\n model.mappingRange[1] = model.nodes[size - 1].x;\n } else {\n model.mappingRange[0] = 0;\n model.mappingRange[1] = 0;\n } // If the range is the same, then no need to call Modified()\n\n\n if (oldRange[0] === model.mappingRange[0] && oldRange[1] === model.mappingRange[1]) {\n return false;\n }\n\n publicAPI.modified();\n return true;\n }; //----------------------------------------------------------------------------\n // Remove a point\n\n\n publicAPI.removePoint = function (x) {\n // First find the node since we need to know its\n // index as our return value\n var i = 0;\n\n for (; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n }\n\n var retVal = i; // If the node doesn't exist, we return -1\n\n if (i >= model.nodes.length) {\n return -1;\n } // If the first or last point has been removed, then we update the range\n // No need to sort here as the order of points hasn't changed.\n\n\n var modifiedInvoked = false;\n model.nodes.splice(i, 1);\n\n if (i === 0 || i === model.nodes.length) {\n modifiedInvoked = publicAPI.updateRange();\n }\n\n if (!modifiedInvoked) {\n publicAPI.modified();\n }\n\n return retVal;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.movePoint = function (oldX, newX) {\n if (oldX === newX) {\n // Nothing to do.\n return;\n }\n\n publicAPI.removePoint(newX);\n\n for (var i = 0; i < model.nodes.length; i++) {\n if (model.nodes[i].x === oldX) {\n model.nodes[i].x = newX;\n publicAPI.sortAndUpdateRange();\n break;\n }\n }\n }; //----------------------------------------------------------------------------\n // Remove all points\n\n\n publicAPI.removeAllPoints = function () {\n model.nodes = [];\n publicAPI.sortAndUpdateRange();\n }; //----------------------------------------------------------------------------\n // Add a line defined in RGB\n\n\n publicAPI.addRGBSegment = function (x1, r1, g1, b1, x2, r2, g2, b2) {\n // First, find all points in this range and remove them\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= x1 && model.nodes[i].x <= x2) {\n model.nodes.splice(i, 1);\n } else {\n i++;\n }\n } // Now add the points\n\n\n publicAPI.addRGBPointLong(x1, r1, g1, b1, 0.5, 0.0);\n publicAPI.addRGBPointLong(x2, r2, g2, b2, 0.5, 0.0);\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n // Add a line defined in HSV\n\n\n publicAPI.addHSVSegment = function (x1, h1, s1, v1, x2, h2, s2, v2) {\n var hsv1 = [h1, s1, v1];\n var hsv2 = [h2, s2, v2];\n var rgb1 = [];\n var rgb2 = [];\n hsv2rgb(hsv1, rgb1);\n hsv2rgb(hsv2, rgb2);\n publicAPI.addRGBSegment(x1, rgb1[0], rgb1[1], rgb1[2], x2, rgb2[0], rgb2[1], rgb2[2]);\n }; //----------------------------------------------------------------------------\n // Returns the RGBA color evaluated at the specified location\n\n\n publicAPI.mapValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return [Math.floor(255.0 * rgb[0] + 0.5), Math.floor(255.0 * rgb[1] + 0.5), Math.floor(255.0 * rgb[2] + 0.5), 255];\n }; //----------------------------------------------------------------------------\n // Returns the RGB color evaluated at the specified location\n\n\n publicAPI.getColor = function (x, rgb) {\n if (model.indexedLookup) {\n var numNodes = publicAPI.getSize(); // todo\n\n var idx = publicAPI.getAnnotatedValueIndexInternal(x);\n\n if (idx < 0 || numNodes === 0) {\n publicAPI.getNanColor(rgb);\n } else {\n var nodeVal = [];\n publicAPI.getNodeValue(idx % numNodes, nodeVal);\n rgb[0] = nodeVal.r;\n rgb[1] = nodeVal.g;\n rgb[2] = nodeVal.b;\n }\n\n return;\n }\n\n publicAPI.getTable(x, x, 1, rgb);\n }; //----------------------------------------------------------------------------\n // Returns the red color evaluated at the specified location\n\n\n publicAPI.getRedValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return rgb[0];\n }; //----------------------------------------------------------------------------\n // Returns the green color evaluated at the specified location\n\n\n publicAPI.getGreenValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return rgb[1];\n }; //----------------------------------------------------------------------------\n // Returns the blue color evaluated at the specified location\n\n\n publicAPI.getBlueValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return rgb[2];\n }; //----------------------------------------------------------------------------\n // Returns a table of RGB colors at regular intervals along the function\n\n\n publicAPI.getTable = function (xStart_, xEnd_, size, table) {\n // To handle BigInt limitation\n var xStart = Number(xStart_);\n var xEnd = Number(xEnd_); // Special case: If either the start or end is a NaN, then all any\n // interpolation done on them is also a NaN. Therefore, fill the table with\n // the NaN color.\n\n if (isNan(xStart) || isNan(xEnd)) {\n for (var i = 0; i < size; i++) {\n table[i * 3 + 0] = model.nanColor[0];\n table[i * 3 + 1] = model.nanColor[1];\n table[i * 3 + 2] = model.nanColor[2];\n }\n\n return;\n }\n\n var idx = 0;\n var numNodes = model.nodes.length; // Need to keep track of the last value so that\n // we can fill in table locations past this with\n // this value if Clamping is On.\n\n var lastR = 0.0;\n var lastG = 0.0;\n var lastB = 0.0;\n\n if (numNodes !== 0) {\n lastR = model.nodes[numNodes - 1].r;\n lastG = model.nodes[numNodes - 1].g;\n lastB = model.nodes[numNodes - 1].b;\n }\n\n var x = 0.0;\n var x1 = 0.0;\n var x2 = 0.0;\n var rgb1 = [0.0, 0.0, 0.0];\n var rgb2 = [0.0, 0.0, 0.0];\n var midpoint = 0.0;\n var sharpness = 0.0;\n var tmpVec = []; // If the scale is logarithmic, make sure the range is valid.\n\n var usingLogScale = model.scale === Scale.LOG10;\n\n if (usingLogScale) {\n // Note: This requires range[0] <= range[1].\n usingLogScale = model.mappingRange[0] > 0.0;\n }\n\n var logStart = 0.0;\n var logEnd = 0.0;\n var logX = 0.0;\n\n if (usingLogScale) {\n logStart = Math.log10(xStart);\n logEnd = Math.log10(xEnd);\n } // For each table entry\n\n\n for (var _i = 0; _i < size; _i++) {\n // Find our location in the table\n var tidx = 3 * _i; // Find our X location. If we are taking only 1 sample, make\n // it halfway between start and end (usually start and end will\n // be the same in this case)\n\n if (size > 1) {\n if (usingLogScale) {\n logX = logStart + _i / (size - 1.0) * (logEnd - logStart);\n x = Math.pow(10.0, logX);\n } else {\n x = xStart + _i / (size - 1.0) * (xEnd - xStart);\n }\n } else if (usingLogScale) {\n logX = 0.5 * (logStart + logEnd);\n x = Math.pow(10.0, logX);\n } else {\n x = 0.5 * (xStart + xEnd);\n } // Linearly map x from mappingRange to [0, numberOfValues-1],\n // discretize (round down to the closest integer),\n // then map back to mappingRange\n\n\n if (model.discretize) {\n var range = model.mappingRange;\n\n if (x >= range[0] && x <= range[1]) {\n var numberOfValues = model.numberOfValues;\n var deltaRange = range[1] - range[0];\n\n if (numberOfValues <= 1) {\n x = range[0] + deltaRange / 2.0;\n } else {\n // normalize x\n var xn = (x - range[0]) / deltaRange; // discretize\n\n var discretizeIndex = floor(numberOfValues * xn); // get discretized x\n\n x = range[0] + discretizeIndex / (numberOfValues - 1) * deltaRange;\n }\n }\n } // Do we need to move to the next node?\n\n\n while (idx < numNodes && x > model.nodes[idx].x) {\n idx++; // If we are at a valid point index, fill in\n // the value at this node, and the one before (the\n // two that surround our current sample location)\n // idx cannot be 0 since we just incremented it.\n\n if (idx < numNodes) {\n x1 = model.nodes[idx - 1].x;\n x2 = model.nodes[idx].x;\n\n if (usingLogScale) {\n x1 = Math.log10(x1);\n x2 = Math.log10(x2);\n }\n\n rgb1[0] = model.nodes[idx - 1].r;\n rgb2[0] = model.nodes[idx].r;\n rgb1[1] = model.nodes[idx - 1].g;\n rgb2[1] = model.nodes[idx].g;\n rgb1[2] = model.nodes[idx - 1].b;\n rgb2[2] = model.nodes[idx].b; // We only need the previous midpoint and sharpness\n // since these control this region\n\n midpoint = model.nodes[idx - 1].midpoint;\n sharpness = model.nodes[idx - 1].sharpness; // Move midpoint away from extreme ends of range to avoid\n // degenerate math\n\n if (midpoint < 0.00001) {\n midpoint = 0.00001;\n }\n\n if (midpoint > 0.99999) {\n midpoint = 0.99999;\n }\n }\n } // Are we at or past the end? If so, just use the last value\n\n\n if (x > model.mappingRange[1]) {\n table[tidx] = 0.0;\n table[tidx + 1] = 0.0;\n table[tidx + 2] = 0.0;\n\n if (model.clamping) {\n if (publicAPI.getUseAboveRangeColor()) {\n table[tidx] = model.aboveRangeColor[0];\n table[tidx + 1] = model.aboveRangeColor[1];\n table[tidx + 2] = model.aboveRangeColor[2];\n } else {\n table[tidx] = lastR;\n table[tidx + 1] = lastG;\n table[tidx + 2] = lastB;\n }\n }\n } else if (x < model.mappingRange[0] || isInf(x) && x < 0) {\n // we are before the first node? If so, duplicate this node's values.\n // We have to deal with -inf here\n table[tidx] = 0.0;\n table[tidx + 1] = 0.0;\n table[tidx + 2] = 0.0;\n\n if (model.clamping) {\n if (publicAPI.getUseBelowRangeColor()) {\n table[tidx] = model.belowRangeColor[0];\n table[tidx + 1] = model.belowRangeColor[1];\n table[tidx + 2] = model.belowRangeColor[2];\n } else if (numNodes > 0) {\n table[tidx] = model.nodes[0].r;\n table[tidx + 1] = model.nodes[0].g;\n table[tidx + 2] = model.nodes[0].b;\n }\n }\n } else if (idx === 0 && (Math.abs(x - xStart) < 1e-6 || model.discretize)) {\n if (numNodes > 0) {\n table[tidx] = model.nodes[0].r;\n table[tidx + 1] = model.nodes[0].g;\n table[tidx + 2] = model.nodes[0].b;\n } else {\n table[tidx] = 0.0;\n table[tidx + 1] = 0.0;\n table[tidx + 2] = 0.0;\n }\n } else {\n // OK, we are between two nodes - interpolate\n // Our first attempt at a normalized location [0,1] -\n // we will be modifying this based on midpoint and\n // sharpness to get the curve shape we want and to have\n // it pass through (y1+y2)/2 at the midpoint.\n var s = 0.0;\n\n if (usingLogScale) {\n s = (logX - x1) / (x2 - x1);\n } else {\n s = (x - x1) / (x2 - x1);\n } // Readjust based on the midpoint - linear adjustment\n\n\n if (s < midpoint) {\n s = 0.5 * s / midpoint;\n } else {\n s = 0.5 + 0.5 * (s - midpoint) / (1.0 - midpoint);\n } // override for sharpness > 0.99\n // In this case we just want piecewise constant\n\n\n if (sharpness > 0.99) {\n // Use the first value since we are below the midpoint\n if (s < 0.5) {\n table[tidx] = rgb1[0];\n table[tidx + 1] = rgb1[1];\n table[tidx + 2] = rgb1[2];\n continue;\n } else {\n // Use the second value at or above the midpoint\n table[tidx] = rgb2[0];\n table[tidx + 1] = rgb2[1];\n table[tidx + 2] = rgb2[2];\n continue;\n }\n } // Override for sharpness < 0.01\n // In this case we want piecewise linear\n\n\n if (sharpness < 0.01) {\n // Simple linear interpolation\n if (model.colorSpace === ColorSpace.RGB) {\n table[tidx] = (1 - s) * rgb1[0] + s * rgb2[0];\n table[tidx + 1] = (1 - s) * rgb1[1] + s * rgb2[1];\n table[tidx + 2] = (1 - s) * rgb1[2] + s * rgb2[2];\n } else if (model.colorSpace === ColorSpace.HSV) {\n var hsv1 = [];\n var hsv2 = [];\n rgb2hsv(rgb1, hsv1);\n rgb2hsv(rgb2, hsv2);\n\n if (model.hSVWrap && (hsv1[0] - hsv2[0] > 0.5 || hsv2[0] - hsv1[0] > 0.5)) {\n if (hsv1[0] > hsv2[0]) {\n hsv1[0] -= 1.0;\n } else {\n hsv2[0] -= 1.0;\n }\n }\n\n var hsvTmp = [];\n hsvTmp[0] = (1.0 - s) * hsv1[0] + s * hsv2[0];\n\n if (hsvTmp[0] < 0.0) {\n hsvTmp[0] += 1.0;\n }\n\n hsvTmp[1] = (1.0 - s) * hsv1[1] + s * hsv2[1];\n hsvTmp[2] = (1.0 - s) * hsv1[2] + s * hsv2[2]; // Now convert this back to RGB\n\n hsv2rgb(hsvTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.LAB) {\n var lab1 = [];\n var lab2 = [];\n rgb2lab(rgb1, lab1);\n rgb2lab(rgb2, lab2);\n var labTmp = [];\n labTmp[0] = (1 - s) * lab1[0] + s * lab2[0];\n labTmp[1] = (1 - s) * lab1[1] + s * lab2[1];\n labTmp[2] = (1 - s) * lab1[2] + s * lab2[2]; // Now convert back to RGB\n\n lab2rgb(labTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.DIVERGING) {\n vtkColorTransferFunctionInterpolateDiverging(s, rgb1, rgb2, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else {\n vtkErrorMacro('ColorSpace set to invalid value.', model.colorSpace);\n }\n\n continue;\n } // We have a sharpness between [0.01, 0.99] - we will\n // used a modified hermite curve interpolation where we\n // derive the slope based on the sharpness, and we compress\n // the curve non-linearly based on the sharpness\n // First, we will adjust our position based on sharpness in\n // order to make the curve sharper (closer to piecewise constant)\n\n\n if (s < 0.5) {\n s = 0.5 * Math.pow(s * 2.0, 1.0 + 10.0 * sharpness);\n } else if (s > 0.5) {\n s = 1.0 - 0.5 * Math.pow((1.0 - s) * 2, 1 + 10.0 * sharpness);\n } // Compute some coefficients we will need for the hermite curve\n\n\n var ss = s * s;\n var sss = ss * s;\n var h1 = 2.0 * sss - 3 * ss + 1;\n var h2 = -2 * sss + 3 * ss;\n var h3 = sss - 2 * ss + s;\n var h4 = sss - ss;\n var slope = void 0;\n var t = void 0;\n\n if (model.colorSpace === ColorSpace.RGB) {\n for (var j = 0; j < 3; j++) {\n // Use one slope for both end points\n slope = rgb2[j] - rgb1[j];\n t = (1.0 - sharpness) * slope; // Compute the value\n\n table[tidx + j] = h1 * rgb1[j] + h2 * rgb2[j] + h3 * t + h4 * t;\n }\n } else if (model.colorSpace === ColorSpace.HSV) {\n var _hsv = [];\n var _hsv2 = [];\n rgb2hsv(rgb1, _hsv);\n rgb2hsv(rgb2, _hsv2);\n\n if (model.hSVWrap && (_hsv[0] - _hsv2[0] > 0.5 || _hsv2[0] - _hsv[0] > 0.5)) {\n if (_hsv[0] > _hsv2[0]) {\n _hsv[0] -= 1.0;\n } else {\n _hsv2[0] -= 1.0;\n }\n }\n\n var _hsvTmp = [];\n\n for (var _j = 0; _j < 3; _j++) {\n // Use one slope for both end points\n slope = _hsv2[_j] - _hsv[_j];\n t = (1.0 - sharpness) * slope; // Compute the value\n\n _hsvTmp[_j] = h1 * _hsv[_j] + h2 * _hsv2[_j] + h3 * t + h4 * t;\n\n if (_j === 0 && _hsvTmp[_j] < 0.0) {\n _hsvTmp[_j] += 1.0;\n }\n } // Now convert this back to RGB\n\n\n hsv2rgb(_hsvTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.LAB) {\n var _lab = [];\n var _lab2 = [];\n rgb2lab(rgb1, _lab);\n rgb2lab(rgb2, _lab2);\n var _labTmp = [];\n\n for (var _j2 = 0; _j2 < 3; _j2++) {\n // Use one slope for both end points\n slope = _lab2[_j2] - _lab[_j2];\n t = (1.0 - sharpness) * slope; // Compute the value\n\n _labTmp[_j2] = h1 * _lab[_j2] + h2 * _lab2[_j2] + h3 * t + h4 * t;\n } // Now convert this back to RGB\n\n\n lab2rgb(_labTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.DIVERGING) {\n // I have not implemented proper interpolation by a hermite curve for\n // the diverging color map, but I cannot think of a good use case for\n // that anyway.\n vtkColorTransferFunctionInterpolateDiverging(s, rgb1, rgb2, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else {\n vtkErrorMacro('ColorSpace set to invalid value.');\n } // Final error check to make sure we don't go outside [0,1]\n\n\n for (var _j3 = 0; _j3 < 3; _j3++) {\n table[tidx + _j3] = table[tidx + _j3] < 0.0 ? 0.0 : table[tidx + _j3];\n table[tidx + _j3] = table[tidx + _j3] > 1.0 ? 1.0 : table[tidx + _j3];\n }\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getUint8Table = function (xStart, xEnd, size) {\n var withAlpha = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (publicAPI.getMTime() <= model.buildTime && model.tableSize === size && model.tableWithAlpha !== withAlpha) {\n return model.table;\n }\n\n if (model.nodes.length === 0) {\n vtkErrorMacro('Attempting to lookup a value with no points in the function');\n return model.table;\n }\n\n var nbChannels = withAlpha ? 4 : 3;\n\n if (model.tableSize !== size || model.tableWithAlpha !== withAlpha) {\n model.table = new Uint8Array(size * nbChannels);\n model.tableSize = size;\n model.tableWithAlpha = withAlpha;\n }\n\n var tmpTable = [];\n publicAPI.getTable(xStart, xEnd, size, tmpTable);\n\n for (var i = 0; i < size; i++) {\n model.table[i * nbChannels + 0] = Math.floor(tmpTable[i * 3 + 0] * 255.0 + 0.5);\n model.table[i * nbChannels + 1] = Math.floor(tmpTable[i * 3 + 1] * 255.0 + 0.5);\n model.table[i * nbChannels + 2] = Math.floor(tmpTable[i * 3 + 2] * 255.0 + 0.5);\n\n if (withAlpha) {\n model.table[i * nbChannels + 3] = 255;\n }\n }\n\n model.buildTime.modified();\n return model.table;\n };\n\n publicAPI.buildFunctionFromArray = function (array) {\n publicAPI.removeAllPoints();\n var numComponents = array.getNumberOfComponents();\n\n for (var i = 0; i < array.getNumberOfTuples(); i++) {\n switch (numComponents) {\n case 3:\n {\n model.nodes.push({\n x: i,\n r: array.getComponent(i, 0),\n g: array.getComponent(i, 1),\n b: array.getComponent(i, 2),\n midpoint: 0.5,\n sharpness: 0.0\n });\n break;\n }\n\n case 4:\n {\n model.nodes.push({\n x: array.getComponent(i, 0),\n r: array.getComponent(i, 1),\n g: array.getComponent(i, 2),\n b: array.getComponent(i, 3),\n midpoint: 0.5,\n sharpness: 0.0\n });\n break;\n }\n\n case 5:\n {\n model.nodes.push({\n x: i,\n r: array.getComponent(i, 0),\n g: array.getComponent(i, 1),\n b: array.getComponent(i, 2),\n midpoint: array.getComponent(i, 4),\n sharpness: array.getComponent(i, 5)\n });\n break;\n }\n\n case 6:\n {\n model.nodes.push({\n x: array.getComponent(i, 0),\n r: array.getComponent(i, 1),\n g: array.getComponent(i, 2),\n b: array.getComponent(i, 3),\n midpoint: array.getComponent(i, 4),\n sharpness: array.getComponent(i, 5)\n });\n break;\n }\n }\n }\n\n publicAPI.sortAndUpdateRange();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.buildFunctionFromTable = function (xStart, xEnd, size, table) {\n var inc = 0.0;\n publicAPI.removeAllPoints();\n\n if (size > 1) {\n inc = (xEnd - xStart) / (size - 1.0);\n }\n\n for (var i = 0; i < size; i++) {\n var node = {\n x: xStart + inc * i,\n r: table[i * 3],\n g: table[i * 3 + 1],\n b: table[i * 3 + 2],\n sharpness: 0.0,\n midpoint: 0.5\n };\n model.nodes.push(node);\n }\n\n publicAPI.sortAndUpdateRange();\n }; //----------------------------------------------------------------------------\n // For a specified index value, get the node parameters\n\n\n publicAPI.getNodeValue = function (index, val) {\n if (index < 0 || index >= model.nodes.length) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n val[0] = model.nodes[index].x;\n val[1] = model.nodes[index].r;\n val[2] = model.nodes[index].g;\n val[3] = model.nodes[index].b;\n val[4] = model.nodes[index].midpoint;\n val[5] = model.nodes[index].sharpness;\n return 1;\n }; //----------------------------------------------------------------------------\n // For a specified index value, get the node parameters\n\n\n publicAPI.setNodeValue = function (index, val) {\n if (index < 0 || index >= model.nodes.length) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n var oldX = model.nodes[index].x;\n model.nodes[index].x = val[0];\n model.nodes[index].r = val[1];\n model.nodes[index].g = val[2];\n model.nodes[index].b = val[3];\n model.nodes[index].midpoint = val[4];\n model.nodes[index].sharpness = val[5];\n\n if (oldX !== val[0]) {\n // The point has been moved, the order of points or the range might have\n // been modified.\n publicAPI.sortAndUpdateRange(); // No need to call Modified() here because SortAndUpdateRange() has done it\n // already.\n } else {\n publicAPI.modified();\n }\n\n return 1;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getNumberOfAvailableColors = function () {\n if (model.indexedLookup && publicAPI.getSize()) {\n return publicAPI.getSize();\n }\n\n if (model.tableSize) {\n // Not sure if this is correct since it is only set if\n // \"const unsigned char *::GetTable(double xStart, double xEnd,int size)\"\n // has been called.\n return model.tableSize;\n }\n\n return 16777216; // 2^24\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getIndexedColor = function (idx, rgba) {\n var n = publicAPI.getSize();\n\n if (n > 0 && idx >= 0) {\n var nodeValue = [];\n publicAPI.getNodeValue(idx % n, nodeValue);\n\n for (var j = 0; j < 3; ++j) {\n rgba[j] = nodeValue[j + 1];\n }\n\n rgba[3] = 1.0; // NodeColor is RGB-only.\n\n return;\n }\n\n publicAPI.getNanColor(rgba);\n rgba[3] = 1.0; // NanColor is RGB-only.\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.fillFromDataPointer = function (nb, ptr) {\n if (nb <= 0 || !ptr) {\n return;\n }\n\n publicAPI.removeAllPoints();\n\n for (var i = 0; i < nb; i++) {\n publicAPI.addRGBPoint(ptr[i * 4], ptr[i * 4 + 1], ptr[i * 4 + 2], ptr[i * 4 + 3]);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setMappingRange = function (min, max) {\n var range = [min, max];\n var originalRange = publicAPI.getRange();\n\n if (originalRange[1] === range[1] && originalRange[0] === range[0]) {\n return;\n }\n\n if (range[1] === range[0]) {\n vtkErrorMacro('attempt to set zero width color range');\n return;\n }\n\n var scale = (range[1] - range[0]) / (originalRange[1] - originalRange[0]);\n var shift = range[0] - originalRange[0] * scale;\n\n for (var i = 0; i < model.nodes.length; ++i) {\n model.nodes[i].x = model.nodes[i].x * scale + shift;\n }\n\n model.mappingRange[0] = range[0];\n model.mappingRange[1] = range[1];\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.adjustRange = function (range) {\n var functionRange = publicAPI.getRange(); // Make sure we have points at each end of the range\n\n var rgb = [];\n\n if (functionRange[0] < range[0]) {\n publicAPI.getColor(range[0], rgb);\n publicAPI.addRGBPoint(range[0], rgb[0], rgb[1], rgb[2]);\n } else {\n publicAPI.getColor(functionRange[0], rgb);\n publicAPI.addRGBPoint(range[0], rgb[0], rgb[1], rgb[2]);\n }\n\n if (functionRange[1] > range[1]) {\n publicAPI.getColor(range[1], rgb);\n publicAPI.addRGBPoint(range[1], rgb[0], rgb[1], rgb[2]);\n } else {\n publicAPI.getColor(functionRange[1], rgb);\n publicAPI.addRGBPoint(range[1], rgb[0], rgb[1], rgb[2]);\n } // Remove all points out-of-range\n\n\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= range[0] && model.nodes[i].x <= range[1]) {\n model.nodes.splice(i, 1);\n } else {\n ++i;\n }\n }\n\n return 1;\n }; //--------------------------------------------------------------------------\n\n\n publicAPI.estimateMinNumberOfSamples = function (x1, x2) {\n var d = publicAPI.findMinimumXDistance();\n return Math.ceil((x2 - x1) / d);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.findMinimumXDistance = function () {\n if (model.nodes.length < 2) {\n return -1.0;\n }\n\n var distance = Number.MAX_VALUE;\n\n for (var i = 0; i < model.nodes.length - 1; i++) {\n var currentDist = model.nodes[i + 1].x - model.nodes[i].x;\n\n if (currentDist < distance) {\n distance = currentDist;\n }\n }\n\n return distance;\n };\n\n publicAPI.mapScalarsThroughTable = function (input, output, outFormat, inputOffset) {\n if (publicAPI.getSize() === 0) {\n vtkDebugMacro('Transfer Function Has No Points!');\n return;\n }\n\n if (model.indexedLookup) {\n publicAPI.mapDataIndexed(input, output, outFormat, inputOffset);\n } else {\n publicAPI.mapData(input, output, outFormat, inputOffset);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.mapData = function (input, output, outFormat, inputOffset) {\n if (publicAPI.getSize() === 0) {\n vtkWarningMacro('Transfer Function Has No Points!');\n return;\n }\n\n var alpha = Math.floor(publicAPI.getAlpha() * 255.0 + 0.5);\n var length = input.getNumberOfTuples();\n var inIncr = input.getNumberOfComponents();\n var outputV = output.getData();\n var inputV = input.getData();\n var rgb = [];\n\n if (outFormat === ScalarMappingTarget.RGBA) {\n for (var i = 0; i < length; i++) {\n var x = inputV[i * inIncr + inputOffset];\n publicAPI.getColor(x, rgb);\n outputV[i * 4] = Math.floor(rgb[0] * 255.0 + 0.5);\n outputV[i * 4 + 1] = Math.floor(rgb[1] * 255.0 + 0.5);\n outputV[i * 4 + 2] = Math.floor(rgb[2] * 255.0 + 0.5);\n outputV[i * 4 + 3] = alpha;\n }\n }\n\n if (outFormat === ScalarMappingTarget.RGB) {\n for (var _i2 = 0; _i2 < length; _i2++) {\n var _x = inputV[_i2 * inIncr + inputOffset];\n publicAPI.getColor(_x, rgb);\n outputV[_i2 * 3] = Math.floor(rgb[0] * 255.0 + 0.5);\n outputV[_i2 * 3 + 1] = Math.floor(rgb[1] * 255.0 + 0.5);\n outputV[_i2 * 3 + 2] = Math.floor(rgb[2] * 255.0 + 0.5);\n }\n }\n\n if (outFormat === ScalarMappingTarget.LUMINANCE) {\n for (var _i3 = 0; _i3 < length; _i3++) {\n var _x2 = inputV[_i3 * inIncr + inputOffset];\n publicAPI.getColor(_x2, rgb);\n outputV[_i3] = Math.floor(rgb[0] * 76.5 + rgb[1] * 150.45 + rgb[2] * 28.05 + 0.5);\n }\n }\n\n if (outFormat === ScalarMappingTarget.LUMINANCE_ALPHA) {\n for (var _i4 = 0; _i4 < length; _i4++) {\n var _x3 = inputV[_i4 * inIncr + inputOffset];\n publicAPI.getColor(_x3, rgb);\n outputV[_i4 * 2] = Math.floor(rgb[0] * 76.5 + rgb[1] * 150.45 + rgb[2] * 28.05 + 0.5);\n outputV[_i4 * 2 + 1] = alpha;\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.applyColorMap = function (colorMap) {\n var oldColorSpace = JSON.stringify(model.colorSpace);\n\n if (colorMap.ColorSpace) {\n model.colorSpace = ColorSpace[colorMap.ColorSpace.toUpperCase()];\n\n if (model.colorSpace === undefined) {\n vtkErrorMacro(\"ColorSpace \".concat(colorMap.ColorSpace, \" not supported, using RGB instead\"));\n model.colorSpace = ColorSpace.RGB;\n }\n }\n\n var isModified = oldColorSpace !== JSON.stringify(model.colorSpace);\n var oldNanColor = isModified || JSON.stringify(model.nanColor);\n\n if (colorMap.NanColor) {\n model.nanColor = [].concat(colorMap.NanColor);\n\n while (model.nanColor.length < 4) {\n model.nanColor.push(1.0);\n }\n }\n\n isModified = isModified || oldNanColor !== JSON.stringify(model.nanColor);\n var oldNodes = isModified || JSON.stringify(model.nodes);\n\n if (colorMap.RGBPoints) {\n var size = colorMap.RGBPoints.length;\n model.nodes = [];\n var midpoint = 0.5;\n var sharpness = 0.0;\n\n for (var i = 0; i < size; i += 4) {\n model.nodes.push({\n x: colorMap.RGBPoints[i],\n r: colorMap.RGBPoints[i + 1],\n g: colorMap.RGBPoints[i + 2],\n b: colorMap.RGBPoints[i + 3],\n midpoint: midpoint,\n sharpness: sharpness\n });\n }\n }\n\n var modifiedInvoked = publicAPI.sortAndUpdateRange();\n var callModified = !modifiedInvoked && (isModified || oldNodes !== JSON.stringify(model.nodes));\n if (callModified) publicAPI.modified();\n return modifiedInvoked || callModified;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n clamping: true,\n colorSpace: ColorSpace.RGB,\n hSVWrap: true,\n scale: Scale.LINEAR,\n nanColor: null,\n belowRangeColor: null,\n aboveRangeColor: null,\n useAboveRangeColor: false,\n useBelowRangeColor: false,\n allowDuplicateScalars: false,\n table: null,\n tableSize: 0,\n buildTime: null,\n nodes: null,\n discretize: false,\n numberOfValues: 256\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkScalarsToColors.extend(publicAPI, model, initialValues); // Internal objects initialization\n\n model.table = [];\n model.nodes = [];\n model.nanColor = [0.5, 0.0, 0.0, 1.0];\n model.belowRangeColor = [0.0, 0.0, 0.0, 1.0];\n model.aboveRangeColor = [1.0, 1.0, 1.0, 1.0];\n model.buildTime = {};\n macro.obj(model.buildTime); // Create get-only macros\n\n macro.get(publicAPI, model, ['buildTime', 'mappingRange']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['useAboveRangeColor', 'useBelowRangeColor', 'colorSpace', 'discretize', 'numberOfValues']);\n macro.setArray(publicAPI, model, ['nanColor', 'belowRangeColor', 'aboveRangeColor'], 4); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['nanColor', 'belowRangeColor', 'aboveRangeColor']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkColorTransferFunction(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkColorTransferFunction'); // ----------------------------------------------------------------------------\n\nvar vtkColorTransferFunction$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkColorTransferFunction$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkAbstractMapper3D from './AbstractMapper3D.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkImageData from '../../Common/DataModel/ImageData.js';\nimport vtkLookupTable from '../../Common/Core/LookupTable.js';\nimport { N as createUninitializedBounds, i as isNan } from '../../Common/Core/Math/index.js';\nimport vtkScalarsToColors from '../../Common/Core/ScalarsToColors/Constants.js';\nimport CoincidentTopologyHelper from './Mapper/CoincidentTopologyHelper.js';\nimport Constants from './Mapper/Constants.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\nimport { PassTypes } from '../OpenGL/HardwareSelector/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar FieldAssociations = vtkDataSet.FieldAssociations;\nvar staticOffsetAPI = CoincidentTopologyHelper.staticOffsetAPI,\n otherStaticMethods = CoincidentTopologyHelper.otherStaticMethods;\nvar ColorMode = Constants.ColorMode,\n ScalarMode = Constants.ScalarMode,\n GetArray = Constants.GetArray;\nvar VectorMode = vtkScalarsToColors.VectorMode;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes; // ----------------------------------------------------------------------------\n\nfunction notImplemented(method) {\n return function () {\n return macro.vtkErrorMacro(\"vtkMapper::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkMapper');\n\n publicAPI.getBounds = function () {\n var input = publicAPI.getInputData();\n\n if (!input) {\n model.bounds = createUninitializedBounds();\n } else {\n if (!model.static) {\n publicAPI.update();\n }\n\n model.bounds = input.getBounds();\n }\n\n return model.bounds;\n };\n\n publicAPI.setForceCompileOnly = function (v) {\n model.forceCompileOnly = v; // make sure we do NOT call modified()\n };\n\n publicAPI.createDefaultLookupTable = function () {\n model.lookupTable = vtkLookupTable.newInstance();\n };\n\n publicAPI.getColorModeAsString = function () {\n return macro.enumToString(ColorMode, model.colorMode);\n };\n\n publicAPI.setColorModeToDefault = function () {\n return publicAPI.setColorMode(0);\n };\n\n publicAPI.setColorModeToMapScalars = function () {\n return publicAPI.setColorMode(1);\n };\n\n publicAPI.setColorModeToDirectScalars = function () {\n return publicAPI.setColorMode(2);\n };\n\n publicAPI.getScalarModeAsString = function () {\n return macro.enumToString(ScalarMode, model.scalarMode);\n };\n\n publicAPI.setScalarModeToDefault = function () {\n return publicAPI.setScalarMode(0);\n };\n\n publicAPI.setScalarModeToUsePointData = function () {\n return publicAPI.setScalarMode(1);\n };\n\n publicAPI.setScalarModeToUseCellData = function () {\n return publicAPI.setScalarMode(2);\n };\n\n publicAPI.setScalarModeToUsePointFieldData = function () {\n return publicAPI.setScalarMode(3);\n };\n\n publicAPI.setScalarModeToUseCellFieldData = function () {\n return publicAPI.setScalarMode(4);\n };\n\n publicAPI.setScalarModeToUseFieldData = function () {\n return publicAPI.setScalarMode(5);\n };\n\n publicAPI.getAbstractScalars = function (input, scalarMode, arrayAccessMode, arrayId, arrayName) {\n // make sure we have an input\n if (!input || !model.scalarVisibility) {\n return {\n scalars: null,\n cellFLag: false\n };\n }\n\n var scalars = null;\n var cellFlag = false; // get and scalar data according to scalar mode\n\n if (scalarMode === ScalarMode.DEFAULT) {\n scalars = input.getPointData().getScalars();\n\n if (!scalars) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n }\n } else if (scalarMode === ScalarMode.USE_POINT_DATA) {\n scalars = input.getPointData().getScalars();\n } else if (scalarMode === ScalarMode.USE_CELL_DATA) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n } else if (scalarMode === ScalarMode.USE_POINT_FIELD_DATA) {\n var pd = input.getPointData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = pd.getArrayByIndex(arrayId);\n } else {\n scalars = pd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_CELL_FIELD_DATA) {\n var cd = input.getCellData();\n cellFlag = true;\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = cd.getArrayByIndex(arrayId);\n } else {\n scalars = cd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_FIELD_DATA) {\n var fd = input.getFieldData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = fd.getArrayByIndex(arrayId);\n } else {\n scalars = fd.getArrayByName(arrayName);\n }\n }\n\n return {\n scalars: scalars,\n cellFlag: cellFlag\n };\n };\n\n publicAPI.mapScalars = function (input, alpha) {\n var scalars = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName).scalars;\n\n if (!scalars) {\n model.colorCoordinates = null;\n model.colorTextureMap = null;\n model.colorMapColors = null;\n return;\n } // we want to only recompute when something has changed\n\n\n var toString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n if (model.colorBuildString === toString) return;\n\n if (!model.useLookupTableScalarRange) {\n publicAPI.getLookupTable().setRange(model.scalarRange[0], model.scalarRange[1]);\n } // Decide between texture color or vertex color.\n // Cell data always uses vertex color.\n // Only point data can use both texture and vertex coloring.\n\n\n if (publicAPI.canUseTextureMapForColoring(input)) {\n publicAPI.mapScalarsToTexture(scalars, alpha);\n } else {\n model.colorCoordinates = null;\n model.colorTextureMap = null;\n var lut = publicAPI.getLookupTable();\n\n if (lut) {\n // Ensure that the lookup table is built\n lut.build();\n model.colorMapColors = lut.mapScalars(scalars, model.colorMode, model.fieldDataTupleId);\n }\n }\n\n model.colorBuildString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n }; //-----------------------------------------------------------------------------\n\n\n publicAPI.scalarToTextureCoordinate = function (scalarValue, // Input scalar\n rangeMin, // range[0]\n invRangeWidth) {\n // 1/(range[1]-range[0])\n var texCoordS = 0.5; // Scalar value is arbitrary when NaN\n\n var texCoordT = 1.0; // 1.0 in t coordinate means NaN\n\n if (!isNan(scalarValue)) {\n // 0.0 in t coordinate means not NaN. So why am I setting it to 0.49?\n // Because when you are mapping scalars and you have a NaN adjacent to\n // anything else, the interpolation everywhere should be NaN. Thus, I\n // want the NaN color everywhere except right on the non-NaN neighbors.\n // To simulate this, I set the t coord for the real numbers close to\n // the threshold so that the interpolation almost immediately looks up\n // the NaN value.\n texCoordT = 0.49;\n texCoordS = (scalarValue - rangeMin) * invRangeWidth; // Some implementations apparently don't handle relatively large\n // numbers (compared to the range [0.0, 1.0]) very well. In fact,\n // values above 1122.0f appear to cause texture wrap-around on\n // some systems even when edge clamping is enabled. Why 1122.0f? I\n // don't know. For safety, we'll clamp at +/- 1000. This will\n // result in incorrect images when the texture value should be\n // above or below 1000, but I don't have a better solution.\n\n if (texCoordS > 1000.0) {\n texCoordS = 1000.0;\n } else if (texCoordS < -1000.0) {\n texCoordS = -1000.0;\n }\n }\n\n return {\n texCoordS: texCoordS,\n texCoordT: texCoordT\n };\n }; //-----------------------------------------------------------------------------\n\n\n publicAPI.createColorTextureCoordinates = function (input, output, numScalars, numComps, component, range, tableRange, tableNumberOfColors, useLogScale) {\n // We have to change the range used for computing texture\n // coordinates slightly to accommodate the special above- and\n // below-range colors that are the first and last texels,\n // respectively.\n var scalarTexelWidth = (range[1] - range[0]) / tableNumberOfColors;\n var paddedRange = [];\n paddedRange[0] = range[0] - scalarTexelWidth;\n paddedRange[1] = range[1] + scalarTexelWidth;\n var invRangeWidth = 1.0 / (paddedRange[1] - paddedRange[0]);\n var outputV = output.getData();\n var inputV = input.getData();\n var count = 0;\n var outputCount = 0;\n\n if (component < 0 || component >= numComps) {\n for (var scalarIdx = 0; scalarIdx < numScalars; ++scalarIdx) {\n var sum = 0;\n\n for (var compIdx = 0; compIdx < numComps; ++compIdx) {\n sum += inputV[count] * inputV[count];\n count++;\n }\n\n var magnitude = Math.sqrt(sum);\n\n if (useLogScale) {\n magnitude = vtkLookupTable.applyLogScale(magnitude, tableRange, range);\n }\n\n var outputs = publicAPI.scalarToTextureCoordinate(magnitude, paddedRange[0], invRangeWidth);\n outputV[outputCount] = outputs.texCoordS;\n outputV[outputCount + 1] = outputs.texCoordT;\n outputCount += 2;\n }\n } else {\n count += component;\n\n for (var _scalarIdx = 0; _scalarIdx < numScalars; ++_scalarIdx) {\n var inputValue = inputV[count];\n\n if (useLogScale) {\n inputValue = vtkLookupTable.applyLogScale(inputValue, tableRange, range);\n }\n\n var _outputs = publicAPI.scalarToTextureCoordinate(inputValue, paddedRange[0], invRangeWidth);\n\n outputV[outputCount] = _outputs.texCoordS;\n outputV[outputCount + 1] = _outputs.texCoordT;\n outputCount += 2;\n count += numComps;\n }\n }\n };\n\n publicAPI.mapScalarsToTexture = function (scalars, alpha) {\n var range = model.lookupTable.getRange();\n var useLogScale = model.lookupTable.usingLogScale();\n\n if (useLogScale) {\n // convert range to log.\n vtkLookupTable.getLogRange(range, range);\n }\n\n var origAlpha = model.lookupTable.getAlpha(); // Get rid of vertex color array. Only texture or vertex coloring\n // can be active at one time. The existence of the array is the\n // signal to use that technique.\n\n model.colorMapColors = null; // If the lookup table has changed, then recreate the color texture map.\n // Set a new lookup table changes this->MTime.\n\n if (model.colorTextureMap == null || publicAPI.getMTime() > model.colorTextureMap.getMTime() || model.lookupTable.getMTime() > model.colorTextureMap.getMTime() || model.lookupTable.getAlpha() !== alpha) {\n model.lookupTable.setAlpha(alpha);\n model.colorTextureMap = null; // Get the texture map from the lookup table.\n // Create a dummy ramp of scalars.\n // In the future, we could extend vtkScalarsToColors.\n\n model.lookupTable.build();\n var numberOfColors = model.lookupTable.getNumberOfAvailableColors();\n\n if (numberOfColors > 4094) {\n numberOfColors = 4094;\n }\n\n numberOfColors += 2;\n var k = (range[1] - range[0]) / (numberOfColors - 1 - 2);\n var newArray = new Float64Array(numberOfColors * 2);\n\n for (var i = 0; i < numberOfColors; ++i) {\n newArray[i] = range[0] + i * k - k; // minus k to start at below range color\n\n if (useLogScale) {\n newArray[i] = Math.pow(10.0, newArray[i]);\n }\n } // Dimension on NaN.\n\n\n for (var _i = 0; _i < numberOfColors; ++_i) {\n newArray[_i + numberOfColors] = NaN;\n }\n\n model.colorTextureMap = vtkImageData.newInstance();\n model.colorTextureMap.setExtent(0, numberOfColors - 1, 0, 1, 0, 0);\n var tmp = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: newArray\n });\n model.colorTextureMap.getPointData().setScalars(model.lookupTable.mapScalars(tmp, model.colorMode, 0));\n model.lookupTable.setAlpha(origAlpha);\n } // Create new coordinates if necessary.\n // Need to compare lookup table in case the range has changed.\n\n\n if (!model.colorCoordinates || publicAPI.getMTime() > model.colorCoordinates.getMTime() || publicAPI.getInputData(0).getMTime() > model.colorCoordinates.getMTime() || model.lookupTable.getMTime() > model.colorCoordinates.getMTime()) {\n // Get rid of old colors\n model.colorCoordinates = null; // Now create the color texture coordinates.\n\n var numComps = scalars.getNumberOfComponents();\n var num = scalars.getNumberOfTuples(); // const fArray = new FloatArray(num * 2);\n\n model.colorCoordinates = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: new Float32Array(num * 2)\n });\n var scalarComponent = model.lookupTable.getVectorComponent(); // Although I like the feature of applying magnitude to single component\n // scalars, it is not how the old MapScalars for vertex coloring works.\n\n if (model.lookupTable.getVectorMode() === VectorMode.MAGNITUDE && scalars.getNumberOfComponents() > 1) {\n scalarComponent = -1;\n }\n\n publicAPI.createColorTextureCoordinates(scalars, model.colorCoordinates, num, numComps, scalarComponent, range, model.lookupTable.getRange(), model.colorTextureMap.getPointData().getScalars().getNumberOfTuples() / 2 - 2, useLogScale);\n }\n };\n\n publicAPI.getIsOpaque = function () {\n var input = publicAPI.getInputData();\n var gasResult = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName);\n var scalars = gasResult.scalars;\n\n if (!model.scalarVisibility || scalars == null) {\n // No scalar colors.\n return true;\n }\n\n var lut = publicAPI.getLookupTable();\n\n if (lut) {\n // Ensure that the lookup table is built\n lut.build();\n return lut.areScalarsOpaque(scalars, model.colorMode, -1);\n }\n\n return true;\n };\n\n publicAPI.canUseTextureMapForColoring = function (input) {\n if (!model.interpolateScalarsBeforeMapping) {\n return false; // user doesn't want us to use texture maps at all.\n } // index color does not use textures\n\n\n if (model.lookupTable && model.lookupTable.getIndexedLookup()) {\n return false;\n }\n\n var gasResult = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName);\n var scalars = gasResult.scalars;\n\n if (!scalars) {\n // no scalars on this dataset, we don't care if texture is used at all.\n return false;\n }\n\n if (gasResult.cellFlag) {\n return false; // cell data colors, don't use textures.\n }\n\n if (model.colorMode === ColorMode.DEFAULT && scalars.getDataType() === VtkDataTypes.UNSIGNED_CHAR || model.colorMode === ColorMode.DIRECT_SCALARS) {\n // Don't use texture is direct coloring using RGB unsigned chars is\n // requested.\n return false;\n }\n\n return true;\n };\n\n publicAPI.clearColorArrays = function () {\n model.colorMapColors = null;\n model.colorCoordinates = null;\n model.colorTextureMap = null;\n };\n\n publicAPI.getLookupTable = function () {\n if (!model.lookupTable) {\n publicAPI.createDefaultLookupTable();\n }\n\n return model.lookupTable;\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.lookupTable !== null) {\n var time = model.lookupTable.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getPrimitiveCount = function () {\n var input = publicAPI.getInputData();\n var pcount = {\n points: input.getPoints().getNumberOfValues() / 3,\n verts: input.getVerts().getNumberOfValues() - input.getVerts().getNumberOfCells(),\n lines: input.getLines().getNumberOfValues() - 2 * input.getLines().getNumberOfCells(),\n triangles: input.getPolys().getNumberOfValues() - 3 * input.getPolys().getNumberOfCells()\n };\n return pcount;\n };\n\n publicAPI.acquireInvertibleLookupTable = notImplemented('AcquireInvertibleLookupTable');\n publicAPI.valueToColor = notImplemented('ValueToColor');\n publicAPI.colorToValue = notImplemented('ColorToValue');\n publicAPI.useInvertibleColorFor = notImplemented('UseInvertibleColorFor');\n publicAPI.clearInvertibleColor = notImplemented('ClearInvertibleColor');\n\n publicAPI.processSelectorPixelBuffers = function (selector, pixelOffsets) {\n /* eslint-disable no-bitwise */\n if (!selector || !model.selectionWebGLIdsToVTKIds || !model.populateSelectionSettings) {\n return;\n }\n\n var rawLowData = selector.getRawPixelBuffer(PassTypes.ID_LOW24);\n var rawHighData = selector.getRawPixelBuffer(PassTypes.ID_HIGH24);\n var currentPass = selector.getCurrentPass();\n var fieldAssociation = selector.getFieldAssociation();\n var idMap = null;\n\n if (fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n idMap = model.selectionWebGLIdsToVTKIds.points;\n } else if (fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_CELLS) {\n idMap = model.selectionWebGLIdsToVTKIds.cells;\n }\n\n if (!idMap) {\n return;\n }\n\n pixelOffsets.forEach(function (pos) {\n if (currentPass === PassTypes.ID_LOW24) {\n var inValue = 0;\n\n if (rawHighData) {\n inValue += rawHighData[pos];\n inValue *= 256;\n }\n\n inValue += rawLowData[pos + 2];\n inValue *= 256;\n inValue += rawLowData[pos + 1];\n inValue *= 256;\n inValue += rawLowData[pos];\n var outValue = idMap[inValue];\n var lowData = selector.getPixelBuffer(PassTypes.ID_LOW24);\n lowData[pos] = outValue & 0xff;\n lowData[pos + 1] = (outValue & 0xff00) >> 8;\n lowData[pos + 2] = (outValue & 0xff0000) >> 16;\n } else if (currentPass === PassTypes.ID_HIGH24 && rawHighData) {\n var _inValue = 0;\n _inValue += rawHighData[pos];\n _inValue *= 256;\n _inValue += rawLowData[pos];\n _inValue *= 256;\n _inValue += rawLowData[pos + 1];\n _inValue *= 256;\n _inValue += rawLowData[pos + 2];\n var _outValue = idMap[_inValue];\n var highData = selector.getPixelBuffer(PassTypes.ID_HIGH24);\n highData[pos] = (_outValue & 0xff000000) >> 24;\n }\n });\n /* eslint-enable no-bitwise */\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n colorMapColors: null,\n // Same as this->Colors\n static: false,\n lookupTable: null,\n scalarVisibility: true,\n scalarRange: [0, 1],\n useLookupTableScalarRange: false,\n colorMode: 0,\n scalarMode: 0,\n arrayAccessMode: 1,\n // By_NAME\n renderTime: 0,\n colorByArrayName: null,\n fieldDataTupleId: -1,\n populateSelectionSettings: true,\n selectionWebGLIdsToVTKIds: null,\n interpolateScalarsBeforeMapping: false,\n colorCoordinates: null,\n colorTextureMap: null,\n forceCompileOnly: 0,\n useInvertibleColors: false,\n invertibleScalars: null,\n customShaderAttributes: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkAbstractMapper3D.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['colorCoordinates', 'colorMapColors', 'colorTextureMap']);\n macro.setGet(publicAPI, model, ['colorByArrayName', 'arrayAccessMode', 'colorMode', 'fieldDataTupleId', 'interpolateScalarsBeforeMapping', 'lookupTable', 'populateSelectionSettings', 'renderTime', 'scalarMode', 'scalarVisibility', 'selectionWebGLIdsToVTKIds', 'static', 'useLookupTableScalarRange', 'customShaderAttributes' // point data array names that will be transferred to the VBO\n ]);\n macro.setGetArray(publicAPI, model, ['scalarRange'], 2);\n CoincidentTopologyHelper.implementCoincidentTopologyMethods(publicAPI, model); // Object methods\n\n vtkMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkMapper'); // ----------------------------------------------------------------------------\n\nvar vtkMapper$1 = _objectSpread(_objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, staticOffsetAPI), otherStaticMethods), Constants);\n\nexport { vtkMapper$1 as default, extend, newInstance };\n","var resolveCoincidentTopologyPolygonOffsetFaces = 1;\nvar resolveCoincidentTopology = 0;\nvar RESOLVE_COINCIDENT_TOPOLOGY_MODE = ['VTK_RESOLVE_OFF', 'VTK_RESOLVE_POLYGON_OFFSET'];\nfunction getResolveCoincidentTopologyPolygonOffsetFaces() {\n return resolveCoincidentTopologyPolygonOffsetFaces;\n}\nfunction setResolveCoincidentTopologyPolygonOffsetFaces(value) {\n resolveCoincidentTopologyPolygonOffsetFaces = value;\n}\nfunction getResolveCoincidentTopology() {\n return resolveCoincidentTopology;\n}\nfunction setResolveCoincidentTopology() {\n var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n resolveCoincidentTopology = mode;\n}\nfunction setResolveCoincidentTopologyToDefault() {\n setResolveCoincidentTopology(0); // VTK_RESOLVE_OFF\n}\nfunction setResolveCoincidentTopologyToOff() {\n setResolveCoincidentTopology(0); // VTK_RESOLVE_OFF\n}\nfunction setResolveCoincidentTopologyToPolygonOffset() {\n setResolveCoincidentTopology(1); // VTK_RESOLVE_POLYGON_OFFSET\n}\nfunction getResolveCoincidentTopologyAsString() {\n return RESOLVE_COINCIDENT_TOPOLOGY_MODE[resolveCoincidentTopology];\n}\nvar otherStaticMethods = {\n getResolveCoincidentTopologyAsString: getResolveCoincidentTopologyAsString,\n getResolveCoincidentTopologyPolygonOffsetFaces: getResolveCoincidentTopologyPolygonOffsetFaces,\n getResolveCoincidentTopology: getResolveCoincidentTopology,\n setResolveCoincidentTopology: setResolveCoincidentTopology,\n setResolveCoincidentTopologyPolygonOffsetFaces: setResolveCoincidentTopologyPolygonOffsetFaces,\n setResolveCoincidentTopologyToDefault: setResolveCoincidentTopologyToDefault,\n setResolveCoincidentTopologyToOff: setResolveCoincidentTopologyToOff,\n setResolveCoincidentTopologyToPolygonOffset: setResolveCoincidentTopologyToPolygonOffset\n};\n\nexport { RESOLVE_COINCIDENT_TOPOLOGY_MODE, otherStaticMethods as default, getResolveCoincidentTopology, getResolveCoincidentTopologyAsString, getResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopology, setResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopologyToDefault, setResolveCoincidentTopologyToOff, setResolveCoincidentTopologyToPolygonOffset };\n","import otherStaticMethods from './Static.js';\nimport macro from '../../../macros.js';\n\n/* eslint-disable arrow-body-style */\n\nfunction addCoincidentTopologyMethods(publicAPI, model, nameList) {\n nameList.forEach(function (item) {\n publicAPI[\"get\".concat(item.method)] = function () {\n return model[item.key];\n };\n\n publicAPI[\"set\".concat(item.method)] = function (factor, offset) {\n model[item.key] = {\n factor: factor,\n offset: offset\n };\n };\n });\n}\n\nvar CATEGORIES = ['Polygon', 'Line', 'Point']; // CoincidentTopology static methods ------------------------------------------\n\nvar staticOffsetModel = {\n Polygon: {\n factor: 2,\n offset: 0\n },\n Line: {\n factor: 1,\n offset: -1\n },\n Point: {\n factor: 0,\n offset: -2\n }\n};\nvar staticOffsetAPI = {};\naddCoincidentTopologyMethods(staticOffsetAPI, staticOffsetModel, CATEGORIES.map(function (key) {\n return {\n key: key,\n method: \"ResolveCoincidentTopology\".concat(key, \"OffsetParameters\")\n };\n}));\n\nfunction implementCoincidentTopologyMethods(publicAPI, model) {\n if (model.resolveCoincidentTopology === undefined) {\n model.resolveCoincidentTopology = false;\n }\n\n macro.setGet(publicAPI, model, ['resolveCoincidentTopology']); // Relative methods\n\n model.topologyOffset = {\n Polygon: {\n factor: 0,\n offset: 0\n },\n Line: {\n factor: 0,\n offset: 0\n },\n Point: {\n factor: 0,\n offset: 0\n }\n }; // Add Static methods to our instance\n\n Object.keys(otherStaticMethods).forEach(function (methodName) {\n publicAPI[methodName] = otherStaticMethods[methodName];\n });\n Object.keys(staticOffsetAPI).forEach(function (methodName) {\n publicAPI[methodName] = staticOffsetAPI[methodName];\n });\n addCoincidentTopologyMethods(publicAPI, model.topologyOffset, CATEGORIES.map(function (key) {\n return {\n key: key,\n method: \"RelativeCoincidentTopology\".concat(key, \"OffsetParameters\")\n };\n }));\n\n publicAPI.getCoincidentTopologyPolygonOffsetParameters = function () {\n var globalValue = staticOffsetAPI.getResolveCoincidentTopologyPolygonOffsetParameters();\n var localValue = publicAPI.getRelativeCoincidentTopologyPolygonOffsetParameters();\n return {\n factor: globalValue.factor + localValue.factor,\n offset: globalValue.offset + localValue.offset\n };\n };\n\n publicAPI.getCoincidentTopologyLineOffsetParameters = function () {\n var globalValue = staticOffsetAPI.getResolveCoincidentTopologyLineOffsetParameters();\n var localValue = publicAPI.getRelativeCoincidentTopologyLineOffsetParameters();\n return {\n factor: globalValue.factor + localValue.factor,\n offset: globalValue.offset + localValue.offset\n };\n };\n\n publicAPI.getCoincidentTopologyPointOffsetParameter = function () {\n var globalValue = staticOffsetAPI.getResolveCoincidentTopologyPointOffsetParameters();\n var localValue = publicAPI.getRelativeCoincidentTopologyPointOffsetParameters();\n return {\n factor: globalValue.factor + localValue.factor,\n offset: globalValue.offset + localValue.offset\n };\n };\n}\n\nvar CoincidentTopologyHelper = {\n implementCoincidentTopologyMethods: implementCoincidentTopologyMethods,\n staticOffsetAPI: staticOffsetAPI,\n otherStaticMethods: otherStaticMethods,\n CATEGORIES: CATEGORIES\n};\n\nexport { CATEGORIES, CoincidentTopologyHelper as default };\n","var ColorMode = {\n DEFAULT: 0,\n MAP_SCALARS: 1,\n DIRECT_SCALARS: 2\n};\nvar ScalarMode = {\n DEFAULT: 0,\n USE_POINT_DATA: 1,\n USE_CELL_DATA: 2,\n USE_POINT_FIELD_DATA: 3,\n USE_CELL_FIELD_DATA: 4,\n USE_FIELD_DATA: 5\n};\nvar GetArray = {\n BY_ID: 0,\n BY_NAME: 1\n};\nvar Constants = {\n ColorMode: ColorMode,\n GetArray: GetArray,\n ScalarMode: ScalarMode\n};\n\nexport { ColorMode, GetArray, ScalarMode, Constants as default };\n","var CoordinateSystem = {\n DISPLAY: 0,\n WORLD: 1\n};\nvar Constants = {\n CoordinateSystem: CoordinateSystem\n};\n\nexport { CoordinateSystem, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './Prop/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar CoordinateSystem = Constants.CoordinateSystem;\n\nfunction notImplemented(method) {\n return function () {\n return macro.vtkErrorMacro(\"vtkProp::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkProp methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkProp(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProp');\n\n publicAPI.getMTime = function () {\n var m1 = model.mtime;\n\n for (var index = 0; index < model.textures.length; ++index) {\n var m2 = model.textures[index].getMTime();\n\n if (m2 > m1) {\n m1 = m2;\n }\n }\n\n return m1;\n };\n\n publicAPI.processSelectorPixelBuffers = function (selector, pixeloffsets) {};\n\n publicAPI.getNestedProps = function () {\n return null;\n };\n\n publicAPI.getActors = function () {\n return [];\n };\n\n publicAPI.getActors2D = function () {\n return [];\n };\n\n publicAPI.getVolumes = function () {\n return [];\n };\n\n publicAPI.pick = notImplemented('pick');\n publicAPI.hasKey = notImplemented('hasKey');\n\n publicAPI.getNestedVisibility = function () {\n return model.visibility && (!model._parentProp || model._parentProp.getNestedVisibility());\n };\n\n publicAPI.getNestedPickable = function () {\n return model.pickable && (!model._parentProp || model._parentProp.getNestedPickable());\n };\n\n publicAPI.getNestedDragable = function () {\n return model.dragable && (!model._parentProp || model._parentProp.getNestedDragable());\n };\n\n publicAPI.getRedrawMTime = function () {\n return model.mtime;\n };\n\n publicAPI.setEstimatedRenderTime = function (t) {\n model.estimatedRenderTime = t;\n model.savedEstimatedRenderTime = t;\n };\n\n publicAPI.restoreEstimatedRenderTime = function () {\n model.estimatedRenderTime = model.savedEstimatedRenderTime;\n };\n\n publicAPI.addEstimatedRenderTime = function (t) {\n model.estimatedRenderTime += t;\n };\n\n publicAPI.setAllocatedRenderTime = function (t) {\n model.allocatedRenderTime = t;\n model.savedEstimatedRenderTime = model.estimatedRenderTime;\n model.estimatedRenderTime = 0;\n };\n\n publicAPI.getSupportsSelection = function () {\n return false;\n };\n\n publicAPI.getTextures = function () {\n return model.textures;\n };\n\n publicAPI.hasTexture = function (texture) {\n return model.textures.indexOf(texture) !== -1;\n };\n\n publicAPI.addTexture = function (texture) {\n if (texture && !publicAPI.hasTexture(texture)) {\n model.textures = model.textures.concat(texture);\n publicAPI.modified();\n }\n };\n\n publicAPI.removeTexture = function (texture) {\n var newTextureList = model.textures.filter(function (item) {\n return item !== texture;\n });\n\n if (model.textures.length !== newTextureList.length) {\n model.textures = newTextureList;\n publicAPI.modified();\n }\n };\n\n publicAPI.removeAllTextures = function () {\n model.textures = [];\n publicAPI.modified();\n }; // not all mappers support all coordinate systems\n\n\n publicAPI.setCoordinateSystemToWorld = function () {\n return publicAPI.setCoordinateSystem(CoordinateSystem.WORLD);\n };\n\n publicAPI.setCoordinateSystemToDisplay = function () {\n return publicAPI.setCoordinateSystem(CoordinateSystem.DISPLAY);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _parentProp: null,\n allocatedRenderTime: 10,\n coordinateSystem: CoordinateSystem.WORLD,\n dragable: true,\n estimatedRenderTime: 0,\n paths: null,\n pickable: true,\n renderTimeMultiplier: 1,\n savedEstimatedRenderTime: 0,\n textures: [],\n useBounds: true,\n visibility: true\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['estimatedRenderTime', 'allocatedRenderTime']);\n macro.setGet(publicAPI, model, ['_parentProp', 'coordinateSystem', 'dragable', 'pickable', 'renderTimeMultiplier', 'useBounds', 'visibility']);\n macro.moveToProtected(publicAPI, model, ['parentProp']); // Object methods\n\n vtkProp(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProp'); // ----------------------------------------------------------------------------\n\nvar vtkProp$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkProp$1 as default, extend, newInstance };\n","import { mat4, quat } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport { A as degreesFromRadians, r as radiansFromDegrees, a as areMatricesEqual } from '../../Common/Core/Math/index.js';\nimport vtkProp from './Prop.js';\n\n// vtkProp3D methods\n// ----------------------------------------------------------------------------\n\nfunction vtkProp3D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProp3D');\n\n publicAPI.addPosition = function (deltaXYZ) {\n model.position = model.position.map(function (value, index) {\n return value + deltaXYZ[index];\n });\n publicAPI.modified();\n };\n\n publicAPI.getOrientationWXYZ = function () {\n var q = quat.create();\n mat4.getRotation(q, model.rotation);\n var oaxis = new Float64Array(3);\n var w = quat.getAxisAngle(oaxis, q);\n return [degreesFromRadians(w), oaxis[0], oaxis[1], oaxis[2]];\n };\n\n publicAPI.rotateX = function (val) {\n if (val === 0.0) {\n return;\n }\n\n mat4.rotateX(model.rotation, model.rotation, radiansFromDegrees(val));\n publicAPI.modified();\n };\n\n publicAPI.rotateY = function (val) {\n if (val === 0.0) {\n return;\n }\n\n mat4.rotateY(model.rotation, model.rotation, radiansFromDegrees(val));\n publicAPI.modified();\n };\n\n publicAPI.rotateZ = function (val) {\n if (val === 0.0) {\n return;\n }\n\n mat4.rotateZ(model.rotation, model.rotation, radiansFromDegrees(val));\n publicAPI.modified();\n };\n\n publicAPI.rotateWXYZ = function (degrees, x, y, z) {\n if (degrees === 0.0 || x === 0.0 && y === 0.0 && z === 0.0) {\n return;\n } // convert to radians\n\n\n var angle = radiansFromDegrees(degrees);\n var q = quat.create();\n quat.setAxisAngle(q, [x, y, z], angle);\n var quatMat = new Float64Array(16);\n mat4.fromQuat(quatMat, q);\n mat4.multiply(model.rotation, model.rotation, quatMat);\n publicAPI.modified();\n };\n\n publicAPI.setOrientation = function (x, y, z) {\n if (x === model.orientation[0] && y === model.orientation[1] && z === model.orientation[2]) {\n return false;\n }\n\n model.orientation = [x, y, z];\n mat4.identity(model.rotation);\n publicAPI.rotateZ(z);\n publicAPI.rotateX(x);\n publicAPI.rotateY(y);\n publicAPI.modified();\n return true;\n };\n\n publicAPI.setUserMatrix = function (matrix) {\n if (areMatricesEqual(model.userMatrix, matrix)) {\n return false;\n }\n\n mat4.copy(model.userMatrix, matrix);\n publicAPI.modified();\n return true;\n };\n\n publicAPI.getMatrix = function () {\n publicAPI.computeMatrix();\n return model.matrix;\n };\n\n publicAPI.computeMatrix = function () {\n // check whether or not need to rebuild the matrix\n if (publicAPI.getMTime() > model.matrixMTime.getMTime()) {\n mat4.identity(model.matrix);\n\n if (model.userMatrix) {\n mat4.multiply(model.matrix, model.matrix, model.userMatrix);\n }\n\n mat4.translate(model.matrix, model.matrix, model.origin);\n mat4.translate(model.matrix, model.matrix, model.position);\n mat4.multiply(model.matrix, model.matrix, model.rotation);\n mat4.scale(model.matrix, model.matrix, model.scale);\n mat4.translate(model.matrix, model.matrix, [-model.origin[0], -model.origin[1], -model.origin[2]]);\n mat4.transpose(model.matrix, model.matrix); // check for identity\n\n model.isIdentity = true;\n\n for (var i = 0; i < 4; ++i) {\n for (var j = 0; j < 4; ++j) {\n if ((i === j ? 1.0 : 0.0) !== model.matrix[i + j * 4]) {\n model.isIdentity = false;\n }\n }\n }\n\n model.matrixMTime.modified();\n }\n };\n\n publicAPI.getCenter = function () {\n return vtkBoundingBox.getCenter(model.bounds);\n };\n\n publicAPI.getLength = function () {\n return vtkBoundingBox.getLength(model.bounds);\n };\n\n publicAPI.getXRange = function () {\n return vtkBoundingBox.getXRange(model.bounds);\n };\n\n publicAPI.getYRange = function () {\n return vtkBoundingBox.getYRange(model.bounds);\n };\n\n publicAPI.getZRange = function () {\n return vtkBoundingBox.getZRange(model.bounds);\n };\n\n publicAPI.getUserMatrix = function () {\n return model.userMatrix;\n };\n\n function updateIdentityFlag() {\n publicAPI.computeMatrix();\n }\n\n publicAPI.onModified(updateIdentityFlag);\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n origin: [0, 0, 0],\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n rotation: null,\n scale: [1, 1, 1],\n bounds: [1, -1, 1, -1, 1, -1],\n userMatrix: null,\n userMatrixMTime: null,\n cachedProp3D: null,\n isIdentity: true,\n matrixMTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp.extend(publicAPI, model, initialValues);\n model.matrixMTime = {};\n macro.obj(model.matrixMTime); // Build VTK API\n\n macro.get(publicAPI, model, ['bounds', 'isIdentity']);\n macro.getArray(publicAPI, model, ['orientation']);\n macro.setGetArray(publicAPI, model, ['origin', 'position', 'scale'], 3); // Object internal instance\n\n model.matrix = mat4.identity(new Float64Array(16));\n model.rotation = mat4.identity(new Float64Array(16));\n model.userMatrix = mat4.identity(new Float64Array(16));\n model.transform = null; // FIXME\n // Object methods\n\n vtkProp3D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProp3D'); // ----------------------------------------------------------------------------\n\nvar vtkProp3D$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkProp3D$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport PropertyConst from './Property/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Representation = PropertyConst.Representation,\n Interpolation = PropertyConst.Interpolation;\n\nfunction notImplemented(method) {\n return function () {\n return macro.vtkErrorMacro(\"vtkProperty::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkProperty methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkProperty(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProperty');\n\n publicAPI.setColor = function (r, g, b) {\n if (Array.isArray(r)) {\n if (model.color[0] !== r[0] || model.color[1] !== r[1] || model.color[2] !== r[2]) {\n model.color[0] = r[0];\n model.color[1] = r[1];\n model.color[2] = r[2];\n publicAPI.modified();\n }\n } else if (model.color[0] !== r || model.color[1] !== g || model.color[2] !== b) {\n model.color[0] = r;\n model.color[1] = g;\n model.color[2] = b;\n publicAPI.modified();\n }\n\n publicAPI.setDiffuseColor(model.color);\n publicAPI.setAmbientColor(model.color);\n publicAPI.setSpecularColor(model.color);\n };\n\n publicAPI.computeCompositeColor = notImplemented('ComputeCompositeColor');\n\n publicAPI.getColor = function () {\n // Inline computeCompositeColor\n var norm = 0.0;\n\n if (model.ambient + model.diffuse + model.specular > 0) {\n norm = 1.0 / (model.ambient + model.diffuse + model.specular);\n }\n\n for (var i = 0; i < 3; i++) {\n model.color[i] = norm * (model.ambient * model.ambientColor[i] + model.diffuse * model.diffuseColor[i] + model.specular * model.specularColor[i]);\n }\n\n return [].concat(model.color);\n };\n\n publicAPI.setSpecularPower = function (specularPower) {\n var roughness = 1 / Math.max(1.0, specularPower);\n\n if (model.roughness !== roughness || model.specularPower !== specularPower) {\n model.specularPower = specularPower; // Specular power still needs to be set as long as webgl is using it (otherwise testShaderReplacementsClear fails)\n\n model.roughness = roughness;\n publicAPI.modified();\n }\n };\n\n publicAPI.addShaderVariable = notImplemented('AddShaderVariable');\n\n publicAPI.setInterpolationToFlat = function () {\n return publicAPI.setInterpolation(Interpolation.FLAT);\n };\n\n publicAPI.setInterpolationToGouraud = function () {\n return publicAPI.setInterpolation(Interpolation.GOURAUD);\n };\n\n publicAPI.setInterpolationToPhong = function () {\n return publicAPI.setInterpolation(Interpolation.PHONG);\n };\n\n publicAPI.getInterpolationAsString = function () {\n return macro.enumToString(Interpolation, model.interpolation);\n };\n\n publicAPI.setRepresentationToWireframe = function () {\n return publicAPI.setRepresentation(Representation.WIREFRAME);\n };\n\n publicAPI.setRepresentationToSurface = function () {\n return publicAPI.setRepresentation(Representation.SURFACE);\n };\n\n publicAPI.setRepresentationToPoints = function () {\n return publicAPI.setRepresentation(Representation.POINTS);\n };\n\n publicAPI.getRepresentationAsString = function () {\n return macro.enumToString(Representation, model.representation);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n color: [1, 1, 1],\n ambientColor: [1, 1, 1],\n diffuseColor: [1, 1, 1],\n specularColor: [1, 1, 1],\n edgeColor: [0, 0, 0],\n ambient: 0,\n diffuse: 1,\n metallic: 0,\n roughness: 0.6,\n normalStrength: 1,\n emission: 1,\n baseIOR: 1.45,\n specular: 0,\n specularPower: 1,\n opacity: 1,\n interpolation: Interpolation.GOURAUD,\n representation: Representation.SURFACE,\n edgeVisibility: false,\n backfaceCulling: false,\n frontfaceCulling: false,\n pointSize: 1,\n lineWidth: 1,\n lighting: true,\n shading: false,\n materialName: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['lighting', 'interpolation', 'ambient', 'diffuse', 'metallic', 'roughness', 'normalStrength', 'emission', 'baseIOR', 'specular', 'specularPower', 'opacity', 'edgeVisibility', 'lineWidth', 'pointSize', 'backfaceCulling', 'frontfaceCulling', 'representation', 'diffuseTexture', 'metallicTexture', 'roughnessTexture', 'normalTexture', 'ambientOcclusionTexture', 'emissionTexture']);\n macro.setGetArray(publicAPI, model, ['ambientColor', 'specularColor', 'diffuseColor', 'edgeColor'], 3); // Object methods\n\n vtkProperty(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProperty'); // ----------------------------------------------------------------------------\n\nvar vtkProperty$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, PropertyConst);\n\nexport { vtkProperty$1 as default, extend, newInstance };\n","var Shading = {\n FLAT: 0,\n GOURAUD: 1,\n PHONG: 2\n};\nvar Representation = {\n POINTS: 0,\n WIREFRAME: 1,\n SURFACE: 2\n};\nvar Interpolation = Shading;\nvar PropertyConst = {\n Shading: Shading,\n Representation: Representation,\n Interpolation: Interpolation\n};\n\nexport { Interpolation, Representation, Shading, PropertyConst as default };\n","import macro from '../../macros.js';\nimport { l as normalize, r as radiansFromDegrees } from '../../Common/Core/Math/index.js';\nimport { vec3 } from 'gl-matrix';\n\nvar LIGHT_TYPES = ['HeadLight', 'CameraLight', 'SceneLight']; // ----------------------------------------------------------------------------\n// vtkLight methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLight(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLight');\n var tmpVec = new Float64Array(3);\n\n publicAPI.getTransformedPosition = function () {\n if (model.transformMatrix) {\n vec3.transformMat4(tmpVec, model.position, model.transformMatrix);\n } else {\n vec3.set(tmpVec, model.position[0], model.position[1], model.position[2]);\n }\n\n return tmpVec;\n };\n\n publicAPI.getTransformedFocalPoint = function () {\n if (model.transformMatrix) {\n vec3.transformMat4(tmpVec, model.focalPoint, model.transformMatrix);\n } else {\n vec3.set(tmpVec, model.focalPoint[0], model.focalPoint[1], model.focalPoint[2]);\n }\n\n return tmpVec;\n };\n\n publicAPI.getDirection = function () {\n if (model.directionMTime < model.mtime) {\n vec3.sub(model.direction, model.focalPoint, model.position);\n normalize(model.direction);\n model.directionMTime = model.mtime;\n }\n\n return model.direction;\n }; // Sets the direction from a vec3 instead of a focal point\n\n\n publicAPI.setDirection = function (directionVector) {\n var newFocalPoint = new Float64Array(3);\n vec3.sub(newFocalPoint, model.position, directionVector);\n model.focalPoint = newFocalPoint;\n };\n\n publicAPI.setDirectionAngle = function (elevation, azimuth) {\n var elevationRadians = radiansFromDegrees(elevation);\n var azimuthRadians = radiansFromDegrees(azimuth);\n publicAPI.setPosition(Math.cos(elevationRadians) * Math.sin(azimuthRadians), Math.sin(elevationRadians), Math.cos(elevationRadians) * Math.cos(azimuthRadians));\n publicAPI.setFocalPoint(0, 0, 0);\n publicAPI.setPositional(0);\n };\n\n publicAPI.setLightTypeToHeadLight = function () {\n publicAPI.setLightType('HeadLight');\n };\n\n publicAPI.setLightTypeToCameraLight = function () {\n publicAPI.setLightType('CameraLight');\n };\n\n publicAPI.setLightTypeToSceneLight = function () {\n publicAPI.setTransformMatrix(null);\n publicAPI.setLightType('SceneLight');\n };\n\n publicAPI.lightTypeIsHeadLight = function () {\n return model.lightType === 'HeadLight';\n };\n\n publicAPI.lightTypeIsSceneLight = function () {\n return model.lightType === 'SceneLight';\n };\n\n publicAPI.lightTypeIsCameraLight = function () {\n return model.lightType === 'CameraLight';\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n switch: true,\n intensity: 1,\n color: [1, 1, 1],\n position: [0, 0, 1],\n focalPoint: [0, 0, 0],\n positional: false,\n exponent: 1,\n coneAngle: 30,\n coneFalloff: 5,\n attenuationValues: [1, 0, 0],\n transformMatrix: null,\n lightType: 'SceneLight',\n shadowAttenuation: 1,\n direction: [0, 0, 0],\n directionMTime: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['intensity', 'switch', 'positional', 'exponent', 'coneAngle', 'coneFalloff', 'transformMatrix', 'lightType', 'shadowAttenuation', 'attenuationValues']);\n macro.setGetArray(publicAPI, model, ['color', 'position', 'focalPoint', 'attenuationValues'], 3); // Object methods\n\n vtkLight(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkLight'); // ----------------------------------------------------------------------------\n\nvar vtkLight$1 = {\n newInstance: newInstance,\n extend: extend,\n LIGHT_TYPES: LIGHT_TYPES\n};\n\nexport { LIGHT_TYPES, vtkLight$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\n\nfunction notImplemented(method) {\n return function () {\n return vtkErrorMacro(\"vtkViewport::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkViewport methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkViewport(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkViewport'); // Public API methods\n\n publicAPI.getViewProps = function () {\n return model.props;\n };\n\n publicAPI.hasViewProp = function (prop) {\n return model.props.includes(prop);\n };\n\n publicAPI.addViewProp = function (prop) {\n if (prop && !publicAPI.hasViewProp(prop)) {\n model.props.push(prop);\n }\n };\n\n publicAPI.removeViewProp = function (prop) {\n var newPropList = model.props.filter(function (item) {\n return item !== prop;\n });\n\n if (model.props.length !== newPropList.length) {\n model.props = newPropList;\n }\n };\n\n publicAPI.removeAllViewProps = function () {\n model.props = [];\n }; // this method get all the props including any nested props\n\n\n function gatherProps(prop) {\n var allProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n allProps.push(prop);\n var children = prop.getNestedProps();\n\n if (children && children.length) {\n for (var i = 0; i < children.length; i++) {\n gatherProps(children[i], allProps);\n }\n }\n\n return allProps;\n }\n\n publicAPI.getViewPropsWithNestedProps = function () {\n var allPropsArray = [];\n\n for (var i = 0; i < model.props.length; i++) {\n gatherProps(model.props[i], allPropsArray);\n }\n\n return allPropsArray;\n };\n\n publicAPI.addActor2D = publicAPI.addViewProp;\n\n publicAPI.removeActor2D = function (prop) {\n // VTK way: model.actors2D.RemoveItem(prop);\n publicAPI.removeViewProp(prop);\n };\n\n publicAPI.getActors2D = function () {\n model.actors2D = [];\n model.props.forEach(function (prop) {\n model.actors2D = model.actors2D.concat(prop.getActors2D());\n });\n return model.actors2D;\n };\n\n publicAPI.displayToView = function () {\n return vtkErrorMacro('call displayToView on your view instead');\n };\n\n publicAPI.viewToDisplay = function () {\n return vtkErrorMacro('callviewtodisplay on your view instead');\n };\n\n publicAPI.getSize = function () {\n return vtkErrorMacro('call getSize on your View instead');\n };\n\n publicAPI.normalizedDisplayToProjection = function (x, y, z) {\n // first to normalized viewport\n var nvp = publicAPI.normalizedDisplayToNormalizedViewport(x, y, z); // then to view\n\n return publicAPI.normalizedViewportToProjection(nvp[0], nvp[1], nvp[2]);\n };\n\n publicAPI.normalizedDisplayToNormalizedViewport = function (x, y, z) {\n var scale = [model.viewport[2] - model.viewport[0], model.viewport[3] - model.viewport[1]];\n return [(x - model.viewport[0]) / scale[0], (y - model.viewport[1]) / scale[1], z];\n };\n\n publicAPI.normalizedViewportToProjection = function (x, y, z) {\n return [x * 2.0 - 1.0, y * 2.0 - 1.0, z * 2.0 - 1.0];\n };\n\n publicAPI.projectionToNormalizedDisplay = function (x, y, z) {\n // first to nvp\n var nvp = publicAPI.projectionToNormalizedViewport(x, y, z); // then to ndp\n\n return publicAPI.normalizedViewportToNormalizedDisplay(nvp[0], nvp[1], nvp[2]);\n };\n\n publicAPI.normalizedViewportToNormalizedDisplay = function (x, y, z) {\n var scale = [model.viewport[2] - model.viewport[0], model.viewport[3] - model.viewport[1]];\n return [x * scale[0] + model.viewport[0], y * scale[1] + model.viewport[1], z];\n };\n\n publicAPI.projectionToNormalizedViewport = function (x, y, z) {\n return [(x + 1.0) * 0.5, (y + 1.0) * 0.5, (z + 1.0) * 0.5];\n };\n\n publicAPI.PickPropFrom = notImplemented('PickPropFrom');\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _vtkWindow: null,\n background: [0, 0, 0],\n background2: [0.2, 0.2, 0.2],\n gradientBackground: false,\n viewport: [0, 0, 1, 1],\n aspect: [1, 1],\n pixelAspect: [1, 1],\n props: [],\n actors2D: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.event(publicAPI, model, 'event');\n macro.setGetArray(publicAPI, model, ['viewport'], 4);\n macro.setGetArray(publicAPI, model, ['background', 'background2'], 3);\n vtkViewport(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkViewport'); // ----------------------------------------------------------------------------\n\nvar vtkViewport$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkViewport$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, get, setGet, getArray, setGetArray, moveToProtected, vtkDebugMacro as vtkDebugMacro$1, vtkErrorMacro as vtkErrorMacro$1, vtkWarningMacro as vtkWarningMacro$1 } from '../../macros.js';\nimport vtkCamera from './Camera.js';\nimport vtkLight from './Light.js';\nimport { P as areBoundsInitialized, u as uninitializeBounds, r as radiansFromDegrees, d as dot, N as createUninitializedBounds } from '../../Common/Core/Math/index.js';\nimport vtkViewport from './Viewport.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\n\nvar vtkDebugMacro = vtkDebugMacro$1,\n vtkErrorMacro = vtkErrorMacro$1,\n vtkWarningMacro = vtkWarningMacro$1;\n\nfunction notImplemented(method) {\n return function () {\n return vtkErrorMacro(\"vtkRenderer::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkRenderer methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkRenderer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderer'); // Events\n\n var COMPUTE_VISIBLE_PROP_BOUNDS_EVENT = {\n type: 'ComputeVisiblePropBoundsEvent',\n renderer: publicAPI\n };\n var RESET_CAMERA_CLIPPING_RANGE_EVENT = {\n type: 'ResetCameraClippingRangeEvent',\n renderer: publicAPI\n };\n var RESET_CAMERA_EVENT = {\n type: 'ResetCameraEvent',\n renderer: publicAPI\n };\n\n publicAPI.updateCamera = function () {\n if (!model.activeCamera) {\n vtkDebugMacro('No cameras are on, creating one.'); // the get method will automagically create a camera\n // and reset it since one hasn't been specified yet.\n\n publicAPI.getActiveCameraAndResetIfCreated();\n } // update the viewing transformation\n\n\n model.activeCamera.render(publicAPI);\n return true;\n };\n\n publicAPI.updateLightsGeometryToFollowCamera = function () {\n // only update the light's geometry if this Renderer is tracking\n // this lights. That allows one renderer to view the lights that\n // another renderer is setting up.\n var camera = publicAPI.getActiveCameraAndResetIfCreated();\n model.lights.forEach(function (light) {\n if (light.lightTypeIsSceneLight()) ; else if (light.lightTypeIsHeadLight()) {\n // update position and orientation of light to match camera.\n light.setPositionFrom(camera.getPositionByReference());\n light.setFocalPointFrom(camera.getFocalPointByReference());\n light.modified(camera.getMTime());\n } else if (light.lightTypeIsCameraLight()) {\n light.setTransformMatrix(camera.getCameraLightTransformMatrix(mat4.create()));\n } else {\n vtkErrorMacro('light has unknown light type', light.get());\n }\n });\n };\n\n publicAPI.updateLightGeometry = function () {\n if (model.lightFollowCamera) {\n // only update the light's geometry if this Renderer is tracking\n // this lights. That allows one renderer to view the lights that\n // another renderer is setting up.\n return publicAPI.updateLightsGeometryToFollowCamera();\n }\n\n return true;\n };\n\n publicAPI.allocateTime = notImplemented('allocateTime');\n publicAPI.updateGeometry = notImplemented('updateGeometry');\n\n publicAPI.getVTKWindow = function () {\n return model._renderWindow;\n };\n\n publicAPI.setLayer = function (layer) {\n vtkDebugMacro(publicAPI.getClassName(), publicAPI, 'setting Layer to ', layer);\n\n if (model.layer !== layer) {\n model.layer = layer;\n publicAPI.modified();\n }\n\n publicAPI.setPreserveColorBuffer(!!layer);\n };\n\n publicAPI.setActiveCamera = function (camera) {\n if (model.activeCamera === camera) {\n return false;\n }\n\n model.activeCamera = camera;\n publicAPI.modified();\n publicAPI.invokeEvent({\n type: 'ActiveCameraEvent',\n camera: camera\n });\n return true;\n };\n\n publicAPI.makeCamera = function () {\n var camera = vtkCamera.newInstance();\n publicAPI.invokeEvent({\n type: 'CreateCameraEvent',\n camera: camera\n });\n return camera;\n }; // Replace the set/get macro method\n\n\n publicAPI.getActiveCamera = function () {\n if (!model.activeCamera) {\n model.activeCamera = publicAPI.makeCamera();\n }\n\n return model.activeCamera;\n };\n\n publicAPI.getActiveCameraAndResetIfCreated = function () {\n if (!model.activeCamera) {\n publicAPI.getActiveCamera();\n publicAPI.resetCamera();\n }\n\n return model.activeCamera;\n };\n\n publicAPI.getActors = function () {\n model.actors = [];\n model.props.forEach(function (prop) {\n model.actors = model.actors.concat(prop.getActors());\n });\n return model.actors;\n };\n\n publicAPI.addActor = publicAPI.addViewProp;\n\n publicAPI.removeActor = function (actor) {\n model.actors = model.actors.filter(function (a) {\n return a !== actor;\n });\n publicAPI.removeViewProp(actor);\n publicAPI.modified();\n };\n\n publicAPI.removeAllActors = function () {\n var actors = publicAPI.getActors();\n actors.forEach(function (actor) {\n publicAPI.removeViewProp(actor);\n });\n model.actors = [];\n publicAPI.modified();\n };\n\n publicAPI.getVolumes = function () {\n model.volumes = [];\n model.props.forEach(function (prop) {\n model.volumes = model.volumes.concat(prop.getVolumes());\n });\n return model.volumes;\n };\n\n publicAPI.addVolume = publicAPI.addViewProp;\n\n publicAPI.removeVolume = function (volume) {\n model.volumes = model.volumes.filter(function (v) {\n return v !== volume;\n });\n publicAPI.removeViewProp(volume);\n publicAPI.modified();\n };\n\n publicAPI.removeAllVolumes = function () {\n var volumes = publicAPI.getVolumes();\n volumes.forEach(function (volume) {\n publicAPI.removeViewProp(volume);\n });\n model.volumes = [];\n publicAPI.modified();\n };\n\n publicAPI.hasLight = function (light) {\n return model.lights.includes(light);\n };\n\n publicAPI.addLight = function (light) {\n if (light && !publicAPI.hasLight(light)) {\n model.lights.push(light);\n publicAPI.modified();\n }\n };\n\n publicAPI.removeLight = function (light) {\n model.lights = model.lights.filter(function (l) {\n return l !== light;\n });\n publicAPI.modified();\n };\n\n publicAPI.removeAllLights = function () {\n model.lights = [];\n publicAPI.modified();\n };\n\n publicAPI.setLightCollection = function (lights) {\n model.lights = lights;\n publicAPI.modified();\n };\n\n publicAPI.makeLight = vtkLight.newInstance;\n\n publicAPI.createLight = function () {\n if (!model.automaticLightCreation) {\n return;\n }\n\n if (model._createdLight) {\n publicAPI.removeLight(model._createdLight);\n\n model._createdLight.delete();\n\n model._createdLight = null;\n }\n\n model._createdLight = publicAPI.makeLight();\n publicAPI.addLight(model._createdLight);\n\n model._createdLight.setLightTypeToHeadLight(); // set these values just to have a good default should LightFollowCamera\n // be turned off.\n\n\n model._createdLight.setPosition(publicAPI.getActiveCamera().getPosition());\n\n model._createdLight.setFocalPoint(publicAPI.getActiveCamera().getFocalPoint());\n }; // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.normalizedDisplayToWorld = function (x, y, z, aspect) {\n var vpd = publicAPI.normalizedDisplayToProjection(x, y, z);\n vpd = publicAPI.projectionToView(vpd[0], vpd[1], vpd[2], aspect);\n return publicAPI.viewToWorld(vpd[0], vpd[1], vpd[2]);\n }; // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.worldToNormalizedDisplay = function (x, y, z, aspect) {\n var vpd = publicAPI.worldToView(x, y, z);\n vpd = publicAPI.viewToProjection(vpd[0], vpd[1], vpd[2], aspect);\n return publicAPI.projectionToNormalizedDisplay(vpd[0], vpd[1], vpd[2]);\n }; // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.viewToWorld = function (x, y, z) {\n if (model.activeCamera === null) {\n vtkErrorMacro('ViewToWorld: no active camera, cannot compute view to world, returning 0,0,0');\n return [0, 0, 0];\n } // get the view matrix from the active camera\n\n\n var matrix = model.activeCamera.getViewMatrix();\n mat4.invert(matrix, matrix);\n mat4.transpose(matrix, matrix); // Transform point to world coordinates\n\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n };\n\n publicAPI.projectionToView = function (x, y, z, aspect) {\n if (model.activeCamera === null) {\n vtkErrorMacro('ProjectionToView: no active camera, cannot compute projection to view, returning 0,0,0');\n return [0, 0, 0];\n } // get the projection transformation from the active camera\n\n\n var matrix = model.activeCamera.getProjectionMatrix(aspect, -1.0, 1.0);\n mat4.invert(matrix, matrix);\n mat4.transpose(matrix, matrix); // Transform point to world coordinates\n\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n }; // Convert world point coordinates to view coordinates.\n\n\n publicAPI.worldToView = function (x, y, z) {\n if (model.activeCamera === null) {\n vtkErrorMacro('WorldToView: no active camera, cannot compute view to world, returning 0,0,0');\n return [0, 0, 0];\n } // get the view transformation from the active camera\n\n\n var matrix = model.activeCamera.getViewMatrix();\n mat4.transpose(matrix, matrix);\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n }; // Convert world point coordinates to view coordinates.\n // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.viewToProjection = function (x, y, z, aspect) {\n if (model.activeCamera === null) {\n vtkErrorMacro('ViewToProjection: no active camera, cannot compute view to projection, returning 0,0,0');\n return [0, 0, 0];\n } // get the projeciton transformation from the active camera\n\n\n var matrix = model.activeCamera.getProjectionMatrix(aspect, -1.0, 1.0);\n mat4.transpose(matrix, matrix);\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n };\n\n publicAPI.computeVisiblePropBounds = function () {\n model.allBounds[0] = vtkBoundingBox.INIT_BOUNDS[0];\n model.allBounds[1] = vtkBoundingBox.INIT_BOUNDS[1];\n model.allBounds[2] = vtkBoundingBox.INIT_BOUNDS[2];\n model.allBounds[3] = vtkBoundingBox.INIT_BOUNDS[3];\n model.allBounds[4] = vtkBoundingBox.INIT_BOUNDS[4];\n model.allBounds[5] = vtkBoundingBox.INIT_BOUNDS[5];\n var nothingVisible = true;\n publicAPI.invokeEvent(COMPUTE_VISIBLE_PROP_BOUNDS_EVENT); // loop through all props\n\n for (var index = 0; index < model.props.length; ++index) {\n var prop = model.props[index];\n\n if (prop.getVisibility() && prop.getUseBounds()) {\n var bounds = prop.getBounds();\n\n if (bounds && areBoundsInitialized(bounds)) {\n nothingVisible = false;\n\n if (bounds[0] < model.allBounds[0]) {\n model.allBounds[0] = bounds[0];\n }\n\n if (bounds[1] > model.allBounds[1]) {\n model.allBounds[1] = bounds[1];\n }\n\n if (bounds[2] < model.allBounds[2]) {\n model.allBounds[2] = bounds[2];\n }\n\n if (bounds[3] > model.allBounds[3]) {\n model.allBounds[3] = bounds[3];\n }\n\n if (bounds[4] < model.allBounds[4]) {\n model.allBounds[4] = bounds[4];\n }\n\n if (bounds[5] > model.allBounds[5]) {\n model.allBounds[5] = bounds[5];\n }\n }\n }\n }\n\n if (nothingVisible) {\n uninitializeBounds(model.allBounds);\n vtkDebugMacro(\"Can't compute bounds, no 3D props are visible\");\n }\n\n return model.allBounds;\n };\n\n publicAPI.resetCamera = function () {\n var bounds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var boundsToUse = bounds || publicAPI.computeVisiblePropBounds();\n var center = [0, 0, 0];\n\n if (!areBoundsInitialized(boundsToUse)) {\n vtkDebugMacro('Cannot reset camera!');\n return false;\n }\n\n var vn = null;\n\n if (publicAPI.getActiveCamera()) {\n vn = model.activeCamera.getViewPlaneNormal();\n } else {\n vtkErrorMacro('Trying to reset non-existent camera');\n return false;\n } // Reset the perspective zoom factors, otherwise subsequent zooms will cause\n // the view angle to become very small and cause bad depth sorting.\n\n\n model.activeCamera.setViewAngle(30.0);\n center[0] = (boundsToUse[0] + boundsToUse[1]) / 2.0;\n center[1] = (boundsToUse[2] + boundsToUse[3]) / 2.0;\n center[2] = (boundsToUse[4] + boundsToUse[5]) / 2.0;\n var w1 = boundsToUse[1] - boundsToUse[0];\n var w2 = boundsToUse[3] - boundsToUse[2];\n var w3 = boundsToUse[5] - boundsToUse[4];\n w1 *= w1;\n w2 *= w2;\n w3 *= w3;\n var radius = w1 + w2 + w3; // If we have just a single point, pick a radius of 1.0\n\n radius = radius === 0 ? 1.0 : radius; // compute the radius of the enclosing sphere\n\n radius = Math.sqrt(radius) * 0.5; // default so that the bounding sphere fits within the view fustrum\n // compute the distance from the intersection of the view frustum with the\n // bounding sphere. Basically in 2D draw a circle representing the bounding\n // sphere in 2D then draw a horizontal line going out from the center of\n // the circle. That is the camera view. Then draw a line from the camera\n // position to the point where it intersects the circle. (it will be tangent\n // to the circle at this point, this is important, only go to the tangent\n // point, do not draw all the way to the view plane). Then draw the radius\n // from the tangent point to the center of the circle. You will note that\n // this forms a right triangle with one side being the radius, another being\n // the target distance for the camera, then just find the target dist using\n // a sin.\n\n var angle = radiansFromDegrees(model.activeCamera.getViewAngle());\n var parallelScale = radius;\n var distance = radius / Math.sin(angle * 0.5); // check view-up vector against view plane normal\n\n var vup = model.activeCamera.getViewUp();\n\n if (Math.abs(dot(vup, vn)) > 0.999) {\n vtkWarningMacro('Resetting view-up since view plane normal is parallel');\n model.activeCamera.setViewUp(-vup[2], vup[0], vup[1]);\n } // update the camera\n\n\n model.activeCamera.setFocalPoint(center[0], center[1], center[2]);\n model.activeCamera.setPosition(center[0] + distance * vn[0], center[1] + distance * vn[1], center[2] + distance * vn[2]);\n publicAPI.resetCameraClippingRange(boundsToUse); // setup default parallel scale\n\n model.activeCamera.setParallelScale(parallelScale); // update reasonable world to physical values\n\n model.activeCamera.setPhysicalScale(radius);\n model.activeCamera.setPhysicalTranslation(-center[0], -center[1], -center[2]); // Here to let parallel/distributed compositing intercept\n // and do the right thing.\n\n publicAPI.invokeEvent(RESET_CAMERA_EVENT);\n return true;\n };\n\n publicAPI.resetCameraClippingRange = function () {\n var bounds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var boundsToUse = bounds || publicAPI.computeVisiblePropBounds();\n\n if (!areBoundsInitialized(boundsToUse)) {\n vtkDebugMacro('Cannot reset camera clipping range!');\n return false;\n } // Make sure we have an active camera\n\n\n publicAPI.getActiveCameraAndResetIfCreated();\n\n if (!model.activeCamera) {\n vtkErrorMacro('Trying to reset clipping range of non-existent camera');\n return false;\n } // Get the exact range for the bounds\n\n\n var range = model.activeCamera.computeClippingRange(boundsToUse); // do not let far - near be less than 0.1 of the window height\n // this is for cases such as 2D images which may have zero range\n\n var minGap = 0.0;\n\n if (model.activeCamera.getParallelProjection()) {\n minGap = 0.2 * model.activeCamera.getParallelScale();\n } else {\n var angle = radiansFromDegrees(model.activeCamera.getViewAngle());\n minGap = 0.2 * Math.tan(angle / 2.0) * range[1];\n }\n\n if (range[1] - range[0] < minGap) {\n minGap = minGap - range[1] + range[0];\n range[1] += minGap / 2.0;\n range[0] -= minGap / 2.0;\n } // Do not let the range behind the camera throw off the calculation.\n\n\n if (range[0] < 0.0) {\n range[0] = 0.0;\n } // Give ourselves a little breathing room\n\n\n range[0] = 0.99 * range[0] - (range[1] - range[0]) * model.clippingRangeExpansion;\n range[1] = 1.01 * range[1] + (range[1] - range[0]) * model.clippingRangeExpansion; // Make sure near is not bigger than far\n\n range[0] = range[0] >= range[1] ? 0.01 * range[1] : range[0]; // Make sure near is at least some fraction of far - this prevents near\n // from being behind the camera or too close in front. How close is too\n // close depends on the resolution of the depth buffer\n\n if (!model.nearClippingPlaneTolerance) {\n model.nearClippingPlaneTolerance = 0.01;\n } // make sure the front clipping range is not too far from the far clippnig\n // range, this is to make sure that the zbuffer resolution is effectively\n // used\n\n\n if (range[0] < model.nearClippingPlaneTolerance * range[1]) {\n range[0] = model.nearClippingPlaneTolerance * range[1];\n }\n\n model.activeCamera.setClippingRange(range[0], range[1]); // Here to let parallel/distributed compositing intercept\n // and do the right thing.\n\n publicAPI.invokeEvent(RESET_CAMERA_CLIPPING_RANGE_EVENT);\n return false;\n };\n\n publicAPI.setRenderWindow = function (renderWindow) {\n if (renderWindow !== model._renderWindow) {\n model._vtkWindow = renderWindow;\n model._renderWindow = renderWindow;\n }\n };\n\n publicAPI.visibleActorCount = function () {\n return model.props.filter(function (prop) {\n return prop.getVisibility();\n }).length;\n };\n\n publicAPI.visibleVolumeCount = publicAPI.visibleActorCount;\n\n publicAPI.getMTime = function () {\n var m1 = model.mtime;\n var m2 = model.activeCamera ? model.activeCamera.getMTime() : 0;\n\n if (m2 > m1) {\n m1 = m2;\n }\n\n var m3 = model._createdLight ? model._createdLight.getMTime() : 0;\n\n if (m3 > m1) {\n m1 = m3;\n }\n\n return m1;\n };\n\n publicAPI.getTransparent = function () {\n return !!model.preserveColorBuffer;\n };\n\n publicAPI.isActiveCameraCreated = function () {\n return !!model.activeCamera;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n pickedProp: null,\n activeCamera: null,\n allBounds: [],\n ambient: [1, 1, 1],\n allocatedRenderTime: 100,\n timeFactor: 1,\n automaticLightCreation: true,\n twoSidedLighting: true,\n lastRenderTimeInSeconds: -1,\n renderWindow: null,\n lights: [],\n actors: [],\n volumes: [],\n lightFollowCamera: true,\n numberOfPropsRendered: 0,\n propArray: null,\n pathArray: null,\n layer: 0,\n preserveColorBuffer: false,\n preserveDepthBuffer: false,\n computeVisiblePropBounds: createUninitializedBounds(),\n interactive: true,\n nearClippingPlaneTolerance: 0,\n clippingRangeExpansion: 0.05,\n erase: true,\n draw: true,\n useShadows: false,\n useDepthPeeling: false,\n occlusionRatio: 0,\n maximumNumberOfPeels: 4,\n selector: null,\n delegate: null,\n texturedBackground: false,\n backgroundTexture: null,\n environmentTexture: null,\n environmentTextureDiffuseStrength: 1,\n environmentTextureSpecularStrength: 1,\n useEnvironmentTextureAsBackground: false,\n pass: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewport.extend(publicAPI, model, initialValues); // make sure background has 4 entries. Default to opaque black\n\n if (!model.background) model.background = [0, 0, 0, 1];\n\n while (model.background.length < 3) {\n model.background.push(0);\n }\n\n if (model.background.length === 3) model.background.push(1); // Build VTK API\n\n get(publicAPI, model, ['_renderWindow', 'allocatedRenderTime', 'timeFactor', 'lastRenderTimeInSeconds', 'numberOfPropsRendered', 'lastRenderingUsedDepthPeeling', 'selector']);\n setGet(publicAPI, model, ['twoSidedLighting', 'lightFollowCamera', 'automaticLightCreation', 'erase', 'draw', 'nearClippingPlaneTolerance', 'clippingRangeExpansion', 'backingStore', 'interactive', 'layer', 'preserveColorBuffer', 'preserveDepthBuffer', 'useDepthPeeling', 'occlusionRatio', 'maximumNumberOfPeels', 'delegate', 'backgroundTexture', 'texturedBackground', 'environmentTexture', 'environmentTextureDiffuseStrength', 'environmentTextureSpecularStrength', 'useEnvironmentTextureAsBackground', 'useShadows', 'pass']);\n getArray(publicAPI, model, ['actors', 'volumes', 'lights']);\n setGetArray(publicAPI, model, ['background'], 4, 1.0);\n moveToProtected(publicAPI, model, ['renderWindow']); // Object methods\n\n vtkRenderer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkRenderer'); // ----------------------------------------------------------------------------\n\nvar vtkRenderer$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkRenderer$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// vtkTexture methods\n// ----------------------------------------------------------------------------\n\nfunction vtkTexture(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkTexture');\n\n publicAPI.imageLoaded = function () {\n model.image.removeEventListener('load', publicAPI.imageLoaded);\n model.imageLoaded = true;\n publicAPI.modified();\n };\n\n publicAPI.setJsImageData = function (imageData) {\n if (model.jsImageData === imageData) {\n return;\n } // clear other entries\n\n\n if (imageData !== null) {\n publicAPI.setInputData(null);\n publicAPI.setInputConnection(null);\n model.image = null;\n model.canvas = null;\n }\n\n model.jsImageData = imageData;\n model.imageLoaded = true;\n publicAPI.modified();\n };\n\n publicAPI.setCanvas = function (canvas) {\n if (model.canvas === canvas) {\n return;\n } // clear other entries\n\n\n if (canvas !== null) {\n publicAPI.setInputData(null);\n publicAPI.setInputConnection(null);\n model.image = null;\n model.jsImageData = null;\n }\n\n model.canvas = canvas;\n publicAPI.modified();\n };\n\n publicAPI.setImage = function (image) {\n if (model.image === image) {\n return;\n } // clear other entries\n\n\n if (image !== null) {\n publicAPI.setInputData(null);\n publicAPI.setInputConnection(null);\n model.canvas = null;\n model.jsImageData = null;\n }\n\n model.image = image;\n model.imageLoaded = false;\n\n if (image.complete) {\n publicAPI.imageLoaded();\n } else {\n image.addEventListener('load', publicAPI.imageLoaded);\n }\n\n publicAPI.modified();\n };\n\n publicAPI.getDimensionality = function () {\n var width = 0;\n var height = 0;\n var depth = 1;\n\n if (publicAPI.getInputData()) {\n var data = publicAPI.getInputData();\n width = data.getDimensions()[0];\n height = data.getDimensions()[1];\n depth = data.getDimensions()[2];\n }\n\n if (model.jsImageData) {\n width = model.jsImageData.width;\n height = model.jsImageData.height;\n }\n\n if (model.canvas) {\n width = model.canvas.width;\n height = model.canvas.height;\n }\n\n if (model.image) {\n width = model.image.width;\n height = model.image.height;\n }\n\n var dimensionality = (width > 1) + (height > 1) + (depth > 1);\n return dimensionality;\n };\n\n publicAPI.getInputAsJsImageData = function () {\n if (!model.imageLoaded || publicAPI.getInputData()) return null;\n\n if (model.jsImageData) {\n return model.jsImageData();\n }\n\n if (model.canvas) {\n var context = model.canvas.getContext('2d');\n var imageData = context.getImageData(0, 0, model.canvas.width, model.canvas.height);\n return imageData;\n }\n\n if (model.image) {\n var canvas = document.createElement('canvas');\n canvas.width = model.image.width;\n canvas.height = model.image.height;\n\n var _context = canvas.getContext('2d');\n\n _context.translate(0, canvas.height);\n\n _context.scale(1, -1);\n\n _context.drawImage(model.image, 0, 0, model.image.width, model.image.height);\n\n var _imageData = _context.getImageData(0, 0, canvas.width, canvas.height);\n\n return _imageData;\n }\n\n return null;\n };\n} // Use nativeArray instead of self\n\n\nvar generateMipmaps = function generateMipmaps(nativeArray, width, height, level) {\n // TODO: FIX UNEVEN TEXTURE MIP GENERATION:\n // When textures don't have standard ratios, higher mip levels\n // result in their color chanels getting messed up and shifting\n // 3x3 gaussian kernel\n var g3m = [1, 2, 1]; // eslint-disable-line\n\n var g3w = 4; // eslint-disable-line\n\n var kernel = g3m;\n var kernelWeight = g3w;\n var hs = nativeArray.length / (width * height); // TODO: support for textures with depth more than 1\n\n var currentWidth = width;\n var currentHeight = height;\n var imageData = nativeArray;\n var maps = [imageData];\n\n for (var i = 0; i < level; i++) {\n var oldData = _toConsumableArray(imageData);\n\n currentWidth /= 2;\n currentHeight /= 2;\n imageData = new Uint8ClampedArray(currentWidth * currentHeight * hs);\n var vs = hs * currentWidth; // Scale down\n\n var shift = 0;\n\n for (var p = 0; p < imageData.length; p += hs) {\n if (p % vs === 0) {\n shift += 2 * hs * currentWidth;\n }\n\n for (var c = 0; c < hs; c++) {\n var sample = oldData[shift + c];\n sample += oldData[shift + hs + c];\n sample += oldData[shift - 2 * vs + c];\n sample += oldData[shift - 2 * vs + hs + c];\n sample /= 4;\n imageData[p + c] = sample;\n }\n\n shift += 2 * hs;\n } // Horizontal Pass\n\n\n var dataCopy = _toConsumableArray(imageData);\n\n for (var _p = 0; _p < imageData.length; _p += hs) {\n for (var _c = 0; _c < hs; _c++) {\n var x = -(kernel.length - 1) / 2;\n var kw = kernelWeight;\n var value = 0.0;\n\n for (var k = 0; k < kernel.length; k++) {\n var index = _p + _c + x * hs;\n var lineShift = index % vs - (_p + _c) % vs;\n if (lineShift > hs) index += vs;\n if (lineShift < -hs) index -= vs;\n\n if (dataCopy[index]) {\n value += dataCopy[index] * kernel[k];\n } else {\n kw -= kernel[k];\n }\n\n x += 1;\n }\n\n imageData[_p + _c] = value / kw;\n }\n } // Vertical Pass\n\n\n dataCopy = _toConsumableArray(imageData);\n\n for (var _p2 = 0; _p2 < imageData.length; _p2 += hs) {\n for (var _c2 = 0; _c2 < hs; _c2++) {\n var _x = -(kernel.length - 1) / 2;\n\n var _kw = kernelWeight;\n var _value = 0.0;\n\n for (var _k = 0; _k < kernel.length; _k++) {\n var _index = _p2 + _c2 + _x * vs;\n\n if (dataCopy[_index]) {\n _value += dataCopy[_index] * kernel[_k];\n } else {\n _kw -= kernel[_k];\n }\n\n _x += 1;\n }\n\n imageData[_p2 + _c2] = _value / _kw;\n }\n }\n\n maps.push(imageData);\n }\n\n return maps;\n}; // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n image: null,\n canvas: null,\n jsImageData: null,\n imageLoaded: false,\n repeat: false,\n interpolate: false,\n edgeClamp: false,\n mipLevel: 0,\n resizable: false // must be set at construction time if the texture can be resizable\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.algo(publicAPI, model, 6, 0);\n macro.get(publicAPI, model, ['canvas', 'image', 'jsImageData', 'imageLoaded', 'resizable']);\n macro.setGet(publicAPI, model, ['repeat', 'edgeClamp', 'interpolate', 'mipLevel']);\n vtkTexture(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkTexture');\nvar STATIC = {\n generateMipmaps: generateMipmaps\n}; // ----------------------------------------------------------------------------\n\nvar vtkTexture$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkTexture$1 as default, extend, newInstance };\n","var PassTypes = {\n MIN_KNOWN_PASS: 0,\n ACTOR_PASS: 0,\n COMPOSITE_INDEX_PASS: 1,\n ID_LOW24: 2,\n ID_HIGH24: 3,\n MAX_KNOWN_PASS: 3\n};\nvar Constants = {\n PassTypes: PassTypes\n};\n\nexport { PassTypes, Constants as default };\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","import _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport _get from '@babel/runtime/helpers/get';\nimport _inherits from '@babel/runtime/helpers/inherits';\nimport _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';\nimport _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';\nimport _wrapNativeSuper from '@babel/runtime/helpers/wrapNativeSuper';\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\n/* eslint-disable prefer-rest-params */\nvar ClassHierarchy = /*#__PURE__*/function (_Array) {\n _inherits(ClassHierarchy, _Array);\n\n var _super = _createSuper(ClassHierarchy);\n\n function ClassHierarchy() {\n _classCallCheck(this, ClassHierarchy);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(ClassHierarchy, [{\n key: \"push\",\n value: function push() {\n for (var i = 0; i < arguments.length; i++) {\n if (!this.includes(arguments[i])) {\n _get(_getPrototypeOf(ClassHierarchy.prototype), \"push\", this).call(this, arguments[i]);\n }\n }\n\n return this.length;\n }\n }]);\n\n return ClassHierarchy;\n}( /*#__PURE__*/_wrapNativeSuper(Array));\n\nexport { ClassHierarchy as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _typeof from '@babel/runtime/helpers/typeof';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _construct from '@babel/runtime/helpers/construct';\nimport DeepEqual from 'fast-deep-equal';\nimport vtk, { vtkGlobal } from './vtk.js';\nimport ClassHierarchy from './Common/Core/ClassHierarchy.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar globalMTime = 0;\nvar VOID = Symbol('void');\n\nfunction getCurrentGlobalMTime() {\n return globalMTime;\n} // ----------------------------------------------------------------------------\n// Logging function calls\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-prototype-builtins */\n\n\nvar fakeConsole = {};\n\nfunction noOp() {}\n\nvar consoleMethods = ['log', 'debug', 'info', 'warn', 'error', 'time', 'timeEnd', 'group', 'groupEnd'];\nconsoleMethods.forEach(function (methodName) {\n fakeConsole[methodName] = noOp;\n});\nvtkGlobal.console = console.hasOwnProperty('log') ? console : fakeConsole;\nvar loggerFunctions = {\n debug: noOp,\n // Don't print debug by default\n error: vtkGlobal.console.error || noOp,\n info: vtkGlobal.console.info || noOp,\n log: vtkGlobal.console.log || noOp,\n warn: vtkGlobal.console.warn || noOp\n};\nfunction setLoggerFunction(name, fn) {\n if (loggerFunctions[name]) {\n loggerFunctions[name] = fn || noOp;\n }\n}\nfunction vtkLogMacro() {\n loggerFunctions.log.apply(loggerFunctions, arguments);\n}\nfunction vtkInfoMacro() {\n loggerFunctions.info.apply(loggerFunctions, arguments);\n}\nfunction vtkDebugMacro() {\n loggerFunctions.debug.apply(loggerFunctions, arguments);\n}\nfunction vtkErrorMacro() {\n loggerFunctions.error.apply(loggerFunctions, arguments);\n}\nfunction vtkWarningMacro() {\n loggerFunctions.warn.apply(loggerFunctions, arguments);\n}\nvar ERROR_ONCE_MAP = {};\nfunction vtkOnceErrorMacro(str) {\n if (!ERROR_ONCE_MAP[str]) {\n loggerFunctions.error(str);\n ERROR_ONCE_MAP[str] = true;\n }\n} // ----------------------------------------------------------------------------\n// TypedArray\n// ----------------------------------------------------------------------------\n\nvar TYPED_ARRAYS = Object.create(null);\nTYPED_ARRAYS.Float32Array = Float32Array;\nTYPED_ARRAYS.Float64Array = Float64Array;\nTYPED_ARRAYS.Uint8Array = Uint8Array;\nTYPED_ARRAYS.Int8Array = Int8Array;\nTYPED_ARRAYS.Uint16Array = Uint16Array;\nTYPED_ARRAYS.Int16Array = Int16Array;\nTYPED_ARRAYS.Uint32Array = Uint32Array;\nTYPED_ARRAYS.Int32Array = Int32Array;\nTYPED_ARRAYS.Uint8ClampedArray = Uint8ClampedArray;\n\ntry {\n TYPED_ARRAYS.BigInt64Array = BigInt64Array;\n TYPED_ARRAYS.BigUint64Array = BigUint64Array;\n} catch (_unused) {// ignore\n}\n\nfunction newTypedArray(type) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return _construct(TYPED_ARRAYS[type] || Float64Array, args);\n}\nfunction newTypedArrayFrom(type) {\n var _ref;\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return (_ref = TYPED_ARRAYS[type] || Float64Array).from.apply(_ref, args);\n} // ----------------------------------------------------------------------------\n// capitilize provided string\n// ----------------------------------------------------------------------------\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nfunction _capitalize(str) {\n return capitalize(str[0] === '_' ? str.slice(1) : str);\n}\nfunction uncapitalize(str) {\n return str.charAt(0).toLowerCase() + str.slice(1);\n} // ----------------------------------------------------------------------------\n// Convert byte size into a well formatted string\n// ----------------------------------------------------------------------------\n\nfunction formatBytesToProperUnit(size) {\n var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var chunkSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;\n var units = ['TB', 'GB', 'MB', 'KB'];\n var value = Number(size);\n var currentUnit = 'B';\n\n while (value > chunkSize) {\n value /= chunkSize;\n currentUnit = units.pop();\n }\n\n return \"\".concat(value.toFixed(precision), \" \").concat(currentUnit);\n} // ----------------------------------------------------------------------------\n// Convert thousand number with proper separator\n// ----------------------------------------------------------------------------\n\nfunction formatNumbersWithThousandSeparator(n) {\n var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ' ';\n var sections = [];\n var size = n;\n\n while (size > 1000) {\n sections.push(\"000\".concat(size % 1000).slice(-3));\n size = Math.floor(size / 1000);\n }\n\n if (size > 0) {\n sections.push(size);\n }\n\n sections.reverse();\n return sections.join(separator);\n} // ----------------------------------------------------------------------------\n// Array helper\n// ----------------------------------------------------------------------------\n\nfunction safeArrays(model) {\n Object.keys(model).forEach(function (key) {\n if (Array.isArray(model[key])) {\n model[key] = [].concat(model[key]);\n }\n });\n} // ----------------------------------------------------------------------------\n// shallow equals\n// ----------------------------------------------------------------------------\n\n\nfunction shallowEquals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n} // ----------------------------------------------------------------------------\n\n\nfunction enumToString(e, value) {\n return Object.keys(e).find(function (key) {\n return e[key] === value;\n });\n}\n\nfunction getStateArrayMapFunc(item) {\n if (item && item.isA) {\n return item.getState();\n }\n\n return item;\n} // ----------------------------------------------------------------------------\n// setImmediate\n// ----------------------------------------------------------------------------\n\n\nfunction setImmediateVTK(fn) {\n setTimeout(fn, 0);\n} // ----------------------------------------------------------------------------\n// measurePromiseExecution\n//\n// Measures the time it takes for a promise to finish from\n// the time this function is invoked.\n// The callback receives the time it took for the promise to resolve or reject.\n// ----------------------------------------------------------------------------\n\nfunction measurePromiseExecution(promise, callback) {\n var start = performance.now();\n promise.finally(function () {\n var delta = performance.now() - start;\n callback(delta);\n });\n} // ----------------------------------------------------------------------------\n// vtkObject: modified(), onModified(callback), delete()\n// ----------------------------------------------------------------------------\n\nfunction obj() {\n var publicAPI = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var model = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n // Ensure each instance as a unique ref of array\n safeArrays(model);\n var callbacks = [];\n\n if (!Number.isInteger(model.mtime)) {\n model.mtime = ++globalMTime;\n }\n\n if (!('classHierarchy' in model)) {\n model.classHierarchy = new ClassHierarchy('vtkObject');\n } else if (!(model.classHierarchy instanceof ClassHierarchy)) {\n var hierarchy = new ClassHierarchy();\n\n for (var i = 0; i < model.classHierarchy.length; i++) {\n hierarchy.push(model.classHierarchy[i]);\n }\n\n model.classHierarchy = hierarchy;\n }\n\n function off(index) {\n callbacks[index] = null;\n }\n\n function on(index) {\n function unsubscribe() {\n off(index);\n }\n\n return Object.freeze({\n unsubscribe: unsubscribe\n });\n }\n\n publicAPI.isDeleted = function () {\n return !!model.deleted;\n };\n\n publicAPI.modified = function (otherMTime) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (otherMTime && otherMTime < publicAPI.getMTime()) {\n return;\n }\n\n model.mtime = ++globalMTime;\n callbacks.forEach(function (callback) {\n return callback && callback(publicAPI);\n });\n };\n\n publicAPI.onModified = function (callback) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return null;\n }\n\n var index = callbacks.length;\n callbacks.push(callback);\n return on(index);\n };\n\n publicAPI.getMTime = function () {\n return model.mtime;\n };\n\n publicAPI.isA = function (className) {\n var count = model.classHierarchy.length; // we go backwards as that is more likely for\n // early termination\n\n while (count--) {\n if (model.classHierarchy[count] === className) {\n return true;\n }\n }\n\n return false;\n };\n\n publicAPI.getClassName = function () {\n var depth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.classHierarchy[model.classHierarchy.length - 1 - depth];\n };\n\n publicAPI.set = function () {\n var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var noWarning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var noFunction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var ret = false;\n Object.keys(map).forEach(function (name) {\n var fn = noFunction ? null : publicAPI[\"set\".concat(capitalize(name))];\n\n if (fn && Array.isArray(map[name]) && fn.length > 1) {\n ret = fn.apply(void 0, _toConsumableArray(map[name])) || ret;\n } else if (fn) {\n ret = fn(map[name]) || ret;\n } else {\n // Set data on model directly\n if (['mtime'].indexOf(name) === -1 && !noWarning) {\n vtkWarningMacro(\"Warning: Set value to model directly \".concat(name, \", \").concat(map[name]));\n }\n\n ret = model[name] !== map[name] || ret;\n model[name] = map[name];\n }\n });\n return ret;\n };\n\n publicAPI.get = function () {\n for (var _len3 = arguments.length, list = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n list[_key3] = arguments[_key3];\n }\n\n if (!list.length) {\n return model;\n }\n\n var subset = {};\n list.forEach(function (name) {\n subset[name] = model[name];\n });\n return subset;\n };\n\n publicAPI.getReferenceByName = function (val) {\n return model[val];\n };\n\n publicAPI.delete = function () {\n Object.keys(model).forEach(function (field) {\n return delete model[field];\n });\n callbacks.forEach(function (el, index) {\n return off(index);\n }); // Flag the instance being deleted\n\n model.deleted = true;\n }; // Add serialization support\n\n\n publicAPI.getState = function () {\n if (model.deleted) {\n return null;\n }\n\n var jsonArchive = _objectSpread(_objectSpread({}, model), {}, {\n vtkClass: publicAPI.getClassName()\n }); // Convert every vtkObject to its serializable form\n\n\n Object.keys(jsonArchive).forEach(function (keyName) {\n if (jsonArchive[keyName] === null || jsonArchive[keyName] === undefined || keyName[0] === '_' // protected members start with _\n ) {\n delete jsonArchive[keyName];\n } else if (jsonArchive[keyName].isA) {\n jsonArchive[keyName] = jsonArchive[keyName].getState();\n } else if (Array.isArray(jsonArchive[keyName])) {\n jsonArchive[keyName] = jsonArchive[keyName].map(getStateArrayMapFunc);\n }\n }); // Sort resulting object by key name\n\n var sortedObj = {};\n Object.keys(jsonArchive).sort().forEach(function (name) {\n sortedObj[name] = jsonArchive[name];\n }); // Remove mtime\n\n if (sortedObj.mtime) {\n delete sortedObj.mtime;\n }\n\n return sortedObj;\n }; // Add shallowCopy(otherInstance) support\n\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (other.getClassName() !== publicAPI.getClassName()) {\n throw new Error(\"Cannot ShallowCopy \".concat(other.getClassName(), \" into \").concat(publicAPI.getClassName()));\n }\n\n var otherModel = other.get();\n var keyList = Object.keys(model).sort();\n var otherKeyList = Object.keys(otherModel).sort();\n otherKeyList.forEach(function (key) {\n var keyIdx = keyList.indexOf(key);\n\n if (keyIdx === -1) {\n if (debug) {\n vtkDebugMacro(\"add \".concat(key, \" in shallowCopy\"));\n }\n } else {\n keyList.splice(keyIdx, 1);\n }\n\n model[key] = otherModel[key];\n });\n\n if (keyList.length && debug) {\n vtkDebugMacro(\"Untouched keys: \".concat(keyList.join(', ')));\n }\n\n publicAPI.modified();\n }; // This function will get called when one invoke JSON.stringify(vtkObject)\n // JSON.stringify will only stringify the return value of this function\n\n\n publicAPI.toJSON = function vtkObjToJSON() {\n return publicAPI.getState();\n }; // Allow usage as decorator\n\n\n return publicAPI;\n} // ----------------------------------------------------------------------------\n// getXXX: add getters\n// ----------------------------------------------------------------------------\n\nvar objectGetterMap = {\n object: function object(publicAPI, model, field) {\n return function getter() {\n return _objectSpread({}, model[field.name]);\n };\n }\n};\nfunction get(publicAPI, model, fieldNames) {\n fieldNames.forEach(function (field) {\n if (_typeof(field) === 'object') {\n var getter = objectGetterMap[field.type];\n\n if (getter) {\n publicAPI[\"get\".concat(_capitalize(field.name))] = getter(publicAPI, model, field);\n } else {\n publicAPI[\"get\".concat(_capitalize(field.name))] = function () {\n return model[field.name];\n };\n }\n } else {\n publicAPI[\"get\".concat(_capitalize(field))] = function () {\n return model[field];\n };\n }\n });\n} // ----------------------------------------------------------------------------\n// setXXX: add setters\n// ----------------------------------------------------------------------------\n\nvar objectSetterMap = {\n enum: function _enum(publicAPI, model, field) {\n var onChanged = \"_on\".concat(_capitalize(field.name), \"Changed\");\n return function (value) {\n if (typeof value === 'string') {\n if (field.enum[value] !== undefined) {\n if (model[field.name] !== field.enum[value]) {\n model[field.name] = field.enum[value];\n publicAPI.modified();\n return true;\n }\n\n return false;\n }\n\n vtkErrorMacro(\"Set Enum with invalid argument \".concat(field, \", \").concat(value));\n throw new RangeError('Set Enum with invalid string argument');\n }\n\n if (typeof value === 'number') {\n if (model[field.name] !== value) {\n if (Object.keys(field.enum).map(function (key) {\n return field.enum[key];\n }).indexOf(value) !== -1) {\n var _model$onChanged;\n\n var previousValue = model[field.name];\n model[field.name] = value;\n (_model$onChanged = model[onChanged]) === null || _model$onChanged === void 0 ? void 0 : _model$onChanged.call(model, publicAPI, model, value, previousValue);\n publicAPI.modified();\n return true;\n }\n\n vtkErrorMacro(\"Set Enum outside numeric range \".concat(field, \", \").concat(value));\n throw new RangeError('Set Enum outside numeric range');\n }\n\n return false;\n }\n\n vtkErrorMacro(\"Set Enum with invalid argument (String/Number) \".concat(field, \", \").concat(value));\n throw new TypeError('Set Enum with invalid argument (String/Number)');\n };\n },\n object: function object(publicAPI, model, field) {\n var onChanged = \"_on\".concat(_capitalize(field.name), \"Changed\");\n return function (value) {\n if (!DeepEqual(model[field.name], value)) {\n var _model$onChanged2;\n\n var previousValue = model[field.name];\n model[field.name] = value;\n (_model$onChanged2 = model[onChanged]) === null || _model$onChanged2 === void 0 ? void 0 : _model$onChanged2.call(model, publicAPI, model, value, previousValue);\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n }\n};\n\nfunction findSetter(field) {\n if (_typeof(field) === 'object') {\n var fn = objectSetterMap[field.type];\n\n if (fn) {\n return function (publicAPI, model) {\n return fn(publicAPI, model, field);\n };\n }\n\n vtkErrorMacro(\"No setter for field \".concat(field));\n throw new TypeError('No setter for field');\n }\n\n return function getSetter(publicAPI, model) {\n var onChanged = \"_on\".concat(_capitalize(field), \"Changed\");\n return function setter(value) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return false;\n }\n\n if (model[field] !== value) {\n var _model$onChanged3;\n\n var previousValue = model[field.name];\n model[field] = value;\n (_model$onChanged3 = model[onChanged]) === null || _model$onChanged3 === void 0 ? void 0 : _model$onChanged3.call(model, publicAPI, model, value, previousValue);\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n };\n}\n\nfunction set(publicAPI, model, fields) {\n fields.forEach(function (field) {\n if (_typeof(field) === 'object') {\n publicAPI[\"set\".concat(_capitalize(field.name))] = findSetter(field)(publicAPI, model);\n } else {\n publicAPI[\"set\".concat(_capitalize(field))] = findSetter(field)(publicAPI, model);\n }\n });\n} // ----------------------------------------------------------------------------\n// set/get XXX: add both setters and getters\n// ----------------------------------------------------------------------------\n\nfunction setGet(publicAPI, model, fieldNames) {\n get(publicAPI, model, fieldNames);\n set(publicAPI, model, fieldNames);\n} // ----------------------------------------------------------------------------\n// getXXX: add getters for object of type array with copy to be safe\n// getXXXByReference: add getters for object of type array without copy\n// ----------------------------------------------------------------------------\n\nfunction getArray(publicAPI, model, fieldNames) {\n fieldNames.forEach(function (field) {\n publicAPI[\"get\".concat(_capitalize(field))] = function () {\n return model[field] ? Array.from(model[field]) : model[field];\n };\n\n publicAPI[\"get\".concat(_capitalize(field), \"ByReference\")] = function () {\n return model[field];\n };\n });\n} // ----------------------------------------------------------------------------\n// setXXX: add setter for object of type array\n// if 'defaultVal' is supplied, shorter arrays will be padded to 'size' with 'defaultVal'\n// set...From: fast path to copy the content of an array to the current one without call to modified.\n// ----------------------------------------------------------------------------\n\nfunction setArray(publicAPI, model, fieldNames, size) {\n var defaultVal = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;\n fieldNames.forEach(function (field) {\n if (model[field] && size && model[field].length !== size) {\n throw new RangeError(\"Invalid initial number of values for array (\".concat(field, \")\"));\n }\n\n var onChanged = \"_on\".concat(_capitalize(field), \"Changed\");\n\n publicAPI[\"set\".concat(_capitalize(field))] = function () {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return false;\n }\n\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n var array = args;\n var changeDetected;\n var needCopy = false; // allow null or an array to be passed as a single arg.\n\n if (array.length === 1 && (array[0] == null || array[0].length >= 0)) {\n /* eslint-disable prefer-destructuring */\n array = array[0];\n /* eslint-enable prefer-destructuring */\n\n needCopy = true;\n }\n\n if (array == null) {\n changeDetected = model[field] !== array;\n } else {\n if (size && array.length !== size) {\n if (array.length < size && defaultVal !== undefined) {\n array = Array.from(array);\n needCopy = false;\n\n while (array.length < size) {\n array.push(defaultVal);\n }\n } else {\n throw new RangeError(\"Invalid number of values for array setter (\".concat(field, \")\"));\n }\n }\n\n changeDetected = model[field] == null || model[field].length !== array.length;\n\n for (var i = 0; !changeDetected && i < array.length; ++i) {\n changeDetected = model[field][i] !== array[i];\n }\n\n if (changeDetected && needCopy) {\n array = Array.from(array);\n }\n }\n\n if (changeDetected) {\n var _model$onChanged4;\n\n var previousValue = model[field.name];\n model[field] = array;\n (_model$onChanged4 = model[onChanged]) === null || _model$onChanged4 === void 0 ? void 0 : _model$onChanged4.call(model, publicAPI, model, array, previousValue);\n publicAPI.modified();\n }\n\n return changeDetected;\n };\n\n publicAPI[\"set\".concat(_capitalize(field), \"From\")] = function (otherArray) {\n var target = model[field];\n otherArray.forEach(function (v, i) {\n target[i] = v;\n });\n };\n });\n} // ----------------------------------------------------------------------------\n// set/get XXX: add setter and getter for object of type array\n// ----------------------------------------------------------------------------\n\nfunction setGetArray(publicAPI, model, fieldNames, size) {\n var defaultVal = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;\n getArray(publicAPI, model, fieldNames);\n setArray(publicAPI, model, fieldNames, size, defaultVal);\n}\nfunction moveToProtected(publicAPI, model, fieldNames) {\n for (var i = 0; i < fieldNames.length; i++) {\n var fieldName = fieldNames[i];\n\n if (model[fieldName] !== undefined) {\n model[\"_\".concat(fieldName)] = model[fieldName];\n delete model[fieldName];\n }\n }\n} // ----------------------------------------------------------------------------\n// vtkAlgorithm: setInputData(), setInputConnection(), getOutputData(), getOutputPort()\n// ----------------------------------------------------------------------------\n\nfunction algo(publicAPI, model, numberOfInputs, numberOfOutputs) {\n if (model.inputData) {\n model.inputData = model.inputData.map(vtk);\n } else {\n model.inputData = [];\n }\n\n if (model.inputConnection) {\n model.inputConnection = model.inputConnection.map(vtk);\n } else {\n model.inputConnection = [];\n }\n\n if (model.output) {\n model.output = model.output.map(vtk);\n } else {\n model.output = [];\n }\n\n if (model.inputArrayToProcess) {\n model.inputArrayToProcess = model.inputArrayToProcess.map(vtk);\n } else {\n model.inputArrayToProcess = [];\n } // Cache the argument for later manipulation\n\n\n model.numberOfInputs = numberOfInputs; // Methods\n\n function setInputData(dataset) {\n var port = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (port >= model.numberOfInputs) {\n vtkErrorMacro(\"algorithm \".concat(publicAPI.getClassName(), \" only has \").concat(model.numberOfInputs, \" input ports. To add more input ports, use addInputData()\"));\n return;\n }\n\n if (model.inputData[port] !== dataset || model.inputConnection[port]) {\n model.inputData[port] = dataset;\n model.inputConnection[port] = null;\n\n if (publicAPI.modified) {\n publicAPI.modified();\n }\n }\n }\n\n function getInputData() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (model.inputConnection[port]) {\n model.inputData[port] = model.inputConnection[port]();\n }\n\n return model.inputData[port];\n }\n\n function setInputConnection(outputPort) {\n var port = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (port >= model.numberOfInputs) {\n var msg = \"algorithm \".concat(publicAPI.getClassName(), \" only has \");\n msg += \"\".concat(model.numberOfInputs);\n msg += ' input ports. To add more input ports, use addInputConnection()';\n vtkErrorMacro(msg);\n return;\n }\n\n model.inputData[port] = null;\n model.inputConnection[port] = outputPort;\n }\n\n function getInputConnection() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.inputConnection[port];\n }\n\n function getPortToFill() {\n var portToFill = model.numberOfInputs;\n\n while (portToFill && !model.inputData[portToFill - 1] && !model.inputConnection[portToFill - 1]) {\n portToFill--;\n }\n\n if (portToFill === model.numberOfInputs) {\n model.numberOfInputs++;\n }\n\n return portToFill;\n }\n\n function addInputConnection(outputPort) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n setInputConnection(outputPort, getPortToFill());\n }\n\n function addInputData(dataset) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n setInputData(dataset, getPortToFill());\n }\n\n function getOutputData() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return null;\n }\n\n if (publicAPI.shouldUpdate()) {\n publicAPI.update();\n }\n\n return model.output[port];\n }\n\n publicAPI.shouldUpdate = function () {\n var localMTime = publicAPI.getMTime();\n var minOutputMTime = Infinity;\n var count = numberOfOutputs;\n\n while (count--) {\n if (!model.output[count] || model.output[count].isDeleted()) {\n return true;\n }\n\n var mt = model.output[count].getMTime();\n\n if (mt < localMTime) {\n return true;\n }\n\n if (mt < minOutputMTime) {\n minOutputMTime = mt;\n }\n }\n\n count = model.numberOfInputs;\n\n while (count--) {\n var _model$inputConnectio, _publicAPI$getInputDa;\n\n if ((_model$inputConnectio = model.inputConnection[count]) !== null && _model$inputConnectio !== void 0 && _model$inputConnectio.filter.shouldUpdate() || ((_publicAPI$getInputDa = publicAPI.getInputData(count)) === null || _publicAPI$getInputDa === void 0 ? void 0 : _publicAPI$getInputDa.getMTime()) > minOutputMTime) {\n return true;\n }\n }\n\n return false;\n };\n\n function getOutputPort() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n var outputPortAccess = function outputPortAccess() {\n return getOutputData(port);\n }; // Add reference to filter\n\n\n outputPortAccess.filter = publicAPI;\n return outputPortAccess;\n } // Handle input if needed\n\n\n if (model.numberOfInputs) {\n // Reserve inputs\n var count = model.numberOfInputs;\n\n while (count--) {\n model.inputData.push(null);\n model.inputConnection.push(null);\n } // Expose public methods\n\n\n publicAPI.setInputData = setInputData;\n publicAPI.setInputConnection = setInputConnection;\n publicAPI.addInputData = addInputData;\n publicAPI.addInputConnection = addInputConnection;\n publicAPI.getInputData = getInputData;\n publicAPI.getInputConnection = getInputConnection;\n }\n\n if (numberOfOutputs) {\n publicAPI.getOutputData = getOutputData;\n publicAPI.getOutputPort = getOutputPort;\n }\n\n publicAPI.update = function () {\n var ins = [];\n\n if (model.numberOfInputs) {\n var _count = 0;\n\n while (_count < model.numberOfInputs) {\n ins[_count] = publicAPI.getInputData(_count);\n _count++;\n }\n }\n\n if (publicAPI.shouldUpdate() && publicAPI.requestData) {\n publicAPI.requestData(ins, model.output);\n }\n };\n\n publicAPI.getNumberOfInputPorts = function () {\n return model.numberOfInputs;\n };\n\n publicAPI.getNumberOfOutputPorts = function () {\n return numberOfOutputs || model.output.length;\n };\n\n publicAPI.getInputArrayToProcess = function (inputPort) {\n var arrayDesc = model.inputArrayToProcess[inputPort];\n var ds = model.inputData[inputPort];\n\n if (arrayDesc && ds) {\n return ds[\"get\".concat(arrayDesc.fieldAssociation)]().getArray(arrayDesc.arrayName);\n }\n\n return null;\n };\n\n publicAPI.setInputArrayToProcess = function (inputPort, arrayName, fieldAssociation) {\n var attributeType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'Scalars';\n\n while (model.inputArrayToProcess.length < inputPort) {\n model.inputArrayToProcess.push(null);\n }\n\n model.inputArrayToProcess[inputPort] = {\n arrayName: arrayName,\n fieldAssociation: fieldAssociation,\n attributeType: attributeType\n };\n };\n} // ----------------------------------------------------------------------------\n// Event handling: onXXX(callback), invokeXXX(args...)\n// ----------------------------------------------------------------------------\n\nvar EVENT_ABORT = Symbol('Event abort');\nfunction event(publicAPI, model, eventName) {\n var callbacks = [];\n var previousDelete = publicAPI.delete;\n var curCallbackID = 1;\n\n function off(callbackID) {\n for (var i = 0; i < callbacks.length; ++i) {\n var _callbacks$i = _slicedToArray(callbacks[i], 1),\n cbID = _callbacks$i[0];\n\n if (cbID === callbackID) {\n callbacks.splice(i, 1);\n return;\n }\n }\n }\n\n function on(callbackID) {\n function unsubscribe() {\n off(callbackID);\n }\n\n return Object.freeze({\n unsubscribe: unsubscribe\n });\n }\n\n function invoke() {\n var _arguments = arguments;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n /* eslint-disable prefer-rest-params */\n // Go through a copy of the callbacks array in case new callbacks\n // get prepended within previous callbacks\n\n\n var currentCallbacks = callbacks.slice();\n\n var _loop = function _loop(index) {\n var _currentCallbacks$ind = _slicedToArray(currentCallbacks[index], 3),\n cb = _currentCallbacks$ind[1],\n priority = _currentCallbacks$ind[2];\n\n if (!cb) {\n return \"continue\"; // eslint-disable-line\n }\n\n if (priority < 0) {\n setTimeout(function () {\n return cb.apply(publicAPI, _arguments);\n }, 1 - priority);\n } else {\n // Abort only if the callback explicitly returns false\n var continueNext = cb.apply(publicAPI, _arguments);\n\n if (continueNext === EVENT_ABORT) {\n return \"break\";\n }\n }\n };\n\n for (var index = 0; index < currentCallbacks.length; ++index) {\n var _ret = _loop(index);\n\n if (_ret === \"continue\") continue;\n if (_ret === \"break\") break;\n }\n /* eslint-enable prefer-rest-params */\n\n }\n\n publicAPI[\"invoke\".concat(_capitalize(eventName))] = invoke;\n\n publicAPI[\"on\".concat(_capitalize(eventName))] = function (callback) {\n var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.0;\n\n if (!callback.apply) {\n console.error(\"Invalid callback for event \".concat(eventName));\n return null;\n }\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return null;\n }\n\n var callbackID = curCallbackID++;\n callbacks.push([callbackID, callback, priority]);\n callbacks.sort(function (cb1, cb2) {\n return cb2[2] - cb1[2];\n });\n return on(callbackID);\n };\n\n publicAPI.delete = function () {\n previousDelete();\n callbacks.forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 1),\n cbID = _ref3[0];\n\n return off(cbID);\n });\n };\n} // ----------------------------------------------------------------------------\n// newInstance\n// ----------------------------------------------------------------------------\n\nfunction newInstance(extend, className) {\n var constructor = function constructor() {\n var initialValues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var model = {};\n var publicAPI = {};\n extend(publicAPI, model, initialValues);\n return Object.freeze(publicAPI);\n }; // Register constructor to factory\n\n\n if (className) {\n vtk.register(className, constructor);\n }\n\n return constructor;\n} // ----------------------------------------------------------------------------\n// Chain function calls\n// ----------------------------------------------------------------------------\n\nfunction chain() {\n for (var _len5 = arguments.length, fn = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n fn[_key5] = arguments[_key5];\n }\n\n return function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n\n return fn.filter(function (i) {\n return !!i;\n }).map(function (i) {\n return i.apply(void 0, args);\n });\n };\n} // ----------------------------------------------------------------------------\n// Some utility methods for vtk objects\n// ----------------------------------------------------------------------------\n\nfunction isVtkObject(instance) {\n return instance && instance.isA && instance.isA('vtkObject');\n}\nfunction traverseInstanceTree(instance, extractFunction) {\n var accumulator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var visitedInstances = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n\n if (isVtkObject(instance)) {\n if (visitedInstances.indexOf(instance) >= 0) {\n // avoid cycles\n return accumulator;\n }\n\n visitedInstances.push(instance);\n var result = extractFunction(instance);\n\n if (result !== undefined) {\n accumulator.push(result);\n } // Now go through this instance's model\n\n\n var model = instance.get();\n Object.keys(model).forEach(function (key) {\n var modelObj = model[key];\n\n if (Array.isArray(modelObj)) {\n modelObj.forEach(function (subObj) {\n traverseInstanceTree(subObj, extractFunction, accumulator, visitedInstances);\n });\n } else {\n traverseInstanceTree(modelObj, extractFunction, accumulator, visitedInstances);\n }\n });\n }\n\n return accumulator;\n} // ----------------------------------------------------------------------------\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\n\nfunction debounce(func, wait, immediate) {\n var _this = this;\n\n var timeout;\n\n var debounced = function debounced() {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n\n var context = _this;\n\n var later = function later() {\n timeout = null;\n\n if (!immediate) {\n func.apply(context, args);\n }\n };\n\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n\n if (callNow) {\n func.apply(context, args);\n }\n };\n\n debounced.cancel = function () {\n return clearTimeout(timeout);\n };\n\n return debounced;\n} // ----------------------------------------------------------------------------\n// Creates a throttled function that only invokes `func` at most once per\n// every `wait` milliseconds.\n\nfunction throttle(callback, delay) {\n var isThrottled = false;\n var argsToUse = null;\n\n function next() {\n isThrottled = false;\n\n if (argsToUse !== null) {\n wrapper.apply(void 0, _toConsumableArray(argsToUse)); // eslint-disable-line\n\n argsToUse = null;\n }\n }\n\n function wrapper() {\n for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {\n args[_key8] = arguments[_key8];\n }\n\n if (isThrottled) {\n argsToUse = args;\n return;\n }\n\n isThrottled = true;\n callback.apply(void 0, args);\n setTimeout(next, delay);\n }\n\n return wrapper;\n} // ----------------------------------------------------------------------------\n// keystore(publicAPI, model, initialKeystore)\n//\n// - initialKeystore: Initial keystore. This can be either a Map or an\n// object.\n//\n// Generated API\n// setKey(key, value) : mixed (returns value)\n// getKey(key) : mixed\n// getAllKeys() : [mixed]\n// deleteKey(key) : Boolean\n// ----------------------------------------------------------------------------\n\nfunction keystore(publicAPI, model) {\n var initialKeystore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n model.keystore = Object.assign(model.keystore || {}, initialKeystore);\n\n publicAPI.setKey = function (key, value) {\n model.keystore[key] = value;\n };\n\n publicAPI.getKey = function (key) {\n return model.keystore[key];\n };\n\n publicAPI.getAllKeys = function () {\n return Object.keys(model.keystore);\n };\n\n publicAPI.deleteKey = function (key) {\n return delete model.keystore[key];\n };\n\n publicAPI.clearKeystore = function () {\n return publicAPI.getAllKeys().forEach(function (key) {\n return delete model.keystore[key];\n });\n };\n} // ----------------------------------------------------------------------------\n// proxy(publicAPI, model, sectionName, propertyUI)\n//\n// - sectionName: Name of the section for UI\n// - propertyUI: List of props with their UI description\n//\n// Generated API\n// getProxyId() : String\n// listProxyProperties() : [string]\n// updateProxyProperty(name, prop)\n// getProxySection() => List of properties for UI generation\n// ----------------------------------------------------------------------------\n\nvar nextProxyId = 1;\nvar ROOT_GROUP_NAME = '__root__';\nfunction proxy(publicAPI, model) {\n // Proxies are keystores\n keystore(publicAPI, model);\n var parentDelete = publicAPI.delete; // getProxyId\n\n model.proxyId = \"\".concat(nextProxyId++); // ui handling\n\n model.ui = JSON.parse(JSON.stringify(model.ui || [])); // deep copy\n\n get(publicAPI, model, ['proxyId', 'proxyGroup', 'proxyName']);\n setGet(publicAPI, model, ['proxyManager']); // group properties\n\n var propertyMap = {};\n var groupChildrenNames = {};\n\n function registerProperties(descriptionList, currentGroupName) {\n if (!groupChildrenNames[currentGroupName]) {\n groupChildrenNames[currentGroupName] = [];\n }\n\n var childrenNames = groupChildrenNames[currentGroupName];\n\n for (var i = 0; i < descriptionList.length; i++) {\n childrenNames.push(descriptionList[i].name);\n propertyMap[descriptionList[i].name] = descriptionList[i];\n\n if (descriptionList[i].children && descriptionList[i].children.length) {\n registerProperties(descriptionList[i].children, descriptionList[i].name);\n }\n }\n }\n\n registerProperties(model.ui, ROOT_GROUP_NAME);\n\n publicAPI.updateUI = function (ui) {\n model.ui = JSON.parse(JSON.stringify(ui || [])); // deep copy\n\n Object.keys(propertyMap).forEach(function (k) {\n return delete propertyMap[k];\n });\n Object.keys(groupChildrenNames).forEach(function (k) {\n return delete groupChildrenNames[k];\n });\n registerProperties(model.ui, ROOT_GROUP_NAME);\n publicAPI.modified();\n };\n\n function listProxyProperties() {\n var gName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ROOT_GROUP_NAME;\n return groupChildrenNames[gName];\n }\n\n publicAPI.updateProxyProperty = function (propertyName, propUI) {\n var prop = propertyMap[propertyName];\n\n if (prop) {\n Object.assign(prop, propUI);\n } else {\n propertyMap[propertyName] = _objectSpread({}, propUI);\n }\n };\n\n publicAPI.activate = function () {\n if (model.proxyManager) {\n var setActiveMethod = \"setActive\".concat(_capitalize(publicAPI.getProxyGroup().slice(0, -1)));\n\n if (model.proxyManager[setActiveMethod]) {\n model.proxyManager[setActiveMethod](publicAPI);\n }\n }\n }; // property link\n\n\n model.propertyLinkSubscribers = {};\n\n publicAPI.registerPropertyLinkForGC = function (otherLink, type) {\n if (!(type in model.propertyLinkSubscribers)) {\n model.propertyLinkSubscribers[type] = [];\n }\n\n model.propertyLinkSubscribers[type].push(otherLink);\n };\n\n publicAPI.gcPropertyLinks = function (type) {\n var subscribers = model.propertyLinkSubscribers[type] || [];\n\n while (subscribers.length) {\n subscribers.pop().unbind(publicAPI);\n }\n };\n\n model.propertyLinkMap = {};\n\n publicAPI.getPropertyLink = function (id) {\n var persistent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (model.propertyLinkMap[id]) {\n return model.propertyLinkMap[id];\n }\n\n var value = null;\n var links = [];\n var count = 0;\n var updateInProgress = false;\n\n function update(source) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (updateInProgress) {\n return null;\n }\n\n var needUpdate = [];\n var sourceLink = null;\n count = links.length;\n\n while (count--) {\n var link = links[count];\n\n if (link.instance === source) {\n sourceLink = link;\n } else {\n needUpdate.push(link);\n }\n }\n\n if (!sourceLink) {\n return null;\n }\n\n var newValue = sourceLink.instance[\"get\".concat(_capitalize(sourceLink.propertyName))]();\n\n if (!shallowEquals(newValue, value) || force) {\n value = newValue;\n updateInProgress = true;\n\n while (needUpdate.length) {\n var linkToUpdate = needUpdate.pop();\n linkToUpdate.instance.set(_defineProperty({}, linkToUpdate.propertyName, value));\n }\n\n updateInProgress = false;\n }\n\n if (model.propertyLinkMap[id].persistent) {\n model.propertyLinkMap[id].value = newValue;\n }\n\n return newValue;\n }\n\n function unbind(instance, propertyName) {\n var indexToDelete = [];\n count = links.length;\n\n while (count--) {\n var link = links[count];\n\n if (link.instance === instance && (link.propertyName === propertyName || propertyName === undefined)) {\n link.subscription.unsubscribe();\n indexToDelete.push(count);\n }\n }\n\n while (indexToDelete.length) {\n links.splice(indexToDelete.pop(), 1);\n }\n }\n\n function bind(instance, propertyName) {\n var updateMe = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var subscription = instance.onModified(update);\n var other = links[0];\n links.push({\n instance: instance,\n propertyName: propertyName,\n subscription: subscription\n });\n\n if (updateMe) {\n if (model.propertyLinkMap[id].persistent && model.propertyLinkMap[id].value !== undefined) {\n instance.set(_defineProperty({}, propertyName, model.propertyLinkMap[id].value));\n } else if (other) {\n update(other.instance, true);\n }\n }\n\n return {\n unsubscribe: function unsubscribe() {\n return unbind(instance, propertyName);\n }\n };\n }\n\n function unsubscribe() {\n while (links.length) {\n links.pop().subscription.unsubscribe();\n }\n }\n\n var linkHandler = {\n bind: bind,\n unbind: unbind,\n unsubscribe: unsubscribe,\n persistent: persistent\n };\n model.propertyLinkMap[id] = linkHandler;\n return linkHandler;\n }; // extract values\n\n\n function getProperties() {\n var groupName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ROOT_GROUP_NAME;\n var values = [];\n var id = model.proxyId;\n var propertyNames = listProxyProperties(groupName) || [];\n\n for (var i = 0; i < propertyNames.length; i++) {\n var name = propertyNames[i];\n var method = publicAPI[\"get\".concat(_capitalize(name))];\n var value = method ? method() : undefined;\n var prop = {\n id: id,\n name: name,\n value: value\n };\n var children = getProperties(name);\n\n if (children.length) {\n prop.children = children;\n }\n\n values.push(prop);\n }\n\n return values;\n }\n\n publicAPI.listPropertyNames = function () {\n return getProperties().map(function (p) {\n return p.name;\n });\n };\n\n publicAPI.getPropertyByName = function (name) {\n return getProperties().find(function (p) {\n return p.name === name;\n });\n };\n\n publicAPI.getPropertyDomainByName = function (name) {\n return (propertyMap[name] || {}).domain;\n }; // ui section\n\n\n publicAPI.getProxySection = function () {\n return {\n id: model.proxyId,\n name: model.proxyGroup,\n ui: model.ui,\n properties: getProperties()\n };\n }; // free resources\n\n\n publicAPI.delete = function () {\n var list = Object.keys(model.propertyLinkMap);\n var count = list.length;\n\n while (count--) {\n model.propertyLinkMap[list[count]].unsubscribe();\n }\n\n Object.keys(model.propertyLinkSubscribers).forEach(publicAPI.gcPropertyLinks);\n parentDelete();\n }; // @todo fix infinite recursion due to active source\n\n\n publicAPI.getState = function () {\n return null;\n };\n\n function registerLinks() {\n // Allow dynamic registration of links at the application level\n if (model.links) {\n for (var i = 0; i < model.links.length; i++) {\n var _model$links$i = model.links[i],\n link = _model$links$i.link,\n property = _model$links$i.property,\n persistent = _model$links$i.persistent,\n updateOnBind = _model$links$i.updateOnBind,\n type = _model$links$i.type;\n\n if (type === 'application') {\n var sLink = model.proxyManager.getPropertyLink(link, persistent);\n publicAPI.registerPropertyLinkForGC(sLink, 'application');\n sLink.bind(publicAPI, property, updateOnBind);\n }\n }\n }\n }\n\n setImmediateVTK(registerLinks);\n} // ----------------------------------------------------------------------------\n// proxyPropertyMapping(publicAPI, model, map)\n//\n// map = {\n// opacity: { modelKey: 'property', property: 'opacity' },\n// }\n//\n// Generated API:\n// Elevate set/get methods from internal object stored in the model to current one\n// ----------------------------------------------------------------------------\n\nfunction proxyPropertyMapping(publicAPI, model, map) {\n var parentDelete = publicAPI.delete;\n var subscriptions = [];\n var propertyNames = Object.keys(map);\n var count = propertyNames.length;\n\n while (count--) {\n var propertyName = propertyNames[count];\n var _map$propertyName = map[propertyName],\n modelKey = _map$propertyName.modelKey,\n property = _map$propertyName.property,\n _map$propertyName$mod = _map$propertyName.modified,\n modified = _map$propertyName$mod === void 0 ? true : _map$propertyName$mod;\n\n var methodSrc = _capitalize(property);\n\n var methodDst = _capitalize(propertyName);\n\n publicAPI[\"get\".concat(methodDst)] = model[modelKey][\"get\".concat(methodSrc)];\n publicAPI[\"set\".concat(methodDst)] = model[modelKey][\"set\".concat(methodSrc)];\n\n if (modified) {\n subscriptions.push(model[modelKey].onModified(publicAPI.modified));\n }\n }\n\n publicAPI.delete = function () {\n while (subscriptions.length) {\n subscriptions.pop().unsubscribe();\n }\n\n parentDelete();\n };\n} // ----------------------------------------------------------------------------\n// proxyPropertyState(publicAPI, model, state, defaults)\n//\n// state = {\n// representation: {\n// 'Surface with edges': { property: { edgeVisibility: true, representation: 2 } },\n// Surface: { property: { edgeVisibility: false, representation: 2 } },\n// Wireframe: { property: { edgeVisibility: false, representation: 1 } },\n// Points: { property: { edgeVisibility: false, representation: 0 } },\n// },\n// }\n//\n// defaults = {\n// representation: 'Surface',\n// }\n//\n// Generated API\n// get / set Representation ( string ) => push state to various internal objects\n// ----------------------------------------------------------------------------\n\nfunction proxyPropertyState(publicAPI, model) {\n var state = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var defaults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n model.this = publicAPI;\n\n function applyState(map) {\n var modelKeys = Object.keys(map);\n var count = modelKeys.length;\n\n while (count--) {\n var modelKey = modelKeys[count];\n model[modelKey].set(map[modelKey]);\n }\n }\n\n var modelKeys = Object.keys(defaults);\n var count = modelKeys.length;\n\n var _loop2 = function _loop2() {\n // Add default\n var key = modelKeys[count];\n model[key] = defaults[key]; // Add set method\n\n var mapping = state[key];\n\n publicAPI[\"set\".concat(_capitalize(key))] = function (value) {\n if (value !== model[key]) {\n model[key] = value;\n var propValues = mapping[value];\n applyState(propValues);\n publicAPI.modified();\n }\n };\n };\n\n while (count--) {\n _loop2();\n } // Add getter\n\n\n if (modelKeys.length) {\n get(publicAPI, model, modelKeys);\n }\n} // ----------------------------------------------------------------------------\n// From : https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\n//\n//\n// Copyright (c) 2015, Facebook, Inc.\n// All rights reserved.\n//\n// This source code is licensed under the BSD-style license found in the\n// LICENSE file in the root directory of this source tree. An additional grant\n// of patent rights can be found in the PATENTS file in the same directory.\n//\n//\n// Mouse wheel (and 2-finger trackpad) support on the web sucks. It is\n// complicated, thus this doc is long and (hopefully) detailed enough to answer\n// your questions.\n//\n// If you need to react to the mouse wheel in a predictable way, this code is\n// like your bestest friend.// hugs//\n//\n// As of today, there are 4 DOM event types you can listen to:\n//\n// 'wheel' -- Chrome(31+), FF(17+), IE(9+)\n// 'mousewheel' -- Chrome, IE(6+), Opera, Safari\n// 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother!\n// 'DOMMouseScroll' -- FF(0.9.7+) since 2003\n//\n// So what to do? The is the best:\n//\n// normalizeWheel.getEventType();\n//\n// In your event callback, use this code to get sane interpretation of the\n// deltas. This code will return an object with properties:\n//\n// spinX -- normalized spin speed (use for zoom) - x plane\n// spinY -- \" - y plane\n// pixelX -- normalized distance (to pixels) - x plane\n// pixelY -- \" - y plane\n//\n// Wheel values are provided by the browser assuming you are using the wheel to\n// scroll a web page by a number of lines or pixels (or pages). Values can vary\n// significantly on different platforms and browsers, forgetting that you can\n// scroll at different speeds. Some devices (like trackpads) emit more events\n// at smaller increments with fine granularity, and some emit massive jumps with\n// linear speed or acceleration.\n//\n// This code does its best to normalize the deltas for you:\n//\n// - spin is trying to normalize how far the wheel was spun (or trackpad\n// dragged). This is super useful for zoom support where you want to\n// throw away the chunky scroll steps on the PC and make those equal to\n// the slow and smooth tiny steps on the Mac. Key data: This code tries to\n// resolve a single slow step on a wheel to 1.\n//\n// - pixel is normalizing the desired scroll delta in pixel units. You'll\n// get the crazy differences between browsers, but at least it'll be in\n// pixels!\n//\n// - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This\n// should translate to positive value zooming IN, negative zooming OUT.\n// This matches the newer 'wheel' event.\n//\n// Why are there spinX, spinY (or pixels)?\n//\n// - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn\n// with a mouse. It results in side-scrolling in the browser by default.\n//\n// - spinY is what you expect -- it's the classic axis of a mouse wheel.\n//\n// - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and\n// probably is by browsers in conjunction with fancy 3D controllers .. but\n// you know.\n//\n// Implementation info:\n//\n// Examples of 'wheel' event if you scroll slowly (down) by one step with an\n// average mouse:\n//\n// OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120)\n// OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12)\n// OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A)\n// Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120)\n// Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120)\n//\n// On the trackpad:\n//\n// OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6)\n// OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A)\n//\n// On other/older browsers.. it's more complicated as there can be multiple and\n// also missing delta values.\n//\n// The 'wheel' event is more standard:\n//\n// http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n//\n// The basics is that it includes a unit, deltaMode (pixels, lines, pages), and\n// deltaX, deltaY and deltaZ. Some browsers provide other values to maintain\n// backward compatibility with older events. Those other values help us\n// better normalize spin speed. Example of what the browsers provide:\n//\n// | event.wheelDelta | event.detail\n// ------------------+------------------+--------------\n// Safari v5/OS X | -120 | 0\n// Safari v5/Win7 | -120 | 0\n// Chrome v17/OS X | -120 | 0\n// Chrome v17/Win7 | -120 | 0\n// IE9/Win7 | -120 | undefined\n// Firefox v4/OS X | undefined | 1\n// Firefox v4/Win7 | undefined | 3\n//\n// ----------------------------------------------------------------------------\n// Reasonable defaults\n\nvar PIXEL_STEP = 10;\nvar LINE_HEIGHT = 40;\nvar PAGE_HEIGHT = 800;\nfunction normalizeWheel(wheelEvent) {\n var sX = 0; // spinX\n\n var sY = 0; // spinY\n\n var pX = 0; // pixelX\n\n var pY = 0; // pixelY\n // Legacy\n\n if ('detail' in wheelEvent) {\n sY = wheelEvent.detail;\n }\n\n if ('wheelDelta' in wheelEvent) {\n sY = -wheelEvent.wheelDelta / 120;\n }\n\n if ('wheelDeltaY' in wheelEvent) {\n sY = -wheelEvent.wheelDeltaY / 120;\n }\n\n if ('wheelDeltaX' in wheelEvent) {\n sX = -wheelEvent.wheelDeltaX / 120;\n } // side scrolling on FF with DOMMouseScroll\n\n\n if ('axis' in wheelEvent && wheelEvent.axis === wheelEvent.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in wheelEvent) {\n pY = wheelEvent.deltaY;\n }\n\n if ('deltaX' in wheelEvent) {\n pX = wheelEvent.deltaX;\n }\n\n if ((pX || pY) && wheelEvent.deltaMode) {\n if (wheelEvent.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n } // Fall-back if spin cannot be determined\n\n\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY\n };\n} // ----------------------------------------------------------------------------\n// Default export\n// ----------------------------------------------------------------------------\n\nvar macro = {\n algo: algo,\n capitalize: capitalize,\n chain: chain,\n debounce: debounce,\n enumToString: enumToString,\n event: event,\n EVENT_ABORT: EVENT_ABORT,\n formatBytesToProperUnit: formatBytesToProperUnit,\n formatNumbersWithThousandSeparator: formatNumbersWithThousandSeparator,\n get: get,\n getArray: getArray,\n getCurrentGlobalMTime: getCurrentGlobalMTime,\n getStateArrayMapFunc: getStateArrayMapFunc,\n isVtkObject: isVtkObject,\n keystore: keystore,\n measurePromiseExecution: measurePromiseExecution,\n moveToProtected: moveToProtected,\n newInstance: newInstance,\n newTypedArray: newTypedArray,\n newTypedArrayFrom: newTypedArrayFrom,\n normalizeWheel: normalizeWheel,\n obj: obj,\n proxy: proxy,\n proxyPropertyMapping: proxyPropertyMapping,\n proxyPropertyState: proxyPropertyState,\n safeArrays: safeArrays,\n set: set,\n setArray: setArray,\n setGet: setGet,\n setGetArray: setGetArray,\n setImmediate: setImmediateVTK,\n setLoggerFunction: setLoggerFunction,\n throttle: throttle,\n traverseInstanceTree: traverseInstanceTree,\n TYPED_ARRAYS: TYPED_ARRAYS,\n // deprecated todo remove on breaking API revision\n uncapitalize: uncapitalize,\n VOID: VOID,\n vtkDebugMacro: vtkDebugMacro,\n vtkErrorMacro: vtkErrorMacro,\n vtkInfoMacro: vtkInfoMacro,\n vtkLogMacro: vtkLogMacro,\n vtkOnceErrorMacro: vtkOnceErrorMacro,\n vtkWarningMacro: vtkWarningMacro\n};\n\nexport { EVENT_ABORT, TYPED_ARRAYS, VOID, _capitalize, algo, capitalize, chain, debounce, macro as default, event, formatBytesToProperUnit, formatNumbersWithThousandSeparator, get, getArray, isVtkObject, keystore, measurePromiseExecution, moveToProtected, newInstance, newTypedArray, newTypedArrayFrom, normalizeWheel, obj, proxy, proxyPropertyMapping, proxyPropertyState, set, setArray, setGet, setGetArray, setImmediateVTK, setLoggerFunction, throttle, traverseInstanceTree, uncapitalize, vtkDebugMacro, vtkErrorMacro, vtkInfoMacro, vtkLogMacro, vtkOnceErrorMacro, vtkWarningMacro };\n","import _typeof from '@babel/runtime/helpers/typeof';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport globalThisShim from 'globalthis';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkGlobal = globalThisShim(); // returns native globalThis if compliant\n\nvar factoryMapping = {\n vtkObject: function vtkObject() {\n return null;\n }\n};\nfunction vtk(obj) {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (obj.isA) {\n return obj;\n }\n\n if (!obj.vtkClass) {\n if (vtkGlobal.console && vtkGlobal.console.error) {\n vtkGlobal.console.error('Invalid VTK object');\n }\n\n return null;\n }\n\n var constructor = factoryMapping[obj.vtkClass];\n\n if (!constructor) {\n if (vtkGlobal.console && vtkGlobal.console.error) {\n vtkGlobal.console.error(\"No vtk class found for Object of type \".concat(obj.vtkClass));\n }\n\n return null;\n } // Shallow copy object\n\n\n var model = _objectSpread({}, obj); // Convert into vtkObject any nested key\n\n\n Object.keys(model).forEach(function (keyName) {\n if (model[keyName] && _typeof(model[keyName]) === 'object' && model[keyName].vtkClass) {\n model[keyName] = vtk(model[keyName]);\n }\n }); // Return the root\n\n var newInst = constructor(model);\n\n if (newInst && newInst.modified) {\n newInst.modified();\n }\n\n return newInst;\n}\n\nfunction register(vtkClassName, constructor) {\n factoryMapping[vtkClassName] = constructor;\n} // Nest register method under the vtk function\n\n\nvtk.register = register;\n\nexport { vtk as default, vtkGlobal };\n","/* eslint no-negated-condition: 0, no-new-func: 0 */\n\n'use strict';\n\nif (typeof self !== 'undefined') {\n\tmodule.exports = self;\n} else if (typeof window !== 'undefined') {\n\tmodule.exports = window;\n} else {\n\tmodule.exports = Function('return this')();\n}\n","'use strict';\n\nvar defineProperties = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = getPolyfill();\n\nvar getGlobal = function () { return polyfill; };\n\ndefineProperties(getGlobal, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = getGlobal;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array) {\n\t\treturn implementation;\n\t}\n\treturn global;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimGlobal() {\n\tvar polyfill = getPolyfill();\n\tif (define.supportsDescriptors) {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(polyfill, 'globalThis');\n\t\tif (!descriptor || (descriptor.configurable && (descriptor.enumerable || !descriptor.writable || globalThis !== polyfill))) { // eslint-disable-line max-len\n\t\t\tObject.defineProperty(polyfill, 'globalThis', {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: polyfill,\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\t} else if (typeof globalThis !== 'object' || globalThis !== polyfill) {\n\t\tpolyfill.globalThis = polyfill;\n\t}\n\treturn polyfill;\n};\n","(function (factory) {\n if (typeof exports === 'object') {\n // Node/CommonJS\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals (with support for web workers)\n var glob;\n\n try {\n glob = window;\n } catch (e) {\n glob = self;\n }\n\n glob.SparkMD5 = factory();\n }\n}(function (undefined) {\n\n 'use strict';\n\n /*\n * Fastest md5 implementation around (JKM md5).\n * Credits: Joseph Myers\n *\n * @see http://www.myersdaily.org/joseph/javascript/md5-text.html\n * @see http://jsperf.com/md5-shootout/7\n */\n\n /* this function is much faster,\n so if possible we use it. Some IEs\n are the only ones I know of that\n need the idiotic second function,\n generated by an if clause. */\n var add32 = function (a, b) {\n return (a + b) & 0xFFFFFFFF;\n },\n hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\n\n function cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32((a << s) | (a >>> (32 - s)), b);\n }\n\n function md5cycle(x, k) {\n var a = x[0],\n b = x[1],\n c = x[2],\n d = x[3];\n\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n function md5blk(s) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n }\n\n function md5blk_array(a) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n }\n return md5blks;\n }\n\n function md51(s) {\n var n = s.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)));\n }\n s = s.substring(i - 64);\n length = s.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n }\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n return state;\n }\n\n function md51_array(a) {\n var n = a.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n }\n\n // Not sure if it is a bug, however IE10 will always produce a sub array of length 1\n // containing the last element of the parent array if the sub array specified starts\n // beyond the length of the parent array - weird.\n // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue\n a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);\n\n length = a.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= a[i] << ((i % 4) << 3);\n }\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n\n return state;\n }\n\n function rhex(n) {\n var s = '',\n j;\n for (j = 0; j < 4; j += 1) {\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n }\n return s;\n }\n\n function hex(x) {\n var i;\n for (i = 0; i < x.length; i += 1) {\n x[i] = rhex(x[i]);\n }\n return x.join('');\n }\n\n // In some cases the fast add32 function cannot be used..\n if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {\n add32 = function (x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n };\n }\n\n // ---------------------------------------------------\n\n /**\n * ArrayBuffer slice polyfill.\n *\n * @see https://github.com/ttaubert/node-arraybuffer-slice\n */\n\n if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n (function () {\n function clamp(val, length) {\n val = (val | 0) || 0;\n\n if (val < 0) {\n return Math.max(val + length, 0);\n }\n\n return Math.min(val, length);\n }\n\n ArrayBuffer.prototype.slice = function (from, to) {\n var length = this.byteLength,\n begin = clamp(from, length),\n end = length,\n num,\n target,\n targetArray,\n sourceArray;\n\n if (to !== undefined) {\n end = clamp(to, length);\n }\n\n if (begin > end) {\n return new ArrayBuffer(0);\n }\n\n num = end - begin;\n target = new ArrayBuffer(num);\n targetArray = new Uint8Array(target);\n\n sourceArray = new Uint8Array(this, begin, num);\n targetArray.set(sourceArray);\n\n return target;\n };\n })();\n }\n\n // ---------------------------------------------------\n\n /**\n * Helpers.\n */\n\n function toUtf8(str) {\n if (/[\\u0080-\\uFFFF]/.test(str)) {\n str = unescape(encodeURIComponent(str));\n }\n\n return str;\n }\n\n function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n var length = str.length,\n buff = new ArrayBuffer(length),\n arr = new Uint8Array(buff),\n i;\n\n for (i = 0; i < length; i += 1) {\n arr[i] = str.charCodeAt(i);\n }\n\n return returnUInt8Array ? arr : buff;\n }\n\n function arrayBuffer2Utf8Str(buff) {\n return String.fromCharCode.apply(null, new Uint8Array(buff));\n }\n\n function concatenateArrayBuffers(first, second, returnUInt8Array) {\n var result = new Uint8Array(first.byteLength + second.byteLength);\n\n result.set(new Uint8Array(first));\n result.set(new Uint8Array(second), first.byteLength);\n\n return returnUInt8Array ? result : result.buffer;\n }\n\n function hexToBinaryString(hex) {\n var bytes = [],\n length = hex.length,\n x;\n\n for (x = 0; x < length - 1; x += 2) {\n bytes.push(parseInt(hex.substr(x, 2), 16));\n }\n\n return String.fromCharCode.apply(String, bytes);\n }\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation.\n *\n * Use this class to perform an incremental md5, otherwise use the\n * static methods instead.\n */\n\n function SparkMD5() {\n // call reset to init the instance\n this.reset();\n }\n\n /**\n * Appends a string.\n * A conversion will be applied if an utf8 string is detected.\n *\n * @param {String} str The string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.append = function (str) {\n // Converts the string to utf8 bytes if necessary\n // Then append as binary\n this.appendBinary(toUtf8(str));\n\n return this;\n };\n\n /**\n * Appends a binary string.\n *\n * @param {String} contents The binary string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.appendBinary = function (contents) {\n this._buff += contents;\n this._length += contents.length;\n\n var length = this._buff.length,\n i;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n }\n\n this._buff = this._buff.substring(i - 64);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n i,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.reset = function () {\n this._buff = '';\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.prototype.getState = function () {\n return {\n buff: this._buff,\n length: this._length,\n hash: this._hash.slice()\n };\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.setState = function (state) {\n this._buff = state.buff;\n this._length = state.length;\n this._hash = state.hash;\n\n return this;\n };\n\n /**\n * Releases memory used by the incremental buffer and other additional\n * resources. If you plan to use the instance again, use reset instead.\n */\n SparkMD5.prototype.destroy = function () {\n delete this._hash;\n delete this._buff;\n delete this._length;\n };\n\n /**\n * Finish the final calculation based on the tail.\n *\n * @param {Array} tail The tail (will be modified)\n * @param {Number} length The length of the remaining buffer\n */\n SparkMD5.prototype._finish = function (tail, length) {\n var i = length,\n tmp,\n lo,\n hi;\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(this._hash, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n tmp = this._length * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n md5cycle(this._hash, tail);\n };\n\n /**\n * Performs the md5 hash on a string.\n * A conversion will be applied if utf8 string is detected.\n *\n * @param {String} str The string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hash = function (str, raw) {\n // Converts the string to utf8 bytes if necessary\n // Then compute it using the binary function\n return SparkMD5.hashBinary(toUtf8(str), raw);\n };\n\n /**\n * Performs the md5 hash on a binary string.\n *\n * @param {String} content The binary string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hashBinary = function (content, raw) {\n var hash = md51(content),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation for array buffers.\n *\n * Use this class to perform an incremental md5 ONLY for array buffers.\n */\n SparkMD5.ArrayBuffer = function () {\n // call reset to init the instance\n this.reset();\n };\n\n /**\n * Appends an array buffer.\n *\n * @param {ArrayBuffer} arr The array to be appended\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.append = function (arr) {\n var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),\n length = buff.length,\n i;\n\n this._length += arr.byteLength;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n }\n\n this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n i,\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff[i] << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.reset = function () {\n this._buff = new Uint8Array(0);\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.ArrayBuffer.prototype.getState = function () {\n var state = SparkMD5.prototype.getState.call(this);\n\n // Convert buffer to a string\n state.buff = arrayBuffer2Utf8Str(state.buff);\n\n return state;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.setState = function (state) {\n // Convert string to buffer\n state.buff = utf8Str2ArrayBuffer(state.buff, true);\n\n return SparkMD5.prototype.setState.call(this, state);\n };\n\n SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n\n SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n\n /**\n * Performs the md5 hash on an array buffer.\n *\n * @param {ArrayBuffer} arr The array buffer\n * @param {Boolean} [raw] True to get the raw string, false to get the hex one\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.hash = function (arr, raw) {\n var hash = md51_array(new Uint8Array(arr)),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n return SparkMD5;\n}));\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return doneResult();\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n return {\n next: doneResult\n };\n }\n function doneResult() {\n return {\n value: undefined,\n done: !0\n };\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) keys.push(key);\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","export function blur(values, r) {\n if (!((r = +r) >= 0)) throw new RangeError(\"invalid r\");\n let length = values.length;\n if (!((length = Math.floor(length)) >= 0)) throw new RangeError(\"invalid length\");\n if (!length || !r) return values;\n const blur = blurf(r);\n const temp = values.slice();\n blur(values, temp, 0, length, 1);\n blur(temp, values, 0, length, 1);\n blur(values, temp, 0, length, 1);\n return values;\n}\n\nexport const blur2 = Blur2(blurf);\n\nexport const blurImage = Blur2(blurfImage);\n\nfunction Blur2(blur) {\n return function(data, rx, ry = rx) {\n if (!((rx = +rx) >= 0)) throw new RangeError(\"invalid rx\");\n if (!((ry = +ry) >= 0)) throw new RangeError(\"invalid ry\");\n let {data: values, width, height} = data;\n if (!((width = Math.floor(width)) >= 0)) throw new RangeError(\"invalid width\");\n if (!((height = Math.floor(height !== undefined ? height : values.length / width)) >= 0)) throw new RangeError(\"invalid height\");\n if (!width || !height || (!rx && !ry)) return data;\n const blurx = rx && blur(rx);\n const blury = ry && blur(ry);\n const temp = values.slice();\n if (blurx && blury) {\n blurh(blurx, temp, values, width, height);\n blurh(blurx, values, temp, width, height);\n blurh(blurx, temp, values, width, height);\n blurv(blury, values, temp, width, height);\n blurv(blury, temp, values, width, height);\n blurv(blury, values, temp, width, height);\n } else if (blurx) {\n blurh(blurx, values, temp, width, height);\n blurh(blurx, temp, values, width, height);\n blurh(blurx, values, temp, width, height);\n } else if (blury) {\n blurv(blury, values, temp, width, height);\n blurv(blury, temp, values, width, height);\n blurv(blury, values, temp, width, height);\n }\n return data;\n };\n}\n\nfunction blurh(blur, T, S, w, h) {\n for (let y = 0, n = w * h; y < n;) {\n blur(T, S, y, y += w, 1);\n }\n}\n\nfunction blurv(blur, T, S, w, h) {\n for (let x = 0, n = w * h; x < w; ++x) {\n blur(T, S, x, x + n, w);\n }\n}\n\nfunction blurfImage(radius) {\n const blur = blurf(radius);\n return (T, S, start, stop, step) => {\n start <<= 2, stop <<= 2, step <<= 2;\n blur(T, S, start + 0, stop + 0, step);\n blur(T, S, start + 1, stop + 1, step);\n blur(T, S, start + 2, stop + 2, step);\n blur(T, S, start + 3, stop + 3, step);\n };\n}\n\n// Given a target array T, a source array S, sets each value T[i] to the average\n// of {S[i - r], …, S[i], …, S[i + r]}, where r = ⌊radius⌋, start <= i < stop,\n// for each i, i + step, i + 2 * step, etc., and where S[j] is clamped between\n// S[start] (inclusive) and S[stop] (exclusive). If the given radius is not an\n// integer, S[i - r - 1] and S[i + r + 1] are added to the sum, each weighted\n// according to r - ⌊radius⌋.\nfunction blurf(radius) {\n const radius0 = Math.floor(radius);\n if (radius0 === radius) return bluri(radius);\n const t = radius - radius0;\n const w = 2 * radius + 1;\n return (T, S, start, stop, step) => { // stop must be aligned!\n if (!((stop -= step) >= start)) return; // inclusive stop\n let sum = radius0 * S[start];\n const s0 = step * radius0;\n const s1 = s0 + step;\n for (let i = start, j = start + s0; i < j; i += step) {\n sum += S[Math.min(stop, i)];\n }\n for (let i = start, j = stop; i <= j; i += step) {\n sum += S[Math.min(stop, i + s0)];\n T[i] = (sum + t * (S[Math.max(start, i - s1)] + S[Math.min(stop, i + s1)])) / w;\n sum -= S[Math.max(start, i - s0)];\n }\n };\n}\n\n// Like blurf, but optimized for integer radius.\nfunction bluri(radius) {\n const w = 2 * radius + 1;\n return (T, S, start, stop, step) => { // stop must be aligned!\n if (!((stop -= step) >= start)) return; // inclusive stop\n let sum = radius * S[start];\n const s = step * radius;\n for (let i = start, j = start + s; i < j; i += step) {\n sum += S[Math.min(stop, i)];\n }\n for (let i = start, j = stop; i <= j; i += step) {\n sum += S[Math.min(stop, i + s)];\n T[i] = sum / w;\n sum -= S[Math.max(start, i - s)];\n }\n };\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default shuffler(Math.random);\n\nexport function shuffler(random) {\n return function shuffle(array, i0 = 0, i1 = array.length) {\n let m = i1 - (i0 = +i0);\n while (m) {\n const i = random() * m-- | 0, t = array[m + i0];\n array[m + i0] = array[i + i0];\n array[i + i0] = t;\n }\n return array;\n };\n}\n","import min from \"./min.js\";\n\nexport default function transpose(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n}\n\nfunction length(d) {\n return d.length;\n}\n","import transpose from \"./transpose.js\";\n\nexport default function zip() {\n return transpose(arguments);\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export const radians = Math.PI / 180;\nexport const degrees = 180 / Math.PI;\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nconst K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) return hcl2lab(o);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * degrees;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * radians;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb() {\n return hcl2lab(this).rgb();\n }\n}));\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * degrees - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * radians,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n"],"names":["Events","RequestType","ViewportType","InterpolationType","BlendMode","COMPOSITE_BLEND","MAXIMUM_INTENSITY_BLEND","MINIMUM_INTENSITY_BLEND","AVERAGE_INTENSITY_BLEND","ADDITIVE_INTENSITY_BLEND","RADON_TRANSFORM_BLEND","Constants","FilterMode","OFF","NORMALIZED","RAW","BlendModes","OrientationAxis","SharedArrayBufferModes","GeometryType","ContourType","VOILUTFunctionType","DynamicOperatorType","CalibrationTypes","ViewportStatus","hotIron","name","numOfColors","colors","pet","numColors","hotMetalBlue","pet20Step","gray","gamma","segmentedData","red","green","blue","jet","hsv","hot","cool","spring","summer","autumn","winter","bone","copper","spectral","coolwarm","blues","RENDERING_DEFAULTS","MINIMUM_SLAB_THICKNESS","MAXIMUM_RAY_DISTANCE","Object","freeze","deepFreeze","object","propNames","getOwnPropertyNames","value","axial","viewPlaneNormal","viewUp","sagittal","coronal","gradientOpacity","specularPower","scalarOpacity","specular","shade","ambient","colorTransfer","diffuse","interpolation","cache","renderingEngineCache","get","id","set","re","renderingEngineId","delete","getAll","renderingEngines","keys","map","sort","a","b","eventTarget","constructor","this","listeners","reset","addEventListener","type","callback","indexOf","push","removeEventListener","stack","stackLength","length","i","splice","dispatchEvent","event","slice","call","defaultPrevented","invertRgbTransferFunction","rgbTransferFunction","size","getSize","index","nodeValue1","getNodeValue","setNodeValue","createSigmoidRGBTransferFunction","voiRange","approximationNodes","windowWidth","windowCenter","lower","upper","table","Array","v","reduce","res","y","x","wc","ww","Math","log","logit","concat","cfun","buildFunctionFromArray","values","numberOfComponents","getVoiFromSigmoidRGBTransferFunction","cfunRange","getRange","getTable","filter","k","cfunDomain","y1","logy1","x1","y2","logy2","x2","round","createLinearRGBTransferFunction","undefined","addRGBPoint","scaleRGBTransferFunction","scalingFactor","triggerEvent","el","detail","Error","CustomEvent","cancelable","uuidv4","replace","c","crypto","getRandomValues","Uint8Array","toString","getMinMax","storedPixelData","storedPixel","min","max","numPixels","LAST_RUNTIME_ID","Symbol","GLOBAL_CONTEXT","DEFAULT_MAX","DEFAULT_SEPARATOR","getRuntimeId","context","separator","symbol","idComponents","defineProperty","carry","n","getNextRuntimeId","join","imageIdToURI","imageId","colonIndex","substring","state","add","payload","imageURI","areNumbersEqualWithTolerance","num1","num2","tolerance","abs","isNumberType","isNumberArrayLike","isEqual","v1","v2","arr1","arr2","areArraysEqual","isOpposite","BLOCKLISTED_GPUS","cleanRenderer","renderer","toLowerCase","isSSR","window","deviceInfo","userAgent","platform","maxTouchPoints","navigator","isIOS","test","isIpad","MSStream","isMobile","isSafari12","array","charCodeCache","getLevenshteinDistance","left","right","swap","leftLength","rightLength","charCodeAt","bCharCode","start","temp","temp2","result","j","isDefined","val","OutdatedBenchmarksError","[object Object]","message","super","setPrototypeOf","prototype","getGPUTier","mobileTiers","desktopTiers","override","glContext","failIfMajorPerformanceCaveat","benchmarksURL","queryCache","tier","screenSize","screen","loadBenchmarks","file","data","fetch","then","response","json","parseInt","shift","split","toResult","gpu","fps","device","renderers","rawRenderer","gl","attributes","alpha","antialias","depth","powerPreference","stencil","canvas","document","createElement","getContext","debugRendererInfo","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","isMobileTier","pixelId","vertexShader","createShader","fragmentShader","program","createProgram","shaderSource","compileShader","attachShader","linkProgram","detachShader","deleteShader","useProgram","vertexArray","createBuffer","bindBuffer","bufferData","Float32Array","aPosition","getAttribLocation","vertexAttribPointer","enableVertexAttribArray","clearColor","clear","viewport","drawArrays","pixels","readPixels","deleteProgram","deleteBuffer","codeA","codeB","codeC","possibleChipsets","chipsets","iosVersion","deobfuscateAppleGPU","results","Promise","all","types","includes","benchmarkFile","benchmark","benchmarks","error","version","model","matches","match","matched","modelVersion","matchCount","closest","fpsesByPixelCount","minDistance","Number","MAX_VALUE","devicePixelRatio","pixelCount","width","height","entryPixelCount","distance","aDis","aFps","bDis","bFps","blocklistedModel","find","tiers","getRenderingEngine","getRenderingEngines","csRenderInitialized","useSharedArrayBuffer","sharedArrayBufferMode","TRUE","defaultConfig","gpuTier","detectGPUConfig","rendering","useCPURendering","preferSizeOverAccuracy","useNorm16Texture","strictZSpacingForVolumeViewport","config","_hasActiveWebGLContext","_getGLContext","WebGLRenderingContext","WebGL2RenderingContext","async","init","configuration","console","setUseSharedArrayBuffer","setUseCPURendering","status","_updateRenderingPipelinesForAllViewports","setPreferSizeOverAccuracy","resetUseCPURendering","getShouldUseCPURendering","mode","AUTO","FALSE","SharedArrayBuffer","hasSharedArrayBuffer","warn","resetUseSharedArrayBuffer","getShouldUseSharedArrayBuffer","isCornerstoneInitialized","getConfiguration","setConfiguration","forEach","engine","getViewports","updateRenderingPipeline","sharedArrayBuffer","crossOriginIsolated","Uint16Array","Int16Array","providers","addProvider","provider","priority","removeProvider","removeAllProviders","pop","getMetaData","query","getSpacingInNormalDirection","imageVolume","direction","spacing","iVector","jVector","kVector","dotProducts","projectedSpacing","getClosestImageId","worldPos","imageIds","halfSpacingInNormalDirection","imageIdForTool","imagePositionPatient","dir","dot","ONE_GB","_imageCache","Map","_volumeCache","_imageCacheSize","_volumeCacheSize","_maxCacheSize","_maxInstanceSize","setMaxCacheSize","newMaxCacheSize","errorMessage","isCacheable","byteLength","getBytesAvailable","getMaxCacheSize","getMaxInstanceSize","getCacheSize","_decacheImage","imageLoadObject","cancelFn","decache","_decacheVolume","volumeId","cachedVolume","volumeLoadObject","volume","cancelLoading","imageData","purgeCache","imageIterator","done","next","removeImageLoadObject","IMAGE_CACHE_IMAGE_REMOVED","purgeVolumeCache","volumeIterator","removeVolumeLoadObject","VOLUME_CACHE_VOLUME_REMOVED","getVolumeLoadObject","timeStamp","Date","now","getGeometry","geometryId","cachedGeometry","_geometryCache","geometry","getVolume","cachedImage","_incrementImageCacheSize","sizeInBytes","eventDetails","_incrementVolumeCacheSize","putGeometryLoadObject","geometryLoadObject","has","loaded","promise","isNaN","GEOMETRY_CACHE_GEOMETRY_ADDED","catch","increment","decacheIfNecessaryUntilBytesAvailable","numBytes","volumeImageIds","bytesAvailable","cachedImages","from","cachedImageIds","im","imageIdsToPurge","putImageLoadObject","sharedCacheKey","image","toFixed","CACHE_SIZE_EXCEEDED","IMAGE_CACHE_IMAGE_ADDED","getImageLoadObject","isLoaded","getVolumeContainingImageId","volumeIds","imageIdToUse","imageIdIndex","getImageURIIndex","getCachedImageBasedOnImageURI","imageURIToUse","foundImageId","putVolumeLoadObject","VOLUME_CACHE_VOLUME_ADDED","vtkErrorMacro","DEFAULT_VALUES","renderable","myFactory","children","visited","extend","publicAPI","initialValues","arguments","assign","_renderableChildMap","classHierarchy","build","prepass","render","traverse","renderPass","passTraversal","getTraverseOperation","fn","apply","customRenderPass","getOperation","getViewNodeFor","dataObject","vn","getFirstAncestorOfType","_parent","isA","addMissingNode","dobj","setVisited","newNode","createViewNode","setParent","addMissingNodes","dataObjs","addMissingChildren","child","prepareNodes","removeUnusedNodes","deleted","getVisited","getRenderable","dataObj","ret","createNode","setRenderable","parentDelete","vtkViewNode","vtkViewNode$1","newInstance","PASS_TYPES","overrides","isDeleted","cpt","className","getClassName","isObject","setMyFactory","registerOverride","func","vtkViewNodeFactory","vtkViewNodeFactory$1","CLASS_MAPPING","create","vtkOpenGLViewNodeFactory","lastRenderer","keyMatrixTime","keyMatrices","normalMatrix","Float64Array","vcpc","wcvc","wcpc","buildPass","_openGLRenderer","_openGLRenderWindow","getParent","opaquePass","tsize","getTiledSizeAndOrigin","lowerLeftU","lowerLeftV","usize","vsize","scissor","translucentPass","zBufferPass","opaqueZBufferPass","volumePass","getKeyMatrices","ren","getMTime","getViewMatrix","aspectRatio","getAspectRatio","getProjectionMatrix","modified","vtkOpenGLCamera","vtkCamera","vtkDebugMacro","selector","updateLights","getActiveCamera","getViewPropsWithNestedProps","count","lights","getLightsByReference","getSwitch","createLight","clearMask","getTransparent","COLOR_BUFFER_BIT","getPreserveDepthBuffer","clearDepth","DEPTH_BUFFER_BIT","depthMask","ts","enable","SCISSOR_TEST","colorMask","DEPTH_TEST","cameraPass","getSizeByReference","getViewportByReference","vport","tileViewPort","vpu","vpv","ndvp","normalizedDisplayToDisplay","vpu2","vpv2","ndvp2","background","getBackgroundByReference","releaseGraphicsResources","setOpenGLRenderWindow","rw","vtkOpenGLRenderer","vtkRenderer","SegmentAgregator","segmentMapping","segments","faces","key","segment","first","last","mappingFirst","mappingLast","idx","seg","_i","unshift","idxHead","idxTail","segHead","segTail","addSegment","_seg","_i2","_seg2","_i3","_seg3","_i4","_seg4","_i5","requestData","inData","outData","input","output","shallowCopy","agregator","lines","getLines","getData","offset","lineSize","lineSegment","cellArraySize","_i6","cellArray","_i7","face","setPolys","vtkClosedPolyLineToSurfaceFilter","vtkClosedPolyLineToSurfaceFilter$1","ownKeys","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","vtkCutter","superClass","target","source","getOwnPropertyDescriptors","defineProperties","_objectSpread","dataSetCutter","points","getPoints","pointsData","numPts","getNumberOfPoints","newPointsData","newLinesData","newPolysData","cutScalars","inOffset","outOffset","cutFunction","evaluateFunction","crossedEdges","it","pd","polys","getPolys","strips","getStrips","polyIdx","stripIdx","remainingStripLength","cellSize","end","subarray","_start","_end","initPolyIterator","cell","cellPointsScalars","pointIndex","sideFirstPoint","allPointsSameSide","intersectedEdgesList","idNext","signPoint0","e1","e2","deltaScalar","t","cutValue","pointID1","pointID2","computedIntersectedPoint","pointEdge1","pointEdge2","intersectedPoint","newPointID","intersectedEdge","alreadyAdded","crossedEdge","sameEdge","samePoint","edge","setData","getDataType","mTime","vtkCutter$1","ObjectType","ARRAY_BUFFER","ELEMENT_ARRAY_BUFFER","TEXTURE_BUFFER","objectType","convertType","internalType","internalHandle","dirty","getType","setType","getHandle","isReady","generateBuffer","objectTypeGL","upload","STATIC_DRAW","bind","release","getError","vtkOpenGLBufferObject","vtkBufferObject","vtkOpenGLCellArrayBufferObject","createVBO","inRep","outRep","options","selectionMaps","elementCount","blockSize","vertexOffset","normalOffset","tCoordOffset","tCoordComponents","colorComponents","colorOffset","customData","pointData","normalData","tcoordData","colorData","getNumberOfComponents","textureComponents","tcoords","normals","customAttributes","components","getName","colorBO","stride","addAPoint","pointIdx","normalIdx","tcoordIdx","colorIdx","custIdx","cellCount","cellBuilders","anythingToPoints","numPoints","cellPts","linesToWireframe","polysToWireframe","stripsToWireframe","polysToSurface","npts","stripsToSurface","cellCounters","countFunc","POINTS","WIREFRAME","caboCount","packedUCVBO","packedVBO","vboidx","ucidx","diagSq","distSq","range","delta","distShift","log10","coordShift","coordScale","_range","_delta","setCoordShiftAndScale","coordShiftAndScaleEnabled","cells","newPoints","Int32Array","newCells","pointCount","cellOffset","haveCellNormals","attr","haveCellScalars","_index","colorBOStride","shouldApplyCoordShiftAndScale","inverseShiftAndScaleMatrix","inverseScale","matrix","computeInverseShiftAndScaleMatrix","tcoordBO","vtkCellArrayBufferObject","shaderType","handle","compile","stype","VERTEX_SHADER","FRAGMENT_SHADER","getShaderParameter","COMPILE_STATUS","lastError","getShaderInfoLog","cleanup","vtkShader","vtkShader$1","vertexShaderHandle","fragmentShaderHandle","geometryShaderHandle","geometryShader","linked","bound","compiled","numberOfOutputs","attributesLocs","uniformLocs","md5Hash","lastCameraMTime","setShaderType","link","setCompiled","getSource","line","setBound","isBound","setContext","ctx","getProgramParameter","LINK_STATUS","getProgramInfoLog","setLinked","attributeLocs","setUniformMatrix","location","findUniform","f32","uniformMatrix4fv","setUniformMatrix3x3","uniformMatrix3fv","setUniformf","uniform1f","setUniformfv","uniform1fv","setUniformi","uniform1i","setUniformiv","uniform1iv","setUniform2f","RangeError","uniform2f","setUniform2fv","uniform2fv","setUniform2i","uniform2i","setUniform2iv","uniform2iv","setUniform3f","a1","a2","a3","uniform3f","setUniform3fArray","isArray","setUniform3fv","uniform3fv","setUniform3i","_len","args","_key","uniform3i","setUniform3iv","uniform3iv","setUniform4f","_len2","_key2","uniform4f","setUniform4fv","uniform4fv","setUniform4i","_len3","_key3","uniform4i","setUniform4iv","uniform4iv","loc","getUniformLocation","isUniformUsed","isAttributeUsed","shader","getShaderType","thandle","comntext","setLastCameraMTime","mtime","vtkShaderProgram","vtkShaderProgram$1","substitute","search","replaceStr","replaceSearch","RegExp","resultstr","forceEmulation","handleVAO","handleProgram","supported","buffers","exposedMethod","initialize","instancingExtension","getWebgl2","extension","createVertexArray","createVertexArrayOES","bindVertexArrayOES","bindVertexArray","ibuff","buff","buffer","iatt","attrIt","matrixCount","isMatrix","normalize","divisor","vertexAttribDivisorANGLE","vertexAttribDivisor","disableVertexAttribArray","shaderProgramChanged","deleteVertexArrayOES","deleteVertexArray","addAttributeArray","elementType","elementTupleSize","addAttributeArrayWithDivisor","attribs","Index","buffFound","found","addAttributeMatrixWithDivisor","removeAttributeArray","vtkOpenGLVertexArrayObject","vtkVertexArrayObject","primTypes","Start","Points","Lines","Tris","TriStrips","TrisEdges","TriStripsEdges","End","shaderSourceTime","VAO","attributeUpdateTime","CABO","primitiveType","pointPicking","win","oglwin","setElementCount","actor","rep","oglMapper","getElementCount","getOpenGLMode","wideLines","haveWideLines","DEPTH_WRITEMASK","LINES","updateShaders","drawArraysInstanced","ceil","getProperty","getLineWidth","lineWidth","TRIANGLES","getOpenGLRenderWindow","getHardwareMaximumLineWidth","getNeedToRebuildShaders","getProgram","getShaderSourceTime","shaders","Vertex","Fragment","Geometry","buildShaders","newShader","getShaderCache","readyShaderProgramArray","setProgram","getVAO","readyShaderProgram","setMapperShaderParameters","setPropertyShaderParameters","setCameraShaderParameters","setLightingShaderParameters","invokeShaderCallbacks","parseFloat","halfLineWidth","getRepresentation","getPointSize","getPointPickingPrimitiveSize","replaceShaderPositionVC","VSSource","vtkOpenGLHelper","vtkHelper","Wrap","CLAMP_TO_EDGE","REPEAT","MIRRORED_REPEAT","Filter","NEAREST","LINEAR","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","floatView","int32View","HalfFloat","fromHalf","h","s","e","f","pow","NaN","Infinity","toHalf","bits","m","VtkDataTypes","vtkWarningMacro","vtkOpenGLTexture","updateArrayDataType","dataType","pixData","pixCount","FLOAT","openGLDataType","dataArrayToCopy","UNSIGNED_CHAR","UNSIGNED_BYTE","_idx","_dataArrayToCopy","halfFloat","HALF_FLOAT","halfFloatExt","HALF_FLOAT_OES","_idx2","newArray","src","scaleTextureToHighestPowerOfTwo","numComps","newWidth","newHeight","jFactor","iFactor","usingHalf","joff","jidx","jlow","floor","jhi","jmix","jmix1","ioff","iidx","ilow","ihi","imix","useTexStorage","_model$renderable","resizable","getResizable","getGLInformations","RENDERER","oglNorm16Ext","UNSIGNED_SHORT","SHORT","processDataArray","dataArray","minArray","maxArray","_dataArray$getRange","_dataArray$getRange2","scaleOffsets","scale","computeScaleOffsets","getOpenGLDataType","useHalfFloat","isHalfFloat","hasExactHalfFloat","setUseHalfFloat","renWin","getInterpolate","generateMipmap","setMinificationFilter","setMagnificationFilter","getRepeat","setWrapR","setWrapS","setWrapT","getInputData","setImage","textureBuildTime","getImage","getImageLoaded","create2DFromImage","activate","sendParameters","getCanvas","create2DFromRaw","getJsImageData","jsid","getPointData","getScalars","ext","getExtent","inScalars","getNumberOfInputPorts","indata","scalars","createCubeFromRaw","destroyTexture","deactivate","deleteTexture","numberOfDimensions","resetFormatAndType","createTexture","bindTexture","texParameteri","TEXTURE_MIN_FILTER","getOpenGLFilterMode","minificationFilter","TEXTURE_MAG_FILTER","magnificationFilter","TEXTURE_WRAP_S","getOpenGLWrapMode","wrapS","TEXTURE_WRAP_T","wrapT","TEXTURE_WRAP_R","wrapR","getTextureUnit","getTextureUnitForTexture","activateTexture","deactivateTexture","rwin","internalFormat","format","shaderProgram","autoParameters","sendParametersTime","TEXTURE_2D","TEXTURE_BINDING_2D","getIntegerv","TEXTURE_BASE_LEVEL","baseLevel","TEXTURE_MAX_LEVEL","maxLevel","getInternalFormat","vtktype","_forceInternalFormat","getDefaultInternalFormat","getDefaultTextureInternalFormat","setInternalFormat","iFormat","getFormat","getDefaultFormat","RED","RG","RGB","RGBA","LUMINANCE","LUMINANCE_ALPHA","getDefaultDataType","vtkScalarType","VOID","forceUpdate","getShiftAndScale","BYTE","INT","UNSIGNED_INT","emode","flip","scaledData","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_ALIGNMENT","texStorage2D","texSubImage2D","texImage2D","TEXTURE_CUBE_MAP","invertedData","widthLevel","heightLevel","row1","row2","w","tempData","TEXTURE_CUBE_MAP_POSITIVE_X","createDepthFromRaw","DEPTH_COMPONENT","DEPTH_COMPONENT32F","DEPTH_COMPONENT16","needNearestPowerOfTwo","translate","drawImage","safeImage","create2DFilterableFromRaw","create2DFilterableFromDataArray","_processDataArray","create3DFromRaw","TEXTURE_3D","texStorage3D","texSubImage3D","texImage3D","create3DFilterableFromRaw","create3DFilterableFromDataArray","_processDataArray2","numPixelsIn","volumeInfo","dataComputedScale","dataComputedOffset","scaleOffsetsCopy","structuredClone","_c","_c2","_c3","_newArray","scaleInverse","nc","volCopyData","outArray","outIdx","inValue","smin","smax","dataTypeToUse","_c4","soffset","sscale","maxTexDim","MAX_TEXTURE_SIZE","xstride","ystride","sqrt","targetWidth","xreps","yreps","targetHeight","tileWidth","tileHeight","yRep","xrepsThisRow","outXContIncr","tileY","xRep","tileX","_nc","getMaximumTextureSize","isCurrent","minLOD","maxLOD","vtkOpenGLTexture$1","vtkReplacementShaderMapper","implementReplaceShaderCoincidentOffset","replaceShaderCoincidentOffset","cp","getCoincidentParameters","factor","FSSource","implementBuildShadersWithReplacements","applyShaderReplacements","viewSpec","pre","shaderReplacements","ShaderReplacements","currReplacement","replaceFirst","ssrc","substituteRes","originalValue","replacementValue","replaceAll","getReplacedShaderTemplate","lastRenderPassShaderReplacement","currentRenderPass","getShaderReplacement","openGLSpec","getViewSpecificProperties","OpenGL","replaceShaderValues","openGLSpecProp","getShaderTemplate","vertexShaderCode","vertexSpecProp","VertexShaderCode","fragmentShaderCode","fragmentSpecProp","FragmentShaderCode","geometryShaderCode","geometrySpecProp","GeometryShaderCode","vtkImageResliceMapperVS","vtkImageResliceMapperFS","InterpolationType$1","computeFnToString","property","iComps","getIndependentComponents","safeMatrixMultiply","matrixArray","matrixType","tmpMat","identity","copy","multiply","vtkOpenGLImageResliceMapper","_openGLImageSlice","_openGLCamera","tris","openGLTexture","colorTexture","pwfTexture","haveSeenDepthRequest","renderDepth","getResolveCoincidentTopology","getCoincidentTopologyPolygonOffsetParameters","renderPiece","invokeEvent","update","currentInput","updateResliceGeometry","renderPieceStart","renderPieceDraw","renderPieceFinish","updateBufferObjects","getInterpolationType","lastBoundBO","getCABO","getNeedToRebuildBufferObjects","buildBufferObjects","VBOBuildTime","resliceGeom","_image$getPointData","numComp","_externalOpenGLTexture","_toString","openGLTextureString","dims","getDimensions","getOglNorm16Ext","ppty","numIComps","textureHeight","cfunToString","getRGBTransferFunction","colorTextureString","cWidth","cTable","tmpTable","cRange","pwfunToString","getPiecewiseFunction","pwfTextureString","pwfWidth","pwfSize","pwfTable","pwfun","pwfFloatTable","_tmpTable","fill","pwfRange","vboString","getSlabThickness","VBOBuildString","setName","getNormals","SURFACE","cellBO","getAttributeUpdateTime","getVertexOffset","getStride","getNormalOffset","getSpacing","getSlabType","getSlabTrapezoidIntegration","inverseShiftScaleMatrix","getCoordShiftAndScaleEnabled","getInverseShiftAndScaleMatrix","tmpMat4","bounds","getBounds","sc","o","keyMats","actMats","mcwc","opacity","getOpacity","getComponents","getComponentWeight","volInfo","getVolumeInfo","cw","getColorWindow","cl","getColorLevel","getUseLookupTableScalarRange","texColorUnit","pwfScale","pwfShift","_target","mid","texOpacityUnit","getBackgroundColor","tNumComp","iComp","slabTh","slabType","slabTrap","needRebuild","lastHaveSeenDepthRequest","lastTextureComponents","lastIndependentComponents","lastSlabThickness","lastSlabType","lastSlabTrapezoidIntegration","replaceShaderTCoord","GSSource","slabThickness","tcoordFSDec","comp","tcoordFSImpl","rgba","_comp","posVCVSDec","resliceGeomUpdateString","posVCVSImpl","posVCFSDec","resGeomString","imageBounds","orthoSlicing","orthoAxis","getSlicePolyData","getSlicePlane","_isVectorAxisAligned","tmpN","dotP","isVectorAxisAligned","getNormal","_isVectorAxisAligned2","_model$renderable$get","plane","setNormal","bds","setOrigin","setSlicePlane","ptsArray","getOrigin","otherAxes","ptIdx","_n","_normalsData","_i8","_normals","setNormals","cube","setCenter","setXLength","setYLength","setZLength","cutter","setInputConnection","getOutputPort","setCutFunction","pds","getOutputData","normalsData","setOpenGLTexture","oglTex","SlicingMode","NONE","I","J","K","X","Y","Z","vtkPolyDataVS","vtkPolyDataFS","imagemat","imagematinv","openGLImageSlice","openGLCamera","getSliceAtFocalPoint","setSliceFromCamera","tcoordDec","tcoordImpl","replaceShaderClip","getNumberOfClippingPlanes","numClipPlanes","getTCoordOffset","getTCoordComponents","texUnit","oglShiftScale","mat","getMatrix","getIndexToWorld","planeEquations","planeEquation","getClippingPlaneInDataCoords","i2wmat4","inverseShiftScaleMat","getCurrentImage","computeBounds","getInput","u","imgScalars","actorProperty","iType","ijkMode","getClosestIJKAxis","getSlice","getSlicingMode","getSliceAtPosition","sliceOffset","nSlice","getSubSlice","_model$renderable$get2","Set","setGenerateMipmap","sliceSize","tcoordArray","sliceDepth","spatialExt","getSpatialExtent","basicScalars","bsIdx","_id","_k","_i9","_bsIdx","getPreferSizeOverAccuracy","vtkOpenGLImageMapper","vtkImageMapper","getVisibility","getMapper","traverseZBufferPass","getNestedVisibility","getSelector","getNestedPickable","traverseOpaqueZBufferPass","traverseOpaquePass","getIsOpaque","traverseTranslucentPass","queryPass","incrementOpaqueActorCount","incrementTranslucentActorCount","vtkOpenGLImageSlice","vtkImageSlice","MCWCMatrix","incrementVolumeCount","traverseVolumePass","computeMatrix","getIsIdentity","vtkOpenGLVolume","vtkVolume","glFramebuffer","colorBuffers","depthTexture","previousDrawBinding","previousReadBinding","previousDrawBuffer","previousReadBuffer","previousActiveFramebuffer","getBothMode","FRAMEBUFFER","saveCurrentBindingsAndBuffers","modeIn","saveCurrentBindings","saveCurrentBuffers","FRAMEBUFFER_BINDING","getActiveFramebuffer","restorePreviousBindingsAndBuffers","restorePreviousBindings","restorePreviousBuffers","bindFramebuffer","setActiveFramebuffer","createFramebuffer","setColorBuffer","texture","attachment","glAttachment","COLOR_ATTACHMENT0","framebufferTexture2D","removeColorBuffer","setDepthBuffer","DEPTH_ATTACHMENT","removeDepthBuffer","getGLFramebuffer","deleteFramebuffer","populateFramebuffer","createRenderbuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","framebufferRenderbuffer","getColorTexture","vtkFramebuffer","vtkOpenGLFramebuffer","FAST_LINEAR","OpacityMode","FRACTIONAL","PROPORTIONAL","vtkVolumeVS","vtkVolumeFS","vtkOpenGLVolumeMapper","zBufferTexture","zbt","getZBufferTexture","jitterTexture","framebuffer","scalarTexture","opacityTexture","openGLVolume","getUseLabelOutline","proportionalComponents","getOpacityMode","spc","maxSamples","getSampleDistance","lastLightComplexity","getVolumetricScatteringBlending","getLocalAmbientOcclusion","getAmbient","gopacity","getUseGradientOpacity","getComputeNormalFromOpacity","getBlendMode","replaceShaderLight","replaceShaderClippingPlane","lightNum","getLights","light","getLAOKernelRadius","getClippingPlanes","clipPlaneSize","lightComplexity","getShade","numberOfLights","getIntensity","lightTypeIsHeadLight","getPositional","usesProportionalComponents","interpolationType","useLabelOutline","useGradientOpacity","blendMode","previousState","arrayEquals","lastZBufferTexture","getClippingPlaneShaderParameters","ipScalarRange","getIpScalarRange","minVals","maxVals","_useSmallViewport","_smallViewportWidth","_smallViewportHeight","getFramebufferSize","modelToView","cam","crange","getClippingRange","pos","dcxmin","dcxmax","dcymin","dcymax","getParallelProjection","indexToWorldVec3","idxToView","idxNormalMatrix","getDirectionByReference","getMaximumSamplesPerRay","vctoijk","getWidth","getHeight","normal","pos2","dist","worldToIndex","getWorldToIndex","camera","_camera$getClippingRa","_camera$getClippingRa2","cRange0","cRange1","getDistance","setClippingRange","labelOutlineKeyMats","projectionToWorld","getRenderTargetSize","getRenderTargetOffset","projectionToView","lightColor","lightDir","halfAngle","dColor","getColor","intensity","ldir","getDirection","getTwoSidedLighting","lightPositionVC","lightAttenuation","lightConeAngle","lightExponent","lightPositional","attenuation","getAttenuationValues","getExponent","getConeAngle","lp","getTransformedPosition","getGlobalIlluminationReach","getVolumeShadowSamplingDistFactor","getAnisotropy","ks","getLAOKernelSize","kernelSample","random","vprop","oRange","getScalarOpacity","oscale","oshift","cshift","cScale","_sscale","gomin","getGradientOpacityMinimumOpacity","gomax","getGradientOpacityMaximumOpacity","goRange","getGradientOpacityMinimumValue","getGradientOpacityMaximumValue","_sscale2","_gomin","_gomax","_goRange","labelOutlineThickness","getLabelOutlineThickness","labelOutlineOpacity","getLabelOutlineOpacity","getDiffuse","getSpecular","getSpecularPower","clipPlaneNormals","clipPlaneDistances","clipPlanes","clipPlaneNormal","clipPlanePos","clipPlaneDist","_animationRateSubscription","unsubscribe","_model$_openGLRendere","_model$_openGLRendere2","rwi","getVTKWindow","getInteractor","isAnimating","_lastScale","onAnimationFrameRateUpdate","getAutoAdjustSampleDistances","frate","getRecentAnimationFrameRate","adjustment","getDesiredUpdateRate","getImageSampleDistance","fbSize","fvp","disable","copyShader","copyVAO","tex","blendFuncSeparate","ONE","ONE_MINUS_SRC_ALPHA","SRC_ALPHA","Bounds","oTable","opacityTextureString","oWidth","oSize","ofTable","ofun","opacityFactor","getScalarOpacityUnitDistance","_oTable","scalarTextureString","setOglNorm16Ext","lastXYF","targetXYF","fullViewportTime","avgWindowArea","avgFrameTime","vtkVolumeMapper","texels","getUseZValues","fb","getFramebuffer","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","invokeCallback","requestDepth","vtkOpenGLPixelSpaceCallbackMapper","vtkPixelSpaceCallbackMapper","vtkWebGPUViewNodeFactory","pcsc","scpc","scvc","outMat","aspect","parallelScale","getParallelScale","xmin","xmax","ymin","ymax","xr","yr","_width","_height","tmp","tan","PI","getViewAngle","getUseHorizontalViewAngle","_xmin","_xmax","_ymin","_ymax","convertToOpenGLDepth","getClippingRangeByReference","zval","webGPURenderer","webGPURenderWindow","getStabilizedTime","center","getStabilizedCenterByReference","getWindowCenterByReference","vtkWebGPUCamera","label","bindables","bindGroupTime","setBindables","allMatch","getBindGroupLayout","entries","entry","getBindGroupLayoutEntry","binding","getBindGroup","tm","getBindGroupTime","bindGroup","getBindGroupEntry","createBindGroup","layout","getShaderCode","pipeline","bgroup","getBindGroupLayoutCount","vtkWebGPUBindGroup","vtkWebGPUBindGroup$1","shaderDesc","createShaderModule","code","getCode","vtkWebGPUShaderModule","vtkWebGPUShaderModule$1","shaderModules","_shaderModules","getShaderModule","sType","sHash","getHash","sm","vtkWebGPUShaderCache","vtkWebGPUShaderCache$1","replaced","gflag","regex","layouts","renderEncoder","shaderDescriptions","vertexState","topology","pipelineDescription","getShaderDescriptions","hash","getPipelineSettings","primitive","vertex","bindGroupLayouts","pipelineLayout","createPipelineLayout","sd","module","entryPoint","fragment","createRenderPipeline","getShaderDescription","addBindGroupLayout","getLabel","llabel","bindVertexInput","vInput","bindBuffers","vtkWebGPUPipeline","vtkWebGPUPipeline$1","outputNames","outputTypes","outputInterpolations","builtinOutputNames","builtinOutputTypes","builtinInputNames","builtinInputTypes","hasOutput","addOutput","addBuiltinOutput","addBuiltinInput","replaceShaderCode","priorStage","vertexInput","inputImpl","iodec","inputStruct","inputNames","getOutputNamesByReference","inputTypes","getOutputTypesByReference","inputInterpolations","getOutputInterpolationsByReference","outputStruct","vtkWebGPUShaderDescription","vtkWebGPUShaderDescription$1","textureDetails","r8unorm","numComponents","nativeType","elementSize","sampleType","r8snorm","Int8Array","r8uint","r8sint","r16uint","r16sint","r16float","rg8unorm","rg8snorm","rg8uint","rg8sint","r32uint","Uint32Array","r32sint","r32float","rg16uint","rg16sint","rg16float","rgba8unorm","rgba8snorm","rgba8uint","rgba8sint","bgra8unorm","rgb9e5ufloat","rgb10a2unorm","rg11b10ufloat","rg32uint","rg32sint","rg32float","rgba16uint","rgba16sint","rgba16float","rgba32uint","rgba32sint","rgba32float","stencil8","depth16unorm","depth24plus","depth32float","vtkWebGPUTypes","getDetailsFromTextureFormat","getByteStrideFromBufferFormat","sizeStart","num","getNumberOfComponentsFromBufferFormat","getNativeTypeFromBufferFormat","base","getShaderTypeFromBufferFormat","getByteStrideFromShaderFormat","getNativeTypeFromShaderFormat","arraysEqual","inputs","bindingDescriptions","attributeDescriptions","indexBuffer","addBuffer","inames","stepMode","names","removeBufferIfPresent","getBuffer","hasAttribute","getAttributeTime","getSourceTime","nameCount","nm","arrayInfo","getArrayInformation","getVertexInputInformation","info","vertexBuffers","buf","arrayStride","getStrideInBytes","shaderLocation","setVertexBuffer","setIndexBuffer","getReady","created","vtkWebGPUVertexInput","vtkWebGPUVertexInput$1","additionalBindables","fragmentShaderTemplate","numberOfInstances","numberOfVertices","pipelineHash","SSBO","textureViews","UBO","vertexShaderTemplate","WebGPURenderer","generateShaderDescriptions","vDesc","fDesc","sdrs","scode","unique","fnames","fname","replaceShaderIOStructs","replaceShaderRenderEncoder","replaceShaderRenderer","ubocode","setCode","replaceShaderMapper","replaceShaderPosition","addTextureView","view","prepareToDraw","updateInput","updateBuffers","updateBindings","updatePipeline","getBindables","computePipelineHash","registerDrawCallback","encoder","draw","prepareAndDraw","setPipeline","getBoundPipeline","activateBindGroup","bindUBO","getIndexBuffer","drawIndexed","getIndexCount","samp","getSampler","getPipeline","setDevice","setTopology","setRenderEncoder","setVertexState","createPipeline","vtkWebGPUSimpleMapper","vtkWebGPUSimpleMapper$1","getBufferManager","getFullScreenQuadBuffer","vtkWebGPUFullScreenQuad","vtkWebGPUFullScreenQuad$1","BufferUsage","Verts","Triangles","Strips","LinesFromStrips","LinesFromTriangles","UniformArray","PointArray","NormalsFromPoints","Texture","RawVertex","Storage","PrimitiveTypes","TriangleStrips","TriangleEdges","TriangleStripEdges","forwarded","vtkWebGPUBuffer","usage","write","destBuffer","destOffset","srcArrayBuffer","byteCount","srcBuffer","GPUBufferUsage","COPY_SRC","mappedAtCreation","arrayBuffer","getMappedRange","unmap","createCommandEncoder","copyBufferToBuffer","commandBuffer","finish","queue","submit","destroy","bufferSubData","createAndWrite","_loop","_model$handle","strideInBytes","arrayInformation","sourceTime","vtkWebGPUBuffer$1","processCell","Representation","_LimitedMap","_getOrAddFlatId","ptId","cellId","flatId","pointIdToFlatId","flatIdToPointId","flatIdToCellId","fillCell","ptIds","numPtIds","_ptId","cellProvokedMap","ibo","iboId","ptIdx2","_flatId","_ptIdx","_ptId2","provokedPointIds","_flatId2","_ptIdx2","_ptIdx3","countCell","iboSize","_ptIdx4","_ptId3","extraPoints","_single","_double","_triple","_indexCellBuilders","vtkWebGPUIndexBuffer","buildIndexBuffer","req","representation","inRepName","primType","getPrimitiveName","numberOfPoints","cellArrayIndex","_cellArrayIndex","nativeArray","flatSize","indexCount","vtkWebGPUIndexBuffer$1","packArray","inArrayData","outputType","getFlatSize","packExtra","hasOwnProperty","flatIdMap","getFlatIdToPointId","cellData","getFlatIdToCellId","i0","i1","i2","vtkWebGPUBufferManager","_createBuffer","gpuUsage","INDEX","COPY_DST","setArrayInformation","UNIFORM","STORAGE","VERTEX","arrayType","setStrideInBytes","_arrayType","pointArray","cellArrayData","getNumberOfCells","generateNormals","_result","setSourceTime","time","hasBuffer","hasCachedObject","getCachedObject","getBufferForPointArray","DOUBLE","_getFormatForDataArray","buffRequest","fullScreenQuadBuffer","vtkWebGPUBufferManager$1","bufferEntries","bufferEntryNames","_bufferEntryNames","_sendTime","bindGroupLayoutEntry","addEntry","send","_buffer","writeBuffer","createView","ArrayBuffer","setValue","instance","BYTES_PER_ELEMENT","setArray","arr","ioffset","setAllInstancesFromArray","inst","setAllInstancesFromArrayColorToFloat","setAllInstancesFromArray3x3To4x4","getSendTime","group","resource","clearData","vtkWebGPUStorageBuffer","vtkWebGPUStorageBuffer$1","bindGroupEntry","sendTime","sendDirty","sortDirty","packed","sortBufferEntries","currOffset","newEntries","maxAlignment","_entry","_entry2","entry2","_entry3","_entry4","_entry5","_entry6","i3","entry3","_entry7","_entry8","sendIfNeeded","lastValue","changed","vtkWebGPUUniformBuffer","vtkWebGPUUniformBuffer$1","clearFragColorTemplate","clearFragTextureTemplate","_fsqClearMat4","_tNormalMat4","recenterThreshold","suppressClear","stabilizedCenter","lightTimeString","stabilizedTime","webgpuCamera","updateStabilizedMatrix","clipRange","getPositionByReference","dop","getDirectionOfProjectionByReference","updateUBO","utime","getEnvironmentTexture","getMipLevel","getEnvironmentTextureDiffuseStrength","getEnvironmentTextureSpecularStrength","getYInvertedTiledSizeAndOrigin","getDevice","updateSSBO","lightPosArray","lightDirArray","lightColorArray","lightTypeArray","viewCoordinatePosition","getPosition","cos","r","getConeFalloff","setNumberOfInstances","scissorAndViewport","setViewport","setScissorRect","begin","getCommandEncoder","_model$backgroundTex","clearFSQ","setPipelineHash","setFragmentShaderTemplate","ubo","setUBO","backgroundTex","getPipelineHash","getUseEnvironmentTextureAsBackground","_ubo","environmentTextureHash","getTextureManager","getTextureForVTKTexture","tview","setTextureViews","backgroundTexLoaded","interpolate","addSampler","addressModeU","addressModeV","addressModeW","minFilter","magFilter","mipmapFilter","_ubo2","getUBO","volumeDepthRangePass","getPropFromID","getPropID","vtkWebGPURenderer","visibility","GPUShaderStage","FRAGMENT","sampler","createSampler","vtkWebGPUSampler","vtkWebGPUSampler$1","tmp2Mat4","tmp3Mat4","ptsArray1","ptsArray2","rowLength","lutBuildTime","WebGPUImageSlice","WebGPURenderWindow","getRenderEncoder","dimensions","volMapr","mcwcmat","modelToIndex","axis0","axis1","axis2","cShift","tView","tScale","getTexture","getScale","updateLUTImage","getTextureViews","numRows","colorArray","_j","grey","_j2","treq","superClassUpdateBuffers","newTex","getTextureForImageData","tViews","clampSampler","getOptions","sr","getShaderReplacements","replaceShaderImage","vtkWebGPUImageMapper","bufferShift","propID","keyMatricesTime","bcwc","bcsc","getUniquePropID","getBufferShift","wgpuRen","vtkWebGPUImageSlice","addVolume","vout","getBoundingCubePoints","extent","iz","iy","ix","indexToWorld","poffset","vtkWebGPUVolume","vtkWebGPUPixelSpaceCallbackMapper","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","_asyncToGenerator","self","err","DEFAULT_VIEW_API","VIEW_CONSTRUCTORS","registerViewConstructor","newAPISpecificView","defaultViewAPI","views","interactor","neverRendered","numberOfLayers","addRenderer","hasRenderer","setRenderWindow","removeRenderer","addView","hasView","_views","removeView","preRender","isActiveCameraCreated","resetCamera","traverseAllPasses","getStatistics","propCount","invisiblePropCount","getViewProps","prop","mpr","getPrimitiveCount","pcount","keyName","str","captureImages","opts","setImmediate","captureNextImage","vtkRenderWindow","vtkRenderWindow$1","listViewAPIs","delegates","currentOperation","preDelegateOperations","postDelegateOperations","currentParent","setCurrentOperation","currentTraverseOperation","viewNode","parent","_currentParent","vtkRenderPass","vtkRenderPass$1","translucentShaderReplacement","oitpFragTemplate","createVertexBuffer","_model$framebuffer","translucentRGBATexture","RGBA16F","setFormat","setOpenGLDataType","translucentRTexture","R16F","translucentZTexture","createCopyShader","renNode","forwardPass","_supported","drawBuffers","clearBufferfv","COLOR","DEPTH","getOpaqueActorCount","COLOR_ATTACHMENT1","BLEND","ZERO","depthFunc","ALWAYS","LEQUAL","vtkOpenGLOrderIndependentTranslucentPass","vtkOpenGLOrderIndependentTranslucentPass$1","opaqueActorCount","translucentActorCount","volumeCount","overlayActorCount","depthRequested","numlayers","getNumberOfLayers","getChildren","getRenderers","getDraw","getLayer","incrementOverlayActorCount","vtkForwardPass","vtkForwardPass$1","fieldAssociation","FieldAssociations","FIELD_ASSOCIATION_CELLS","captureZValues","getSourceDataAsync","_ref","_callee","fx1","fy1","fx2","fy2","_context","prev","stop","_x","_x2","_x3","_x4","_x5","selectAsync","_ref2","_callee2","srcData","_context2","sent","abrupt","generateSelection","_x6","_x7","_x8","_x9","_x10","vtkHardwareSelector","vtkHardwareSelector$1","SelectionContent","GLOBALIDS","PEDIGREEIDS","VALUES","INDICES","FRUSTUM","LOCATIONS","THRESHOLDS","BLOCKS","QUERY","SelectionField","CELL","POINT","FIELD","EDGE","ROW","contentType","fieldType","properties","selectionList","vtkSelectionNode","vtkSelectionNode$1","PassTypes","idOffset","getInfoHash","compositeID","getAlpha","xx","yy","pb","area","convert","g","getID","low24","high8","getPixelInformationWithData","buffdata","inDisplayPosition","maxDistance","outSelectedPosition","maxDist","displayPosition","actorid","pixBuffer","ACTOR_PASS","props","_info","COMPOSITE_INDEX_PASS","zValue","zBuffer","ID_LOW24","high24","ID_HIGH24","attributeID","dispPos","curPos","valid","convertSelection","fieldassociation","dataMap","openGLRenderWindow","sel","setContentType","setFieldType","FIELD_ASSOCIATION_POINTS","getProperties","worldPosition","displayToWorld","setSelectionList","attributeIDs","generateSelectionWithData","dmv","currentPass","propColorValue","maximumPointId","maximumCellId","releasePixBuffers","rawPixBuffer","beginSelection","_renderer","maxAttributeId","setSelector","hitProps","propPixels","originalBlending","isEnabled","endSelection","preCapturePass","postCapturePass","select","captureBuffers","setArea","originalBackground","setBackground","rpasses","getRenderPasses","MIN_KNOWN_PASS","MAX_KNOWN_PASS","passRequired","savePixelBuffer","processPixelBuffers","isPropHit","processSelectorPixelBuffers","pass","passNo","getPixelData","buildPropHitList","pixelbuffer","renderProp","setPropColorValueFromInt","renderCompositeIndex","renderAttributeId","attribid","passTypeToString","enumToString","Boolean","getPixelInformation","_info2","getRawPixelBuffer","getPixelBuffer","attach","superSetArea","vtkOpenGLHardwareSelector","SET_GET_FIELDS","lastShaderBound","shaderPrograms","nFSSource","gl2","fragDepthString","nVSSource","shaderOutputs","outputCount","vertexCode","fragmentCode","geometryCode","getShaderProgram","getCompiled","bindShader","hashInput","sps","getVertexShader","setSource","getFragmentShader","getGeometryShader","setMd5Hash","releaseCurrentShader","sp","astShaderBound","vtkShaderCache","vtkShaderCache$1","numberOfTextureUnits","textureUnits","deleteTable","MAX_TEXTURE_IMAGE_UNITS","allocate","isAllocated","allocateUnit","unit","textureUnitId","free","vtkOpenGLTextureUnitManager","vtkTextureUnitManager","getViewNodeFactory","getAspectRatioForRenderer","isInViewport","vCoords","getViewportSize","getViewportCenter","displayToNormalizedDisplay","z","worldToView","viewToWorld","worldToDisplay","val2","viewToProjection","val3","projectionToNormalizedDisplay","normalizedDisplayToProjection","normalizedDisplayToViewport","coords","viewportToNormalizedViewport","normalizedViewportToViewport","displayToLocalDisplay","viewportToNormalizedDisplay","getComputedDevicePixelRatio","getContainerSize","createSelector","vtkRenderWindowViewNode","vtkRenderWindowViewNode$1","HmdVR","MobileAR","LookingGlassVR","GET_UNDERLYING_CONTEXT","createContextProxyHandler","getParameterHandler","propHandlers","receiver","propValue","Proxy","Reflect","Function","propHandler","SCREENSHOT_PLACEHOLDER","position","top","DEFAULT_RESET_FACTORS","vr","rescaleFactor","translateZ","ar","checkRenderTargetSupport","GL_CONTEXT_COUNT","GL_CONTEXT_LISTENERS","deleteGLContext","cb","_preventDefault","preventDefault","vtkOpenGLRenderWindow","cachingContextHandler","restoreContext","hardwareMaximumLineWidth","isImmersiveVrSupported","isSessionSupported","previousSize","onModified","setAttribute","viewStream","setSize","style","display","useOffScreen","cursor","cursorVisibility","containerSize","getRenderersByReference","initialized","get3DContext","textureUnitManager","shaderCache","makeCurrent","setContainer","parentNode","removeChild","contains","bgImage","appendChild","useBackgroundImage","getContainer","_model$el$getBounding","getBoundingClientRect","activeFramebuffer","preserveDrawingBuffer","invokeHaveVRDisplay","webgl2Supported","webgl2","defaultToWebgl2","startXR","xrSessionType","isAR","sessionType","xrSession","requestSession","enterXR","glLayer","oldCanvasSize","makeXRCompatible","XRWebGLLayer","framebufferWidth","framebufferHeight","updateRenderState","baseLayer","requestReferenceSpace","refSpace","xrReferenceSpace","resetXRScene","switchToXRAnimation","xrSceneFrame","requestAnimationFrame","xrRender","isXrSessionAR","physicalScale","getPhysicalScale","physicalTranslation","getPhysicalTranslation","setPhysicalScale","setPhysicalTranslation","stopXR","cancelAnimationFrame","returnFromXRAnimation","DOMException","setProjectionMatrix","_ref3","_callee3","frame","xrPose","_context3","session","updateXRGamepads","getViewerPose","renderState","getViewport","eye","startX","startY","endX","endY","computeViewParametersFromPhysicalMatrix","transform","inverse","projectionMatrix","rp","_textureResourceIds","activeUnit","getTextureUnitManager","activeTexture","TEXTURE0","R8","RG8","RGB8","RGBA8","R16_EXT","RG16_EXT","RGB16_EXT","RGBA16_EXT","R16_SNORM_EXT","RG16_SNORM_EXT","RGB16_SNORM_EXT","RGBA16_SNORM_EXT","RG16F","RGB16F","setBackgroundImage","img","setUseBackgroundImage","_ref4","_ref4$resetCamera","_ref4$size","_ref4$scale","imageFormat","previous","notifyStartCaptureImage","_screenshot","subscription","onImageReady","imageURL","placeHolder","originalSize","cameras","_ref5","restoreParamsFn","remove","tmpImg","isUserResetCamera","params","resetCameraArgs","resetCameraFn","JSON","parse","stringify","_ref6","lineWidthRange","ALIASED_LINE_WIDTH_RANGE","glTextureFloat","glTextureHalfFloat","glDebugRendererInfo","glDrawBuffers","glAnisotropic","MAX_VERTEX_ATTRIBS","MAX_VARYING_VECTORS","MAX_VERTEX_UNIFORM_VECTORS","MAX_FRAGMENT_UNIFORM_VECTORS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_CUBE_MAP_TEXTURE_SIZE","MAX_TEXTURE_MAX_ANISOTROPY_EXT","ALIASED_POINT_SIZE_RANGE","MAX_VIEWPORT_DIMS","MAX_RENDERBUFFER_SIZE","RED_BITS","GREEN_BITS","BLUE_BITS","ALPHA_BITS","DEPTH_BITS","STENCIL_BITS","SUBPIXEL_BITS","SAMPLES","SAMPLE_BUFFERS","ALPHA","MAX_DRAW_BUFFERS_WEBGL","getShaderPrecisionFormat","HIGH_FLOAT","precision","rangeMin","rangeMax","MEDIUM_FLOAT","LOW_FLOAT","HIGH_INT","MEDIUM_INT","LOW_INT","getSupportedExtensions","VENDOR","VERSION","SHADING_LANGUAGE_VERSION","UNMASKED_VENDOR_WEBGL","_params$pop","_params$pop2","renderPasses","temporaryCanvas","temporaryContext","mainBoundingClientRect","viewProp","canvasList","getElementsByTagName","currentCanvas","boundingClientRect","newXPosition","newYPosition","screenshot","toDataURL","invokeImageReady","getCanvasDataURL","disableCullFace","cullFaceEnabled","CULL_FACE","enableCullFace","setViewStream","stream","invalidateCache","newActiveFramebuffer","superSetSize","invokeWindowResizeEvent","textureResourceIds","xrSupported","Image","zIndex","pushMonitorGLContextCount","popMonitorGLContextCount","activeTextures","getTextures","ogltextures","oglmapper","activateTextures","vtkOpenGLActor","vtkActor","traverseOverlayPass","overlayPass","vtkOpenGLActor2D","vtkActor2D","Shading","ScalarMode","StartEvent","EndEvent","CoordinateSystem","vtkOpenGLPolyDataMapper","openGLActor","primitives","replaceShaderColor","getReferenceByName","colorDec","colorImpl","getColorComponents","drawingEdges","getInterpolateScalarsBeforeMapping","getColorCoordinates","getBackfaceProperty","lastLightCount","sstring","lc","_lc","_lc2","_lc3","replaceShaderNormal","tus","getActiveTextures","tcdim","getTarget","getColorTextureMap","getEdgeVisibility","getPrimitiveType","getCoincidentTopologyPointOffsetParameter","getCoincidentTopologyLineOffsetParameters","getFieldAssociation","replaceShaderPicking","lastSelectionState","poly","needLighting","pointNormals","cellNormals","getCellData","flat","getInterpolation","FLAT","getLighting","selectionStateChanged","listCallbacks","ShadersCallbacks","userData","primitiveIDOffset","vertexIDOffset","getCustomShaderAttributes","attrName","getCustomData","getColorBO","getColorOffset","getColorBOStride","internalColorTexture","tname","getPropColorValue","getCurrentPass","getColorByReference","ld","newLightDirection","lightTypeIsSceneLight","lightDirection","lightHalfAngle","viewTF","_light","np","getAttenuationValuesByReference","camm","getKeyMatrixTime","progm","getLastCameraMTime","actorIsIdentity","getCoordinateSystem","DISPLAY","tmpMat3","aColor","getEdgeColorByReference","getAmbientColorByReference","getDiffuseColorByReference","aIntensity","dIntensity","sIntensity","sColor","getSpecularColorByReference","getAmbientColor","getDiffuseColor","getSpecularColor","updateMaximumPointCellIds","_model$selectionWebGL","_model$selectionWebGL2","_model$selectionWebGL3","_model$selectionWebGL4","selectionWebGLIdsToVTKIds","setMaximumPointId","_length","setMaximumCellId","picking","drawSurfaceWithEdges","setPointPicking","LastBoundBO","getStatic","getNumberOfValues","backfaceCulling","getBackfaceCulling","frontfaceCulling","getFrontfaceCulling","cullFace","FRONT","BACK","vmtime","mapScalars","getColorMapColors","scalarMode","getScalarMode","getScalarVisibility","USE_CELL_DATA","USE_CELL_FIELD_DATA","USE_FIELD_DATA","USE_POINT_FIELD_DATA","getTCoords","arrayName","getArrayByName","getPopulateSelectionSettings","getVerts","setSelectionWebGLIdsToVTKIds","shaderRebuildString","ambientColor","diffuseColor","specularColor","setPrimitiveType","lastSelectionPass","vtkOpenGLPolyDataMapper$1","vtkOpenGLGlyph3DMapper","hardwareSupport","multiply4x4WithOffset","out","off","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","getColorArray","updateGlyphShaderParameters","normalMatrixUsed","mcvcMatrixUsed","carray","garray","narray","p","ofs","b00","b01","b02","b10","b11","b12","b20","b21","b22","mcpcMatrix","mcvcMatrix","cdata","tmpColor","getMatrixArray","getNormalArray","compositePass","cabo","drawArraysInstancedANGLE","glyphBOBuildTime","matrixBuffer","normalBuffer","colorBuffer","pickBuffer","buildArrays","getBuildTime","parray","mcwcMatrix","vtkGlyph3DMapper","imat","lastFormat","camPos","tmaps","vtkOpenGLSkybox","vtkSkybox","vtkSphereMapperVS","vtkOpenGLSphereMapper","fragString","invert","getScaleArray","hasArray","getScaleFactor","tmp4","vbo","scales","getArray","setColorOffset","setColorBOStride","setColorBO","setColorComponents","setStride","pointSize","cos30","vboIdx","ucIdx","radius","getRadius","vtkSphereMapper","vtkStickMapperVS","vtkOpenGLStickMapper","anorms","orientationArray","getOrientationArray","verticesArray","getLength","vtkStickMapper","previousTextureParameters","getTextureParameters","shouldReset","previousTextureSize","update3DFromRaw","vtkStreamingOpenGLVolumeMapper","getModelInitialValues","getScalarTexture","vtkStreamingOpenGLViewNodeFactory","vtkStreamingOpenGLRenderWindow","Device","Unknown","LeftController","RightController","Input","Trigger","TrackPad","Grip","Thumbstick","A","B","ApplicationMenu","Axis","TouchpadX","TouchpadY","ThumbstickX","ThumbstickY","normalizeWheel","vtkOnceErrorMacro","EMPTY_MOUSE_EVENT","MouseEvent","deviceInputMap","handledEvents","pointerCacheToPositions","positions","pointerId","renderWindow","interactorStyle","picker","pickingManager","enabled","enableRender","currentRenderer","lightFollowCamera","desiredUpdateRate","stillUpdateRate","container","recognizeGestures","currentGesture","animationRequest","lastFrameTime","recentAnimationFrameRate","wheelTimeoutID","moveTimeoutID","lastGamepadValues","preventDefaultOnPointerDown","preventDefaultOnPointerUp","mouseScrollDebounceByPass","_animationExtendedEnd","eventName","animationRequesters","pointerCache","wheelCoefficient","updateCurrentRenderer","_forcedRenderer","findPokedRenderer","getScreenEventPositionFor","_view","scaleX","scaleY","clientX","clientY","getModifierKeysFor","controlKey","ctrlKey","altKey","shiftKey","getKeysFor","modifierKeys","keyCode","charCode","getDeviceTypeFor","pointerType","forceRender","inRender","invokeRenderEvent","startEventLoop","aren","setInteractorStyle","setInteractor","setEnabled","getCurrentRenderer","bindEvents","handleWheel","handlePointerEnter","handlePointerLeave","handlePointerMove","passive","handlePointerDown","handlePointerUp","handlePointerCancel","handleKeyPress","handleKeyDown","handleKeyUp","handlePointerLockChange","touchAction","userSelect","webkitTapHighlightColor","unbindEvents","keyPressEvent","keyDownEvent","keyUpEvent","callData","deviceType","pointerEnterEvent","mouseEnterEvent","pointerLeaveEvent","mouseLeaveEvent","button","isPointerLocked","hasPointerCapture","releasePointerCapture","setPointerCapture","handleTouchStart","handleMouseDown","handleTouchEnd","handleMouseUp","handleTouchMove","handleMouseMove","leftButtonPressEvent","middleButtonPressEvent","rightButtonPressEvent","requestPointerLock","exitPointerLock","pointerLockElement","startPointerLockEvent","endPointerLockEvent","requestAnimation","requestor","xrAnimation","_animationStartTime","_animationFrameCount","handleAnimation","startAnimationEvent","extendAnimation","duration","newEnd","cancelAnimation","skipWarning","endAnimationEvent","requestStr","xrFrame","xrRefSpace","inputSources","inputSource","gripPose","gripSpace","getPose","gp","gamepad","hand","handedness","buttons","none","pressed","button3DEvent","orientation","mapping","move3DEvent","startMouseMoveEvent","mouseMoveEvent","clearTimeout","setTimeout","endMouseMoveEvent","currTime","animationFrameRateUpdateEvent","animationEvent","spinY","startMouseWheelEvent","mouseWheelEvent","endMouseWheelEvent","leftButtonReleaseEvent","middleButtonReleaseEvent","rightButtonReleaseEvent","pointers","recognizeGesture","_callData","_callData2","_positions","_callData3","setView","getFirstRenderer","_model$_view","_model$_view$getRende","_model$_view$getRende2","_model$_view2","_model$_view2$getRend","rc","interactiveren","viewportren","getInteractive","lowerFirst","charAt","pokedRenderer","firstRenderer","startingEventPositions","endPinchEvent","endRotateEvent","endPanEvent","posVals","startVals","originalDistance","newDistance","originalAngle","atan2","newAngle","angleDeviation","trans","thresh","clientWidth","clientHeight","pinchDistance","rotateDistance","panDistance","touches","startPinchEvent","_callData4","rotation","startRotateEvent","_callData5","translation","startPanEvent","_callData6","rotateEvent","_callData7","pinchEvent","_callData8","panEvent","handleVisibilityChange","setCurrentRenderer","superDelete","hidden","vtkRenderWindowInteractor","vtkRenderWindowInteractor$1","invokeResize","rendererMap","getRenderer","resize","vtkOffscreenMultiRenderWindow","createRadonTransferFunction","firstAbsorbentMaterialHounsfieldValue","firstAbsorbentMaterialAbsorption","maxAbsorbentMaterialHounsfieldValue","maxAbsorbentMaterialAbsorption","outputTransferFunction","removeAllPoints","addPointLong","addPoint","sampleDistance","imageSampleDistance","maximumSamplesPerRay","autoAdjustSampleDistances","filterMode","computeNormalFromOpacity","volumetricScatteringBlending","globalIlluminationReach","volumeShadowSamplingDistFactor","anisotropy","localAmbientOcclusion","LAOKernelSize","LAOKernelRadius","static","setBlendModeToComposite","setBlendMode","setBlendModeToMaximumIntensity","setBlendModeToMinimumIntensity","setBlendModeToAverageIntensity","setBlendModeToAdditiveIntensity","setBlendModeToRadonTransform","getBlendModeAsString","setAverageIPScalarRange","setIpScalarRange","getFilterModeAsString","setFilterModeToOff","setFilterMode","setFilterModeToNormalized","setFilterModeToRaw","setGlobalIlluminationReach","setVolumetricScatteringBlending","vsb","setVolumeShadowSamplingDistFactor","vsdf","setAnisotropy","at","setLAOKernelSize","setLAOKernelRadius","kr","vtkVolumeMapper$1","vtkSharedVolumeMapper","updatedFrames","superCreate3DFilterableFromRaw","inputDataType","inputNumComps","bytesPerVoxel","TypedArrayConstructor","fillSubImage3D","frameIndex","zOffset","blockHeight","multiRowBlockLength","multiRowBlockLengthInBytes","normalBlocks","lastBlockHeight","multiRowLastBlockLength","block","yOffset","dataView","setUpdatedFrame","vtkStreamingOpenGLTexture","isPerformingCoordinateTransformation","tmpMatrix","tmpvec1","nearz","farz","clippingRange","parallelProjection","useOffAxisProjection","viewAngle","useHorizontalViewAngle","znear","zfar","vtkSlabCamera","ImageVolume","_imageIdsIndexMap","_imageURIsIndexMap","isPreScaled","metadata","origin","scalarData","numVoxels","scaling","referencedVolumeId","_imageIds","newImageIds","_reprocessImageIds","isDynamicVolume","getScalarData","obj","Uint8ClampedArray","getImageIdIndex","createInternalVTKRepresentation","PhotometricInterpretation","dataArrayAttrs","setDimensions","setSpacing","setDirection","scalarDataArrays","vtkScalarArray","addArray","setActiveScalars","addScalarDataArraysToImageData","getScalarDataArrays","scalarArray","setScalars","addScalarDataToImageData","volumeLoaders","unknownVolumeLoader","loadVolumeFromVolumeLoader","scheme","loader","VOLUME_LOADED","errorObject","VOLUME_LOADED_FAILED","loadVolume","createAndCacheVolume","createAndCacheDerivedVolume","referencedVolume","targetBuffer","scalarLength","TypedArray","volumeScalarData","derivedImageData","derivedVolume","createLocalVolume","preventCache","registerVolumeLoader","volumeLoader","getVolumeLoaderSchemes","registerUnknownVolumeLoader","oldVolumeLoader","EPSILON_PART","isPrimaryVolume","startsWith","starts","getTargetVolumeAndSpacingInNormalDir","targetVolumeId","volumeActors","getActors","spacingInNormalDirection","actorUID","imageVolumes","va","referenceId","uid","iv","imageVolumeIndex","findIndex","smallest","hasPrimaryVolume","getVolumeActorCorners","volumeActor","extentToBounds","indexWithinDimensions","targetViewport","sameVolumesViewports","renderingEngine","targetActors","viewports","getVolumeViewports","vp","vpActors","every","vpActor","targetViewports","filteredViewports","hasVolumeId","transformWorldToIndex","RequestPoolManager","numRequests","interaction","thumbnail","prefetch","requestPool","grabDelay","awake","maxNumRequests","setMaxSimultaneousRequests","getMaxSimultaneousRequests","timeoutHandle","addRequest","requestFn","additionalDetails","requestDetails","Interaction","startGrabbing","filterRequests","filterFunction","requestType","clearRequestStack","sendRequests","requestsToSend","getNextRequest","finally","startAgain","interactionPriorities","getSortedPriorityGroups","hasRemainingInteractionRequests","hasRemainingThumbnailRequests","Thumbnail","hasRemainingPrefetchRequests","Prefetch","priorities","getRequestPool","imageLoadPoolManager","imageLoaders","unknownImageLoader","loadImageFromCacheOrVolume","cachedVolumeInfo","loadStatus","convertToCornerstoneImage","IMAGE_LOADED","IMAGE_LOAD_FAILED","loadImageFromImageLoader","loadImage","loadAndCacheImage","loadAndCacheImages","cancelLoadImage","cancelLoadImages","cancelLoadAll","requests","loadObject","cancel","registerImageLoader","imageLoader","registerUnknownImageLoader","oldImageLoader","unregisterAllImageLoaders","VIEWPORT_ELEMENT","CANVAS_CSS_CLASS","getOrCreateCanvas","element","canvasSelector","viewportElement","internalDiv","querySelector","div","classList","createViewportElement","createCanvas","preScale","scaled","scalingParameters","suvbw","renderToCanvasGPU","modality","HTMLCanvasElement","viewportId","originalWidth","originalHeight","body","uniqueId","stackViewportInput","STACK","defaultOptions","suppressEvents","enableElement","elementRendered","onImageRendered","eventDetail","IMAGE_RENDERED","disableElement","querySelectorAll","renderImageObject","setProperties","minPixelValue","maxPixelValue","validateParameterUndefinedOrNull","checkParam","errorMsg","isRotated","imageSize","getImageSize","rowPixelSpacing","columnPixelSpacing","verticalRatio","horizontalRatio","verticalScale","horizontalScale","scaleFactor","colormap","initialDefaultViewport","voi","pixelReplication","hflip","vflip","modalityLUT","voiLUT","labelmap","displayedArea","tlhc","brhc","presentationSizeMode","createViewport","getImageFitScale","columns","rows","Transform","clone","m11","m12","m21","m22","dx","dy","d","m0","m1","m2","m3","m4","m5","rotate","rad","sin","sx","sy","transformPoint","point","enabledElement","angle","widthScale","heightScale","performance","lut","minValue","maxValue","maxValueMapped","firstValueMapped","modalityLutValue","generateNonLinearVOILUT","generateLinearVOILUT","calculateTransform","setTransform","doesImageNeedToBeRendered","lastRenderedImageId","renderingTools","lastRenderedViewport","renderCanvas","canvasContext","fillStyle","fillRect","renderCanvasData","getImageData","renderCanvasContext","isColor","color","lastRenderedIsColor","getLut","cachedLut","lutArray","vlutfn","storedValue","generateColorLUT","getRenderCanvas","invalidated","canvasWasColor","initializeRenderCanvas","colorLUT","stats","lastLutGenerateTime","canvasImageDataData","pixelData","lastGetPixelDataTime","canvasImageDataIndex","storedPixelDataIndex","lastStoredPixelDataToCanvasImageDataTime","storedRGBAPixelDataToCanvasImageData","storedColorPixelDataToCanvasImageData","putImageData","lastPutImageDataTime","renderColorImage","imageSmoothingEnabled","setToPixelCoordinateSystem","saveLastRendered","computeAutoVoi","hasLut","hasVoi","maxVoi","slope","intercept","minVoi","lutMatches","mlutfn","storedPixelValue","generateNonLinearModalityLUT","generateLinearModalityLUT","getModalityLut","generateLut","useAlphaChannel","minimum","collectedMultiplierTerms","petVOILutFunction","lutFunction","storedPixelDataToCanvasImageDataPET","storedPixelDataToCanvasImageData","pixelValue","storedPixelDataToCanvasImageDataRGBA","renderGrayscaleImage","HSVToRGB","hue","sat","rgb","hueCase","frac","lx","ly","lz","NumberOfColors","Ramp","TableRange","HueRange","SaturationRange","ValueRange","AlphaRange","NaNColor","BelowRangeColor","UseBelowRangeColor","AboveRangeColor","UseAboveRangeColor","InputRange","Table","setNumberOfTableValues","number","setRamp","ramp","setTableRange","setHueRange","setSaturationRange","setValueRange","setRange","setAlphaRange","scalar","mapValue","force","maxIndex","hinc","sinc","vinc","ainc","c_rgba","buildSpecialColors","numberOfColors","belowRangeColorIndex","aboveRangeColorIndex","nanColorIndex","getIndex","Range","MaxIndex","Shift","Scale","dIndex","linearIndexLookupMain","setTableValue","COLOR_TRANSPARENT","getRank","elem","midElem","makeMappingArray","N","y0","xLinSpace","vector","linspace","xLinSpaceIndexes","inputArray","indexes","len","searchSorted","colorPercent","colorDelta","getColormap","colormapData","redLut","greenLut","blueLut","createLinearSegmentedColormap","cpuFallbackColormap","getId","getColorSchemeName","setColorSchemeName","getNumberOfColors","setNumberOfColors","isValidIndex","getColorRepeating","setColor","addColor","insertColor","removeColor","clearColors","buildLookupTable","createLookupTable","grayscaleLut","grayscale","clut","clamp","renderPseudoColorImage","colormapId","lastRenderTime","renderTimeInMs","invalid","needsRedraw","renderToCanvasCPU","getDefaultViewport","drawImageSync","loadImageToCanvas","renderFn","successCallback","errorCallback","useRGBA","worldCoords","imagePlaneModule","columnCosines","rowCosines","newOrigin","sub","imageToWorldCoords","imageCoords","imageCoordsInWorld","SMALL_EPSILON","isOne","isUnit","isOrthonormal","getSliceRange","focalPoint","corners","dz","buildFromDegree","rotateFromDirections","pt","transformedFocalPoint","currentSlice","minX","maxX","current","getCamera","actorEntry","getActor","sliceRange","numScrollSteps","floatingStepNumber","currentStepIndex","sliceRangeInfo","snapFocalPointToSlice","deltaFrames","posDiffFromFocalPoint","steps","newFocalPoint","newSlicePosFromMin","newPosition","numberOfSlices","imageIndex","isImageActor","actorIsA","actorType","getViewportsWithImageURI","filteredStackViewports","getStackViewports","hasImageURI","filteredVolumeViewports","getClosestStackImageIndexForPoint","minimalDistance","getImageIds","currentImageIdIndex","getCurrentImageIdIndex","planeMetadata","targetImagePlane","rowVec","colVec","planeNormal","getPlaneMetadata","closestStack","higherImageIds","lowerImageIds","calculateMinimalDistanceForStackViewport","spatialRegistrationMetadataProvider","viewportId1","viewportId2","entryId","entryIdReverse","viewport1","viewport2","imageId1","getCurrentImageId","imageId2","imagePlaneModule1","imagePlaneModule2","imageOrientationPatient","iop2","isSameImagePlane","imagePositionPatient1","imagePositionPatient2","getViewportImageCornersInWorld","topRightCanvas","bottomRightCanvas","bottomLeftCanvas","topLeftWorld","canvasToWorld","topRightWorld","bottomRightWorld","bottomLeftWorld","topLeftImage","topRightImage","bottomRightImage","bottomLeftImage","topLeftImageWorld","_isInBounds","topRightImageWorld","bottomRightImageWorld","bottomLeftImageWorld","_getStackViewportImageCorners","imageCoord","hasNaNValues","some","applyPreset","preset","colorTransferArray","shiftRange","getShiftRange","normColorTransferValuePoints","rescaled","applyPointsToRGBFunction","setRGBTransferFunction","scalarOpacityArray","normPoints","pwf","applyPointsToPiecewiseFunction","setScalarOpacity","gradientMinValue","gradientMinOpacity","gradientMaxValue","gradientMaxOpacity","setUseGradientOpacity","setGradientOpacityMinimumValue","setGradientOpacityMinimumOpacity","setGradientOpacityMaximumValue","setGradientOpacityMaximumOpacity","setInterpolationTypeToFastLinear","setAmbient","setDiffuse","setSpecular","setSpecularPower","isMergeableObject","cloneIfNecessary","optionsArgument","deepMerge","defaultArrayMerge","destination","arrayMerge","mergeObject","getScalingParameters","modalityLutModule","generalSeriesModule","rescaleSlope","rescaleIntercept","suvFactor","suvbsa","suvlbm","getScalarDataType","getEnabledElement","viewportUid","renderingEngineUid","dataset","getEnabledElementByIds","hasBeenDestroyed","FrameOfReferenceUID","getFrameOfReferenceUID","getEnabledElements","enabledElements","getCornerstoneImage","linePlaneIntersection","p0","p1","x0","z0","z1","C","D","threePlaneIntersection","firstPlane","secondPlane","thirdPlane","A1","B1","C1","D1","A2","B2","C2","D2","A3","B3","C3","D3","planeDistanceToPoint","signed","numerator","sign","toWindowLevel","low","high","toLowHighRange","_colormaps","registerColormap","Name","getColormapNames","presetMap","IndexedColors","Annotations","ColorSpace","NanColor","RGBPoints","Creator","Source","License","ShowIndexedColorActiveValues","rgbPresetNames","addPreset","removePresetByName","getPresetByName","VTK_MAX_VRCOMP","independentComponents","componentData","colorChannels","grayTransferFunction","rGBTransferFunction","scalarOpacityUnitDistance","opacityMode","gradientOpacityMinimumValue","gradientOpacityMinimumOpacity","gradientOpacityMaximumValue","gradientOpacityMaximumOpacity","componentWeight","disableGradientOpacity","getColorChannels","setGrayTransferFunction","getGrayTransferFunction","setComponentWeight","setInterpolationTypeToNearest","setInterpolationType","setInterpolationTypeToLinear","getInterpolationTypeAsString","cap","vtkVolumeProperty","vtkVolumeProperty$1","mapper","boundsMTime","getVolumes","makeProperty","mapperBounds","_","row","bbox","mt","getRedrawMTime","getInputAlgorithm","vtkVolume$1","createVolumeMapper","volumeMapper","setInputData","setMaximumSamplesPerRay","setSampleDistance","setScalarTexture","PRIORITY","REQUEST_TYPE","use16BitTexture","voiLutModule","getVOIFromMetadata","numImages","bytesPerImage","voxelsPerImage","bytePerPixel","scalingParametersToUse","byteOffset","imageScalarData","volumeBuffer","volumeBufferView","_getImageScalarDataFromImageVolume","getVOIFromMinMax","PT","_isCurrentImagePTPrescaled","handlePreScaledVolume","setMappingRange","setMapper","setIndependentComponents","voiModifiedEventDetail","VOI_MODIFIED","triggerVOIModified","volumeInputs","viewportIds","immediateRender","setVolumePromises","setVolumes","addVolumePromises","addVolumes","cameraEvent","sliceData","VOLUME_NEW_IMAGE","flipHorizontal","flipVertical","viewportStatus","NO_DATA","_suppressCameraModifiedEvents","hasPixelSpacing","sWidth","sHeight","_actors","isDisabled","useCustomRenderingPipeline","setRendered","LOADING","RENDERED","offscreenMultiRenderWindow","renderViewport","setOptions","immediate","displayArea","setDisplayArea","getDefaultImageData","viewRight","viewUpToSet","viewPlaneNormalToSet","middleIJK","centeredFocalPoint","resetFocalPoint","_getFocalPointForResetCamera","resetPan","resetToCenter","panDir","panValue","getPanDir","mirrorVec","panDirMirror","setCamera","getDefaultActor","getActorUIDByIndex","getActorByIndex","setActors","actors","removeAllActors","addActors","_removeActor","removeViewProp","removeActors","actorUIDs","resetCameraPanAndZoom","addActor","removeAllViewProps","resetCameraNoEvent","setCameraNoEvent","_getViewImageDataIntersections","edges","_getEdges","intersections","intersectionPoint","storeAsInitialCamera","fitToCanvasCamera","imageArea","imageCanvasPoint","areaX","areaY","zoom","getZoom","setZoom","imagePoint","canvasPoint","canvasX","canvasY","canvasPanX","canvasPanY","canvasZero","worldToCanvas","canvasEdge","canvasImage","imgWidth","imgHeight","imageX","imageY","deltaPoint2","setPan","DISPLAY_AREA_MODIFIED","getDisplayArea","resetZoom","previousCamera","computeVisiblePropBounds","activeCamera","getVtkActiveCamera","getViewPlaneNormal","getViewUp","widthWorld","heightWorld","_getWorldDistanceViewUpAndViewRight","canvasSize","boundsAspectRatio","canvasAspectRatio","w1","w2","w3","focalPointToSet","positionToSet","resetCameraClippingRange","clippingRangeToUse","modifiedCamera","setFitToCanvasCamera","setInitialCamera","RESET_CAMERA_EVENT","triggerCameraModifiedEventIfNecessary","initialCamera","getPan","getFocalPoint","zero3","initialCanvasFocal","currentCanvasFocal","pan","delta2","newFocal","initialParallelScale","_getFocalPointForViewPlaneReset","point_x","point_y","point_z","cameraInterface","updatedCamera","flipH","flipV","setViewUp","setDirectionOfProjection","setPosition","setFocalPoint","setParallelScale","setViewAngle","updateClippingPlanesForActors","getRotation","CAMERA_MODIFIED","vtkPlanes","setOrientationOfClippingPlanes","scaledDistance","newOrigin1","newOrigin2","viewUpCorners","_getCorners","viewRightCorners","minY","maxY","_shouldUseNativeDataType","oldCamera","oldFocalPoint","oldViewPlaneNormal","vectorFromOldFocalPointToCenteredFocalPoint","distanceFromOldFocalPointToCenteredFocalPoint","xMin","xMax","yMin","yMax","zMin","zMax","p2","p3","p4","p5","p6","p7","p8","inverted","voiRanges","VOILUTFunction","_FrameOfReferenceUID","canvasPos","setIsPerformingCoordinateTransformation","canvasPosWithDPR","displayCoord","worldCoord","canvasCoord","canvasCoordWithDPR","applicableVolumeActorInfo","_getApplicableVolumeActor","volumeIdToUse","setActiveCamera","ORTHOGRAPHIC","VOLUME_3D","setParallelProjection","PERSPECTIVE","initializeVolumeNewImageEventDispatcher","applyViewOrientation","_getOrientationVectors","setViewUpFrom","volumeNewImageHandlerBound","volumeNewImageCleanUpBound","evt","ELEMENT_DISABLED","resetVolumeNewImageState","resetVolumeViewportClippingRange","setVOILUTFunction","voiLUTFunction","setVOI","setColormap","colormapObj","applyColorMap","setOpacity","setInvert","_getOrCreateColorTransferFunction","invertStateChanged","newRGBTransferFunction","voiRangeToUse","SAMPLED_SIGMOID","setPreset","presetName","volumeInputArray","firstImageVolume","_isValidVolumeInputArray","_setVolumeActors","PRE_RENDER","VOLUME_VIEWPORT_NEW_VOLUME","setVisibility","removeVolumeActors","setOrientation","actorEntries","numVolumes","volumeInput","flipDirection","defaultActor","defaultActorUID","vtkImageData","Modality","volumeActorEntries","getIntensityFromWorld","voxelIndex","_useAcquisitionPlaneForViewPlane","spacingInNormal","ACQUISITION","_setViewPlaneToAcquisitionPlane","_getAcquisitionPlaneOrientation","filterActorUIDs","clipPlane1","clipPlane2","newVtkPlanes","addClippingPlane","setSlabThickness","currentCamera","resetProperties","_resetProperties","getMappingRange","customDisplayExtent","useCustomExtents","backgroundColor","vtkAbstractImageMapper$1","vtkAbstractImageMapper","doPicking","ijk","worldOrigin","worldNormal","intersect","intersectWithLine","intersection","absoluteIJK","staticOffsetAPI","CoincidentTopologyHelper","otherStaticMethods","computeClosestIJKAxis","inVec3","slicingMode","closestIJKAxis","maxAbs","axis","absValue","xyzLabel","ijkLabel","pos3","isFinite","ex","fp","setSlice","setXSlice","setSlicingMode","setYSlice","setZSlice","setISlice","setJSlice","setKSlice","getSlicingModeNormal","mat3","getBoundsForSlice","halfThickness","intersectWithLineForPointPicking","pickingData","intersectWithLineForCellPicking","absIJK","pCoords","renderToRectangle","sliceAtFocalPoint","implementCoincidentTopologyMethods","vtkImageMapper$1","colorWindow","colorLevel","useLookupTableScalarRange","piecewiseFunction","transferFunc","isInteger","setPiecewiseFunction","vtkImageProperty","vtkImageProperty$1","getImages","forceOpaque","forceTranslucent","isOpaque","hasTranslucentPolygonalGeometry","thickness","newBounds","getMinXBound","getMaxXBound","getMinYBound","getMaxYBound","getMinZBound","getMaxZBound","_time","getSupportsSelection","vtkImageSlice$1","getTransform","forceFitToWindow","oldCanvasWidth","oldCanvasHeight","setCanvasSize","imageWidth","imageHeight","wasFitToWindow","fitToWindow","relWidthChange","relHeightChange","relChange","relativeRescale","voiUpdatedWithSetProperties","initialInvert","stackInvalidated","_publishCalibratedEvent","useNativeDataType","_configureRenderingPipeline","_resizeCPU","_cpuFallbackEnabledElement","frameOfReferenceUID","csImage","createActorMapper","isComputedVOI","getRotationCPU","getRotationGPU","currentViewUp","initialViewUp","initialToCurrentViewUpAngle","initialToCurrentViewUpCross","_setCSImage","_updateToDisplayImageCPU","_updateActorToDisplayImageId","canvasToWorldCPU","px","py","canvasToPixel","worldToCanvasCPU","diff","worldPoint","pixelToCanvas","canvasToWorldGPU","worldToCanvasGPU","getTargetImageIdIndex","targetImageIdIndex","hasImageId","customRenderViewportToCanvas","cpuRenderingInvalidated","fillWithBackgroundColor","renderingPipelineFunctions","cpu","getImageDataCPU","getImageDataGPU","setColormapCPU","setColormapGPU","getCameraCPU","setCameraCPU","setVOICPU","setVOIGPU","setInterpolationTypeCPU","setInterpolationTypeGPU","setInvertColor","setInvertColorCPU","setInvertColorGPU","resetCameraCPU","resetCameraGPU","getCPUFallbackError","unsetColormap","unsetColormapCPU","unsetColormapGPU","_resetCPUFallbackElement","_resetGPUViewport","cameraFocalPointOnRender","initializeElementDisabledHandler","funcName","functions","setThicknessFromFocalPoint","setFreezeFocalPoint","elementDisabledHandler","debouncedTimeout","calibration","cpuImagePixelData","pixelCoord","buildMetadata","pixelRepresentation","bitsAllocated","bitsStored","highBit","photometricInterpretation","samplesPerPixel","imageIdScalingFactor","_addScalingToViewport","voiLUTFunctionEnum","_getValidVOILUTFunction","_getImagePlaneModule","calibrateIfNecessary","imagePixelModule","isUpdated","_calibrationEvent","setRotation","_getDefaultPTPrescaledVOIRange","_getVOIRangeForCurrentImage","_setPropertiesFromCache","rotationMatrix","canvasCenter","canvasCenterWorld","focalPointCanvas","focalPointPixel","prevFocalPointCanvas","prevFocalPointPixel","deltaPixel","viewportOrientation","cosA","sinA","newX","newY","correctShift","setFlipCPU","setRotationCPU","setRotationGPU","newVOILUTFunction","forceRecreateLUTFunction","roll","tfunc","wwToUse","wcToUse","imageActor","setUseLookupTableScalarRange","transferFunction","isSigmoidTFun","ptScaling","suvbwToSuvlbm","suvbwToSuvbsa","_getNumCompsFromPhotometricInterpretation","_getImageDataMetadata","rowCosineVec","colCosineVec","scanAxisNormal","xSpacing","ySpacing","xVoxels","yVoxels","_getCameraOrientation","imageDataDirection","_createVTKImageData","pixelArray","_imageData","setStack","_throwIfDestroyed","_setImageIdIndex","STACK_VIEWPORT_NEW_STACK","_checkVTKImageDataMatchesCornerstoneImage","isSameXSpacing","isSameYSpacing","_updateVTKImageDataFromCornerstoneImage","_updatePixelData","newPixelData","_loadAndDisplayImage","_loadAndDisplayImageCPU","_loadAndDisplayImageGPU","scalingParams","floatMinMax","intPixelData","rescaledPixel","STACK_NEW_IMAGE","IMAGE_LOAD_ERROR","PRE_STACK_NEW_IMAGE","csImgFrame","imageFrame","imgFrame","viewportSettingToUse","sameImageData","previousCameraProps","cameraProps","panCache","_restoreCameraProps","triggerCameraEvent","monochrome1","_getInitialVOIRange","triggerCalibrationEvent","_getVOIRangeFromWindowLevel","_getPTPreScaledRange","centerWorld","scroll","debounce","loop","currentTargetImageIdIndex","numberOfFrames","newTargetImageIdIndex","targetImageId","setImageIdIndex","eventData","newImageIdIndex","STACK_VIEWPORT_SCROLL","calibrateSpacing","prevScale","IMAGE_SPACING_CALIBRATED","method","fillCanvasWithBackgroundColor","actorProp","newImagePlaneModule","viewportTypeUsesCustomRenderingPipeline","viewportType","_needsRender","_animationFrameSet","_animationFrameHandle","renderFrameOfReference","viewportIdsWithSameFrameOfReferenceUID","_getViewportsAsArray","renderViewports","_renderFlaggedViewports","performVtkDrawCall","eventDetailArray","renderViewportUsingCustomOrVtkPipeline","offScreenCanvasContainer","_viewports","viewportInputEntry","viewportInput","_normalizeViewportInputEntry","viewportUsesCustomRenderingPipeline","addCustomViewport","enableVTKjsDrivenViewport","_resetViewport","_removeViewport","_clearAnimationFrame","setViewports","publicViewportInputEntries","viewportInputEntries","_normalizeViewportInputEntries","_reset","vtkDrivenViewportInputEntries","customRenderingViewportInputEntries","vpie","setVtkjsDrivenViewports","setCustomViewports","keepCamera","vtkDrivenViewports","customRenderingViewports","_resizeVTKViewports","_resizeUsingCustomResizeHandler","_setViewportsToBeRenderedNextFrame","AXIAL","normalizedViewportInputs","prevCamera","canvasesDrivenByVtkJs","offScreenCanvasWidth","offScreenCanvasHeight","_resizeOffScreenCanvas","_resize","rect","viewportsDrivenByVtkJs","xOffset","internalViewportEntry","addVtkjsDrivenViewport","offscreenCanvasProperties","tabIndex","sxStartDisplayCoords","syStartDisplayCoords","sxEndDisplayCoords","syEndDisplayCoords","_getViewportCoordsOnOffScreenCanvas","ELEMENT_ENABLED","vtkDrivenCanvases","vtkDrivenViewportInputEntry","_xOffset","_render","getRenderWindow","setDraw","offScreenCanvas","_renderViewportFromVtkCanvasToOnscreenCanvas","dWidth","dHeight","removeAttribute","clearRect","_downloadOffScreenCanvas","uri","download","href","click","_TEMPDownloadURI","_debugRender","dataURL","imageRetrievalPoolManager","DEFAULT_SETTINGS","RUNTIME_SETTINGS","OBJECT_SETTINGS_MAP","DICTIONARY","Settings","dictionary","seal","unset","endsWith","deleteCount","namespace","deleteAll","iterate","import","root","isPlainObject","dump","deepSet","assert","subject","getRuntimeSettings","getDefaultSettings","subfield","defaultSettings","settingObj","setting","runtimeSettings","getObjectSettings","settings","objectSettingsMap","WeakMap","extendRuntimeSettings","references","isValidKey","prefix","record","failCount","field","setAll","WeakSet","getPrototypeOf","subKey","subContext","subContextValue","domain","bimap","d0","d1","r0","r1","polymap","reverse","untransform","unknown","piecewise","rescale","clamper","rangeRound","formatDecimalParts","toExponential","coefficient","prefixExponent","specifier","exec","FormatSpecifier","align","zero","comma","trim","exponent","toLocaleString","toPrecision","formatRounded","toUpperCase","formatPrefix","prefixes","locale","grouping","thousands","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","String","percent","minus","nan","newFormat","formatTypes","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","formatTrim","padding","tickFormat","step","precisionPrefix","precisionRound","precisionFixed","linear","ticks","nice","prestep","maxIter","t0","t1","timeInterval","floori","offseti","interval","date","setTime","millisecond","durationSecond","durationMinute","durationHour","durationDay","durationWeek","durationMonth","durationYear","second","getMilliseconds","getUTCSeconds","getSeconds","getMinutes","setUTCSeconds","getUTCMinutes","getHours","setUTCMinutes","getUTCHours","setHours","setDate","getDate","getTimezoneOffset","setUTCHours","setUTCDate","getUTCDate","unixDay","timeWeekday","getDay","timeSunday","timeMonday","timeTuesday","timeWednesday","timeThursday","timeFriday","timeSaturday","utcWeekday","getUTCDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","setMonth","getMonth","getFullYear","setUTCMonth","getUTCMonth","getUTCFullYear","setFullYear","setUTCFullYear","ticker","year","month","week","day","hour","minute","tickIntervals","tickInterval","localDate","H","M","S","L","utcDate","UTC","newDate","utcParse","pads","numberRe","percentRe","requoteRe","pad","string","requote","formatRe","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","parseWeekNumberSunday","U","parseWeekNumberISO","V","parseWeekNumberMonday","W","parseFullYear","parseYear","parseZone","parseQuarter","q","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekdayNumberMonday","formatWeekNumberSunday","dISO","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","formatYear","formatYearISO","formatFullYear","formatFullYearISO","formatZone","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","getUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","UTCdISO","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCYearISO","formatUTCFullYear","formatUTCFullYearISO","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","definition","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","days","locale_shortWeekdays","shortDays","locale_months","months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","utcFormats","parses","parseSpecifier","newParse","utcFormat","formatLocale","isoSpecifier","toISOString","faceNormals","faceEdges","edgePoints","edgeAxes","faceAxes","ptv3","pt2v3","tmpv3","tmp2v3","xDir","yDir","invmat","applyTextStyle","strokeStyle","strokeColor","strokeSize","fontColor","font","fontStyle","fontSize","fontFamily","newCubeAxesActorHelper","tmPolyData","tmMapper","tmActor","parentProp","lastRedrawTime","lastRebuildTime","lastSize","lastTickBounds","addTexture","getTmTexture","setProperty","setParentProp","createPolyDataForOneLabel","text","cmat","get_tmAtlas","getTextPolyData","cellIdx","updateTexturePolyData","getCompositeProjectionMatrix","lastAspectRatio","numLabels","getTextValues","numTris","textIdx","axisIdx","textValues","getAxisTitlePixelOffset","getTickCounts","getTickLabelPixelOffset","tcoordDA","setTCoords","updateAPISpecificData","vtkCubeAxesActorHelper","boundsScaleFactor","dataBounds","INIT_BOUNDS","faceVisibilityAngle","gridLines","axisLabels","axisTitlePixelOffset","axisTextStyle","tickLabelPixelOffset","tickTextStyle","defaultValues","lastFacesToDraw","tickCounts","tmCanvas","tmContext","_tmAtlas","tmTexture","setInterpolate","gridMapper","polyData","gridActor","textPolyData","cameraModifiedSub","computeFacesToDraw","faceDot","drawit","faceAxis","otherAxis1","otherAxis2","updatePolyData","facesToDraw","edgesToDraw","numLines","numEdgesToDraw","lineIdx","_e","_f","faceIdx","aticks","_t","updateTextData","tickStrings","textPointCount","textPoints","axisCount","_e2","edgeIdx","edgeAxis","ptIdx1","atickStrings","facesChanged","boundsChanged","updateTextureAtlas","textBaseline","textAlign","maxWidth","totalHeight","metrics","measureText","actualBoundingBoxAscent","startingHeight","textStyle","_metrics","fillText","setCanvas","setTickTextStyle","tickStyle","setAxisTextStyle","axisStyle","_setProp","vtkCubeAxesActor","vtkCubeAxesActor$1","CubeAxesActorHelper","getTmActor","getGridActor","vtkOpenGLCubeAxesActor","ColorMode","GetArray","lookupTable","scalarVisibility","scalarRange","colorMode","arrayAccessMode","renderTime","colorByArrayName","transformCoordinate","viewSpecificProperties","customShaderAttributes","createDefaultLookupTable","getColorModeAsString","setColorModeToDefault","setColorMode","setColorModeToMapScalars","setColorModeToDirectScalars","getScalarModeAsString","setScalarModeToDefault","setScalarMode","setScalarModeToUsePointData","setScalarModeToUseCellData","setScalarModeToUsePointFieldData","setScalarModeToUseCellFieldData","setScalarModeToUseFieldData","getAbstractScalars","arrayId","cellFLag","cellFlag","DEFAULT","USE_POINT_DATA","BY_ID","getArrayByIndex","cd","fd","getFieldData","getLookupTable","colorBuildString","colorMapColors","fieldDataTupleId","vtkMapper2D","vtkMapper2D$1","vtkPolyData2DFS","vtkPolyData2DVS","DisplayLocation","BACKGROUND","FOREGROUND","openGLActor2D","getTransformCoordinate","getViews","setNumberOfPoints","getPoint","getComputedDoubleViewportValue","setPoint","haveCellSCalars","actorPos","getActualPositionCoordinate","tileViewport","visVP","winSize","xoff","yoff","bottom","getDisplayLocation","vtkOpenGLPolyDataMapper2D","VectorMode","defaultAutoLayout","helper","getLastSize","xAxisAdjust","yAxisAdjust","minAdjust","getAxisTextStyle","getTickTextStyle","getLastAspectRatio","textSizes","setTopTitle","boxSize","getBoxSizeByReference","setTickLabelPixelOffset","titleWidth","tickWidth","setAxisTitlePixelOffset","setBoxPosition","titleHeight","getTicks","recomputeBarSegments","defaultGenerateTicks","publicApi","getLastTickBounds","setTicks","setTickStrings","newScalarBarActorHelper","barMapper","setInterpolateScalarsBeforeMapping","barActor","barPosition","barSize","boxPosition","setCoordinateSystemToDisplay","generateTicks","scalarsToColors","getScalarsToColors","setLookupTable","getGenerateTicks","getAutomated","getAutoLayout","getBarPosition","getBarSize","getBoxPosition","getBoxSize","updatePolyDataForLabels","updatePolyDataForBarSegments","newTmAtlas","getAxisLabel","tickHeight","strings","getTickStrings","computeBarSize","vertical","segSize","topTitle","_tickWidth","_titleHeight","_model$renderable$get3","_model$renderable$get4","barSegments","startPos","barAxis","segSpace","pushSeg","title","getDrawNanAnnotation","getNanColor","getDrawBelowRangeSwatch","getUseBelowRangeColor","haveAbove","getUseAboveRangeColor","oldSegSize","getDrawAboveRangeSwatch","alignment","textSize","textAxes","offsetAxis","spacedAxis","tickOffsets","tickSeg","tickSegmentStart","tickSegmentSize","tickPos","_scalarsToColors$getU","_scalarsToColors$getU2","numberOfExtraColors","numQuads","getVectorMode","COMPONENT","getVectorComponent","scalarsDA","vtkScalarBarActorHelper","automated","autoLayout","axisLabel","scalarToColors","drawNanAnnotation","drawBelowRangeSwatch","drawAboveRangeSwatch","resetAutoLayoutToDefault","setAutoLayout","resetGenerateTicksToDefault","setGenerateTicks","vtkScalarBarActor","vtkScalarBarActor$1","scalarBarActorHelper","getBarActor","vtkOpenGLScalarBarActor","WORLD","vtkWebGPUActor","vtkWebGPUActor2D","vtkWebGPUCubeAxesActor","displayLocation","setDisplayLocationToBackground","setDisplayLocation","setDisplayLocationToForeground","setRepresentationToWireframe","setRepresentation","setRepresentationToSurface","setRepresentationToPoints","getRepresentationAsString","vtkProperty2D","vtkProperty2D$1","isEdges","is2D","textures","initiaLalues","_tmpMat3","_tmpMat4","WebGPUActor","forceZValue","coordinateSystem","useRendererMatrix","_ppty$getEdgeColorByR","_aColor","_aColor2","getRoughness","getBaseIOR","getMetallic","getNormalStrength","getEmission","getNormalTexture","_renderer$getEnvironm","lightingCode","_fDesc","_code","_actor$getProperty$ge","_actor$getProperty","_actor$getProperty$ge2","_actor$getProperty$ge4","_actor$getProperty3","_actor$getProperty$ge5","_actor$getProperty$ge6","_actor$getProperty4","_actor$getProperty$ge7","_actor$getProperty$ge8","_actor$getProperty5","_actor$getProperty$ge9","_actor$getProperty$ge10","_actor$getProperty6","_actor$getProperty$ge11","_actor$getProperty$ge12","_actor$getProperty7","_actor$getProperty$ge13","_actor$getProperty$ge3","_actor$getProperty2","checkDims","getDimensionality","usedTextures","getDiffuseTexture","getRoughnessTexture","getMetallicTexture","getAmbientOcclusionTexture","getEmissionTexture","replaceShaderSelect","getUsage","getHashFromUsage","getTopologyFromUsage","buildVertexInput","_buffRequest","_usesCellNormals","_buffRequest2","_buff","_buff2","haveColors","_buffRequest3","_buff3","_buff4","updateTextures","_model$renderable2","_actor$getProperty$ge14","_actor$getProperty8","_actor$getProperty$ge15","_actor$getProperty9","_actor$getProperty$ge16","_actor$getProperty10","_actor$getProperty$ge17","_actor$getProperty11","_actor$getProperty$ge18","_actor$getProperty12","_actor$getProperty$ge19","_actor$getProperty13","_renderer$getEnvironm2","newTextures","idata","pair","_pair","_pair2","_pair3","_pair4","_pair5","_pair6","_pair7","_pair8","srcTexture","textureName","addressMode","getEdgeClamp","setNumberOfVertices","getSizeInBytes","vtkWebGPUCellArrayMapper","vtkWebGPUCellArrayMapper$1","createCellArrayMapper","updateCellArrayMappers","prims","cellMappers","cellMapper","setCellArray","setCurrentInput","setCellOffset","_cellMapper","getCellOffset","vtkWebGPUPolyDataMapper","setIs2D","vtkWebGPUPolyDataMapper2D","vtkWebGPUScalarBarActor","viewDimension","dimension","textureHandle","tDetails","createFromTextureHandle","ttype","newSamp","setSampler","vtkWebGPUTextureView","vtkWebGPUTextureView$1","ready","mipLevel","GPUTextureUsage","TEXTURE_BINDING","mipLevelCount","assignFromHandle","writeImageData","copyExternalImageToTexture","flipY","premultipliedAlpha","jsImageData","bufferBytesPerRow","fixAll","inWidthInBytes","inArray","inWidth","outBytesPerElement","outWidthInBytes","outWidth","cmdEnc","mips","generateMipmaps","currentWidth","currentHeight","fix","copyBufferToTexture","bytesPerRow","rowsPerImage","submitCommandEncoder","_fix","resizeToMatch","getDepth","vtkWebGPUTexture","segmentIndex","_getSizeInBytes","getFlatPointsArray","ContourSet","contours","_createEachContour","contourDataArray","contourData","contour","_updateContourSetCentroid","getTotalNumberOfPoints","flatPointsArray","sumOfPoints","acc","centroid","closestPoint","_getDistance","getCentroid","getSegmentIndex","getContours","getNumberOfContours","getNumberOfPointsArray","getNumberOfPointsInAContour","getPointsInContour","contourIndex","pointA","pointB","createAndCacheGeometry","CONTOUR","contourSetData","contourSet","_createContourSet","geometryData","extractCellSizes","currentIdx","STATIC","empty","recompute","numberOfCells","cellSizes","getCellSizes","requestedNumTuples","oldNumTuples","getNumberOfTuples","newNumTuples","typedArray","getCell","cellLoc","insertNextCell","cellPointIds","insertNextTuples","vtkCellArray","vtkCellArray$1","fastComputeRange","computeRange","component","numberOfValues","nextJ","ensureRangeSize","rangeArray","ranges","createRangeHelper","sum","mean","getMaxNorm","normArray","maxNorm","tuple","getTuple","norm$1","rangeTuple","_model$size","TypeError","curNumTuples","oldValues","dataChange","newSize","getElementComponentSize","getComponent","tupleIdx","compIdx","setComponent","getValue","valueIdx","componentIndex","rangeIdx","rangeValue","setTuple","setTuples","tuples","insertTuple","insertTuples","insertNextTuple","tupleToFill","getTuples","fromId","toId","to","getTupleLocation","newClone","getState","jsonArchive","vtkClass","sortedObj","deepCopy","other","interpolateTuple","source1","source1Idx","source2","source2Idx","tuple1","tuple2","vtkDataArray","vtkDataArray$1","DataTypeByteSize","CHAR","SIGNED_CHAR","DefaultDataType","BELOW_RANGE_COLOR_INDEX","ABOVE_RANGE_COLOR_INDEX","NAN_COLOR_INDEX","hueRange","saturationRange","valueRange","alphaRange","nanColor","belowRangeColor","aboveRangeColor","useAboveRangeColor","useBelowRangeColor","buildTime","opaqueFlagBuildTime","insertTime","opaque","opaqueFlag","usingLogScale","getNumberOfAvailableColors","linearIndexLookup","linearLookup","indexedLookupFunction","getAnnotatedValueIndexInternal","lookupShiftAndScale","mapScalarsThroughTable","outFormat","inputOffset","lookupFunc","indexedLookup","trange","inIncr","outputV","inputV","cptr","_cptr","forceBuild","setTable","tptr","vtkLookupTable","vtkLookupTable$1","IDENTITY","IDENTITY_3X3","EPSILON","VTK_SMALL_NUMBER","randomSeedValue","VTK_MAX_ROTATIONS","notImplemented","swapRowsMatrix_nxn","swapColumnsMatrix_nxn","column1","column2","createArray","Pi","radiansFromDegrees","deg","degreesFromRadians","arrayMin","arrayMax","arrayRange","ceilLog2","factorial","nearestPowerOfTwo","xi","isPowerOfTwo","binomial","beginCombination","nextCombination","randomSeed","seed","global","getSeed","gaussian","subtract","multiplyScalar","vec","multiplyScalar2D","multiplyAccumulate","multiplyAccumulate2D","outer","out_3x3","cross","Zx","Zy","Zz","norm","den","perpendiculars","theta","z2","sintheta","costheta","projectVector","projection","bSquared","dot2D","projectVector2D","distance2BetweenPoints","angleBetweenVectors","crossVect","gaussianAmplitude","variance","distanceFromMean","exp","gaussianWeight","outer2D","out_2x2","norm2D","x2D","normalize2D","determinant2x2","LUFactor3x3","mat_3x3","index_3","maxI","largest","LUSolve3x3","x_3","linearSolve3x3","y_3","c1","c2","c3","d2","d3","e3","f1","f2","f3","det","v3","multiply3x3_vect3","in_3","out_3","multiply3x3_mat3","a_3x3","b_3x3","copyA","copyB","multiplyMatrix","rowA","colA","rowB","colB","out_rowXcol","transpose3x3","in_3x3","outT_3x3","invert3x3","outI_3x3","determinant3x3","areEquals","eps","areMatricesEqual","identity3x3","isIdentity","isIdentity3x3","quaternionToMatrix3x3","quat_4","wx","wy","wz","zz","xy","xz","yz","rr","roundNumber","digits","sig","roundVector","jacobiN","iq","ip","numPos","tresh","tau","vtkROTATE","aa","ii","jj","ceil_half_n","matrix3x3ToQuaternion","eigenvectors","multiplyQuaternion","quat_1","quat_2","quat_out","xw","yw","yx","zw","zx","zy","orthogonalize3x3","x3","y3","quat","diagonalize3x3","w_3","v_3x3","maxVal","vectTmp1","vectTmp2","eigenValTmp","_eigenValTmp","singularValueDecomposition3x3","u_3x3","vT_3x3","luFactorLinearSystem","temp1","luSolveLinearSystem","solveLinearSystem","invertMatrix","AI","column","tmp1Size","tmp2Size","estimateMatrixCondition","jacobi","solveHomogeneousLeastSquares","numberOfSamples","xt","xOrder","XXt","eigenvals","eigenvecs","solveLeastSquares","yt","yOrder","checkHomogeneous","hmt","homogenFlags","allHomogeneous","homogRC","someHomogeneous","XXtI","XYt","successFlag","hex2float","hexStr","outFloatArray","substr","rgb2hsv","_rgb","onesixth","cmax","cmin","hsv2rgb","_hsv","onethird","twothird","fivesixth","lab2xyz","lab","xyz","_lab","var_Y","var_X","var_Z","xyz2lab","_xyz","xyz2rgb","_xyz2","rgb2xyz","_rgb2","rgb2lab","lab2rgb","uninitializeBounds","areBoundsInitialized","computeBoundsFromPoints","point1","point2","clampValue","clampVector","minVector","maxVector","clampAndNormalizeValue","getScalarTypeFittingRange","getAdjustedScalarRange","extentIsWithinOtherExtent","extent1","extent2","boundsIsWithinOtherBounds","bounds1_6","bounds2_6","delta_3","pointIsWithinBounds","point_3","bounds_6","solve3PointCircle","v21","v32","v13","v12","v23","v31","norm12","norm23","norm13","crossv21v32","normCross","normCross22","beta","inf","negInf","isInf","isNan","createUninitializedBounds","getMajorAxisIndex","axisIndex","floatToHex2","integer","floatRGB2HexCode","rgbArray","floatToChar","float2CssRGBA","vtkMath","NoOp","useDegree","angleConv","originDirection","targetDirection","dst","transf","cosAlpha","acos","sz","mat4x4","mat3x3","nbIterations","vtkMatrixBuilder","buildFromRadian","INVALID_BOUNDS","nbPoints","setNumberOfComponents","insertNextPoint","_xRange","_yRange","zRange","xRange","yRange","vtkPoints","vtkPoints$1","ScalarMappingTarget","intColorToUChar","floatColorToUChar","vectorComponent","vectorSize","vectorMode","mappingRange","annotationArray","annotatedValueMap","setVectorModeToMagnitude","setVectorMode","MAGNITUDE","setVectorModeToComponent","setVectorModeToRGBColors","RGBCOLORS","setAnnotations","annotations","annotation","updateAnnotatedValueMap","setAnnotation","checkForAnnotatedValue","getNumberOfAnnotatedValues","getAnnotatedValue","getAnnotation","getAnnotatedValueIndex","removeAnnotation","needToRemove","resetAnnotations","getAnnotationColor","getIndexedColor","na","componentIn","newColors","DIRECT_SCALARS","convertToRGBA","newscalars","mapVectorsThroughTable","mapVectorsToMagnitude","compsToUse","outputFormat","vectorComponentIn","vectorSizeIn","inComponents","getVectorSize","magValues","luminanceToRGBA","convtFun","newValues","l","luminanceAlphaToRGBA","rGBToRGBA","rGBAToRGBA","numTuples","areScalarsOpaque","vtkScalarsToColors","vtkScalarsToColors$1","_equals","_isValid","_setBounds","otherBounds","_addPoint","_bounds","_addPoints","_addBounds","_bounds2","_xMin","_xMax","_yMin","_yMax","_zMin","_zMax","_setMinPoint","_bounds3","_setMaxPoint","_bounds4","_inflate","_scale","_getCenter","_getLength","_getLengths","_getXRange","_getYRange","_getZRange","_getMaxLength","_getDiagonalLength","_getMinPoint","_getMaxPoint","oppositeSign","_computeCornerPoints","_transformBounds","_computeScale","scale3","_computeLocalBounds","du","dv","dw","_intersectBox","coord","inside","quadrant","whichPlane","maxT","candidatePlane","_intersectPlane","firstOne","evaluate","_intersect","bBounds","_intersects","_containsPoint","_cutWithPlane","ti","BoundingBox","refBounds","vtkBoundingBox","equals","isValid","setBounds","addPoints","addBounds","setMinPoint","setMaxPoint","inflate","scaleAboutCenter","getCenter","getLengths","getMaxLength","getDiagonalLength","getMinPoint","getMaxPoint","getXRange","getYRange","getZRange","getCorners","computeCornerPoints","computeLocalBounds","transformBounds","computeScale3","cutWithPlane","intersectBox","intersectPlane","intersects","containsPoint","arrays","copyFieldFlags","doCopyAllOn","doCopyAllOff","superGetState","item","vtk","initializeFields","copyAllOn","clearFieldFlags","copyStructure","getCopyFieldFlags","getNumberOfArrays","getNumberOfActiveArrays","_publicAPI$getArrayWi","getArrayWithIndex","removeAllArrays","removeArray","removeArrayByIndex","arrayIdx","getArrays","arraySpec","getArrayName","getFlag","passData","copyFlag","destArr","_tId","getAttributes","attrType","ncomps","tId","interpolateData","fromId1","fromId2","_tId2","copyFieldOn","copyFieldOff","copyAllOff","arrNew","copyFlags","vtkFieldData","vtkFieldData$1","AttributeTypes","AttributeCopyOperations","activeScalars","activeVectors","activeTensors","activeNormals","activeTCoords","activeGlobalIds","activePedigreeIds","attrTypes","cleanAttributeType","attType","cleanAttType","ee","checkNumberOfComponents","uncleanAttType","currentAttribute","setActiveAttributeByName","setActiveAttributeByIndex","getActiveAttribute","activeVal","da","copyAttributeFlags","PASSDATA","initializeAttributeCopyFlags","op","attCopyOp","ty","COPYTUPLE","INTERPOLATE","dataArrays","ref","superShallowCopy","debug","vtkDataSetAttributes","vtkDataSetAttributes$1","FieldDataTypes","DATA_OBJECT_FIELD","COORDINATE","POINT_DATA","POINT_FIELD_DATA","CELL_FIELD_DATA","VERTEX_FIELD_DATA","EDGE_FIELD_DATA","ROW_DATA","FIELD_ASSOCIATION_NONE","FIELD_ASSOCIATION_POINTS_THEN_CELLS","FIELD_ASSOCIATION_VERTICES","FIELD_ASSOCIATION_EDGES","FIELD_ASSOCIATION_ROWS","NUMBER_OF_ASSOCIATIONS","DATASET_FIELDS","fieldName","vtkDataSet","vtkDataSet$1","DesiredOutputPrecision","SINGLE","ALLCOPY","AttributeLimitTypes","MAX","EXACT","NOLIMIT","SCALARS","VECTORS","NORMALS","TCOORDS","TENSORS","EDGEFLAG","NUM_ATTRIBUTES","CellGhostTypes","DUPLICATECELL","HIGHCONNECTIVITYCELL","LOWCONNECTIVITYCELL","REFINEDCELL","EXTERIORCELL","HIDDENCELL","PointGhostTypes","DUPLICATEPOINT","HIDDENPOINT","ghostArrayName","StructuredType","UNCHANGED","SINGLE_POINT","X_LINE","Y_LINE","Z_LINE","XY_PLANE","YZ_PLANE","XZ_PLANE","XYZ_GRID","EMPTY","vtkStructuredData","getDataDescriptionFromExtent","inExt","dataDim","dataDescription","setExtent","inExtent","extentArray","changeDetected","nCells","computeTransforms","ain","aout","worldToIndexVec3","indexToWorldBounds","bin","bout","worldToIndexBounds","computeHistogram","worldBounds","voxelFunc","yStride","zStride","maximum","sumOfSquares","isum","inum","pixel","average","sigma","computeIncrements","increments","incr","computeOffsetIndex","getOffsetIndexFromWorld","getScalarValueFromWorld","offsetIndex","vtkImageData$1","clamping","allowDuplicateScalars","nodes","prevValue","functionType","getDataPointer","function","getFirstNonZeroValue","allZero","midpoint","sharpness","oldX","sortAndUpdateRange","removePoint","node","setNodes","updateRange","oldRange","retVal","modifiedInvoked","adjustRange","functionRange","estimateMinNumberOfSamples","findMinimumXDistance","currentDist","xStart","xEnd","numNodes","tidx","ss","sss","h1","h2","h3","h4","vtkPiecewiseFunction","vtkPiecewiseFunction$1","PLANE_TOLERANCE","COINCIDE","DISJOINT","distanceToPlane","projectPoint","xproj","xo","vproj","n2","generalizedProjectPoint","outObj","betweenPoints","p21","p1Origin","intersectWithPlane","plane1Origin","plane1Normal","plane2Origin","plane2Normal","l0","l1","cross$1","maxc","absCross","iP","evaluateGradient","planeOrigin","vtkPlane","vtkPlane$1","pointsIds","pointIdsList","triangleData","pointId","pointOffset","trianglePointOffset","getLength2","getParametricDistance","pcoords","pDist","pDistMax","getCellDimension","tol","subId","evaluatePosition","dist2","weights","vtkCell","vtkCell$1","maxId","buildLinks","numCells","linkLoc","getCellPoints","cellPointId","incrementLinkCount","allocateLinks","_cellId","insertCellReference","_cellId2","getPointsIds","_loop2","_cellId3","numLinks","ncells","getLink","getNcells","getCells","insertNextCellReference","deletePoint","removeCellReference","addCellReference","resizeCellList","squeeze","vtkCellLinks","vtkCellLinks$1","CellType","VTK_EMPTY_CELL","VTK_VERTEX","VTK_POLY_VERTEX","VTK_LINE","VTK_POLY_LINE","VTK_TRIANGLE","VTK_TRIANGLE_STRIP","VTK_POLYGON","VTK_PIXEL","VTK_QUAD","VTK_TETRA","VTK_VOXEL","VTK_HEXAHEDRON","VTK_WEDGE","VTK_PYRAMID","VTK_PENTAGONAL_PRISM","VTK_HEXAGONAL_PRISM","VTK_QUADRATIC_EDGE","VTK_QUADRATIC_TRIANGLE","VTK_QUADRATIC_QUAD","VTK_QUADRATIC_POLYGON","VTK_QUADRATIC_TETRA","VTK_QUADRATIC_HEXAHEDRON","VTK_QUADRATIC_WEDGE","VTK_QUADRATIC_PYRAMID","VTK_BIQUADRATIC_QUAD","VTK_TRIQUADRATIC_HEXAHEDRON","VTK_QUADRATIC_LINEAR_QUAD","VTK_QUADRATIC_LINEAR_WEDGE","VTK_BIQUADRATIC_QUADRATIC_WEDGE","VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON","VTK_BIQUADRATIC_TRIANGLE","VTK_CUBIC_LINE","VTK_CONVEX_POINT_SET","VTK_POLYHEDRON","VTK_PARAMETRIC_CURVE","VTK_PARAMETRIC_SURFACE","VTK_PARAMETRIC_TRI_SURFACE","VTK_PARAMETRIC_QUAD_SURFACE","VTK_PARAMETRIC_TETRA_REGION","VTK_PARAMETRIC_HEX_REGION","VTK_HIGHER_ORDER_EDGE","VTK_HIGHER_ORDER_TRIANGLE","VTK_HIGHER_ORDER_QUAD","VTK_HIGHER_ORDER_POLYGON","VTK_HIGHER_ORDER_TETRAHEDRON","VTK_HIGHER_ORDER_WEDGE","VTK_HIGHER_ORDER_PYRAMID","VTK_HIGHER_ORDER_HEXAHEDRON","VTK_LAGRANGE_CURVE","VTK_LAGRANGE_TRIANGLE","VTK_LAGRANGE_QUADRILATERAL","VTK_LAGRANGE_TETRAHEDRON","VTK_LAGRANGE_HEXAHEDRON","VTK_LAGRANGE_WEDGE","VTK_LAGRANGE_PYRAMID","VTK_NUMBER_OF_CELL_TYPES","CellTypesStrings","getClassNameFromTypeId","typeId","getTypeIdFromClassName","cellTypeString","isLinear","hasSubCells","cellType","typeArray","locationArray","insertCell","setCellTypes","cellTypes","cellLocations","getCellLocation","deleteCell","getNumberOfTypes","isType","numTypes","getCellType","insertNextType","getExtend","getTypeArray","getLocationArray","getMaxId","vtkCellTypes","vtkCellTypes$1","IntersectionState","NO_INTERSECTION","YES_INTERSECTION","ON_LINE","distanceToLine","MIN_VALUE","denom","b1a1","minDist","l2","uv1","uv2","projXYZ","outDistance","evaluateLocation","vtkLine","vtkLine$1","vtkPointSet","vtkPointSet$1","computeNormalDirection","ax","ay","az","bx","by","bz","computeNormal","intersectWithTriangle","q1","q2","r2","coplanar","pt1","pt2","surfaceId","n1","s1","s2","dist1","pts1","pts2","n1n2","tt1","tt2","index1","index2","t2","ts1","ts2","id1","id2","val1","t12","t22","t11","t21","tol2","pt3","evaluation","dist2Pt1Pt2","dist2Pt2Pt3","dist2Pt3Pt1","intersectLine","pt3Pt1","pt3Pt2","pt3X","fabsn","dist2Point","dist2Line1","dist2Line2","rhs","indices","closestPoint1","closestPoint2","maxComponent","lineDistance","_lineDistance","_lineDistance2","u3","pc","vtkTriangle","_CELL_FACTORY","vtkTriangle$1","POLYDATA_FIELDS","CELL_FACTORY","letter","buildCells","nVerts","getNumberOfVerts","nLines","getNumberOfLines","nPolys","getNumberOfPolys","nStrips","getNumberOfStrips","pTypes","locs","pLocs","nextCellPts","verts","numCellPts","_nextCellPts","_nextCellPts2","_nextCellPts3","initialSize","links","getPointCells","getCellEdgeNeighbors","link1","link2","cellHint","cellInfo","vtkPolyData","vtkPolyData$1","xLength","yLength","zLength","rotations","pointType","generate3DTextureCoordinates","boundsArray","_vtkMatrixBuilder$bui","normalArray","textureCoords","tc","_k2","rotateX","rotateY","rotateZ","numberOfPolys","polyIndex","vtkCubeSource","vtkCubeSource$1","clippingPlanes","vtkAbstractMapper$1","removeAllClippingPlanes","removeClippingPlane","clippingPlane","setClippingPlanes","planes","nbPlanes","propMatrix","hnormal","v4","vtkAbstractMapper","vtkAbstractMapper3D$1","vtkAbstractMapper3D","isTranslucent","backfaceProperty","pixelOffsets","vtkActor$1","directionOfProjection","screenBottomLeft","screenBottomRight","screenTopRight","freezeFocalPoint","viewMatrix","cameraLightTransform","physicalViewUp","physicalViewNorth","dopbasis","upbasis","tmpMatrix2","tmpvec2","tmpvec3","rotateMatrix","computeViewPlaneNormal","orthogonalizeViewUp","vt","computeDistance","setDistance","dolly","amount","up","viewUpVec4","viewDir","azimuth","yaw","elevation","pitch","applyTransform","transformMat4","vuOld","posNew","fpNew","vuNew","getThickness","setThickness","setRoll","getRoll","setObliqueAngles","getOrientation","getOrientationWXYZ","getFrustumPlanes","getCameraLightTransformMatrix","computeCameraLightTransform","sourceCamera","physicalOrientationToWorldDirection","ori","oriq","coriq","qdir","getPhysicalToWorldMatrix","getWorldToPhysicalMatrix","physVRight","computeViewParametersFromViewMatrix","vmat","oldDist","setViewMatrix","vMat","pMat","setDeviceAngles","rotmat","vup","setOrientationWXYZ","degrees","quatMat","newdop","newvup","computeClippingRange","vtkCamera$1","HSV","LAB","DIVERGING","LOG10","vtkColorTransferFunctionLabToMsh","msh","vtkColorTransferFunctionAdjustHue","unsatM","hueSpin","vtkColorTransferFunctionInterpolateDiverging","rgb1","rgb2","lab1","lab2","msh1","msh2","localS","adiff","vtkColorTransferFunctionAngleDiff","Mmid","mshTmp","labTmp","vtkColorTransferFunctionMshToLab","colorSpace","hSVWrap","tableSize","discretize","addRGBPointLong","addHSVPoint","addHSVPointLong","before","after","movePoint","addRGBSegment","g1","g2","addHSVSegment","hsv1","hsv2","nodeVal","getRedValue","getGreenValue","getBlueValue","xStart_","xEnd_","lastR","lastG","lastB","tmpVec","logStart","logEnd","logX","deltaRange","xn","discretizeIndex","hsvTmp","_hsv2","_hsvTmp","_lab2","_labTmp","_j3","getUint8Table","withAlpha","tableWithAlpha","nbChannels","buildFunctionFromTable","inc","nodeValue","fillFromDataPointer","nb","ptr","originalRange","mapDataIndexed","mapData","colorMap","oldColorSpace","isModified","oldNanColor","oldNodes","callModified","vtkColorTransferFunction","vtkColorTransferFunction$1","populateSelectionSettings","interpolateScalarsBeforeMapping","colorCoordinates","colorTextureMap","forceCompileOnly","useInvertibleColors","invertibleScalars","setForceCompileOnly","canUseTextureMapForColoring","mapScalarsToTexture","scalarToTextureCoordinate","scalarValue","invRangeWidth","texCoordS","texCoordT","createColorTextureCoordinates","numScalars","tableRange","tableNumberOfColors","useLogScale","scalarTexelWidth","paddedRange","scalarIdx","magnitude","applyLogScale","outputs","_scalarIdx","inputValue","_outputs","getLogRange","origAlpha","setAlpha","scalarComponent","getIndexedLookup","gasResult","clearColorArrays","triangles","acquireInvertibleLookupTable","valueToColor","colorToValue","useInvertibleColorFor","clearInvertibleColor","rawLowData","rawHighData","idMap","outValue","lowData","_inValue","_outValue","vtkMapper","vtkMapper$1","resolveCoincidentTopologyPolygonOffsetFaces","resolveCoincidentTopology","RESOLVE_COINCIDENT_TOPOLOGY_MODE","setResolveCoincidentTopology","getResolveCoincidentTopologyAsString","getResolveCoincidentTopologyPolygonOffsetFaces","setResolveCoincidentTopologyPolygonOffsetFaces","setResolveCoincidentTopologyToDefault","setResolveCoincidentTopologyToOff","setResolveCoincidentTopologyToPolygonOffset","addCoincidentTopologyMethods","nameList","CATEGORIES","Polygon","Line","Point","topologyOffset","methodName","globalValue","getResolveCoincidentTopologyPolygonOffsetParameters","localValue","getRelativeCoincidentTopologyPolygonOffsetParameters","getResolveCoincidentTopologyLineOffsetParameters","getRelativeCoincidentTopologyLineOffsetParameters","getResolveCoincidentTopologyPointOffsetParameters","getRelativeCoincidentTopologyPointOffsetParameters","MAP_SCALARS","BY_NAME","allocatedRenderTime","dragable","estimatedRenderTime","paths","pickable","renderTimeMultiplier","savedEstimatedRenderTime","useBounds","pixeloffsets","getNestedProps","getActors2D","pick","hasKey","_parentProp","getNestedDragable","setEstimatedRenderTime","restoreEstimatedRenderTime","addEstimatedRenderTime","setAllocatedRenderTime","hasTexture","removeTexture","newTextureList","removeAllTextures","setCoordinateSystemToWorld","setCoordinateSystem","vtkProp","vtkProp$1","userMatrix","userMatrixMTime","cachedProp3D","matrixMTime","addPosition","deltaXYZ","oaxis","rotateWXYZ","setUserMatrix","getUserMatrix","vtkProp3D","vtkProp3D$1","Interpolation","edgeColor","metallic","roughness","normalStrength","emission","baseIOR","GOURAUD","edgeVisibility","lighting","shading","materialName","setDiffuseColor","setAmbientColor","setSpecularColor","computeCompositeColor","addShaderVariable","setInterpolationToFlat","setInterpolation","setInterpolationToGouraud","setInterpolationToPhong","PHONG","getInterpolationAsString","vtkProperty","vtkProperty$1","PropertyConst","switch","positional","coneAngle","coneFalloff","attenuationValues","transformMatrix","lightType","shadowAttenuation","directionMTime","getTransformedFocalPoint","directionVector","setDirectionAngle","elevationRadians","azimuthRadians","setPositional","setLightTypeToHeadLight","setLightType","setLightTypeToCameraLight","setLightTypeToSceneLight","setTransformMatrix","lightTypeIsCameraLight","vtkLight","vtkLight$1","LIGHT_TYPES","vtkViewport","gatherProps","allProps","hasViewProp","addViewProp","newPropList","allPropsArray","addActor2D","removeActor2D","actors2D","displayToView","viewToDisplay","nvp","normalizedDisplayToNormalizedViewport","normalizedViewportToProjection","projectionToNormalizedViewport","normalizedViewportToNormalizedDisplay","PickPropFrom","background2","gradientBackground","pixelAspect","vtkViewport$1","pickedProp","allBounds","timeFactor","automaticLightCreation","twoSidedLighting","lastRenderTimeInSeconds","volumes","numberOfPropsRendered","propArray","pathArray","layer","preserveColorBuffer","preserveDepthBuffer","interactive","nearClippingPlaneTolerance","clippingRangeExpansion","erase","useShadows","useDepthPeeling","occlusionRatio","maximumNumberOfPeels","delegate","texturedBackground","backgroundTexture","environmentTexture","environmentTextureDiffuseStrength","environmentTextureSpecularStrength","useEnvironmentTextureAsBackground","COMPUTE_VISIBLE_PROP_BOUNDS_EVENT","RESET_CAMERA_CLIPPING_RANGE_EVENT","updateCamera","getActiveCameraAndResetIfCreated","updateLightsGeometryToFollowCamera","setPositionFrom","setFocalPointFrom","getFocalPointByReference","updateLightGeometry","allocateTime","updateGeometry","_renderWindow","setLayer","setPreserveColorBuffer","makeCamera","removeActor","removeVolume","removeAllVolumes","hasLight","addLight","removeLight","removeAllLights","setLightCollection","makeLight","_createdLight","normalizedDisplayToWorld","vpd","worldToNormalizedDisplay","nothingVisible","getUseBounds","boundsToUse","minGap","_vtkWindow","visibleActorCount","visibleVolumeCount","vtkRenderer$1","imageLoaded","repeat","edgeClamp","setJsImageData","complete","getInputAsJsImageData","vtkTexture","vtkTexture$1","level","kernel","hs","maps","oldData","vs","sample","dataCopy","_p","kw","lineShift","_p2","_kw","_value","_construct","Parent","Class","isNativeReflectConstruct","construct","_get","desc","_wrapNativeSuper","_cache","Wrapper","writable","configurable","_createSuper","Derived","hasNativeReflectConstruct","sham","valueOf","_isNativeReflectConstruct","Super","NewTarget","ClassHierarchy","_Array","_super","globalMTime","fakeConsole","noOp","loggerFunctions","ERROR_ONCE_MAP","TYPED_ARRAYS","BigInt64Array","BigUint64Array","_unused","newTypedArray","newTypedArrayFrom","capitalize","_capitalize","safeArrays","getStateArrayMapFunc","setImmediateVTK","callbacks","hierarchy","otherMTime","on","noWarning","noFunction","list","subset","otherModel","keyList","keyIdx","toJSON","objectGetterMap","fieldNames","getter","objectSetterMap","enum","onChanged","_model$onChanged","previousValue","_model$onChanged2","findSetter","_model$onChanged3","fields","setGet","defaultVal","_len4","_key4","needCopy","_model$onChanged4","otherArray","setGetArray","moveToProtected","algo","numberOfInputs","port","inputData","inputConnection","outputPort","msg","getPortToFill","portToFill","shouldUpdate","inputArrayToProcess","localMTime","minOutputMTime","_model$inputConnectio","_publicAPI$getInputDa","addInputData","addInputConnection","getInputConnection","outputPortAccess","ins","_count","getNumberOfOutputPorts","getInputArrayToProcess","inputPort","arrayDesc","ds","setInputArrayToProcess","attributeType","EVENT_ABORT","register","chain","_len5","_key5","_len6","_key6","isVtkObject","keystore","initialKeystore","setKey","getKey","getAllKeys","deleteKey","clearKeystore","nextProxyId","ROOT_GROUP_NAME","macro","wait","timeout","_this","debounced","_len7","_key7","callNow","previousDelete","curCallbackID","callbackID","_arguments","currentCallbacks","_currentCallbacks$ind","_ret","cb1","cb2","formatBytesToProperUnit","chunkSize","units","currentUnit","formatNumbersWithThousandSeparator","sections","getCurrentGlobalMTime","measurePromiseExecution","wheelEvent","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","pixelX","pixelY","proxy","proxyId","ui","propertyMap","groupChildrenNames","registerProperties","descriptionList","currentGroupName","childrenNames","groupName","propertyNames","listProxyProperties","updateUI","updateProxyProperty","propertyName","propUI","proxyManager","setActiveMethod","getProxyGroup","propertyLinkSubscribers","registerPropertyLinkForGC","otherLink","gcPropertyLinks","subscribers","unbind","propertyLinkMap","getPropertyLink","persistent","updateInProgress","needUpdate","sourceLink","newValue","shallowEquals","linkToUpdate","indexToDelete","linkHandler","updateMe","listPropertyNames","getPropertyByName","getPropertyDomainByName","getProxySection","proxyGroup","_model$links$i","updateOnBind","sLink","proxyPropertyMapping","subscriptions","_map$propertyName","modelKey","_map$propertyName$mod","methodSrc","methodDst","proxyPropertyState","defaults","modelKeys","applyState","setLoggerFunction","throttle","delay","isThrottled","argsToUse","wrapper","_len8","_key8","traverseInstanceTree","extractFunction","accumulator","visitedInstances","modelObj","subObj","uncapitalize","vtkInfoMacro","vtkLogMacro","vtkGlobal","factoryMapping","vtkObject","newInst","vtkClassName","exports","implementation","getPolyfill","shim","polyfill","getGlobal","define","supportsDescriptors","descriptor","globalThis","hex_chr","md5cycle","md5blk","md5blks","md5blk_array","md51","tail","lo","hi","md51_array","rhex","hex","toUtf8","unescape","encodeURIComponent","utf8Str2ArrayBuffer","returnUInt8Array","arrayBuffer2Utf8Str","fromCharCode","concatenateArrayBuffers","hexToBinaryString","bytes","SparkMD5","targetArray","sourceArray","append","appendBinary","contents","_hash","raw","_finish","setState","hashBinary","content","factory","_typeof","_regeneratorRuntime","__esModule","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","Context","makeInvokeMethod","tryCatch","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","_invoke","AsyncIterator","PromiseImpl","invoke","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","doneResult","delegateResult","maybeInvokeDelegate","_sent","dispatchException","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","mark","__proto__","awrap","iter","skipTempReset","rootRecord","rval","exception","caught","hasCatch","hasFinally","finallyEntry","thrown","delegateYield","runtime","regeneratorRuntime","accidentalStrictMode","descending","bisector","compare1","compare2","ascendingBisect","bisectRight","Blur2","blurf","blur","T","rx","ry","blurx","blury","blurh","blurv","radius0","bluri","s0","e10","e5","tickSpec","power","tickStep","zip","valueof","transpose","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","formatHex","color_formatRgb","formatRgb","rgbn","Rgb","hsla","rgbConvert","rgb_formatHex","rgb_formatRgb","clampa","clampi","Hsl","hslConvert","hsl","clamph","clampt","hsl2rgb","channels","displayable","formatHex8","formatHsl","radians","Xn","Yn","Zn","t3","labConvert","Lab","Hcl","hcl2lab","rgb2lrgb","lrgb2rgb","hclConvert","hcl","E","ED","EB","BC_DA","Cubehelix","bl","cubehelixConvert","basis","v0","cosh","sinh","constant","nogamma","exponential","rgbGamma","rgbSpline","spline","genericArray","reA","reB","am","bm","bs","bi","lastIndex","one","isView","DataView","svgNode","translateX","translateY","skewX","atan","interpolateTransform","pxComma","pxParen","degParen","xa","ya","xb","yb","DOMMatrix","WebKitCSSMatrix","decompose","createElementNS","baseVal","consolidate","zoomRho","rho","rho2","rho4","ux0","uy0","w0","ux1","uy1","coshr0","SQRT2","_1","_2","cubehelix","cubehelixGamma","interpolator","samples"],"sourceRoot":""}