@ohif/ui-next 3.13.0-beta.127 → 3.13.0-beta.128
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ohif-ui-next.umd.js +1 -1
- package/package.json +1 -1
package/dist/ohif-ui-next.umd.js
CHANGED
|
@@ -34,7 +34,7 @@ For more information, see https://radix-ui.com/primitives/docs/components/${t.do
|
|
|
34
34
|
0 0 ${a[2]*l} 0 ${s} \
|
|
35
35
|
0 0 0 1 0" />\
|
|
36
36
|
</filter>\
|
|
37
|
-
</svg>#colour')`}getRenderingEngine(){return jn(this.renderingEngineId)}getRenderer(){let e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow?.getRenderer(this.id)}render(){this.getRenderingEngine().renderViewport(this.id)}setOptions(e,t=!1){this.options=$e(e),this.options?.displayArea&&this.setDisplayArea(this.options?.displayArea),t&&this.render()}reset(e=!1){this.options=$e(this.defaultOptions),e&&this.render()}getSliceViewInfo(){throw Error("Method not implemented.")}flip({flipHorizontal:e,flipVertical:t}){let r=this.getDefaultImageData();if(!r)return;let n=this.getCamera(),{viewPlaneNormal:a,viewUp:i,focalPoint:o,position:l}=n,s=LJ.vec3.cross(LJ.vec3.create(),a,i),d=LJ.vec3.copy(LJ.vec3.create(),i),u=LJ.vec3.negate(LJ.vec3.create(),a),c=LJ.vec3.distance(l,o),h=$i(r.getDimensions(),r.getDirection(),a),p=[h[0],h[1],h[2]],m=r.indexToWorld(p,LJ.vec3.create()),f=this._getFocalPointForResetCamera(m,n,{resetPan:!0,resetToCenter:!1}),g=LJ.vec3.subtract(LJ.vec3.create(),o,f),y=LJ.vec3.length(g),v=e=>{let t=LJ.vec3.scale(LJ.vec3.create(),e,2*LJ.vec3.dot(g,e));return LJ.vec3.subtract(t,t,g),LJ.vec3.normalize(t,t),t};if(e){let e=v(d),t=LJ.vec3.scaleAndAdd(LJ.vec3.create(),f,e,y),r=LJ.vec3.scaleAndAdd(LJ.vec3.create(),t,u,c);this.setCamera({viewPlaneNormal:u,position:r,focalPoint:t}),this.flipHorizontal=!this.flipHorizontal}if(t){d=LJ.vec3.negate(d,i);let e=v(s),t=LJ.vec3.scaleAndAdd(LJ.vec3.create(),f,e,y),r=LJ.vec3.scaleAndAdd(LJ.vec3.create(),t,u,c);this.setCamera({focalPoint:t,viewPlaneNormal:u,viewUp:d,position:r}),this.flipVertical=!this.flipVertical}this.render()}getDefaultImageData(){let e=this.getDefaultActor();if(e&&qE(e))return e.actor.getMapper().getInputData()}getDefaultActor(){return this.getActors()[0]}getActors(){return Array.from(this._actors.values())}getActorUIDs(){return Array.from(this._actors.keys())}getActor(e){return this._actors.get(e)}getImageActor(e){let t=this.getActors(),r=t[0];return(e&&(r=t.find(t=>t.referencedId===e)),r&&qE(r))?r.actor:null}getActorUIDByIndex(e){let t=this.getActors()[e];if(t)return t.uid}getActorByIndex(e){return this.getActors()[e]}setActors(e){let t=this.getActors();this.removeAllActors(),this.addActors(e,{resetCamera:!0}),jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:e,currentActors:e})}_removeActor(e){let t=this.getActor(e);return t?(this.getRenderer().removeActor(t.actor),this._actors.delete(e),t):void console.warn(`Actor ${e} does not exist in ${this.id}, can't remove`)}removeActors(e){let t=[];e.forEach(e=>{let r=this._removeActor(e);r&&t.push(r)});let r=this.getActors();jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:[],currentActors:r})}addActors(e,t={}){let{resetCamera:r=!1}=t,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn("Viewport::addActors::Rendering engine has not been initialized or has been destroyed");if(e.forEach(e=>{this.addActor(e)}),r)this.resetCamera();else{let e=this.getViewPresentation(),t=this.getViewReference();this.resetCamera(),this.setViewReference(t),this.setViewPresentation(e)}jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:e,currentActors:this.getActors()})}addActor(e){let{uid:t,actor:r}=e,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn(`Cannot add actor UID of ${t} Rendering Engine has been destroyed`);if(!t||!r)throw Error("Actors should have uid and vtk Actor properties");if(this.getActor(t))return void console.warn(`Actor ${t} already exists for this viewport`);let a=this.getRenderer();a?.addActor(r),this._actors.set(t,Object.assign({},e)),this.updateCameraClippingPlanesAndRange(),jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:[e],currentActors:this.getActors()})}removeAllActors(){let e=this.getActors();this.getRenderer()?.removeAllViewProps(),this._actors=new Map,jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:e,addedActors:[],currentActors:[]})}resetCameraNoEvent(){let e=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.resetCamera(),this._suppressCameraModifiedEvents=e}setCameraNoEvent(e){let t=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.setCamera(e),this._suppressCameraModifiedEvents=t}_getViewImageDataIntersections(e,t,r){let n=r[0],a=r[1],i=r[2],o=n*t[0]+a*t[1]+i*t[2],l=e.getBounds(),s=this._getEdges(l),d=[];for(let e of s){let[[t,r,s],[u,c,h]]=e;if(n*(u-t)+a*(c-r)+i*(h-s)==0)continue;let p=function(e,t,r){let[n,a,i]=e,[o,l,s]=t,[d,u,c,h]=r,p=o-n,m=l-a,f=s-i,g=-1*(d*n+u*a+c*i-h)/(d*p+u*m+c*f);return[p*g+n,m*g+a,f*g+i]}([t,r,s],[u,c,h],[n,a,i,o]);this._isInBounds(p,l)&&d.push(p)}return d}setInterpolationType(e,t){}setDisplayArea(e,t=!1){if(!e)return;let{storeAsInitialCamera:r,type:n}=e;r&&(this.options.displayArea=e);let{_suppressCameraModifiedEvents:a}=this;if(this._suppressCameraModifiedEvents=!0,this.setCamera(this.fitToCanvasCamera),"SCALE"===n?this.setDisplayAreaScale(e):(this.setInterpolationType(this.getProperties()?.interpolationType??Fv.LINEAR),this.setDisplayAreaFit(e)),r&&(this.initialCamera=this.getCamera()),this._suppressCameraModifiedEvents=a,!t&&!a){let t={viewportId:this.id,displayArea:e,storeAsInitialCamera:r};jq(this.element,Fm.DISPLAY_AREA_MODIFIED,t),this.setCamera(this.getCamera())}}setDisplayAreaScale(e){let{scale:t=1}=e,r=this.canvas,n=r.height,a=r.width;if(n<8||a<8)return;let i=this.getDefaultImageData().getSpacing()[1];this.setInterpolationType(Fv.NEAREST),this.setCamera({parallelScale:n*i/(2*t)}),delete e.imageArea,this.setDisplayAreaFit(e);let{focalPoint:o,position:l,viewUp:s,viewPlaneNormal:d}=this.getCamera(),u=LJ.vec3.create();if(r.height%2&&LJ.vec3.scaleAndAdd(u,u,s,.5*t*i),r.width%2){let e=LJ.vec3.cross(LJ.vec3.create(),s,d);LJ.vec3.scaleAndAdd(u,u,e,.5*t*i)}(u[0]||u[1]||u[2])&&this.setCamera({focalPoint:LJ.vec3.add(LJ.vec3.create(),o,u),position:LJ.vec3.add(LJ.vec3.create(),l,u)})}setDisplayAreaFit(e){let{imageArea:t,imageCanvasPoint:r}=e,n=window?.devicePixelRatio||1,a=this.getDefaultImageData();if(!a)return;let i=this.sWidth/n,o=this.sHeight/n,l=a.getDimensions(),s=this.worldToCanvas(a.indexToWorld([0,0,0])),d=this.worldToCanvas(a.indexToWorld([l[0],l[1],l[2]])),[u,c]=[Math.abs(d[0]-s[0]),Math.abs(d[1]-s[1])],h=this.getZoom()/this.insetImageMultiplier;if(t){let[e,r]=t,n=Math.max(Math.abs(u/i),Math.abs(c/o)),a=Math.abs(e*u/i),l=Math.abs(r*c/o);h=(a>l?n/a:n/l)*this.getZoom()/this.getZoom(this.fitToCanvasCamera),this.setZoom(this.insetImageMultiplier*h,!1)}if(r){let{imagePoint:e,canvasPoint:t=e||[.5,.5]}=r,[n,a]=t,[l,s]=e||t,d=h,p=[this.insetImageMultiplier*d*u*(.5-l)+i*(n-.5),this.insetImageMultiplier*d*c*(.5-s)+o*(a-.5)];LJ.vec2.add(p,p,this.getPan()),this.setPan(p,!1)}}getDisplayArea(){return this.options?.displayArea}resetCamera(e){let t,{resetPan:r=!0,resetZoom:n=!0,resetToCenter:a=!0,storeAsInitialCamera:i=!0,resetAspectRatio:o=!0}=e||{},l=this.getRenderer();this.setCameraNoEvent({flipHorizontal:!1,flipVertical:!1});let s=this.getCamera(),d=this.getDefaultActor();t=d&&qE(d)?d.actor.getMapper().getInputData().getBounds():l.computeVisiblePropBounds();let u=[0,0,0],c=this.getDefaultImageData(),h=this.getVtkActiveCamera(),p=h.getViewPlaneNormal(),m=h.getViewUp();if(u[0]=(t[0]+t[1])/2,u[1]=(t[2]+t[3])/2,u[2]=(t[4]+t[5])/2,c){let e=$i(c.getDimensions(),c.getDirection(),p),t=[e[0],e[1],e[2]];c.indexToWorld(t,u)}let{widthWorld:f,heightWorld:g}=c?$n(c,p,m):this._getWorldDistanceViewUpAndViewRight(t,m,p),y=[this.sWidth,this.sHeight],v=f/g/(y[0]/y[1]),b=v<1?this.insetImageMultiplier*g/2:this.insetImageMultiplier*g*v/2,w=$a.boundsRadius(t)*(this.type===Fg.VOLUME_3D?10:1),x=this.insetImageMultiplier*w,C=Math.abs(zs.dot(m,p))>.999?[-m[2],m[0],m[1]]:m,k=this._getFocalPointForResetCamera(u,s,{resetPan:r,resetToCenter:a}),M=[k[0]+x*p[0],k[1]+x*p[1],k[2]+x*p[2]];l.resetCameraClippingRange(t);let S=[-B9.MAXIMUM_RAY_DISTANCE,B9.MAXIMUM_RAY_DISTANCE];h.setPhysicalScale(w),h.setPhysicalTranslation(-k[0],-k[1],-k[2]);let E=o?this.options?.aspectRatio||[1,1]:this.getAspectRatio();this.setCamera({parallelScale:n?b:s.parallelScale,focalPoint:k,position:M,viewAngle:90,viewUp:C,clippingRange:S,aspectRatio:E,isFitViewportAfterStretch:!1});let T=this.getCamera();return this.setFitToCanvasCamera(this.getCamera()),i&&this.setInitialCamera(T),n&&this.setZoom(1,i),l.invokeEvent({type:"ResetCameraEvent",renderer:l}),this.triggerCameraModifiedEventIfNecessary(s,T),c&&this.options.displayArea&&n&&r&&a&&this.setDisplayArea(this.options.displayArea),!0}setInitialCamera(e){this.initialCamera=e}setFitToCanvasCamera(e){this.fitToCanvasCamera=e}getPan(e=this.initialCamera){if(!e)return[0,0];let t=this.getVtkActiveCamera().getFocalPoint(),r=this.canvasToWorld([0,0]),n=this.worldToCanvas(LJ.vec3.subtract([0,0,0],e.focalPoint,r)),a=this.worldToCanvas(LJ.vec3.subtract([0,0,0],t,r));return LJ.vec2.subtract([0,0],n,a)}getCurrentImageIdIndex(){throw Error("Not implemented")}getSliceIndex(){throw Error("Not implemented")}getImageData(){throw Error("Not implemented")}getViewReferenceId(e){return null}setPan(e,t=!1){let r=this.getCamera(),{focalPoint:n,position:a}=r,i=this.canvasToWorld([0,0]),o=LJ.vec2.subtract([0,0],e,this.getPan());if(1>Math.abs(o[0])&&1>Math.abs(o[1])&&!t)return;let l=LJ.vec3.subtract(LJ.vec3.create(),this.canvasToWorld(o),i),s=LJ.vec3.subtract(LJ.vec3.create(),n,l),d=LJ.vec3.subtract(LJ.vec3.create(),a,l);this.setCamera({...r,focalPoint:s,position:d},t)}getZoom(e=this.initialCamera){if(!e)return 1;let t=this.getVtkActiveCamera(),{parallelScale:r}=e;return r/t.getParallelScale()}setZoom(e,t=!1){let r=this.getCamera(),{parallelScale:n}=this.initialCamera,a=n/e;(r.parallelScale!==a||t)&&this.setCamera({...r,parallelScale:a},t)}getAspectRatio(){let{aspectRatio:e}=this.getCamera();return e??this.options?.aspectRatio??[1,1]}setAspectRatio(e,t=!0,r=!1){let n=this.getCamera();r&&(this.options.aspectRatio=e),this.setCamera({...n,aspectRatio:e,isFitViewportAfterStretch:t},r)}_getFocalPointForViewPlaneReset(e){let{focalPoint:t,viewPlaneNormal:r}=this.getCamera(),n=this._getViewImageDataIntersections(e,t,r),a=0,i=0,o=0;return n.forEach(([e,t,r])=>{a+=e,i+=t,o+=r}),[a/n.length,i/n.length,o/n.length]}getCanvas(){return this.canvas}getVtkActiveCamera(){let e=this.getRenderer();return e?e.getActiveCamera():(console.warn("No renderer found for the viewport"),null)}getCameraNoRotation(){let e=this.getVtkActiveCamera(),t=(e,t)=>e.some(e=>isNaN(e))?t:e,r=t([...e.getViewUp()],[0,1,0]),n=t([...e.getViewPlaneNormal()],[0,0,-1]);return{viewUp:r,viewPlaneNormal:n,position:t([...e.getPosition()],[0,0,1]),focalPoint:t([...e.getFocalPoint()],[0,0,0]),parallelProjection:e.getParallelProjection(),parallelScale:e.getParallelScale(),viewAngle:e.getViewAngle(),flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical,aspectRatio:e.getAspectRatio()}}getCamera(){return{...this.getCameraNoRotation(),rotation:this.getRotation()}}setAspectRatioForVTKCamera(e,t=!0){let r=this.getVtkActiveCamera();if(!t)return void r.setAspectRatio(e);let n=r.getAspectRatio()||[1,1];if(n[0]===e[0]&&n[1]===e[1])return;let a=(([e,t])=>e/t)(n),i=(([e,t])=>e/t)(e);r.setAspectRatio(e);let o=this.getDefaultImageData();if(!o)return;let l=e=>{let{widthWorld:t,heightWorld:n}=$n(o,r.getViewPlaneNormal(),r.getViewUp()),a=this.sWidth/this.sHeight,i=t*e,l=i/n>a?i/(2*a):n/2;return e<1&&(l/=e),l},s=l(i)/l(a);r.setParallelScale(r.getParallelScale()*s),this.initialCamera?.parallelScale&&(this.initialCamera={...this.initialCamera,parallelScale:this.initialCamera.parallelScale*s}),this.fitToCanvasCamera?.parallelScale&&(this.fitToCanvasCamera={...this.fitToCanvasCamera,parallelScale:this.fitToCanvasCamera.parallelScale*s})}setCamera(e,t=!1){let r=this.getVtkActiveCamera(),n=this.getCamera(),a=Object.assign({},n,e),{viewUp:i,viewPlaneNormal:o,position:l,focalPoint:s,parallelScale:d,viewAngle:u,flipHorizontal:c,flipVertical:h,clippingRange:p,aspectRatio:m,isFitViewportAfterStretch:f}=e;if(void 0!==c){let e=c&&!this.flipHorizontal||!c&&this.flipHorizontal;e&&this.flip({flipHorizontal:e})}if(void 0!==h){let e=h&&!this.flipVertical||!h&&this.flipVertical;e&&this.flip({flipVertical:e})}void 0!==i&&r.setViewUp(i),void 0!==o&&r.setDirectionOfProjection(-o[0],-o[1],-o[2]),void 0!==l&&r.setPosition(...l),void 0!==s&&r.setFocalPoint(...s),void 0!==d&&r.setParallelScale(d),void 0!==u&&r.setViewAngle(u),void 0!==p&&r.setClippingRange(p),m&&this.setAspectRatioForVTKCamera(m,f);let g=n.focalPoint,y=n.viewUp;if(g&&s||y&&i){let e=r.getViewPlaneNormal(),t=r.getViewUp(),n=!1,o=!1;if(s){let t=[s[0]-g[0],s[1]-g[1],s[2]-g[2]];n=Math.abs(zs.dot(t,e))>0}if(i&&(o=!F0(t,y)),n||o){let e=this.getDefaultActor();if(!e?.actor)return;qT(e,"vtkActor")||this.updateClippingPlanesForActors(a),(qT(e,"vtkImageSlice")||this.type===Fg.VOLUME_3D)&&this.getRenderer().resetCameraClippingRange()}}t&&this.setInitialCamera(a),this.triggerCameraModifiedEventIfNecessary(n,this.getCamera())}triggerCameraModifiedEventIfNecessary(e,t){if(!this._suppressCameraModifiedEvents&&!this.suppressEvents){let r={previousCamera:e,camera:t,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};jq(this.element,Fm.CAMERA_MODIFIED,r)}}updateCameraClippingPlanesAndRange(){let e=this.getCamera();this.updateClippingPlanesForActors(e),this.getRenderer().resetCameraClippingRange()}async updateClippingPlanesForActors(e){this.getActors().map(t=>{if(!t.actor)return;let r=t.actor.getMapper(),n=t?.clippingFilter?t?.clippingFilter.getClippingPlanes():r.getClippingPlanes();0===n.length&&t?.clippingFilter&&(n=[zx.newInstance(),zx.newInstance()]);let a=B9.MINIMUM_SLAB_THICKNESS;t.slabThickness&&(a=t.slabThickness);let{viewPlaneNormal:i,focalPoint:o}=e;this.setOrientationOfClippingPlanes(n,a,i,o),jq(this.element,Fm.CLIPPING_PLANES_UPDATED,{actorEntry:t,focalPoint:o,vtkPlanes:n,viewport:this})})}setOrientationOfClippingPlanes(e,t,r,n){if(e.length<2)return;let a=[r[0],r[1],r[2]];zs.multiplyScalar(a,t),e[0].setNormal(r);let i=[0,0,0];zs.subtract(n,a,i),e[0].setOrigin(i),e[1].setNormal(-r[0],-r[1],-r[2]);let o=[0,0,0];zs.add(n,a,o),e[1].setOrigin(o)}getClippingPlanesForActor(e){if(e||(e=this.getDefaultActor()),!e.actor)throw Error("Invalid actor entry: Actor is undefined");let t=e.actor.getMapper(),r=e?.clippingFilter?e?.clippingFilter.getClippingPlanes():t.getClippingPlanes();return 0===r.length&&e?.clippingFilter&&(r=[zx.newInstance(),zx.newInstance()]),r}_getWorldDistanceViewUpAndViewRight(e,t,r){let n=this._getCorners(e),a=this._getCorners(e),i=LJ.vec3.cross(LJ.vec3.create(),t,r),o=q6().identity().rotateFromDirections(t,[1,0,0]);n.forEach(e=>o.apply(e));let l=1/0,s=-1/0;for(let e=0;e<8;e++){let t=n[e][0];t>s&&(s=t),t<l&&(l=t)}o=q6().identity().rotateFromDirections([i[0],i[1],i[2]],[1,0,0]),a.forEach(e=>o.apply(e));let d=1/0,u=-1/0;for(let e=0;e<8;e++){let t=a[e][0];t>u&&(u=t),t<d&&(d=t)}return{widthWorld:u-d,heightWorld:s-l}}getViewReference(e){let{focalPoint:t,viewPlaneNormal:r,viewUp:n}=this.getCamera(),a=this.getFrameOfReferenceUID(),i={FrameOfReferenceUID:a,cameraFocalPoint:t,viewPlaneNormal:r,viewUp:n,sliceIndex:e?.sliceIndex??this.getSliceIndex(),planeRestriction:{FrameOfReferenceUID:a,point:e?.points?.[0]||t,inPlaneVector1:n,inPlaneVector2:LJ.vec3.cross(LJ.vec3.create(),n,r)}};return e?.points&&$t(e.points,i.planeRestriction),i}isPlaneViewable(e,t){if(e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{focalPoint:r,viewPlaneNormal:n}=this.getCamera(),{point:a,inPlaneVector1:i,inPlaneVector2:o}=e;if(t?.withOrientation)return!0;if(i&&!F0(0,LJ.vec3.dot(n,i))||o&&!F0(0,LJ.vec3.dot(n,o)))return!1;if(t?.withNavigation)return!0;let l=LJ.vec3.sub(LJ.vec3.create(),a,r);return F0(0,LJ.vec3.dot(l,n))}isReferenceViewable(e,t){if(e.planeRestriction)return this.isPlaneViewable(e.planeRestriction,t);if(e.FrameOfReferenceUID&&e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{viewPlaneNormal:r}=e,n=this.getCamera();return!r||!!F0(r,n.viewPlaneNormal)||!!F0(LJ.vec3.negate(n.viewPlaneNormal,n.viewPlaneNormal),r)||t?.withOrientation}getViewPresentation(e={rotation:!0,displayArea:!0,zoom:!0,pan:!0,aspectRatio:!0,flipHorizontal:!0,flipVertical:!0}){let t={},{rotation:r,displayArea:n,zoom:a,pan:i,flipHorizontal:o,flipVertical:l}=e;r&&(t.rotation=this.getRotation()),n&&(t.displayArea=this.getDisplayArea());let s=this.getZoom();a&&(t.zoom=s);let d=this.getAspectRatio();if(t.aspectRatio=d,i){let e=this.getPan(),[r,n]=d;t.pan=[e[0]/(s*r),e[1]/(s*n)]}return o&&(t.flipHorizontal=this.flipHorizontal),l&&(t.flipVertical=this.flipVertical),t}setViewReference(e){}setViewPresentation(e){if(!e)return;let{displayArea:t,zoom:r=this.getZoom(),pan:n,aspectRatio:a=this.getAspectRatio(),rotation:i,flipHorizontal:o=this.flipHorizontal,flipVertical:l=this.flipVertical}=e;if(t!==this.getDisplayArea()&&this.setDisplayArea(t),this.setZoom(r),this.setAspectRatio(a),n){let[e,t]=a;this.setPan([n[0]*r*e,n[1]*r*t])}void 0!==o&&o!==this.flipHorizontal&&this.flip({flipHorizontal:o}),void 0!==l&&l!==this.flipVertical&&this.flip({flipVertical:l}),i>=0&&this.setRotation(i)}_getCorners(e){return[[e[0],e[2],e[4]],[e[0],e[2],e[5]],[e[0],e[3],e[4]],[e[0],e[3],e[5]],[e[1],e[2],e[4]],[e[1],e[2],e[5]],[e[1],e[3],e[4]],[e[1],e[3],e[5]]]}_getFocalPointForResetCamera(e,t,{resetPan:r=!0,resetToCenter:n=!0}){if(n&&r)return e;if(n&&!r)return q7(t.focalPoint)?e:t.focalPoint;if(!n&&r){let r=t.focalPoint,n=t.viewPlaneNormal,a=LJ.vec3.subtract(LJ.vec3.create(),e,r),i=LJ.vec3.dot(a,n),o=LJ.vec3.scaleAndAdd(LJ.vec3.create(),e,n,-1*i);return[o[0],o[1],o[2]]}if(!r&&!n)return q7(t.focalPoint)?e:t.focalPoint}_isInBounds(e,t){let[r,n,a,i,o,l]=t,[s,d,u]=e;return!(s<r)&&!(s>n)&&!(d<a)&&!(d>i)&&!(u<o)&&!(u>l)}_getEdges(e){let[t,r,n,a,i,o,l,s]=this._getCorners(e);return[[t,r],[t,i],[t,n],[r,a],[r,o],[n,a],[n,l],[a,s],[i,l],[i,o],[o,s],[l,s]]}static boundsRadius(e){return .5*Math.sqrt((e[1]-e[0])**2+(e[3]-e[2])**2+(e[5]-e[4])**2||1)}setDataList(e){throw Error("Unsupported operation setDataList")}setDisplaySets(...e){this._displaySets=e}async mountDisplaySets(e,t){let[r]=e;if(!r?.displaySetId)throw Error(`${this.constructor.name}: setDisplaySets requires a displaySetId`);await t(r),this._displaySets=[r]}getDisplaySets(){return this._displaySets}clearDisplaySets(){this._displaySets=[]}}function $i(e,t,r){let n=[[t[0],t[1],t[2]],[t[3],t[4],t[5]],[t[6],t[7],t[8]]],a=[r[0],r[1],r[2]],i=0,o=-1;for(let e=0;e<3;e++){let t=Math.abs(LJ.vec3.dot(n[e],a));t>o&&(o=t,i=e)}let l=.001>Math.abs(o-1);return e.map((e,t)=>t===i&&l?Math.floor(e/2):(e-1)/2)}$a.CameraViewPresentation={rotation:!0,pan:!0,zoom:!0,aspectRatio:!0,displayArea:!0},$a.TransferViewPresentation={windowLevel:!0,paletteLut:!0};let $o=$a;function $l(){return window.performance?performance.now():Date.now()}function $s(e,t,r){if(r){let e,t,n,a;return e=Math.max(...r.lut).toString(2).length-8,t=r.lut[0]>>e,n=r.lut[r.lut.length-1]>>e,a=r.firstValueMapped+r.lut.length-1,function(i){return i<r.firstValueMapped?t:i>=a?n:r.lut[i-r.firstValueMapped]>>e}}return function(r){return Math.min(Math.max(((r-(t-.5))/(e-1)+.5)*255,0),255)}}class $d{constructor(){this.reset()}getMatrix(){return this.m}reset(){this.m=[1,0,0,1,0,0]}clone(){let e=new $d;return e.m[0]=this.m[0],e.m[1]=this.m[1],e.m[2]=this.m[2],e.m[3]=this.m[3],e.m[4]=this.m[4],e.m[5]=this.m[5],e}multiply(e){let t=this.m[0]*e[0]+this.m[2]*e[1],r=this.m[1]*e[0]+this.m[3]*e[1],n=this.m[0]*e[2]+this.m[2]*e[3],a=this.m[1]*e[2]+this.m[3]*e[3],i=this.m[0]*e[4]+this.m[2]*e[5]+this.m[4],o=this.m[1]*e[4]+this.m[3]*e[5]+this.m[5];this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}invert(){let e=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),t=this.m[3]*e,r=-this.m[1]*e,n=-this.m[2]*e,a=this.m[0]*e,i=e*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),o=e*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}rotate(e){let t=Math.cos(e),r=Math.sin(e),n=this.m[0]*t+this.m[2]*r,a=this.m[1]*t+this.m[3]*r,i=-(this.m[0]*r)+this.m[2]*t,o=-(this.m[1]*r)+this.m[3]*t;this.m[0]=n,this.m[1]=a,this.m[2]=i,this.m[3]=o}translate(e,t){this.m[4]+=this.m[0]*e+this.m[2]*t,this.m[5]+=this.m[1]*e+this.m[3]*t}scale(e,t){this.m[0]*=e,this.m[1]*=e,this.m[2]*=t,this.m[3]*=t}transformPoint(e){let t=e[0],r=e[1];return[t*this.m[0]+r*this.m[2]+this.m[4],t*this.m[1]+r*this.m[3]+this.m[5]]}}function $u(e,t){let r=new $d,n=e.viewport.aspectRatio;if(!e.viewport.displayedArea)return r;r.translate(e.canvas.width/2,e.canvas.height/2);let a=e.viewport.rotation;0!==a&&r.rotate(a*Math.PI/180);let[i,o,l]=function(e){if(Array.isArray(e))return[e[0]??1,e[1]??1,!0];let t=e??1;return[t,t,!1]}(e.viewport.scale),s=i,d=o,u=e.viewport.displayedArea.brhc.x-(e.viewport.displayedArea.tlhc.x-1),c=e.viewport.displayedArea.brhc.y-(e.viewport.displayedArea.tlhc.y-1);if(l);else if("NONE"===e.viewport.displayedArea.presentationSizeMode)e.image.rowPixelSpacing<e.image.columnPixelSpacing?s*=e.image.columnPixelSpacing/e.image.rowPixelSpacing:e.image.columnPixelSpacing<e.image.rowPixelSpacing&&(d*=e.image.rowPixelSpacing/e.image.columnPixelSpacing);else if(s=e.viewport.displayedArea.columnPixelSpacing,d=e.viewport.displayedArea.rowPixelSpacing,"SCALE TO FIT"===e.viewport.displayedArea.presentationSizeMode){let t=e.canvas.height/(c*d);s=d=Math.min(e.canvas.width/(u*s),t),e.viewport.displayedArea.rowPixelSpacing<e.viewport.displayedArea.columnPixelSpacing?s*=e.viewport.displayedArea.columnPixelSpacing/e.viewport.displayedArea.rowPixelSpacing:e.viewport.displayedArea.columnPixelSpacing<e.viewport.displayedArea.rowPixelSpacing&&(d*=e.viewport.displayedArea.rowPixelSpacing/e.viewport.displayedArea.columnPixelSpacing)}if(r.scale(s,d),0!==a&&r.rotate(-a*Math.PI/180),r.translate(e.viewport.translation.x,e.viewport.translation.y),0!==a&&r.rotate(a*Math.PI/180),void 0!==t&&void 0===n&&r.scale(t,t),void 0!==n&&void 0===t){let[e,t]=n;r.scale(e,t)}return e.viewport.hflip&&r.scale(-1,1),e.viewport.vflip&&r.scale(1,-1),r.translate(-u/2,-c/2),r}function $c(e,t,r){if(void 0===e)throw Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw Error("setToPixelCoordinateSystem: parameter context must not be undefined");let n=$u(e,r).getMatrix();t.setTransform(n[0],n[1],n[2],n[3],n[4],n[5])}function $h(e,t){let r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}function $p(e,t){let r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;let n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);let a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}function $m(e){let t=e.image.imageId,r=e.viewport,n=e.image.color;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedIsColor=n,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}let $f="viewport-element",$g="cornerstone-canvas";function $y(e,t=512,r=512){let n=v?v(t,r):document.createElement("canvas");return e&&(n.style.position="absolute",n.style.width="100%",n.style.height="100%",n.style.imageRendering="pixelated",n.classList.add($g),e.appendChild(n)),n}function $v(e){let t,r=`canvas.${$g}`,n=`div.${$f}`,a=e.querySelector(n)||((t=document.createElement("div")).style.position="relative",t.style.width="100%",t.style.height="100%",t.style.overflow="hidden",t.classList.add($f),e.appendChild(t),t),i=a.querySelector(r);if(i)return i;let o=$y(a),l=a.getBoundingClientRect(),s=window.devicePixelRatio||1,d=Math.ceil(l.width*s),u=Math.ceil(l.height*s);return d>0&&u>0&&(o.width=d,o.height=u,o.style.aspectRatio=`${d} / ${u}`),o}function $b(e,t){if(void 0===e)throw Error("renderColorImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("renderColorImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,$c(e,n);let a=function(e,t,r){var n;let a=e.renderingTools.lastRenderedIsColor;e.renderingTools.renderCanvas&&a||(e.renderingTools.renderCanvas=$y(null,t.width,t.height));let i=e.renderingTools.renderCanvas,{windowWidth:o,windowCenter:l}=e.viewport.voi;if((256===o||255===o)&&(128===l||127===l)&&!e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!$h(e,t)&&!r)return i;e.renderingTools.renderCanvasContext&&i.width===t.width&&i.height===t.height||$p(e,t);let s=$l(),d=(n=e.viewport,void 0!==t.cachedLut&&t.cachedLut.windowCenter===n.voi.windowCenter&&t.cachedLut.windowWidth===n.voi.windowWidth&&t.cachedLut.invert===n.invert||(!function(e,t,r,n){let a=e.maxPixelValue,i=e.minPixelValue,o=Math.min(i,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(a-o+1));let l=e.cachedLut.lutArray,s=$s(Array.isArray(t)?t[0]:t,Array.isArray(r)?r[0]:r,void 0);if(n)for(let e=i;e<=a;e++)l[e+-o]=255-s(e);else for(let e=i;e<=a;e++)l[e+-o]=s(e)}(t,n.voi.windowWidth,n.voi.windowCenter,n.invert),t.cachedLut.windowWidth=n.voi.windowWidth,t.cachedLut.windowCenter=n.voi.windowCenter,t.cachedLut.invert=n.invert),t.cachedLut.lutArray);t.stats=t.stats||{},t.stats.lastLutGenerateTime=$l()-s;let u=e.renderingTools.renderCanvasData,c=e.renderingTools.renderCanvasContext;return t.rgba?!function(e,t,r){let n=$l(),a=e.getPixelData();e.stats.lastGetPixelDataTime=$l()-n;let i=e.minPixelValue,o=0,l=0,s=a.length;if(n=$l(),i<0)for(;l<s;)r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=a[l++];else for(;l<s;)r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=a[l++];e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,d,u.data):!function(e,t,r){let n=$l(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-n;let i=e.minPixelValue,o=0,l=0,s=a.length;if(n=$l(),i<0)for(;l<s;)r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=255;else for(;l<s;)r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,d,u.data),s=$l(),c.putImageData(u,0,0),t.stats.lastPutImageDataTime=$l()-s,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,l=e.viewport.displayedArea.brhc.x-i,s=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,l,s,0,0,l,s),e.renderingTools=$m(e)}function $w(e,t){return!e&&!t||!!e&&!!t&&e.id===t.id}function $x(e,t,r){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&$w(e.cachedLut.modalityLUT,t.modalityLUT)&&$w(e.cachedLut.voiLUT,t.voiLUT)&&e.cachedLut.invert===t.invert&&!r||(!function(e,t){var r;if((r=e).voiLUT&&r.voiLUT.lut&&r.voiLUT.lut.length>0||void 0!==r.voi.windowWidth&&void 0!==r.voi.windowCenter)return;let n=t.maxPixelValue*t.slope+t.intercept,a=t.minPixelValue*t.slope+t.intercept,i=n-a,o=(n+a)/2;void 0===e.voi?e.voi={windowWidth:i,windowCenter:o,voiLUTFunction:t.voiLUTFunction}:(e.voi.windowWidth=i,e.voi.windowCenter=o)}(t,e),!function(e,t,r,n,a,i){let o=e.maxPixelValue,l=e.minPixelValue,s=Math.min(l,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(o-s+1));let d=e.cachedLut.lutArray,u=function(e,t,r){if(r){let e,t,n;return e=r.lut[0],t=r.lut[r.lut.length-1],n=r.firstValueMapped+r.lut.length,a=>a<r.firstValueMapped?e:a>=n?t:r.lut[a]}return r=>r*e+t}(e.slope,e.intercept,a),c=$s(t,r,i);if(e.isPreScaled)if(n)for(let e=l;e<=o;e++)d[e+-s]=255-c(e);else for(let e=l;e<=o;e++)d[e+-s]=c(e);else if(n)for(let e=l;e<=o;e++)d[e+-s]=255-c(u(e));else for(let e=l;e<=o;e++)d[e+-s]=c(u(e))}(e,t.voi.windowWidth,t.voi.windowCenter,t.invert,t.modalityLUT,t.voiLUT),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.voiLUT=t.voiLUT,e.cachedLut.modalityLUT=t.modalityLUT),e.cachedLut.lutArray}function $C(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,$c(e,n);let a=function(e,t,r,n=!0){let a=e.renderingTools.lastRenderedIsColor;(!e.renderingTools.renderCanvas||a)&&(e.renderingTools.renderCanvas=$y(null,t.width,t.height),$p(e,t));let i=e.renderingTools.renderCanvas;if(!$h(e,t)&&!r)return i;(i.width!==t.width||i.height!==t.height)&&$p(e,t),t.stats=t.stats||{};let o=e.renderingTools.renderCanvasData,l=e.renderingTools.renderCanvasContext,s=$l();t.stats.lastLutGenerateTime=$l()-s;let{viewport:d}=e;if("PT"===d.modality&&t.isPreScaled){let{windowWidth:e,windowCenter:r}=d.voi,n=r-e/2,a=255/(r+e/2-n);!function(e,t,r){let n=$l(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-n;let i=a.length,o=3,l=0;for(n=$l();l<i;)r[o]=t(a[l++]),o+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,d.invert?e=>255-(e-n)*a:e=>(e-n)*a,o.data)}else{let e=$x(t,d,r);n?function(e,t,r){let n=$l(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-n;let i=a.length,o=e.minPixelValue,l=3,s=0;if(n=$l(),a instanceof Int16Array)if(o<0)for(;s<i;)r[l]=t[a[s++]+-o],l+=4;else for(;s<i;)r[l]=t[a[s++]],l+=4;else if(a instanceof Uint16Array)for(;s<i;)r[l]=t[a[s++]],l+=4;else if(o<0)for(;s<i;)r[l]=t[a[s++]+-o],l+=4;else for(;s<i;)r[l]=t[a[s++]],l+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,e,o.data):function(e,t,r){let n,a=$l(),i=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-a;let o=i.length,l=e.minPixelValue,s=0,d=0;if(a=$l(),i instanceof Int16Array)if(l<0)for(;d<o;)n=t[i[d++]+-l],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else for(;d<o;)n=t[i[d++]],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else if(i instanceof Uint16Array)for(;d<o;)n=t[i[d++]],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else if(l<0)for(;d<o;)n=t[i[d++]+-l],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else for(;d<o;)n=t[i[d++]],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-a}(t,e,o.data)}return s=$l(),l.putImageData(o,0,0),t.stats.lastPutImageDataTime=$l()-s,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,l=e.viewport.displayedArea.brhc.x-i,s=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,l,s,0,0,l,s),e.renderingTools=$m(e)}let $k=class{constructor(){this.NumberOfColors=256,this.Ramp="linear",this.TableRange=[0,255],this.HueRange=[0,.66667],this.SaturationRange=[1,1],this.ValueRange=[1,1],this.AlphaRange=[1,1],this.NaNColor=[128,0,0,255],this.BelowRangeColor=[0,0,0,255],this.UseBelowRangeColor=!0,this.AboveRangeColor=[255,255,255,255],this.UseAboveRangeColor=!0,this.InputRange=[0,255],this.Table=[]}setNumberOfTableValues(e){this.NumberOfColors=e}setRamp(e){this.Ramp=e}setTableRange(e,t){this.TableRange[0]=e,this.TableRange[1]=t}setHueRange(e,t){this.HueRange[0]=e,this.HueRange[1]=t}setSaturationRange(e,t){this.SaturationRange[0]=e,this.SaturationRange[1]=t}setValueRange(e,t){this.ValueRange[0]=e,this.ValueRange[1]=t}setRange(e,t){this.InputRange[0]=e,this.InputRange[1]=t}setAlphaRange(e,t){this.AlphaRange[0]=e,this.AlphaRange[1]=t}getColor(e){return this.mapValue(e)}build(e){let t,r,n,a;if(this.Table.length>1&&!e)return;this.Table=[];let i=this.NumberOfColors-1;i?(t=(this.HueRange[1]-this.HueRange[0])/i,r=(this.SaturationRange[1]-this.SaturationRange[0])/i,n=(this.ValueRange[1]-this.ValueRange[0])/i,a=(this.AlphaRange[1]-this.AlphaRange[0])/i):t=r=n=a=0;for(let e=0;e<=i;e++){let i=this.HueRange[0]+e*t,o=this.SaturationRange[0]+e*r,l=this.ValueRange[0]+e*n,s=this.AlphaRange[0]+e*a,d=function(e,t,r){if(e>1)throw Error("HSVToRGB expects hue < 1");let n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;let a=Math.floor(6*e),i=6*e-a,o=r*(1-t),l=r*(1-t*i),s=r*(1-t*(1-i));switch(a){case 0:case 6:n[0]=r,n[1]=s,n[2]=o;break;case 1:n[0]=l,n[1]=r,n[2]=o;break;case 2:n[0]=o,n[1]=r,n[2]=s;break;case 3:n[0]=o,n[1]=l,n[2]=r;break;case 4:n[0]=s,n[1]=o,n[2]=r;break;case 5:n[0]=r,n[1]=o,n[2]=l}return n}(i,o,l),u=[0,0,0,0];switch(this.Ramp){case"scurve":u[0]=Math.floor(127.5*(1+Math.cos((1-d[0])*Math.PI))),u[1]=Math.floor(127.5*(1+Math.cos((1-d[1])*Math.PI))),u[2]=Math.floor(127.5*(1+Math.cos((1-d[2])*Math.PI))),u[3]=Math.floor(255*s);break;case"linear":u[0]=Math.floor(255*d[0]+.5),u[1]=Math.floor(255*d[1]+.5),u[2]=Math.floor(255*d[2]+.5),u[3]=Math.floor(255*s+.5);break;case"sqrt":u[0]=Math.floor(255*Math.sqrt(d[0])+.5),u[1]=Math.floor(255*Math.sqrt(d[1])+.5),u[2]=Math.floor(255*Math.sqrt(d[2])+.5),u[3]=Math.floor(255*Math.sqrt(s)+.5);break;default:throw Error(`Invalid Ramp value (${this.Ramp})`)}this.Table.push(u)}this.buildSpecialColors()}buildSpecialColors(){let e=this.NumberOfColors,t=e+0,r=e+1;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[e+2]=this.NaNColor}mapValue(e){let t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&e<this.TableRange[0])return this.BelowRangeColor}else if(t===this.NumberOfColors-1&&this.UseAboveRangeColor&&e>this.TableRange[1])return this.AboveRangeColor;return this.Table[t]}getIndex(e){let t={Range:[],MaxIndex:this.NumberOfColors-1,Shift:-this.TableRange[0],Scale:1};if(this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return -1;let r=Math.floor(e<t.Range[0]?t.MaxIndex+0+1.5:e>t.Range[1]?t.MaxIndex+1+1.5:(e+t.Shift)*t.Scale);return r===this.NumberOfColors+0?r=0:r===this.NumberOfColors+1&&(r=this.NumberOfColors-1),r}setTableValue(e,t,r,n,a){let i;if("number"==typeof t&&void 0!==r&&void 0!==n&&void 0!==a)i=[t,r,n,a];else if(Array.isArray(t))i=t;else throw Error("Invalid arguments for setTableValue");if(e<0)throw Error(`Can't set the table value for negative index (${e})`);if(e>=this.NumberOfColors)throw Error(`Index ${e} is greater than the number of colors ${this.NumberOfColors}`);this.Table[e]=i,(0===e||e===this.NumberOfColors-1)&&this.buildSpecialColors()}},$M=[0,0,0,0],$S=new Set(["gray","grey","grayscale","greyscale"]);function $E(e,t,r){let n,a=[],i=[],o=[],l=[];for(n=0,r=null===r?1:r;n<t.length;n++){let r=t[n];a.push((e-1)*r[0]),i.push(r[1]),o.push(r[1])}let s=function(e,t){let r=(1-e)/((t=null===t?100:t)-1),n=[];for(;t-- >0;)n.push(e),e+=r;return n[n.length-1]=1,n}(0,e);for(n=0;n<e;n++)s[n]=(e-1)*Math.pow(s[n],r);let d=function(e,t){let r,n=[],a=t.length;for(e.sort(function(e,t){return e-t}),r=0;r<a;r++)n[r]=function(e,t){let r=0,n=e.length-1;for(;r<=n;){let a=r+Math.floor((n-r)/2),i=e[a];if(i===t)return a;t<i?n=a-1:r=a+1}return r}(e,t[r]);return n}(a,s);for(n=1;n<e-1;n++){let e=d[n],t=(s[n]-a[e-1])/(a[e]-a[e-1]),r=i[e]-o[e-1];l[n]=t*r+o[e-1]}return l[0]=o[0],l[e-1]=i[t.length-1],l}function $T(e,t,r){let n,a="string"==typeof e?e.trim():e?.name?.trim();if(!a)return t;let i=a.toLowerCase();if($S.has(i))return;let o=qB(a);if(o){var l,s;return $P((l=o,s=a,$I(`vtk:${(l.name||l.Name||s).trim().toLowerCase()}`,function(e,t){let r=HE.newInstance();r.applyColorMap(e);let[n,a]=r.getRange(),i=Array.from({length:256},(e,t)=>{let i=[];return r.getColor(n+t/256*(a-n),i),[Math.round(255*i[0]),Math.round(255*i[1]),Math.round(255*i[2]),255]});return{colors:i,name:e.Name||t,numColors:i.length}}(l,s))),"string"==typeof e?void 0:e,r?.voiRange)}let d=(n=a.trim().toLowerCase(),Object.keys(B8).find(e=>{let t=B8[e];return e.toLowerCase()===n||t.name?.trim().toLowerCase()===n}));return $P(d?$I(d):void 0,"string"==typeof e?void 0:e,r?.voiRange)}function $I(e,t){let r=B8[e];return r||(r=B8[e]=t||{name:"",colors:[]}),!r.colors&&r.segmentedData&&(r.colors=function(e,t,r){let n,a=[];r=null===r?1:r;let i=$E(t=null===t?256:t,e.red,r),o=$E(t,e.green,r),l=$E(t,e.blue,r);for(n=0;n<t;n++){let e=[Math.round(255*i[n]),Math.round(255*o[n]),Math.round(255*l[n]),255];a.push(e)}return a}(r.segmentedData,r.numColors,r.gamma)),{getId:()=>e,getColorSchemeName:()=>r.name,setColorSchemeName(e){r.name=e},getNumberOfColors:()=>r.colors.length,setNumberOfColors(e){for(;r.colors.length<e;)r.colors.push($M);r.colors.length=e},getColor(e){return this.isValidIndex(e)?r.colors[e]:$M},getColorRepeating(e){let t=r.colors.length;return e=t?e%t:0,this.getColor(e)},setColor(e,t){this.isValidIndex(e)&&(r.colors[e]=t)},addColor(e){r.colors.push(e)},insertColor(e,t){this.isValidIndex(e)&&r.colors.splice(e,1,t)},removeColor(e){this.isValidIndex(e)&&r.colors.splice(e,1)},clearColors(){r.colors=[]},buildLookupTable(e){if(!e)return;let t=r.colors.length;e.setNumberOfTableValues(t);for(let n=0;n<t;n++)e.setTableValue(n,r.colors[n])},createLookupTable(){let e=new $k;return this.buildLookupTable(e),e},isValidIndex:e=>e>=0&&e<r.colors.length}}function $P(e,t,r){var n,a,i,o;let l;if(!e)return;if(t?.opacity===void 0&&t?.threshold===void 0||!r||r.upper<=r.lower)return e;let s=(n=e,a=t,i=r,l=Math.max(n.getNumberOfColors(),1),Array.from({length:256},(e,t)=>{var r,o;let s=1===l?0:(r=t,Math.min((o=l)-1,Math.floor(r/256*o))),d=n.getColor(s),u=function(e,t,r){if(void 0!==r&&e<r)return 0;if(void 0===t)return 1;if("number"==typeof t)return $D(t);if(!t.length)return 1;if(e<=t[0].value)return $D(t[0].opacity);for(let r=1;r<t.length;r++){let n=t[r-1],a=t[r];if(e<=a.value){let t=a.value-n.value,r=t>0?(e-n.value)/t:0;return $D(n.opacity+(a.opacity-n.opacity)*r)}}return $D(t[t.length-1].opacity)}(i.lower+(i.upper-i.lower)*(t/256),a?.opacity,a?.threshold);return[d[0],d[1],d[2],Math.round(d[3]/255*u*255)]}));return $I([e.getId(),`lower:${$_(r.lower)}`,`upper:${$_(r.upper)}`,`opacity:${void 0===(o=t?.opacity)?"none":"number"==typeof o?String($_(o)):o.map(({opacity:e,value:t})=>`${$_(t)}-${$_(e)}`).join(",")}`,`threshold:${$_(t?.threshold)}`].join(":"),{colors:s,name:e.getColorSchemeName(),numColors:s.length})}function $D(e){return Math.max(0,Math.min(1,e))}function $_(e){return void 0===e?"none":String(Math.round(1e3*e)/1e3)}let $A=function(e,t,r,n){let a,i,o=$l(),l=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-o;let s=l.length,d=e.minPixelValue,u=0,c=0;if(o=$l(),i=r instanceof $k?r.Table:r,d<0)for(;c<s;)a=i[t[l[c++]+-d]],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];else for(;c<s;)a=i[t[l[c++]]],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-o},$O=function(e,t,r,n){let a,i,o=$l(),l=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-o;let s=l.length,d=e.minPixelValue,u=0,c=0;if(o=$l(),i=r instanceof $k?r.Table:r,d<0)for(;c<s;)a=i[t(l[c++]+-d)],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];else for(;c<s;)a=i[t(l[c++])],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-o};function $R(e,t,r){return Math.max(t,Math.min(r,e))}function $N(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),e.options?.transparentBackground?n.clearRect(0,0,e.canvas.width,e.canvas.height):(n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height)),n.imageSmoothingEnabled=!e.viewport.pixelReplication,$c(e,n);let a=function(e,t,r){e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=$y(null,t.width,t.height));let n=e.renderingTools.renderCanvas,a=e.viewport.colormap||e.options.colormap;if(e.options&&e.options.colormap&&console.warn("enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead"),a&&"string"==typeof a?a=$T(a):a&&"object"==typeof a&&"function"!=typeof a.getId&&(a=$T(a)),!a)throw Error("renderPseudoColorImage: colormap not found.");let i=a.getId();if(!$h(e,t)&&!r&&e.renderingTools.colormapId===i)return n;e.renderingTools.renderCanvasContext&&n.width===t.width&&n.height===t.height||$p(e,t);let o=$l();(!e.renderingTools.colorLUT||r||e.renderingTools.colormapId!==i)&&(a.setNumberOfColors(256),e.renderingTools.colorLUT=a.createLookupTable(),e.renderingTools.colormapId=i);let l=e.renderingTools.renderCanvasData,s=e.renderingTools.renderCanvasContext,{viewport:d}=e,u=e.renderingTools.colorLUT;if("PT"===d.modality){let{windowWidth:e,windowCenter:r}=d.voi,n=r-e/2,a=255/(r+e/2-n);$O(t,d.invert?e=>$R(Math.floor(255-(e-n)*a),0,255):e=>$R(Math.floor((e-n)*a),0,255),u,l.data)}else{let n=$x(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=$l()-o,$A(t,n,u,l.data)}return o=$l(),s.putImageData(l,0,0),t.stats.lastPutImageDataTime=$l()-o,n}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,l=e.viewport.displayedArea.brhc.x-i,s=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,l,s,0,0,l,s),e.renderingTools=$m(e)}function $L(e,t){let r=e.image;if(!e.canvas||!e.image)return;let n=$l();if(r.stats={lastGetPixelDataTime:-1,lastStoredPixelDataToCanvasImageDataTime:-1,lastPutImageDataTime:-1,lastRenderTime:-1,lastLutGenerateTime:-1},r){let n=r.render;n||(n=e.viewport.colormap?$N:r.color?$b:$C),n(e,t)}let a=$l()-n;r.stats.lastRenderTime=a,e.invalid=!1,e.needsRedraw=!1}function $V(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,pixelArray:i,spacing:o}=e,l=!ArrayBuffer.isView(i)||i instanceof DataView?Array.from(i):i,s=!ArrayBuffer.isView(l)||l instanceof DataView?void 0:GA.getDataType(l),d=GA.newInstance({...s?{dataType:s}:{},name:"Pixels",numberOfComponents:n,values:l}),u=G0();return u.setDimensions(t),u.setSpacing(o),u.setDirection(new Float32Array(Array.from(r))),u.setOrigin(a),u.getPointData().setScalars(d),u}function $F(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,spacing:i}=qm(e),o=e.voxelManager.getScalarData().slice(),l=$V({dimensions:t,direction:Array.from(r),numberOfComponents:n,origin:a,pixelArray:o,spacing:i});return qJ(l,e),l}function $B(e){return e.preScale?.scaled&&e.preScale?.scalingParameters?.suvbw?{lower:0,upper:5}:q3(e.windowWidth,e.windowCenter,e.voiLUTFunction)}function $j(e){let{actor:t,defaultVOIRange:r,defaultVOILUTFunction:n,props:a}=e,i=t.getProperty(),o=a?.voiRange??r;if(a?.visible!==void 0&&t.setVisibility(a.visible),a?.opacity!==void 0&&i.setOpacity(a.opacity),a?.interpolationType!==void 0&&i.setInterpolationType(a.interpolationType),!o)return;let l=$W({colormap:a?.colormap,invert:a?.invert,voiRange:o,voiLUTFunction:a?.voiLUTFunction??n});i.setUseLookupTableScalarRange(!0),i.setRGBTransferFunction(0,l)}function $W(e){let{colormap:t,invert:r,voiRange:n,voiLUTFunction:a}=e,i=t?.name!==void 0?function(e,t){let r=e.name,n=r?qB(r):void 0;if(!n)throw Error(`Colormap ${r} not found`);let a=HE.newInstance();return a.applyColorMap(n),a.setMappingRange(t.lower,t.upper),a}(t,n):a===FE.SAMPLED_SIGMOID?qX(n):qZ(n);return r&&qQ(i),i}let $U=new class{constructor(){this._imageCache=new Map,this._volumeCache=new Map,this._imageIdsToVolumeIdCache=new Map,this._referencedImageIdToImageIdCache=new Map,this._geometryCache=new Map,this._imageCacheSize=0,this._maxCacheSize=0xc0000000,this._geometryCacheSize=0,this.setMaxCacheSize=e=>{if(!e||"number"!=typeof e)throw Error(`New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`);this._maxCacheSize=e},this.isCacheable=e=>this.getBytesAvailable()+Array.from(this._imageCache.values()).reduce((e,t)=>t.sharedCacheKey?e:e+t.sizeInBytes,0)>=e,this.getMaxCacheSize=()=>this._maxCacheSize,this.getCacheSize=()=>this._imageCacheSize,this._decacheImage=(e,t=!1)=>{let r=this._imageCache.get(e);if(!r)return;if(r.sharedCacheKey&&!t)throw Error("Cannot decache an image with a shared cache key. You need to manually decache the volume first.");let{imageLoadObject:n}=r;r.image?.referencedImageId&&this._referencedImageIdToImageIdCache.delete(r.image.referencedImageId),n?.cancelFn&&n.cancelFn(),n?.decache&&n.decache(),this._imageCache.delete(e)},this._decacheVolume=e=>{let t=this._volumeCache.get(e);if(!t)return;let{volumeLoadObject:r,volume:n}=t;n&&(n.cancelLoading&&n.cancelLoading(),n.imageData&&n.imageData.delete(),r.cancelFn&&r.cancelFn(),n.imageIds&&n.imageIds.forEach(t=>{let r=this._imageCache.get(t);r&&r.sharedCacheKey===e&&(r.sharedCacheKey=void 0)}),this._volumeCache.delete(e))},this.purgeCache=()=>{let e=this._imageCache.keys();for(this.purgeVolumeCache();;){let{value:t,done:r}=e.next();if(r)break;this.removeImageLoadObject(t,{force:!0}),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t})}},this.purgeVolumeCache=()=>{let e=this._volumeCache.keys();for(;;){let{value:t,done:r}=e.next();if(r)break;this.removeVolumeLoadObject(t),jq(jH,Fm.VOLUME_CACHE_VOLUME_REMOVED,{volumeId:t})}},this.getVolumeLoadObject=e=>{if(void 0===e)throw Error("getVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(t)return t.timeStamp=Date.now(),t.volumeLoadObject},this.putGeometryLoadObject=(e,t)=>{if(void 0===e)throw Error("putGeometryLoadObject: geometryId must not be undefined");if(void 0===t.promise)throw Error("putGeometryLoadObject: geometryLoadObject.promise must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometryLoadObject: geometryId already present in geometryCache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putGeometryLoadObject: geometryLoadObject.cancel must be a function");let r={loaded:!1,geometryId:e,geometryLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._geometryCache.set(e,r),t.promise.then(t=>{try{this._putGeometryCommon(e,t,r)}catch(t){throw console.debug(`Error in _putGeometryCommon for geometry ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching geometry ${e}:`,t),this._geometryCache.delete(e),t})},this.getGeometry=e=>{if(void 0===e)throw Error("getGeometry: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometry},this.removeGeometryLoadObject=e=>{if(void 0===e)throw Error("removeGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(!t)throw Error("removeGeometryLoadObject: geometryId was not present in geometryCache");this.decrementGeometryCacheSize(t.sizeInBytes),jq(jH,Fm.GEOMETRY_CACHE_GEOMETRY_REMOVED,{geometry:t,geometryId:e}),this._decacheGeometry(e)},this._decacheGeometry=e=>{let t=this._geometryCache.get(e);if(!t)return;let{geometryLoadObject:r}=t;r.cancelFn&&r.cancelFn(),r.decache&&r.decache(),this._geometryCache.delete(e)},this.incrementGeometryCacheSize=e=>{this._geometryCacheSize+=e},this.decrementGeometryCacheSize=e=>{this._geometryCacheSize-=e},this.getImageByReferencedImageId=e=>{let t=this._referencedImageIdToImageIdCache.get(e);if(t)return this._imageCache.get(t)?.image},this.getImage=(e,t=B1.FAR_REPLICATE)=>{if(void 0===e)throw Error("getImage: imageId must not be undefined");let r=this._imageCache.get(e);if(r&&(r.timeStamp=Date.now(),!(r.image?.imageQualityStatus<t)))return r.image},this.getVolume=(e,t=!1)=>{if(void 0===e)throw Error("getVolume: volumeId must not be undefined");let r=this._volumeCache.get(e);return r?(r.timeStamp=Date.now(),r.volume):t?[...this._volumeCache.values()].find(t=>t.volumeId.includes(e))?.volume:void 0},this.getVolumes=()=>Array.from(this._volumeCache.values()).map(e=>e.volume),this.filterVolumesByReferenceId=e=>this.getVolumes().filter(t=>t.referencedVolumeId===e),this.removeImageLoadObject=(e,{force:t=!1}={})=>{if(void 0===e)throw Error("removeImageLoadObject: imageId must not be undefined");let r=this._imageCache.get(e);if(!r)throw Error("removeImageLoadObject: imageId was not present in imageCache");this._decacheImage(e,t),this.incrementImageCacheSize(-r.sizeInBytes),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{image:r,imageId:e})},this.removeVolumeLoadObject=e=>{if(void 0===e)throw Error("removeVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(!t)throw Error("removeVolumeLoadObject: volumeId was not present in volumeCache");jq(jH,Fm.VOLUME_CACHE_VOLUME_REMOVED,{volume:t,volumeId:e}),this._decacheVolume(e)},this.incrementImageCacheSize=e=>{this._imageCacheSize+=e},this.decrementImageCacheSize=e=>{this._imageCacheSize-=e},this.getGeometryLoadObject=e=>{if(void 0===e)throw Error("getGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometryLoadObject}}generateVolumeId(e){let t=e.map(q5).sort(),r=0x811c9dc5;for(let e of t){let t=function(e){let t=0x811c9dc5;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t+=(t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24);return(t>>>0).toString(36)}(e);for(let e=0;e<t.length;e++)r^=t.charCodeAt(e),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24)}return`volume-${(r>>>0).toString(36)}`}getImageIdsForVolumeId(e){return Array.from(this._imageIdsToVolumeIdCache.entries()).filter(([t,r])=>r===e).map(([e])=>e)}getBytesAvailable(){return this.getMaxCacheSize()-this.getCacheSize()}decacheIfNecessaryUntilBytesAvailable(e,t){let r=this.getBytesAvailable();if(r>=e)return r;let n=Array.from(this._imageCache.values()).filter(e=>!e.sharedCacheKey);n.sort(function(e,t){return e.timeStamp>t.timeStamp?1:e.timeStamp<t.timeStamp?-1:0});let a=n.map(e=>e.imageId),i=a;for(let n of(t&&(i=a.filter(e=>!t.includes(e))),i))if(this.removeImageLoadObject(n),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{imageId:n}),(r=this.getBytesAvailable())>=e)return r;for(let t of a)if(this.removeImageLoadObject(t),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t}),(r=this.getBytesAvailable())>=e)return r}_putImageCommon(e,t,r){if(!this._imageCache.has(e))return void console.warn("The image was purged from the cache before it completed loading.");if(!t)return void console.warn("Image is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putImageCommon: image.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putImageCommon: image.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(Fm.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.image=t,r.sizeInBytes=t.sizeInBytes,this.incrementImageCacheSize(r.sizeInBytes),t.referencedImageId&&this._referencedImageIdToImageIdCache.set(t.referencedImageId,e),jq(jH,Fm.IMAGE_CACHE_IMAGE_ADDED,{image:r}),r.sharedCacheKey=t.sharedCacheKey}async putImageLoadObject(e,t){if(void 0===e)throw console.error("putImageLoadObject: imageId must not be undefined"),Error("putImageLoadObject: imageId must not be undefined");if(void 0===t.promise)throw console.error("putImageLoadObject: imageLoadObject.promise must not be undefined"),Error("putImageLoadObject: imageLoadObject.promise must not be undefined");let r=this._imageCache.get(e);if(r?.imageLoadObject)throw console.warn(`putImageLoadObject: imageId ${e} already in cache`),Error("putImageLoadObject: imageId already in cache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw console.error("putImageLoadObject: imageLoadObject.cancel must be a function"),Error("putImageLoadObject: imageLoadObject.cancel must be a function");let n={...r,loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._imageCache.set(e,n),t.promise.then(t=>{try{this._putImageCommon(e,t,n)}catch(t){throw console.debug(`Error in _putImageCommon for image ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching image ${e}:`,t),this._imageCache.delete(e),t})}putImageSync(e,t){if(void 0===e)throw Error("putImageSync: imageId must not be undefined");if(this._imageCache.has(e))throw Error("putImageSync: imageId already in cache");let r={loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._imageCache.set(e,r);try{this._putImageCommon(e,t,r)}catch(t){throw this._imageCache.delete(e),t}}getImageLoadObject(e){if(void 0===e)throw Error("getImageLoadObject: imageId must not be undefined");let t=this._imageCache.get(e);if(t)return t.timeStamp=Date.now(),t.imageLoadObject}isLoaded(e){let t=this._imageCache.get(e);return!!t&&t.loaded}getVolumeContainingImageId(e){let t=Array.from(this._volumeCache.keys()),r=q5(e);for(let e of t){let t=this._volumeCache.get(e);if(!t)return;let{volume:n}=t;if(!n.imageIds.length)return;let a=n.getImageURIIndex(r);if(a>-1)return{volume:n,imageIdIndex:a}}}getCachedImageBasedOnImageURI(e){let t=q5(e),r=Array.from(this._imageCache.keys()).find(e=>q5(e)===t);if(r)return this._imageCache.get(r)}_putVolumeCommon(e,t,r){this._volumeCache.get(e)?(r.loaded=!0,r.volume=t,t.imageIds?.forEach(t=>{let r=this._imageCache.get(t);r&&(r.sharedCacheKey=e)}),jq(jH,Fm.VOLUME_CACHE_VOLUME_ADDED,{volume:r})):console.warn("The volume was purged from the cache before it completed loading.")}putVolumeSync(e,t){if(void 0===e)throw Error("putVolumeSync: volumeId must not be undefined");if(this._volumeCache.has(e))throw Error("putVolumeSync: volumeId already in cache");let r={loaded:!1,volumeId:e,volumeLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._volumeCache.set(e,r);try{this._putVolumeCommon(e,t,r)}catch(t){throw this._volumeCache.delete(e),t}}async putVolumeLoadObject(e,t){if(void 0===e)throw Error("putVolumeLoadObject: volumeId must not be undefined");if(void 0===t.promise)throw Error("putVolumeLoadObject: volumeLoadObject.promise must not be undefined");if(this._volumeCache.has(e))throw Error(`putVolumeLoadObject: volumeId:${e} already in cache`);if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putVolumeLoadObject: volumeLoadObject.cancel must be a function");let r={loaded:!1,volumeId:e,volumeLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._volumeCache.set(e,r),t.promise.then(t=>{try{this._putVolumeCommon(e,t,r)}catch(t){throw console.error(`Error in _putVolumeCommon for volume ${e}:`,t),this._volumeCache.delete(e),t}}).catch(t=>{throw this._volumeCache.delete(e),t})}_putGeometryCommon(e,t,r){if(!this._geometryCache.get(e))return void console.warn("The geometry was purged from the cache before it completed loading.");if(!t)return void console.warn("Geometry is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putGeometryCommon: geometry.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putGeometryCommon: geometry.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(Fm.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.geometry=t,r.sizeInBytes=t.sizeInBytes,this.incrementGeometryCacheSize(r.sizeInBytes),jq(jH,Fm.GEOMETRY_CACHE_GEOMETRY_ADDED,{geometry:r})}putGeometrySync(e,t){if(void 0===e)throw Error("putGeometrySync: geometryId must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometrySync: geometryId already in cache");let r={loaded:!1,geometryId:e,geometryLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._geometryCache.set(e,r);try{this._putGeometryCommon(e,t,r)}catch(t){throw this._geometryCache.delete(e),t}}setPartialImage(e,t,r=!1){let n=this._imageCache.get(e);if(!n){t&&this._imageCache.set(e,{image:t,imageId:e,loaded:!1,timeStamp:Date.now(),sizeInBytes:0});return}n.loaded?(n.loaded=!1,n.imageLoadObject=null,this.incrementImageCacheSize(-n.sizeInBytes),n.sizeInBytes=0):r&&(n.imageLoadObject=null),n.image=t||n.image}getImageQuality(e){let t=this._imageCache.get(e)?.image;return t?t.imageQualityStatus||B1.FULL_RESOLUTION:void 0}},$z={},$G={add:(e,t)=>{$G.addRaw(e,{...t,metadata:$e(t.metadata)})},addRaw:(e,t)=>{let r=t.type;$z[e]||($z[e]={}),$z[e][r]=t.metadata},get:(e,t)=>$z[t]?.[e],clear:()=>{$z={}}};function $H(e,t){switch(e){case"Float32Array":return Float32Array;case"Uint8Array":return Uint8Array;case"Uint32Array":return Uint32Array;case"Uint16Array":case"Int16Array":if(!t)return"Uint16Array"===e?Uint16Array:Int16Array;return console.debug(`${e} is not supported for volume rendering, switching back to Float32Array`),Float32Array;default:if(!e)return Float32Array;throw Error("TargetBuffer should be Float32Array, Uint8Array, Uint16Array, Int16Array, or Uint32Array")}}qa($G.get);let $q=[[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]],$$=[[0,-1,0],[0,1,0]],$K=[[0,-1,0],[0,1,0],[0,0,-1]],$Y=[[0,-1,0],[0,1,0],[0,0,1]];class $Z{static copyMap(e,t){for(let[r,n]of t.rows)e.rows.set(r,$e(n))}constructor(e,t,r=1){this.rows=new Map,this.height=1,this.width=1,this.depth=1,this.jMultiple=1,this.kMultiple=1,this.numComps=1,this.pixelDataConstructor=Uint8Array,this.updateScalarData=function(e){e.fill(0),this.forEach((t,r,n)=>{let{start:a,end:i,value:o}=r;for(let r=a;r<i;r++)e[t+r]=o})},this.get=e=>{let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value??this.defaultValue},this.getRun=(e,t)=>{let r=e+t*this.height;return this.rows.get(r)},this.set=(e,t)=>{if(void 0===t)return;let r=e%this.width,n=(e-r)/this.width,a=this.rows.get(n);if(!a)return void this.rows.set(n,[{start:r,end:r+1,value:t}]);let i=this.findIndex(a,r),o=a[i],l=a[i-1];if(!o){if(!l||l.value!==t||l.end!==r){a[i]={start:r,end:r+1,value:t};return}l.end++;return}let{start:s,end:d,value:u}=o;if(t===u&&r>=s)return;let c={start:r,end:r+1,value:t},h=r>s,p=h?i+1:i,m=h?o:l,f=h?a[i+1]:o;if(m?.value===t&&m?.end===r){m.end++,f?.value===t&&f.start===r+1?(m.end=f.end,a.splice(i,1)):f?.start===r&&(f.start++,f.start===f.end&&(a.splice(i,1),f=a[i],f?.start===r+1&&f.value===t&&(m.end=f.end,a.splice(i,1))));return}if(f?.value===t&&f.start===r+1){f.start--,m?.end>r&&(m.end=r,m.end===m.start&&a.splice(i,1));return}if(f?.start===r&&f.end===r+1){f.value=t;let e=a[i+1];e?.start==r+1&&e.value===t&&(a.splice(i+1,1),f.end=e.end);return}r===f?.start&&f.start++,h&&d>r+1?a.splice(p,0,c,{start:r+1,end:m.end,value:m.value}):a.splice(p,0,c),m?.end>r&&(m.end=r)},this.width=e,this.height=t,this.depth=r,this.jMultiple=e,this.kMultiple=this.jMultiple*t}toIJK(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple%this.height;return[t,r,Math.floor(e/this.kMultiple)]}toIndex([e,t,r]){return e+r*this.kMultiple+t*this.jMultiple}getRLE(e,t,r=0){let n=this.rows.get(t+r*this.height);if(!n)return;let a=this.findIndex(n,e),i=n[a];return e>=i?.start?i:void 0}has(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value!==void 0}delete(e){let t=e%this.width,r=(e-t)/this.width,n=this.rows.get(r);if(!n)return;let a=this.findIndex(n,t),i=n[a];if(!i||i.start>t)return;if(i.end===t+1){i.end--,i.start>=i.end&&(n.splice(a,1),n.length||this.rows.delete(r));return}if(i.start===t)return void i.start++;let o={value:i.value,start:t+1,end:i.end};i.end=t,n.splice(a+1,0,o)}findIndex(e,t){for(let r=0;r<e.length;r++){let{end:n}=e[r];if(t<n)return r}return e.length}forEach(e,t){let r=t?.rowModified;for(let[t,n]of this.rows)for(let a of r?[...n]:n)e(t*this.width,a,n)}forEachRow(e){for(let[t,r]of this.rows)e(t*this.width,r)}clear(){this.rows.clear()}keys(){return[...this.rows.keys()]}getPixelData(e=0,t){t?t.fill(0):t=new this.pixelDataConstructor(this.width*this.height*this.numComps);let{width:r,height:n,numComps:a}=this;for(let i=0;i<n;i++){let n=this.getRun(i,e);if(n)if(1===a)for(let e of n){let n=i*r,{start:a,end:o,value:l}=e;for(let e=a;e<o;e++)t[n+e]=l}else for(let e of n){let n=i*r*a,{start:o,end:l,value:s}=e;for(let e=o;e<l;e+=a)for(let r=0;r<a;r++)t[n+e+r]=s[r]}}return t}floodFill(e,t,r,n,a){let i=this.getRLE(e,t,r);if(!i)throw Error(`Initial point ${e},${t},${r} isn't in the RLE`);let o=[[i,t,r]],l=i.value;if(l===n)throw Error(`source (${l}) and destination (${n}) are identical`);return this.flood(o,l,n,a)}flood(e,t,r,n){let a=0,{planar:i=!0,diagonals:o=!0,singlePlane:l=!1}=n||{},s={planar:i,diagonals:o,singlePlane:l};for(;e.length;){let n=e.pop(),[i]=n;if(i.value!==t)continue;i.value=r,a+=i.end-i.start;let o=this.findAdjacents(n,s).filter(e=>e&&e[0].value===t);e.push(...o)}return a}fillFrom(e,t){for(let r=t[2][0];r<=t[2][1];r++)for(let n=t[1][0];n<=t[1][1];n++){let a,i;for(let o=t[0][0];o<=t[0][1];o++){let t=e(o,n,r);if(void 0===t){a=void 0;continue}i||(i=[],this.rows.set(n+r*this.height,i)),a&&a.value!==t&&(a=void 0),a||(a={start:o,end:o,value:t},i.push(a)),a.end++}}}findAdjacents(e,{diagonals:t=!0,planar:r=!0,singlePlane:n=!1}){let[a,i,o,l]=e,{start:s,end:d}=a,u=s>0&&this.getRLE(s-1,i,o),c=d<this.width&&this.getRLE(d,i,o),h=t?[s>0?s-1:s,d<this.width?d+1:d]:[s,d],p=[];for(let e of(u&&p.push([u,i,o]),c&&p.push([c,i,o]),l||(n?$$:$q))){let[,t,a]=e,s=t+i,d=a+o;if(s<0||s>=this.height||d<0||d>=this.depth)continue;let u=this.getRun(s,d);if(u)for(let e of u){let t=l||n&&$$||r&&a>0&&$Y||r&&a<0&&$K||$q;e.end<=h[0]||e.start>=h[1]||p.push([e,s,d,t])}}return p}}$Z.getScalarData=function(e=Uint8ClampedArray){let t=new e(this.frameSize);return this.map.updateScalarData(t),t};var $X=d(4164);class $J{constructor(e={}){this._dimensions=3,this._length=0,this._byteSize=4,this.growSize=128;const{initialSize:t=1024,dimensions:r=3,growSize:n=128}=e;this.growSize=n,this.array=new ArrayBuffer(t*r*this._byteSize),this.data=new Float32Array(this.array),this._dimensions=r}forEach(e){for(let t=0;t<this._length;t++)e(this.getPoint(t),t)}get length(){return this._length}get dimensions(){return this._dimensions}get dimensionLength(){return this._length*this._dimensions}getPoint(e){if(e<0&&(e+=this._length),e<0||e>=this._length)return;let t=this._dimensions*e;return this.data.subarray(t,t+this._dimensions)}getPointArray(e){let t=[];if(e<0&&(e+=this._length),e<0||e>=this._length)return;let r=this._dimensions*e;for(let e=0;e<this._dimensions;e++)t.push(this.data[e+r]);return t}grow(e=1,t=this.growSize){if(this.dimensionLength+e*this._dimensions<=this.data.length)return;let r=new ArrayBuffer((this.data.length+t)*this._dimensions*this._byteSize),n=new Float32Array(r);n.set(this.data),this.data=n,this.array=r}reverse(){let e=Math.floor(this._length/2);for(let t=0;t<e;t++){let e=t*this._dimensions,r=(this._length-1-t)*this._dimensions;for(let t=0;t<this._dimensions;t++){let n=this.data[e+t];this.data[e+t]=this.data[r+t],this.data[r+t]=n}}}getTypedArray(){return this.data}push(e){this.grow(1);let t=this.length*this._dimensions;for(let r=0;r<this._dimensions;r++)this.data[r+t]=e[r];this._length++}map(e){let t=[];for(let r=0;r<this._length;r++)t.push(e(this.getPoint(r),r));return t}get points(){return this.map(e=>e)}toXYZ(){let e={x:[],y:[]};this._dimensions>=3&&(e.z=[]);let{x:t,y:r,z:n}=e;return this.forEach(e=>{t.push(e[0]),r.push(e[1]),n&&n.push(e[2])}),e}static fromXYZ({x:e,y:t,z:r}){let n=$J.create3(e.length),a=0;for(let i=0;i<e.length;i++)n.data[a++]=e[i],n.data[a++]=t[i],n.data[a++]=r?r[i]:0;return n._length=e.length,n}subselect(e=10,t=0){let r=new $J({initialSize:e,dimensions:this._dimensions});for(let n=0;n<e;n++){let a=(t+Math.floor(this.length*n/e))%this.length;r.push(this.getPoint(a))}return r}static create3(e=128,t){let r=new $J({initialSize:e=Math.max(e,t?.length||0),dimensions:3});return t&&t.forEach(e=>r.push(e)),r}static create2(e=128){return new $J({initialSize:e,dimensions:2})}}function $Q(e){let t=$X.create(),r=e.getDimensions(),n=$J.create3(r[0]),a=$J.create3(r[1]),i=$J.create3(r[2]),o=e.getDirection(),l=o.slice(0,3),s=o.slice(3,6),d=o.slice(6,9),[u,c,h]=e.getSpacing(),p=e.indexToWorld([0,0,0]),m=$X.fromValues(l[0]*u,l[1]*u,l[2]*u),f=$X.fromValues(s[0]*c,s[1]*c,s[2]*c),g=$X.fromValues(d[0]*h,d[1]*h,d[2]*h),y=$X.create();for(let e=0;e<r[0];e++)n.push($X.add(y,p,$X.scale(y,m,e)));for(let e=0;e<r[1];e++)a.push($X.scale(y,f,e));for(let e=0;e<r[2];e++)i.push($X.scale(y,g,e));let v=n.getTypedArray(),b=a.getTypedArray(),w=i.getTypedArray();return(e,r=t)=>{let[n,a,i]=e,o=3*n,l=3*a,s=3*i;return r[0]=v[o]+b[l]+w[s],r[1]=v[o+1]+b[l+1]+w[s+1],r[2]=v[o+2]+b[l+2]+w[s+2],r}}let $0=[0,0,0],$1=[0,0,0],$2=new WeakMap;class $5{get id(){return this._id}constructor(e,t){this.modifiedSlices=new Set,this.boundsIJK=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],this.scalarData=null,this._scalarDataIsCachedExpansion=!1,this._sliceDataCache=null,this.getAtIJK=(e,t,r)=>this._get(e+t*this.width+r*this.frameSize),this.setAtIJK=(e,t,r,n)=>{let a=e+t*this.width+r*this.frameSize,i=this._set(a,n);return!1!==i&&(this.modifiedSlices.add(r),$5.addBounds(this.boundsIJK,[e,t,r]),this.invalidateCachedScalarExpansion()),i},this.getAtIJKPoint=([e,t,r])=>this.getAtIJK(e,t,r),this.setAtIJKPoint=([e,t,r],n)=>{this.setAtIJK(e,t,r,n)},this.getAtIndex=e=>this._get(e),this.setAtIndex=(e,t)=>{let r=this._set(e,t);if(!1!==r){let t=this.toIJK(e);this.modifiedSlices.add(t[2]),$5.addBounds(this.boundsIJK,t),this.invalidateCachedScalarExpansion()}return r},this.getMiddleSliceData=()=>{let e=Math.floor(this.dimensions[2]/2);return this.getSliceData({sliceIndex:e,slicePlane:2})},this.forEach=(e,t={})=>{let r=t.boundsIJK||this.getBoundsIJK(),n=t.isInObject||this.isInObject||(()=>!0),a=t.returnPoints||!1,i=t.imageData,o=Math.min(r[0][0],r[0][1]),l=Math.max(r[0][0],r[0][1]),s=Math.min(r[1][0],r[1][1]),d=Math.max(r[1][0],r[1][1]),u=Math.min(r[2][0],r[2][1]),c=Math.max(r[2][0],r[2][1]),h=[];if(i)return function({voxelManager:e,bounds:t,imageData:r,pointInShapeFn:n,callback:a,returnPoints:i}){let[[o,l],[s,d],[u,c]]=t,h=$Q(r),p=[0,0,0],m=[];for(let t=u;t<=c;t++){p[2]=t;for(let t=s;t<=d;t++){p[1]=t;for(let t=o;t<=l;t++){p[0]=t;let r=h(p);if(n(r,p)){let t=e.toIndex(p),n=e.getAtIndex(t);i&&m.push({value:n,index:t,pointIJK:[...p],pointLPS:r.slice()}),a?.({value:n,index:t,pointIJK:p,pointLPS:r})}}}}return m}({voxelManager:this,imageData:t.imageData,bounds:[[o,l],[s,d],[u,c]],pointInShapeFn:n,callback:e,returnPoints:a});if(this.map){if(this.map instanceof $Z)return this.rleForEach(e,t);for(let t of this.map.keys()){let r=this.toIJK(t);if(!n(null,r))continue;let i=this._get(t);a&&h.push({value:i,index:t,pointIJK:r,pointLPS:null}),e({value:i,index:t,pointIJK:r,pointLPS:null})}return h}for(let t=u;t<=c;t++){let r=t*this.frameSize;for(let i=s;i<=d;i++){let s=r+i*this.width;for(let r=o,d=s+r;r<=l;r++,d++){let o=this.getAtIndex(d),l=[r,i,t];n(null,l)&&(a&&h.push({value:o,index:d,pointIJK:l,pointLPS:null}),e({value:o,index:d,pointIJK:[r,i,t],pointLPS:null}))}}}return h},this.getSliceData=({sliceIndex:e,slicePlane:t})=>{let r,n,[a,i,o]=this.dimensions,l=a*i,s=e*l,d=this.getConstructor();if("function"!=typeof d)return new Uint8Array(0);switch(t){case 0:n=new d(r=i*o);for(let t=0;t<i;t++)for(let r=0;r<o;r++){let o=e+t*a+r*l;this.setSliceDataValue(n,t+r*i,this._get(o))}break;case 1:n=new d(r=a*o);for(let t=0;t<a;t++)for(let r=0;r<o;r++){let i=t+e*a+r*l;this.setSliceDataValue(n,t+r*a,this._get(i))}break;case 2:n=new d(r=a*i);for(let e=0;e<r;e++)this.setSliceDataValue(n,e,this._get(s+e));break;default:throw Error("Oblique plane - todo - implement as ortho normal vector")}return n},this.dimensions=e,this.width=e[0],this.frameSize=this.width*e[1],this._get=t._get,this._set=t._set,this._id=t._id||"",this._getConstructor=t._getConstructor,this.numberOfComponents=t.numberOfComponents||1,this.scalarData=t.scalarData,this._getScalarData=t._getScalarData,this._updateScalarData=t._updateScalarData}getMinMax(){let e,t;return this.forEach(({value:r})=>{let n=Array.isArray(r);if(void 0===e&&(e=n?[...r]:r,t=n?[...r]:r),n)for(let n=0;n<r.length;n++)e[n]=Math.min(e[n],r[n]),t[n]=Math.max(t[n],r[n]);else e=Math.min(e,r),t=Math.max(t,r)},{boundsIJK:this.getDefaultBounds()}),{min:e,max:t}}invalidateCachedScalarExpansion(){this._scalarDataIsCachedExpansion&&(this.scalarData=null,this._scalarDataIsCachedExpansion=!1)}toIJK(e){return[e%this.width,Math.floor(e%this.frameSize/this.width),Math.floor(e/this.frameSize)]}toIndex(e){return e[0]+e[1]*this.width+e[2]*this.frameSize}getDefaultBounds(){return this.dimensions.map(e=>[0,e-1])}getBoundsIJK(){return this.boundsIJK[0][0]<this.dimensions[0]?this.boundsIJK:this.getDefaultBounds()}rleForEach(e,t){let r=t?.boundsIJK||this.getBoundsIJK(),{isWithinObject:n}=t||{},a=this.map;if(!a)return void console.warn("No map found, you need to use a map voxel manager to use rleForEach");a.defaultValue=void 0;for(let t=r[2][0];t<=r[2][1];t++)for(let i=r[1][0];i<=r[1][1];i++){let r=a.getRun(i,t);if(r)for(let a of r){let{start:r,end:o,value:l}=a,s=this.toIndex([0,i,t]);for(let a=r;a<o;a++){let r={value:l,index:s+a,pointIJK:[a,i,t]};n?.(r)!==!1&&e(r)}}}}getScalarData(e=!1){if(this.scalarData)return this._updateScalarData?.(this.scalarData),this.scalarData;if(this._getScalarData){let t=this._getScalarData();return e&&(this.scalarData=t,this._scalarDataIsCachedExpansion=!0),t}throw Error("No scalar data available")}setScalarData(e){this.scalarData=e,this._scalarDataIsCachedExpansion=!1}getScalarDataLength(){if(this.scalarData)return this.scalarData.length;if(this._getScalarDataLength)return this._getScalarDataLength();throw Error("No scalar data available")}get sizeInBytes(){return this.getScalarDataLength()*this.bytePerVoxel}get bytePerVoxel(){return this.scalarData?this.scalarData.BYTES_PER_ELEMENT:this._get(0).BYTES_PER_ELEMENT}clearBounds(){this.boundsIJK.map(e=>{e[0]=1/0,e[1]=-1/0})}clear(){this.map?.clear(),this.clearBounds(),this.modifiedSlices.clear(),this.points?.clear()}getConstructor(){return this.scalarData?this.scalarData.constructor:this._getConstructor?this._getConstructor():(console.warn("No scalar data available or can be used to get the constructor"),Float32Array)}getArrayOfModifiedSlices(){return Array.from(this.modifiedSlices)}resetModifiedSlices(){this.modifiedSlices.clear()}setBounds(e){this.boundsIJK=e}static addBounds(e,t){e||(e=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]]),e[0][0]=Math.min(t[0],e[0][0]),e[0][1]=Math.max(t[0],e[0][1]),e[1][0]=Math.min(t[1],e[1][0]),e[1][1]=Math.max(t[1],e[1][1]),e[2][0]=Math.min(t[2],e[2][0]),e[2][1]=Math.max(t[2],e[2][1])}static getWorldToIndexTransform(e){let t=$2.get(e);if(t)return t;let r=e.direction,n=e.spacing,a=LJ.mat3.fromValues(r[0]/n[0],r[3]/n[1],r[6]/n[2],r[1]/n[0],r[4]/n[1],r[7]/n[2],r[2]/n[0],r[5]/n[1],r[8]/n[2]);return $2.set(e,a),a}static worldToIndexContinuous(e,t){let r=e.origin;$0[0]=t[0]-r[0],$0[1]=t[1]-r[1],$0[2]=t[2]-r[2];let n=LJ.vec3.transformMat3($1,$0,$5.getWorldToIndexTransform(e));return[n[0],n[1],n[2]]}static sampleAtWorldCoordinates(e,t,r,n,a=Fv.LINEAR){if(!e.voxelManager)return NaN;let i=e.origin;$0[0]=t-i[0],$0[1]=r-i[1],$0[2]=n-i[2];let o=LJ.vec3.transformMat3($1,$0,$5.getWorldToIndexTransform(e));return $5.sampleAtContinuousCoordinates(e.voxelManager,e.dimensions,o[0],o[1],o[2],a)}static sampleAtWorld(e,t,r=Fv.LINEAR){return $5.sampleAtWorldCoordinates(e,t[0],t[1],t[2],r)}static sampleAtContinuousIndex(e,t,r,n=Fv.LINEAR){return $5.sampleAtContinuousCoordinates(e,t,r[0],r[1],r[2],n)}static sampleAtContinuousCoordinates(e,t,r,n,a,i){return i===Fv.NEAREST?$5.sampleNearestAtContinuousCoordinates(e,t,r,n,a):$5.sampleLinearAtContinuousCoordinates(e,t,r,n,a)}static sampleNearestAtContinuousCoordinates(e,t,r,n,a){let i=Math.floor(r+.5-1e-6),o=Math.floor(n+.5-1e-6),l=Math.floor(a+.5-1e-6),s=t[0],d=t[1],u=t[2];return i<0||i>=s||o<0||o>=d||l<0||l>=u?NaN:Number(e.getAtIJK(i,o,l))}static sampleLinearAtContinuousCoordinates(e,t,r,n,a){let i=t[0],o=t[1],l=t[2];if(r<0||r>i-1||n<0||n>o-1||a<0||a>l-1)return NaN;let s=Math.floor(r),d=Math.floor(n),u=Math.floor(a),c=Math.min(s+1,i-1),h=Math.min(d+1,o-1),p=Math.min(u+1,l-1),m=r-s,f=n-d,g=a-u,y=1-m,v=1-f;return((Number(e.getAtIJK(s,d,u))*y+Number(e.getAtIJK(c,d,u))*m)*v+(Number(e.getAtIJK(s,h,u))*y+Number(e.getAtIJK(c,h,u))*m)*f)*(1-g)+((Number(e.getAtIJK(s,d,p))*y+Number(e.getAtIJK(c,d,p))*m)*v+(Number(e.getAtIJK(s,h,p))*y+Number(e.getAtIJK(c,h,p))*m)*f)*g}addPoint(e){let t=Array.isArray(e)?e[0]+this.width*e[1]+this.frameSize*e[2]:e;this.points||(this.points=new Set),this.points.add(t)}getPoints(){return this.points?[...this.points].map(e=>this.toIJK(e)):[]}setSliceDataValue(e,t,r){if(Array.isArray(r))for(let n=0;n<r.length;n++)e[t*r.length+n]=this.toNumber(r[n]);else e[t]=this.toNumber(r)}toNumber(e){return"number"==typeof e?e:Array.isArray(e)&&e[0]||0}static _createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r=3,id:n}){let a=new $5(e,{_get:e=>(e*=r,[t[e++],t[e++],t[e++]]),_id:n||"_createRGBScalarVolumeVoxelManager",_set:(e,r)=>{let n=!F0(t[e*=3],r);return t[e++]=r[0],t[e++]=r[1],t[e++]=r[2],n},numberOfComponents:r,scalarData:t});return a.clear=()=>{t.fill(0)},a}static createImageVolumeVoxelManager({dimensions:e,imageIds:t,numberOfComponents:r=1,id:n}){let a=e[0]*e[1],i=e[2],o=Array(i),l=-1,s=null,d=new Set,u=new Set,c=e=>{if(e<0||e>=i)return null;let r=o[e];if(void 0!==r)return r;let n=t[e];if(!n)return d.has(e)||(d.add(e),console.warn(`ImageId not found for sliceIndex: ${e}`)),o[e]=null,null;let a=$U.getImage(n);if(!a?.voxelManager)return u.has(n)||(u.add(n),console.warn(`Image not found for imageId: ${n}`)),null;let l=a.voxelManager;return o[e]=l,l},h=new $5(e,{_get:function(e){let t=Math.floor(e/a);if(t<0||t>=i)return null;let r=t===l?s:c(t);return r?(t!==l&&(l=t,s=r),r.getAtIndex(e-t*a)):null},_set:function(e,t){let r=Math.floor(e/a);if(r<0||r>=i)return!1;let n=r===l?s:c(r);if(!n)return!1;r!==l&&(l=r,s=n);let o=e-r*a,d=!F0(t,n.getAtIndex(o));return d?(n.setAtIndex(o,t),!0):d},numberOfComponents:r,_getConstructor:()=>{let e=c(0);return e?e.getConstructor():null},_id:n||"createImageVolumeVoxelManager"});return h.invalidateCache=()=>{o.fill(void 0),l=-1,s=null},h.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return h.getSliceData({sliceIndex:t,slicePlane:2})},h.clear=()=>{for(let e of t)$U.getImage(e).voxelManager.clear()},h.getRange=()=>{let e=1/0,r=-1/0;for(let n of t){let t=$U.getImage(n);t&&(t.minPixelValue<e&&(e=t.minPixelValue),t.maxPixelValue>r&&(r=t.maxPixelValue))}return e===1/0&&r===-1/0?[0,0]:[e,r]},h._getScalarDataLength=()=>{let t=c(0);return t?t.getScalarDataLength()*e[2]:0},h.getCompleteScalarDataArray=()=>{let t=h._getConstructor();if(!t)return new Uint8Array(0);let n=new t(h.getScalarDataLength()),a=e[0]*e[1]*r;for(let t=0;t<e[2];t++){let e=c(t);if(e){let i=t*a,o=e.getScalarData();if(1===r)n.set(o,i);else for(let e=0;e<o.length;e+=r)for(let t=0;t<r;t++)n[i+e+t]=o[e+t]}}return n},h.setCompleteScalarDataArray=n=>{let a=e[0]*e[1]*r,i=h._getConstructor(),o=1/0,l=-1/0;for(let r=0;r<e[2];r++){let e=c(r);if(e&&i){let s=r*a,d=s+a,u=new i(a);if(u.set(n.subarray(s,d)),e.scalarData)e.scalarData.set(u),e.modifiedSlices.add(r);else for(let t=0;t<a;t++)e.setAtIndex(t,u[t]);for(let e=0;e<u.length;e++){let t=u[e];o=Math.min(o,t),l=Math.max(l,t)}let c=t[r],h=$U.getImage(c);h&&(h.minPixelValue=o,h.maxPixelValue=l)}}for(let t=0;t<e[2];t++)h.modifiedSlices.add(t);h.boundsIJK=[[0,e[0]-1],[0,e[1]-1],[0,e[2]-1]]},h}static createScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}){if(3!==e.length)throw Error("Dimensions must be provided as [number, number, number] for [width, height, depth]");if(!r&&((r=t.length/e[0]/e[1]/e[2])>4||r<1||2===r))throw Error(`Number of components ${r} must be 1, 3 or 4`);return r>1?$5._createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}):$5._createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:n})}static createScalarDynamicVolumeVoxelManager({imageIdGroups:e,dimensions:t,dimensionGroupNumber:r=1,timePoint:n=0,numberOfComponents:a=1,id:i}){let o=0;if(void 0!==r?o=r-1:void 0!==n&&(console.warn("Warning: timePoint parameter is deprecated. Please use dimensionGroupNumber instead. timePoint is zero-based while dimensionGroupNumber starts at 1."),o=n),!a){let r=$U.getImage(e[0][0]);if(!r)throw Error("Unable to determine number of components: No image found");if((a=r.getPixelData().length/(t[0]*t[1]))>4||a<1||2===a)throw Error(`Number of components ${a} must be 1, 3 or 4`)}let l=e.map(e=>$5.createImageVolumeVoxelManager({dimensions:t,imageIds:e,numberOfComponents:a,id:i})),s=new $5(t,{_get:e=>l[o]._get(e),_set:(e,t)=>l[o]._set(e,t),numberOfComponents:a,_id:i||"createScalarDynamicVolumeVoxelManager"});return s.getScalarDataLength=()=>l[o].getScalarDataLength(),s.getConstructor=()=>l[o].getConstructor(),s.getRange=()=>l[o].getRange(),s.getMiddleSliceData=()=>l[o].getMiddleSliceData(),s.setTimePoint=e=>{console.warn("Warning: setTimePoint is deprecated. Please use setDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),s.setDimensionGroupNumber(e+1)},s.setDimensionGroupNumber=e=>{o=e-1,s._get=e=>l[o]._get(e),s._set=(e,t)=>l[o]._set(e,t)},s.getAtIndexAndTimePoint=(e,t)=>(console.warn("Warning: getAtIndexAndTimePoint is deprecated. Please use getAtIndexAndDimensionGroup instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),s.getAtIndexAndDimensionGroup(e,t+1)),s.getAtIndexAndDimensionGroup=(e,t)=>l[t-1]._get(e),s.getTimePointScalarData=e=>(console.warn("Warning: getTimePointScalarData is deprecated. Please use getDimensionGroupScalarData instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),s.getDimensionGroupScalarData(e+1)),s.getDimensionGroupScalarData=e=>l[e-1].getCompleteScalarDataArray(),s.getCurrentTimePointScalarData=()=>(console.warn("Warning: getCurrentTimePointScalarData is deprecated. Please use getCurrentDimensionGroupScalarData instead."),s.getCurrentDimensionGroupScalarData()),s.getCurrentDimensionGroupScalarData=()=>l[o].getCompleteScalarDataArray(),s.getCurrentTimePoint=()=>(console.warn("Warning: getCurrentTimePoint is deprecated. Please use getCurrentDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),o),s.getCurrentDimensionGroupNumber=()=>o+1,s}static createImageVoxelManager({width:e,height:t,scalarData:r,numberOfComponents:n=1,id:a}){let i=[e,t,1];if(!n&&((n=r.length/e/t)>4||n<1||2===n))throw Error(`Number of components ${n} must be 1, 3 or 4`);return n>1?$5._createRGBScalarVolumeVoxelManager({dimensions:i,scalarData:r,numberOfComponents:n,id:a}):$5._createNumberVolumeVoxelManager({dimensions:i,scalarData:r,id:a})}static _createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:r}){let n=new $5(e,{_get:e=>t[e],_set:(e,r)=>{let n=t[e]!==r;return t[e]=r,n},_getConstructor:()=>t.constructor,_id:r||"_createNumberVolumeVoxelManager"});return n.scalarData=t,n.clear=()=>{n.scalarData.fill(0)},n.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return n.getSliceData({sliceIndex:t,slicePlane:2})},n}static createMapVoxelManager({dimension:e,id:t}){let r=new Map,n=new $5(e,{_get:r.get.bind(r),_set:(e,t)=>r.set(e,t)&&!0,_id:t||"createMapVoxelManager"});return n.map=r,n}static createHistoryVoxelManager(e,t){let r=new Map,{dimensions:n}=e,a=new $5(n,{_get:e=>r.get(e),_set:function(e,t){if(r.has(e))t===r.get(e)&&r.delete(e);else{let n=this.sourceVoxelManager.getAtIndex(e);if(n===t)return!1;r.set(e,n)}this.sourceVoxelManager.setAtIndex(e,t)},_id:t||"createHistoryVoxelManager"});return a.map=r,a.scalarData=e.scalarData,a.sourceVoxelManager=e,a}static createRLEHistoryVoxelManager(e,t){let{dimensions:r}=e,n=new $Z(r[0],r[1],r[2]),a=new $5(r,{_get:e=>n.get(e),_set:function(e,t){let r=n.get(e);if(void 0===r){let r=this.sourceVoxelManager.getAtIndex(e);if(r===t||void 0===r&&0===t||null===t)return!1;n.set(e,r??0)}else(t===r||null===t)&&(n.delete(e),t=r);this.sourceVoxelManager.setAtIndex(e,t)},_getScalarData:$Z.getScalarData,_updateScalarData:e=>(n.updateScalarData(e),e),_id:t||"createRLEHistoryVoxelManager"});return a.map=n,a.sourceVoxelManager=e,a}static createLazyVoxelManager({dimensions:e,planeFactory:t,id:r}){let n=new Map,[a,i]=e,o=a*i,l=new $5(e,{_get:e=>n.get(Math.floor(e/o))[e%o],_set:(e,r)=>{let l=Math.floor(e/o),s=n.get(l);return s||(s=t(a,i),n.set(l,s)),s[e%o]=r,!0},_id:r||"createLazyVoxelManager"});return l.map=n,l}static createRLEVolumeVoxelManager({dimensions:e,id:t}){let[r,n,a]=e,i=new $Z(r,n,a),o=new $5(e,{_get:e=>i.get(e),_set:(e,t)=>(i.set(e,t),!0),_getScalarData:$Z.getScalarData,_updateScalarData:e=>(i.updateScalarData(e),e),_id:t||"createRLEVolumeVoxelManager"});return o.map=i,o.getPixelData=i.getPixelData.bind(i),o}static createRLEImageVoxelManager({dimensions:e,id:t}){let[r,n]=e;return $5.createRLEVolumeVoxelManager({dimensions:[r,n,1],id:t})}static addInstanceToImage(e){let{width:t,height:r}=e,n=e.voxelManager.getScalarData();if(n.length>=t*r){e.voxelManager=$5.createScalarVolumeVoxelManager({dimensions:[t,r,1],scalarData:n});return}e.voxelManager=$5.createRLEVolumeVoxelManager({dimensions:[t,r,1]}),e.getPixelData=e.voxelManager.getPixelData,e.sizeInBytes=5120}}let $3=new jT("imageLoadPool");$3.grabDelay=0,$3.setMaxSimultaneousRequests(Ff.Interaction,1e3),$3.setMaxSimultaneousRequests(Ff.Thumbnail,1e3),$3.setMaxSimultaneousRequests(Ff.Prefetch,1e3);let $4={};function $8(e,t){let r=!t.ignoreCache&&$U.getImageLoadObject(e);if(r)return $6(r.promise,e),r;let n=!t.ignoreCache&&$U.getImage(e,t.retrieveOptions?.imageQualityStatus??B1.FULL_RESOLUTION);if(n){let t={promise:Promise.resolve(n)};return $6(t.promise,e),t}let a=e.split(":")[0],i=$4[a]||b;if(!i)throw Error(`loadImageFromImageLoader: No image loader found for scheme '${a}'`);let o=i(e,t);return $6(o.promise,e),o}function $6(e,t){Promise.resolve(e).then(e=>{(function(e){if(!e.voxelManager){let{width:t,height:r,numberOfComponents:n}=e,a=$5.createImageVoxelManager({scalarData:e.getPixelData(),width:t,height:r,numberOfComponents:n});e.voxelManager=a,e.getPixelData=()=>a.getScalarData(),delete e.imageFrame.pixelData}})(e),jq(jH,Fm.IMAGE_LOADED,{image:e})}).catch(e=>{jq(jH,Fm.IMAGE_LOAD_FAILED,{imageId:t,error:e})})}function $9(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw Error("loadAndCacheImage: parameter imageId must not be undefined");let r=$8(e,t);return $U.getImageLoadObject(e)||$U.putImageLoadObject(e,r),r.promise}function $7(e,t){let r=$u(e);return r.invert(),r.transformPoint(t)}let Ke={};function Kt(e,t){if(null==e)throw Error(t)}function Kr(e,t=null){return(Kt(e,"getImageSize: parameter image must not be undefined"),Kt(e.width,"getImageSize: parameter image must have width"),Kt(e.height,"getImageSize: parameter image must have height"),null!=t&&0!==t&&180!==t)?{height:e.width,width:e.height}:{width:e.width,height:e.height}}function Kn(e,t,r=null){Kt(e,"getImageScale: parameter canvas must not be undefined"),Kt(t,"getImageScale: parameter image must not be undefined");let n=Kr(t,r),a=t.rowPixelSpacing||1,i=t.columnPixelSpacing||1,o=1,l=1;a<i?l=i/a:o=a/i;let s=e.height/n.height/o,d=e.width/n.width/l;return{verticalScale:s,horizontalScale:d,scaleFactor:Math.min(d,s)}}function Ka(e,t,r,n){let a;if(void 0===e)throw Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return Object.assign({},{scale:1,translation:{x:0,y:0},voi:{windowWidth:void 0,windowCenter:void 0,voiLUTFunction:FE.LINEAR},invert:!1,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:void 0,voiLUT:void 0,colormap:void 0,labelmap:!1,displayedArea:{tlhc:{x:1,y:1},brhc:{x:1,y:1},rowPixelSpacing:1,columnPixelSpacing:1,presentationSizeMode:"NONE"}},Ke);let i=Kn(e,t,0).scaleFactor;return"PT"===r&&t.isPreScaled?a={windowWidth:5,windowCenter:2.5}:void 0!==t.windowWidth&&void 0!==t.windowCenter&&(a={windowWidth:Array.isArray(t.windowWidth)?t.windowWidth[0]:t.windowWidth,windowCenter:Array.isArray(t.windowCenter)?t.windowCenter[0]:t.windowCenter}),{scale:i,translation:{x:0,y:0},voi:a,invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,modality:r,voiLUT:t.voiLUT,colormap:void 0!==n?n:t.colormap,displayedArea:{tlhc:{x:1,y:1},brhc:{x:t.columns,y:t.rows},rowPixelSpacing:void 0===t.rowPixelSpacing?1:t.rowPixelSpacing,columnPixelSpacing:void 0===t.columnPixelSpacing?1:t.columnPixelSpacing,presentationSizeMode:"NONE"}}}function Ki(e,t){return $u(e).transformPoint(t)}function Ko(e,t=!1){let r=e.canvas.width,n=e.canvas.height;if(!function(e){let{canvas:t}=e,{clientWidth:r,clientHeight:n}=t;(t.width!==r||t.height!==n)&&(t.width=r,t.height=n)}(e),void 0!==e.image){let a,i,o,l,s,d;if(t||(a=e.viewport.scale,o=Math.round((i=Kr(e.image,e.viewport.rotation)).width*a),l=Math.round(i.height*a),s=e.viewport.translation.x,d=e.viewport.translation.y,o===r&&l<=n||o<=r&&l===n&&0===s&&0===d))!function(e){let{image:t}=e;e.viewport.scale=Kn(e.canvas,t,e.viewport.rotation).scaleFactor,e.viewport.translation.x=0,e.viewport.translation.y=0}(e);else{let t,a,i;t=e.viewport.scale,a=e.canvas.width,i=Math.sqrt(a/r*(e.canvas.height/n)),e.viewport.scale=i*t}}}let Kl=[{id:"initialImages",retrieveType:"single"}],Ks=[{offset:-1,imageQualityStatus:B1.ADJACENT_REPLICATE},{offset:1,imageQualityStatus:B1.ADJACENT_REPLICATE},{offset:2,imageQualityStatus:B1.FAR_REPLICATE}],Kd=[{id:"initialImages",positions:[.5,0,-1],retrieveType:"default",requestType:Ff.Thumbnail,priority:5,nearbyFrames:Ks},{id:"quarterThumb",decimate:4,offset:3,requestType:Ff.Thumbnail,retrieveType:"multipleFast",priority:6,nearbyFrames:Ks},{id:"halfThumb",decimate:4,offset:1,priority:7,requestType:Ff.Thumbnail,retrieveType:"multipleFast",nearbyFrames:Ks},{id:"quarterFull",decimate:4,offset:2,priority:8,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"halfFull",decimate:4,offset:0,priority:9,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"threeQuarterFull",decimate:4,offset:1,priority:10,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"finalFull",decimate:4,offset:3,priority:11,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"errorRetrieve"}];class Ku{constructor(e){this.name=e||"unknown"}static as(e){if(e.iterator)return e.iterator;let t=new Ku("as iterator");return e.then(e=>{try{t.add(e,!0)}catch(e){t.reject(e)}},e=>{t.reject(e)}),t}add(e,t=!1){this.nextValue=e,this.done||=t,this.waiting&&(this.waiting.resolve(e),this.waiting=void 0)}resolve(){this.done=!0,this.waiting&&(this.waiting.resolve(this.nextValue),this.waiting=void 0)}reject(e){this.rejectReason=e,this.waiting?.reject(e)}getRecent(){if(this.rejectReason)throw this.rejectReason;return this.nextValue}async *[Symbol.asyncIterator](){for(;!this.done;){if(this.rejectReason)throw this.rejectReason;if(void 0!==this.nextValue&&(yield this.nextValue,this.done))break;this.waiting||(this.waiting={},this.waiting.promise=new Promise((e,t)=>{this.waiting.resolve=e,this.waiting.reject=t})),await this.waiting.promise}yield this.nextValue}async forEach(e,t){let r=0;try{for await(let n of this){let{done:a}=this;try{await e(n,a,r),r++}catch(e){if(!a){console.warn("Caught exception in intermediate value",e);continue}if(t)t(e,a);else throw e}}}catch(e){if(t)t(e,!0);else throw e}}generate(e,t){return e(this,this.reject.bind(this)).then(()=>{this.done||this.resolve()},e=>{this.reject(e),t?t(e):console.warn("Couldn't process because",e)})}async nextPromise(){for await(let e of this)if(e)return e;return this.nextValue}async donePromise(){for await(let e of this);return this.nextValue}getNextPromise(){let e=this.nextPromise();return e.iterator=this,e}getDonePromise(){let e=this.donePromise();return e.iterator=this,e}}class Kc{constructor(e){this.stages=e.stages||Kl,this.retrieveOptions=e.retrieveOptions||{}}loadImages(e,t){return new Kh(this,e,t).loadImages()}}Kc.createProgressive=Kp,Kc.interleavedRetrieveStages={stages:Kd},Kc.singleRetrieveStages={stages:Kl},Kc.sequentialRetrieveStages={stages:[{id:"lossySequential",retrieveType:"singleFast"},{id:"finalSequential",retrieveType:"singleFinal"}]};class Kh{constructor(e,t,r){this.outstandingRequests=0,this.stageStatusMap=new Map,this.displayedIterator=new Ku("displayed"),this.stages=e.stages,this.retrieveOptions=e.retrieveOptions,this.imageIds=t,this.listener=r}async loadImages(){let e=this.createStageRequests();for(let t of(this.outstandingRequests=e.length,e))this.addRequest(t);return 0===this.outstandingRequests?Promise.resolve(null):this.displayedIterator.getDonePromise()}sendRequest(e,t){let{imageId:r,next:n}=e,a=(t,a)=>{this.listener.errorCallback(r,l||!n,t),a&&this.updateStageStatus(e.stage,t)},i=(t.loader||$9)(r,t),o=Ku.as(i),l=!1;return o.forEach(async(t,n)=>{let a=$U.getImageQuality(r);if(!t)return void console.warn("No image retrieved",r);let{imageQualityStatus:i}=t;(l||=i===B1.FULL_RESOLUTION,void 0!==a&&a>i)?this.updateStageStatus(e.stage,null,!0):(this.listener.successCallback(r,t),this.displayedIterator.add(t),n&&this.updateStageStatus(e.stage),function(e,t,r){if(t?.nearbyRequests?.length)for(let n of t.nearbyRequests)try{let{itemId:t,imageQualityStatus:a}=n,i=$U.getImageQuality(t);if(void 0!==i&&i>=a)continue;let o={...r,imageId:t,imageQualityStatus:a};$U.setPartialImage(t,o),e.successCallback(t,o)}catch(e){console.warn("Couldn't fill nearby item ",n.itemId,e)}}(this.listener,e,t))},a).finally(()=>{if(!l&&n)$U.setPartialImage(r,void 0,!0),this.addRequest(n,t.streamingData);else{l||this.listener.errorCallback(r,!0,"Couldn't decode"),this.outstandingRequests--;for(let e=n;e;e=e.next)this.updateStageStatus(e.stage,null,!0)}this.outstandingRequests<=0&&this.displayedIterator.resolve()}),o.getDonePromise().catch(e=>null)}addRequest(e,t={}){let{imageId:r,stage:n}=e,a=this.listener.getLoaderImageOptions(r);if(!a)return;let{retrieveType:i="default"}=n,{retrieveOptions:o}=this,l=o[i]||o.default,s={...a,retrieveType:i,retrieveOptions:l,streamingData:t},d=n.priority??-5,u=n.requestType||Ff.Interaction;$3.addRequest(this.sendRequest.bind(this,e,s),u,{imageId:r},d)}updateStageStatus(e,t,r=!1){let{id:n}=e,a=this.stageStatusMap.get(n);if(a&&(a.imageLoadPendingCount--,t?a.imageLoadFailedCount++:!r&&a.totalImageCount++,r||a.stageStartTime||(a.stageStartTime=Date.now()),!a.imageLoadPendingCount)){let{imageLoadFailedCount:e,totalImageCount:t,stageStartTime:r=Date.now(),startTime:i}=a,o={stageId:n,numberOfFailures:e,numberOfImages:t,stageDurationInMS:r?Date.now()-r:null,startDurationInMS:Date.now()-i};jq(jH,Fm.IMAGE_RETRIEVAL_STAGE,o),this.stageStatusMap.delete(n)}}createStageRequests(){let e=[],t=new Map,r=(r,n)=>{let a=n<0?this.imageIds.length+n:n<1?Math.floor((this.imageIds.length-1)*n):n,i=this.imageIds[a];if(!i)throw Error(`No value found to add to requests at ${n}`);let o={imageId:i,stage:r,index:a,nearbyRequests:this.findNearbyRequests(a,r)};this.addStageStatus(r);let l=t.get(i);l?l.next=o:e.push(o),t.set(i,o)};for(let e of this.stages)(e.positions||function(e,t,r=0){let n=[];for(let a=r;a<e.length;a+=t)n.push(a);return n}(this.imageIds,e.decimate||1,e.offset??0)).forEach(t=>{r(e,t)});return e}findNearbyRequests(e,t){let r=[];if(!t.nearbyFrames)return r;for(let n of t.nearbyFrames){let t=e+n.offset;t<0||t>=this.imageIds.length||r.push({itemId:this.imageIds[t],imageQualityStatus:n.imageQualityStatus,index:t})}return r}addStageStatus(e){let{id:t}=e,r=this.stageStatusMap.get(t)||{stageId:t,startTime:Date.now(),stageStartTime:null,totalImageCount:0,imageLoadFailedCount:0,imageLoadPendingCount:0};return r.imageLoadPendingCount++,this.stageStatusMap.set(t,r),r}}function Kp(e){return new Kc(e)}function Km(e,t){let{hflip:r,vflip:n,rotation:a}=t;if(e.x*=r?-1:1,e.y*=n?-1:1,0!==a){let t=a*Math.PI/180,r=Math.cos(t),n=Math.sin(t),i=e.x*r-e.y*n,o=e.x*n+e.y*r;e.x=i,e.y=o}return e}function Kf(e,t){let{direction:r,spacing:n}=e,a=r.slice(0,3),i=r.slice(3,6),o=r.slice(6,9),l=[LJ.vec3.dot(a,t),LJ.vec3.dot(i,t),LJ.vec3.dot(o,t)],s=LJ.vec3.create();return LJ.vec3.set(s,l[0]*n[0],l[1]*n[1],l[2]*n[2]),LJ.vec3.length(s)}let Kg=jA.getLogger("utilities","getClosestImageId");function Ky(e,t,r,n){let a,i,{direction:o,spacing:l,imageIds:s}=e,{ignoreSpacing:d=!1}=n||{};if(!s?.length)return;let u=o.slice(6,9);if(Math.abs(LJ.vec3.dot(u,r))<1-B7)return;d||(a=Kf({direction:o,spacing:l},r)/2);let c=1/0;for(let e=0;e<s.length;e++){let n=s[e],o=qd(B2.IMAGE_PLANE,n);if(!o?.imagePositionPatient){Kg.warn(`Missing imagePositionPatient for imageId: ${n}`);continue}let{imagePositionPatient:l}=o,u=LJ.vec3.create();LJ.vec3.sub(u,t,l);let h=Math.abs(LJ.vec3.dot(u,r));d?h<c&&(c=h,i=n):h<a&&h<c&&(c=h,i=n)}return void 0===i&&Kg.warn("No imageId found within the specified criteria (half spacing or absolute closest)."),i}function Kv(e,t,r,n){let a=LJ.vec3.clone(e);if(r&&LJ.vec3.negate(a,a),t){var i;let e,t,r=LJ.vec3.cross(LJ.vec3.create(),n,a);LJ.vec3.normalize(r,r),i=a,e=LJ.vec3.dot(i,r),t=LJ.vec3.scale(LJ.vec3.create(),r,2*e),a=LJ.vec3.sub(LJ.vec3.create(),i,t)}return a}function Kb(){return j3?.rendering?.renderingEngineMode===B5.ContextPool}var Kw={FLAT:0,GOURAUD:1,PHONG:2},Kx={POINTS:0,WIREFRAME:1,SURFACE:2},KC={Shading:Kw,Representation:Kx,Interpolation:Kw},Kk={CLAMP_TO_EDGE:0,REPEAT:1,MIRRORED_REPEAT:2},KM={NEAREST:0,LINEAR:1,NEAREST_MIPMAP_NEAREST:2,NEAREST_MIPMAP_LINEAR:3,LINEAR_MIPMAP_NEAREST:4,LINEAR_MIPMAP_LINEAR:5},KS={Wrap:Kk,Filter:KM},KE=new Float32Array(1),KT=new Int32Array(KE.buffer),KI={fromHalf:function(e){let t=(32768&e)>>15,r=(31744&e)>>10,n=1023&e;return 0===r?(t?-1:1)*6103515625e-14*(n/1024):31===r?n?NaN:1/0*(t?-1:1):(t?-1:1)*2**(r-15)*(1+n/1024)},toHalf:function(e){KE[0]=e;let t=KT[0],r=t>>16&32768,n=t>>12&2047,a=t>>23&255;return a<103?r:a>142?(r|=31744,r|=+(255!==a)&&8388607&t):a<113?(n|=2048,r|=(n>>114-a)+(n>>113-a&1)):(r|=a-112<<10|n>>1,r+=1&n)}},{vtkErrorMacro:KP}=W4,KD={renderable:null,myFactory:null,children:[],visited:!1};function K_(e,t,r={}){let n;Object.assign(t,KD,r),W4.obj(e,t),W4.event(e,t,"event"),t._renderableChildMap=new Map,W4.get(e,t,["visited"]),W4.setGet(e,t,["_parent","renderable","myFactory"]),W4.getArray(e,t,["children"]),W4.moveToProtected(e,t,["parent"]),t.classHierarchy.push("vtkViewNode"),e.build=e=>{},e.render=e=>{},e.traverse=r=>{let n=e[r.getTraverseOperation()];if(n)return void n(r);e.apply(r,!0);for(let e=0;e<t.children.length;e++)t.children[e].traverse(r);e.apply(r,!1)},e.apply=(t,r)=>{let n=e[t.getOperation()];n&&n(r,t)},e.getViewNodeFor=(r,n=null)=>{if(n&&n.renderable===r)return n;if(t.renderable===r)return e;for(let e=0;e<t.children.length;++e){let n=t.children[e].getViewNodeFor(r);if(n)return n}},e.getFirstAncestorOfType=e=>t._parent?t._parent.isA(e)?t._parent:t._parent.getFirstAncestorOfType(e):null,e.getLastAncestorOfType=e=>{if(!t._parent)return null;let r=t._parent.getLastAncestorOfType(e);return r||(t._parent.isA(e)?t._parent:null)},e.addMissingNode=r=>{if(!r)return;let n=t._renderableChildMap.get(r);if(void 0!==n)return n.setVisited(!0),n;let a=e.createViewNode(r);if(a)return a.setParent(e),a.setVisited(!0),t._renderableChildMap.set(r,a),t.children.push(a),a},e.addMissingNodes=(r,n=!1)=>{let a;if(r&&r.length)for(let i=0;i<r.length;++i){let o=r[i],l=e.addMissingNode(o);n&&void 0!==l&&(void 0===a?a=t.children.lastIndexOf(l):t.children[a]!==l&&function(e,r){for(let n=0;n<t.children.length;++n){let a=(r+1+n)%t.children.length;if(t.children[a]===e)return t.children[a]=t.children[r],t.children[r]=e,!0}}(t.children,l),a++)}},e.addMissingChildren=r=>{if(r&&r.length)for(let n=0;n<r.length;++n){let a=r[n];if(-1===t.children.indexOf(a)){a.setParent(e),t.children.push(a);let r=a.getRenderable();r&&t._renderableChildMap.set(r,a)}a.setVisited(!0)}},e.removeNode=e=>{let r=t.children.findIndex(t=>t===e);if(r<0)return!1;let n=e.getRenderable();return n&&t._renderableChildMap.delete(n),e.delete(),t.children.splice(r,1),!0},e.prepareNodes=()=>{for(let e=0;e<t.children.length;++e)t.children[e].setVisited(!1)},e.setVisited=e=>{t.visited=e},e.removeUnusedNodes=()=>{let e=0;for(let r=0;r<t.children.length;++r){let n=t.children[r];if(n.getVisited())t.children[e++]=n,n.setVisited(!1);else{let e=n.getRenderable();e&&t._renderableChildMap.delete(e),n.delete()}}t.children.length=e},e.createViewNode=e=>{if(!t.myFactory)return KP("Cannot create view nodes without my own factory"),null;let r=t.myFactory.createNode(e);return r&&r.setRenderable(e),r},n=e.delete,e.delete=()=>{for(let e=0;e<t.children.length;e++)t.children[e].delete();n()}}var KA={newInstance:W4.newInstance(K_,"vtkViewNode"),extend:K_,PASS_TYPES:["Build","Render"]},{vtkWarningMacro:KO}=W4,KR={};function KN(e,t,r={}){Object.assign(t,KR,r),W4.obj(e,t),t.overrides||(t.overrides={}),t.classHierarchy.push("vtkViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=function(e){let t=[],r=0,n=e.getClassName(r++);for(;n;)t.push(n),n=e.getClassName(r++);return t}(r),a=0,i=n[a++],o=!1,l=Object.keys(t.overrides);for(;i&&!o;)-1!==l.indexOf(i)?o=!0:i=r.getClassName(a++);if(!o){var s;let t;return n.includes("vtkAbstractWidget")||n.includes("vtkWidgetRepresentation")?null:(KO((s=e.getClassName(),t=n.join(" → "),`No ${s} implementation found for ${n[0]}.
|
|
37
|
+
</svg>#colour')`}getRenderingEngine(){return jn(this.renderingEngineId)}getRenderer(){let e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow?.getRenderer(this.id)}render(){this.getRenderingEngine().renderViewport(this.id)}setOptions(e,t=!1){this.options=$e(e),this.options?.displayArea&&this.setDisplayArea(this.options?.displayArea),t&&this.render()}reset(e=!1){this.options=$e(this.defaultOptions),e&&this.render()}getSliceViewInfo(){throw Error("Method not implemented.")}flip({flipHorizontal:e,flipVertical:t}){let r=this.getDefaultImageData();if(!r)return;let n=this.getCamera(),{viewPlaneNormal:a,viewUp:i,focalPoint:o,position:l}=n,s=LJ.vec3.cross(LJ.vec3.create(),a,i),d=LJ.vec3.copy(LJ.vec3.create(),i),u=LJ.vec3.negate(LJ.vec3.create(),a),c=LJ.vec3.distance(l,o),h=$i(r.getDimensions(),r.getDirection(),a),p=[h[0],h[1],h[2]],m=r.indexToWorld(p,LJ.vec3.create()),f=this._getFocalPointForResetCamera(m,n,{resetPan:!0,resetToCenter:!1}),g=LJ.vec3.subtract(LJ.vec3.create(),o,f),y=LJ.vec3.length(g),v=e=>{let t=LJ.vec3.scale(LJ.vec3.create(),e,2*LJ.vec3.dot(g,e));return LJ.vec3.subtract(t,t,g),LJ.vec3.normalize(t,t),t};if(e){let e=v(d),t=LJ.vec3.scaleAndAdd(LJ.vec3.create(),f,e,y),r=LJ.vec3.scaleAndAdd(LJ.vec3.create(),t,u,c);this.setCamera({viewPlaneNormal:u,position:r,focalPoint:t}),this.flipHorizontal=!this.flipHorizontal}if(t){d=LJ.vec3.negate(d,i);let e=v(s),t=LJ.vec3.scaleAndAdd(LJ.vec3.create(),f,e,y),r=LJ.vec3.scaleAndAdd(LJ.vec3.create(),t,u,c);this.setCamera({focalPoint:t,viewPlaneNormal:u,viewUp:d,position:r}),this.flipVertical=!this.flipVertical}this.render()}getDefaultImageData(){let e=this.getDefaultActor();if(e&&qE(e))return e.actor.getMapper().getInputData()}getDefaultActor(){return this.getActors()[0]}getActors(){return Array.from(this._actors.values())}getActorUIDs(){return Array.from(this._actors.keys())}getActor(e){return this._actors.get(e)}getImageActor(e){let t=this.getActors(),r=t[0];return(e&&(r=t.find(t=>t.referencedId===e)),r&&qE(r))?r.actor:null}getActorUIDByIndex(e){let t=this.getActors()[e];if(t)return t.uid}getActorByIndex(e){return this.getActors()[e]}setActors(e){let t=this.getActors();this.removeAllActors(),this.addActors(e,{resetCamera:!0}),jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:e,currentActors:e})}_removeActor(e){let t=this.getActor(e);return t?(this.getRenderer().removeActor(t.actor),this._actors.delete(e),t):void console.warn(`Actor ${e} does not exist in ${this.id}, can't remove`)}removeActors(e){let t=[];e.forEach(e=>{let r=this._removeActor(e);r&&t.push(r)});let r=this.getActors();jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:[],currentActors:r})}addActors(e,t={}){let{resetCamera:r=!1}=t,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn("Viewport::addActors::Rendering engine has not been initialized or has been destroyed");if(e.forEach(e=>{this.addActor(e)}),r)this.resetCamera();else{let e=this.getViewPresentation(),t=this.getViewReference();this.resetCamera(),this.setViewReference(t),this.setViewPresentation(e)}jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:e,currentActors:this.getActors()})}addActor(e){let{uid:t,actor:r}=e,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn(`Cannot add actor UID of ${t} Rendering Engine has been destroyed`);if(!t||!r)throw Error("Actors should have uid and vtk Actor properties");if(this.getActor(t))return void console.warn(`Actor ${t} already exists for this viewport`);let a=this.getRenderer();a?.addActor(r),this._actors.set(t,Object.assign({},e)),this.updateCameraClippingPlanesAndRange(),jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:[e],currentActors:this.getActors()})}removeAllActors(){let e=this.getActors();this.getRenderer()?.removeAllViewProps(),this._actors=new Map,jq(this.element,Fm.ACTORS_CHANGED,{viewportId:this.id,removedActors:e,addedActors:[],currentActors:[]})}resetCameraNoEvent(){let e=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.resetCamera(),this._suppressCameraModifiedEvents=e}setCameraNoEvent(e){let t=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.setCamera(e),this._suppressCameraModifiedEvents=t}_getViewImageDataIntersections(e,t,r){let n=r[0],a=r[1],i=r[2],o=n*t[0]+a*t[1]+i*t[2],l=e.getBounds(),s=this._getEdges(l),d=[];for(let e of s){let[[t,r,s],[u,c,h]]=e;if(n*(u-t)+a*(c-r)+i*(h-s)==0)continue;let p=function(e,t,r){let[n,a,i]=e,[o,l,s]=t,[d,u,c,h]=r,p=o-n,m=l-a,f=s-i,g=-1*(d*n+u*a+c*i-h)/(d*p+u*m+c*f);return[p*g+n,m*g+a,f*g+i]}([t,r,s],[u,c,h],[n,a,i,o]);this._isInBounds(p,l)&&d.push(p)}return d}setInterpolationType(e,t){}setDisplayArea(e,t=!1){if(!e)return;let{storeAsInitialCamera:r,type:n}=e;r&&(this.options.displayArea=e);let{_suppressCameraModifiedEvents:a}=this;if(this._suppressCameraModifiedEvents=!0,this.setCamera(this.fitToCanvasCamera),"SCALE"===n?this.setDisplayAreaScale(e):(this.setInterpolationType(this.getProperties()?.interpolationType??Fv.LINEAR),this.setDisplayAreaFit(e)),r&&(this.initialCamera=this.getCamera()),this._suppressCameraModifiedEvents=a,!t&&!a){let t={viewportId:this.id,displayArea:e,storeAsInitialCamera:r};jq(this.element,Fm.DISPLAY_AREA_MODIFIED,t),this.setCamera(this.getCamera())}}setDisplayAreaScale(e){let{scale:t=1}=e,r=this.canvas,n=r.height,a=r.width;if(n<8||a<8)return;let i=this.getDefaultImageData().getSpacing()[1];this.setInterpolationType(Fv.NEAREST),this.setCamera({parallelScale:n*i/(2*t)}),delete e.imageArea,this.setDisplayAreaFit(e);let{focalPoint:o,position:l,viewUp:s,viewPlaneNormal:d}=this.getCamera(),u=LJ.vec3.create();if(r.height%2&&LJ.vec3.scaleAndAdd(u,u,s,.5*t*i),r.width%2){let e=LJ.vec3.cross(LJ.vec3.create(),s,d);LJ.vec3.scaleAndAdd(u,u,e,.5*t*i)}(u[0]||u[1]||u[2])&&this.setCamera({focalPoint:LJ.vec3.add(LJ.vec3.create(),o,u),position:LJ.vec3.add(LJ.vec3.create(),l,u)})}setDisplayAreaFit(e){let{imageArea:t,imageCanvasPoint:r}=e,n=window?.devicePixelRatio||1,a=this.getDefaultImageData();if(!a)return;let i=this.sWidth/n,o=this.sHeight/n,l=a.getDimensions(),s=this.worldToCanvas(a.indexToWorld([0,0,0])),d=this.worldToCanvas(a.indexToWorld([l[0],l[1],l[2]])),[u,c]=[Math.abs(d[0]-s[0]),Math.abs(d[1]-s[1])],h=this.getZoom()/this.insetImageMultiplier;if(t){let[e,r]=t,n=Math.max(Math.abs(u/i),Math.abs(c/o)),a=Math.abs(e*u/i),l=Math.abs(r*c/o);h=(a>l?n/a:n/l)*this.getZoom()/this.getZoom(this.fitToCanvasCamera),this.setZoom(this.insetImageMultiplier*h,!1)}if(r){let{imagePoint:e,canvasPoint:t=e||[.5,.5]}=r,[n,a]=t,[l,s]=e||t,d=h,p=[this.insetImageMultiplier*d*u*(.5-l)+i*(n-.5),this.insetImageMultiplier*d*c*(.5-s)+o*(a-.5)];LJ.vec2.add(p,p,this.getPan()),this.setPan(p,!1)}}getDisplayArea(){return this.options?.displayArea}resetCamera(e){let t,{resetPan:r=!0,resetZoom:n=!0,resetToCenter:a=!0,storeAsInitialCamera:i=!0,resetAspectRatio:o=!0}=e||{},l=this.getRenderer();this.setCameraNoEvent({flipHorizontal:!1,flipVertical:!1});let s=this.getCamera(),d=this.getDefaultActor();t=d&&qE(d)?d.actor.getMapper().getInputData().getBounds():l.computeVisiblePropBounds();let u=[0,0,0],c=this.getDefaultImageData(),h=this.getVtkActiveCamera(),p=h.getViewPlaneNormal(),m=h.getViewUp();if(u[0]=(t[0]+t[1])/2,u[1]=(t[2]+t[3])/2,u[2]=(t[4]+t[5])/2,c){let e=$i(c.getDimensions(),c.getDirection(),p),t=[e[0],e[1],e[2]];c.indexToWorld(t,u)}let{widthWorld:f,heightWorld:g}=c?$n(c,p,m):this._getWorldDistanceViewUpAndViewRight(t,m,p),y=[this.sWidth,this.sHeight],v=f/g/(y[0]/y[1]),b=v<1?this.insetImageMultiplier*g/2:this.insetImageMultiplier*g*v/2,w=$a.boundsRadius(t)*(this.type===Fg.VOLUME_3D?10:1),x=this.insetImageMultiplier*w,C=Math.abs(zs.dot(m,p))>.999?[-m[2],m[0],m[1]]:m,k=this._getFocalPointForResetCamera(u,s,{resetPan:r,resetToCenter:a}),M=[k[0]+x*p[0],k[1]+x*p[1],k[2]+x*p[2]];l.resetCameraClippingRange(t);let S=[-B9.MAXIMUM_RAY_DISTANCE,B9.MAXIMUM_RAY_DISTANCE];h.setPhysicalScale(w),h.setPhysicalTranslation(-k[0],-k[1],-k[2]);let E=o?this.options?.aspectRatio||[1,1]:this.getAspectRatio();this.setCamera({parallelScale:n?b:s.parallelScale,focalPoint:k,position:M,viewAngle:90,viewUp:C,clippingRange:S,aspectRatio:E,isFitViewportAfterStretch:!1});let T=this.getCamera();return this.setFitToCanvasCamera(this.getCamera()),i&&this.setInitialCamera(T),n&&this.setZoom(1,i),l.invokeEvent({type:"ResetCameraEvent",renderer:l}),this.triggerCameraModifiedEventIfNecessary(s,T),c&&this.options.displayArea&&n&&r&&a&&this.setDisplayArea(this.options.displayArea),!0}setInitialCamera(e){this.initialCamera=e}setFitToCanvasCamera(e){this.fitToCanvasCamera=e}getPan(e=this.initialCamera){if(!e)return[0,0];let t=this.getVtkActiveCamera().getFocalPoint(),r=this.canvasToWorld([0,0]),n=this.worldToCanvas(LJ.vec3.subtract([0,0,0],e.focalPoint,r)),a=this.worldToCanvas(LJ.vec3.subtract([0,0,0],t,r));return LJ.vec2.subtract([0,0],n,a)}getCurrentImageIdIndex(){throw Error("Not implemented")}getSliceIndex(){throw Error("Not implemented")}getImageData(){throw Error("Not implemented")}getViewReferenceId(e){return null}setPan(e,t=!1){let r=this.getCamera(),{focalPoint:n,position:a}=r,i=this.canvasToWorld([0,0]),o=LJ.vec2.subtract([0,0],e,this.getPan());if(1>Math.abs(o[0])&&1>Math.abs(o[1])&&!t)return;let l=LJ.vec3.subtract(LJ.vec3.create(),this.canvasToWorld(o),i),s=LJ.vec3.subtract(LJ.vec3.create(),n,l),d=LJ.vec3.subtract(LJ.vec3.create(),a,l);this.setCamera({...r,focalPoint:s,position:d},t)}getZoom(e=this.initialCamera){if(!e)return 1;let t=this.getVtkActiveCamera(),{parallelScale:r}=e;return r/t.getParallelScale()}setZoom(e,t=!1){let r=this.getCamera(),{parallelScale:n}=this.initialCamera,a=n/e;(r.parallelScale!==a||t)&&this.setCamera({...r,parallelScale:a},t)}getAspectRatio(){let{aspectRatio:e}=this.getCamera();return e??this.options?.aspectRatio??[1,1]}setAspectRatio(e,t=!0,r=!1){let n=this.getCamera();r&&(this.options.aspectRatio=e),this.setCamera({...n,aspectRatio:e,isFitViewportAfterStretch:t},r)}_getFocalPointForViewPlaneReset(e){let{focalPoint:t,viewPlaneNormal:r}=this.getCamera(),n=this._getViewImageDataIntersections(e,t,r),a=0,i=0,o=0;return n.forEach(([e,t,r])=>{a+=e,i+=t,o+=r}),[a/n.length,i/n.length,o/n.length]}getCanvas(){return this.canvas}getVtkActiveCamera(){let e=this.getRenderer();return e?e.getActiveCamera():(console.warn("No renderer found for the viewport"),null)}getCameraNoRotation(){let e=this.getVtkActiveCamera(),t=(e,t)=>e.some(e=>isNaN(e))?t:e,r=t([...e.getViewUp()],[0,1,0]),n=t([...e.getViewPlaneNormal()],[0,0,-1]);return{viewUp:r,viewPlaneNormal:n,position:t([...e.getPosition()],[0,0,1]),focalPoint:t([...e.getFocalPoint()],[0,0,0]),parallelProjection:e.getParallelProjection(),parallelScale:e.getParallelScale(),viewAngle:e.getViewAngle(),flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical,aspectRatio:e.getAspectRatio()}}getCamera(){return{...this.getCameraNoRotation(),rotation:this.getRotation()}}setAspectRatioForVTKCamera(e,t=!0){let r=this.getVtkActiveCamera();if(!t)return void r.setAspectRatio(e);let n=r.getAspectRatio()||[1,1];if(n[0]===e[0]&&n[1]===e[1])return;let a=(([e,t])=>e/t)(n),i=(([e,t])=>e/t)(e);r.setAspectRatio(e);let o=this.getDefaultImageData();if(!o)return;let l=e=>{let{widthWorld:t,heightWorld:n}=$n(o,r.getViewPlaneNormal(),r.getViewUp()),a=this.sWidth/this.sHeight,i=t*e,l=i/n>a?i/(2*a):n/2;return e<1&&(l/=e),l},s=l(i)/l(a);r.setParallelScale(r.getParallelScale()*s),this.initialCamera?.parallelScale&&(this.initialCamera={...this.initialCamera,parallelScale:this.initialCamera.parallelScale*s}),this.fitToCanvasCamera?.parallelScale&&(this.fitToCanvasCamera={...this.fitToCanvasCamera,parallelScale:this.fitToCanvasCamera.parallelScale*s})}setCamera(e,t=!1){let r=this.getVtkActiveCamera(),n=this.getCamera(),a=Object.assign({},n,e),{viewUp:i,viewPlaneNormal:o,position:l,focalPoint:s,parallelScale:d,viewAngle:u,flipHorizontal:c,flipVertical:h,clippingRange:p,aspectRatio:m,isFitViewportAfterStretch:f}=e;if(void 0!==c){let e=c&&!this.flipHorizontal||!c&&this.flipHorizontal;e&&this.flip({flipHorizontal:e})}if(void 0!==h){let e=h&&!this.flipVertical||!h&&this.flipVertical;e&&this.flip({flipVertical:e})}void 0!==i&&r.setViewUp(i),void 0!==o&&r.setDirectionOfProjection(-o[0],-o[1],-o[2]),void 0!==l&&r.setPosition(...l),void 0!==s&&r.setFocalPoint(...s),void 0!==d&&r.setParallelScale(d),void 0!==u&&r.setViewAngle(u),void 0!==p&&r.setClippingRange(p),m&&this.setAspectRatioForVTKCamera(m,f);let g=n.focalPoint,y=n.viewUp;if(g&&s||y&&i){let e=r.getViewPlaneNormal(),t=r.getViewUp(),n=!1,o=!1;if(s){let t=[s[0]-g[0],s[1]-g[1],s[2]-g[2]];n=Math.abs(zs.dot(t,e))>0}if(i&&(o=!F0(t,y)),n||o){let e=this.getDefaultActor();if(!e?.actor)return;qT(e,"vtkActor")||this.updateClippingPlanesForActors(a),(qT(e,"vtkImageSlice")||this.type===Fg.VOLUME_3D)&&this.getRenderer().resetCameraClippingRange()}}t&&this.setInitialCamera(a),this.triggerCameraModifiedEventIfNecessary(n,this.getCamera())}triggerCameraModifiedEventIfNecessary(e,t){if(!this._suppressCameraModifiedEvents&&!this.suppressEvents){let r={previousCamera:e,camera:t,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};jq(this.element,Fm.CAMERA_MODIFIED,r)}}updateCameraClippingPlanesAndRange(){let e=this.getCamera();this.updateClippingPlanesForActors(e),this.getRenderer().resetCameraClippingRange()}async updateClippingPlanesForActors(e){this.getActors().map(t=>{if(!t.actor)return;let r=t.actor.getMapper(),n=t?.clippingFilter?t?.clippingFilter.getClippingPlanes():r.getClippingPlanes();0===n.length&&t?.clippingFilter&&(n=[zx.newInstance(),zx.newInstance()]);let a=B9.MINIMUM_SLAB_THICKNESS;t.slabThickness&&(a=t.slabThickness);let{viewPlaneNormal:i,focalPoint:o}=e;this.setOrientationOfClippingPlanes(n,a,i,o),jq(this.element,Fm.CLIPPING_PLANES_UPDATED,{actorEntry:t,focalPoint:o,vtkPlanes:n,viewport:this})})}setOrientationOfClippingPlanes(e,t,r,n){if(e.length<2)return;let a=[r[0],r[1],r[2]];zs.multiplyScalar(a,t),e[0].setNormal(r);let i=[0,0,0];zs.subtract(n,a,i),e[0].setOrigin(i),e[1].setNormal(-r[0],-r[1],-r[2]);let o=[0,0,0];zs.add(n,a,o),e[1].setOrigin(o)}getClippingPlanesForActor(e){if(e||(e=this.getDefaultActor()),!e.actor)throw Error("Invalid actor entry: Actor is undefined");let t=e.actor.getMapper(),r=e?.clippingFilter?e?.clippingFilter.getClippingPlanes():t.getClippingPlanes();return 0===r.length&&e?.clippingFilter&&(r=[zx.newInstance(),zx.newInstance()]),r}_getWorldDistanceViewUpAndViewRight(e,t,r){let n=this._getCorners(e),a=this._getCorners(e),i=LJ.vec3.cross(LJ.vec3.create(),t,r),o=q6().identity().rotateFromDirections(t,[1,0,0]);n.forEach(e=>o.apply(e));let l=1/0,s=-1/0;for(let e=0;e<8;e++){let t=n[e][0];t>s&&(s=t),t<l&&(l=t)}o=q6().identity().rotateFromDirections([i[0],i[1],i[2]],[1,0,0]),a.forEach(e=>o.apply(e));let d=1/0,u=-1/0;for(let e=0;e<8;e++){let t=a[e][0];t>u&&(u=t),t<d&&(d=t)}return{widthWorld:u-d,heightWorld:s-l}}getViewReference(e){let{focalPoint:t,viewPlaneNormal:r,viewUp:n}=this.getCamera(),a=this.getFrameOfReferenceUID(),i={FrameOfReferenceUID:a,cameraFocalPoint:t,viewPlaneNormal:r,viewUp:n,sliceIndex:e?.sliceIndex??this.getSliceIndex(),planeRestriction:{FrameOfReferenceUID:a,point:e?.points?.[0]||t,inPlaneVector1:n,inPlaneVector2:LJ.vec3.cross(LJ.vec3.create(),n,r)}};return e?.points&&$t(e.points,i.planeRestriction),i}isPlaneViewable(e,t){if(e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{focalPoint:r,viewPlaneNormal:n}=this.getCamera(),{point:a,inPlaneVector1:i,inPlaneVector2:o}=e;if(t?.withOrientation)return!0;if(i&&!F0(0,LJ.vec3.dot(n,i))||o&&!F0(0,LJ.vec3.dot(n,o)))return!1;if(t?.withNavigation)return!0;let l=LJ.vec3.sub(LJ.vec3.create(),a,r);return F0(0,LJ.vec3.dot(l,n))}isReferenceViewable(e,t){if(e.planeRestriction)return this.isPlaneViewable(e.planeRestriction,t);if(e.FrameOfReferenceUID&&e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{viewPlaneNormal:r}=e,n=this.getCamera();return!r||!!F0(r,n.viewPlaneNormal)||!!F0(LJ.vec3.negate(n.viewPlaneNormal,n.viewPlaneNormal),r)||t?.withOrientation}getViewPresentation(e={rotation:!0,displayArea:!0,zoom:!0,pan:!0,aspectRatio:!0,flipHorizontal:!0,flipVertical:!0}){let t={},{rotation:r,displayArea:n,zoom:a,pan:i,flipHorizontal:o,flipVertical:l}=e;r&&(t.rotation=this.getRotation()),n&&(t.displayArea=this.getDisplayArea());let s=this.getZoom();a&&(t.zoom=s);let d=this.getAspectRatio();if(t.aspectRatio=d,i){let e=this.getPan(),[r,n]=d;t.pan=[e[0]/(s*r),e[1]/(s*n)]}return o&&(t.flipHorizontal=this.flipHorizontal),l&&(t.flipVertical=this.flipVertical),t}setViewReference(e){}setViewPresentation(e){if(!e)return;let{displayArea:t,zoom:r=this.getZoom(),pan:n,aspectRatio:a=this.getAspectRatio(),rotation:i,flipHorizontal:o=this.flipHorizontal,flipVertical:l=this.flipVertical}=e;if(t!==this.getDisplayArea()&&this.setDisplayArea(t),this.setZoom(r),this.setAspectRatio(a),n){let[e,t]=a;this.setPan([n[0]*r*e,n[1]*r*t])}void 0!==o&&o!==this.flipHorizontal&&this.flip({flipHorizontal:o}),void 0!==l&&l!==this.flipVertical&&this.flip({flipVertical:l}),i>=0&&this.setRotation(i)}_getCorners(e){return[[e[0],e[2],e[4]],[e[0],e[2],e[5]],[e[0],e[3],e[4]],[e[0],e[3],e[5]],[e[1],e[2],e[4]],[e[1],e[2],e[5]],[e[1],e[3],e[4]],[e[1],e[3],e[5]]]}_getFocalPointForResetCamera(e,t,{resetPan:r=!0,resetToCenter:n=!0}){if(n&&r)return e;if(n&&!r)return q7(t.focalPoint)?e:t.focalPoint;if(!n&&r){let r=t.focalPoint,n=t.viewPlaneNormal,a=LJ.vec3.subtract(LJ.vec3.create(),e,r),i=LJ.vec3.dot(a,n),o=LJ.vec3.scaleAndAdd(LJ.vec3.create(),e,n,-1*i);return[o[0],o[1],o[2]]}if(!r&&!n)return q7(t.focalPoint)?e:t.focalPoint}_isInBounds(e,t){let[r,n,a,i,o,l]=t,[s,d,u]=e;return!(s<r)&&!(s>n)&&!(d<a)&&!(d>i)&&!(u<o)&&!(u>l)}_getEdges(e){let[t,r,n,a,i,o,l,s]=this._getCorners(e);return[[t,r],[t,i],[t,n],[r,a],[r,o],[n,a],[n,l],[a,s],[i,l],[i,o],[o,s],[l,s]]}static boundsRadius(e){return .5*Math.sqrt((e[1]-e[0])**2+(e[3]-e[2])**2+(e[5]-e[4])**2||1)}setDataList(e){throw Error("Unsupported operation setDataList")}setDisplaySets(...e){this._displaySets=e}async mountDisplaySets(e,t){let[r]=e;if(!r?.displaySetId)throw Error(`${this.constructor.name}: setDisplaySets requires a displaySetId`);await t(r),this._displaySets=[r]}getDisplaySets(){return this._displaySets}clearDisplaySets(){this._displaySets=[]}}function $i(e,t,r){let n=[[t[0],t[1],t[2]],[t[3],t[4],t[5]],[t[6],t[7],t[8]]],a=[r[0],r[1],r[2]],i=0,o=-1;for(let e=0;e<3;e++){let t=Math.abs(LJ.vec3.dot(n[e],a));t>o&&(o=t,i=e)}let l=.001>Math.abs(o-1);return e.map((e,t)=>t===i&&l?Math.floor(e/2):(e-1)/2)}$a.CameraViewPresentation={rotation:!0,pan:!0,zoom:!0,aspectRatio:!0,displayArea:!0},$a.TransferViewPresentation={windowLevel:!0,paletteLut:!0};let $o=$a;function $l(){return window.performance?performance.now():Date.now()}function $s(e,t,r){if(r){let e,t,n,a;return e=Math.max(...r.lut).toString(2).length-8,t=r.lut[0]>>e,n=r.lut[r.lut.length-1]>>e,a=r.firstValueMapped+r.lut.length-1,function(i){return i<r.firstValueMapped?t:i>=a?n:r.lut[i-r.firstValueMapped]>>e}}return function(r){return Math.min(Math.max(((r-(t-.5))/(e-1)+.5)*255,0),255)}}class $d{constructor(){this.reset()}getMatrix(){return this.m}reset(){this.m=[1,0,0,1,0,0]}clone(){let e=new $d;return e.m[0]=this.m[0],e.m[1]=this.m[1],e.m[2]=this.m[2],e.m[3]=this.m[3],e.m[4]=this.m[4],e.m[5]=this.m[5],e}multiply(e){let t=this.m[0]*e[0]+this.m[2]*e[1],r=this.m[1]*e[0]+this.m[3]*e[1],n=this.m[0]*e[2]+this.m[2]*e[3],a=this.m[1]*e[2]+this.m[3]*e[3],i=this.m[0]*e[4]+this.m[2]*e[5]+this.m[4],o=this.m[1]*e[4]+this.m[3]*e[5]+this.m[5];this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}invert(){let e=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),t=this.m[3]*e,r=-this.m[1]*e,n=-this.m[2]*e,a=this.m[0]*e,i=e*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),o=e*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}rotate(e){let t=Math.cos(e),r=Math.sin(e),n=this.m[0]*t+this.m[2]*r,a=this.m[1]*t+this.m[3]*r,i=-(this.m[0]*r)+this.m[2]*t,o=-(this.m[1]*r)+this.m[3]*t;this.m[0]=n,this.m[1]=a,this.m[2]=i,this.m[3]=o}translate(e,t){this.m[4]+=this.m[0]*e+this.m[2]*t,this.m[5]+=this.m[1]*e+this.m[3]*t}scale(e,t){this.m[0]*=e,this.m[1]*=e,this.m[2]*=t,this.m[3]*=t}transformPoint(e){let t=e[0],r=e[1];return[t*this.m[0]+r*this.m[2]+this.m[4],t*this.m[1]+r*this.m[3]+this.m[5]]}}function $u(e,t){let r=new $d,n=e.viewport.aspectRatio;if(!e.viewport.displayedArea)return r;r.translate(e.canvas.width/2,e.canvas.height/2);let a=e.viewport.rotation;0!==a&&r.rotate(a*Math.PI/180);let[i,o,l]=function(e){if(Array.isArray(e))return[e[0]??1,e[1]??1,!0];let t=e??1;return[t,t,!1]}(e.viewport.scale),s=i,d=o,u=e.viewport.displayedArea.brhc.x-(e.viewport.displayedArea.tlhc.x-1),c=e.viewport.displayedArea.brhc.y-(e.viewport.displayedArea.tlhc.y-1);if(l);else if("NONE"===e.viewport.displayedArea.presentationSizeMode)e.image.rowPixelSpacing<e.image.columnPixelSpacing?s*=e.image.columnPixelSpacing/e.image.rowPixelSpacing:e.image.columnPixelSpacing<e.image.rowPixelSpacing&&(d*=e.image.rowPixelSpacing/e.image.columnPixelSpacing);else if(s=e.viewport.displayedArea.columnPixelSpacing,d=e.viewport.displayedArea.rowPixelSpacing,"SCALE TO FIT"===e.viewport.displayedArea.presentationSizeMode){let t=e.canvas.height/(c*d);s=d=Math.min(e.canvas.width/(u*s),t),e.viewport.displayedArea.rowPixelSpacing<e.viewport.displayedArea.columnPixelSpacing?s*=e.viewport.displayedArea.columnPixelSpacing/e.viewport.displayedArea.rowPixelSpacing:e.viewport.displayedArea.columnPixelSpacing<e.viewport.displayedArea.rowPixelSpacing&&(d*=e.viewport.displayedArea.rowPixelSpacing/e.viewport.displayedArea.columnPixelSpacing)}if(r.scale(s,d),0!==a&&r.rotate(-a*Math.PI/180),r.translate(e.viewport.translation.x,e.viewport.translation.y),0!==a&&r.rotate(a*Math.PI/180),void 0!==t&&void 0===n&&r.scale(t,t),void 0!==n&&void 0===t){let[e,t]=n;r.scale(e,t)}return e.viewport.hflip&&r.scale(-1,1),e.viewport.vflip&&r.scale(1,-1),r.translate(-u/2,-c/2),r}function $c(e,t,r){if(void 0===e)throw Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw Error("setToPixelCoordinateSystem: parameter context must not be undefined");let n=$u(e,r).getMatrix();t.setTransform(n[0],n[1],n[2],n[3],n[4],n[5])}function $h(e,t){let r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}function $p(e,t){let r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;let n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);let a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}function $m(e){let t=e.image.imageId,r=e.viewport,n=e.image.color;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedIsColor=n,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}let $f="viewport-element",$g="cornerstone-canvas";function $y(e,t=512,r=512){let n=v?v(t,r):document.createElement("canvas");return e&&(n.style.position="absolute",n.style.width="100%",n.style.height="100%",n.style.imageRendering="pixelated",n.classList.add($g),e.appendChild(n)),n}function $v(e){let t,r=`canvas.${$g}`,n=`div.${$f}`,a=e.querySelector(n)||((t=document.createElement("div")).style.position="relative",t.style.width="100%",t.style.height="100%",t.style.overflow="hidden",t.classList.add($f),e.appendChild(t),t),i=a.querySelector(r);if(i)return i;let o=$y(a),l=a.getBoundingClientRect(),s=window.devicePixelRatio||1,d=Math.ceil(l.width*s),u=Math.ceil(l.height*s);return d>0&&u>0&&(o.width=d,o.height=u,o.style.aspectRatio=`${d} / ${u}`),o}function $b(e,t){if(void 0===e)throw Error("renderColorImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("renderColorImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,$c(e,n);let a=function(e,t,r){var n;let a=e.renderingTools.lastRenderedIsColor;e.renderingTools.renderCanvas&&a||(e.renderingTools.renderCanvas=$y(null,t.width,t.height));let i=e.renderingTools.renderCanvas,{windowWidth:o,windowCenter:l}=e.viewport.voi;if((256===o||255===o)&&(128===l||127===l)&&!e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!$h(e,t)&&!r)return i;e.renderingTools.renderCanvasContext&&i.width===t.width&&i.height===t.height||$p(e,t);let s=$l(),d=(n=e.viewport,void 0!==t.cachedLut&&t.cachedLut.windowCenter===n.voi.windowCenter&&t.cachedLut.windowWidth===n.voi.windowWidth&&t.cachedLut.invert===n.invert||(!function(e,t,r,n){let a=e.maxPixelValue,i=e.minPixelValue,o=Math.min(i,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(a-o+1));let l=e.cachedLut.lutArray,s=$s(Array.isArray(t)?t[0]:t,Array.isArray(r)?r[0]:r,void 0);if(n)for(let e=i;e<=a;e++)l[e+-o]=255-s(e);else for(let e=i;e<=a;e++)l[e+-o]=s(e)}(t,n.voi.windowWidth,n.voi.windowCenter,n.invert),t.cachedLut.windowWidth=n.voi.windowWidth,t.cachedLut.windowCenter=n.voi.windowCenter,t.cachedLut.invert=n.invert),t.cachedLut.lutArray);t.stats=t.stats||{},t.stats.lastLutGenerateTime=$l()-s;let u=e.renderingTools.renderCanvasData,c=e.renderingTools.renderCanvasContext;return t.rgba?!function(e,t,r){let n=$l(),a=e.getPixelData();e.stats.lastGetPixelDataTime=$l()-n;let i=e.minPixelValue,o=0,l=0,s=a.length;if(n=$l(),i<0)for(;l<s;)r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=a[l++];else for(;l<s;)r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=a[l++];e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,d,u.data):!function(e,t,r){let n=$l(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-n;let i=e.minPixelValue,o=0,l=0,s=a.length;if(n=$l(),i<0)for(;l<s;)r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=t[a[l++]+-i],r[o++]=255;else for(;l<s;)r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=t[a[l++]],r[o++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,d,u.data),s=$l(),c.putImageData(u,0,0),t.stats.lastPutImageDataTime=$l()-s,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,l=e.viewport.displayedArea.brhc.x-i,s=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,l,s,0,0,l,s),e.renderingTools=$m(e)}function $w(e,t){return!e&&!t||!!e&&!!t&&e.id===t.id}function $x(e,t,r){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&$w(e.cachedLut.modalityLUT,t.modalityLUT)&&$w(e.cachedLut.voiLUT,t.voiLUT)&&e.cachedLut.invert===t.invert&&!r||(!function(e,t){var r;if((r=e).voiLUT&&r.voiLUT.lut&&r.voiLUT.lut.length>0||void 0!==r.voi.windowWidth&&void 0!==r.voi.windowCenter)return;let n=t.maxPixelValue*t.slope+t.intercept,a=t.minPixelValue*t.slope+t.intercept,i=n-a,o=(n+a)/2;void 0===e.voi?e.voi={windowWidth:i,windowCenter:o,voiLUTFunction:t.voiLUTFunction}:(e.voi.windowWidth=i,e.voi.windowCenter=o)}(t,e),!function(e,t,r,n,a,i){let o=e.maxPixelValue,l=e.minPixelValue,s=Math.min(l,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(o-s+1));let d=e.cachedLut.lutArray,u=function(e,t,r){if(r){let e,t,n;return e=r.lut[0],t=r.lut[r.lut.length-1],n=r.firstValueMapped+r.lut.length,a=>a<r.firstValueMapped?e:a>=n?t:r.lut[a]}return r=>r*e+t}(e.slope,e.intercept,a),c=$s(t,r,i);if(e.isPreScaled)if(n)for(let e=l;e<=o;e++)d[e+-s]=255-c(e);else for(let e=l;e<=o;e++)d[e+-s]=c(e);else if(n)for(let e=l;e<=o;e++)d[e+-s]=255-c(u(e));else for(let e=l;e<=o;e++)d[e+-s]=c(u(e))}(e,t.voi.windowWidth,t.voi.windowCenter,t.invert,t.modalityLUT,t.voiLUT),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.voiLUT=t.voiLUT,e.cachedLut.modalityLUT=t.modalityLUT),e.cachedLut.lutArray}function $C(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,$c(e,n);let a=function(e,t,r,n=!0){let a=e.renderingTools.lastRenderedIsColor;(!e.renderingTools.renderCanvas||a)&&(e.renderingTools.renderCanvas=$y(null,t.width,t.height),$p(e,t));let i=e.renderingTools.renderCanvas;if(!$h(e,t)&&!r)return i;(i.width!==t.width||i.height!==t.height)&&$p(e,t),t.stats=t.stats||{};let o=e.renderingTools.renderCanvasData,l=e.renderingTools.renderCanvasContext,s=$l();t.stats.lastLutGenerateTime=$l()-s;let{viewport:d}=e;if("PT"===d.modality&&t.isPreScaled){let{windowWidth:e,windowCenter:r}=d.voi,n=r-e/2,a=255/(r+e/2-n);!function(e,t,r){let n=$l(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-n;let i=a.length,o=3,l=0;for(n=$l();l<i;)r[o]=t(a[l++]),o+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,d.invert?e=>255-(e-n)*a:e=>(e-n)*a,o.data)}else{let e=$x(t,d,r);n?function(e,t,r){let n=$l(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-n;let i=a.length,o=e.minPixelValue,l=3,s=0;if(n=$l(),a instanceof Int16Array)if(o<0)for(;s<i;)r[l]=t[a[s++]+-o],l+=4;else for(;s<i;)r[l]=t[a[s++]],l+=4;else if(a instanceof Uint16Array)for(;s<i;)r[l]=t[a[s++]],l+=4;else if(o<0)for(;s<i;)r[l]=t[a[s++]+-o],l+=4;else for(;s<i;)r[l]=t[a[s++]],l+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-n}(t,e,o.data):function(e,t,r){let n,a=$l(),i=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-a;let o=i.length,l=e.minPixelValue,s=0,d=0;if(a=$l(),i instanceof Int16Array)if(l<0)for(;d<o;)n=t[i[d++]+-l],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else for(;d<o;)n=t[i[d++]],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else if(i instanceof Uint16Array)for(;d<o;)n=t[i[d++]],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else if(l<0)for(;d<o;)n=t[i[d++]+-l],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;else for(;d<o;)n=t[i[d++]],r[s++]=n,r[s++]=n,r[s++]=n,r[s++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-a}(t,e,o.data)}return s=$l(),l.putImageData(o,0,0),t.stats.lastPutImageDataTime=$l()-s,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,l=e.viewport.displayedArea.brhc.x-i,s=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,l,s,0,0,l,s),e.renderingTools=$m(e)}let $k=class{constructor(){this.NumberOfColors=256,this.Ramp="linear",this.TableRange=[0,255],this.HueRange=[0,.66667],this.SaturationRange=[1,1],this.ValueRange=[1,1],this.AlphaRange=[1,1],this.NaNColor=[128,0,0,255],this.BelowRangeColor=[0,0,0,255],this.UseBelowRangeColor=!0,this.AboveRangeColor=[255,255,255,255],this.UseAboveRangeColor=!0,this.InputRange=[0,255],this.Table=[]}setNumberOfTableValues(e){this.NumberOfColors=e}setRamp(e){this.Ramp=e}setTableRange(e,t){this.TableRange[0]=e,this.TableRange[1]=t}setHueRange(e,t){this.HueRange[0]=e,this.HueRange[1]=t}setSaturationRange(e,t){this.SaturationRange[0]=e,this.SaturationRange[1]=t}setValueRange(e,t){this.ValueRange[0]=e,this.ValueRange[1]=t}setRange(e,t){this.InputRange[0]=e,this.InputRange[1]=t}setAlphaRange(e,t){this.AlphaRange[0]=e,this.AlphaRange[1]=t}getColor(e){return this.mapValue(e)}build(e){let t,r,n,a;if(this.Table.length>1&&!e)return;this.Table=[];let i=this.NumberOfColors-1;i?(t=(this.HueRange[1]-this.HueRange[0])/i,r=(this.SaturationRange[1]-this.SaturationRange[0])/i,n=(this.ValueRange[1]-this.ValueRange[0])/i,a=(this.AlphaRange[1]-this.AlphaRange[0])/i):t=r=n=a=0;for(let e=0;e<=i;e++){let i=this.HueRange[0]+e*t,o=this.SaturationRange[0]+e*r,l=this.ValueRange[0]+e*n,s=this.AlphaRange[0]+e*a,d=function(e,t,r){if(e>1)throw Error("HSVToRGB expects hue < 1");let n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;let a=Math.floor(6*e),i=6*e-a,o=r*(1-t),l=r*(1-t*i),s=r*(1-t*(1-i));switch(a){case 0:case 6:n[0]=r,n[1]=s,n[2]=o;break;case 1:n[0]=l,n[1]=r,n[2]=o;break;case 2:n[0]=o,n[1]=r,n[2]=s;break;case 3:n[0]=o,n[1]=l,n[2]=r;break;case 4:n[0]=s,n[1]=o,n[2]=r;break;case 5:n[0]=r,n[1]=o,n[2]=l}return n}(i,o,l),u=[0,0,0,0];switch(this.Ramp){case"scurve":u[0]=Math.floor(127.5*(1+Math.cos((1-d[0])*Math.PI))),u[1]=Math.floor(127.5*(1+Math.cos((1-d[1])*Math.PI))),u[2]=Math.floor(127.5*(1+Math.cos((1-d[2])*Math.PI))),u[3]=Math.floor(255*s);break;case"linear":u[0]=Math.floor(255*d[0]+.5),u[1]=Math.floor(255*d[1]+.5),u[2]=Math.floor(255*d[2]+.5),u[3]=Math.floor(255*s+.5);break;case"sqrt":u[0]=Math.floor(255*Math.sqrt(d[0])+.5),u[1]=Math.floor(255*Math.sqrt(d[1])+.5),u[2]=Math.floor(255*Math.sqrt(d[2])+.5),u[3]=Math.floor(255*Math.sqrt(s)+.5);break;default:throw Error(`Invalid Ramp value (${this.Ramp})`)}this.Table.push(u)}this.buildSpecialColors()}buildSpecialColors(){let e=this.NumberOfColors,t=e+0,r=e+1;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[e+2]=this.NaNColor}mapValue(e){let t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&e<this.TableRange[0])return this.BelowRangeColor}else if(t===this.NumberOfColors-1&&this.UseAboveRangeColor&&e>this.TableRange[1])return this.AboveRangeColor;return this.Table[t]}getIndex(e){let t={Range:[],MaxIndex:this.NumberOfColors-1,Shift:-this.TableRange[0],Scale:1};if(this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return -1;let r=Math.floor(e<t.Range[0]?t.MaxIndex+0+1.5:e>t.Range[1]?t.MaxIndex+1+1.5:(e+t.Shift)*t.Scale);return r===this.NumberOfColors+0?r=0:r===this.NumberOfColors+1&&(r=this.NumberOfColors-1),r}setTableValue(e,t,r,n,a){let i;if("number"==typeof t&&void 0!==r&&void 0!==n&&void 0!==a)i=[t,r,n,a];else if(Array.isArray(t))i=t;else throw Error("Invalid arguments for setTableValue");if(e<0)throw Error(`Can't set the table value for negative index (${e})`);if(e>=this.NumberOfColors)throw Error(`Index ${e} is greater than the number of colors ${this.NumberOfColors}`);this.Table[e]=i,(0===e||e===this.NumberOfColors-1)&&this.buildSpecialColors()}},$M=[0,0,0,0],$S=new Set(["gray","grey","grayscale","greyscale"]);function $E(e,t,r){let n,a=[],i=[],o=[],l=[];for(n=0,r=null===r?1:r;n<t.length;n++){let r=t[n];a.push((e-1)*r[0]),i.push(r[1]),o.push(r[1])}let s=function(e,t){let r=(1-e)/((t=null===t?100:t)-1),n=[];for(;t-- >0;)n.push(e),e+=r;return n[n.length-1]=1,n}(0,e);for(n=0;n<e;n++)s[n]=(e-1)*Math.pow(s[n],r);let d=function(e,t){let r,n=[],a=t.length;for(e.sort(function(e,t){return e-t}),r=0;r<a;r++)n[r]=function(e,t){let r=0,n=e.length-1;for(;r<=n;){let a=r+Math.floor((n-r)/2),i=e[a];if(i===t)return a;t<i?n=a-1:r=a+1}return r}(e,t[r]);return n}(a,s);for(n=1;n<e-1;n++){let e=d[n],t=(s[n]-a[e-1])/(a[e]-a[e-1]),r=i[e]-o[e-1];l[n]=t*r+o[e-1]}return l[0]=o[0],l[e-1]=i[t.length-1],l}function $T(e,t,r){let n,a="string"==typeof e?e.trim():e?.name?.trim();if(!a)return t;let i=a.toLowerCase();if($S.has(i))return;let o=qB(a);if(o){var l,s;return $P((l=o,s=a,$I(`vtk:${(l.name||l.Name||s).trim().toLowerCase()}`,function(e,t){let r=HE.newInstance();r.applyColorMap(e);let[n,a]=r.getRange(),i=Array.from({length:256},(e,t)=>{let i=[];return r.getColor(n+t/256*(a-n),i),[Math.round(255*i[0]),Math.round(255*i[1]),Math.round(255*i[2]),255]});return{colors:i,name:e.Name||t,numColors:i.length}}(l,s))),"string"==typeof e?void 0:e,r?.voiRange)}let d=(n=a.trim().toLowerCase(),Object.keys(B8).find(e=>{let t=B8[e];return e.toLowerCase()===n||t.name?.trim().toLowerCase()===n}));return $P(d?$I(d):void 0,"string"==typeof e?void 0:e,r?.voiRange)}function $I(e,t){let r=B8[e];return r||(r=B8[e]=t||{name:"",colors:[]}),!r.colors&&r.segmentedData&&(r.colors=function(e,t,r){let n,a=[];r=null===r?1:r;let i=$E(t=null===t?256:t,e.red,r),o=$E(t,e.green,r),l=$E(t,e.blue,r);for(n=0;n<t;n++){let e=[Math.round(255*i[n]),Math.round(255*o[n]),Math.round(255*l[n]),255];a.push(e)}return a}(r.segmentedData,r.numColors,r.gamma)),{getId:()=>e,getColorSchemeName:()=>r.name,setColorSchemeName(e){r.name=e},getNumberOfColors:()=>r.colors.length,setNumberOfColors(e){for(;r.colors.length<e;)r.colors.push($M);r.colors.length=e},getColor(e){return this.isValidIndex(e)?r.colors[e]:$M},getColorRepeating(e){let t=r.colors.length;return e=t?e%t:0,this.getColor(e)},setColor(e,t){this.isValidIndex(e)&&(r.colors[e]=t)},addColor(e){r.colors.push(e)},insertColor(e,t){this.isValidIndex(e)&&r.colors.splice(e,1,t)},removeColor(e){this.isValidIndex(e)&&r.colors.splice(e,1)},clearColors(){r.colors=[]},buildLookupTable(e){if(!e)return;let t=r.colors.length;e.setNumberOfTableValues(t);for(let n=0;n<t;n++)e.setTableValue(n,r.colors[n])},createLookupTable(){let e=new $k;return this.buildLookupTable(e),e},isValidIndex:e=>e>=0&&e<r.colors.length}}function $P(e,t,r){var n,a,i,o;let l;if(!e)return;if(t?.opacity===void 0&&t?.threshold===void 0||!r||r.upper<=r.lower)return e;let s=(n=e,a=t,i=r,l=Math.max(n.getNumberOfColors(),1),Array.from({length:256},(e,t)=>{var r,o;let s=1===l?0:(r=t,Math.min((o=l)-1,Math.floor(r/256*o))),d=n.getColor(s),u=function(e,t,r){if(void 0!==r&&e<r)return 0;if(void 0===t)return 1;if("number"==typeof t)return $D(t);if(!t.length)return 1;if(e<=t[0].value)return $D(t[0].opacity);for(let r=1;r<t.length;r++){let n=t[r-1],a=t[r];if(e<=a.value){let t=a.value-n.value,r=t>0?(e-n.value)/t:0;return $D(n.opacity+(a.opacity-n.opacity)*r)}}return $D(t[t.length-1].opacity)}(i.lower+(i.upper-i.lower)*(t/256),a?.opacity,a?.threshold);return[d[0],d[1],d[2],Math.round(d[3]/255*u*255)]}));return $I([e.getId(),`lower:${$_(r.lower)}`,`upper:${$_(r.upper)}`,`opacity:${void 0===(o=t?.opacity)?"none":"number"==typeof o?String($_(o)):o.map(({opacity:e,value:t})=>`${$_(t)}-${$_(e)}`).join(",")}`,`threshold:${$_(t?.threshold)}`].join(":"),{colors:s,name:e.getColorSchemeName(),numColors:s.length})}function $D(e){return Math.max(0,Math.min(1,e))}function $_(e){return void 0===e?"none":String(Math.round(1e3*e)/1e3)}let $A=function(e,t,r,n){let a,i,o=$l(),l=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-o;let s=l.length,d=e.minPixelValue,u=0,c=0;if(o=$l(),i=r instanceof $k?r.Table:r,d<0)for(;c<s;)a=i[t[l[c++]+-d]],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];else for(;c<s;)a=i[t[l[c++]]],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-o},$O=function(e,t,r,n){let a,i,o=$l(),l=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=$l()-o;let s=l.length,d=e.minPixelValue,u=0,c=0;if(o=$l(),i=r instanceof $k?r.Table:r,d<0)for(;c<s;)a=i[t(l[c++]+-d)],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];else for(;c<s;)a=i[t(l[c++])],n[u++]=a[0],n[u++]=a[1],n[u++]=a[2],n[u++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=$l()-o};function $R(e,t,r){return Math.max(t,Math.min(r,e))}function $N(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),e.options?.transparentBackground?n.clearRect(0,0,e.canvas.width,e.canvas.height):(n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height)),n.imageSmoothingEnabled=!e.viewport.pixelReplication,$c(e,n);let a=function(e,t,r){e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=$y(null,t.width,t.height));let n=e.renderingTools.renderCanvas,a=e.viewport.colormap||e.options.colormap;if(e.options&&e.options.colormap&&console.warn("enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead"),a&&"string"==typeof a?a=$T(a):a&&"object"==typeof a&&"function"!=typeof a.getId&&(a=$T(a)),!a)throw Error("renderPseudoColorImage: colormap not found.");let i=a.getId();if(!$h(e,t)&&!r&&e.renderingTools.colormapId===i)return n;e.renderingTools.renderCanvasContext&&n.width===t.width&&n.height===t.height||$p(e,t);let o=$l();(!e.renderingTools.colorLUT||r||e.renderingTools.colormapId!==i)&&(a.setNumberOfColors(256),e.renderingTools.colorLUT=a.createLookupTable(),e.renderingTools.colormapId=i);let l=e.renderingTools.renderCanvasData,s=e.renderingTools.renderCanvasContext,{viewport:d}=e,u=e.renderingTools.colorLUT;if("PT"===d.modality){let{windowWidth:e,windowCenter:r}=d.voi,n=r-e/2,a=255/(r+e/2-n);$O(t,d.invert?e=>$R(Math.floor(255-(e-n)*a),0,255):e=>$R(Math.floor((e-n)*a),0,255),u,l.data)}else{let n=$x(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=$l()-o,$A(t,n,u,l.data)}return o=$l(),s.putImageData(l,0,0),t.stats.lastPutImageDataTime=$l()-o,n}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,l=e.viewport.displayedArea.brhc.x-i,s=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,l,s,0,0,l,s),e.renderingTools=$m(e)}function $L(e,t){let r=e.image;if(!e.canvas||!e.image)return;let n=$l();if(r.stats={lastGetPixelDataTime:-1,lastStoredPixelDataToCanvasImageDataTime:-1,lastPutImageDataTime:-1,lastRenderTime:-1,lastLutGenerateTime:-1},r){let n=r.render;n||(n=e.viewport.colormap?$N:r.color?$b:$C),n(e,t)}let a=$l()-n;r.stats.lastRenderTime=a,e.invalid=!1,e.needsRedraw=!1}function $V(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,pixelArray:i,spacing:o}=e,l=!ArrayBuffer.isView(i)||i instanceof DataView?Array.from(i):i,s=!ArrayBuffer.isView(l)||l instanceof DataView?void 0:GA.getDataType(l),d=GA.newInstance({...s?{dataType:s}:{},name:"Pixels",numberOfComponents:n,values:l}),u=G0();return u.setDimensions(t),u.setSpacing(o),u.setDirection(new Float32Array(Array.from(r))),u.setOrigin(a),u.getPointData().setScalars(d),u}function $F(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,spacing:i}=qm(e),o=e.voxelManager.getScalarData().slice(),l=$V({dimensions:t,direction:Array.from(r),numberOfComponents:n,origin:a,pixelArray:o,spacing:i});return qJ(l,e),l}function $B(e){return e.preScale?.scaled&&e.preScale?.scalingParameters?.suvbw?{lower:0,upper:5}:q3(e.windowWidth,e.windowCenter,e.voiLUTFunction)}function $j(e){let{actor:t,defaultVOIRange:r,defaultVOILUTFunction:n,props:a}=e,i=t.getProperty(),o=a?.voiRange??r;if(a?.visible!==void 0&&t.setVisibility(a.visible),a?.opacity!==void 0&&i.setOpacity(a.opacity),a?.interpolationType!==void 0&&i.setInterpolationType(a.interpolationType),!o)return;let l=$W({colormap:a?.colormap,invert:a?.invert,voiRange:o,voiLUTFunction:a?.voiLUTFunction??n});i.setUseLookupTableScalarRange(!0),i.setRGBTransferFunction(0,l)}function $W(e){let{colormap:t,invert:r,voiRange:n,voiLUTFunction:a}=e,i=t?.name!==void 0?function(e,t){let r=e.name,n=r?qB(r):void 0;if(!n)throw Error(`Colormap ${r} not found`);let a=HE.newInstance();return a.applyColorMap(n),a.setMappingRange(t.lower,t.upper),a}(t,n):a===FE.SAMPLED_SIGMOID?qX(n):qZ(n);return r&&qQ(i),i}let $U=new class{constructor(){this._imageCache=new Map,this._volumeCache=new Map,this._imageIdsToVolumeIdCache=new Map,this._referencedImageIdToImageIdCache=new Map,this._geometryCache=new Map,this._imageCacheSize=0,this._maxCacheSize=0xc0000000,this._geometryCacheSize=0,this.setMaxCacheSize=e=>{if(!e||"number"!=typeof e)throw Error(`New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`);this._maxCacheSize=e},this.isCacheable=e=>this.getBytesAvailable()+Array.from(this._imageCache.values()).reduce((e,t)=>t.sharedCacheKey?e:e+t.sizeInBytes,0)>=e,this.getMaxCacheSize=()=>this._maxCacheSize,this.getCacheSize=()=>this._imageCacheSize,this._decacheImage=(e,t=!1)=>{let r=this._imageCache.get(e);if(!r)return;if(r.sharedCacheKey&&!t)throw Error("Cannot decache an image with a shared cache key. You need to manually decache the volume first.");let{imageLoadObject:n}=r;r.image?.referencedImageId&&this._referencedImageIdToImageIdCache.delete(r.image.referencedImageId),n?.cancelFn&&n.cancelFn(),n?.decache&&n.decache(),this._imageCache.delete(e)},this._decacheVolume=e=>{let t=this._volumeCache.get(e);if(!t)return;let{volumeLoadObject:r,volume:n}=t;n&&(n.cancelLoading&&n.cancelLoading(),n.imageData&&n.imageData.delete(),r.cancelFn&&r.cancelFn(),n.imageIds&&n.imageIds.forEach(t=>{let r=this._imageCache.get(t);r&&r.sharedCacheKey===e&&(r.sharedCacheKey=void 0)}),this._volumeCache.delete(e))},this.purgeCache=()=>{let e=this._imageCache.keys();for(this.purgeVolumeCache();;){let{value:t,done:r}=e.next();if(r)break;this.removeImageLoadObject(t,{force:!0}),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t})}},this.purgeVolumeCache=()=>{let e=this._volumeCache.keys();for(;;){let{value:t,done:r}=e.next();if(r)break;this.removeVolumeLoadObject(t),jq(jH,Fm.VOLUME_CACHE_VOLUME_REMOVED,{volumeId:t})}},this.getVolumeLoadObject=e=>{if(void 0===e)throw Error("getVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(t)return t.timeStamp=Date.now(),t.volumeLoadObject},this.putGeometryLoadObject=(e,t)=>{if(void 0===e)throw Error("putGeometryLoadObject: geometryId must not be undefined");if(void 0===t.promise)throw Error("putGeometryLoadObject: geometryLoadObject.promise must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometryLoadObject: geometryId already present in geometryCache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putGeometryLoadObject: geometryLoadObject.cancel must be a function");let r={loaded:!1,geometryId:e,geometryLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._geometryCache.set(e,r),t.promise.then(t=>{try{this._putGeometryCommon(e,t,r)}catch(t){throw console.debug(`Error in _putGeometryCommon for geometry ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching geometry ${e}:`,t),this._geometryCache.delete(e),t})},this.getGeometry=e=>{if(void 0===e)throw Error("getGeometry: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometry},this.removeGeometryLoadObject=e=>{if(void 0===e)throw Error("removeGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(!t)throw Error("removeGeometryLoadObject: geometryId was not present in geometryCache");this.decrementGeometryCacheSize(t.sizeInBytes),jq(jH,Fm.GEOMETRY_CACHE_GEOMETRY_REMOVED,{geometry:t,geometryId:e}),this._decacheGeometry(e)},this._decacheGeometry=e=>{let t=this._geometryCache.get(e);if(!t)return;let{geometryLoadObject:r}=t;r.cancelFn&&r.cancelFn(),r.decache&&r.decache(),this._geometryCache.delete(e)},this.incrementGeometryCacheSize=e=>{this._geometryCacheSize+=e},this.decrementGeometryCacheSize=e=>{this._geometryCacheSize-=e},this.getImageByReferencedImageId=e=>{let t=this._referencedImageIdToImageIdCache.get(e);if(t)return this._imageCache.get(t)?.image},this.getImage=(e,t=B1.FAR_REPLICATE)=>{if(void 0===e)throw Error("getImage: imageId must not be undefined");let r=this._imageCache.get(e);if(r&&(r.timeStamp=Date.now(),!(r.image?.imageQualityStatus<t)))return r.image},this.getVolume=(e,t=!1)=>{if(void 0===e)throw Error("getVolume: volumeId must not be undefined");let r=this._volumeCache.get(e);return r?(r.timeStamp=Date.now(),r.volume):t?[...this._volumeCache.values()].find(t=>t.volumeId.includes(e))?.volume:void 0},this.getVolumes=()=>Array.from(this._volumeCache.values()).map(e=>e.volume),this.filterVolumesByReferenceId=e=>this.getVolumes().filter(t=>t.referencedVolumeId===e),this.removeImageLoadObject=(e,{force:t=!1}={})=>{if(void 0===e)throw Error("removeImageLoadObject: imageId must not be undefined");let r=this._imageCache.get(e);if(!r)throw Error("removeImageLoadObject: imageId was not present in imageCache");this._decacheImage(e,t),this.incrementImageCacheSize(-r.sizeInBytes),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{image:r,imageId:e})},this.removeVolumeLoadObject=e=>{if(void 0===e)throw Error("removeVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(!t)throw Error("removeVolumeLoadObject: volumeId was not present in volumeCache");jq(jH,Fm.VOLUME_CACHE_VOLUME_REMOVED,{volume:t,volumeId:e}),this._decacheVolume(e)},this.incrementImageCacheSize=e=>{this._imageCacheSize+=e},this.decrementImageCacheSize=e=>{this._imageCacheSize-=e},this.getGeometryLoadObject=e=>{if(void 0===e)throw Error("getGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometryLoadObject}}generateVolumeId(e){let t=e.map(q5).sort(),r=0x811c9dc5;for(let e of t){let t=function(e){let t=0x811c9dc5;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t+=(t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24);return(t>>>0).toString(36)}(e);for(let e=0;e<t.length;e++)r^=t.charCodeAt(e),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24)}return`volume-${(r>>>0).toString(36)}`}getImageIdsForVolumeId(e){return Array.from(this._imageIdsToVolumeIdCache.entries()).filter(([t,r])=>r===e).map(([e])=>e)}getBytesAvailable(){return this.getMaxCacheSize()-this.getCacheSize()}decacheIfNecessaryUntilBytesAvailable(e,t){let r=this.getBytesAvailable();if(r>=e)return r;let n=Array.from(this._imageCache.values()).filter(e=>!e.sharedCacheKey);n.sort(function(e,t){return e.timeStamp>t.timeStamp?1:e.timeStamp<t.timeStamp?-1:0});let a=n.map(e=>e.imageId),i=a;for(let n of(t&&(i=a.filter(e=>!t.includes(e))),i))if(this.removeImageLoadObject(n),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{imageId:n}),(r=this.getBytesAvailable())>=e)return r;for(let t of a)if(this.removeImageLoadObject(t),jq(jH,Fm.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t}),(r=this.getBytesAvailable())>=e)return r}_putImageCommon(e,t,r){if(!this._imageCache.has(e))return void console.warn("The image was purged from the cache before it completed loading.");if(!t)return void console.warn("Image is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putImageCommon: image.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putImageCommon: image.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(Fm.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.image=t,r.sizeInBytes=t.sizeInBytes,this.incrementImageCacheSize(r.sizeInBytes),t.referencedImageId&&this._referencedImageIdToImageIdCache.set(t.referencedImageId,e),jq(jH,Fm.IMAGE_CACHE_IMAGE_ADDED,{image:r}),r.sharedCacheKey=t.sharedCacheKey}async putImageLoadObject(e,t){if(void 0===e)throw console.error("putImageLoadObject: imageId must not be undefined"),Error("putImageLoadObject: imageId must not be undefined");if(void 0===t.promise)throw console.error("putImageLoadObject: imageLoadObject.promise must not be undefined"),Error("putImageLoadObject: imageLoadObject.promise must not be undefined");let r=this._imageCache.get(e);if(r?.imageLoadObject)throw console.warn(`putImageLoadObject: imageId ${e} already in cache`),Error("putImageLoadObject: imageId already in cache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw console.error("putImageLoadObject: imageLoadObject.cancel must be a function"),Error("putImageLoadObject: imageLoadObject.cancel must be a function");let n={...r,loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._imageCache.set(e,n),t.promise.then(t=>{try{this._putImageCommon(e,t,n)}catch(t){throw console.debug(`Error in _putImageCommon for image ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching image ${e}:`,t),this._imageCache.delete(e),t})}putImageSync(e,t){if(void 0===e)throw Error("putImageSync: imageId must not be undefined");if(this._imageCache.has(e))throw Error("putImageSync: imageId already in cache");let r={loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._imageCache.set(e,r);try{this._putImageCommon(e,t,r)}catch(t){throw this._imageCache.delete(e),t}}getImageLoadObject(e){if(void 0===e)throw Error("getImageLoadObject: imageId must not be undefined");let t=this._imageCache.get(e);if(t)return t.timeStamp=Date.now(),t.imageLoadObject}isLoaded(e){let t=this._imageCache.get(e);return!!t&&t.loaded}getVolumeContainingImageId(e){let t=Array.from(this._volumeCache.keys()),r=q5(e);for(let e of t){let t=this._volumeCache.get(e);if(!t)return;let{volume:n}=t;if(!n.imageIds.length)return;let a=n.getImageURIIndex(r);if(a>-1)return{volume:n,imageIdIndex:a}}}getCachedImageBasedOnImageURI(e){let t=q5(e),r=Array.from(this._imageCache.keys()).find(e=>q5(e)===t);if(r)return this._imageCache.get(r)}_putVolumeCommon(e,t,r){this._volumeCache.get(e)?(r.loaded=!0,r.volume=t,t.imageIds?.forEach(t=>{let r=this._imageCache.get(t);r&&(r.sharedCacheKey=e)}),jq(jH,Fm.VOLUME_CACHE_VOLUME_ADDED,{volume:r})):console.warn("The volume was purged from the cache before it completed loading.")}putVolumeSync(e,t){if(void 0===e)throw Error("putVolumeSync: volumeId must not be undefined");if(this._volumeCache.has(e))throw Error("putVolumeSync: volumeId already in cache");let r={loaded:!1,volumeId:e,volumeLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._volumeCache.set(e,r);try{this._putVolumeCommon(e,t,r)}catch(t){throw this._volumeCache.delete(e),t}}async putVolumeLoadObject(e,t){if(void 0===e)throw Error("putVolumeLoadObject: volumeId must not be undefined");if(void 0===t.promise)throw Error("putVolumeLoadObject: volumeLoadObject.promise must not be undefined");if(this._volumeCache.has(e))throw Error(`putVolumeLoadObject: volumeId:${e} already in cache`);if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putVolumeLoadObject: volumeLoadObject.cancel must be a function");let r={loaded:!1,volumeId:e,volumeLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._volumeCache.set(e,r),t.promise.then(t=>{try{this._putVolumeCommon(e,t,r)}catch(t){throw console.error(`Error in _putVolumeCommon for volume ${e}:`,t),this._volumeCache.delete(e),t}}).catch(t=>{throw this._volumeCache.delete(e),t})}_putGeometryCommon(e,t,r){if(!this._geometryCache.get(e))return void console.warn("The geometry was purged from the cache before it completed loading.");if(!t)return void console.warn("Geometry is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putGeometryCommon: geometry.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putGeometryCommon: geometry.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(Fm.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.geometry=t,r.sizeInBytes=t.sizeInBytes,this.incrementGeometryCacheSize(r.sizeInBytes),jq(jH,Fm.GEOMETRY_CACHE_GEOMETRY_ADDED,{geometry:r})}putGeometrySync(e,t){if(void 0===e)throw Error("putGeometrySync: geometryId must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometrySync: geometryId already in cache");let r={loaded:!1,geometryId:e,geometryLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._geometryCache.set(e,r);try{this._putGeometryCommon(e,t,r)}catch(t){throw this._geometryCache.delete(e),t}}setPartialImage(e,t,r=!1){let n=this._imageCache.get(e);if(!n){t&&this._imageCache.set(e,{image:t,imageId:e,loaded:!1,timeStamp:Date.now(),sizeInBytes:0});return}n.loaded?(n.loaded=!1,n.imageLoadObject=null,this.incrementImageCacheSize(-n.sizeInBytes),n.sizeInBytes=0):r&&(n.imageLoadObject=null),n.image=t||n.image}getImageQuality(e){let t=this._imageCache.get(e)?.image;return t?t.imageQualityStatus||B1.FULL_RESOLUTION:void 0}},$z={},$G={add:(e,t)=>{$G.addRaw(e,{...t,metadata:$e(t.metadata)})},addRaw:(e,t)=>{let r=t.type;$z[e]||($z[e]={}),$z[e][r]=t.metadata},get:(e,t)=>$z[t]?.[e],clear:()=>{$z={}}};function $H(e,t){switch(e){case"Float32Array":return Float32Array;case"Uint8Array":return Uint8Array;case"Uint32Array":return Uint32Array;case"Uint16Array":case"Int16Array":if(!t)return"Uint16Array"===e?Uint16Array:Int16Array;return console.debug(`${e} is not supported for volume rendering, switching back to Float32Array`),Float32Array;default:if(!e)return Float32Array;throw Error("TargetBuffer should be Float32Array, Uint8Array, Uint16Array, Int16Array, or Uint32Array")}}qa($G.get);let $q=[[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]],$$=[[0,-1,0],[0,1,0]],$K=[[0,-1,0],[0,1,0],[0,0,-1]],$Y=[[0,-1,0],[0,1,0],[0,0,1]];class $Z{static copyMap(e,t){for(let[r,n]of t.rows)e.rows.set(r,$e(n))}constructor(e,t,r=1){this.rows=new Map,this.height=1,this.width=1,this.depth=1,this.jMultiple=1,this.kMultiple=1,this.numComps=1,this.pixelDataConstructor=Uint8Array,this.updateScalarData=function(e){e.fill(0),this.forEach((t,r,n)=>{let{start:a,end:i,value:o}=r;for(let r=a;r<i;r++)e[t+r]=o})},this.get=e=>{let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value??this.defaultValue},this.getRun=(e,t)=>{let r=e+t*this.height;return this.rows.get(r)},this.set=(e,t)=>{if(void 0===t)return;let r=e%this.width,n=(e-r)/this.width,a=this.rows.get(n);if(!a)return void this.rows.set(n,[{start:r,end:r+1,value:t}]);let i=this.findIndex(a,r),o=a[i],l=a[i-1];if(!o){if(!l||l.value!==t||l.end!==r){a[i]={start:r,end:r+1,value:t};return}l.end++;return}let{start:s,end:d,value:u}=o;if(t===u&&r>=s)return;let c={start:r,end:r+1,value:t},h=r>s,p=h?i+1:i,m=h?o:l,f=h?a[i+1]:o;if(m?.value===t&&m?.end===r){m.end++,f?.value===t&&f.start===r+1?(m.end=f.end,a.splice(i,1)):f?.start===r&&(f.start++,f.start===f.end&&(a.splice(i,1),f=a[i],f?.start===r+1&&f.value===t&&(m.end=f.end,a.splice(i,1))));return}if(f?.value===t&&f.start===r+1){f.start--,m?.end>r&&(m.end=r,m.end===m.start&&a.splice(i,1));return}if(f?.start===r&&f.end===r+1){f.value=t;let e=a[i+1];e?.start==r+1&&e.value===t&&(a.splice(i+1,1),f.end=e.end);return}r===f?.start&&f.start++,h&&d>r+1?a.splice(p,0,c,{start:r+1,end:m.end,value:m.value}):a.splice(p,0,c),m?.end>r&&(m.end=r)},this.width=e,this.height=t,this.depth=r,this.jMultiple=e,this.kMultiple=this.jMultiple*t}toIJK(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple%this.height;return[t,r,Math.floor(e/this.kMultiple)]}toIndex([e,t,r]){return e+r*this.kMultiple+t*this.jMultiple}getRLE(e,t,r=0){let n=this.rows.get(t+r*this.height);if(!n)return;let a=this.findIndex(n,e),i=n[a];return e>=i?.start?i:void 0}has(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value!==void 0}delete(e){let t=e%this.width,r=(e-t)/this.width,n=this.rows.get(r);if(!n)return;let a=this.findIndex(n,t),i=n[a];if(!i||i.start>t)return;if(i.end===t+1){i.end--,i.start>=i.end&&(n.splice(a,1),n.length||this.rows.delete(r));return}if(i.start===t)return void i.start++;let o={value:i.value,start:t+1,end:i.end};i.end=t,n.splice(a+1,0,o)}findIndex(e,t){for(let r=0;r<e.length;r++){let{end:n}=e[r];if(t<n)return r}return e.length}forEach(e,t){let r=t?.rowModified;for(let[t,n]of this.rows)for(let a of r?[...n]:n)e(t*this.width,a,n)}forEachRow(e){for(let[t,r]of this.rows)e(t*this.width,r)}clear(){this.rows.clear()}keys(){return[...this.rows.keys()]}getPixelData(e=0,t){t?t.fill(0):t=new this.pixelDataConstructor(this.width*this.height*this.numComps);let{width:r,height:n,numComps:a}=this;for(let i=0;i<n;i++){let n=this.getRun(i,e);if(n)if(1===a)for(let e of n){let n=i*r,{start:a,end:o,value:l}=e;for(let e=a;e<o;e++)t[n+e]=l}else for(let e of n){let n=i*r*a,{start:o,end:l,value:s}=e;for(let e=o;e<l;e+=a)for(let r=0;r<a;r++)t[n+e+r]=s[r]}}return t}floodFill(e,t,r,n,a){let i=this.getRLE(e,t,r);if(!i)throw Error(`Initial point ${e},${t},${r} isn't in the RLE`);let o=[[i,t,r]],l=i.value;if(l===n)throw Error(`source (${l}) and destination (${n}) are identical`);return this.flood(o,l,n,a)}flood(e,t,r,n){let a=0,{planar:i=!0,diagonals:o=!0,singlePlane:l=!1}=n||{},s={planar:i,diagonals:o,singlePlane:l};for(;e.length;){let n=e.pop(),[i]=n;if(i.value!==t)continue;i.value=r,a+=i.end-i.start;let o=this.findAdjacents(n,s).filter(e=>e&&e[0].value===t);e.push(...o)}return a}fillFrom(e,t){for(let r=t[2][0];r<=t[2][1];r++)for(let n=t[1][0];n<=t[1][1];n++){let a,i;for(let o=t[0][0];o<=t[0][1];o++){let t=e(o,n,r);if(void 0===t){a=void 0;continue}i||(i=[],this.rows.set(n+r*this.height,i)),a&&a.value!==t&&(a=void 0),a||(a={start:o,end:o,value:t},i.push(a)),a.end++}}}findAdjacents(e,{diagonals:t=!0,planar:r=!0,singlePlane:n=!1}){let[a,i,o,l]=e,{start:s,end:d}=a,u=s>0&&this.getRLE(s-1,i,o),c=d<this.width&&this.getRLE(d,i,o),h=t?[s>0?s-1:s,d<this.width?d+1:d]:[s,d],p=[];for(let e of(u&&p.push([u,i,o]),c&&p.push([c,i,o]),l||(n?$$:$q))){let[,t,a]=e,s=t+i,d=a+o;if(s<0||s>=this.height||d<0||d>=this.depth)continue;let u=this.getRun(s,d);if(u)for(let e of u){let t=l||n&&$$||r&&a>0&&$Y||r&&a<0&&$K||$q;e.end<=h[0]||e.start>=h[1]||p.push([e,s,d,t])}}return p}}$Z.getScalarData=function(e=Uint8ClampedArray){let t=new e(this.frameSize);return this.map.updateScalarData(t),t};var $X=d(4164);class $J{constructor(e={}){this._dimensions=3,this._length=0,this._byteSize=4,this.growSize=128;const{initialSize:t=1024,dimensions:r=3,growSize:n=128}=e;this.growSize=n,this.array=new ArrayBuffer(t*r*this._byteSize),this.data=new Float32Array(this.array),this._dimensions=r}forEach(e){for(let t=0;t<this._length;t++)e(this.getPoint(t),t)}get length(){return this._length}get dimensions(){return this._dimensions}get dimensionLength(){return this._length*this._dimensions}getPoint(e){if(e<0&&(e+=this._length),e<0||e>=this._length)return;let t=this._dimensions*e;return this.data.subarray(t,t+this._dimensions)}getPointArray(e){let t=[];if(e<0&&(e+=this._length),e<0||e>=this._length)return;let r=this._dimensions*e;for(let e=0;e<this._dimensions;e++)t.push(this.data[e+r]);return t}grow(e=1,t=this.growSize){if(this.dimensionLength+e*this._dimensions<=this.data.length)return;let r=new ArrayBuffer((this.data.length+t)*this._dimensions*this._byteSize),n=new Float32Array(r);n.set(this.data),this.data=n,this.array=r}reverse(){let e=Math.floor(this._length/2);for(let t=0;t<e;t++){let e=t*this._dimensions,r=(this._length-1-t)*this._dimensions;for(let t=0;t<this._dimensions;t++){let n=this.data[e+t];this.data[e+t]=this.data[r+t],this.data[r+t]=n}}}getTypedArray(){return this.data}push(e){this.grow(1);let t=this.length*this._dimensions;for(let r=0;r<this._dimensions;r++)this.data[r+t]=e[r];this._length++}map(e){let t=[];for(let r=0;r<this._length;r++)t.push(e(this.getPoint(r),r));return t}get points(){return this.map(e=>e)}toXYZ(){let e={x:[],y:[]};this._dimensions>=3&&(e.z=[]);let{x:t,y:r,z:n}=e;return this.forEach(e=>{t.push(e[0]),r.push(e[1]),n&&n.push(e[2])}),e}static fromXYZ({x:e,y:t,z:r}){let n=$J.create3(e.length),a=0;for(let i=0;i<e.length;i++)n.data[a++]=e[i],n.data[a++]=t[i],n.data[a++]=r?r[i]:0;return n._length=e.length,n}subselect(e=10,t=0){let r=new $J({initialSize:e,dimensions:this._dimensions});for(let n=0;n<e;n++){let a=(t+Math.floor(this.length*n/e))%this.length;r.push(this.getPoint(a))}return r}static create3(e=128,t){let r=new $J({initialSize:e=Math.max(e,t?.length||0),dimensions:3});return t&&t.forEach(e=>r.push(e)),r}static create2(e=128){return new $J({initialSize:e,dimensions:2})}}function $Q(e){let t=$X.create(),r=e.getDimensions(),n=$J.create3(r[0]),a=$J.create3(r[1]),i=$J.create3(r[2]),o=e.getDirection(),l=o.slice(0,3),s=o.slice(3,6),d=o.slice(6,9),[u,c,h]=e.getSpacing(),p=e.indexToWorld([0,0,0]),m=$X.fromValues(l[0]*u,l[1]*u,l[2]*u),f=$X.fromValues(s[0]*c,s[1]*c,s[2]*c),g=$X.fromValues(d[0]*h,d[1]*h,d[2]*h),y=$X.create();for(let e=0;e<r[0];e++)n.push($X.add(y,p,$X.scale(y,m,e)));for(let e=0;e<r[1];e++)a.push($X.scale(y,f,e));for(let e=0;e<r[2];e++)i.push($X.scale(y,g,e));let v=n.getTypedArray(),b=a.getTypedArray(),w=i.getTypedArray();return(e,r=t)=>{let[n,a,i]=e,o=3*n,l=3*a,s=3*i;return r[0]=v[o]+b[l]+w[s],r[1]=v[o+1]+b[l+1]+w[s+1],r[2]=v[o+2]+b[l+2]+w[s+2],r}}let $0=[0,0,0],$1=[0,0,0],$2=new WeakMap;class $5{get id(){return this._id}constructor(e,t){this.modifiedSlices=new Set,this.boundsIJK=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],this.scalarData=null,this._scalarDataIsCachedExpansion=!1,this._sliceDataCache=null,this.getAtIJK=(e,t,r)=>this._get(e+t*this.width+r*this.frameSize),this.setAtIJK=(e,t,r,n)=>{let a=e+t*this.width+r*this.frameSize,i=this._set(a,n);return!1!==i&&(this.modifiedSlices.add(r),$5.addBounds(this.boundsIJK,[e,t,r]),this.invalidateCachedScalarExpansion()),i},this.getAtIJKPoint=([e,t,r])=>this.getAtIJK(e,t,r),this.setAtIJKPoint=([e,t,r],n)=>{this.setAtIJK(e,t,r,n)},this.getAtIndex=e=>this._get(e),this.setAtIndex=(e,t)=>{let r=this._set(e,t);if(!1!==r){let t=this.toIJK(e);this.modifiedSlices.add(t[2]),$5.addBounds(this.boundsIJK,t),this.invalidateCachedScalarExpansion()}return r},this.getMiddleSliceData=()=>{let e=Math.floor(this.dimensions[2]/2);return this.getSliceData({sliceIndex:e,slicePlane:2})},this.forEach=(e,t={})=>{let r=t.boundsIJK||this.getBoundsIJK(),n=t.isInObject||this.isInObject||(()=>!0),a=t.returnPoints||!1,i=t.imageData,o=Math.min(r[0][0],r[0][1]),l=Math.max(r[0][0],r[0][1]),s=Math.min(r[1][0],r[1][1]),d=Math.max(r[1][0],r[1][1]),u=Math.min(r[2][0],r[2][1]),c=Math.max(r[2][0],r[2][1]),h=[];if(i)return function({voxelManager:e,bounds:t,imageData:r,pointInShapeFn:n,callback:a,returnPoints:i}){let[[o,l],[s,d],[u,c]]=t,h=$Q(r),p=[0,0,0],m=[];for(let t=u;t<=c;t++){p[2]=t;for(let t=s;t<=d;t++){p[1]=t;for(let t=o;t<=l;t++){p[0]=t;let r=h(p);if(n(r,p)){let t=e.toIndex(p),n=e.getAtIndex(t);i&&m.push({value:n,index:t,pointIJK:[...p],pointLPS:r.slice()}),a?.({value:n,index:t,pointIJK:p,pointLPS:r})}}}}return m}({voxelManager:this,imageData:t.imageData,bounds:[[o,l],[s,d],[u,c]],pointInShapeFn:n,callback:e,returnPoints:a});if(this.map){if(this.map instanceof $Z)return this.rleForEach(e,t);for(let t of this.map.keys()){let r=this.toIJK(t);if(!n(null,r))continue;let i=this._get(t);a&&h.push({value:i,index:t,pointIJK:r,pointLPS:null}),e({value:i,index:t,pointIJK:r,pointLPS:null})}return h}for(let t=u;t<=c;t++){let r=t*this.frameSize;for(let i=s;i<=d;i++){let s=r+i*this.width;for(let r=o,d=s+r;r<=l;r++,d++){let o=this.getAtIndex(d),l=[r,i,t];n(null,l)&&(a&&h.push({value:o,index:d,pointIJK:l,pointLPS:null}),e({value:o,index:d,pointIJK:[r,i,t],pointLPS:null}))}}}return h},this.getSliceData=({sliceIndex:e,slicePlane:t})=>{let r,n,[a,i,o]=this.dimensions,l=a*i,s=e*l,d=this.getConstructor();if("function"!=typeof d)return new Uint8Array(0);switch(t){case 0:n=new d(r=i*o);for(let t=0;t<i;t++)for(let r=0;r<o;r++){let o=e+t*a+r*l;this.setSliceDataValue(n,t+r*i,this._get(o))}break;case 1:n=new d(r=a*o);for(let t=0;t<a;t++)for(let r=0;r<o;r++){let i=t+e*a+r*l;this.setSliceDataValue(n,t+r*a,this._get(i))}break;case 2:n=new d(r=a*i);for(let e=0;e<r;e++)this.setSliceDataValue(n,e,this._get(s+e));break;default:throw Error("Oblique plane - todo - implement as ortho normal vector")}return n},this.dimensions=e,this.width=e[0],this.frameSize=this.width*e[1],this._get=t._get,this._set=t._set,this._id=t._id||"",this._getConstructor=t._getConstructor,this.numberOfComponents=t.numberOfComponents||1,this.scalarData=t.scalarData,this._getScalarData=t._getScalarData,this._updateScalarData=t._updateScalarData}getMinMax(){let e,t;return this.forEach(({value:r})=>{let n=Array.isArray(r);if(void 0===e&&(e=n?[...r]:r,t=n?[...r]:r),n)for(let n=0;n<r.length;n++)e[n]=Math.min(e[n],r[n]),t[n]=Math.max(t[n],r[n]);else e=Math.min(e,r),t=Math.max(t,r)},{boundsIJK:this.getDefaultBounds()}),{min:e,max:t}}invalidateCachedScalarExpansion(){this._scalarDataIsCachedExpansion&&(this.scalarData=null,this._scalarDataIsCachedExpansion=!1)}toIJK(e){return[e%this.width,Math.floor(e%this.frameSize/this.width),Math.floor(e/this.frameSize)]}toIndex(e){return e[0]+e[1]*this.width+e[2]*this.frameSize}getDefaultBounds(){return this.dimensions.map(e=>[0,e-1])}getBoundsIJK(){return this.boundsIJK[0][0]<this.dimensions[0]?this.boundsIJK:this.getDefaultBounds()}rleForEach(e,t){let r=t?.boundsIJK||this.getBoundsIJK(),{isWithinObject:n}=t||{},a=this.map;if(!a)return void console.warn("No map found, you need to use a map voxel manager to use rleForEach");a.defaultValue=void 0;for(let t=r[2][0];t<=r[2][1];t++)for(let i=r[1][0];i<=r[1][1];i++){let r=a.getRun(i,t);if(r)for(let a of r){let{start:r,end:o,value:l}=a,s=this.toIndex([0,i,t]);for(let a=r;a<o;a++){let r={value:l,index:s+a,pointIJK:[a,i,t]};n?.(r)!==!1&&e(r)}}}}getScalarData(e=!1){if(this.scalarData)return this._updateScalarData?.(this.scalarData),this.scalarData;if(this._getScalarData){let t=this._getScalarData();return e&&(this.scalarData=t,this._scalarDataIsCachedExpansion=!0),t}throw Error("No scalar data available")}setScalarData(e){this.scalarData=e,this._scalarDataIsCachedExpansion=!1}getScalarDataLength(){if(this.scalarData)return this.scalarData.length;if(this._getScalarDataLength)return this._getScalarDataLength();throw Error("No scalar data available")}get sizeInBytes(){return this.getScalarDataLength()*this.bytePerVoxel}get bytePerVoxel(){return this.scalarData?this.scalarData.BYTES_PER_ELEMENT:this._get(0).BYTES_PER_ELEMENT}clearBounds(){this.boundsIJK.map(e=>{e[0]=1/0,e[1]=-1/0})}clear(){this.map?.clear(),this.clearBounds(),this.modifiedSlices.clear(),this.points?.clear()}getConstructor(){return this.scalarData?this.scalarData.constructor:this._getConstructor?this._getConstructor():(console.warn("No scalar data available or can be used to get the constructor"),Float32Array)}getArrayOfModifiedSlices(){return Array.from(this.modifiedSlices)}resetModifiedSlices(){this.modifiedSlices.clear()}setBounds(e){this.boundsIJK=e}static addBounds(e,t){e||(e=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]]),e[0][0]=Math.min(t[0],e[0][0]),e[0][1]=Math.max(t[0],e[0][1]),e[1][0]=Math.min(t[1],e[1][0]),e[1][1]=Math.max(t[1],e[1][1]),e[2][0]=Math.min(t[2],e[2][0]),e[2][1]=Math.max(t[2],e[2][1])}static getWorldToIndexTransform(e){let t=$2.get(e);if(t)return t;let r=e.direction,n=e.spacing,a=LJ.mat3.fromValues(r[0]/n[0],r[3]/n[1],r[6]/n[2],r[1]/n[0],r[4]/n[1],r[7]/n[2],r[2]/n[0],r[5]/n[1],r[8]/n[2]);return $2.set(e,a),a}static worldToIndexContinuous(e,t){let r=e.origin;$0[0]=t[0]-r[0],$0[1]=t[1]-r[1],$0[2]=t[2]-r[2];let n=LJ.vec3.transformMat3($1,$0,$5.getWorldToIndexTransform(e));return[n[0],n[1],n[2]]}static sampleAtWorldCoordinates(e,t,r,n,a=Fv.LINEAR){if(!e.voxelManager)return NaN;let i=e.origin;$0[0]=t-i[0],$0[1]=r-i[1],$0[2]=n-i[2];let o=LJ.vec3.transformMat3($1,$0,$5.getWorldToIndexTransform(e));return $5.sampleAtContinuousCoordinates(e.voxelManager,e.dimensions,o[0],o[1],o[2],a)}static sampleAtWorld(e,t,r=Fv.LINEAR){return $5.sampleAtWorldCoordinates(e,t[0],t[1],t[2],r)}static sampleAtContinuousIndex(e,t,r,n=Fv.LINEAR){return $5.sampleAtContinuousCoordinates(e,t,r[0],r[1],r[2],n)}static sampleAtContinuousCoordinates(e,t,r,n,a,i){return i===Fv.NEAREST?$5.sampleNearestAtContinuousCoordinates(e,t,r,n,a):$5.sampleLinearAtContinuousCoordinates(e,t,r,n,a)}static sampleNearestAtContinuousCoordinates(e,t,r,n,a){let i=Math.floor(r+.5-1e-6),o=Math.floor(n+.5-1e-6),l=Math.floor(a+.5-1e-6),s=t[0],d=t[1],u=t[2];return i<0||i>=s||o<0||o>=d||l<0||l>=u?NaN:Number(e.getAtIJK(i,o,l))}static sampleLinearAtContinuousCoordinates(e,t,r,n,a){let i=t[0],o=t[1],l=t[2];if(r<0||r>i-1||n<0||n>o-1||a<0||a>l-1)return NaN;let s=Math.floor(r),d=Math.floor(n),u=Math.floor(a),c=Math.min(s+1,i-1),h=Math.min(d+1,o-1),p=Math.min(u+1,l-1),m=r-s,f=n-d,g=a-u,y=1-m,v=1-f;return((Number(e.getAtIJK(s,d,u))*y+Number(e.getAtIJK(c,d,u))*m)*v+(Number(e.getAtIJK(s,h,u))*y+Number(e.getAtIJK(c,h,u))*m)*f)*(1-g)+((Number(e.getAtIJK(s,d,p))*y+Number(e.getAtIJK(c,d,p))*m)*v+(Number(e.getAtIJK(s,h,p))*y+Number(e.getAtIJK(c,h,p))*m)*f)*g}addPoint(e){let t=Array.isArray(e)?e[0]+this.width*e[1]+this.frameSize*e[2]:e;this.points||(this.points=new Set),this.points.add(t)}getPoints(){return this.points?[...this.points].map(e=>this.toIJK(e)):[]}setSliceDataValue(e,t,r){if(Array.isArray(r))for(let n=0;n<r.length;n++)e[t*r.length+n]=this.toNumber(r[n]);else e[t]=this.toNumber(r)}toNumber(e){return"number"==typeof e?e:Array.isArray(e)&&e[0]||0}static _createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r=3,id:n}){let a=new $5(e,{_get:e=>(e*=r,[t[e++],t[e++],t[e++]]),_id:n||"_createRGBScalarVolumeVoxelManager",_set:(e,r)=>{let n=!F0(t[e*=3],r);return t[e++]=r[0],t[e++]=r[1],t[e++]=r[2],n},numberOfComponents:r,scalarData:t});return a.clear=()=>{t.fill(0)},a}static createImageVolumeVoxelManager({dimensions:e,imageIds:t,numberOfComponents:r=1,id:n}){let a=e[0]*e[1],i=e[2],o=Array(i),l=-1,s=null,d=new Set,u=new Set,c=e=>{if(e<0||e>=i)return null;let r=o[e];if(void 0!==r)return r;let n=t[e];if(!n)return d.has(e)||(d.add(e),console.warn(`ImageId not found for sliceIndex: ${e}`)),o[e]=null,null;let a=$U.getImage(n);if(!a?.voxelManager)return u.has(n)||(u.add(n),console.warn(`Image not found for imageId: ${n}`)),null;let l=a.voxelManager;return o[e]=l,l},h=new $5(e,{_get:function(e){let t=Math.floor(e/a);if(t<0||t>=i)return null;let r=t===l?s:c(t);return r?(t!==l&&(l=t,s=r),r.getAtIndex(e-t*a)):null},_set:function(e,t){let r=Math.floor(e/a);if(r<0||r>=i)return!1;let n=r===l?s:c(r);if(!n)return!1;r!==l&&(l=r,s=n);let o=e-r*a,d=!F0(t,n.getAtIndex(o));return d?(n.setAtIndex(o,t),!0):d},numberOfComponents:r,_getConstructor:()=>{let e=c(0);return e?e.getConstructor():null},_id:n||"createImageVolumeVoxelManager"});return h.invalidateCache=()=>{o.fill(void 0),l=-1,s=null},h.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return h.getSliceData({sliceIndex:t,slicePlane:2})},h.clear=()=>{for(let e of t)$U.getImage(e).voxelManager.clear()},h.getRange=()=>{let e=1/0,r=-1/0;for(let n of t){let t=$U.getImage(n);t&&(t.minPixelValue<e&&(e=t.minPixelValue),t.maxPixelValue>r&&(r=t.maxPixelValue))}return e===1/0&&r===-1/0?[0,0]:[e,r]},h._getScalarDataLength=()=>{let t=c(0);return t?t.getScalarDataLength()*e[2]:0},h.getCompleteScalarDataArray=()=>{let t=h._getConstructor();if(!t)return new Uint8Array(0);let n=new t(h.getScalarDataLength()),a=e[0]*e[1]*r;for(let t=0;t<e[2];t++){let e=c(t);if(e){let i=t*a,o=e.getScalarData();if(1===r)n.set(o,i);else for(let e=0;e<o.length;e+=r)for(let t=0;t<r;t++)n[i+e+t]=o[e+t]}}return n},h.setCompleteScalarDataArray=n=>{let a=e[0]*e[1]*r,i=h._getConstructor(),o=1/0,l=-1/0;for(let r=0;r<e[2];r++){let e=c(r);if(e&&i){let s=r*a,d=s+a,u=new i(a);if(u.set(n.subarray(s,d)),e.scalarData)e.scalarData.set(u),e.modifiedSlices.add(r);else for(let t=0;t<a;t++)e.setAtIndex(t,u[t]);for(let e=0;e<u.length;e++){let t=u[e];o=Math.min(o,t),l=Math.max(l,t)}let c=t[r],h=$U.getImage(c);h&&(h.minPixelValue=o,h.maxPixelValue=l)}}for(let t=0;t<e[2];t++)h.modifiedSlices.add(t);h.boundsIJK=[[0,e[0]-1],[0,e[1]-1],[0,e[2]-1]]},h}static createScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}){if(3!==e.length)throw Error("Dimensions must be provided as [number, number, number] for [width, height, depth]");if(!r&&((r=t.length/e[0]/e[1]/e[2])>4||r<1||2===r))throw Error(`Number of components ${r} must be 1, 3 or 4`);return r>1?$5._createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}):$5._createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:n})}static createScalarDynamicVolumeVoxelManager({imageIdGroups:e,dimensions:t,dimensionGroupNumber:r=1,timePoint:n=0,numberOfComponents:a=1,id:i}){let o=0;if(void 0!==r?o=r-1:void 0!==n&&(console.warn("Warning: timePoint parameter is deprecated. Please use dimensionGroupNumber instead. timePoint is zero-based while dimensionGroupNumber starts at 1."),o=n),!a){let r=$U.getImage(e[0][0]);if(!r)throw Error("Unable to determine number of components: No image found");if((a=r.getPixelData().length/(t[0]*t[1]))>4||a<1||2===a)throw Error(`Number of components ${a} must be 1, 3 or 4`)}let l=e.map(e=>$5.createImageVolumeVoxelManager({dimensions:t,imageIds:e,numberOfComponents:a,id:i})),s=new $5(t,{_get:e=>l[o]._get(e),_set:(e,t)=>l[o]._set(e,t),numberOfComponents:a,_id:i||"createScalarDynamicVolumeVoxelManager"});return s.getScalarDataLength=()=>l[o].getScalarDataLength(),s.getConstructor=()=>l[o].getConstructor(),s.getRange=()=>l[o].getRange(),s.getMiddleSliceData=()=>l[o].getMiddleSliceData(),s.setTimePoint=e=>{console.warn("Warning: setTimePoint is deprecated. Please use setDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),s.setDimensionGroupNumber(e+1)},s.setDimensionGroupNumber=e=>{o=e-1,s._get=e=>l[o]._get(e),s._set=(e,t)=>l[o]._set(e,t)},s.getAtIndexAndTimePoint=(e,t)=>(console.warn("Warning: getAtIndexAndTimePoint is deprecated. Please use getAtIndexAndDimensionGroup instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),s.getAtIndexAndDimensionGroup(e,t+1)),s.getAtIndexAndDimensionGroup=(e,t)=>l[t-1]._get(e),s.getTimePointScalarData=e=>(console.warn("Warning: getTimePointScalarData is deprecated. Please use getDimensionGroupScalarData instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),s.getDimensionGroupScalarData(e+1)),s.getDimensionGroupScalarData=e=>l[e-1].getCompleteScalarDataArray(),s.getCurrentTimePointScalarData=()=>(console.warn("Warning: getCurrentTimePointScalarData is deprecated. Please use getCurrentDimensionGroupScalarData instead."),s.getCurrentDimensionGroupScalarData()),s.getCurrentDimensionGroupScalarData=()=>l[o].getCompleteScalarDataArray(),s.getCompleteScalarDataArray=()=>l[o].getCompleteScalarDataArray(),s.getCurrentTimePoint=()=>(console.warn("Warning: getCurrentTimePoint is deprecated. Please use getCurrentDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),o),s.getCurrentDimensionGroupNumber=()=>o+1,s}static createImageVoxelManager({width:e,height:t,scalarData:r,numberOfComponents:n=1,id:a}){let i=[e,t,1];if(!n&&((n=r.length/e/t)>4||n<1||2===n))throw Error(`Number of components ${n} must be 1, 3 or 4`);return n>1?$5._createRGBScalarVolumeVoxelManager({dimensions:i,scalarData:r,numberOfComponents:n,id:a}):$5._createNumberVolumeVoxelManager({dimensions:i,scalarData:r,id:a})}static _createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:r}){let n=new $5(e,{_get:e=>t[e],_set:(e,r)=>{let n=t[e]!==r;return t[e]=r,n},_getConstructor:()=>t.constructor,_id:r||"_createNumberVolumeVoxelManager"});return n.scalarData=t,n.clear=()=>{n.scalarData.fill(0)},n.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return n.getSliceData({sliceIndex:t,slicePlane:2})},n}static createMapVoxelManager({dimension:e,id:t}){let r=new Map,n=new $5(e,{_get:r.get.bind(r),_set:(e,t)=>r.set(e,t)&&!0,_id:t||"createMapVoxelManager"});return n.map=r,n}static createHistoryVoxelManager(e,t){let r=new Map,{dimensions:n}=e,a=new $5(n,{_get:e=>r.get(e),_set:function(e,t){if(r.has(e))t===r.get(e)&&r.delete(e);else{let n=this.sourceVoxelManager.getAtIndex(e);if(n===t)return!1;r.set(e,n)}this.sourceVoxelManager.setAtIndex(e,t)},_id:t||"createHistoryVoxelManager"});return a.map=r,a.scalarData=e.scalarData,a.sourceVoxelManager=e,a}static createRLEHistoryVoxelManager(e,t){let{dimensions:r}=e,n=new $Z(r[0],r[1],r[2]),a=new $5(r,{_get:e=>n.get(e),_set:function(e,t){let r=n.get(e);if(void 0===r){let r=this.sourceVoxelManager.getAtIndex(e);if(r===t||void 0===r&&0===t||null===t)return!1;n.set(e,r??0)}else(t===r||null===t)&&(n.delete(e),t=r);this.sourceVoxelManager.setAtIndex(e,t)},_getScalarData:$Z.getScalarData,_updateScalarData:e=>(n.updateScalarData(e),e),_id:t||"createRLEHistoryVoxelManager"});return a.map=n,a.sourceVoxelManager=e,a}static createLazyVoxelManager({dimensions:e,planeFactory:t,id:r}){let n=new Map,[a,i]=e,o=a*i,l=new $5(e,{_get:e=>n.get(Math.floor(e/o))[e%o],_set:(e,r)=>{let l=Math.floor(e/o),s=n.get(l);return s||(s=t(a,i),n.set(l,s)),s[e%o]=r,!0},_id:r||"createLazyVoxelManager"});return l.map=n,l}static createRLEVolumeVoxelManager({dimensions:e,id:t}){let[r,n,a]=e,i=new $Z(r,n,a),o=new $5(e,{_get:e=>i.get(e),_set:(e,t)=>(i.set(e,t),!0),_getScalarData:$Z.getScalarData,_updateScalarData:e=>(i.updateScalarData(e),e),_id:t||"createRLEVolumeVoxelManager"});return o.map=i,o.getPixelData=i.getPixelData.bind(i),o}static createRLEImageVoxelManager({dimensions:e,id:t}){let[r,n]=e;return $5.createRLEVolumeVoxelManager({dimensions:[r,n,1],id:t})}static addInstanceToImage(e){let{width:t,height:r}=e,n=e.voxelManager.getScalarData();if(n.length>=t*r){e.voxelManager=$5.createScalarVolumeVoxelManager({dimensions:[t,r,1],scalarData:n});return}e.voxelManager=$5.createRLEVolumeVoxelManager({dimensions:[t,r,1]}),e.getPixelData=e.voxelManager.getPixelData,e.sizeInBytes=5120}}let $3=new jT("imageLoadPool");$3.grabDelay=0,$3.setMaxSimultaneousRequests(Ff.Interaction,1e3),$3.setMaxSimultaneousRequests(Ff.Thumbnail,1e3),$3.setMaxSimultaneousRequests(Ff.Prefetch,1e3);let $4={};function $8(e,t){let r=!t.ignoreCache&&$U.getImageLoadObject(e);if(r)return $6(r.promise,e),r;let n=!t.ignoreCache&&$U.getImage(e,t.retrieveOptions?.imageQualityStatus??B1.FULL_RESOLUTION);if(n){let t={promise:Promise.resolve(n)};return $6(t.promise,e),t}let a=e.split(":")[0],i=$4[a]||b;if(!i)throw Error(`loadImageFromImageLoader: No image loader found for scheme '${a}'`);let o=i(e,t);return $6(o.promise,e),o}function $6(e,t){Promise.resolve(e).then(e=>{(function(e){if(!e.voxelManager){let{width:t,height:r,numberOfComponents:n}=e,a=$5.createImageVoxelManager({scalarData:e.getPixelData(),width:t,height:r,numberOfComponents:n});e.voxelManager=a,e.getPixelData=()=>a.getScalarData(),delete e.imageFrame.pixelData}})(e),jq(jH,Fm.IMAGE_LOADED,{image:e})}).catch(e=>{jq(jH,Fm.IMAGE_LOAD_FAILED,{imageId:t,error:e})})}function $9(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw Error("loadAndCacheImage: parameter imageId must not be undefined");let r=$8(e,t);return $U.getImageLoadObject(e)||$U.putImageLoadObject(e,r),r.promise}function $7(e,t){let r=$u(e);return r.invert(),r.transformPoint(t)}let Ke={};function Kt(e,t){if(null==e)throw Error(t)}function Kr(e,t=null){return(Kt(e,"getImageSize: parameter image must not be undefined"),Kt(e.width,"getImageSize: parameter image must have width"),Kt(e.height,"getImageSize: parameter image must have height"),null!=t&&0!==t&&180!==t)?{height:e.width,width:e.height}:{width:e.width,height:e.height}}function Kn(e,t,r=null){Kt(e,"getImageScale: parameter canvas must not be undefined"),Kt(t,"getImageScale: parameter image must not be undefined");let n=Kr(t,r),a=t.rowPixelSpacing||1,i=t.columnPixelSpacing||1,o=1,l=1;a<i?l=i/a:o=a/i;let s=e.height/n.height/o,d=e.width/n.width/l;return{verticalScale:s,horizontalScale:d,scaleFactor:Math.min(d,s)}}function Ka(e,t,r,n){let a;if(void 0===e)throw Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return Object.assign({},{scale:1,translation:{x:0,y:0},voi:{windowWidth:void 0,windowCenter:void 0,voiLUTFunction:FE.LINEAR},invert:!1,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:void 0,voiLUT:void 0,colormap:void 0,labelmap:!1,displayedArea:{tlhc:{x:1,y:1},brhc:{x:1,y:1},rowPixelSpacing:1,columnPixelSpacing:1,presentationSizeMode:"NONE"}},Ke);let i=Kn(e,t,0).scaleFactor;return"PT"===r&&t.isPreScaled?a={windowWidth:5,windowCenter:2.5}:void 0!==t.windowWidth&&void 0!==t.windowCenter&&(a={windowWidth:Array.isArray(t.windowWidth)?t.windowWidth[0]:t.windowWidth,windowCenter:Array.isArray(t.windowCenter)?t.windowCenter[0]:t.windowCenter}),{scale:i,translation:{x:0,y:0},voi:a,invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,modality:r,voiLUT:t.voiLUT,colormap:void 0!==n?n:t.colormap,displayedArea:{tlhc:{x:1,y:1},brhc:{x:t.columns,y:t.rows},rowPixelSpacing:void 0===t.rowPixelSpacing?1:t.rowPixelSpacing,columnPixelSpacing:void 0===t.columnPixelSpacing?1:t.columnPixelSpacing,presentationSizeMode:"NONE"}}}function Ki(e,t){return $u(e).transformPoint(t)}function Ko(e,t=!1){let r=e.canvas.width,n=e.canvas.height;if(!function(e){let{canvas:t}=e,{clientWidth:r,clientHeight:n}=t;(t.width!==r||t.height!==n)&&(t.width=r,t.height=n)}(e),void 0!==e.image){let a,i,o,l,s,d;if(t||(a=e.viewport.scale,o=Math.round((i=Kr(e.image,e.viewport.rotation)).width*a),l=Math.round(i.height*a),s=e.viewport.translation.x,d=e.viewport.translation.y,o===r&&l<=n||o<=r&&l===n&&0===s&&0===d))!function(e){let{image:t}=e;e.viewport.scale=Kn(e.canvas,t,e.viewport.rotation).scaleFactor,e.viewport.translation.x=0,e.viewport.translation.y=0}(e);else{let t,a,i;t=e.viewport.scale,a=e.canvas.width,i=Math.sqrt(a/r*(e.canvas.height/n)),e.viewport.scale=i*t}}}let Kl=[{id:"initialImages",retrieveType:"single"}],Ks=[{offset:-1,imageQualityStatus:B1.ADJACENT_REPLICATE},{offset:1,imageQualityStatus:B1.ADJACENT_REPLICATE},{offset:2,imageQualityStatus:B1.FAR_REPLICATE}],Kd=[{id:"initialImages",positions:[.5,0,-1],retrieveType:"default",requestType:Ff.Thumbnail,priority:5,nearbyFrames:Ks},{id:"quarterThumb",decimate:4,offset:3,requestType:Ff.Thumbnail,retrieveType:"multipleFast",priority:6,nearbyFrames:Ks},{id:"halfThumb",decimate:4,offset:1,priority:7,requestType:Ff.Thumbnail,retrieveType:"multipleFast",nearbyFrames:Ks},{id:"quarterFull",decimate:4,offset:2,priority:8,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"halfFull",decimate:4,offset:0,priority:9,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"threeQuarterFull",decimate:4,offset:1,priority:10,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"finalFull",decimate:4,offset:3,priority:11,requestType:Ff.Thumbnail,retrieveType:"multipleFinal"},{id:"errorRetrieve"}];class Ku{constructor(e){this.name=e||"unknown"}static as(e){if(e.iterator)return e.iterator;let t=new Ku("as iterator");return e.then(e=>{try{t.add(e,!0)}catch(e){t.reject(e)}},e=>{t.reject(e)}),t}add(e,t=!1){this.nextValue=e,this.done||=t,this.waiting&&(this.waiting.resolve(e),this.waiting=void 0)}resolve(){this.done=!0,this.waiting&&(this.waiting.resolve(this.nextValue),this.waiting=void 0)}reject(e){this.rejectReason=e,this.waiting?.reject(e)}getRecent(){if(this.rejectReason)throw this.rejectReason;return this.nextValue}async *[Symbol.asyncIterator](){for(;!this.done;){if(this.rejectReason)throw this.rejectReason;if(void 0!==this.nextValue&&(yield this.nextValue,this.done))break;this.waiting||(this.waiting={},this.waiting.promise=new Promise((e,t)=>{this.waiting.resolve=e,this.waiting.reject=t})),await this.waiting.promise}yield this.nextValue}async forEach(e,t){let r=0;try{for await(let n of this){let{done:a}=this;try{await e(n,a,r),r++}catch(e){if(!a){console.warn("Caught exception in intermediate value",e);continue}if(t)t(e,a);else throw e}}}catch(e){if(t)t(e,!0);else throw e}}generate(e,t){return e(this,this.reject.bind(this)).then(()=>{this.done||this.resolve()},e=>{this.reject(e),t?t(e):console.warn("Couldn't process because",e)})}async nextPromise(){for await(let e of this)if(e)return e;return this.nextValue}async donePromise(){for await(let e of this);return this.nextValue}getNextPromise(){let e=this.nextPromise();return e.iterator=this,e}getDonePromise(){let e=this.donePromise();return e.iterator=this,e}}class Kc{constructor(e){this.stages=e.stages||Kl,this.retrieveOptions=e.retrieveOptions||{}}loadImages(e,t){return new Kh(this,e,t).loadImages()}}Kc.createProgressive=Kp,Kc.interleavedRetrieveStages={stages:Kd},Kc.singleRetrieveStages={stages:Kl},Kc.sequentialRetrieveStages={stages:[{id:"lossySequential",retrieveType:"singleFast"},{id:"finalSequential",retrieveType:"singleFinal"}]};class Kh{constructor(e,t,r){this.outstandingRequests=0,this.stageStatusMap=new Map,this.displayedIterator=new Ku("displayed"),this.stages=e.stages,this.retrieveOptions=e.retrieveOptions,this.imageIds=t,this.listener=r}async loadImages(){let e=this.createStageRequests();for(let t of(this.outstandingRequests=e.length,e))this.addRequest(t);return 0===this.outstandingRequests?Promise.resolve(null):this.displayedIterator.getDonePromise()}sendRequest(e,t){let{imageId:r,next:n}=e,a=(t,a)=>{this.listener.errorCallback(r,l||!n,t),a&&this.updateStageStatus(e.stage,t)},i=(t.loader||$9)(r,t),o=Ku.as(i),l=!1;return o.forEach(async(t,n)=>{let a=$U.getImageQuality(r);if(!t)return void console.warn("No image retrieved",r);let{imageQualityStatus:i}=t;(l||=i===B1.FULL_RESOLUTION,void 0!==a&&a>i)?this.updateStageStatus(e.stage,null,!0):(this.listener.successCallback(r,t),this.displayedIterator.add(t),n&&this.updateStageStatus(e.stage),function(e,t,r){if(t?.nearbyRequests?.length)for(let n of t.nearbyRequests)try{let{itemId:t,imageQualityStatus:a}=n,i=$U.getImageQuality(t);if(void 0!==i&&i>=a)continue;let o={...r,imageId:t,imageQualityStatus:a};$U.setPartialImage(t,o),e.successCallback(t,o)}catch(e){console.warn("Couldn't fill nearby item ",n.itemId,e)}}(this.listener,e,t))},a).finally(()=>{if(!l&&n)$U.setPartialImage(r,void 0,!0),this.addRequest(n,t.streamingData);else{l||this.listener.errorCallback(r,!0,"Couldn't decode"),this.outstandingRequests--;for(let e=n;e;e=e.next)this.updateStageStatus(e.stage,null,!0)}this.outstandingRequests<=0&&this.displayedIterator.resolve()}),o.getDonePromise().catch(e=>null)}addRequest(e,t={}){let{imageId:r,stage:n}=e,a=this.listener.getLoaderImageOptions(r);if(!a)return;let{retrieveType:i="default"}=n,{retrieveOptions:o}=this,l=o[i]||o.default,s={...a,retrieveType:i,retrieveOptions:l,streamingData:t},d=n.priority??-5,u=n.requestType||Ff.Interaction;$3.addRequest(this.sendRequest.bind(this,e,s),u,{imageId:r},d)}updateStageStatus(e,t,r=!1){let{id:n}=e,a=this.stageStatusMap.get(n);if(a&&(a.imageLoadPendingCount--,t?a.imageLoadFailedCount++:!r&&a.totalImageCount++,r||a.stageStartTime||(a.stageStartTime=Date.now()),!a.imageLoadPendingCount)){let{imageLoadFailedCount:e,totalImageCount:t,stageStartTime:r=Date.now(),startTime:i}=a,o={stageId:n,numberOfFailures:e,numberOfImages:t,stageDurationInMS:r?Date.now()-r:null,startDurationInMS:Date.now()-i};jq(jH,Fm.IMAGE_RETRIEVAL_STAGE,o),this.stageStatusMap.delete(n)}}createStageRequests(){let e=[],t=new Map,r=(r,n)=>{let a=n<0?this.imageIds.length+n:n<1?Math.floor((this.imageIds.length-1)*n):n,i=this.imageIds[a];if(!i)throw Error(`No value found to add to requests at ${n}`);let o={imageId:i,stage:r,index:a,nearbyRequests:this.findNearbyRequests(a,r)};this.addStageStatus(r);let l=t.get(i);l?l.next=o:e.push(o),t.set(i,o)};for(let e of this.stages)(e.positions||function(e,t,r=0){let n=[];for(let a=r;a<e.length;a+=t)n.push(a);return n}(this.imageIds,e.decimate||1,e.offset??0)).forEach(t=>{r(e,t)});return e}findNearbyRequests(e,t){let r=[];if(!t.nearbyFrames)return r;for(let n of t.nearbyFrames){let t=e+n.offset;t<0||t>=this.imageIds.length||r.push({itemId:this.imageIds[t],imageQualityStatus:n.imageQualityStatus,index:t})}return r}addStageStatus(e){let{id:t}=e,r=this.stageStatusMap.get(t)||{stageId:t,startTime:Date.now(),stageStartTime:null,totalImageCount:0,imageLoadFailedCount:0,imageLoadPendingCount:0};return r.imageLoadPendingCount++,this.stageStatusMap.set(t,r),r}}function Kp(e){return new Kc(e)}function Km(e,t){let{hflip:r,vflip:n,rotation:a}=t;if(e.x*=r?-1:1,e.y*=n?-1:1,0!==a){let t=a*Math.PI/180,r=Math.cos(t),n=Math.sin(t),i=e.x*r-e.y*n,o=e.x*n+e.y*r;e.x=i,e.y=o}return e}function Kf(e,t){let{direction:r,spacing:n}=e,a=r.slice(0,3),i=r.slice(3,6),o=r.slice(6,9),l=[LJ.vec3.dot(a,t),LJ.vec3.dot(i,t),LJ.vec3.dot(o,t)],s=LJ.vec3.create();return LJ.vec3.set(s,l[0]*n[0],l[1]*n[1],l[2]*n[2]),LJ.vec3.length(s)}let Kg=jA.getLogger("utilities","getClosestImageId");function Ky(e,t,r,n){let a,i,{direction:o,spacing:l,imageIds:s}=e,{ignoreSpacing:d=!1}=n||{};if(!s?.length)return;let u=o.slice(6,9);if(Math.abs(LJ.vec3.dot(u,r))<1-B7)return;d||(a=Kf({direction:o,spacing:l},r)/2);let c=1/0;for(let e=0;e<s.length;e++){let n=s[e],o=qd(B2.IMAGE_PLANE,n);if(!o?.imagePositionPatient){Kg.warn(`Missing imagePositionPatient for imageId: ${n}`);continue}let{imagePositionPatient:l}=o,u=LJ.vec3.create();LJ.vec3.sub(u,t,l);let h=Math.abs(LJ.vec3.dot(u,r));d?h<c&&(c=h,i=n):h<a&&h<c&&(c=h,i=n)}return void 0===i&&Kg.warn("No imageId found within the specified criteria (half spacing or absolute closest)."),i}function Kv(e,t,r,n){let a=LJ.vec3.clone(e);if(r&&LJ.vec3.negate(a,a),t){var i;let e,t,r=LJ.vec3.cross(LJ.vec3.create(),n,a);LJ.vec3.normalize(r,r),i=a,e=LJ.vec3.dot(i,r),t=LJ.vec3.scale(LJ.vec3.create(),r,2*e),a=LJ.vec3.sub(LJ.vec3.create(),i,t)}return a}function Kb(){return j3?.rendering?.renderingEngineMode===B5.ContextPool}var Kw={FLAT:0,GOURAUD:1,PHONG:2},Kx={POINTS:0,WIREFRAME:1,SURFACE:2},KC={Shading:Kw,Representation:Kx,Interpolation:Kw},Kk={CLAMP_TO_EDGE:0,REPEAT:1,MIRRORED_REPEAT:2},KM={NEAREST:0,LINEAR:1,NEAREST_MIPMAP_NEAREST:2,NEAREST_MIPMAP_LINEAR:3,LINEAR_MIPMAP_NEAREST:4,LINEAR_MIPMAP_LINEAR:5},KS={Wrap:Kk,Filter:KM},KE=new Float32Array(1),KT=new Int32Array(KE.buffer),KI={fromHalf:function(e){let t=(32768&e)>>15,r=(31744&e)>>10,n=1023&e;return 0===r?(t?-1:1)*6103515625e-14*(n/1024):31===r?n?NaN:1/0*(t?-1:1):(t?-1:1)*2**(r-15)*(1+n/1024)},toHalf:function(e){KE[0]=e;let t=KT[0],r=t>>16&32768,n=t>>12&2047,a=t>>23&255;return a<103?r:a>142?(r|=31744,r|=+(255!==a)&&8388607&t):a<113?(n|=2048,r|=(n>>114-a)+(n>>113-a&1)):(r|=a-112<<10|n>>1,r+=1&n)}},{vtkErrorMacro:KP}=W4,KD={renderable:null,myFactory:null,children:[],visited:!1};function K_(e,t,r={}){let n;Object.assign(t,KD,r),W4.obj(e,t),W4.event(e,t,"event"),t._renderableChildMap=new Map,W4.get(e,t,["visited"]),W4.setGet(e,t,["_parent","renderable","myFactory"]),W4.getArray(e,t,["children"]),W4.moveToProtected(e,t,["parent"]),t.classHierarchy.push("vtkViewNode"),e.build=e=>{},e.render=e=>{},e.traverse=r=>{let n=e[r.getTraverseOperation()];if(n)return void n(r);e.apply(r,!0);for(let e=0;e<t.children.length;e++)t.children[e].traverse(r);e.apply(r,!1)},e.apply=(t,r)=>{let n=e[t.getOperation()];n&&n(r,t)},e.getViewNodeFor=(r,n=null)=>{if(n&&n.renderable===r)return n;if(t.renderable===r)return e;for(let e=0;e<t.children.length;++e){let n=t.children[e].getViewNodeFor(r);if(n)return n}},e.getFirstAncestorOfType=e=>t._parent?t._parent.isA(e)?t._parent:t._parent.getFirstAncestorOfType(e):null,e.getLastAncestorOfType=e=>{if(!t._parent)return null;let r=t._parent.getLastAncestorOfType(e);return r||(t._parent.isA(e)?t._parent:null)},e.addMissingNode=r=>{if(!r)return;let n=t._renderableChildMap.get(r);if(void 0!==n)return n.setVisited(!0),n;let a=e.createViewNode(r);if(a)return a.setParent(e),a.setVisited(!0),t._renderableChildMap.set(r,a),t.children.push(a),a},e.addMissingNodes=(r,n=!1)=>{let a;if(r&&r.length)for(let i=0;i<r.length;++i){let o=r[i],l=e.addMissingNode(o);n&&void 0!==l&&(void 0===a?a=t.children.lastIndexOf(l):t.children[a]!==l&&function(e,r){for(let n=0;n<t.children.length;++n){let a=(r+1+n)%t.children.length;if(t.children[a]===e)return t.children[a]=t.children[r],t.children[r]=e,!0}}(t.children,l),a++)}},e.addMissingChildren=r=>{if(r&&r.length)for(let n=0;n<r.length;++n){let a=r[n];if(-1===t.children.indexOf(a)){a.setParent(e),t.children.push(a);let r=a.getRenderable();r&&t._renderableChildMap.set(r,a)}a.setVisited(!0)}},e.removeNode=e=>{let r=t.children.findIndex(t=>t===e);if(r<0)return!1;let n=e.getRenderable();return n&&t._renderableChildMap.delete(n),e.delete(),t.children.splice(r,1),!0},e.prepareNodes=()=>{for(let e=0;e<t.children.length;++e)t.children[e].setVisited(!1)},e.setVisited=e=>{t.visited=e},e.removeUnusedNodes=()=>{let e=0;for(let r=0;r<t.children.length;++r){let n=t.children[r];if(n.getVisited())t.children[e++]=n,n.setVisited(!1);else{let e=n.getRenderable();e&&t._renderableChildMap.delete(e),n.delete()}}t.children.length=e},e.createViewNode=e=>{if(!t.myFactory)return KP("Cannot create view nodes without my own factory"),null;let r=t.myFactory.createNode(e);return r&&r.setRenderable(e),r},n=e.delete,e.delete=()=>{for(let e=0;e<t.children.length;e++)t.children[e].delete();n()}}var KA={newInstance:W4.newInstance(K_,"vtkViewNode"),extend:K_,PASS_TYPES:["Build","Render"]},{vtkWarningMacro:KO}=W4,KR={};function KN(e,t,r={}){Object.assign(t,KR,r),W4.obj(e,t),t.overrides||(t.overrides={}),t.classHierarchy.push("vtkViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=function(e){let t=[],r=0,n=e.getClassName(r++);for(;n;)t.push(n),n=e.getClassName(r++);return t}(r),a=0,i=n[a++],o=!1,l=Object.keys(t.overrides);for(;i&&!o;)-1!==l.indexOf(i)?o=!0:i=r.getClassName(a++);if(!o){var s;let t;return n.includes("vtkAbstractWidget")||n.includes("vtkWidgetRepresentation")?null:(KO((s=e.getClassName(),t=n.join(" → "),`No ${s} implementation found for ${n[0]}.
|
|
38
38
|
Class hierarchy: ${t}.
|
|
39
39
|
A rendering Profile is likely missing for ${n[0]}.
|
|
40
40
|
Try importing '@kitware/vtk.js/Rendering/Profiles/All' or 'vtk.js/Sources/Rendering/Profiles/All',
|