@vertexvis/viewer 1.0.2-canary.7 → 1.0.2-testing.0

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.
Files changed (145) hide show
  1. package/dist/cjs/{config-BsqvZSt9.js → config-20ozv4y8.js} +3 -3
  2. package/dist/cjs/{config-BsqvZSt9.js.map → config-20ozv4y8.js.map} +1 -1
  3. package/dist/cjs/{entities-ByDO45G0.js → entities-D6kgGria.js} +4 -4
  4. package/dist/cjs/{entities-ByDO45G0.js.map → entities-D6kgGria.js.map} +1 -1
  5. package/dist/cjs/{geometry_pb-CuOYGIHT.js → geometry_pb-BTko2Wi0.js} +3 -3
  6. package/dist/cjs/{geometry_pb-CuOYGIHT.js.map → geometry_pb-BTko2Wi0.js.map} +1 -1
  7. package/dist/cjs/index.cjs.js +5 -5
  8. package/dist/cjs/{png-decoder-3NSToOjc.js → png-decoder-CJbE7UJh.js} +112 -112
  9. package/dist/cjs/png-decoder-CJbE7UJh.js.map +1 -0
  10. package/dist/cjs/{queries-CwDJxlsL.js → queries-Da9I-xMf.js} +4 -4
  11. package/dist/cjs/{queries-CwDJxlsL.js.map → queries-Da9I-xMf.js.map} +1 -1
  12. package/dist/cjs/{regl-component-DTvmpYVa.js → regl-component-HhKCyGQ3.js} +3 -3
  13. package/dist/cjs/{regl-component-DTvmpYVa.js.map → regl-component-HhKCyGQ3.js.map} +1 -1
  14. package/dist/cjs/{representation_pb-BU8a5Ico.js → representation_pb-CrCGjlyP.js} +3 -3
  15. package/dist/cjs/{representation_pb-BU8a5Ico.js.map → representation_pb-CrCGjlyP.js.map} +1 -1
  16. package/dist/cjs/{streamAttributes-BVp1vEp3.js → streamAttributes-D_J-W8-2.js} +3 -3
  17. package/dist/cjs/{streamAttributes-BVp1vEp3.js.map → streamAttributes-D_J-W8-2.js.map} +1 -1
  18. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
  19. package/dist/cjs/vertex-scene-tree.cjs.entry.js +2 -2
  20. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
  21. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +2 -2
  22. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +2 -2
  23. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +2 -2
  24. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +2 -2
  25. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +4 -4
  26. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +3 -3
  27. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +2 -2
  28. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +1 -1
  29. package/dist/cjs/vertex-viewer.cjs.entry.js +4 -4
  30. package/dist/components/index.js +1 -1
  31. package/dist/components/{p-BfAW7IWG.js → p-B9R0QWr4.js} +2 -2
  32. package/dist/components/{p-CmtoXwYo.js → p-BCOD9yfw.js} +2 -2
  33. package/dist/components/{p-ux26QLbe.js → p-BOJJZ1cN.js} +2 -2
  34. package/dist/components/{p-C7GhKZ4q.js → p-CAugdB_8.js} +2 -2
  35. package/dist/components/{p-C9y2eVBq.js → p-CZCXdo3t.js} +2 -2
  36. package/dist/components/p-CycTYKAk.js +5 -0
  37. package/dist/components/{p-BnIeyVZl.js.map → p-CycTYKAk.js.map} +1 -1
  38. package/dist/components/{p-DTDKqbV2.js → p-D12q-fpW.js} +2 -2
  39. package/dist/components/{p-kVbpvDF1.js → p-DF4kEsJU.js} +2 -2
  40. package/dist/components/{p-D9oqIZ3P.js → p-DRnMrHWY.js} +2 -2
  41. package/dist/components/{p-B6mpmA2-.js → p-abSJ29r7.js} +2 -2
  42. package/dist/components/{p-CCPuHP2m.js → p-ahjMltGJ.js} +2 -2
  43. package/dist/components/vertex-scene-tree-table-cell.js +1 -1
  44. package/dist/components/vertex-scene-tree.js +1 -1
  45. package/dist/components/vertex-viewer-dom-renderer.js +1 -1
  46. package/dist/components/vertex-viewer-hit-result-indicator.js +1 -1
  47. package/dist/components/vertex-viewer-measurement-details.js +1 -1
  48. package/dist/components/vertex-viewer-measurement-distance.js +1 -1
  49. package/dist/components/vertex-viewer-measurement-overlays.js +1 -1
  50. package/dist/components/vertex-viewer-measurement-precise.js +1 -1
  51. package/dist/components/vertex-viewer-pin-group.js +1 -1
  52. package/dist/components/vertex-viewer-pin-tool.js +1 -1
  53. package/dist/components/vertex-viewer-transform-widget.js +1 -1
  54. package/dist/components/vertex-viewer-view-cube.js +1 -1
  55. package/dist/components/vertex-viewer.js +1 -1
  56. package/dist/esm/{config-SMudJna8.js → config-lglER3mU.js} +3 -3
  57. package/dist/esm/{config-SMudJna8.js.map → config-lglER3mU.js.map} +1 -1
  58. package/dist/esm/{entities-uAlr5vlE.js → entities-zRken6VS.js} +4 -4
  59. package/dist/esm/{entities-uAlr5vlE.js.map → entities-zRken6VS.js.map} +1 -1
  60. package/dist/esm/{geometry_pb-CMlgBITt.js → geometry_pb-BiZRfctN.js} +3 -3
  61. package/dist/esm/{geometry_pb-CMlgBITt.js.map → geometry_pb-BiZRfctN.js.map} +1 -1
  62. package/dist/esm/index.js +5 -5
  63. package/dist/esm/index.mjs +5 -5
  64. package/dist/esm/{png-decoder-Bjioht9N.js → png-decoder-CiunTuhu.js} +112 -112
  65. package/dist/esm/png-decoder-CiunTuhu.js.map +1 -0
  66. package/dist/esm/{queries-CgeSF7hf.js → queries-DEzCmbTD.js} +4 -4
  67. package/dist/esm/{queries-CgeSF7hf.js.map → queries-DEzCmbTD.js.map} +1 -1
  68. package/dist/esm/{regl-component-WqWCp9d-.js → regl-component-DmkowWhg.js} +3 -3
  69. package/dist/esm/{regl-component-WqWCp9d-.js.map → regl-component-DmkowWhg.js.map} +1 -1
  70. package/dist/esm/{representation_pb-BXvH1L33.js → representation_pb-g4f0WC4k.js} +3 -3
  71. package/dist/esm/{representation_pb-BXvH1L33.js.map → representation_pb-g4f0WC4k.js.map} +1 -1
  72. package/dist/esm/{streamAttributes-6asiWDkT.js → streamAttributes-Cp8PEH9A.js} +3 -3
  73. package/dist/esm/{streamAttributes-6asiWDkT.js.map → streamAttributes-Cp8PEH9A.js.map} +1 -1
  74. package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
  75. package/dist/esm/vertex-scene-tree.entry.js +2 -2
  76. package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
  77. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +2 -2
  78. package/dist/esm/vertex-viewer-measurement-details.entry.js +2 -2
  79. package/dist/esm/vertex-viewer-measurement-distance.entry.js +2 -2
  80. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +2 -2
  81. package/dist/esm/vertex-viewer-measurement-precise.entry.js +4 -4
  82. package/dist/esm/vertex-viewer-pin-group.entry.js +3 -3
  83. package/dist/esm/vertex-viewer-transform-widget.entry.js +2 -2
  84. package/dist/esm/vertex-viewer-view-cube.entry.js +1 -1
  85. package/dist/esm/vertex-viewer.entry.js +4 -4
  86. package/dist/viewer/index.esm.js +1 -1
  87. package/dist/viewer/p-051b5154.entry.js +5 -0
  88. package/dist/viewer/{p-a5ed36cd.entry.js.map → p-051b5154.entry.js.map} +1 -1
  89. package/dist/viewer/{p-4dbad46f.entry.js → p-11cf755a.entry.js} +2 -2
  90. package/dist/viewer/{p-833d698b.entry.js → p-16775f7d.entry.js} +2 -2
  91. package/dist/viewer/{p-a866cbdb.entry.js → p-1eb636f8.entry.js} +2 -2
  92. package/dist/viewer/{p-bb18c218.entry.js → p-33f44cc1.entry.js} +2 -2
  93. package/dist/viewer/{p-9556c963.entry.js → p-35601c85.entry.js} +2 -2
  94. package/dist/viewer/{p-40dba623.entry.js → p-8c369777.entry.js} +2 -2
  95. package/dist/viewer/{p-Dx_kRMQd.js → p-BDvACHun.js} +2 -2
  96. package/dist/viewer/{p-Dx_kRMQd.js.map → p-BDvACHun.js.map} +1 -1
  97. package/dist/viewer/p-CZXGNc0T.js +5 -0
  98. package/dist/viewer/p-CZXGNc0T.js.map +1 -0
  99. package/dist/viewer/{p-B7IxKAst.js → p-ChqXy0cG.js} +2 -2
  100. package/dist/viewer/{p-B7IxKAst.js.map → p-ChqXy0cG.js.map} +1 -1
  101. package/dist/viewer/{p-BYm9621A.js → p-CyGlYje2.js} +2 -2
  102. package/dist/viewer/{p-BYm9621A.js.map → p-CyGlYje2.js.map} +1 -1
  103. package/dist/viewer/{p-DNam7E02.js → p-D6eJC1q4.js} +2 -2
  104. package/dist/viewer/{p-DNam7E02.js.map → p-D6eJC1q4.js.map} +1 -1
  105. package/dist/viewer/{p-BJm7oO2_.js → p-Dp56p_jX.js} +2 -2
  106. package/dist/viewer/{p-BJm7oO2_.js.map → p-Dp56p_jX.js.map} +1 -1
  107. package/dist/viewer/{p-Chfn1uMz.js → p-F8e15or2.js} +2 -2
  108. package/dist/viewer/{p-Chfn1uMz.js.map → p-F8e15or2.js.map} +1 -1
  109. package/dist/viewer/{p-CvVOQvMo.js → p-WPRMWirY.js} +2 -2
  110. package/dist/viewer/{p-CvVOQvMo.js.map → p-WPRMWirY.js.map} +1 -1
  111. package/dist/viewer/{p-04ebf937.entry.js → p-a8a81cba.entry.js} +2 -2
  112. package/dist/viewer/{p-4d5c68b4.entry.js → p-c7e62d66.entry.js} +2 -2
  113. package/dist/viewer/{p-578409b2.entry.js → p-e9b83dae.entry.js} +2 -2
  114. package/dist/viewer/{p-69aeb12a.entry.js → p-f271dc4a.entry.js} +2 -2
  115. package/dist/viewer/{p-9161d8c7.entry.js → p-f65c0769.entry.js} +2 -2
  116. package/dist/viewer/viewer.esm.js +1 -1
  117. package/package.json +10 -10
  118. package/dist/cjs/png-decoder-3NSToOjc.js.map +0 -1
  119. package/dist/components/p-BnIeyVZl.js +0 -5
  120. package/dist/esm/png-decoder-Bjioht9N.js.map +0 -1
  121. package/dist/types/web-workers.d.ts +0 -1
  122. package/dist/viewer/p-CmW2ZNHt.js +0 -5
  123. package/dist/viewer/p-CmW2ZNHt.js.map +0 -1
  124. package/dist/viewer/p-a5ed36cd.entry.js +0 -5
  125. /package/dist/components/{p-BfAW7IWG.js.map → p-B9R0QWr4.js.map} +0 -0
  126. /package/dist/components/{p-CmtoXwYo.js.map → p-BCOD9yfw.js.map} +0 -0
  127. /package/dist/components/{p-ux26QLbe.js.map → p-BOJJZ1cN.js.map} +0 -0
  128. /package/dist/components/{p-C7GhKZ4q.js.map → p-CAugdB_8.js.map} +0 -0
  129. /package/dist/components/{p-C9y2eVBq.js.map → p-CZCXdo3t.js.map} +0 -0
  130. /package/dist/components/{p-DTDKqbV2.js.map → p-D12q-fpW.js.map} +0 -0
  131. /package/dist/components/{p-kVbpvDF1.js.map → p-DF4kEsJU.js.map} +0 -0
  132. /package/dist/components/{p-D9oqIZ3P.js.map → p-DRnMrHWY.js.map} +0 -0
  133. /package/dist/components/{p-B6mpmA2-.js.map → p-abSJ29r7.js.map} +0 -0
  134. /package/dist/components/{p-CCPuHP2m.js.map → p-ahjMltGJ.js.map} +0 -0
  135. /package/dist/viewer/{p-4dbad46f.entry.js.map → p-11cf755a.entry.js.map} +0 -0
  136. /package/dist/viewer/{p-833d698b.entry.js.map → p-16775f7d.entry.js.map} +0 -0
  137. /package/dist/viewer/{p-a866cbdb.entry.js.map → p-1eb636f8.entry.js.map} +0 -0
  138. /package/dist/viewer/{p-bb18c218.entry.js.map → p-33f44cc1.entry.js.map} +0 -0
  139. /package/dist/viewer/{p-9556c963.entry.js.map → p-35601c85.entry.js.map} +0 -0
  140. /package/dist/viewer/{p-40dba623.entry.js.map → p-8c369777.entry.js.map} +0 -0
  141. /package/dist/viewer/{p-04ebf937.entry.js.map → p-a8a81cba.entry.js.map} +0 -0
  142. /package/dist/viewer/{p-4d5c68b4.entry.js.map → p-c7e62d66.entry.js.map} +0 -0
  143. /package/dist/viewer/{p-578409b2.entry.js.map → p-e9b83dae.entry.js.map} +0 -0
  144. /package/dist/viewer/{p-69aeb12a.entry.js.map → p-f271dc4a.entry.js.map} +0 -0
  145. /package/dist/viewer/{p-9161d8c7.entry.js.map → p-f65c0769.entry.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import{t,p as i,H as s,d as n,h as e,e as o}from"./p-Bb32XUUS.js";import{p as a,v as r,a as h,b as c,r as l,c as d,d as u,e as f}from"./p-DDQcM-So.js";import{s as m}from"./p-B2_E6tqs.js";import{t as p,p as v,S as w,a as g,c as y,W as C}from"./p-BoB09nlv.js";import{m as b,E as S,a as I,c as P,d as T,o as A,u as k,b as D}from"./p-CHdoymO5.js";import{c as E}from"./p-C6gMOKYg.js";import{u as M,I as x,p as R,C as B,W as L,S as z,V as H,M as O,a as $,b as j}from"./p--8q6LyIm.js";import{p as V}from"./p-D9oqIZ3P.js";import{s as K,r as F}from"./p-FRKLa468.js";import{r as N,a as W,c as q}from"./p-CjG1fMh1.js";import{h as U,i as _,j as J,k as G,l as X,m as Z,n as Y,o as Q,p as tt,E as it,u as st,t as nt,q as et,r as ot,s as at,v as rt,w as ht,x as ct,y as lt,z as dt,B as ut,C as ft,G as mt,H as pt,I as vt,J as wt,K as gt,L as yt,M as Ct,N as bt}from"./p-BfAW7IWG.js";import{t as St,m as It,n as Pt,j as Tt,M as At,k as kt,S as Dt}from"./p-C7GhKZ4q.js";import{p as Et}from"./p-CCPuHP2m.js";import{C as Mt}from"./p-B-ToCp8-.js";import{g as xt,c as Rt}from"./p-bal2RLiw.js";import{V as Bt}from"./p-BHAaIoH5.js";import{B as Lt,M as zt}from"./p-3DqRAYgO.js";import{w as Ht}from"./p-Cd7kap5W.js";const Ot=0;const $t=255;class jt{constructor(t){this.viewer=t;this.handleInteractionStarted=()=>{this.invalidateStencilBuffer();this.pendingInteractionFinished=new Promise((t=>{this.pendingInteractionFinishedResolver=t}))};this.handleInteractionFinished=()=>{var t;(t=this.pendingInteractionFinishedResolver)===null||t===void 0?void 0:t.call(this);this.pendingInteractionFinished=undefined;this.pendingInteractionFinishedResolver=undefined};this.invalidateStencilBuffer=()=>{this.pendingStencilBuffer=undefined};t.addEventListener("interactionStarted",this.handleInteractionStarted);t.addEventListener("interactionFinished",this.handleInteractionFinished);t.addEventListener("frameReceived",(()=>{this.invalidateStencilBuffer()}))}async fetch(){var t;const i=await this.viewer.isSceneReady();const s=i?await this.viewer.scene():undefined;const n=s!=null?s.crossSectioning().current().sectionPlanes.length>0||this.viewer.featureLines!=null:false;const e=(t=this.viewer.frame)===null||t===void 0?void 0:t.scene.camera;if(n&&this.viewer.stream!=null&&e!=null){const t=await this.viewer.stream.getStencilBuffer({includeDepthBuffer:true});const{stencilBuffer:i,depthBuffer:s,imageAttributes:n}=U(t);const[o,a]=await Promise.all([_(new Uint8Array(i)),_(new Uint8Array(s))]);return Vt.fromPng(o,n,i,J.fromPng(a,e,n))}else return undefined}latest(){if(this.pendingStencilBuffer==null){this.pendingStencilBuffer=this.fetch()}return this.pendingStencilBuffer}async latestAfterInteraction(){await this.pendingInteractionFinished;return this.latest()}}class Vt{constructor(t,i,s,n,e){this.imageAttr=t;this.imageBytes=i;this.pixelBytes=s;this.imageChannels=n;this.depthBuffer=e}static fromPng(t,i,s,n){if(!(t.data instanceof Uint8Array)){throw new Error("Expected stencil PNG to have depth of 8-bit")}else if(t.channels!==1){throw new Error("Expected stencil PNG to have 1 color channel")}else{return new Vt(i,s,t.data,t.channels,n)}}getValue(t){const{width:i,height:s}=this.imageAttr.imageRect;const n=a.subtract(t,this.imageAttr.imageRect);const e=1/this.imageAttr.imageScale;const o=a.scale(n,e,e);if(o.x>=0&&o.y>=0&&o.x<i&&o.y<s){const t=Math.floor(o.x)+Math.floor(o.y)*i;const s=this.pixelBytes[t];return s}else return 0}hitTest(t){return this.getValue(t)!==Ot}snapToNearestPixel(t,i,s=()=>true){const n=i*2;const e=a.create(t.x-i,t.y-i);const o=[];for(let r=0;r<n*n;r++){const h=r%n;const c=Math.floor(r/n);const l=a.add(e,{x:h,y:c});if(a.distance(l,t)<=i){const t=this.getValue(l);if(t===$t&&s(t)){o.push(l)}}}const r=o.sort(((i,s)=>a.distance(i,t)-a.distance(s,t)));const h=r[0];return h!=null?a.create(Math.floor(h.x)+.5,Math.floor(h.y)+.5):t}}function Kt(t){return new Promise((i=>setTimeout(i,t)))}const Ft=b.defineMapper(b.compose((t=>t.toObject()),b.read(b.mapRequiredProp("id",G),b.mapRequiredProp("createdAt",X),b.mapRequiredProp("modifiedAt",X),b.mapProp("name",Z),b.mapProp("suppliedId",Z))),(([t,i,s,n,e])=>({id:t,createdAt:i,modifiedAt:s,name:n,suppliedId:e})));const Nt=b.ifInvalidThrow(Ft);const Wt=b.defineMapper(b.compose((t=>t.toObject()),b.read(b.mapRequiredProp("id",G),b.mapRequiredProp("createdAt",X),b.mapRequiredProp("modifiedAt",X),b.mapProp("suppliedId",Z),b.mapRequiredProp("data",(t=>{if(t.callout!=null){return Ut(t.callout)}else if(t.customJson!=null){return _t(t.customJson)}else{throw new Error("Undefined or unknown annotation data.")}})))),(([t,i,s,n,e])=>({id:t,createdAt:i,modifiedAt:s,suppliedId:n,data:e})));const qt=b.ifInvalidThrow(Wt);const Ut=b.defineMapper(b.read(b.mapRequiredProp("position",Y),b.mapProp("icon",Z),b.mapProp("primaryColor",Z),b.mapProp("accentColor",Z)),(([t,i,s,n])=>({type:"callout",position:t,icon:i,primaryColor:s,accentColor:n})));const _t=b.defineMapper(b.read(b.requiredProp("type"),b.mapRequiredProp("jsonData",(t=>JSON.parse(t)))),(([t,i])=>({type:"custom",jsonType:t,jsonData:i})));class Jt{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s;this.onStateChange=new S}async addAnnotationSet(t){await N((async i=>{const s=this.deviceIdProvider();const n=await q(this.jwtProvider,s);const e=new K.CreateSceneViewAnnotationSetRequest;const o=new M.Uuid;o.setHex(t);e.setSceneAnnotationSetId(o);this.client.createSceneViewAnnotationSet(e,n,i)}));return this.fetch()}disconnect(){if(this.connection!=null){this.connection.dispose();this.connection=undefined}}connect(t=1e4){this.disconnect();const i=this.pollAnnotationState(t);this.connection={dispose:()=>i.abort()}}async fetch(t={}){const i=await this.fetchAnnotationSetsAsArray();const s=await this.fetchAnnotationsAsArray(i);const n=(await Promise.all(s)).reduce(((t,[i,s])=>({annotations:{...t.annotations,[i.id]:s}})),{annotations:{}});if(t.signal==null||!t.signal.aborted){this.updateState(n)}return n}async removeAnnotationSet(t){await N((async i=>{const s=this.deviceIdProvider();const n=await q(this.jwtProvider,s);const e=new K.DeleteSceneViewAnnotationSetRequest;const o=new M.Uuid;o.setHex(t);e.setSceneAnnotationSetId(o);this.client.deleteSceneViewAnnotationSet(e,n,i)}));return this.fetch()}pollAnnotationState(t){const i=new AbortController;const s=async t=>{await this.fetch({signal:i.signal});if(!i.signal.aborted){await Kt(t);await s(t)}};I.abort(i.signal,s(t));return i}fetchAnnotationSets(){return W((t=>async i=>{const s=this.deviceIdProvider();const n=await q(this.jwtProvider,s);const e=new K.ListSceneViewAnnotationSetsRequest;if(t!=null){const i=new V.Pager;i.setCursor(t);i.setLimit(100);e.setPage(i)}this.client.listSceneViewAnnotationSets(e,n,i)}),(t=>{var i;return(i=t.toObject().nextCursor)===null||i===void 0?void 0:i.next}))}async fetchAnnotationSetsAsArray(){return(await I.asArray(this.fetchAnnotationSets())).flatMap((t=>t.getSceneAnnotationSetsList())).map((t=>Nt(t)))}fetchAnnotations(t){return W((i=>async s=>{const n=this.deviceIdProvider();const e=await q(this.jwtProvider,n);const o=new K.ListSceneAnnotationsRequest;const a=St(t);o.setSceneAnnotationSetId(a);if(i!=null){const t=new V.Pager;t.setCursor(i);t.setLimit(100);o.setPage(t)}this.client.listSceneAnnotations(o,e,s)}),(t=>{var i;return(i=t.toObject().nextCursor)===null||i===void 0?void 0:i.next}))}fetchAnnotationsAsArray(t){const i=t.map((async t=>{const i=(await I.asArray(this.fetchAnnotations(t.id))).flatMap((t=>t.getSceneAnnotationsList())).map((t=>qt(t)));return[t,i]}));return Promise.all(i)}updateState(t){this.state=t;this.onStateChange.emit(t)}}const Gt=b.defineMapper(b.read(b.mapRequiredProp("color",Q),b.getProp("thickness")),(([t,i])=>({color:t,thickness:i})));const Xt=b.defineMapper(b.read(b.mapRequiredProp("color",Q)),(([t])=>({color:t})));const Zt=b.defineMapper(b.read(b.pickFirst(b.mapProp("arrow",b.ifDefined((t=>({...t,type:"arrow-end"})))),b.mapProp("circle",b.ifDefined((t=>({...t,type:"circle-end"})))),b.mapProp("dash",b.ifDefined((t=>({...t,type:"dash-end"})))))),(([t])=>t!==null&&t!==void 0?t:undefined));const Yt=b.defineMapper(b.read(b.mapRequiredProp("startPosition",tt),b.mapRequiredProp("endPosition",tt),b.mapProp("strokeStyle",b.ifDefined(Gt)),b.mapProp("fillStyle",b.ifDefined(Xt)),b.mapProp("startShape",b.ifDefined(Zt)),b.mapProp("endShape",b.ifDefined(Zt))),(([t,i,s,n,e,o])=>({type:"line-2d",startPosition:t,endPosition:i,strokeStyle:s,fillStyle:n,startShape:e!==null&&e!==void 0?e:undefined,endShape:o!==null&&o!==void 0?o:undefined})));const Qt=b.defineMapper(b.read(b.mapRequiredProp("topLeft",tt),b.mapRequiredProp("bottomRight",tt),b.mapProp("strokeStyle",b.ifDefined(Gt)),b.mapProp("fillStyle",b.ifDefined(Xt))),(([t,i,s,n])=>({type:"oval-2d",topLeftPosition:t,bottomRightPosition:i,strokeStyle:s,fillStyle:n})));const ti=b.defineMapper(b.read(b.mapRequiredProp("positionsList",b.mapArray(tt)),b.mapProp("strokeStyle",b.ifDefined(Gt)),b.mapProp("fillStyle",b.ifDefined(Xt))),(([t,i,s])=>({type:"freeform-2d",positions:t,strokeStyle:i,fillStyle:s})));const ii=b.defineMapper(b.read(b.mapRequiredProp("primaryColor",Q),b.mapRequiredProp("accentColor",Q),b.mapRequiredProp("position",Y),b.mapProp("sceneItemId",b.ifDefined(G))),(([t,i,s,n])=>({type:"pin-2d",primaryColor:t,accentColor:i,position:s,sceneItemId:n!==null&&n!==void 0?n:undefined})));const si=b.defineMapper(b.read(b.mapRequiredProp("primaryColor",Q),b.mapRequiredProp("accentColor",Q),b.mapRequiredProp("anchorPosition",Y),b.mapRequiredProp("textPosition",tt),b.getProp("text"),b.mapProp("sceneItemId",b.ifDefined(G))),(([t,i,s,n,e,o])=>({type:"callout",primaryColor:t,accentColor:i,anchorPosition:s,textPosition:n,text:e,sceneItemId:o!==null&&o!==void 0?o:undefined})));const ni=b.defineMapper(b.read(b.pickFirst(b.mapProp("line2d",b.ifDefined(Yt)),b.mapProp("oval",b.ifDefined(Qt)),b.mapProp("freeform",b.ifDefined(ti)),b.mapProp("pin",b.ifDefined(ii)),b.mapProp("callout",b.ifDefined(si)))),(([t])=>t!==null&&t!==void 0?t:undefined));const ei=b.defineMapper(b.read(b.mapRequiredProp("itemsList",b.mapArray(ni))),(([t])=>({items:t.filter((t=>t!=null))})));const oi=b.defineMapper(b.read(b.mapRequiredProp("canvas",b.mapRequiredProp("document",b.mapRequiredProp("v1",ei)))),(([t])=>t));const ai=b.ifInvalidThrow(oi);class ri{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s}async getCanvas({canvasId:t,sceneViewStateId:i}){if(t!=null&&i!=null){throw new Error("Invalid request. Only one lookup ID between `canvasId` and `sceneViewStateId` can be provided.")}const s=await N((async s=>{const n=this.deviceIdProvider();const e=await q(this.jwtProvider,n);const o=new K.GetCanvasRequest;if(t!=null){const i=St(t);o.setCanvasId(i)}else if(i!=null){const t=St(i);o.setSceneViewStateId(t)}this.client.getCanvas(o,e,s)}));return ai(s.toObject())}}class hi{constructor(t,i,s){this.stream=t;this.configProvider=i;this.imageScaleProvider=s}predicate(t){return t.altKey&&!t.shiftKey}async fn(t){var i;const s=this.imageScaleProvider();const n=await this.stream.hitItems({point:a.scale(t.position,(s===null||s===void 0?void 0:s.x)||1,(s===null||s===void 0?void 0:s.y)||1)},true);if(((i=n.hitItems)===null||i===void 0?void 0:i.hits)!=null&&n.hitItems.hits.length>0){await this.stream.flyTo({itemId:n.hitItems.hits[0].itemId,animation:{duration:p(this.configProvider().animation.durationMs)}})}else{console.debug(`No hit results found for fly to part [position={x: ${t.position.x}, y: ${t.position.y}}]`)}}}class ci{constructor(t,i,s,n,e,o,a,r,h,c,l){this.stream=t;this.cursors=i;this.getConfig=s;this.getScene=n;this.getFrame=e;this.getViewport=o;this.tapEmitter=a;this.doubleTapEmitter=r;this.longPressEmitter=h;this.interactionStartedEmitter=c;this.interactionFinishedEmitter=l;this.tap=this.tap.bind(this);this.doubleTap=this.doubleTap.bind(this);this.longPress=this.longPress.bind(this);this.emitTapEvent=this.emitTapEvent.bind(this)}addCursor(t,i){return this.cursors.add(t,i)}async getWorldPointFromViewport(t){const i=this.getViewport();const s=this.getFrame();if(s==null){throw new Error("Cannot get world point. Frame is undefined.")}const n=await s.depthBuffer();return n!=null?i.transformPointToWorldSpace(t,n,.5):undefined}async getEntityTypeAtPoint(t){var i;const s=this.getViewport();const n=await((i=this.getFrame())===null||i===void 0?void 0:i.featureMap());if(n!=null){const i=s.transformPointToFrame(t,n);return n.getEntityType(i)}else{return it.NO_GEOMETRY}}getRayFromPoint(t){const i=this.getViewport();const s=this.getFrame();if(s!=null){return i.transformPointToRay(t,s.image,s.scene.camera)}else throw new Error("Cannot get camera. Frame is undefined.")}async tap(t,i={},s=0){this.emitTapEvent(this.tapEmitter.emit,t,i,s)}async doubleTap(t,i={},s=0){this.emitTapEvent(this.doubleTapEmitter.emit,t,i,s)}async longPress(t,i={},s=0){this.emitTapEvent(this.longPressEmitter.emit,t,i,s)}async beginInteraction(t={}){if(!this.isInteracting()){this.activeRenderOptions=t;this.interactionStartedEmitter.emit();this.sceneLoadingPromise=this.getScene();this.currentCamera=(await this.sceneLoadingPromise).camera();this.sceneLoadingPromise=undefined;await this.stream.beginInteraction()}}async transformCamera(t,i){var s,n;if(i===void 0){i=(s=this.activeRenderOptions)!==null&&s!==void 0?s:{}}if(this.isInteracting()){const s=await this.getScene();const e=this.getViewport();const o=this.getFrame();const a=await(o===null||o===void 0?void 0:o.depthBuffer());this.currentCamera=this.currentCamera!=null&&e!=null&&o!=null?t({camera:this.currentCamera,viewport:e,scale:s.scale(),boundingBox:s.boundingBox(),frame:o,depthBuffer:a}):undefined;await((n=this.currentCamera)===null||n===void 0?void 0:n.render(i))}}async twistCamera(...t){return this.transformCamera((({camera:i,viewport:s})=>{const n=r.normalize(r.subtract(i.lookAt,i.position));if(t.length===1&&typeof t[0]==="number"){const s=h.toRadians(-t[0]);return i.rotateAroundAxis(s,n)}else if(t.length===1){const n=a.create(s.width/2,s.height/2);const e=h.toDegrees(h.fromPoints(n,t[0]));const o=this.lastAngle!=null?e-this.lastAngle:0;this.lastAngle=e;const c=r.normalize(r.subtract(i.lookAt,i.position));const l=h.toRadians(-o);return i.rotateAroundAxis(l,c)}return i}))}async panCameraToScreenPoint(t){return this.transformCamera((({camera:i,frame:s,viewport:n,depthBuffer:e})=>{if(this.panData==null){const o=i.toFrameCamera();const a=o.direction;const r=n.transformPointToRay(t,s.image,o);const h=c.fromNormalAndCoplanarPoint(a,i.lookAt);const d=l.intersectPlane(r,h);if(d==null){console.warn("Cannot determine fallback for pan. Ray does not intersect plane.");return i}const u=e!=null?this.getWorldPoint(t,e,d):d;const f=c.fromNormalAndCoplanarPoint(a,u);this.panData={hitPt:u,hitPlane:f,startingCamera:o}}if(this.panData!=null){const{hitPt:e,hitPlane:o,startingCamera:a}=this.panData;const h=n.transformPointToRay(t,s.image,a);const c=l.intersectPlane(h,o);if(c!=null){const t=r.subtract(e,c);return i.update(a).moveBy(t)}}return i}))}async viewAll(){await(await this.getScene()).camera().viewAll().render({})}async rotateCamera(t){return this.transformCamera((({camera:i,viewport:s})=>{const n=r.normalize(i.up);const e=r.normalize(r.subtract(i.lookAt,i.position));const o=r.cross(n,e);const a=r.cross(e,o);const h=r.normalize({x:t.x*o.x+t.y*a.x,y:t.x*o.y+t.y*a.y,z:t.x*o.z+t.y*a.z});const c=r.cross(h,e);const l=9.5*t.x/s.width;const d=9.5*t.y/s.height;const u=Math.abs(l)+Math.abs(d);return i.rotateAroundAxis(u,c)}))}async rotateCameraAtPoint(t,i){return this.transformCamera((({camera:s,viewport:n,depthBuffer:e})=>{if(this.worldRotationPoint==null){this.worldRotationPoint=e!=null?this.getWorldPoint(i,e,s.lookAt):s.lookAt}const o=r.normalize(s.up);const a=r.normalize(r.subtract(s.lookAt,s.position));const h=r.cross(o,a);const c=r.cross(a,h);const l=r.normalize({x:t.x*h.x+t.y*c.x,y:t.x*h.y+t.y*c.y,z:t.x*h.z+t.y*c.z});const d=r.cross(l,a);const u=9.5*t.x/n.width;const f=9.5*t.y/n.height;const m=Math.abs(u)+Math.abs(f);const p=s.rotateAroundAxisAtPoint(m,this.worldRotationPoint,d);return p.update({lookAt:r.add(r.scale(Math.abs(s.signedDistanceToBoundingBoxCenter())/r.magnitude(p.viewVector),p.viewVector),p.position)})}))}async zoomCamera(t){return this.transformCamera((({camera:i,viewport:s,frame:n,boundingBox:e})=>{if(s!=null&&n!=null){const o=i===null||i===void 0?void 0:i.toFrameCamera().isPerspective();if(o){const n=i.viewVector;const e=r.magnitude(n);const o=3*e*(t/s.height);const a=r.normalize(n);const h=r.scale(o,a);const c=r.add(i.position,h);const l=i.update({position:c});return l}else{const o=i;const a=i.toFrameCamera();const h=a.direction;const u=s.transformPointToRay(s.center,n.image,a);const f=4*(t/s.height);const m=r.magnitude(d.diagonal(e))*1e-5;const p=Math.max(m,o.fovHeight*(1-f));const v=c.fromNormalAndCoplanarPoint(h,a.lookAt);const w=l.intersectPlane(u,v);if(w!=null){const t=c.projectPoint(v,o.lookAt);const s=(o.fovHeight-p)/o.fovHeight;const n=r.scale(s,r.subtract(w,t));const e=r.add(o.lookAt,n);const a=i.update({lookAt:e,rotationPoint:e,fovHeight:p});return a}}}return i}))}async pivotCamera(t,i){return this.transformCamera((({camera:s})=>{const{position:n,up:e,lookAt:o}=s;const a=r.normalize(e);const c=r.normalize(s.viewVector);const l=r.cross(a,c);const d=r.cross(c,l);const u=r.rotateAboutAxis(h.toRadians(t),o,l,n);const f=r.rotateAboutAxis(h.toRadians(i),u,d,n);return s.update({...s,lookAt:f})}))}async endInteraction(){await this.sceneLoadingPromise;if(this.isInteracting()){this.currentCamera=undefined;this.worldRotationPoint=undefined;this.panData=undefined;this.zoomData=undefined;this.resetLastAngle();this.interactionFinishedEmitter.emit();await this.stream.endInteraction()}this.activeRenderOptions=undefined}resetLastAngle(){this.lastAngle=undefined}isInteracting(){return this.currentCamera!=null}pixelThreshold(t){const i=this.isCoarseInputDevice(t)?this.getConfig().coarsePointerThreshold:this.getConfig().finePointerThreshold;return i*window.devicePixelRatio}async hitItems(t){var i;const s=await(await this.getScene()).raycaster().hitItems(t);return(i=s===null||s===void 0?void 0:s.hits)!==null&&i!==void 0?i:[]}emitTapEvent(t,i,s={},n=0){const{altKey:e=false,ctrlKey:o=false,metaKey:a=false,shiftKey:r=false}=s;t({position:i,altKey:e,ctrlKey:o,metaKey:a,shiftKey:r,buttons:n})}isCoarseInputDevice(t){return t||window.matchMedia("(pointer: coarse)").matches}getWorldPoint(t,i,s){const n=this.getViewport();const e=n.transformPointToFrame(t,i);const o=i.hitTest(e);return o?n.transformPointToWorldSpace(t,i):s}}class li extends ci{constructor(t,i,s,n,e,o,a,r,h,c,l){super(t,i,s,n,e,o,a,r,h,c,l)}async getWorldPointFromViewport(t){const i=this.getViewport();const s=this.getFrame();if(s==null){throw new Error("Cannot get world point. Frame is undefined.")}const n=await s.depthBuffer();return n!=null?i.transformPointToWorldSpace(t,n,.5):undefined}async panCameraByDelta(t){return this.transformCamera((({camera:i,viewport:s})=>{const n=i.viewVector;const e=r.normalize(i.up);const o=r.normalize(n);const h=a.scale(t,.5,.5);const c=r.magnitude(n);const l=h.x*c/s.width;const d=h.y*c/s.height;const u=r.cross(e,o);const f=r.cross(o,u);const m=r.add(r.scale(l,u),r.scale(d,f));return i.moveBy(m)}))}async panCameraToScreenPoint(t){return this.transformCamera((({camera:i,frame:s,viewport:n,boundingBox:e})=>{if(this.panData==null){const e=i.toFrameCamera();const o=e.direction;const a=n.transformPointToRay(t,s.image,e);const r=c.fromNormalAndCoplanarPoint(o,i.lookAt);const h=l.intersectPlane(a,r);if(h==null){console.warn("Cannot determine fallback for pan. Ray does not intersect plane.");return i}this.panData={hitPt:h,hitPlane:r,startingCamera:e}}if(this.panData!=null){const{hitPt:e,hitPlane:o,startingCamera:a}=this.panData;const h=n.transformPointToRay(t,s.image,a);const c=l.intersectPlane(h,o);if(c!=null){const t=r.subtract(e,c);const s=r.add(a.lookAt,t);return i.update({lookAt:s,rotationPoint:s})}}return i}))}async zoomCameraToPoint(t,i){return this.transformCamera((({camera:s,viewport:n,frame:e,depthBuffer:o,boundingBox:h})=>{if(this.orthographicZoomData==null||a.distance(t,this.orthographicZoomData.startingScreenPt)>2){const i=s.toFrameCamera();const a=i.direction;const r=n.transformPointToRay(t,e.image,i);const h=c.fromNormalAndCoplanarPoint(a,i.lookAt);const d=l.intersectPlane(r,h);if(d==null){console.warn("Cannot determine fallback point for zoom. Ray does not intersect plane.");return s}const u=o!=null?this.getWorldPoint(t,o,d):d;const f=c.fromNormalAndCoplanarPoint(a,u);this.orthographicZoomData={hitPt:u,hitPlane:f,startingScreenPt:t}}if(this.orthographicZoomData!=null){const{hitPt:t,hitPlane:e}=this.orthographicZoomData;const o=4*(i/n.height);const a=r.magnitude(d.diagonal(h))*1e-5;const l=Math.max(a,s.fovHeight*(1-o));const u=c.projectPoint(e,s.lookAt);const f=(s.fovHeight-l)/s.fovHeight;const m=r.scale(f,r.subtract(t,u));const p=r.add(s.lookAt,m);return s.update({lookAt:p,rotationPoint:p,fovHeight:l})}return s}))}async rotateCamera(t){return this.transformCamera((({camera:i,viewport:s,boundingBox:n})=>{var e;const o=r.normalize(i.up);const a=r.normalize(r.subtract(i.lookAt,i.position));const h=r.cross(o,a);const c=r.cross(a,h);const l=r.normalize({x:t.x*h.x+t.y*c.x,y:t.x*h.y+t.y*c.y,z:t.x*h.z+t.y*c.z});const u=r.cross(l,a);const f=9.5*t.x/s.width;const m=9.5*t.y/s.height;const p=Math.abs(f)+Math.abs(m);const v=i.rotationPoint!=null&&((e=i.rotationPoint)===null||e===void 0?void 0:e.x)!=null?i.rotationPoint:i.lookAt;const w=i.rotateAroundAxisAtPoint(p,v,u);const g=st(w.lookAt,w.viewVector,d.center(n));return w.update({lookAt:g})}))}getWorldPoint(t,i,s){const n=this.getViewport();const e=n.transformPointToFrame(t,i);const o=i.hitTest(e);return o?n.transformPointToWorldSpace(t,i):s}}const di=.2;class ui extends ci{constructor(t,i,s,n,e,o,a,r,h,c,l){super(t,i,s,n,e,o,a,r,h,c,l)}async panCameraByDelta(t){return this.transformCamera((({camera:i,viewport:s})=>{var n;const e=i.viewVector;const o=r.normalize(i.up);const h=r.normalize(e);const c=a.scale(t,.25,.25);const l=r.magnitude(e)*Math.tan((n=i.fovY)!==null&&n!==void 0?n:45);const d=c.x*l/s.width;const u=c.y/s.width*l;const f=r.cross(o,h);const m=r.cross(h,f);const p=r.add(r.scale(d,f),r.scale(u,m));return i.moveBy(p)}))}async zoomCameraToPoint(t,i){return this.transformCamera((({camera:s,viewport:n,frame:e,depthBuffer:o,boundingBox:a})=>{const h=e.scene.camera;const d=h.direction;const u=s.toFrameCamera();const f=n.transformPointToRay(t,e.image,u);if(this.zoomData==null){const i=c.fromNormalAndCoplanarPoint(d,h.lookAt);const n=l.intersectPlane(f,i);if(n==null){console.warn("Cannot determine fallback point for zoom. Ray does not intersect plane.");return s}const e=o!=null?this.getWorldPoint(t,o,n):n;const a=c.fromNormalAndCoplanarPoint(d,e);this.zoomData={hitPt:e,hitPlane:a}}if(this.zoomData!=null){const{hitPlane:t}=this.zoomData;const{position:e,distance:o,isPastHitPlane:h,keepCurrent:d}=this.computeZoomDistances(i,s,n,a,f,this.zoomData);if(h&&!d){const t=l.create({origin:e,direction:r.normalize(s.viewVector)});return s.update({position:e,lookAt:l.at(t,o)})}else if(!d){return s.update({position:e,lookAt:c.projectPoint(t,e)})}}return s}))}walk(t){this.transformCamera((({camera:i,boundingBox:s})=>{const{position:n,up:e,lookAt:o}=i;const a=r.normalize(e);const h=r.normalize(i.viewVector);const c=Math.min(...r.toArray(d.lengths(s)));const l=r.scale(c,t);const u=r.cross(a,h);const f=r.cross(u,a);const m=r.scale(l.x,r.normalize(u));const p=r.scale(l.y,r.normalize(a));const v=r.scale(l.z,r.normalize(f));const w=r.negate(r.add(m,p,v));return i.update({...i,position:r.add(n,w),lookAt:r.add(o,w)})}))}computeZoomDistances(t,i,s,n,e,o){const a=this.getConfig();const{hitPt:h,hitPlane:c}=o;const d=a.useMinimumPerspectiveZoomDistance?this.computeZoomMinimumDistance(i,n):-1;const u=r.distance(i.position,h);const f=Math.max(d,u);const m=6*f*t/s.height;const p=l.at(e,m);const v=l.create({origin:p,direction:r.normalize(i.viewVector)});const w=l.intersectPlane(v,c);if(w==null&&a.useMinimumPerspectiveZoomDistance){const i=6*d*t/s.height;const n=l.at(e,i);return{position:n,distance:d,isPastHitPlane:true,keepCurrent:false}}else if(w==null){return{position:i.position,distance:f,isPastHitPlane:true,keepCurrent:true}}return{position:p,distance:f,isPastHitPlane:false,keepCurrent:false}}computeZoomMinimumDistance(t,i){const s=Math.abs(i.min.x)+Math.abs(i.max.x);const n=Math.abs(i.min.y)+Math.abs(i.max.y);const e=Math.abs(i.min.z)+Math.abs(i.max.z);const o=Math.max(s,n,e);const a=Math.abs(r.dot(r.normalize(t.viewVector),r.right()));const h=Math.abs(r.dot(r.normalize(t.viewVector),r.up()));const c=Math.abs(r.dot(r.normalize(t.viewVector),r.back()));const l=s*a;const d=n*h;const u=e*c;const f=o/s;const m=o/n;const p=o/e;return(l+d+u)/(f+m+p)*di}}class fi{constructor(t,i,s,n){this.stream=t;this.configProvider=i;this.imageScaleProvider=s;this.sceneProvider=n}predicate(t){return t.altKey&&t.shiftKey}async fn(t){var i,s;const n=this.imageScaleProvider();const e=await this.stream.hitItems({point:a.scale(t.position,(n===null||n===void 0?void 0:n.x)||1,(n===null||n===void 0?void 0:n.y)||1)},true);if(((i=e.hitItems)===null||i===void 0?void 0:i.hits)!=null&&e.hitItems.hits.length>0&&e.hitItems.hits[0].hitPoint!=null){const i=await this.sceneProvider();const n=(await this.sceneProvider()).camera();const o=e.hitItems.hits[0];if(o.hitPoint!=null&&o.hitPoint.x!=null&&o.hitPoint.y!=null&&o.hitPoint.z!=null){const t=r.create(o.hitPoint.x,o.hitPoint.y,o.hitPoint.z);const s=await this.getLookAtPoint(i,t,n.viewVector);await this.stream.flyTo({camera:nt(n.update({lookAt:s,rotationPoint:s}).toFrameCamera()),animation:{duration:p(this.configProvider().animation.durationMs)}})}else{console.debug(`No hit position found for fly to position [position={x: ${t.position.x}, y: ${t.position.y}}, hit-id={${(s=o.itemId)===null||s===void 0?void 0:s.hex}}]`)}}else{console.debug(`No hit results found for fly to position [position={x: ${t.position.x}, y: ${t.position.y}}]`)}}getLookAtPoint(t,i,s){if(t.isOrthographic()){return st(i,s,d.center(t.boundingBox()))}else{return i}}}class mi{setPosition(t){this.currentPosition=t}getPosition(){return this.currentPosition}getType(){return this.type}beginDrag(t,i,s,n){}drag(t,i){}endDrag(t,i){if(this.currentPosition!=null){i.endInteraction();this.currentPosition=undefined}}async zoom(t,i){}}class pi extends mi{constructor(){super(...arguments);this.type="rotate"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null){const s=a.create(t.screenX,t.screenY);const n=a.subtract(s,this.currentPosition);i.rotateCamera(n);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class vi extends mi{constructor(){super(...arguments);this.type="rotate-point"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);this.startingPosition=i;s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null&&this.startingPosition!=null){const s=a.create(t.screenX,t.screenY);const n=a.subtract(s,this.currentPosition);i.rotateCameraAtPoint(n,this.startingPosition);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class wi extends mi{constructor(t){super();this.interactionConfigProvider=t;this.type="zoom";this.isTransforming=false}async beginDrag(t,i,s,n){if(this.currentPosition==null){this.currentPosition=a.create(t.clientX,t.clientY);const i=n.getBoundingClientRect();const e=xt(t,i);this.startPt=e;await s.beginInteraction()}}async drag(t,i){if(this.currentPosition!=null){const s=a.create(t.clientX,t.clientY);const n=a.subtract(s,this.currentPosition);if(this.startPt!=null){await i.zoomCameraToPoint(this.startPt,n.y);this.currentPosition=s}}}endDrag(t,i){super.endDrag(t,i);this.stopInteractionTimer();this.isTransforming=false;this.startPt=undefined}async zoom(t,i,s){await this.runWheelZoomInteraction(i,(()=>i.zoomCamera(this.getDirectionalDelta(t))),s)}async zoomToPoint(t,i,s,n){await this.runWheelZoomInteraction(s,(()=>s.zoomCameraToPoint(t,this.getDirectionalDelta(i))),n)}async beginInteraction(t){this.isTransforming=true;await t.beginInteraction()}async endInteraction(t){this.isTransforming=false;await t.endInteraction()}resetInteractionTimer(t,i){this.stopInteractionTimer();this.startInteractionTimer(t,i)}getDirectionalDelta(t){return this.interactionConfigProvider().reverseMouseWheelDirection?-t:t}getInteractionDelay(){return this.interactionConfigProvider().mouseWheelInteractionEndDebounce}startInteractionTimer(t,i=0){this.interactionTimer=window.setTimeout((async()=>{this.interactionTimer=undefined;await this.endInteraction(t)}),i+this.getInteractionDelay())}stopInteractionTimer(){if(this.interactionTimer!=null){window.clearTimeout(this.interactionTimer);this.interactionTimer=undefined}}async runWheelZoomInteraction(t,i,s){if(!this.isTransforming){await this.beginInteraction(t)}this.resetInteractionTimer(t,s);i()}}class gi extends mi{constructor(){super(...arguments);this.type="pan"}beginDrag(t,i,s,n){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);this.canvasRect=n.getBoundingClientRect();s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null&&this.canvasRect!=null){const s=xt(t,this.canvasRect);i.panCameraToScreenPoint(s);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class yi extends mi{constructor(){super(...arguments);this.type="twist"}beginDrag(t,i,s,n){this.currentPosition=a.create(t.offsetX,t.offsetY);this.canvasRect=n.getBoundingClientRect();s.beginInteraction()}drag(t,i){const s=xt(t,this.canvasRect);this.currentPosition=s;i.twistCamera(s)}endDrag(t,i){super.endDrag(t,i)}}class Ci extends mi{constructor(){super(...arguments);this.type="pivot"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null){const s=a.create(t.screenX,t.screenY);const n=a.subtract(s,this.currentPosition);i.pivotCamera(-.25*n.y,.25*n.x);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class bi extends Lt{constructor(t,i=new pi,s=new vi,n=new wi((()=>t().interactions)),e=new gi,o=new yi,a=new Ci){super("mousedown","mouseup","mousemove",i,s,n,e,o,a,t)}}function Si(t){window.requestAnimationFrame(t)}class Ii{constructor(){this.previousFirstPoints=[];this.previousSecondPoints=[]}initialize(t,i){this.element=t;this.interactionApi=i}dispose(){this.element=undefined}beginTwoPointTouch(t,i){this.previousFirstPoints=[...this.previousFirstPoints,t];this.previousSecondPoints=[...this.previousSecondPoints,i]}handleTwoPointTouchMove(t,i){this.previousFirstPoints=[...this.previousFirstPoints,t];this.previousSecondPoints=[...this.previousSecondPoints,i];Si((()=>{var t,i,s,n;if(this.previousFirstPoints.length>1&&this.previousSecondPoints.length>1&&this.previousFirstPoints.length===this.previousSecondPoints.length){const e=this.previousFirstPoints;const o=this.previousSecondPoints;this.previousFirstPoints=this.previousFirstPoints.slice(-1);this.previousSecondPoints=this.previousSecondPoints.slice(-1);const r=e.reduce(((t,i,s)=>{if(s<e.length-1){const n=e[s+1];const a=o[s];const r=o[s+1];return{deltas:[...t.deltas,this.computeDelta(i,a,n,r)],zooms:[...t.zooms,this.computeZoom(i,a,n,r)],angles:[...t.angles,this.computeAngle(i,a,n,r)]}}return t}),{deltas:[],zooms:[],angles:[]});const h=r.deltas.reduce(((t,i)=>a.add(t,i)),a.create());const c=r.zooms.reduce(((t,i)=>t+i),0);const l=r.angles.reduce(((t,i)=>t+i),0);const d=a.create((e[e.length-1].x+o[o.length-1].x)/2,(e[e.length-1].y+o[o.length-1].y)/2);(t=this.interactionApi)===null||t===void 0?void 0:t.beginInteraction();(i=this.interactionApi)===null||i===void 0?void 0:i.zoomCameraToPoint(d,c);(s=this.interactionApi)===null||s===void 0?void 0:s.panCameraByDelta(h);(n=this.interactionApi)===null||n===void 0?void 0:n.twistCamera(l)}}))}endTwoPointTouch(){this.previousFirstPoints=[];this.previousSecondPoints=[]}computeDelta(t,i,s,n){return a.add(a.subtract(s,t),a.subtract(n,i))}computeZoom(t,i,s,n){const e=a.distance(s,n)-a.distance(t,i);return e*.5}computeAngle(t,i,s,n){const e=u.create(a.subtract(t,i),a.subtract(s,n));return h.toDegrees(Math.atan2(u.determinant(e),u.dot(e)))}}class Pi extends Ii{constructor(){super();this.touchPoints={};this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerMove=this.handlePointerMove.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this)}dispose(){var t;(t=this.element)===null||t===void 0?void 0:t.removeEventListener("pointerdown",this.handlePointerDown);super.dispose()}initialize(t,i){super.initialize(t,i);t.addEventListener("pointerdown",this.handlePointerDown)}handlePointerDown(t){const i=a.create(t.screenX,t.screenY);this.touchPoints={...this.touchPoints,[t.pointerId]:i};const s=Object.keys(this.touchPoints);if(s.length===1){window.addEventListener("pointermove",this.handlePointerMove);window.addEventListener("pointerup",this.handlePointerUp)}else if(s.length===2){this.beginTwoPointTouch(this.touchPoints[0],this.touchPoints[1])}}handlePointerMove(t){if(this.touchPoints[t.pointerId]!=null){this.touchPoints[t.pointerId]=a.create(t.screenX,t.screenY)}const i=Object.keys(this.touchPoints);if(i.length===2){const t=this.touchPoints[i[0]];const s=this.touchPoints[i[1]];this.handleTwoPointTouchMove(t,s)}}handlePointerUp(t){var i;delete this.touchPoints[t.pointerId];const s=Object.keys(this.touchPoints);if(s.length===1){(i=this.interactionApi)===null||i===void 0?void 0:i.endInteraction()}if(s.length===0){window.removeEventListener("pointermove",this.handlePointerMove);window.removeEventListener("pointerup",this.handlePointerUp)}this.endTwoPointTouch()}}class Ti extends zt{constructor(t,i=new pi,s=new vi,n=new wi((()=>t().interactions)),e=new gi,o=new yi,a=new Ci){super("pointerdown","pointerup","pointermove",i,s,n,e,o,a,t);this.touchPoints=new Set;this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this)}initialize(t,i){super.initialize(t,i);t.addEventListener("pointerdown",this.handlePointerDown)}addEventListenersToElement(t){t.addEventListener(this.downEvent,this.handleDownEvent);t.addEventListener("wheel",this.handleMouseWheel,{passive:false});return{dispose:()=>{t.removeEventListener(this.downEvent,this.handleDownEvent);t.removeEventListener("wheel",this.handleMouseWheel)}}}handlePointerDown(t){this.downPosition=a.create(t.screenX,t.screenY);this.touchPoints.add(t.pointerId);if(this.touchPoints.size===1){window.addEventListener("pointerup",this.handlePointerUp)}if(this.touchPoints.size===2){this.disableIndividualInteractions=true}}handlePointerUp(t){this.touchPoints.delete(t.pointerId);if(this.touchPoints.size<2){this.disableIndividualInteractions=false}if(this.touchPoints.size===0){window.removeEventListener("pointerup",this.handlePointerUp)}}}class Ai{constructor(t,i,s,n){this.downEvent=t;this.upEvent=i;this.moveEvent=s;this.getConfig=n;this.handleDown=this.handleDown.bind(this);this.handleUp=this.handleUp.bind(this);this.handleMove=this.handleMove.bind(this);this.handleTouchStart=this.handleTouchStart.bind(this);this.handleTouchMove=this.handleTouchMove.bind(this);this.handleTouchEnd=this.handleTouchEnd.bind(this);this.handlePointerMove=this.handlePointerMove.bind(this);this.handlePointerEnd=this.handlePointerEnd.bind(this);this.clearPositions=this.clearPositions.bind(this);this.restartDoubleTapTimer=this.restartDoubleTapTimer.bind(this);this.clearDoubleTapTimer=this.clearDoubleTapTimer.bind(this);this.restartLongPressTimer=this.restartLongPressTimer.bind(this);this.clearLongPressTimer=this.clearLongPressTimer.bind(this);this.setPointerPositions=this.setPointerPositions.bind(this);this.emit=this.emit.bind(this)}dispose(){var t,i;(t=this.element)===null||t===void 0?void 0:t.removeEventListener(this.downEvent,this.handleDown);(i=this.element)===null||i===void 0?void 0:i.removeEventListener("touchstart",this.handleTouchStart);this.element=undefined;this.clearDoubleTapTimer();this.clearLongPressTimer()}initialize(t,i){this.element=t;this.interactionApi=i;t.addEventListener(this.downEvent,this.handleDown);t.addEventListener("touchstart",this.handleTouchStart,{passive:true})}handleTouchStart(t){if(t.touches.length===1){this.setPointerPositions(a.create(t.touches[0].clientX,t.touches[0].clientY));this.restartLongPressTimer();window.addEventListener("touchend",this.handleTouchEnd);window.addEventListener("touchmove",this.handleTouchMove)}}handleTouchMove(t){if(t.touches.length>0){this.handlePointerMove(a.create(t.touches[0].clientX,t.touches[0].clientY),true)}}handleTouchEnd(t){if(this.pointerDownPosition!=null){window.removeEventListener("touchend",this.handleTouchEnd);window.removeEventListener("touchmove",this.handleTouchMove)}this.handlePointerEnd(this.pointerDownPosition)}handleDown(t){this.setPointerPositions(a.create(t.clientX,t.clientY));this.buttons=t.buttons;const i={altKey:t.altKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey};this.restartLongPressTimer(i);window.addEventListener(this.upEvent,this.handleUp);window.addEventListener(this.moveEvent,this.handleMove)}handleMove(t){this.handlePointerMove(a.create(t.clientX,t.clientY),this.isTouch(t))}handleUp(t){if(this.pointerDownPosition!=null){window.removeEventListener(this.upEvent,this.handleUp);window.removeEventListener(this.moveEvent,this.handleMove)}this.handlePointerEnd(a.create(t.clientX,t.clientY),{altKey:t.altKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey},this.buttons,this.isTouch(t));this.buttons=undefined}handlePointerMove(t,i){var s;const n=((s=this.interactionApi)===null||s===void 0?void 0:s.pixelThreshold(i))||2;if(this.pointerDownPosition!=null&&a.distance(t,this.pointerDownPosition)>=n&&this.interactionTimer==null){this.clearPositions()}}handlePointerEnd(t,i={},s=0,n=false){var e,o;if(t!=null){if(this.longPressTimer!=null){this.emit((e=this.interactionApi)===null||e===void 0?void 0:e.tap)(t,i,s)}if(this.doubleTapTimer!=null&&this.secondPointerDownPosition!=null){this.emit((o=this.interactionApi)===null||o===void 0?void 0:o.doubleTap)(t,i,s,this.secondPointerDownPosition);this.clearDoubleTapTimer()}}this.pointerDownPosition=undefined;this.clearLongPressTimer()}emit(t){return(i,s={},n=0,e,o=false)=>{var r;const h=e||this.pointerDownPosition;const c=((r=this.interactionApi)===null||r===void 0?void 0:r.pixelThreshold(o))||1;let l;if(this.interactionTimer!=null){l=this.getCanvasPosition(h||i)}else if(h!=null&&a.distance(h,i)<=c){l=this.getCanvasPosition(i)}if(l!=null&&t!=null){t(l,s,n)}}}getCanvasPosition(t){var i;const s=(i=this.element)===null||i===void 0?void 0:i.getBoundingClientRect();const n=s!=null?a.create(s.left,s.top):undefined;return n!=null?a.subtract(a.create(t.x,t.y),n):undefined}clearPositions(){this.pointerDownPosition=undefined;this.firstPointerDownPosition=undefined;this.secondPointerDownPosition=undefined;this.clearDoubleTapTimer();this.clearLongPressTimer();this.clearInteractionTimer()}clearDoubleTapTimer(){if(this.doubleTapTimer!=null){window.clearTimeout(this.doubleTapTimer)}this.doubleTapTimer=undefined;this.firstPointerDownPosition=undefined;this.secondPointerDownPosition=undefined}restartDoubleTapTimer(){this.clearDoubleTapTimer();this.doubleTapTimer=window.setTimeout((()=>this.clearDoubleTapTimer()),this.getConfig().events.doubleTapThreshold)}clearLongPressTimer(){if(this.longPressTimer!=null){window.clearTimeout(this.longPressTimer)}this.longPressTimer=undefined}restartLongPressTimer(t={}){this.clearLongPressTimer();this.longPressTimer=window.setTimeout((()=>{var i;if(this.pointerDownPosition){this.emit((i=this.interactionApi)===null||i===void 0?void 0:i.longPress)(this.pointerDownPosition,t,this.buttons)}this.clearLongPressTimer()}),this.getConfig().events.longPressThreshold)}restartInteractionTimer(){this.clearInteractionTimer();this.interactionTimer=window.setTimeout((()=>{this.interactionTimer=undefined}),this.getConfig().interactions.interactionDelay)}clearInteractionTimer(){if(this.interactionTimer!=null){window.clearTimeout(this.interactionTimer);this.interactionTimer=undefined}}setPointerPositions(t){this.pointerDownPosition=t;this.restartInteractionTimer();if(this.firstPointerDownPosition==null){this.restartDoubleTapTimer();this.firstPointerDownPosition=t}else{this.secondPointerDownPosition=t}}isTouch(t){return window.PointerEvent!=null&&t instanceof PointerEvent?t.pointerType==="touch":false}}class ki extends Ii{constructor(){super();this.handleTouchStart=this.handleTouchStart.bind(this);this.handleTouchMove=this.handleTouchMove.bind(this);this.handleTouchEnd=this.handleTouchEnd.bind(this)}dispose(){var t;(t=this.element)===null||t===void 0?void 0:t.removeEventListener("touchstart",this.handleTouchStart);super.dispose()}initialize(t,i){super.initialize(t,i);t.addEventListener("touchstart",this.handleTouchStart)}handleTouchStart(t){if(t.touches.length>=1){t.preventDefault();const i=t.touches[0];this.currentPosition1=a.create(i.screenX,i.screenY);if(t.touches[1]!=null){this.beginTwoPointTouch(this.currentPosition1,a.create(t.touches[1].screenX,t.touches[1].screenY))}window.addEventListener("touchmove",this.handleTouchMove,{passive:false});window.addEventListener("touchend",this.handleTouchEnd)}}handleTouchMove(t){t.preventDefault();if(t.touches.length===1){this.handleOnePointTouchMove(t.touches[0])}else if(t.touches.length===2){const i=a.create(t.touches[0].clientX,t.touches[0].clientY);const s=a.create(t.touches[1].clientX,t.touches[1].clientY);this.handleTwoPointTouchMove(i,s)}}handleTouchEnd(t){var i;t.preventDefault();(i=this.interactionApi)===null||i===void 0?void 0:i.endInteraction();this.isInteracting=false;window.removeEventListener("touchmove",this.handleTouchMove);window.removeEventListener("touchend",this.handleTouchEnd);this.endTwoPointTouch()}handleOnePointTouchMove(t){var i,s,n;const e=a.create(t.screenX,t.screenY);if(this.currentPosition1!=null){const t=a.subtract(e,this.currentPosition1);const o=((i=this.interactionApi)===null||i===void 0?void 0:i.pixelThreshold(true))||2;if(a.distance(e,this.currentPosition1)>=o||this.isInteracting){(s=this.interactionApi)===null||s===void 0?void 0:s.beginInteraction();(n=this.interactionApi)===null||n===void 0?void 0:n.rotateCamera(t);this.isInteracting=true}}this.currentPosition1=e}}const Di={clearMarks:()=>undefined,clearMeasures:()=>undefined,getEntriesByName:()=>[],mark:()=>undefined,measure:()=>undefined};function Ei(){var t;if(typeof window!=="undefined"){return window.performance}return(t=globalThis.performance)!==null&&t!==void 0?t:Di}class Mi{constructor(t,i=Ei()){this.name=t;this.perf=i;this.measures=new Set;this.nextId=0}clearMeasurements(){this.perf.clearMeasures(this.name)}measure(t){if(t instanceof Promise){const i=this.begin();return t.finally((()=>this.end(i)))}else if(typeof t==="function"){const i=this.begin();const s=t();this.end(i);return s}else{throw new Error("Input must be a function or Promise")}}takeMeasurements(){const t=this.perf.getEntriesByName(this.name);this.clearMeasurements();return t}takeLastMeasurement(){const t=this.takeMeasurements();return t[t.length-1]}begin(){const t=`${this.name}-${this.nextId++}`;this.measures.add(t);this.perf.mark(t);return t}end(t){this.perf.measure(this.name,t);this.perf.clearMarks(t);this.measures.delete(t)}}const xi=new Mi("paint_time");function Ri(t){const i=new Uint8Array(t.byteLength);i.set(t);return i.buffer}function Bi(t){return new Promise(((i,s)=>{const n=new Blob([Ri(t)]);const e=URL.createObjectURL(n);const o=new Image;o.addEventListener("load",(()=>{i({image:o,dispose:()=>undefined});URL.revokeObjectURL(e)}));o.addEventListener("error",(()=>{s(new x("Failed to load image data"));URL.revokeObjectURL(e)}));o.src=e}))}async function Li(t){const i=new Blob([Ri(t)]);const s=await window.createImageBitmap(i);return{image:s,dispose:()=>s.close()}}function zi(t){if(window.createImageBitmap!=null){return Li(t)}else{return Bi(t)}}const Hi=1e3;function Oi(t,i){const s=i.viewport.calculateDrawRect(i.frame.image);i.canvas.clearRect(0,0,i.canvasDimensions.width,i.canvasDimensions.height);i.canvas.drawImage(t.image,s.x,s.y,s.width,s.height)}function $i(t,i){const s=t.takeMeasurements();if(s.length>0){i(s)}}function ji(t,i,s,n,e=Hi){let o;let a=0;let r;let h=[];function c(){a++;if(o==null){o=setInterval((()=>{$i(t,n);if(a===0){d()}}),e)}}function l(){a--}function d(){if(o!=null){clearInterval(o);o=undefined}}if(s){setInterval((()=>{if(r!=null){if(h.length===5){h=[...h.slice(1),r]}else{h.push(r)}const t=h.reduce(((t,i)=>t+i))/h.length;console.debug(`Paint rate: ${r}fps`);console.debug(`Paint rate (avg): ${t}`);r=undefined}}),1e3)}return s=>{c();return t.measure((async()=>{const t=await i(s);r=r==null?1:r+1;return t})).finally((()=>l()))}}function Vi(){let t=[];function i(i){if(i!=null){const s=i.copy({correlationIds:[...i.correlationIds,...t.filter((t=>!i.correlationIds.includes(t)))]});t=[];return s}return i}function s(){let t=-1;return async i=>{if(i.frame.sequenceNumber>t){const s=await zi(i.frame.image.imageBytes);t=i.frame.sequenceNumber;return s}}}function n(){let t=-1;return async(i,s)=>{var n;if(s!=null&&i.frame.sequenceNumber>t){t=i.frame.sequenceNumber;(n=i.beforeDraw)===null||n===void 0?void 0:n.call(i);Oi(s,i);s.dispose();return i.frame}s===null||s===void 0?void 0:s.dispose()}}const e=s();const o=n();return async s=>{var n,a;const r=(a=(n=s.predicate)===null||n===void 0?void 0:n.call(s))!==null&&a!==void 0?a:true;t=[...t,...s.frame.correlationIds];if(r){return e(s).then((t=>o(s,t).then(i)))}}}function Ki(t){return i=>{var s;const n=(s=i.request.requestId)===null||s===void 0?void 0:s.value;if(n!=null){t(n)(i)}}}function Fi(t){return i=>{const{drawFrame:s}=i.request;if(s!=null){t(s)(i)}}}const Ni=1*60;function Wi(t){let i=false;return s=>{const n=t();if(n!=null){const t=n.remoteTime(new Date(Date.now()));const e=p(s,t);const o=v(e).getTime();if(o>=0){return e}else{if(!i){console.warn(`Possible erroneous send to receive timing. Muting for ${Ni}s. [sent-at=${s.toISOString()}, received-at=${t.toISOString()}, remote-time=${n.knownRemoteTime.toISOString()}]`);i=true;setTimeout((()=>i=false),Ni*1e3)}return undefined}}}}function qi(t,i){const s=Wi(i);return Ki((i=>Fi((n=>n=>{const e=v(n.sentAtTime);if(e!=null){t.replyResult(i,{drawFrame:{sendToReceiveDuration:s(e)}})}}))))}var Ui=F();const _i=b.defineMapper(b.read(b.requiredProp("d"),b.requiredProp("ns"),b.mapRequiredProp("ka",et),b.mapRequiredProp("kd",et),b.mapRequiredProp("ks",et),b.mapRequiredProp("ke",et)),(([t,i,s,n,e,o])=>({opacity:t,glossiness:i,ambient:s,diffuse:n,specular:e,emissive:o})));const Ji=b.defineMapper(b.read(b.mapRequiredProp("defaultMaterial",(()=>It)),b.mapRequiredProp("colorMaterial",_i)),(([t,i])=>({defaultMaterial:t,colorMaterial:i})));const Gi=b.defineMapper(b.read(b.requiredProp("name"),b.requiredProp("category")),(([t,i])=>({name:t,category:i})));const Xi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"string",value:t})));const Zi=b.mapProp("string",b.ifDefined(Xi));const Yi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"long",value:t})));const Qi=b.mapProp("pb_long",b.ifDefined(Yi));const ts=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"double",value:t})));const is=b.mapProp("pb_double",b.ifDefined(ts));const ss=b.defineMapper(b.read(b.requiredProp("value")),(([t])=>({type:"timestamp",value:t})));const ns=b.mapProp("date",b.ifDefined(ss));const es=b.compose(b.pickFirst(Zi,Qi,is,ns),b.required("value"));const os=b.defineMapper(b.read(b.requiredProp("id"),b.mapProp("key",b.ifDefined(Gi)),b.mapProp("value",b.ifDefined(es))),(([t,i,s])=>({id:t,key:i,value:s})));const as=b.defineMapper(b.read(b.mapProp("cursor",ot),b.mapRequiredProp("entriesList",b.mapArray(os))),(([t,i])=>({paging:{next:t},entries:i})));const rs=b.ifInvalidThrow(as);const hs=b.defineMapper(b.read(b.mapRequiredProp("id",G),b.mapRequiredProp("createdAt",at),b.mapProp("materialOverride",b.ifDefined(Ji)),b.mapProp("transform",b.ifDefined(rt)),b.mapProp("isVisible",b.ifDefined(ht)),b.mapProp("isSelected",b.ifDefined(ht)),b.mapProp("isPhantom",b.ifDefined(ht)),b.mapProp("endItem",b.ifDefined(ht))),(([t,i,s,n,e,o,a,r])=>({id:t,createdAt:i,materialOverride:s,transform:n,isVisible:e,isSelected:o,isPhantom:a,endItem:r})));const cs=b.defineMapper(b.read(b.mapRequiredProp("id",G),b.mapRequiredProp("createdAt",at),b.mapRequiredProp("name",Z),b.mapProp("parentId",b.ifDefined(G)),b.mapProp("suppliedId",b.ifDefined(Z)),b.mapProp("boundingBox",b.ifDefined(ct)),b.mapProp("worldTransform",b.ifDefined(rt)),b.mapProp("override",b.ifDefined(hs))),(([t,i,s,n,e,o,a,r])=>({id:t,createdAt:i,name:s,parentId:n!==null&&n!==void 0?n:undefined,suppliedId:e,boundingBox:o,worldTransform:a,override:r})));const ls=b.ifInvalidThrow(b.defineMapper(b.read(b.mapProp("item",b.ifDefined(cs))),(([t])=>t!==null&&t!==void 0?t:undefined)));class ds{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s}async getSceneViewItem(t,i,s){const n=await N((async n=>{const e=this.deviceIdProvider();const o=await q(this.jwtProvider,e);const a=new K.GetSceneViewItemRequest;a.setSceneItemId(St(t));a.setViewId(St(i));const r=new Ui.FieldMask;if(s.includeBoundingBox){r.addPaths("bounding_box")}if(s.includeWorldTransform){r.addPaths("world_transform")}if(s.includeOverride){r.addPaths("override")}a.setAdditionalFields(r);this.client.getSceneViewItem(a,o,n)}));return ls(n.toObject())}async listSceneItemMetadata(t,i){const s=await N((async s=>{const n=this.deviceIdProvider();const e=await q(this.jwtProvider,n);const o=new K.ListSceneItemMetadataRequest;o.setItemId(St(t));const a=new R.Pager;if(i.size!=null){a.setLimit(i.size)}if(i.cursor!=null){a.setCursor(i.cursor)}o.setPager(a);this.client.listSceneItemMetadata(o,e,s)}));return rs(s.toObject())}}var us;(function(t){t["DEVICE_ID"]="vertexvis:device-id"})(us||(us={}));function fs(){if(typeof window==="undefined"){throw new Error("Local storage is not available.")}return window.localStorage}function ms(t,i,s=fs()){const n=s.getItem(t);if(n!=null){const e={...JSON.parse(n),...i};s.setItem(t,JSON.stringify(e))}else{s.setItem(t,JSON.stringify(i))}}function ps(t,i,s=fs()){const n=s.getItem(t);if(n!=null){return i(JSON.parse(n))}}function vs(t,i,s,n){return I.retry((()=>{if(!t.aborted){return i()}return Promise.resolve(s)}),n)}class ws extends w{constructor(t,i={}){var s,n,e,o,a;super(t,{loggingEnabled:i.loggingEnabled});this.state={type:"disconnected"};this.stateChanged=new S;this.dimensions=f.create(0,0);this.streamAttributes={};this.enableTemporalRefinement=(s=i.enableTemporalRefinement)!==null&&s!==void 0?s:true;this.frameBgColor=P.create(255,255,255);this.config=Et("platprod");this.options={tokenRefreshOffsetInSeconds:(n=i.tokenRefreshOffsetInSeconds)!==null&&n!==void 0?n:30,offlineThresholdInSeconds:(e=i.offlineThresholdInSeconds)!==null&&e!==void 0?e:30,loadTimeoutInSeconds:(o=i.loadTimeoutInSeconds)!==null&&o!==void 0?o:15,enableTemporalRefinement:(a=i.enableTemporalRefinement)!==null&&a!==void 0?a:true}}isPaused(){return this.pausedState!=null}getState(){return this.state}disconnect(){if(this.state.type!=="disconnected"&&this.state.type!=="connection-failed"){console.debug("Disconnecting websocket");this.state.connection.dispose();this.updateState({type:"disconnected"})}}async load(t,i,s,n=Et("platprod"),e){this.clientId=i;this.deviceId=s;this.config=n;if(this.state.type==="disconnected"){await this.loadIfDisconnected(t,e)}else if(this.state.type==="connection-failed"){await this.loadIfDisconnected(t,e)}else{await this.loadIfConnectingOrConnected(t,this.state,e)}return this.state}update(t){this.frameBgColor=t.frameBgColor?t.frameBgColor:this.frameBgColor;if(t.dimensions!=null&&!T(t.dimensions,this.dimensions)){this.dimensions=t.dimensions;this.ifState("connected",(()=>this.updateDimensions({dimensions:this.getDimensions()})))}const i=!T(this.streamAttributes,t.streamAttributes);if(t.streamAttributes!=null&&i){this.streamAttributes=t.streamAttributes;this.ifState("connected",(()=>this.updateStream({streamAttributes:gs(this.streamAttributes)})))}if(t.enableTemporalRefinement!=null&&t.enableTemporalRefinement!==this.enableTemporalRefinement){this.enableTemporalRefinement=t.enableTemporalRefinement;if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}}pause(){if(this.state.type==="connected"){this.pausedState=this.state;console.debug(`Stream paused [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`);this.disconnect()}}async resume(){if(this.pausedState!=null){console.debug(`Stream resumed [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`);await this.connectToExistingStream(this.pausedState);this.pausedState=undefined}}async loadIfConnectingOrConnected(t,i,s){var n;const{resource:e,subResource:o}=i.resource;const a=Pt(t);const r=!A.isEqual(e,a.resource);const h=!A.isEqual(o,a.subResource);const c=i.type==="connecting"||i.type==="reconnecting";const l=i.type==="connected";if(r||c&&h){this.disconnect();return this.loadIfDisconnected(t)}else if(l&&h&&((n=a.subResource)===null||n===void 0?void 0:n.type)==="scene-view-state"){const t=a.queries.find((t=>t.type==="supplied-id"));const n={...a.subResource.id!=null?{sceneViewStateId:{hex:a.subResource.id}}:{},...t!=null?{sceneViewStateSuppliedId:{value:t.id}}:{},...s!=null?{cameraType:Cs(s)}:{}};await this.loadSceneViewState(n);this.updateState({...i,resource:a})}}async loadIfDisconnected(t,i){try{await this.connectWithNewStream(Pt(t),i)}catch(t){if(t instanceof B){this.updateState({type:"connection-failed",message:`Cannot load scene. ${t.message}`,error:t})}else if(t instanceof g){this.updateState({type:"connection-failed",message:`Cannot load scene. Stream request failed to start stream.`,error:t})}else{this.updateState({type:"connection-failed",message:`Cannot load scene for unknown reason. See console logs.`,error:t})}throw t}}connectWithNewStream(t,i){return this.openWebsocketStream(t,"connecting",(()=>this.requestNewStream(t,i)))}connectToExistingStream(t){return this.openWebsocketStream(t.resource,"reconnecting",(()=>this.requestReconnectStream(t)),{maxRetries:Number.POSITIVE_INFINITY})}async openWebsocketStream(t,i,s,{maxRetries:n=3}={}){var e;const o=Ss(Is(this.config,t.resource,this.clientId,this.deviceId));console.debug(`Initiating WS connection [uri=${o.url}]`);(e=this.abortController)===null||e===void 0?void 0:e.abort();const a=new AbortController;this.abortController=a;const r=bs(this.config);this.updateState({type:i,resource:t,connection:{dispose:()=>{this.dispose();a.abort()}}});const h=await I.abort(a.signal,vs(a.signal,(()=>this.connect(o,r)),{dispose:()=>{}},{maxRetries:n,delaysInMs:ws.WS_RECONNECT_DELAYS})).catch((t=>{throw new L("Websocket connection failed.",t instanceof Error?t:undefined)}));if(!h.aborted){return this.requestNewOrExistingStream(t,h.result,s)}else{this.updateState({type:"disconnected"})}}async requestNewOrExistingStream(t,i,s){const n=this.requestClock();const e=await s();console.debug(`Stream connected [stream-id=${e.streamId}, scene-id=${e.sceneId}, scene-view-id=${e.sceneViewId}]`);const o=this.onRequest((t=>{const i=t.request.drawFrame;if(i!=null){const t=ft(e.worldOrientation)(i);if(this.state.type==="connected"){if(t.depthBufferBytes!=null||this.state.frame.temporalRefinementCorrelationId!==t.temporalRefinementCorrelationId){this.updateState({...this.state,frame:t,fallbackDepthBufferBytes:t.depthBufferBytes})}else{this.updateState({...this.state,frame:t.copy({depthBufferBytes:this.state.fallbackDepthBufferBytes})})}}}}));const a=this.reconnectWhenNeeded();const r=this.refreshTokenWhenExpired(e.token);const h=this.acknowledgeFrameRequests();const c=e.frame==null?await this.waitForFrame(e.worldOrientation,this.options.loadTimeoutInSeconds):e.frame;const l=await n;console.debug(`Synchronized clocks [local-time=${l.knownLocalTime.toISOString()}, remote-time=${l.knownRemoteTime.toISOString()}]`);this.updateState({type:"connected",connection:{dispose:()=>{a.dispose();o.dispose();r.dispose();h.dispose();i.dispose()}},resource:t,streamId:e.streamId,deviceId:e.deviceId,sceneId:e.sceneId,sceneViewId:e.sceneViewId,worldOrientation:e.worldOrientation,token:e.token,frame:c,clock:l,fallbackDepthBufferBytes:undefined})}async requestNewStream(t,i){var s,n;const e=t.queries.find((t=>t.type==="supplied-id"));const o=mt(await this.startStream({streamKey:{value:t.resource.id},dimensions:this.getDimensions(),frameBackgroundColor:ys(this.frameBgColor),clientSupportsTemporalRefinement:this.enableTemporalRefinement,streamAttributes:gs(this.streamAttributes),sceneViewStateId:((s=t.subResource)===null||s===void 0?void 0:s.type)==="scene-view-state"&&t.subResource.id!=null?{hex:t.subResource.id}:undefined,sceneViewStateSuppliedId:((n=t.subResource)===null||n===void 0?void 0:n.type)==="scene-view-state"&&e!=null?{value:e.id}:undefined,cameraType:i!=null?Cs(i):undefined}));return{resource:t,streamId:o.streamId,sceneId:o.sceneId,sceneViewId:o.sceneViewId,deviceId:o.sessionId,token:o.token,worldOrientation:o.worldOrientation,frame:undefined,fallbackDepthBufferBytes:undefined}}async requestReconnectStream(t){const i=pt(await this.reconnect({streamId:{hex:t.streamId},dimensions:this.getDimensions(),frameBackgroundColor:ys(this.frameBgColor),streamAttributes:gs(this.streamAttributes),clientSupportsTemporalRefinement:this.enableTemporalRefinement}));return{...t,token:i.token}}async requestClock(){const t=vt(await this.syncTime({requestTime:y()}));return new Tt(t)}reconnectWhenNeeded(){const t=this.onClose((()=>{if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}));const i=this.onRequest((t=>{const i=t.request.gracefulReconnection!=null;if(i&&this.state.type==="connected"){console.debug("Received request for graceful reconnect. Closing connection and attempting reconnect.");this.closeAndReconnect(this.state)}}));const s=this.reconnectWhenOffline();return{dispose:()=>{t.dispose();i.dispose();s.dispose()}}}refreshTokenWhenExpired(t){let i;const s=t=>{const{tokenRefreshOffsetInSeconds:n}=this.options;const e=t.remainingTimeInMs(n);i=window.setTimeout((async()=>{const t=await this.refreshToken();const i=wt(t);s(i);if(this.state.type==="connected"){this.updateState({...this.state,token:i})}}),e)};s(t);return{dispose:()=>clearTimeout(i)}}reconnectWhenOffline(){let t;const i=()=>window.clearTimeout(t);const s=()=>{i();const s=this.options.offlineThresholdInSeconds;console.debug(`Detected that host is offline. Will attempt reconnect in ${s}s.`);t=window.setTimeout((()=>{if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}),s*1e3)};const n=()=>{console.debug("Detected that host is online.");i()};const e=()=>s();window.addEventListener("offline",e);window.addEventListener("online",n);return{dispose:()=>{i();window.removeEventListener("offline",e);window.removeEventListener("online",n)}}}closeAndReconnect(t){t.connection.dispose();return this.connectToExistingStream(t)}async waitForFrame(t,i){let s;try{return await I.timeout(i*1e3,new Promise((i=>{s=this.onRequest((n=>{try{const s=n.request.drawFrame;if(s!=null){const n=ft(t)(s);i(n)}}finally{s===null||s===void 0?void 0:s.dispose()}}))})))}catch(t){throw new z(`Frame timed out after ${i}s`,t instanceof Error?t:undefined)}finally{s===null||s===void 0?void 0:s.dispose()}}acknowledgeFrameRequests(){return this.onRequest(qi(this,(()=>this.state.type==="connected"?this.state.clock:undefined)))}updateState(t){if(this.state!==t){this.state=t;this.stateChanged.emit(this.state)}}getDimensions(){if(f.area(this.dimensions)===0){return f.create(1,1)}return this.dimensions}ifState(t,i){if(this.state.type===t){return i()}}onStateChanged(t){return this.stateChanged.on(t)}}ws.WS_RECONNECT_DELAYS=[0,1e3,1e3,5e3];const gs=b.ifInvalidThrow(lt);const ys=b.ifInvalidThrow(dt);const Cs=b.ifInvalidThrow(ut);function bs(t){return{EXPERIMENTAL_frameDelivery:{...t.EXPERIMENTAL_frameDelivery,rateLimitingEnabled:t.flags.throttleFrameDelivery},EXPERIMENTAL_adaptiveRendering:{...t.EXPERIMENTAL_adaptiveRendering,enabled:t.flags.adaptiveRendering},EXPERIMENTAL_qualityOfService:{...t.EXPERIMENTAL_qualityOfService}}}function Ss(t){return{url:k.toString(t),protocols:["ws.vertexvis.com"]}}function Is(t,i,s,n){if(s!=null){return k.appendPath(k.toString(k.parseAndAddParams("/ws",{clientId:s,deviceId:n})),k.parse(t.network.renderingHost))}else{return k.appendPath(`/stream-keys/${i.id}/session`,k.parse(t.network.renderingHost))}}class Ps{constructor(t){this.callback=t;this.handleVisibilityChange=this.handleVisibilityChange.bind(this);this.emitVisibilityChange=this.emitVisibilityChange.bind(this);this.mutationObservers=[]}isVisible(t){if("checkVisibility"in t){return t.checkVisibility({visibilityProperty:true,opacityProperty:true})}return true}observe(t){this.targetElement=t;this.watchElementVisibility(t)}unobserve(){if(this.targetElement!=null){this.mutationObservers.forEach((t=>t.disconnect()));this.mutationObservers=[]}this.targetElement=undefined}disconnect(){this.mutationObservers.forEach((t=>t.disconnect()));this.mutationObservers=[]}watchElementVisibility(t){if(t!=null){const i=new MutationObserver(this.handleVisibilityChange);i.observe(t,{attributes:true,attributeFilter:["style","class","hidden"]});this.mutationObservers=[...this.mutationObservers,i];this.watchElementVisibility(t.parentElement)}}handleVisibilityChange(){if(this.targetElement!=null){this.emitVisibilityChange(this.targetElement)}}emitVisibilityChange(t){const i=t!=null?this.isVisible(t):true;console.debug(`Detected visibility change [visible={${i}}]`);this.callback(i)}}const Ts=15e3;function As(t){return t.getBoundingClientRect()}function ks(t,i){const s=window.getComputedStyle(t);const n=s.getPropertyValue(i);return n!==""?n:undefined}const Ds=()=>`:host{--image-background:var(--image-background);--viewer-background:var(--viewer-background);display:block;position:relative;width:300px;height:300px;min-width:1px;min-height:1px;user-select:none;-webkit-user-select:none}.canvas-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative}.enable-pointer-events{touch-action:none}.viewer-container{width:100%;height:100%;overflow:hidden}.error-message{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}`;const Es=i(class t extends s{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.tap=n(this,"tap");this.doubletap=n(this,"doubletap");this.longpress=n(this,"longpress");this.frameReceived=n(this,"frameReceived");this.frameDrawn=n(this,"frameDrawn");this.tokenExpired=n(this,"tokenExpired");this.connectionChange=n(this,"connectionChange");this.sceneReady=n(this,"sceneReady");this.sceneChanged=n(this,"sceneChanged");this.interactionStarted=n(this,"interactionStarted");this.interactionFinished=n(this,"interactionFinished");this.cameraTypeChanged=n(this,"cameraTypeChanged");this.annotationStateChanged=n(this,"annotationStateChanged");this.deviceIdChange=n(this,"deviceIdChange");this.dimensionschange=n(this,"dimensionschange");this.configEnv="platprod";this.cameraControls=true;this.cameraType="perspective";this.keyboardControls=true;this.rotateAroundTapPoint=true;this.phantom={opacity:.1};this.noDefaultLights=false;this.enableTemporalRefinement=true;this.experimentalRenderingOptions="";this.crossSectioning={endCapEnabled:true,endCapColor:undefined};this.resizeDebounce=100;this.viewport=Bt.fromDimensions(f.create(0,0));this.experimentalSkipVisibilityCheck=false;this.stateMap={cursorManager:new Mt,streamState:{type:"disconnected"}};this.isVisible=false;this.frameRenderVersion=0;this.interactionHandlers=[];this.defaultInteractionHandlerDisposables=[];this.tapKeyInteractions=[];this.defaultTapKeyInteractions=[];this.internalFrameDrawnDispatcher=new S;this.handleUpdateStreamAttributesWithTimer=()=>{const t=50;if(this.streamAttributesUpdateTimer==null){this.streamAttributesUpdateTimer=setTimeout((()=>{this.streamAttributesUpdateTimer=undefined;this.updateStreamAttributes()}),t)}};this.handleElementResize=this.handleElementResize.bind(this);this.handleVisibilityChange=this.handleVisibilityChange.bind(this)}connectedCallback(){var t,i,s;(t=this.stencilBuffer)!==null&&t!==void 0?t:this.stencilBuffer=new jt(this.hostElement);this.visibilityObserver=new Ps(this.handleVisibilityChange);this.isVisible=this.visibilityObserver.isVisible(this.hostElement);if(!this.isVisible){(i=this.visibilityObserver)===null||i===void 0?void 0:i.observe(this.hostElement)}(s=this.stream)===null||s===void 0?void 0:s.resume()}componentWillLoad(){var t;this.updateResolvedConfig();this.calculateComponentDimensions();this.resizeObserver=new ResizeObserver(this.handleElementResize);this.registerSlotChangeListeners();const i=this.getResolvedConfig();const s=new m.SceneViewAPIClient(i.network.sceneViewHost);this.annotations=new Jt(s,(()=>this.token),(()=>this.deviceId));this.annotations.onStateChange.on((t=>{this.annotationStateChanged.emit(t);const i=Object.keys(t.annotations).length;this.handleAnnotationSetsChange(i)}));this.stream=(t=this.stream)!==null&&t!==void 0?t:new ws(new C,{loggingEnabled:i.flags.logWsMessages,enableTemporalRefinement:this.enableTemporalRefinement});this.addStreamListeners();this.modelViews=new At(s,this.stream,(()=>this.token),(()=>this.deviceId));this.pmi=new kt(s,(()=>this.token),(()=>this.deviceId));this.sceneItems=new ds(s,(()=>this.token),(()=>this.deviceId));this.canvases=new ri(s,(()=>this.token),(()=>this.deviceId));this.updateStreamAttributes();this.stateMap.cursorManager.onChanged.on((()=>this.handleCursorChanged()))}async componentDidLoad(){var t,i,s;this.interactionApi=this.createInteractionApi();this.isVisible=(i=(t=this.visibilityObserver)===null||t===void 0?void 0:t.isVisible(this.hostElement))!==null&&i!==void 0?i:true;if(this.canvasContainerElement!=null){(s=this.resizeObserver)===null||s===void 0?void 0:s.observe(this.canvasContainerElement)}this.loadOrResumeStream().catch((t=>{console.error("Error loading scene",t)}));await this.initializeDefaultInteractionHandlers();this.injectViewerApi()}disconnectedCallback(){var t,i,s;(t=this.visibilityObserver)===null||t===void 0?void 0:t.disconnect();(i=this.annotations)===null||i===void 0?void 0:i.disconnect();(s=this.stream)===null||s===void 0?void 0:s.pause()}render(){var t;return e(o,{key:"cf89e8922ecbc6a4f024197ec20ff2d1a987953e"},e("div",{key:"779eab813e3515178e51f729a952bd5b02978507",ref:t=>this.viewerContainerElement=t,class:"viewer-container",style:{cursor:Rt((t=this.cursor)!==null&&t!==void 0?t:"")},onContextMenu:t=>t.preventDefault()},e("div",{key:"78f19335302d21fcb339e420779695ccd4045407",ref:t=>this.canvasContainerElement=t,class:E("canvas-container",{"enable-pointer-events ":window.PointerEvent!=null})},e("canvas",{key:"6de64c9e82d6e1a9843bb3f263a27ccdd5614314",ref:t=>{this.canvasElement=t;this.stateMap.interactionTarget=t},class:"canvas"}),this.errorMessage!=null?e("div",{class:"error-message"},this.errorMessage):null),e("slot",{key:"35e36b86ae1bba5b85695354506bb9dcc3375b3f"})))}async dispatchFrameDrawn(t){this.frame=t;this.internalFrameDrawnDispatcher.emit(t);this.frameDrawn.emit(t)}async registerInteractionHandler(t){this.interactionHandlers.push(t);this.initializeInteractionHandler(t);return{dispose:()=>{const i=this.interactionHandlers.indexOf(t);if(i!==-1){this.interactionHandlers[i].dispose();this.interactionHandlers.splice(i,1)}}}}async registerBasicInteractionHandler(t){this.interactionHandlers.push(t);this.initializeBasicInteractionHandler(t);return{dispose:()=>{const i=this.interactionHandlers.indexOf(t);if(i!==-1){this.interactionHandlers[i].dispose();this.interactionHandlers.splice(i,1)}}}}async registerTapKeyInteraction(t){this.tapKeyInteractions=[...this.tapKeyInteractions,t]}async getInteractionTarget_DEPRECATED(){if(this.stateMap.interactionTarget!=null){return this.stateMap.interactionTarget}else throw new Error("Interaction target is undefined.")}async addCursor(t,i){return this.stateMap.cursorManager.add(t,i)}async getInteractionHandlers(){return this.interactionHandlers}async getKeyInteractions(){return this.tapKeyInteractions}async getBaseInteractionHandler(){return this.baseInteractionHandler}async getJwt(){return this.token}handleSrcChanged(t){if(t!=null){this.load(t,{cameraType:this.cameraType})}else{this.unload()}}handleCameraControlsChanged(){this.initializeDefaultCameraInteractionHandlers()}handleKeyboardControlsChanged(){this.initializeDefaultKeyboardInteractionHandlers()}handleRotateAboutTapPointChanged(){var t,i;this.updateStreamAttributes();if(this.rotateAroundTapPoint){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setPrimaryInteractionType("rotate-point")}else{(i=this.baseInteractionHandler)===null||i===void 0?void 0:i.setPrimaryInteractionType("rotate")}}handleCameraTypeChanged(t,i){if(t!==i){this.updateCameraType()}}handleStreamAttributesChanged(){this.handleUpdateStreamAttributesWithTimer()}handleEnableTemporalRefinementChanged(){this.updateEnableTemporalRefinement()}handleConfigChanged(){this.updateResolvedConfig()}handleConfigEnvChanged(){this.updateResolvedConfig()}async load(t,i){var s,n;const e=this.experimentalSkipVisibilityCheck||this.isVisible;if(!e){console.debug("Detected the viewer is hidden. Delaying load until visible.");return}if(this.stream!=null&&this.dimensions!=null){const{EXPERIMENTAL_annotationPollingIntervalInMs:e}=this.getResolvedConfig();this.calculateComponentDimensions();this.stream.update({streamAttributes:this.getStreamAttributes(),config:Et(this.configEnv,this.config),dimensions:this.dimensions,frameBgColor:this.getBackgroundColor()});const o=await((s=this.stream)===null||s===void 0?void 0:s.load(t,this.clientId,this.getDeviceId(),this.getResolvedConfig(),i===null||i===void 0?void 0:i.cameraType));if(o.type==="connected"){this.sceneReady.emit();if(e!==undefined){(n=this.annotations)===null||n===void 0?void 0:n.connect(e)}}}else{throw new H("Cannot load scene. Viewer has not been initialized.")}}async unload(){var t;if(this.stream!=null){this.frameRenderVersion+=1;(t=this.annotations)===null||t===void 0?void 0:t.disconnect();this.stream.disconnect();this.frame=undefined;this.errorMessage=undefined}if(this.canvasElement!=null){const t=this.canvasElement.getContext("2d");if(t!=null){t.clearRect(0,0,this.canvasElement.width,this.canvasElement.height)}}}async reload(){if(this.src!=null){await this.unload();await this.load(this.src,{cameraType:this.cameraType})}}async scene(){return this.createScene()}async isSceneReady(){return this.stateMap.streamState.type==="connected"}async handleTapEvent(t){this.tapKeyInteractions.filter((i=>i.predicate(t.detail))).forEach((i=>i.fn(t.detail)))}emitConnectionChange(t){if(t.status==="connected"){if(t.jwt.length===0){throw new O("JWT is empty")}}if(!this.hostElement.isConnected){return}this.connectionChange.emit(t)}handleElementResize(t){const i=t.length>0&&this.dimensions!=null&&!f.isEqual(t[0].contentRect,this.viewport);if(i){if(this.resizeTimer!=null){clearTimeout(this.resizeTimer);this.resizeTimer=undefined}if(!this.isResizing){this.resizeTimer=setTimeout((()=>{this.isResizing=true;this.isResizeUpdate=true;this.recalculateComponentDimensions()}),this.resizeDebounce)}}}handleVisibilityChange(t){var i;this.isVisible=t;if(this.isVisible){(i=this.visibilityObserver)===null||i===void 0?void 0:i.disconnect();this.loadOrResumeStream()}}async loadOrResumeStream(){var t,i,s;const n=(i=(t=this.stream)===null||t===void 0?void 0:t.isPaused())!==null&&i!==void 0?i:false;if(this.src!=null&&!n){await this.load(this.src,{cameraType:this.cameraType})}else if(n){(s=this.stream)===null||s===void 0?void 0:s.resume()}}registerSlotChangeListeners(){this.mutationObserver=new MutationObserver((t=>this.injectViewerApi()));this.mutationObserver.observe(this.hostElement,{childList:true,subtree:true});this.styleObserver=new MutationObserver((t=>this.syncViewerStyles()));this.styleObserver.observe(this.hostElement,{attributes:true,attributeFilter:["style"]})}injectViewerApi(){function t(t){return Array.from(t.querySelectorAll("*"))}const i=t(this.hostElement);i.filter((t=>t.nodeName.startsWith("VERTEX-"))).reduce(((i,s)=>[...i,s,...t(s)]),[]).forEach((t=>{t.viewer=this.hostElement}))}syncViewerStyles(){var t;const i=this.getBackgroundColor();(t=this.stream)===null||t===void 0?void 0:t.update({frameBgColor:i,streamAttributes:this.getStreamAttributes()})}calculateComponentDimensions(){var t;const i=2073600;const s=this.getBounds();if((s===null||s===void 0?void 0:s.width)!=null&&(s===null||s===void 0?void 0:s.height)!=null){const n=f.create(s.width,s.height);const e=f.scaleFit(i,n);this.hostDimensions=n;this.dimensions=e!=null?f.create(e.width,e.height):undefined;this.viewport=Bt.fromDimensions((t=this.getCanvasDimensions())!==null&&t!==void 0?t:f.create(0,0))}}recalculateComponentDimensions(){var t;if(this.isResizing){this.calculateComponentDimensions();this.isResizing=false;if(((t=this.stream)===null||t===void 0?void 0:t.getState().type)==="connected"){this.updateDimensions(this.dimensions)}}}reportPerformance(t){if(this.stateMap.streamState.type==="connected"){const i={timings:t.map((t=>({receiveToPaintDuration:p(t.duration)})))};this.getStream().recordPerformance(i,false)}}addStreamListeners(){this.stateMap.streamListeners=this.getStream().stateChanged.on((t=>{this.handleStreamStateChanged(this.stateMap.streamState,t)}))}handleStreamStateChanged(t,i){this.stateMap.streamState=i;if(i.type==="connecting"){this.handleConnecting(t,i)}else if(i.type==="connected"){this.handleConnected(t,i)}else if(i.type==="connection-failed"){this.handleConnectionFailed(t,i)}else if(i.type==="disconnected"){this.handleDisconnected(t,i)}}handleConnecting(t,i){if(t.type!=="connecting"){this.token=undefined;this.errorMessage=undefined;this.emitConnectionChange({status:"connecting"})}}handleConnected(t,i){var s;this.token=i.token.token;if(t.type!=="connected"){this.errorMessage=undefined;this.canvasRenderer=ji(xi,Vi(),this.getResolvedConfig().flags.logFrameRate,(t=>this.reportPerformance(t)));this.emitConnectionChange({status:"connected",jwt:i.token.token});this.deviceIdChange.emit(i.deviceId)}if(((s=this.frame)===null||s===void 0?void 0:s.getId())!==i.frame.getId()){this.updateFrame(i.frame)}this.updateDimensions(this.dimensions)}handleConnectionFailed(t,i){if(t.type!=="connection-failed"){this.token=undefined;this.errorMessage=i.message;this.emitConnectionChange({status:"connection-failed",errorMessage:i.message})}}handleDisconnected(t,i){if(t.type!=="disconnected"){this.token=undefined;this.errorMessage=undefined;this.emitConnectionChange({status:"disconnected"})}}updateDimensions(t){var i;(i=this.stream)===null||i===void 0?void 0:i.update({dimensions:t});this.dimensionschange.emit(t)}async updateFrame(t){var i;const s=this.getCanvasDimensions();const n=this.frameRenderVersion;if(this.canvasElement!=null&&s!=null&&((i=this.frame)===null||i===void 0?void 0:i.getId())!==t.getId()){const i=this.canvasElement.getContext("2d");if(i!=null){const e=this.frame;this.frame=gt(t,e);this.updateInteractionApi(e);const o={canvas:i,canvasDimensions:s,dimensions:this.dimensions,frame:this.frame,viewport:this.viewport,beforeDraw:()=>{this.updateCanvasDimensions(s);this.isResizeUpdate=false},predicate:()=>{if(this.isResizeUpdate){return this.dimensions==null||f.isEqual(this.dimensions,o.frame.image.imageAttr.frameDimensions)}return true}};this.frameReceived.emit(this.frame);if(this.frame.scene.hasChanged){this.sceneChanged.emit()}const a=await this.canvasRenderer(o);if(a!=null&&n===this.frameRenderVersion){this.updateViewerBackground();this.dispatchFrameDrawn(a)}}}}updateViewerBackground(){const t=this.getBackgroundColor();Ht((()=>{var i,s;(i=this.viewerContainerElement)===null||i===void 0?void 0:i.style.setProperty("background",t!=null?P.toHexString(t):"#ffffff");(s=this.canvasContainerElement)===null||s===void 0?void 0:s.style.setProperty("background",t!=null?P.toHexString(t):"#ffffff")}))}async initializeDefaultInteractionHandlers(){var t;await this.initializeDefaultCameraInteractionHandlers();await this.initializeDefaultTapInteractionHandler();this.initializeDefaultKeyboardInteractionHandlers();if(this.rotateAroundTapPoint){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setPrimaryInteractionType("rotate-point")}}clearDefaultCameraInteractionHandlers(){this.defaultInteractionHandlerDisposables.forEach((t=>t.dispose()));this.defaultInteractionHandlerDisposables=[]}clearDefaultKeyboardInteractions(){this.defaultTapKeyInteractions.forEach((t=>{const i=this.tapKeyInteractions.indexOf(t);if(i!==-1){this.tapKeyInteractions.splice(i,1)}}));this.tapKeyInteractions=[]}async initializeDefaultCameraInteractionHandlers(){var t,i;this.clearDefaultCameraInteractionHandlers();if(this.cameraControls){if(window.PointerEvent!=null){this.baseInteractionHandler=(t=this.baseInteractionHandler)!==null&&t!==void 0?t:new Ti((()=>this.getResolvedConfig()));const i=await this.registerInteractionHandler(this.baseInteractionHandler);const s=await this.registerInteractionHandler(new Pi);this.defaultInteractionHandlerDisposables=[i,s]}else{this.baseInteractionHandler=(i=this.baseInteractionHandler)!==null&&i!==void 0?i:new bi((()=>this.getResolvedConfig()));const t=await this.registerInteractionHandler(this.baseInteractionHandler);const s=await this.registerInteractionHandler(new ki);this.defaultInteractionHandlerDisposables=[t,s]}}}initializeDefaultKeyboardInteractionHandlers(){var t;this.clearDefaultKeyboardInteractions();if(this.keyboardControls&&this.stream!=null){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setDefaultKeyboardControls(this.keyboardControls);const i=new hi(this.stream,(()=>this.getResolvedConfig()),(()=>this.getImageScale()));const s=new fi(this.stream,(()=>this.getResolvedConfig()),(()=>this.getImageScale()),(()=>this.createScene()));this.registerTapKeyInteraction(i);this.registerTapKeyInteraction(s);this.defaultTapKeyInteractions=[i,s]}}async initializeDefaultTapInteractionHandler(){if(this.tapHandlerDisposable==null){if(window.PointerEvent!=null){const t=new Ai("pointerdown","pointerup","pointermove",(()=>this.getResolvedConfig()));this.tapHandlerDisposable=await this.registerInteractionHandler(t)}else{const t=new Ai("mousedown","mouseup","mousemove",(()=>this.getResolvedConfig()));this.tapHandlerDisposable=await this.registerInteractionHandler(t)}}}initializeInteractionHandler(t){if(this.stateMap.interactionTarget==null){throw new $("Cannot initialize interaction handler. Interaction target is undefined.")}if(this.interactionApi==null){throw new $("Cannot initialize interaction handler. Interaction APi is undefined.")}t.initialize(this.stateMap.interactionTarget,this.interactionApi)}initializeBasicInteractionHandler(t){if(this.stateMap.interactionTarget==null){throw new $("Cannot initialize interaction handler. Interaction target is undefined.")}t.initialize(this.stateMap.interactionTarget)}createInteractionApi(){if(this.stream==null){throw new j("Cannot create interaction API. Component has not been initialized.")}return this.frame==null||this.frame.scene.camera.isPerspective()?new ui(this.stream,this.stateMap.cursorManager,(()=>this.getResolvedConfig().interactions),(()=>this.createScene()),(()=>this.frame),(()=>this.viewport),this.tap,this.doubletap,this.longpress,this.interactionStarted,this.interactionFinished):new li(this.stream,this.stateMap.cursorManager,(()=>this.getResolvedConfig().interactions),(()=>this.createScene()),(()=>this.frame),(()=>this.viewport),this.tap,this.doubletap,this.longpress,this.interactionStarted,this.interactionFinished)}handleCursorChanged(){window.requestAnimationFrame((()=>{this.cursor=this.stateMap.cursorManager.getActiveCursor()}))}async createScene(){const t=await this.waitForConnectedState();const i=yt();const{frame:s,sceneId:n,sceneViewId:e,worldOrientation:o}=t;return new Dt(this.getStream(),s,ft(o),i,(()=>this.getImageScale()),this.viewport,n,e)}getBackgroundColor(){if(this.canvasContainerElement!=null){const t=ks(this.hostElement,"--image-background");const i=ks(this.hostElement,"--viewer-background");const s=t!==null&&t!==void 0?t:i;return s!=null?P.fromCss(s):P.create(255,255,255)}}getBounds(){return As(this.hostElement)}getCanvasDimensions(){return this.getResolvedConfig().flags.letterboxFrames?this.dimensions:this.hostDimensions}getImageScale(){const t=this.getCanvasDimensions();if(this.dimensions!=null&&t!=null){return a.create(this.dimensions.width/t.width,this.dimensions.height/t.height)}}getStreamAttributes(){return{depthBuffers:this.getDepthBufferStreamAttributesValue(),experimentalRenderingOptions:this.experimentalRenderingOptions,featureHighlighting:this.featureHighlighting,featureLines:this.featureLines,featureMaps:this.featureMaps,frames:{frameBackgroundColor:this.getBackgroundColor()},noDefaultLights:this.noDefaultLights,phantom:this.phantom,sceneComparison:this.sceneComparison,selectionHighlighting:this.selectionHighlighting,crossSectioning:this.crossSectioning}}updateCanvasDimensions(t){if(this.canvasElement!=null){this.canvasElement.width=t.width;this.canvasElement.height=t.height}}updateStreamAttributes(){var t;(t=this.stream)===null||t===void 0?void 0:t.update({streamAttributes:this.getStreamAttributes()})}updateEnableTemporalRefinement(){var t;(t=this.stream)===null||t===void 0?void 0:t.update({enableTemporalRefinement:this.enableTemporalRefinement})}updateInteractionApi(t){if(this.frame!=null){const i=(t==null||t.scene.camera.isPerspective())&&this.frame.scene.camera.isOrthographic();const s=(t==null||t.scene.camera.isOrthographic())&&this.frame.scene.camera.isPerspective();if(i||s){this.interactionApi=this.createInteractionApi();this.cameraType=this.frame.scene.camera.isPerspective()?"perspective":"orthographic";this.cameraTypeChanged.emit(this.cameraType);this.interactionHandlers.forEach((t=>this.initializeInteractionHandler(t)))}}}updateCameraType(){var t,i;if(this.frame!=null){if(this.cameraType==="orthographic"&&this.frame.scene.camera.isPerspective()){(t=this.stream)===null||t===void 0?void 0:t.replaceCamera({camera:nt(Ct(this.frame.scene.camera,this.frame.scene.boundingBox))})}else if(this.cameraType==="perspective"&&this.frame.scene.camera.isOrthographic()){(i=this.stream)===null||i===void 0?void 0:i.replaceCamera({camera:nt(bt(this.frame.scene.camera))})}}}handleAnnotationSetsChange(t){if(t>0&&this.getDepthBufferStreamAttributesValue()==null){this.stateMap.depthBuffersOverrideForAnnotations=true;this.updateStreamAttributes()}else if(t===0&&this.stateMap.depthBuffersOverrideForAnnotations){this.stateMap.depthBuffersOverrideForAnnotations=false;this.updateStreamAttributes()}}getDepthBufferStreamAttributesValue(){var t;const i=(t=this.depthBuffers)!==null&&t!==void 0?t:this.rotateAroundTapPoint||this.stateMap.depthBuffersOverrideForAnnotations?"final":undefined;return i}updateResolvedConfig(){this.resolvedConfig=Et(this.configEnv,this.config)}getResolvedConfig(){return Ms("Resolved config is undefined",(()=>this.resolvedConfig))}getStream(){return Ms("Stream is undefined",(()=>this.stream))}getDeviceId(){if(this.deviceId==null){try{this.deviceId=ps(us.DEVICE_ID,(t=>t["device-id"]))}catch(t){console.warn("Cannot read device ID. Local storage is not supported.")}if(this.deviceId==null){this.deviceId=D.create();try{ms(us.DEVICE_ID,{["device-id"]:this.deviceId})}catch(t){console.warn("Cannot write device ID. Local storage is not supported.")}}}return this.deviceId}async waitForConnectedState(){if(this.stateMap.streamState.type!=="connected"){console.debug("Stream was not in a connected state. Waiting for successful connection.");return new Promise(((t,i)=>{const s=this.getStream().onStateChanged((i=>{if(i.type==="connected"){t(i)}}));setTimeout((()=>{s.dispose();i(new Error("Timed out waiting for connected state."))}),Ts)}))}return this.stateMap.streamState}get hostElement(){return this}static get watchers(){return{src:[{handleSrcChanged:0}],cameraControls:[{handleCameraControlsChanged:0}],keyboardControls:[{handleKeyboardControlsChanged:0}],rotateAroundTapPoint:[{handleRotateAboutTapPointChanged:0}],cameraType:[{handleCameraTypeChanged:0}],crossSectioning:[{handleStreamAttributesChanged:0}],depthBuffers:[{handleStreamAttributesChanged:0}],experimentalRenderingOptions:[{handleStreamAttributesChanged:0}],featureHighlighting:[{handleStreamAttributesChanged:0}],featureLines:[{handleStreamAttributesChanged:0}],featureMaps:[{handleStreamAttributesChanged:0}],noDefaultLights:[{handleStreamAttributesChanged:0}],phantom:[{handleStreamAttributesChanged:0}],sceneComparison:[{handleStreamAttributesChanged:0}],selectionHighlighting:[{handleStreamAttributesChanged:0}],enableTemporalRefinement:[{handleEnableTemporalRefinementChanged:0}],config:[{handleConfigChanged:0}],configEnv:[{handleConfigEnvChanged:0}]}}static get style(){return Ds()}},[257,"vertex-viewer",{src:[1],clientId:[1,"client-id"],deviceId:[1025,"device-id"],config:[1],configEnv:[1,"config-env"],resolvedConfig:[1040],cameraControls:[4,"camera-controls"],cameraType:[1537,"camera-type"],keyboardControls:[4,"keyboard-controls"],rotateAroundTapPoint:[4,"rotate-around-tap-point"],token:[1025],depthBuffers:[1,"depth-buffers"],phantom:[16],noDefaultLights:[4,"no-default-lights"],enableTemporalRefinement:[4,"enable-temporal-refinement"],experimentalRenderingOptions:[1,"experimental-rendering-options"],featureLines:[16],selectionHighlighting:[16],featureHighlighting:[16],sceneComparison:[16],crossSectioning:[16],featureMaps:[1,"feature-maps"],resizeDebounce:[2,"resize-debounce"],frame:[1040],stream:[1040],stencilBuffer:[1040],viewport:[1040],annotations:[1040],modelViews:[1040],pmi:[1040],sceneItems:[1040],canvases:[1040],experimentalSkipVisibilityCheck:[4,"experimental-skip-visibility-check"],dimensions:[32],hostDimensions:[32],errorMessage:[32],cursor:[32],stateMap:[32],dispatchFrameDrawn:[64],registerInteractionHandler:[64],registerBasicInteractionHandler:[64],registerTapKeyInteraction:[64],getInteractionTarget_DEPRECATED:[64],addCursor:[64],getInteractionHandlers:[64],getKeyInteractions:[64],getBaseInteractionHandler:[64],getJwt:[64],load:[64],unload:[64],reload:[64],scene:[64],isSceneReady:[64]},[[0,"tap","handleTapEvent"]],{src:[{handleSrcChanged:0}],cameraControls:[{handleCameraControlsChanged:0}],keyboardControls:[{handleKeyboardControlsChanged:0}],rotateAroundTapPoint:[{handleRotateAboutTapPointChanged:0}],cameraType:[{handleCameraTypeChanged:0}],crossSectioning:[{handleStreamAttributesChanged:0}],depthBuffers:[{handleStreamAttributesChanged:0}],experimentalRenderingOptions:[{handleStreamAttributesChanged:0}],featureHighlighting:[{handleStreamAttributesChanged:0}],featureLines:[{handleStreamAttributesChanged:0}],featureMaps:[{handleStreamAttributesChanged:0}],noDefaultLights:[{handleStreamAttributesChanged:0}],phantom:[{handleStreamAttributesChanged:0}],sceneComparison:[{handleStreamAttributesChanged:0}],selectionHighlighting:[{handleStreamAttributesChanged:0}],enableTemporalRefinement:[{handleEnableTemporalRefinementChanged:0}],config:[{handleConfigChanged:0}],configEnv:[{handleConfigEnvChanged:0}]}]);function Ms(t,i){const s=i();if(s!=null){return s}else throw new Error(t)}function xs(){if(typeof customElements==="undefined"){return}const i=["vertex-viewer"];i.forEach((i=>{switch(i){case"vertex-viewer":if(!customElements.get(t(i))){customElements.define(t(i),Es)}break}}))}xs();const Rs=Es;const Bs=xs;export{Rs as VertexViewer,Bs as defineCustomElement};
4
+ import{t,p as i,H as s,d as n,h as e,e as o}from"./p-Bb32XUUS.js";import{p as a,v as r,a as h,b as c,r as l,c as d,d as u,e as f}from"./p-DDQcM-So.js";import{s as m}from"./p-B2_E6tqs.js";import{t as p,p as v,S as w,a as g,c as y,W as C}from"./p-BoB09nlv.js";import{m as b,E as S,a as I,c as P,d as T,o as A,u as k,b as D}from"./p-CHdoymO5.js";import{c as E}from"./p-C6gMOKYg.js";import{u as M,I as x,p as R,C as B,W as L,S as z,V as H,M as O,a as j,b as $}from"./p--8q6LyIm.js";import{p as V}from"./p-DRnMrHWY.js";import{s as K,r as F}from"./p-FRKLa468.js";import{r as N,a as W,c as q}from"./p-CjG1fMh1.js";import{h as U,i as _,j as J,k as X,l as G,m as Y,n as Z,o as Q,p as tt,E as it,u as st,t as nt,q as et,r as ot,s as at,v as rt,w as ht,x as ct,y as lt,z as dt,B as ut,C as ft,G as mt,H as pt,I as vt,J as wt,K as gt,L as yt,M as Ct,N as bt}from"./p-B9R0QWr4.js";import{t as St,m as It,n as Pt,j as Tt,M as At,k as kt,S as Dt}from"./p-CAugdB_8.js";import{p as Et}from"./p-ahjMltGJ.js";import{C as Mt}from"./p-B-ToCp8-.js";import{g as xt,c as Rt}from"./p-bal2RLiw.js";import{V as Bt}from"./p-BHAaIoH5.js";import{B as Lt,M as zt}from"./p-3DqRAYgO.js";import{w as Ht}from"./p-Cd7kap5W.js";const Ot=0;const jt=255;class $t{constructor(t){this.viewer=t;this.handleInteractionStarted=()=>{this.invalidateStencilBuffer();this.pendingInteractionFinished=new Promise((t=>{this.pendingInteractionFinishedResolver=t}))};this.handleInteractionFinished=()=>{var t;(t=this.pendingInteractionFinishedResolver)===null||t===void 0?void 0:t.call(this);this.pendingInteractionFinished=undefined;this.pendingInteractionFinishedResolver=undefined};this.invalidateStencilBuffer=()=>{this.pendingStencilBuffer=undefined};t.addEventListener("interactionStarted",this.handleInteractionStarted);t.addEventListener("interactionFinished",this.handleInteractionFinished);t.addEventListener("frameReceived",(()=>{this.invalidateStencilBuffer()}))}async fetch(){var t;const i=await this.viewer.isSceneReady();const s=i?await this.viewer.scene():undefined;const n=s!=null?s.crossSectioning().current().sectionPlanes.length>0||this.viewer.featureLines!=null:false;const e=(t=this.viewer.frame)===null||t===void 0?void 0:t.scene.camera;if(n&&this.viewer.stream!=null&&e!=null){const t=await this.viewer.stream.getStencilBuffer({includeDepthBuffer:true});const{stencilBuffer:i,depthBuffer:s,imageAttributes:n}=U(t);const[o,a]=await Promise.all([_(new Uint8Array(i)),_(new Uint8Array(s))]);return Vt.fromPng(o,n,i,J.fromPng(a,e,n))}else return undefined}latest(){if(this.pendingStencilBuffer==null){this.pendingStencilBuffer=this.fetch()}return this.pendingStencilBuffer}async latestAfterInteraction(){await this.pendingInteractionFinished;return this.latest()}}class Vt{constructor(t,i,s,n,e){this.imageAttr=t;this.imageBytes=i;this.pixelBytes=s;this.imageChannels=n;this.depthBuffer=e}static fromPng(t,i,s,n){if(!(t.data instanceof Uint8Array)){throw new Error("Expected stencil PNG to have depth of 8-bit")}else if(t.channels!==1){throw new Error("Expected stencil PNG to have 1 color channel")}else{return new Vt(i,s,t.data,t.channels,n)}}getValue(t){const{width:i,height:s}=this.imageAttr.imageRect;const n=a.subtract(t,this.imageAttr.imageRect);const e=1/this.imageAttr.imageScale;const o=a.scale(n,e,e);if(o.x>=0&&o.y>=0&&o.x<i&&o.y<s){const t=Math.floor(o.x)+Math.floor(o.y)*i;const s=this.pixelBytes[t];return s}else return 0}hitTest(t){return this.getValue(t)!==Ot}snapToNearestPixel(t,i,s=()=>true){const n=i*2;const e=a.create(t.x-i,t.y-i);const o=[];for(let r=0;r<n*n;r++){const h=r%n;const c=Math.floor(r/n);const l=a.add(e,{x:h,y:c});if(a.distance(l,t)<=i){const t=this.getValue(l);if(t===jt&&s(t)){o.push(l)}}}const r=o.sort(((i,s)=>a.distance(i,t)-a.distance(s,t)));const h=r[0];return h!=null?a.create(Math.floor(h.x)+.5,Math.floor(h.y)+.5):t}}function Kt(t){return new Promise((i=>setTimeout(i,t)))}const Ft=b.defineMapper(b.compose((t=>t.toObject()),b.read(b.mapRequiredProp("id",X),b.mapRequiredProp("createdAt",G),b.mapRequiredProp("modifiedAt",G),b.mapProp("name",Y),b.mapProp("suppliedId",Y))),(([t,i,s,n,e])=>({id:t,createdAt:i,modifiedAt:s,name:n,suppliedId:e})));const Nt=b.ifInvalidThrow(Ft);const Wt=b.defineMapper(b.compose((t=>t.toObject()),b.read(b.mapRequiredProp("id",X),b.mapRequiredProp("createdAt",G),b.mapRequiredProp("modifiedAt",G),b.mapProp("suppliedId",Y),b.mapRequiredProp("data",(t=>{if(t.callout!=null){return Ut(t.callout)}else if(t.customJson!=null){return _t(t.customJson)}else{throw new Error("Undefined or unknown annotation data.")}})))),(([t,i,s,n,e])=>({id:t,createdAt:i,modifiedAt:s,suppliedId:n,data:e})));const qt=b.ifInvalidThrow(Wt);const Ut=b.defineMapper(b.read(b.mapRequiredProp("position",Z),b.mapProp("icon",Y),b.mapProp("primaryColor",Y),b.mapProp("accentColor",Y)),(([t,i,s,n])=>({type:"callout",position:t,icon:i,primaryColor:s,accentColor:n})));const _t=b.defineMapper(b.read(b.requiredProp("type"),b.mapRequiredProp("jsonData",(t=>JSON.parse(t)))),(([t,i])=>({type:"custom",jsonType:t,jsonData:i})));class Jt{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s;this.onStateChange=new S}async addAnnotationSet(t){await N((async i=>{const s=this.deviceIdProvider();const n=await q(this.jwtProvider,s);const e=new K.CreateSceneViewAnnotationSetRequest;const o=new M.Uuid;o.setHex(t);e.setSceneAnnotationSetId(o);this.client.createSceneViewAnnotationSet(e,n,i)}));return this.fetch()}disconnect(){if(this.connection!=null){this.connection.dispose();this.connection=undefined}}connect(t=1e4){this.disconnect();const i=this.pollAnnotationState(t);this.connection={dispose:()=>i.abort()}}async fetch(t={}){const i=await this.fetchAnnotationSetsAsArray();const s=await this.fetchAnnotationsAsArray(i);const n=(await Promise.all(s)).reduce(((t,[i,s])=>({annotations:{...t.annotations,[i.id]:s}})),{annotations:{}});if(t.signal==null||!t.signal.aborted){this.updateState(n)}return n}async removeAnnotationSet(t){await N((async i=>{const s=this.deviceIdProvider();const n=await q(this.jwtProvider,s);const e=new K.DeleteSceneViewAnnotationSetRequest;const o=new M.Uuid;o.setHex(t);e.setSceneAnnotationSetId(o);this.client.deleteSceneViewAnnotationSet(e,n,i)}));return this.fetch()}pollAnnotationState(t){const i=new AbortController;const s=async t=>{await this.fetch({signal:i.signal});if(!i.signal.aborted){await Kt(t);await s(t)}};I.abort(i.signal,s(t));return i}fetchAnnotationSets(){return W((t=>async i=>{const s=this.deviceIdProvider();const n=await q(this.jwtProvider,s);const e=new K.ListSceneViewAnnotationSetsRequest;if(t!=null){const i=new V.Pager;i.setCursor(t);i.setLimit(100);e.setPage(i)}this.client.listSceneViewAnnotationSets(e,n,i)}),(t=>{var i;return(i=t.toObject().nextCursor)===null||i===void 0?void 0:i.next}))}async fetchAnnotationSetsAsArray(){return(await I.asArray(this.fetchAnnotationSets())).flatMap((t=>t.getSceneAnnotationSetsList())).map((t=>Nt(t)))}fetchAnnotations(t){return W((i=>async s=>{const n=this.deviceIdProvider();const e=await q(this.jwtProvider,n);const o=new K.ListSceneAnnotationsRequest;const a=St(t);o.setSceneAnnotationSetId(a);if(i!=null){const t=new V.Pager;t.setCursor(i);t.setLimit(100);o.setPage(t)}this.client.listSceneAnnotations(o,e,s)}),(t=>{var i;return(i=t.toObject().nextCursor)===null||i===void 0?void 0:i.next}))}fetchAnnotationsAsArray(t){const i=t.map((async t=>{const i=(await I.asArray(this.fetchAnnotations(t.id))).flatMap((t=>t.getSceneAnnotationsList())).map((t=>qt(t)));return[t,i]}));return Promise.all(i)}updateState(t){this.state=t;this.onStateChange.emit(t)}}const Xt=b.defineMapper(b.read(b.mapRequiredProp("color",Q),b.getProp("thickness")),(([t,i])=>({color:t,thickness:i})));const Gt=b.defineMapper(b.read(b.mapRequiredProp("color",Q)),(([t])=>({color:t})));const Yt=b.defineMapper(b.read(b.pickFirst(b.mapProp("arrow",b.ifDefined((t=>({...t,type:"arrow-end"})))),b.mapProp("circle",b.ifDefined((t=>({...t,type:"circle-end"})))),b.mapProp("dash",b.ifDefined((t=>({...t,type:"dash-end"})))))),(([t])=>t!==null&&t!==void 0?t:undefined));const Zt=b.defineMapper(b.read(b.mapRequiredProp("startPosition",tt),b.mapRequiredProp("endPosition",tt),b.mapProp("strokeStyle",b.ifDefined(Xt)),b.mapProp("fillStyle",b.ifDefined(Gt)),b.mapProp("startShape",b.ifDefined(Yt)),b.mapProp("endShape",b.ifDefined(Yt))),(([t,i,s,n,e,o])=>({type:"line-2d",startPosition:t,endPosition:i,strokeStyle:s,fillStyle:n,startShape:e!==null&&e!==void 0?e:undefined,endShape:o!==null&&o!==void 0?o:undefined})));const Qt=b.defineMapper(b.read(b.mapRequiredProp("topLeft",tt),b.mapRequiredProp("bottomRight",tt),b.mapProp("strokeStyle",b.ifDefined(Xt)),b.mapProp("fillStyle",b.ifDefined(Gt))),(([t,i,s,n])=>({type:"oval-2d",topLeftPosition:t,bottomRightPosition:i,strokeStyle:s,fillStyle:n})));const ti=b.defineMapper(b.read(b.mapRequiredProp("positionsList",b.mapArray(tt)),b.mapProp("strokeStyle",b.ifDefined(Xt)),b.mapProp("fillStyle",b.ifDefined(Gt))),(([t,i,s])=>({type:"freeform-2d",positions:t,strokeStyle:i,fillStyle:s})));const ii=b.defineMapper(b.read(b.mapRequiredProp("primaryColor",Q),b.mapRequiredProp("accentColor",Q),b.mapRequiredProp("position",Z),b.mapProp("sceneItemId",b.ifDefined(X))),(([t,i,s,n])=>({type:"pin-2d",primaryColor:t,accentColor:i,position:s,sceneItemId:n!==null&&n!==void 0?n:undefined})));const si=b.defineMapper(b.read(b.mapRequiredProp("primaryColor",Q),b.mapRequiredProp("accentColor",Q),b.mapRequiredProp("anchorPosition",Z),b.mapRequiredProp("textPosition",tt),b.getProp("text"),b.mapProp("sceneItemId",b.ifDefined(X))),(([t,i,s,n,e,o])=>({type:"callout",primaryColor:t,accentColor:i,anchorPosition:s,textPosition:n,text:e,sceneItemId:o!==null&&o!==void 0?o:undefined})));const ni=b.defineMapper(b.read(b.pickFirst(b.mapProp("line2d",b.ifDefined(Zt)),b.mapProp("oval",b.ifDefined(Qt)),b.mapProp("freeform",b.ifDefined(ti)),b.mapProp("pin",b.ifDefined(ii)),b.mapProp("callout",b.ifDefined(si)))),(([t])=>t!==null&&t!==void 0?t:undefined));const ei=b.defineMapper(b.read(b.mapRequiredProp("itemsList",b.mapArray(ni))),(([t])=>({items:t.filter((t=>t!=null))})));const oi=b.defineMapper(b.read(b.mapRequiredProp("canvas",b.mapRequiredProp("document",b.mapRequiredProp("v1",ei)))),(([t])=>t));const ai=b.ifInvalidThrow(oi);class ri{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s}async getCanvas({canvasId:t,sceneViewStateId:i}){if(t!=null&&i!=null){throw new Error("Invalid request. Only one lookup ID between `canvasId` and `sceneViewStateId` can be provided.")}const s=await N((async s=>{const n=this.deviceIdProvider();const e=await q(this.jwtProvider,n);const o=new K.GetCanvasRequest;if(t!=null){const i=St(t);o.setCanvasId(i)}else if(i!=null){const t=St(i);o.setSceneViewStateId(t)}this.client.getCanvas(o,e,s)}));return ai(s.toObject())}}class hi{constructor(t,i,s){this.stream=t;this.configProvider=i;this.imageScaleProvider=s}predicate(t){return t.altKey&&!t.shiftKey}async fn(t){var i;const s=this.imageScaleProvider();const n=await this.stream.hitItems({point:a.scale(t.position,(s===null||s===void 0?void 0:s.x)||1,(s===null||s===void 0?void 0:s.y)||1)},true);if(((i=n.hitItems)===null||i===void 0?void 0:i.hits)!=null&&n.hitItems.hits.length>0){await this.stream.flyTo({itemId:n.hitItems.hits[0].itemId,animation:{duration:p(this.configProvider().animation.durationMs)}})}else{console.debug(`No hit results found for fly to part [position={x: ${t.position.x}, y: ${t.position.y}}]`)}}}class ci{constructor(t,i,s,n,e,o,a,r,h,c,l){this.stream=t;this.cursors=i;this.getConfig=s;this.getScene=n;this.getFrame=e;this.getViewport=o;this.tapEmitter=a;this.doubleTapEmitter=r;this.longPressEmitter=h;this.interactionStartedEmitter=c;this.interactionFinishedEmitter=l;this.tap=this.tap.bind(this);this.doubleTap=this.doubleTap.bind(this);this.longPress=this.longPress.bind(this);this.emitTapEvent=this.emitTapEvent.bind(this)}addCursor(t,i){return this.cursors.add(t,i)}async getWorldPointFromViewport(t){const i=this.getViewport();const s=this.getFrame();if(s==null){throw new Error("Cannot get world point. Frame is undefined.")}const n=await s.depthBuffer();return n!=null?i.transformPointToWorldSpace(t,n,.5):undefined}async getEntityTypeAtPoint(t){var i;const s=this.getViewport();const n=await((i=this.getFrame())===null||i===void 0?void 0:i.featureMap());if(n!=null){const i=s.transformPointToFrame(t,n);return n.getEntityType(i)}else{return it.NO_GEOMETRY}}getRayFromPoint(t){const i=this.getViewport();const s=this.getFrame();if(s!=null){return i.transformPointToRay(t,s.image,s.scene.camera)}else throw new Error("Cannot get camera. Frame is undefined.")}async tap(t,i={},s=0){this.emitTapEvent(this.tapEmitter.emit,t,i,s)}async doubleTap(t,i={},s=0){this.emitTapEvent(this.doubleTapEmitter.emit,t,i,s)}async longPress(t,i={},s=0){this.emitTapEvent(this.longPressEmitter.emit,t,i,s)}async beginInteraction(t={}){if(!this.isInteracting()){this.activeRenderOptions=t;this.interactionStartedEmitter.emit();this.sceneLoadingPromise=this.getScene();this.currentCamera=(await this.sceneLoadingPromise).camera();this.sceneLoadingPromise=undefined;await this.stream.beginInteraction()}}async transformCamera(t,i){var s,n;if(i===void 0){i=(s=this.activeRenderOptions)!==null&&s!==void 0?s:{}}if(this.isInteracting()){const s=await this.getScene();const e=this.getViewport();const o=this.getFrame();const a=await(o===null||o===void 0?void 0:o.depthBuffer());this.currentCamera=this.currentCamera!=null&&e!=null&&o!=null?t({camera:this.currentCamera,viewport:e,scale:s.scale(),boundingBox:s.boundingBox(),frame:o,depthBuffer:a}):undefined;await((n=this.currentCamera)===null||n===void 0?void 0:n.render(i))}}async twistCamera(...t){return this.transformCamera((({camera:i,viewport:s})=>{const n=r.normalize(r.subtract(i.lookAt,i.position));if(t.length===1&&typeof t[0]==="number"){const s=h.toRadians(-t[0]);return i.rotateAroundAxis(s,n)}else if(t.length===1){const n=a.create(s.width/2,s.height/2);const e=h.toDegrees(h.fromPoints(n,t[0]));const o=this.lastAngle!=null?e-this.lastAngle:0;this.lastAngle=e;const c=r.normalize(r.subtract(i.lookAt,i.position));const l=h.toRadians(-o);return i.rotateAroundAxis(l,c)}return i}))}async panCameraToScreenPoint(t){return this.transformCamera((({camera:i,frame:s,viewport:n,depthBuffer:e})=>{if(this.panData==null){const o=i.toFrameCamera();const a=o.direction;const r=n.transformPointToRay(t,s.image,o);const h=c.fromNormalAndCoplanarPoint(a,i.lookAt);const d=l.intersectPlane(r,h);if(d==null){console.warn("Cannot determine fallback for pan. Ray does not intersect plane.");return i}const u=e!=null?this.getWorldPoint(t,e,d):d;const f=c.fromNormalAndCoplanarPoint(a,u);this.panData={hitPt:u,hitPlane:f,startingCamera:o}}if(this.panData!=null){const{hitPt:e,hitPlane:o,startingCamera:a}=this.panData;const h=n.transformPointToRay(t,s.image,a);const c=l.intersectPlane(h,o);if(c!=null){const t=r.subtract(e,c);return i.update(a).moveBy(t)}}return i}))}async viewAll(){await(await this.getScene()).camera().viewAll().render({})}async rotateCamera(t){return this.transformCamera((({camera:i,viewport:s})=>{const n=r.normalize(i.up);const e=r.normalize(r.subtract(i.lookAt,i.position));const o=r.cross(n,e);const a=r.cross(e,o);const h=r.normalize({x:t.x*o.x+t.y*a.x,y:t.x*o.y+t.y*a.y,z:t.x*o.z+t.y*a.z});const c=r.cross(h,e);const l=9.5*t.x/s.width;const d=9.5*t.y/s.height;const u=Math.abs(l)+Math.abs(d);return i.rotateAroundAxis(u,c)}))}async rotateCameraAtPoint(t,i){return this.transformCamera((({camera:s,viewport:n,depthBuffer:e})=>{if(this.worldRotationPoint==null){this.worldRotationPoint=e!=null?this.getWorldPoint(i,e,s.lookAt):s.lookAt}const o=r.normalize(s.up);const a=r.normalize(r.subtract(s.lookAt,s.position));const h=r.cross(o,a);const c=r.cross(a,h);const l=r.normalize({x:t.x*h.x+t.y*c.x,y:t.x*h.y+t.y*c.y,z:t.x*h.z+t.y*c.z});const d=r.cross(l,a);const u=9.5*t.x/n.width;const f=9.5*t.y/n.height;const m=Math.abs(u)+Math.abs(f);const p=s.rotateAroundAxisAtPoint(m,this.worldRotationPoint,d);return p.update({lookAt:r.add(r.scale(Math.abs(s.signedDistanceToBoundingBoxCenter())/r.magnitude(p.viewVector),p.viewVector),p.position)})}))}async zoomCamera(t){return this.transformCamera((({camera:i,viewport:s,frame:n,boundingBox:e})=>{if(s!=null&&n!=null){const o=i===null||i===void 0?void 0:i.toFrameCamera().isPerspective();if(o){const n=i.viewVector;const e=r.magnitude(n);const o=3*e*(t/s.height);const a=r.normalize(n);const h=r.scale(o,a);const c=r.add(i.position,h);const l=i.update({position:c});return l}else{const o=i;const a=i.toFrameCamera();const h=a.direction;const u=s.transformPointToRay(s.center,n.image,a);const f=4*(t/s.height);const m=r.magnitude(d.diagonal(e))*1e-5;const p=Math.max(m,o.fovHeight*(1-f));const v=c.fromNormalAndCoplanarPoint(h,a.lookAt);const w=l.intersectPlane(u,v);if(w!=null){const t=c.projectPoint(v,o.lookAt);const s=(o.fovHeight-p)/o.fovHeight;const n=r.scale(s,r.subtract(w,t));const e=r.add(o.lookAt,n);const a=i.update({lookAt:e,rotationPoint:e,fovHeight:p});return a}}}return i}))}async pivotCamera(t,i){return this.transformCamera((({camera:s})=>{const{position:n,up:e,lookAt:o}=s;const a=r.normalize(e);const c=r.normalize(s.viewVector);const l=r.cross(a,c);const d=r.cross(c,l);const u=r.rotateAboutAxis(h.toRadians(t),o,l,n);const f=r.rotateAboutAxis(h.toRadians(i),u,d,n);return s.update({...s,lookAt:f})}))}async endInteraction(){await this.sceneLoadingPromise;if(this.isInteracting()){this.currentCamera=undefined;this.worldRotationPoint=undefined;this.panData=undefined;this.zoomData=undefined;this.resetLastAngle();this.interactionFinishedEmitter.emit();await this.stream.endInteraction()}this.activeRenderOptions=undefined}resetLastAngle(){this.lastAngle=undefined}isInteracting(){return this.currentCamera!=null}pixelThreshold(t){const i=this.isCoarseInputDevice(t)?this.getConfig().coarsePointerThreshold:this.getConfig().finePointerThreshold;return i*window.devicePixelRatio}async hitItems(t){var i;const s=await(await this.getScene()).raycaster().hitItems(t);return(i=s===null||s===void 0?void 0:s.hits)!==null&&i!==void 0?i:[]}emitTapEvent(t,i,s={},n=0){const{altKey:e=false,ctrlKey:o=false,metaKey:a=false,shiftKey:r=false}=s;t({position:i,altKey:e,ctrlKey:o,metaKey:a,shiftKey:r,buttons:n})}isCoarseInputDevice(t){return t||window.matchMedia("(pointer: coarse)").matches}getWorldPoint(t,i,s){const n=this.getViewport();const e=n.transformPointToFrame(t,i);const o=i.hitTest(e);return o?n.transformPointToWorldSpace(t,i):s}}class li extends ci{constructor(t,i,s,n,e,o,a,r,h,c,l){super(t,i,s,n,e,o,a,r,h,c,l)}async getWorldPointFromViewport(t){const i=this.getViewport();const s=this.getFrame();if(s==null){throw new Error("Cannot get world point. Frame is undefined.")}const n=await s.depthBuffer();return n!=null?i.transformPointToWorldSpace(t,n,.5):undefined}async panCameraByDelta(t){return this.transformCamera((({camera:i,viewport:s})=>{const n=i.viewVector;const e=r.normalize(i.up);const o=r.normalize(n);const h=a.scale(t,.5,.5);const c=r.magnitude(n);const l=h.x*c/s.width;const d=h.y*c/s.height;const u=r.cross(e,o);const f=r.cross(o,u);const m=r.add(r.scale(l,u),r.scale(d,f));return i.moveBy(m)}))}async panCameraToScreenPoint(t){return this.transformCamera((({camera:i,frame:s,viewport:n,boundingBox:e})=>{if(this.panData==null){const e=i.toFrameCamera();const o=e.direction;const a=n.transformPointToRay(t,s.image,e);const r=c.fromNormalAndCoplanarPoint(o,i.lookAt);const h=l.intersectPlane(a,r);if(h==null){console.warn("Cannot determine fallback for pan. Ray does not intersect plane.");return i}this.panData={hitPt:h,hitPlane:r,startingCamera:e}}if(this.panData!=null){const{hitPt:e,hitPlane:o,startingCamera:a}=this.panData;const h=n.transformPointToRay(t,s.image,a);const c=l.intersectPlane(h,o);if(c!=null){const t=r.subtract(e,c);const s=r.add(a.lookAt,t);return i.update({lookAt:s,rotationPoint:s})}}return i}))}async zoomCameraToPoint(t,i){return this.transformCamera((({camera:s,viewport:n,frame:e,depthBuffer:o,boundingBox:h})=>{if(this.orthographicZoomData==null||a.distance(t,this.orthographicZoomData.startingScreenPt)>2){const i=s.toFrameCamera();const a=i.direction;const r=n.transformPointToRay(t,e.image,i);const h=c.fromNormalAndCoplanarPoint(a,i.lookAt);const d=l.intersectPlane(r,h);if(d==null){console.warn("Cannot determine fallback point for zoom. Ray does not intersect plane.");return s}const u=o!=null?this.getWorldPoint(t,o,d):d;const f=c.fromNormalAndCoplanarPoint(a,u);this.orthographicZoomData={hitPt:u,hitPlane:f,startingScreenPt:t}}if(this.orthographicZoomData!=null){const{hitPt:t,hitPlane:e}=this.orthographicZoomData;const o=4*(i/n.height);const a=r.magnitude(d.diagonal(h))*1e-5;const l=Math.max(a,s.fovHeight*(1-o));const u=c.projectPoint(e,s.lookAt);const f=(s.fovHeight-l)/s.fovHeight;const m=r.scale(f,r.subtract(t,u));const p=r.add(s.lookAt,m);return s.update({lookAt:p,rotationPoint:p,fovHeight:l})}return s}))}async rotateCamera(t){return this.transformCamera((({camera:i,viewport:s,boundingBox:n})=>{var e;const o=r.normalize(i.up);const a=r.normalize(r.subtract(i.lookAt,i.position));const h=r.cross(o,a);const c=r.cross(a,h);const l=r.normalize({x:t.x*h.x+t.y*c.x,y:t.x*h.y+t.y*c.y,z:t.x*h.z+t.y*c.z});const u=r.cross(l,a);const f=9.5*t.x/s.width;const m=9.5*t.y/s.height;const p=Math.abs(f)+Math.abs(m);const v=i.rotationPoint!=null&&((e=i.rotationPoint)===null||e===void 0?void 0:e.x)!=null?i.rotationPoint:i.lookAt;const w=i.rotateAroundAxisAtPoint(p,v,u);const g=st(w.lookAt,w.viewVector,d.center(n));return w.update({lookAt:g})}))}getWorldPoint(t,i,s){const n=this.getViewport();const e=n.transformPointToFrame(t,i);const o=i.hitTest(e);return o?n.transformPointToWorldSpace(t,i):s}}const di=.2;class ui extends ci{constructor(t,i,s,n,e,o,a,r,h,c,l){super(t,i,s,n,e,o,a,r,h,c,l)}async panCameraByDelta(t){return this.transformCamera((({camera:i,viewport:s})=>{var n;const e=i.viewVector;const o=r.normalize(i.up);const h=r.normalize(e);const c=a.scale(t,.25,.25);const l=r.magnitude(e)*Math.tan((n=i.fovY)!==null&&n!==void 0?n:45);const d=c.x*l/s.width;const u=c.y/s.width*l;const f=r.cross(o,h);const m=r.cross(h,f);const p=r.add(r.scale(d,f),r.scale(u,m));return i.moveBy(p)}))}async zoomCameraToPoint(t,i){return this.transformCamera((({camera:s,viewport:n,frame:e,depthBuffer:o,boundingBox:a})=>{const h=e.scene.camera;const d=h.direction;const u=s.toFrameCamera();const f=n.transformPointToRay(t,e.image,u);if(this.zoomData==null){const i=c.fromNormalAndCoplanarPoint(d,h.lookAt);const n=l.intersectPlane(f,i);if(n==null){console.warn("Cannot determine fallback point for zoom. Ray does not intersect plane.");return s}const e=o!=null?this.getWorldPoint(t,o,n):n;const a=c.fromNormalAndCoplanarPoint(d,e);this.zoomData={hitPt:e,hitPlane:a}}if(this.zoomData!=null){const{hitPlane:t}=this.zoomData;const{position:e,distance:o,isPastHitPlane:h,keepCurrent:d}=this.computeZoomDistances(i,s,n,a,f,this.zoomData);if(h&&!d){const t=l.create({origin:e,direction:r.normalize(s.viewVector)});return s.update({position:e,lookAt:l.at(t,o)})}else if(!d){return s.update({position:e,lookAt:c.projectPoint(t,e)})}}return s}))}walk(t){this.transformCamera((({camera:i,boundingBox:s})=>{const{position:n,up:e,lookAt:o}=i;const a=r.normalize(e);const h=r.normalize(i.viewVector);const c=Math.min(...r.toArray(d.lengths(s)));const l=r.scale(c,t);const u=r.cross(a,h);const f=r.cross(u,a);const m=r.scale(l.x,r.normalize(u));const p=r.scale(l.y,r.normalize(a));const v=r.scale(l.z,r.normalize(f));const w=r.negate(r.add(m,p,v));return i.update({...i,position:r.add(n,w),lookAt:r.add(o,w)})}))}computeZoomDistances(t,i,s,n,e,o){const a=this.getConfig();const{hitPt:h,hitPlane:c}=o;const d=a.useMinimumPerspectiveZoomDistance?this.computeZoomMinimumDistance(i,n):-1;const u=r.distance(i.position,h);const f=Math.max(d,u);const m=6*f*t/s.height;const p=l.at(e,m);const v=l.create({origin:p,direction:r.normalize(i.viewVector)});const w=l.intersectPlane(v,c);if(w==null&&a.useMinimumPerspectiveZoomDistance){const i=6*d*t/s.height;const n=l.at(e,i);return{position:n,distance:d,isPastHitPlane:true,keepCurrent:false}}else if(w==null){return{position:i.position,distance:f,isPastHitPlane:true,keepCurrent:true}}return{position:p,distance:f,isPastHitPlane:false,keepCurrent:false}}computeZoomMinimumDistance(t,i){const s=Math.abs(i.min.x)+Math.abs(i.max.x);const n=Math.abs(i.min.y)+Math.abs(i.max.y);const e=Math.abs(i.min.z)+Math.abs(i.max.z);const o=Math.max(s,n,e);const a=Math.abs(r.dot(r.normalize(t.viewVector),r.right()));const h=Math.abs(r.dot(r.normalize(t.viewVector),r.up()));const c=Math.abs(r.dot(r.normalize(t.viewVector),r.back()));const l=s*a;const d=n*h;const u=e*c;const f=o/s;const m=o/n;const p=o/e;return(l+d+u)/(f+m+p)*di}}class fi{constructor(t,i,s,n){this.stream=t;this.configProvider=i;this.imageScaleProvider=s;this.sceneProvider=n}predicate(t){return t.altKey&&t.shiftKey}async fn(t){var i,s;const n=this.imageScaleProvider();const e=await this.stream.hitItems({point:a.scale(t.position,(n===null||n===void 0?void 0:n.x)||1,(n===null||n===void 0?void 0:n.y)||1)},true);if(((i=e.hitItems)===null||i===void 0?void 0:i.hits)!=null&&e.hitItems.hits.length>0&&e.hitItems.hits[0].hitPoint!=null){const i=await this.sceneProvider();const n=(await this.sceneProvider()).camera();const o=e.hitItems.hits[0];if(o.hitPoint!=null&&o.hitPoint.x!=null&&o.hitPoint.y!=null&&o.hitPoint.z!=null){const t=r.create(o.hitPoint.x,o.hitPoint.y,o.hitPoint.z);const s=await this.getLookAtPoint(i,t,n.viewVector);await this.stream.flyTo({camera:nt(n.update({lookAt:s,rotationPoint:s}).toFrameCamera()),animation:{duration:p(this.configProvider().animation.durationMs)}})}else{console.debug(`No hit position found for fly to position [position={x: ${t.position.x}, y: ${t.position.y}}, hit-id={${(s=o.itemId)===null||s===void 0?void 0:s.hex}}]`)}}else{console.debug(`No hit results found for fly to position [position={x: ${t.position.x}, y: ${t.position.y}}]`)}}getLookAtPoint(t,i,s){if(t.isOrthographic()){return st(i,s,d.center(t.boundingBox()))}else{return i}}}class mi{setPosition(t){this.currentPosition=t}getPosition(){return this.currentPosition}getType(){return this.type}beginDrag(t,i,s,n){}drag(t,i){}endDrag(t,i){if(this.currentPosition!=null){i.endInteraction();this.currentPosition=undefined}}async zoom(t,i){}}class pi extends mi{constructor(){super(...arguments);this.type="rotate"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null){const s=a.create(t.screenX,t.screenY);const n=a.subtract(s,this.currentPosition);i.rotateCamera(n);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class vi extends mi{constructor(){super(...arguments);this.type="rotate-point"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);this.startingPosition=i;s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null&&this.startingPosition!=null){const s=a.create(t.screenX,t.screenY);const n=a.subtract(s,this.currentPosition);i.rotateCameraAtPoint(n,this.startingPosition);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class wi extends mi{constructor(t){super();this.interactionConfigProvider=t;this.type="zoom";this.isTransforming=false}async beginDrag(t,i,s,n){if(this.currentPosition==null){this.currentPosition=a.create(t.clientX,t.clientY);const i=n.getBoundingClientRect();const e=xt(t,i);this.startPt=e;await s.beginInteraction()}}async drag(t,i){if(this.currentPosition!=null){const s=a.create(t.clientX,t.clientY);const n=a.subtract(s,this.currentPosition);if(this.startPt!=null){await i.zoomCameraToPoint(this.startPt,n.y);this.currentPosition=s}}}endDrag(t,i){super.endDrag(t,i);this.stopInteractionTimer();this.isTransforming=false;this.startPt=undefined}async zoom(t,i,s){await this.runWheelZoomInteraction(i,(()=>i.zoomCamera(this.getDirectionalDelta(t))),s)}async zoomToPoint(t,i,s,n){await this.runWheelZoomInteraction(s,(()=>s.zoomCameraToPoint(t,this.getDirectionalDelta(i))),n)}async beginInteraction(t){this.isTransforming=true;await t.beginInteraction()}async endInteraction(t){this.isTransforming=false;await t.endInteraction()}resetInteractionTimer(t,i){this.stopInteractionTimer();this.startInteractionTimer(t,i)}getDirectionalDelta(t){return this.interactionConfigProvider().reverseMouseWheelDirection?-t:t}getInteractionDelay(){return this.interactionConfigProvider().mouseWheelInteractionEndDebounce}startInteractionTimer(t,i=0){this.interactionTimer=window.setTimeout((async()=>{this.interactionTimer=undefined;await this.endInteraction(t)}),i+this.getInteractionDelay())}stopInteractionTimer(){if(this.interactionTimer!=null){window.clearTimeout(this.interactionTimer);this.interactionTimer=undefined}}async runWheelZoomInteraction(t,i,s){if(!this.isTransforming){await this.beginInteraction(t)}this.resetInteractionTimer(t,s);i()}}class gi extends mi{constructor(){super(...arguments);this.type="pan"}beginDrag(t,i,s,n){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);this.canvasRect=n.getBoundingClientRect();s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null&&this.canvasRect!=null){const s=xt(t,this.canvasRect);i.panCameraToScreenPoint(s);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class yi extends mi{constructor(){super(...arguments);this.type="twist"}beginDrag(t,i,s,n){this.currentPosition=a.create(t.offsetX,t.offsetY);this.canvasRect=n.getBoundingClientRect();s.beginInteraction()}drag(t,i){const s=xt(t,this.canvasRect);this.currentPosition=s;i.twistCamera(s)}endDrag(t,i){super.endDrag(t,i)}}class Ci extends mi{constructor(){super(...arguments);this.type="pivot"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=a.create(t.screenX,t.screenY);s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null){const s=a.create(t.screenX,t.screenY);const n=a.subtract(s,this.currentPosition);i.pivotCamera(-.25*n.y,.25*n.x);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class bi extends Lt{constructor(t,i=new pi,s=new vi,n=new wi((()=>t().interactions)),e=new gi,o=new yi,a=new Ci){super("mousedown","mouseup","mousemove",i,s,n,e,o,a,t)}}function Si(t){window.requestAnimationFrame(t)}class Ii{constructor(){this.previousFirstPoints=[];this.previousSecondPoints=[]}initialize(t,i){this.element=t;this.interactionApi=i}dispose(){this.element=undefined}beginTwoPointTouch(t,i){this.previousFirstPoints=[...this.previousFirstPoints,t];this.previousSecondPoints=[...this.previousSecondPoints,i]}handleTwoPointTouchMove(t,i){this.previousFirstPoints=[...this.previousFirstPoints,t];this.previousSecondPoints=[...this.previousSecondPoints,i];Si((()=>{var t,i,s,n;if(this.previousFirstPoints.length>1&&this.previousSecondPoints.length>1&&this.previousFirstPoints.length===this.previousSecondPoints.length){const e=this.previousFirstPoints;const o=this.previousSecondPoints;this.previousFirstPoints=this.previousFirstPoints.slice(-1);this.previousSecondPoints=this.previousSecondPoints.slice(-1);const r=e.reduce(((t,i,s)=>{if(s<e.length-1){const n=e[s+1];const a=o[s];const r=o[s+1];return{deltas:[...t.deltas,this.computeDelta(i,a,n,r)],zooms:[...t.zooms,this.computeZoom(i,a,n,r)],angles:[...t.angles,this.computeAngle(i,a,n,r)]}}return t}),{deltas:[],zooms:[],angles:[]});const h=r.deltas.reduce(((t,i)=>a.add(t,i)),a.create());const c=r.zooms.reduce(((t,i)=>t+i),0);const l=r.angles.reduce(((t,i)=>t+i),0);const d=a.create((e[e.length-1].x+o[o.length-1].x)/2,(e[e.length-1].y+o[o.length-1].y)/2);(t=this.interactionApi)===null||t===void 0?void 0:t.beginInteraction();(i=this.interactionApi)===null||i===void 0?void 0:i.zoomCameraToPoint(d,c);(s=this.interactionApi)===null||s===void 0?void 0:s.panCameraByDelta(h);(n=this.interactionApi)===null||n===void 0?void 0:n.twistCamera(l)}}))}endTwoPointTouch(){this.previousFirstPoints=[];this.previousSecondPoints=[]}computeDelta(t,i,s,n){return a.add(a.subtract(s,t),a.subtract(n,i))}computeZoom(t,i,s,n){const e=a.distance(s,n)-a.distance(t,i);return e*.5}computeAngle(t,i,s,n){const e=u.create(a.subtract(t,i),a.subtract(s,n));return h.toDegrees(Math.atan2(u.determinant(e),u.dot(e)))}}class Pi extends Ii{constructor(){super();this.touchPoints={};this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerMove=this.handlePointerMove.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this)}dispose(){var t;(t=this.element)===null||t===void 0?void 0:t.removeEventListener("pointerdown",this.handlePointerDown);super.dispose()}initialize(t,i){super.initialize(t,i);t.addEventListener("pointerdown",this.handlePointerDown)}handlePointerDown(t){const i=a.create(t.screenX,t.screenY);this.touchPoints={...this.touchPoints,[t.pointerId]:i};const s=Object.keys(this.touchPoints);if(s.length===1){window.addEventListener("pointermove",this.handlePointerMove);window.addEventListener("pointerup",this.handlePointerUp)}else if(s.length===2){this.beginTwoPointTouch(this.touchPoints[0],this.touchPoints[1])}}handlePointerMove(t){if(this.touchPoints[t.pointerId]!=null){this.touchPoints[t.pointerId]=a.create(t.screenX,t.screenY)}const i=Object.keys(this.touchPoints);if(i.length===2){const t=this.touchPoints[i[0]];const s=this.touchPoints[i[1]];this.handleTwoPointTouchMove(t,s)}}handlePointerUp(t){var i;delete this.touchPoints[t.pointerId];const s=Object.keys(this.touchPoints);if(s.length===1){(i=this.interactionApi)===null||i===void 0?void 0:i.endInteraction()}if(s.length===0){window.removeEventListener("pointermove",this.handlePointerMove);window.removeEventListener("pointerup",this.handlePointerUp)}this.endTwoPointTouch()}}class Ti extends zt{constructor(t,i=new pi,s=new vi,n=new wi((()=>t().interactions)),e=new gi,o=new yi,a=new Ci){super("pointerdown","pointerup","pointermove",i,s,n,e,o,a,t);this.touchPoints=new Set;this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this)}initialize(t,i){super.initialize(t,i);t.addEventListener("pointerdown",this.handlePointerDown)}addEventListenersToElement(t){t.addEventListener(this.downEvent,this.handleDownEvent);t.addEventListener("wheel",this.handleMouseWheel,{passive:false});return{dispose:()=>{t.removeEventListener(this.downEvent,this.handleDownEvent);t.removeEventListener("wheel",this.handleMouseWheel)}}}handlePointerDown(t){this.downPosition=a.create(t.screenX,t.screenY);this.touchPoints.add(t.pointerId);if(this.touchPoints.size===1){window.addEventListener("pointerup",this.handlePointerUp)}if(this.touchPoints.size===2){this.disableIndividualInteractions=true}}handlePointerUp(t){this.touchPoints.delete(t.pointerId);if(this.touchPoints.size<2){this.disableIndividualInteractions=false}if(this.touchPoints.size===0){window.removeEventListener("pointerup",this.handlePointerUp)}}}class Ai{constructor(t,i,s,n){this.downEvent=t;this.upEvent=i;this.moveEvent=s;this.getConfig=n;this.handleDown=this.handleDown.bind(this);this.handleUp=this.handleUp.bind(this);this.handleMove=this.handleMove.bind(this);this.handleTouchStart=this.handleTouchStart.bind(this);this.handleTouchMove=this.handleTouchMove.bind(this);this.handleTouchEnd=this.handleTouchEnd.bind(this);this.handlePointerMove=this.handlePointerMove.bind(this);this.handlePointerEnd=this.handlePointerEnd.bind(this);this.clearPositions=this.clearPositions.bind(this);this.restartDoubleTapTimer=this.restartDoubleTapTimer.bind(this);this.clearDoubleTapTimer=this.clearDoubleTapTimer.bind(this);this.restartLongPressTimer=this.restartLongPressTimer.bind(this);this.clearLongPressTimer=this.clearLongPressTimer.bind(this);this.setPointerPositions=this.setPointerPositions.bind(this);this.emit=this.emit.bind(this)}dispose(){var t,i;(t=this.element)===null||t===void 0?void 0:t.removeEventListener(this.downEvent,this.handleDown);(i=this.element)===null||i===void 0?void 0:i.removeEventListener("touchstart",this.handleTouchStart);this.element=undefined;this.clearDoubleTapTimer();this.clearLongPressTimer()}initialize(t,i){this.element=t;this.interactionApi=i;t.addEventListener(this.downEvent,this.handleDown);t.addEventListener("touchstart",this.handleTouchStart,{passive:true})}handleTouchStart(t){if(t.touches.length===1){this.setPointerPositions(a.create(t.touches[0].clientX,t.touches[0].clientY));this.restartLongPressTimer();window.addEventListener("touchend",this.handleTouchEnd);window.addEventListener("touchmove",this.handleTouchMove)}}handleTouchMove(t){if(t.touches.length>0){this.handlePointerMove(a.create(t.touches[0].clientX,t.touches[0].clientY),true)}}handleTouchEnd(t){if(this.pointerDownPosition!=null){window.removeEventListener("touchend",this.handleTouchEnd);window.removeEventListener("touchmove",this.handleTouchMove)}this.handlePointerEnd(this.pointerDownPosition)}handleDown(t){this.setPointerPositions(a.create(t.clientX,t.clientY));this.buttons=t.buttons;const i={altKey:t.altKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey};this.restartLongPressTimer(i);window.addEventListener(this.upEvent,this.handleUp);window.addEventListener(this.moveEvent,this.handleMove)}handleMove(t){this.handlePointerMove(a.create(t.clientX,t.clientY),this.isTouch(t))}handleUp(t){if(this.pointerDownPosition!=null){window.removeEventListener(this.upEvent,this.handleUp);window.removeEventListener(this.moveEvent,this.handleMove)}this.handlePointerEnd(a.create(t.clientX,t.clientY),{altKey:t.altKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey},this.buttons,this.isTouch(t));this.buttons=undefined}handlePointerMove(t,i){var s;const n=((s=this.interactionApi)===null||s===void 0?void 0:s.pixelThreshold(i))||2;if(this.pointerDownPosition!=null&&a.distance(t,this.pointerDownPosition)>=n&&this.interactionTimer==null){this.clearPositions()}}handlePointerEnd(t,i={},s=0,n=false){var e,o;if(t!=null){if(this.longPressTimer!=null){this.emit((e=this.interactionApi)===null||e===void 0?void 0:e.tap)(t,i,s)}if(this.doubleTapTimer!=null&&this.secondPointerDownPosition!=null){this.emit((o=this.interactionApi)===null||o===void 0?void 0:o.doubleTap)(t,i,s,this.secondPointerDownPosition);this.clearDoubleTapTimer()}}this.pointerDownPosition=undefined;this.clearLongPressTimer()}emit(t){return(i,s={},n=0,e,o=false)=>{var r;const h=e||this.pointerDownPosition;const c=((r=this.interactionApi)===null||r===void 0?void 0:r.pixelThreshold(o))||1;let l;if(this.interactionTimer!=null){l=this.getCanvasPosition(h||i)}else if(h!=null&&a.distance(h,i)<=c){l=this.getCanvasPosition(i)}if(l!=null&&t!=null){t(l,s,n)}}}getCanvasPosition(t){var i;const s=(i=this.element)===null||i===void 0?void 0:i.getBoundingClientRect();const n=s!=null?a.create(s.left,s.top):undefined;return n!=null?a.subtract(a.create(t.x,t.y),n):undefined}clearPositions(){this.pointerDownPosition=undefined;this.firstPointerDownPosition=undefined;this.secondPointerDownPosition=undefined;this.clearDoubleTapTimer();this.clearLongPressTimer();this.clearInteractionTimer()}clearDoubleTapTimer(){if(this.doubleTapTimer!=null){window.clearTimeout(this.doubleTapTimer)}this.doubleTapTimer=undefined;this.firstPointerDownPosition=undefined;this.secondPointerDownPosition=undefined}restartDoubleTapTimer(){this.clearDoubleTapTimer();this.doubleTapTimer=window.setTimeout((()=>this.clearDoubleTapTimer()),this.getConfig().events.doubleTapThreshold)}clearLongPressTimer(){if(this.longPressTimer!=null){window.clearTimeout(this.longPressTimer)}this.longPressTimer=undefined}restartLongPressTimer(t={}){this.clearLongPressTimer();this.longPressTimer=window.setTimeout((()=>{var i;if(this.pointerDownPosition){this.emit((i=this.interactionApi)===null||i===void 0?void 0:i.longPress)(this.pointerDownPosition,t,this.buttons)}this.clearLongPressTimer()}),this.getConfig().events.longPressThreshold)}restartInteractionTimer(){this.clearInteractionTimer();this.interactionTimer=window.setTimeout((()=>{this.interactionTimer=undefined}),this.getConfig().interactions.interactionDelay)}clearInteractionTimer(){if(this.interactionTimer!=null){window.clearTimeout(this.interactionTimer);this.interactionTimer=undefined}}setPointerPositions(t){this.pointerDownPosition=t;this.restartInteractionTimer();if(this.firstPointerDownPosition==null){this.restartDoubleTapTimer();this.firstPointerDownPosition=t}else{this.secondPointerDownPosition=t}}isTouch(t){return window.PointerEvent!=null&&t instanceof PointerEvent?t.pointerType==="touch":false}}class ki extends Ii{constructor(){super();this.handleTouchStart=this.handleTouchStart.bind(this);this.handleTouchMove=this.handleTouchMove.bind(this);this.handleTouchEnd=this.handleTouchEnd.bind(this)}dispose(){var t;(t=this.element)===null||t===void 0?void 0:t.removeEventListener("touchstart",this.handleTouchStart);super.dispose()}initialize(t,i){super.initialize(t,i);t.addEventListener("touchstart",this.handleTouchStart)}handleTouchStart(t){if(t.touches.length>=1){t.preventDefault();const i=t.touches[0];this.currentPosition1=a.create(i.screenX,i.screenY);if(t.touches[1]!=null){this.beginTwoPointTouch(this.currentPosition1,a.create(t.touches[1].screenX,t.touches[1].screenY))}window.addEventListener("touchmove",this.handleTouchMove,{passive:false});window.addEventListener("touchend",this.handleTouchEnd)}}handleTouchMove(t){t.preventDefault();if(t.touches.length===1){this.handleOnePointTouchMove(t.touches[0])}else if(t.touches.length===2){const i=a.create(t.touches[0].clientX,t.touches[0].clientY);const s=a.create(t.touches[1].clientX,t.touches[1].clientY);this.handleTwoPointTouchMove(i,s)}}handleTouchEnd(t){var i;t.preventDefault();(i=this.interactionApi)===null||i===void 0?void 0:i.endInteraction();this.isInteracting=false;window.removeEventListener("touchmove",this.handleTouchMove);window.removeEventListener("touchend",this.handleTouchEnd);this.endTwoPointTouch()}handleOnePointTouchMove(t){var i,s,n;const e=a.create(t.screenX,t.screenY);if(this.currentPosition1!=null){const t=a.subtract(e,this.currentPosition1);const o=((i=this.interactionApi)===null||i===void 0?void 0:i.pixelThreshold(true))||2;if(a.distance(e,this.currentPosition1)>=o||this.isInteracting){(s=this.interactionApi)===null||s===void 0?void 0:s.beginInteraction();(n=this.interactionApi)===null||n===void 0?void 0:n.rotateCamera(t);this.isInteracting=true}}this.currentPosition1=e}}const Di={clearMarks:()=>undefined,clearMeasures:()=>undefined,getEntriesByName:()=>[],mark:()=>undefined,measure:()=>undefined};function Ei(){var t;if(typeof window!=="undefined"){return window.performance}return(t=globalThis.performance)!==null&&t!==void 0?t:Di}class Mi{constructor(t,i=Ei()){this.name=t;this.perf=i;this.measures=new Set;this.nextId=0}clearMeasurements(){this.perf.clearMeasures(this.name)}measure(t){if(t instanceof Promise){const i=this.begin();return t.finally((()=>this.end(i)))}else if(typeof t==="function"){const i=this.begin();const s=t();this.end(i);return s}else{throw new Error("Input must be a function or Promise")}}takeMeasurements(){const t=this.perf.getEntriesByName(this.name);this.clearMeasurements();return t}takeLastMeasurement(){const t=this.takeMeasurements();return t[t.length-1]}begin(){const t=`${this.name}-${this.nextId++}`;this.measures.add(t);this.perf.mark(t);return t}end(t){this.perf.measure(this.name,t);this.perf.clearMarks(t);this.measures.delete(t)}}const xi=new Mi("paint_time");function Ri(t){const i=new Uint8Array(t.byteLength);i.set(t);return i.buffer}function Bi(t){return new Promise(((i,s)=>{const n=new Blob([Ri(t)]);const e=URL.createObjectURL(n);const o=new Image;o.addEventListener("load",(()=>{i({image:o,dispose:()=>undefined});URL.revokeObjectURL(e)}));o.addEventListener("error",(()=>{s(new x("Failed to load image data"));URL.revokeObjectURL(e)}));o.src=e}))}async function Li(t){const i=new Blob([Ri(t)]);const s=await window.createImageBitmap(i);return{image:s,dispose:()=>s.close()}}function zi(t){if(window.createImageBitmap!=null){return Li(t)}else{return Bi(t)}}const Hi=1e3;function Oi(t,i){const s=i.viewport.calculateDrawRect(i.frame.image);i.canvas.clearRect(0,0,i.canvasDimensions.width,i.canvasDimensions.height);i.canvas.drawImage(t.image,s.x,s.y,s.width,s.height)}function ji(t,i){const s=t.takeMeasurements();if(s.length>0){i(s)}}function $i(t,i,s,n,e=Hi){let o;let a=0;let r;let h=[];function c(){a++;if(o==null){o=setInterval((()=>{ji(t,n);if(a===0){d()}}),e)}}function l(){a--}function d(){if(o!=null){clearInterval(o);o=undefined}}if(s){setInterval((()=>{if(r!=null){if(h.length===5){h=[...h.slice(1),r]}else{h.push(r)}const t=h.reduce(((t,i)=>t+i))/h.length;console.debug(`Paint rate: ${r}fps`);console.debug(`Paint rate (avg): ${t}`);r=undefined}}),1e3)}return s=>{c();return t.measure((async()=>{const t=await i(s);r=r==null?1:r+1;return t})).finally((()=>l()))}}function Vi(){let t=[];function i(i){if(i!=null){const s=i.copy({correlationIds:[...i.correlationIds,...t.filter((t=>!i.correlationIds.includes(t)))]});t=[];return s}return i}function s(){let t=-1;return async i=>{if(i.frame.sequenceNumber>t){const s=await zi(i.frame.image.imageBytes);t=i.frame.sequenceNumber;return s}}}function n(){let t=-1;return async(i,s)=>{var n;if(s!=null&&i.frame.sequenceNumber>t){t=i.frame.sequenceNumber;(n=i.beforeDraw)===null||n===void 0?void 0:n.call(i);Oi(s,i);s.dispose();return i.frame}s===null||s===void 0?void 0:s.dispose()}}const e=s();const o=n();return async s=>{var n,a;const r=(a=(n=s.predicate)===null||n===void 0?void 0:n.call(s))!==null&&a!==void 0?a:true;t=[...t,...s.frame.correlationIds];if(r){return e(s).then((t=>o(s,t).then(i)))}}}function Ki(t){return i=>{var s;const n=(s=i.request.requestId)===null||s===void 0?void 0:s.value;if(n!=null){t(n)(i)}}}function Fi(t){return i=>{const{drawFrame:s}=i.request;if(s!=null){t(s)(i)}}}const Ni=1*60;function Wi(t){let i=false;return s=>{const n=t();if(n!=null){const t=n.remoteTime(new Date(Date.now()));const e=p(s,t);const o=v(e).getTime();if(o>=0){return e}else{if(!i){console.warn(`Possible erroneous send to receive timing. Muting for ${Ni}s. [sent-at=${s.toISOString()}, received-at=${t.toISOString()}, remote-time=${n.knownRemoteTime.toISOString()}]`);i=true;setTimeout((()=>i=false),Ni*1e3)}return undefined}}}}function qi(t,i){const s=Wi(i);return Ki((i=>Fi((n=>n=>{const e=v(n.sentAtTime);if(e!=null){t.replyResult(i,{drawFrame:{sendToReceiveDuration:s(e)}})}}))))}var Ui=F();const _i=b.defineMapper(b.read(b.requiredProp("d"),b.requiredProp("ns"),b.mapRequiredProp("ka",et),b.mapRequiredProp("kd",et),b.mapRequiredProp("ks",et),b.mapRequiredProp("ke",et)),(([t,i,s,n,e,o])=>({opacity:t,glossiness:i,ambient:s,diffuse:n,specular:e,emissive:o})));const Ji=b.defineMapper(b.read(b.mapRequiredProp("defaultMaterial",(()=>It)),b.mapRequiredProp("colorMaterial",_i)),(([t,i])=>({defaultMaterial:t,colorMaterial:i})));const Xi=b.defineMapper(b.read(b.requiredProp("name"),b.requiredProp("category")),(([t,i])=>({name:t,category:i})));const Gi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"string",value:t})));const Yi=b.mapProp("string",b.ifDefined(Gi));const Zi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"long",value:t})));const Qi=b.mapProp("pb_long",b.ifDefined(Zi));const ts=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"double",value:t})));const is=b.mapProp("pb_double",b.ifDefined(ts));const ss=b.defineMapper(b.read(b.requiredProp("value")),(([t])=>({type:"timestamp",value:t})));const ns=b.mapProp("date",b.ifDefined(ss));const es=b.compose(b.pickFirst(Yi,Qi,is,ns),b.required("value"));const os=b.defineMapper(b.read(b.requiredProp("id"),b.mapProp("key",b.ifDefined(Xi)),b.mapProp("value",b.ifDefined(es))),(([t,i,s])=>({id:t,key:i,value:s})));const as=b.defineMapper(b.read(b.mapProp("cursor",ot),b.mapRequiredProp("entriesList",b.mapArray(os))),(([t,i])=>({paging:{next:t},entries:i})));const rs=b.ifInvalidThrow(as);const hs=b.defineMapper(b.read(b.mapRequiredProp("id",X),b.mapRequiredProp("createdAt",at),b.mapProp("materialOverride",b.ifDefined(Ji)),b.mapProp("transform",b.ifDefined(rt)),b.mapProp("isVisible",b.ifDefined(ht)),b.mapProp("isSelected",b.ifDefined(ht)),b.mapProp("isPhantom",b.ifDefined(ht)),b.mapProp("endItem",b.ifDefined(ht))),(([t,i,s,n,e,o,a,r])=>({id:t,createdAt:i,materialOverride:s,transform:n,isVisible:e,isSelected:o,isPhantom:a,endItem:r})));const cs=b.defineMapper(b.read(b.mapRequiredProp("id",X),b.mapRequiredProp("createdAt",at),b.mapRequiredProp("name",Y),b.mapProp("parentId",b.ifDefined(X)),b.mapProp("suppliedId",b.ifDefined(Y)),b.mapProp("boundingBox",b.ifDefined(ct)),b.mapProp("worldTransform",b.ifDefined(rt)),b.mapProp("override",b.ifDefined(hs))),(([t,i,s,n,e,o,a,r])=>({id:t,createdAt:i,name:s,parentId:n!==null&&n!==void 0?n:undefined,suppliedId:e,boundingBox:o,worldTransform:a,override:r})));const ls=b.ifInvalidThrow(b.defineMapper(b.read(b.mapProp("item",b.ifDefined(cs))),(([t])=>t!==null&&t!==void 0?t:undefined)));class ds{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s}async getSceneViewItem(t,i,s){const n=await N((async n=>{const e=this.deviceIdProvider();const o=await q(this.jwtProvider,e);const a=new K.GetSceneViewItemRequest;a.setSceneItemId(St(t));a.setViewId(St(i));const r=new Ui.FieldMask;if(s.includeBoundingBox){r.addPaths("bounding_box")}if(s.includeWorldTransform){r.addPaths("world_transform")}if(s.includeOverride){r.addPaths("override")}a.setAdditionalFields(r);this.client.getSceneViewItem(a,o,n)}));return ls(n.toObject())}async listSceneItemMetadata(t,i){const s=await N((async s=>{const n=this.deviceIdProvider();const e=await q(this.jwtProvider,n);const o=new K.ListSceneItemMetadataRequest;o.setItemId(St(t));const a=new R.Pager;if(i.size!=null){a.setLimit(i.size)}if(i.cursor!=null){a.setCursor(i.cursor)}o.setPager(a);this.client.listSceneItemMetadata(o,e,s)}));return rs(s.toObject())}}var us;(function(t){t["DEVICE_ID"]="vertexvis:device-id"})(us||(us={}));function fs(){if(typeof window==="undefined"){throw new Error("Local storage is not available.")}return window.localStorage}function ms(t,i,s=fs()){const n=s.getItem(t);if(n!=null){const e={...JSON.parse(n),...i};s.setItem(t,JSON.stringify(e))}else{s.setItem(t,JSON.stringify(i))}}function ps(t,i,s=fs()){const n=s.getItem(t);if(n!=null){return i(JSON.parse(n))}}function vs(t,i,s,n){return I.retry((()=>{if(!t.aborted){return i()}return Promise.resolve(s)}),n)}class ws extends w{constructor(t,i={}){var s,n,e,o,a;super(t,{loggingEnabled:i.loggingEnabled});this.state={type:"disconnected"};this.stateChanged=new S;this.dimensions=f.create(0,0);this.streamAttributes={};this.enableTemporalRefinement=(s=i.enableTemporalRefinement)!==null&&s!==void 0?s:true;this.frameBgColor=P.create(255,255,255);this.config=Et("platprod");this.options={tokenRefreshOffsetInSeconds:(n=i.tokenRefreshOffsetInSeconds)!==null&&n!==void 0?n:30,offlineThresholdInSeconds:(e=i.offlineThresholdInSeconds)!==null&&e!==void 0?e:30,loadTimeoutInSeconds:(o=i.loadTimeoutInSeconds)!==null&&o!==void 0?o:15,enableTemporalRefinement:(a=i.enableTemporalRefinement)!==null&&a!==void 0?a:true}}isPaused(){return this.pausedState!=null}getState(){return this.state}disconnect(){if(this.state.type!=="disconnected"&&this.state.type!=="connection-failed"){console.debug("Disconnecting websocket");this.state.connection.dispose();this.updateState({type:"disconnected"})}}async load(t,i,s,n=Et("platprod"),e){this.clientId=i;this.deviceId=s;this.config=n;if(this.state.type==="disconnected"){await this.loadIfDisconnected(t,e)}else if(this.state.type==="connection-failed"){await this.loadIfDisconnected(t,e)}else{await this.loadIfConnectingOrConnected(t,this.state,e)}return this.state}update(t){this.frameBgColor=t.frameBgColor?t.frameBgColor:this.frameBgColor;if(t.dimensions!=null&&!T(t.dimensions,this.dimensions)){this.dimensions=t.dimensions;this.ifState("connected",(()=>this.updateDimensions({dimensions:this.getDimensions()})))}const i=!T(this.streamAttributes,t.streamAttributes);if(t.streamAttributes!=null&&i){this.streamAttributes=t.streamAttributes;this.ifState("connected",(()=>this.updateStream({streamAttributes:gs(this.streamAttributes)})))}if(t.enableTemporalRefinement!=null&&t.enableTemporalRefinement!==this.enableTemporalRefinement){this.enableTemporalRefinement=t.enableTemporalRefinement;if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}}pause(){if(this.state.type==="connected"){this.pausedState=this.state;console.debug(`Stream paused [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`);this.disconnect()}}async resume(){if(this.pausedState!=null){console.debug(`Stream resumed [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`);await this.connectToExistingStream(this.pausedState);this.pausedState=undefined}}async loadIfConnectingOrConnected(t,i,s){var n;const{resource:e,subResource:o}=i.resource;const a=Pt(t);const r=!A.isEqual(e,a.resource);const h=!A.isEqual(o,a.subResource);const c=i.type==="connecting"||i.type==="reconnecting";const l=i.type==="connected";if(r||c&&h){this.disconnect();return this.loadIfDisconnected(t)}else if(l&&h&&((n=a.subResource)===null||n===void 0?void 0:n.type)==="scene-view-state"){const t=a.queries.find((t=>t.type==="supplied-id"));const n={...a.subResource.id!=null?{sceneViewStateId:{hex:a.subResource.id}}:{},...t!=null?{sceneViewStateSuppliedId:{value:t.id}}:{},...s!=null?{cameraType:Cs(s)}:{}};await this.loadSceneViewState(n);this.updateState({...i,resource:a})}}async loadIfDisconnected(t,i){try{await this.connectWithNewStream(Pt(t),i)}catch(t){if(t instanceof B){this.updateState({type:"connection-failed",message:`Cannot load scene. ${t.message}`,error:t})}else if(t instanceof g){this.updateState({type:"connection-failed",message:`Cannot load scene. Stream request failed to start stream.`,error:t})}else{this.updateState({type:"connection-failed",message:`Cannot load scene for unknown reason. See console logs.`,error:t})}throw t}}connectWithNewStream(t,i){return this.openWebsocketStream(t,"connecting",(()=>this.requestNewStream(t,i)))}connectToExistingStream(t){return this.openWebsocketStream(t.resource,"reconnecting",(()=>this.requestReconnectStream(t)),{maxRetries:Number.POSITIVE_INFINITY})}async openWebsocketStream(t,i,s,{maxRetries:n=3}={}){var e;const o=Ss(Is(this.config,t.resource,this.clientId,this.deviceId));console.debug(`Initiating WS connection [uri=${o.url}]`);(e=this.abortController)===null||e===void 0?void 0:e.abort();const a=new AbortController;this.abortController=a;const r=bs(this.config);this.updateState({type:i,resource:t,connection:{dispose:()=>{this.dispose();a.abort()}}});const h=await I.abort(a.signal,vs(a.signal,(()=>this.connect(o,r)),{dispose:()=>{}},{maxRetries:n,delaysInMs:ws.WS_RECONNECT_DELAYS})).catch((t=>{throw new L("Websocket connection failed.",t instanceof Error?t:undefined)}));if(!h.aborted){return this.requestNewOrExistingStream(t,h.result,s)}else{this.updateState({type:"disconnected"})}}async requestNewOrExistingStream(t,i,s){const n=this.requestClock();const e=await s();console.debug(`Stream connected [stream-id=${e.streamId}, scene-id=${e.sceneId}, scene-view-id=${e.sceneViewId}]`);const o=this.onRequest((t=>{const i=t.request.drawFrame;if(i!=null){const t=ft(e.worldOrientation)(i);if(this.state.type==="connected"){if(t.depthBufferBytes!=null||this.state.frame.temporalRefinementCorrelationId!==t.temporalRefinementCorrelationId){this.updateState({...this.state,frame:t,fallbackDepthBufferBytes:t.depthBufferBytes})}else{this.updateState({...this.state,frame:t.copy({depthBufferBytes:this.state.fallbackDepthBufferBytes})})}}}}));const a=this.reconnectWhenNeeded();const r=this.refreshTokenWhenExpired(e.token);const h=this.acknowledgeFrameRequests();const c=e.frame==null?await this.waitForFrame(e.worldOrientation,this.options.loadTimeoutInSeconds):e.frame;const l=await n;console.debug(`Synchronized clocks [local-time=${l.knownLocalTime.toISOString()}, remote-time=${l.knownRemoteTime.toISOString()}]`);this.updateState({type:"connected",connection:{dispose:()=>{a.dispose();o.dispose();r.dispose();h.dispose();i.dispose()}},resource:t,streamId:e.streamId,deviceId:e.deviceId,sceneId:e.sceneId,sceneViewId:e.sceneViewId,worldOrientation:e.worldOrientation,token:e.token,frame:c,clock:l,fallbackDepthBufferBytes:undefined})}async requestNewStream(t,i){var s,n;const e=t.queries.find((t=>t.type==="supplied-id"));const o=mt(await this.startStream({streamKey:{value:t.resource.id},dimensions:this.getDimensions(),frameBackgroundColor:ys(this.frameBgColor),clientSupportsTemporalRefinement:this.enableTemporalRefinement,streamAttributes:gs(this.streamAttributes),sceneViewStateId:((s=t.subResource)===null||s===void 0?void 0:s.type)==="scene-view-state"&&t.subResource.id!=null?{hex:t.subResource.id}:undefined,sceneViewStateSuppliedId:((n=t.subResource)===null||n===void 0?void 0:n.type)==="scene-view-state"&&e!=null?{value:e.id}:undefined,cameraType:i!=null?Cs(i):undefined}));return{resource:t,streamId:o.streamId,sceneId:o.sceneId,sceneViewId:o.sceneViewId,deviceId:o.sessionId,token:o.token,worldOrientation:o.worldOrientation,frame:undefined,fallbackDepthBufferBytes:undefined}}async requestReconnectStream(t){const i=pt(await this.reconnect({streamId:{hex:t.streamId},dimensions:this.getDimensions(),frameBackgroundColor:ys(this.frameBgColor),streamAttributes:gs(this.streamAttributes),clientSupportsTemporalRefinement:this.enableTemporalRefinement}));return{...t,token:i.token}}async requestClock(){const t=vt(await this.syncTime({requestTime:y()}));return new Tt(t)}reconnectWhenNeeded(){const t=this.onClose((()=>{if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}));const i=this.onRequest((t=>{const i=t.request.gracefulReconnection!=null;if(i&&this.state.type==="connected"){console.debug("Received request for graceful reconnect. Closing connection and attempting reconnect.");this.closeAndReconnect(this.state)}}));const s=this.reconnectWhenOffline();return{dispose:()=>{t.dispose();i.dispose();s.dispose()}}}refreshTokenWhenExpired(t){let i;const s=t=>{const{tokenRefreshOffsetInSeconds:n}=this.options;const e=t.remainingTimeInMs(n);i=window.setTimeout((async()=>{const t=await this.refreshToken();const i=wt(t);s(i);if(this.state.type==="connected"){this.updateState({...this.state,token:i})}}),e)};s(t);return{dispose:()=>clearTimeout(i)}}reconnectWhenOffline(){let t;const i=()=>window.clearTimeout(t);const s=()=>{i();const s=this.options.offlineThresholdInSeconds;console.debug(`Detected that host is offline. Will attempt reconnect in ${s}s.`);t=window.setTimeout((()=>{if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}),s*1e3)};const n=()=>{console.debug("Detected that host is online.");i()};const e=()=>s();window.addEventListener("offline",e);window.addEventListener("online",n);return{dispose:()=>{i();window.removeEventListener("offline",e);window.removeEventListener("online",n)}}}closeAndReconnect(t){t.connection.dispose();return this.connectToExistingStream(t)}async waitForFrame(t,i){let s;try{return await I.timeout(i*1e3,new Promise((i=>{s=this.onRequest((n=>{try{const s=n.request.drawFrame;if(s!=null){const n=ft(t)(s);i(n)}}finally{s===null||s===void 0?void 0:s.dispose()}}))})))}catch(t){throw new z(`Frame timed out after ${i}s`,t instanceof Error?t:undefined)}finally{s===null||s===void 0?void 0:s.dispose()}}acknowledgeFrameRequests(){return this.onRequest(qi(this,(()=>this.state.type==="connected"?this.state.clock:undefined)))}updateState(t){if(this.state!==t){this.state=t;this.stateChanged.emit(this.state)}}getDimensions(){if(f.area(this.dimensions)===0){return f.create(1,1)}return this.dimensions}ifState(t,i){if(this.state.type===t){return i()}}onStateChanged(t){return this.stateChanged.on(t)}}ws.WS_RECONNECT_DELAYS=[0,1e3,1e3,5e3];const gs=b.ifInvalidThrow(lt);const ys=b.ifInvalidThrow(dt);const Cs=b.ifInvalidThrow(ut);function bs(t){return{EXPERIMENTAL_frameDelivery:{...t.EXPERIMENTAL_frameDelivery,rateLimitingEnabled:t.flags.throttleFrameDelivery},EXPERIMENTAL_adaptiveRendering:{...t.EXPERIMENTAL_adaptiveRendering,enabled:t.flags.adaptiveRendering},EXPERIMENTAL_qualityOfService:{...t.EXPERIMENTAL_qualityOfService}}}function Ss(t){return{url:k.toString(t),protocols:["ws.vertexvis.com"]}}function Is(t,i,s,n){if(s!=null){return k.appendPath(k.toString(k.parseAndAddParams("/ws",{clientId:s,deviceId:n})),k.parse(t.network.renderingHost))}else{return k.appendPath(`/stream-keys/${i.id}/session`,k.parse(t.network.renderingHost))}}class Ps{constructor(t){this.callback=t;this.handleVisibilityChange=this.handleVisibilityChange.bind(this);this.emitVisibilityChange=this.emitVisibilityChange.bind(this);this.mutationObservers=[]}isVisible(t){if("checkVisibility"in t){return t.checkVisibility({visibilityProperty:true,opacityProperty:true})}return true}observe(t){this.targetElement=t;this.watchElementVisibility(t)}unobserve(){if(this.targetElement!=null){this.mutationObservers.forEach((t=>t.disconnect()));this.mutationObservers=[]}this.targetElement=undefined}disconnect(){this.mutationObservers.forEach((t=>t.disconnect()));this.mutationObservers=[]}watchElementVisibility(t){if(t!=null){const i=new MutationObserver(this.handleVisibilityChange);i.observe(t,{attributes:true,attributeFilter:["style","class","hidden"]});this.mutationObservers=[...this.mutationObservers,i];this.watchElementVisibility(t.parentElement)}}handleVisibilityChange(){if(this.targetElement!=null){this.emitVisibilityChange(this.targetElement)}}emitVisibilityChange(t){const i=t!=null?this.isVisible(t):true;console.debug(`Detected visibility change [visible={${i}}]`);this.callback(i)}}const Ts=15e3;function As(t){return t.getBoundingClientRect()}function ks(t,i){const s=window.getComputedStyle(t);const n=s.getPropertyValue(i);return n!==""?n:undefined}const Ds=()=>`:host{--image-background:var(--image-background);--viewer-background:var(--viewer-background);display:block;position:relative;width:300px;height:300px;min-width:1px;min-height:1px;user-select:none;-webkit-user-select:none}.canvas-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative}.enable-pointer-events{touch-action:none}.viewer-container{width:100%;height:100%;overflow:hidden}.error-message{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}`;const Es=i(class t extends s{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.tap=n(this,"tap");this.doubletap=n(this,"doubletap");this.longpress=n(this,"longpress");this.frameReceived=n(this,"frameReceived");this.frameDrawn=n(this,"frameDrawn");this.tokenExpired=n(this,"tokenExpired");this.connectionChange=n(this,"connectionChange");this.sceneReady=n(this,"sceneReady");this.sceneChanged=n(this,"sceneChanged");this.interactionStarted=n(this,"interactionStarted");this.interactionFinished=n(this,"interactionFinished");this.cameraTypeChanged=n(this,"cameraTypeChanged");this.annotationStateChanged=n(this,"annotationStateChanged");this.deviceIdChange=n(this,"deviceIdChange");this.dimensionschange=n(this,"dimensionschange");this.configEnv="platprod";this.cameraControls=true;this.cameraType="perspective";this.keyboardControls=true;this.rotateAroundTapPoint=true;this.phantom={opacity:.1};this.noDefaultLights=false;this.enableTemporalRefinement=true;this.experimentalRenderingOptions="";this.crossSectioning={endCapEnabled:true,endCapColor:undefined};this.resizeDebounce=100;this.viewport=Bt.fromDimensions(f.create(0,0));this.experimentalSkipVisibilityCheck=false;this.stateMap={cursorManager:new Mt,streamState:{type:"disconnected"}};this.isVisible=false;this.frameRenderVersion=0;this.interactionHandlers=[];this.defaultInteractionHandlerDisposables=[];this.tapKeyInteractions=[];this.defaultTapKeyInteractions=[];this.internalFrameDrawnDispatcher=new S;this.handleUpdateStreamAttributesWithTimer=()=>{const t=50;if(this.streamAttributesUpdateTimer==null){this.streamAttributesUpdateTimer=setTimeout((()=>{this.streamAttributesUpdateTimer=undefined;this.updateStreamAttributes()}),t)}};this.handleElementResize=this.handleElementResize.bind(this);this.handleVisibilityChange=this.handleVisibilityChange.bind(this)}connectedCallback(){var t,i,s;(t=this.stencilBuffer)!==null&&t!==void 0?t:this.stencilBuffer=new $t(this.hostElement);this.visibilityObserver=new Ps(this.handleVisibilityChange);this.isVisible=this.visibilityObserver.isVisible(this.hostElement);if(!this.isVisible){(i=this.visibilityObserver)===null||i===void 0?void 0:i.observe(this.hostElement)}(s=this.stream)===null||s===void 0?void 0:s.resume()}componentWillLoad(){var t;this.updateResolvedConfig();this.calculateComponentDimensions();this.resizeObserver=new ResizeObserver(this.handleElementResize);this.registerSlotChangeListeners();const i=this.getResolvedConfig();const s=new m.SceneViewAPIClient(i.network.sceneViewHost);this.annotations=new Jt(s,(()=>this.token),(()=>this.deviceId));this.annotations.onStateChange.on((t=>{this.annotationStateChanged.emit(t);const i=Object.keys(t.annotations).length;this.handleAnnotationSetsChange(i)}));this.stream=(t=this.stream)!==null&&t!==void 0?t:new ws(new C,{loggingEnabled:i.flags.logWsMessages,enableTemporalRefinement:this.enableTemporalRefinement});this.addStreamListeners();this.modelViews=new At(s,this.stream,(()=>this.token),(()=>this.deviceId));this.pmi=new kt(s,(()=>this.token),(()=>this.deviceId));this.sceneItems=new ds(s,(()=>this.token),(()=>this.deviceId));this.canvases=new ri(s,(()=>this.token),(()=>this.deviceId));this.updateStreamAttributes();this.stateMap.cursorManager.onChanged.on((()=>this.handleCursorChanged()))}async componentDidLoad(){var t,i,s;this.interactionApi=this.createInteractionApi();this.isVisible=(i=(t=this.visibilityObserver)===null||t===void 0?void 0:t.isVisible(this.hostElement))!==null&&i!==void 0?i:true;if(this.canvasContainerElement!=null){(s=this.resizeObserver)===null||s===void 0?void 0:s.observe(this.canvasContainerElement)}this.loadOrResumeStream().catch((t=>{console.error("Error loading scene",t)}));await this.initializeDefaultInteractionHandlers();this.injectViewerApi()}disconnectedCallback(){var t,i,s;(t=this.visibilityObserver)===null||t===void 0?void 0:t.disconnect();(i=this.annotations)===null||i===void 0?void 0:i.disconnect();(s=this.stream)===null||s===void 0?void 0:s.pause()}render(){var t;return e(o,{key:"cf89e8922ecbc6a4f024197ec20ff2d1a987953e"},e("div",{key:"779eab813e3515178e51f729a952bd5b02978507",ref:t=>this.viewerContainerElement=t,class:"viewer-container",style:{cursor:Rt((t=this.cursor)!==null&&t!==void 0?t:"")},onContextMenu:t=>t.preventDefault()},e("div",{key:"78f19335302d21fcb339e420779695ccd4045407",ref:t=>this.canvasContainerElement=t,class:E("canvas-container",{"enable-pointer-events ":window.PointerEvent!=null})},e("canvas",{key:"6de64c9e82d6e1a9843bb3f263a27ccdd5614314",ref:t=>{this.canvasElement=t;this.stateMap.interactionTarget=t},class:"canvas"}),this.errorMessage!=null?e("div",{class:"error-message"},this.errorMessage):null),e("slot",{key:"35e36b86ae1bba5b85695354506bb9dcc3375b3f"})))}async dispatchFrameDrawn(t){this.frame=t;this.internalFrameDrawnDispatcher.emit(t);this.frameDrawn.emit(t)}async registerInteractionHandler(t){this.interactionHandlers.push(t);this.initializeInteractionHandler(t);return{dispose:()=>{const i=this.interactionHandlers.indexOf(t);if(i!==-1){this.interactionHandlers[i].dispose();this.interactionHandlers.splice(i,1)}}}}async registerBasicInteractionHandler(t){this.interactionHandlers.push(t);this.initializeBasicInteractionHandler(t);return{dispose:()=>{const i=this.interactionHandlers.indexOf(t);if(i!==-1){this.interactionHandlers[i].dispose();this.interactionHandlers.splice(i,1)}}}}async registerTapKeyInteraction(t){this.tapKeyInteractions=[...this.tapKeyInteractions,t]}async getInteractionTarget_DEPRECATED(){if(this.stateMap.interactionTarget!=null){return this.stateMap.interactionTarget}else throw new Error("Interaction target is undefined.")}async addCursor(t,i){return this.stateMap.cursorManager.add(t,i)}async getInteractionHandlers(){return this.interactionHandlers}async getKeyInteractions(){return this.tapKeyInteractions}async getBaseInteractionHandler(){return this.baseInteractionHandler}async getJwt(){return this.token}handleSrcChanged(t){if(t!=null){this.load(t,{cameraType:this.cameraType})}else{this.unload()}}handleCameraControlsChanged(){this.initializeDefaultCameraInteractionHandlers()}handleKeyboardControlsChanged(){this.initializeDefaultKeyboardInteractionHandlers()}handleRotateAboutTapPointChanged(){var t,i;this.updateStreamAttributes();if(this.rotateAroundTapPoint){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setPrimaryInteractionType("rotate-point")}else{(i=this.baseInteractionHandler)===null||i===void 0?void 0:i.setPrimaryInteractionType("rotate")}}handleCameraTypeChanged(t,i){if(t!==i){this.updateCameraType()}}handleStreamAttributesChanged(){this.handleUpdateStreamAttributesWithTimer()}handleEnableTemporalRefinementChanged(){this.updateEnableTemporalRefinement()}handleConfigChanged(){this.updateResolvedConfig()}handleConfigEnvChanged(){this.updateResolvedConfig()}async load(t,i){var s,n;const e=this.experimentalSkipVisibilityCheck||this.isVisible;if(!e){console.debug("Detected the viewer is hidden. Delaying load until visible.");return}if(this.stream!=null&&this.dimensions!=null){const{EXPERIMENTAL_annotationPollingIntervalInMs:e}=this.getResolvedConfig();this.calculateComponentDimensions();this.stream.update({streamAttributes:this.getStreamAttributes(),config:Et(this.configEnv,this.config),dimensions:this.dimensions,frameBgColor:this.getBackgroundColor()});const o=await((s=this.stream)===null||s===void 0?void 0:s.load(t,this.clientId,this.getDeviceId(),this.getResolvedConfig(),i===null||i===void 0?void 0:i.cameraType));if(o.type==="connected"){this.sceneReady.emit();if(e!==undefined){(n=this.annotations)===null||n===void 0?void 0:n.connect(e)}}}else{throw new H("Cannot load scene. Viewer has not been initialized.")}}async unload(){var t;if(this.stream!=null){this.frameRenderVersion+=1;(t=this.annotations)===null||t===void 0?void 0:t.disconnect();this.stream.disconnect();this.frame=undefined;this.errorMessage=undefined}if(this.canvasElement!=null){const t=this.canvasElement.getContext("2d");if(t!=null){t.clearRect(0,0,this.canvasElement.width,this.canvasElement.height)}}}async reload(){if(this.src!=null){await this.unload();await this.load(this.src,{cameraType:this.cameraType})}}async scene(){return this.createScene()}async isSceneReady(){return this.stateMap.streamState.type==="connected"}async handleTapEvent(t){this.tapKeyInteractions.filter((i=>i.predicate(t.detail))).forEach((i=>i.fn(t.detail)))}emitConnectionChange(t){if(t.status==="connected"){if(t.jwt.length===0){throw new O("JWT is empty")}}if(!this.hostElement.isConnected){return}this.connectionChange.emit(t)}handleElementResize(t){const i=t.length>0&&this.dimensions!=null&&!f.isEqual(t[0].contentRect,this.viewport);if(i){if(this.resizeTimer!=null){clearTimeout(this.resizeTimer);this.resizeTimer=undefined}if(!this.isResizing){this.resizeTimer=setTimeout((()=>{this.isResizing=true;this.isResizeUpdate=true;this.recalculateComponentDimensions()}),this.resizeDebounce)}}}handleVisibilityChange(t){var i;this.isVisible=t;if(this.isVisible){(i=this.visibilityObserver)===null||i===void 0?void 0:i.disconnect();this.loadOrResumeStream()}}async loadOrResumeStream(){var t,i,s;const n=(i=(t=this.stream)===null||t===void 0?void 0:t.isPaused())!==null&&i!==void 0?i:false;if(this.src!=null&&!n){await this.load(this.src,{cameraType:this.cameraType})}else if(n){(s=this.stream)===null||s===void 0?void 0:s.resume()}}registerSlotChangeListeners(){this.mutationObserver=new MutationObserver((t=>this.injectViewerApi()));this.mutationObserver.observe(this.hostElement,{childList:true,subtree:true});this.styleObserver=new MutationObserver((t=>this.syncViewerStyles()));this.styleObserver.observe(this.hostElement,{attributes:true,attributeFilter:["style"]})}injectViewerApi(){function t(t){return Array.from(t.querySelectorAll("*"))}const i=t(this.hostElement);i.filter((t=>t.nodeName.startsWith("VERTEX-"))).reduce(((i,s)=>[...i,s,...t(s)]),[]).forEach((t=>{t.viewer=this.hostElement}))}syncViewerStyles(){var t;const i=this.getBackgroundColor();(t=this.stream)===null||t===void 0?void 0:t.update({frameBgColor:i,streamAttributes:this.getStreamAttributes()})}calculateComponentDimensions(){var t;const i=2073600;const s=this.getBounds();if((s===null||s===void 0?void 0:s.width)!=null&&(s===null||s===void 0?void 0:s.height)!=null){const n=f.create(s.width,s.height);const e=f.scaleFit(i,n);this.hostDimensions=n;this.dimensions=e!=null?f.create(e.width,e.height):undefined;this.viewport=Bt.fromDimensions((t=this.getCanvasDimensions())!==null&&t!==void 0?t:f.create(0,0))}}recalculateComponentDimensions(){var t;if(this.isResizing){this.calculateComponentDimensions();this.isResizing=false;if(((t=this.stream)===null||t===void 0?void 0:t.getState().type)==="connected"){this.updateDimensions(this.dimensions)}}}reportPerformance(t){if(this.stateMap.streamState.type==="connected"){const i={timings:t.map((t=>({receiveToPaintDuration:p(t.duration)})))};this.getStream().recordPerformance(i,false)}}addStreamListeners(){this.stateMap.streamListeners=this.getStream().stateChanged.on((t=>{this.handleStreamStateChanged(this.stateMap.streamState,t)}))}handleStreamStateChanged(t,i){this.stateMap.streamState=i;if(i.type==="connecting"){this.handleConnecting(t,i)}else if(i.type==="connected"){this.handleConnected(t,i)}else if(i.type==="connection-failed"){this.handleConnectionFailed(t,i)}else if(i.type==="disconnected"){this.handleDisconnected(t,i)}}handleConnecting(t,i){if(t.type!=="connecting"){this.token=undefined;this.errorMessage=undefined;this.emitConnectionChange({status:"connecting"})}}handleConnected(t,i){var s;this.token=i.token.token;if(t.type!=="connected"){this.errorMessage=undefined;this.canvasRenderer=$i(xi,Vi(),this.getResolvedConfig().flags.logFrameRate,(t=>this.reportPerformance(t)));this.emitConnectionChange({status:"connected",jwt:i.token.token});this.deviceIdChange.emit(i.deviceId)}if(((s=this.frame)===null||s===void 0?void 0:s.getId())!==i.frame.getId()){this.updateFrame(i.frame)}this.updateDimensions(this.dimensions)}handleConnectionFailed(t,i){if(t.type!=="connection-failed"){this.token=undefined;this.errorMessage=i.message;this.emitConnectionChange({status:"connection-failed",errorMessage:i.message})}}handleDisconnected(t,i){if(t.type!=="disconnected"){this.token=undefined;this.errorMessage=undefined;this.emitConnectionChange({status:"disconnected"})}}updateDimensions(t){var i;(i=this.stream)===null||i===void 0?void 0:i.update({dimensions:t});this.dimensionschange.emit(t)}async updateFrame(t){var i;const s=this.getCanvasDimensions();const n=this.frameRenderVersion;if(this.canvasElement!=null&&s!=null&&((i=this.frame)===null||i===void 0?void 0:i.getId())!==t.getId()){const i=this.canvasElement.getContext("2d");if(i!=null){const e=this.frame;this.frame=gt(t,e);this.updateInteractionApi(e);const o={canvas:i,canvasDimensions:s,dimensions:this.dimensions,frame:this.frame,viewport:this.viewport,beforeDraw:()=>{this.updateCanvasDimensions(s);this.isResizeUpdate=false},predicate:()=>{if(this.isResizeUpdate){return this.dimensions==null||f.isEqual(this.dimensions,o.frame.image.imageAttr.frameDimensions)}return true}};this.frameReceived.emit(this.frame);if(this.frame.scene.hasChanged){this.sceneChanged.emit()}const a=await this.canvasRenderer(o);if(a!=null&&n===this.frameRenderVersion){this.updateViewerBackground();this.dispatchFrameDrawn(a)}}}}updateViewerBackground(){const t=this.getBackgroundColor();Ht((()=>{var i,s;(i=this.viewerContainerElement)===null||i===void 0?void 0:i.style.setProperty("background",t!=null?P.toHexString(t):"#ffffff");(s=this.canvasContainerElement)===null||s===void 0?void 0:s.style.setProperty("background",t!=null?P.toHexString(t):"#ffffff")}))}async initializeDefaultInteractionHandlers(){var t;await this.initializeDefaultCameraInteractionHandlers();await this.initializeDefaultTapInteractionHandler();this.initializeDefaultKeyboardInteractionHandlers();if(this.rotateAroundTapPoint){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setPrimaryInteractionType("rotate-point")}}clearDefaultCameraInteractionHandlers(){this.defaultInteractionHandlerDisposables.forEach((t=>t.dispose()));this.defaultInteractionHandlerDisposables=[]}clearDefaultKeyboardInteractions(){this.defaultTapKeyInteractions.forEach((t=>{const i=this.tapKeyInteractions.indexOf(t);if(i!==-1){this.tapKeyInteractions.splice(i,1)}}));this.tapKeyInteractions=[]}async initializeDefaultCameraInteractionHandlers(){var t,i;this.clearDefaultCameraInteractionHandlers();if(this.cameraControls){if(window.PointerEvent!=null){this.baseInteractionHandler=(t=this.baseInteractionHandler)!==null&&t!==void 0?t:new Ti((()=>this.getResolvedConfig()));const i=await this.registerInteractionHandler(this.baseInteractionHandler);const s=await this.registerInteractionHandler(new Pi);this.defaultInteractionHandlerDisposables=[i,s]}else{this.baseInteractionHandler=(i=this.baseInteractionHandler)!==null&&i!==void 0?i:new bi((()=>this.getResolvedConfig()));const t=await this.registerInteractionHandler(this.baseInteractionHandler);const s=await this.registerInteractionHandler(new ki);this.defaultInteractionHandlerDisposables=[t,s]}}}initializeDefaultKeyboardInteractionHandlers(){var t;this.clearDefaultKeyboardInteractions();if(this.keyboardControls&&this.stream!=null){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setDefaultKeyboardControls(this.keyboardControls);const i=new hi(this.stream,(()=>this.getResolvedConfig()),(()=>this.getImageScale()));const s=new fi(this.stream,(()=>this.getResolvedConfig()),(()=>this.getImageScale()),(()=>this.createScene()));this.registerTapKeyInteraction(i);this.registerTapKeyInteraction(s);this.defaultTapKeyInteractions=[i,s]}}async initializeDefaultTapInteractionHandler(){if(this.tapHandlerDisposable==null){if(window.PointerEvent!=null){const t=new Ai("pointerdown","pointerup","pointermove",(()=>this.getResolvedConfig()));this.tapHandlerDisposable=await this.registerInteractionHandler(t)}else{const t=new Ai("mousedown","mouseup","mousemove",(()=>this.getResolvedConfig()));this.tapHandlerDisposable=await this.registerInteractionHandler(t)}}}initializeInteractionHandler(t){if(this.stateMap.interactionTarget==null){throw new j("Cannot initialize interaction handler. Interaction target is undefined.")}if(this.interactionApi==null){throw new j("Cannot initialize interaction handler. Interaction APi is undefined.")}t.initialize(this.stateMap.interactionTarget,this.interactionApi)}initializeBasicInteractionHandler(t){if(this.stateMap.interactionTarget==null){throw new j("Cannot initialize interaction handler. Interaction target is undefined.")}t.initialize(this.stateMap.interactionTarget)}createInteractionApi(){if(this.stream==null){throw new $("Cannot create interaction API. Component has not been initialized.")}return this.frame==null||this.frame.scene.camera.isPerspective()?new ui(this.stream,this.stateMap.cursorManager,(()=>this.getResolvedConfig().interactions),(()=>this.createScene()),(()=>this.frame),(()=>this.viewport),this.tap,this.doubletap,this.longpress,this.interactionStarted,this.interactionFinished):new li(this.stream,this.stateMap.cursorManager,(()=>this.getResolvedConfig().interactions),(()=>this.createScene()),(()=>this.frame),(()=>this.viewport),this.tap,this.doubletap,this.longpress,this.interactionStarted,this.interactionFinished)}handleCursorChanged(){window.requestAnimationFrame((()=>{this.cursor=this.stateMap.cursorManager.getActiveCursor()}))}async createScene(){const t=await this.waitForConnectedState();const i=yt();const{frame:s,sceneId:n,sceneViewId:e,worldOrientation:o}=t;return new Dt(this.getStream(),s,ft(o),i,(()=>this.getImageScale()),this.viewport,n,e)}getBackgroundColor(){if(this.canvasContainerElement!=null){const t=ks(this.hostElement,"--image-background");const i=ks(this.hostElement,"--viewer-background");const s=t!==null&&t!==void 0?t:i;return s!=null?P.fromCss(s):P.create(255,255,255)}}getBounds(){return As(this.hostElement)}getCanvasDimensions(){return this.getResolvedConfig().flags.letterboxFrames?this.dimensions:this.hostDimensions}getImageScale(){const t=this.getCanvasDimensions();if(this.dimensions!=null&&t!=null){return a.create(this.dimensions.width/t.width,this.dimensions.height/t.height)}}getStreamAttributes(){return{depthBuffers:this.getDepthBufferStreamAttributesValue(),experimentalRenderingOptions:this.experimentalRenderingOptions,featureHighlighting:this.featureHighlighting,featureLines:this.featureLines,featureMaps:this.featureMaps,frames:{frameBackgroundColor:this.getBackgroundColor()},noDefaultLights:this.noDefaultLights,phantom:this.phantom,sceneComparison:this.sceneComparison,selectionHighlighting:this.selectionHighlighting,crossSectioning:this.crossSectioning}}updateCanvasDimensions(t){if(this.canvasElement!=null){this.canvasElement.width=t.width;this.canvasElement.height=t.height}}updateStreamAttributes(){var t;(t=this.stream)===null||t===void 0?void 0:t.update({streamAttributes:this.getStreamAttributes()})}updateEnableTemporalRefinement(){var t;(t=this.stream)===null||t===void 0?void 0:t.update({enableTemporalRefinement:this.enableTemporalRefinement})}updateInteractionApi(t){if(this.frame!=null){const i=(t==null||t.scene.camera.isPerspective())&&this.frame.scene.camera.isOrthographic();const s=(t==null||t.scene.camera.isOrthographic())&&this.frame.scene.camera.isPerspective();if(i||s){this.interactionApi=this.createInteractionApi();this.cameraType=this.frame.scene.camera.isPerspective()?"perspective":"orthographic";this.cameraTypeChanged.emit(this.cameraType);this.interactionHandlers.forEach((t=>this.initializeInteractionHandler(t)))}}}updateCameraType(){var t,i;if(this.frame!=null){if(this.cameraType==="orthographic"&&this.frame.scene.camera.isPerspective()){(t=this.stream)===null||t===void 0?void 0:t.replaceCamera({camera:nt(Ct(this.frame.scene.camera,this.frame.scene.boundingBox))})}else if(this.cameraType==="perspective"&&this.frame.scene.camera.isOrthographic()){(i=this.stream)===null||i===void 0?void 0:i.replaceCamera({camera:nt(bt(this.frame.scene.camera))})}}}handleAnnotationSetsChange(t){if(t>0&&this.getDepthBufferStreamAttributesValue()==null){this.stateMap.depthBuffersOverrideForAnnotations=true;this.updateStreamAttributes()}else if(t===0&&this.stateMap.depthBuffersOverrideForAnnotations){this.stateMap.depthBuffersOverrideForAnnotations=false;this.updateStreamAttributes()}}getDepthBufferStreamAttributesValue(){var t;const i=(t=this.depthBuffers)!==null&&t!==void 0?t:this.rotateAroundTapPoint||this.stateMap.depthBuffersOverrideForAnnotations?"final":undefined;return i}updateResolvedConfig(){this.resolvedConfig=Et(this.configEnv,this.config)}getResolvedConfig(){return Ms("Resolved config is undefined",(()=>this.resolvedConfig))}getStream(){return Ms("Stream is undefined",(()=>this.stream))}getDeviceId(){if(this.deviceId==null){try{this.deviceId=ps(us.DEVICE_ID,(t=>t["device-id"]))}catch(t){console.warn("Cannot read device ID. Local storage is not supported.")}if(this.deviceId==null){this.deviceId=D.create();try{ms(us.DEVICE_ID,{["device-id"]:this.deviceId})}catch(t){console.warn("Cannot write device ID. Local storage is not supported.")}}}return this.deviceId}async waitForConnectedState(){if(this.stateMap.streamState.type!=="connected"){console.debug("Stream was not in a connected state. Waiting for successful connection.");return new Promise(((t,i)=>{const s=this.getStream().onStateChanged((i=>{if(i.type==="connected"){t(i)}}));setTimeout((()=>{s.dispose();i(new Error("Timed out waiting for connected state."))}),Ts)}))}return this.stateMap.streamState}get hostElement(){return this}static get watchers(){return{src:[{handleSrcChanged:0}],cameraControls:[{handleCameraControlsChanged:0}],keyboardControls:[{handleKeyboardControlsChanged:0}],rotateAroundTapPoint:[{handleRotateAboutTapPointChanged:0}],cameraType:[{handleCameraTypeChanged:0}],crossSectioning:[{handleStreamAttributesChanged:0}],depthBuffers:[{handleStreamAttributesChanged:0}],experimentalRenderingOptions:[{handleStreamAttributesChanged:0}],featureHighlighting:[{handleStreamAttributesChanged:0}],featureLines:[{handleStreamAttributesChanged:0}],featureMaps:[{handleStreamAttributesChanged:0}],noDefaultLights:[{handleStreamAttributesChanged:0}],phantom:[{handleStreamAttributesChanged:0}],sceneComparison:[{handleStreamAttributesChanged:0}],selectionHighlighting:[{handleStreamAttributesChanged:0}],enableTemporalRefinement:[{handleEnableTemporalRefinementChanged:0}],config:[{handleConfigChanged:0}],configEnv:[{handleConfigEnvChanged:0}]}}static get style(){return Ds()}},[257,"vertex-viewer",{src:[1],clientId:[1,"client-id"],deviceId:[1025,"device-id"],config:[1],configEnv:[1,"config-env"],resolvedConfig:[1040],cameraControls:[4,"camera-controls"],cameraType:[1537,"camera-type"],keyboardControls:[4,"keyboard-controls"],rotateAroundTapPoint:[4,"rotate-around-tap-point"],token:[1025],depthBuffers:[1,"depth-buffers"],phantom:[16],noDefaultLights:[4,"no-default-lights"],enableTemporalRefinement:[4,"enable-temporal-refinement"],experimentalRenderingOptions:[1,"experimental-rendering-options"],featureLines:[16],selectionHighlighting:[16],featureHighlighting:[16],sceneComparison:[16],crossSectioning:[16],featureMaps:[1,"feature-maps"],resizeDebounce:[2,"resize-debounce"],frame:[1040],stream:[1040],stencilBuffer:[1040],viewport:[1040],annotations:[1040],modelViews:[1040],pmi:[1040],sceneItems:[1040],canvases:[1040],experimentalSkipVisibilityCheck:[4,"experimental-skip-visibility-check"],dimensions:[32],hostDimensions:[32],errorMessage:[32],cursor:[32],stateMap:[32],dispatchFrameDrawn:[64],registerInteractionHandler:[64],registerBasicInteractionHandler:[64],registerTapKeyInteraction:[64],getInteractionTarget_DEPRECATED:[64],addCursor:[64],getInteractionHandlers:[64],getKeyInteractions:[64],getBaseInteractionHandler:[64],getJwt:[64],load:[64],unload:[64],reload:[64],scene:[64],isSceneReady:[64]},[[0,"tap","handleTapEvent"]],{src:[{handleSrcChanged:0}],cameraControls:[{handleCameraControlsChanged:0}],keyboardControls:[{handleKeyboardControlsChanged:0}],rotateAroundTapPoint:[{handleRotateAboutTapPointChanged:0}],cameraType:[{handleCameraTypeChanged:0}],crossSectioning:[{handleStreamAttributesChanged:0}],depthBuffers:[{handleStreamAttributesChanged:0}],experimentalRenderingOptions:[{handleStreamAttributesChanged:0}],featureHighlighting:[{handleStreamAttributesChanged:0}],featureLines:[{handleStreamAttributesChanged:0}],featureMaps:[{handleStreamAttributesChanged:0}],noDefaultLights:[{handleStreamAttributesChanged:0}],phantom:[{handleStreamAttributesChanged:0}],sceneComparison:[{handleStreamAttributesChanged:0}],selectionHighlighting:[{handleStreamAttributesChanged:0}],enableTemporalRefinement:[{handleEnableTemporalRefinementChanged:0}],config:[{handleConfigChanged:0}],configEnv:[{handleConfigEnvChanged:0}]}]);function Ms(t,i){const s=i();if(s!=null){return s}else throw new Error(t)}function xs(){if(typeof customElements==="undefined"){return}const i=["vertex-viewer"];i.forEach((i=>{switch(i){case"vertex-viewer":if(!customElements.get(t(i))){customElements.define(t(i),Es)}break}}))}xs();const Rs=Es;const Bs=xs;export{Rs as VertexViewer,Bs as defineCustomElement};
5
5
  //# sourceMappingURL=vertex-viewer.js.map
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { o as objects } from './bundle-DT9c7nCv.js';
5
5
  import { d as defaultEventConfig } from './events-CPk-nchx.js';
6
- import './streamAttributes-6asiWDkT.js';
6
+ import './streamAttributes-Cp8PEH9A.js';
7
7
  import './entities-BAhfr1Nx.js';
8
8
 
9
9
  const DEFAULT_ANIMATION_DURATION = 500;
@@ -119,6 +119,6 @@ function validateUrlScheme(networkConfig, field, expectedScheme) {
119
119
  }
120
120
 
121
121
  export { parseAndValidateConfig as p };
122
- //# sourceMappingURL=config-SMudJna8.js.map
122
+ //# sourceMappingURL=config-lglER3mU.js.map
123
123
 
124
- //# sourceMappingURL=config-SMudJna8.js.map
124
+ //# sourceMappingURL=config-lglER3mU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-SMudJna8.js","sources":["src/lib/types/animation.ts","src/lib/types/flags.ts","src/lib/types/interactions.ts","src/lib/config.ts"],"sourcesContent":["const DEFAULT_ANIMATION_DURATION = 500;\n\nexport interface Animation {\n milliseconds: number;\n}\n\nexport function create(data: Partial<Animation> = {}): Animation {\n return {\n milliseconds: data.milliseconds || DEFAULT_ANIMATION_DURATION,\n };\n}\n\nexport interface AnimationConfig {\n durationMs: number;\n}\n\nexport const defaultAnimationConfig: AnimationConfig = {\n durationMs: DEFAULT_ANIMATION_DURATION,\n};\n","import { Objects } from '@vertexvis/utils';\n\ntype Flag =\n /**\n * Enables or disables a throttling of image delivery based on detected\n * network conditions.\n */\n | 'throttleFrameDelivery'\n\n /**\n * Enables or disables automatic quality adjustments of rendered frames to\n * improve the performance of delivering frames to the client.\n */\n | 'adaptiveRendering'\n\n /**\n * Enables or disables logging of WS message payloads.\n */\n | 'logWsMessages'\n\n /**\n * Toggles the logging of frame rates.\n */\n | 'logFrameRate'\n\n /**\n * Enables or disables the letterboxing of frames when the host dimensions\n * are larger than the supported maximum image size (1080p). By default\n * this option is disabled, and images will be scaled up to match the host.\n */\n | 'letterboxFrames'\n\n /**\n * Enables or disables the use of the `grpc.WebsocketTransport` for streaming\n * RPCs. By default this transport will be used, and streaming messages will\n * be sent over WebSocket.\n */\n | 'grpcUseStreamingWebSocketTransport';\n\n/**\n * A set of experimental features that can be enabled through the viewer's\n * config.\n */\nexport type Flags = { [K in Flag]: boolean };\n\nexport const defaultFlags: Flags = {\n throttleFrameDelivery: true,\n adaptiveRendering: true,\n logWsMessages: false,\n logFrameRate: false,\n letterboxFrames: false,\n grpcUseStreamingWebSocketTransport: true,\n};\n\nexport function createFlags(\n features: Partial<Flags>,\n fallbacks: Partial<Flags> = defaultFlags,\n): Flags {\n return Objects.defaults(features, fallbacks, defaultFlags);\n}\n","export interface InteractionConfig {\n /**\n * The amount of movement required with a fine (mouse, trackpad, etc) pointer\n * input before an interaction is considered a movement that will update the\n * camera. This threshold is always scaled up based on the device's pixel ratio.\n */\n finePointerThreshold: number;\n\n /**\n * The amount of movement required with a coarse (touch, stylus, etc) pointer\n * input before an interaction is considered a movement that will update the\n * camera. This threshold is always scaled up based on the device's pixel ratio.\n */\n coarsePointerThreshold: number;\n\n /**\n * The amount of time before a movement is considered an interaction and will\n * update the camera.\n */\n interactionDelay: number;\n\n /**\n * Whether the `zoomCameraToPoint` interaction through the `InteractionApiPerspective`\n * will enforce a minimum distance when moving the camera. When set, the camera will be\n * able to move through geometry under the cursor, rather than being restricted by the\n * point under the cursor. Defaults to `true`.\n */\n useMinimumPerspectiveZoomDistance: boolean;\n\n /**\n * The amount of time before a wheel interaction is ended.\n *\n * This delay is used to support successive sets of mouse events, and not cause\n * abrupt and unexpected ending of mouse interactions during natural pauses in mouse\n * wheel usage.\n */\n mouseWheelInteractionEndDebounce: number;\n\n /**\n * Reverses which direction the mouse wheel considers positive or negative\n * for zoom interactions.\n */\n reverseMouseWheelDirection: boolean;\n}\n\nexport const defaultInteractionConfig: InteractionConfig = {\n finePointerThreshold: 1,\n coarsePointerThreshold: 3,\n interactionDelay: 75,\n useMinimumPerspectiveZoomDistance: true,\n mouseWheelInteractionEndDebounce: 400,\n reverseMouseWheelDirection: false,\n};\n","import { FrameDeliverySettings } from '@vertexvis/stream-api';\nimport {\n AdaptiveRenderingSettings,\n QualityOfServiceSettings,\n} from '@vertexvis/stream-api';\nimport { DeepPartial, Objects } from '@vertexvis/utils';\n\nimport { Environment } from './environment';\nimport { Animation, Events, Flags, Interactions } from './types';\n\ninterface NetworkConfig {\n apiHost: string;\n renderingHost: string;\n sceneTreeHost: string;\n sceneViewHost: string;\n}\n\nexport interface Config {\n network: NetworkConfig;\n flags: Flags.Flags;\n events: Events.EventConfig;\n animation: Animation.AnimationConfig;\n interactions: Interactions.InteractionConfig;\n EXPERIMENTAL_frameDelivery: Omit<\n FrameDeliverySettings,\n 'rateLimitingEnabled'\n >;\n EXPERIMENTAL_adaptiveRendering: Omit<AdaptiveRenderingSettings, 'enabled'>;\n EXPERIMENTAL_qualityOfService: QualityOfServiceSettings;\n EXPERIMENTAL_annotationPollingIntervalInMs: number | undefined;\n}\n\nexport type PartialConfig = DeepPartial<Config>;\n\nexport type ConfigProvider = () => Config;\n\nexport type InteractionConfigProvider = () => Interactions.InteractionConfig;\n\nconst config: Config = {\n network: {\n apiHost: 'https://platform.platprod.vertexvis.io',\n renderingHost: 'wss://stream.platprod.vertexvis.io',\n sceneTreeHost: 'https://scene-trees.platprod.vertexvis.io',\n sceneViewHost: 'https://scenes.platprod.vertexvis.io',\n },\n flags: Flags.defaultFlags,\n events: Events.defaultEventConfig,\n animation: Animation.defaultAnimationConfig,\n interactions: Interactions.defaultInteractionConfig,\n EXPERIMENTAL_frameDelivery: {},\n EXPERIMENTAL_adaptiveRendering: {},\n EXPERIMENTAL_qualityOfService: {},\n EXPERIMENTAL_annotationPollingIntervalInMs: undefined,\n};\n\nconst platdevConfig: Config = {\n ...config,\n network: {\n apiHost: 'https://platform.platdev.vertexvis.io',\n renderingHost: 'wss://stream.platdev.vertexvis.io',\n sceneTreeHost: 'https://scene-trees.platdev.vertexvis.io',\n sceneViewHost: 'https://scenes.platdev.vertexvis.io',\n },\n};\n\nconst platstagingConfig: Config = {\n ...config,\n network: {\n apiHost: 'https://platform.platstaging.vertexvis.io',\n renderingHost: 'wss://stream.platstaging.vertexvis.io',\n sceneTreeHost: 'https://scene-trees.platstaging.vertexvis.io',\n sceneViewHost: 'https://scenes.platstaging.vertexvis.io',\n },\n};\n\nfunction getEnvironmentConfig(environment: Environment): Config {\n switch (environment) {\n case 'platdev':\n return platdevConfig;\n case 'platstaging':\n return platstagingConfig;\n default:\n return config;\n }\n}\n\nexport function parseAndValidateConfig(\n environment: Environment = 'platprod',\n config?: string | PartialConfig,\n): Config {\n const parsed = parseConfig(environment, config);\n\n return validateConfig(sanitizeConfig(parsed));\n}\n\nexport function parseConfig(\n environment: Environment = 'platprod',\n config?: string | PartialConfig,\n): Config {\n if (typeof config === 'string') {\n config = JSON.parse(config) as PartialConfig;\n }\n\n const envConfig = getEnvironmentConfig(environment);\n\n if (config == null) {\n return envConfig;\n } else {\n return Objects.defaults({ ...config }, envConfig);\n }\n}\n\nexport function sanitizeConfig(config: Config): Config {\n const sanitizedApiHost = config.network.apiHost.trim();\n const sanitizedRenderingHost = config.network.renderingHost.trim();\n const sanitizedSceneTreeHost = config.network.sceneTreeHost.trim();\n const sanitizedSceneViewHost = config.network.sceneViewHost.trim();\n\n return {\n ...config,\n network: {\n ...config.network,\n apiHost: sanitizedApiHost,\n renderingHost: sanitizedRenderingHost,\n sceneTreeHost: sanitizedSceneTreeHost,\n sceneViewHost: sanitizedSceneViewHost,\n },\n };\n}\n\nexport function validateConfig(config: Config): Config {\n validateUrlScheme(config.network, 'apiHost', 'https://');\n validateUrlScheme(config.network, 'renderingHost', 'wss://');\n validateUrlScheme(config.network, 'sceneTreeHost', 'https://');\n validateUrlScheme(config.network, 'sceneViewHost', 'https://');\n\n return config;\n}\n\nfunction validateUrlScheme(\n networkConfig: NetworkConfig,\n field: keyof NetworkConfig,\n expectedScheme: string,\n): void {\n if (!networkConfig[field].startsWith(expectedScheme)) {\n throw new Error(\n `Invalid ${field} \"${networkConfig[field]}\" specified. The URL must start with the ${expectedScheme} scheme.`,\n );\n }\n}\n"],"names":["Flags.defaultFlags","Events.defaultEventConfig","Animation.defaultAnimationConfig","Interactions.defaultInteractionConfig","Objects"],"mappings":";;;;;;;;AAAA,MAAM,0BAA0B,GAAG,GAAG;AAgB/B,MAAM,sBAAsB,GAAoB;AACrD,IAAA,UAAU,EAAE,0BAA0B;CACvC;;AC2BM,MAAM,YAAY,GAAU;AACjC,IAAA,qBAAqB,EAAE,IAAI;AAC3B,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,kCAAkC,EAAE,IAAI;CACzC;;ACPM,MAAM,wBAAwB,GAAsB;AACzD,IAAA,oBAAoB,EAAE,CAAC;AACvB,IAAA,sBAAsB,EAAE,CAAC;AACzB,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,iCAAiC,EAAE,IAAI;AACvC,IAAA,gCAAgC,EAAE,GAAG;AACrC,IAAA,0BAA0B,EAAE,KAAK;CAClC;;ACdD,MAAM,MAAM,GAAW;AACrB,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,wCAAwC;AACjD,QAAA,aAAa,EAAE,oCAAoC;AACnD,QAAA,aAAa,EAAE,2CAA2C;AAC1D,QAAA,aAAa,EAAE,sCAAsC;AACtD,KAAA;IACD,KAAK,EAAEA,YAAkB;IACzB,MAAM,EAAEC,kBAAyB;IACjC,SAAS,EAAEC,sBAAgC;IAC3C,YAAY,EAAEC,wBAAqC;AACnD,IAAA,0BAA0B,EAAE,EAAE;AAC9B,IAAA,8BAA8B,EAAE,EAAE;AAClC,IAAA,6BAA6B,EAAE,EAAE;AACjC,IAAA,0CAA0C,EAAE,SAAS;CACtD;AAED,MAAM,aAAa,GAAW;AAC5B,IAAA,GAAG,MAAM;AACT,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,uCAAuC;AAChD,QAAA,aAAa,EAAE,mCAAmC;AAClD,QAAA,aAAa,EAAE,0CAA0C;AACzD,QAAA,aAAa,EAAE,qCAAqC;AACrD,KAAA;CACF;AAED,MAAM,iBAAiB,GAAW;AAChC,IAAA,GAAG,MAAM;AACT,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,2CAA2C;AACpD,QAAA,aAAa,EAAE,uCAAuC;AACtD,QAAA,aAAa,EAAE,8CAA8C;AAC7D,QAAA,aAAa,EAAE,yCAAyC;AACzD,KAAA;CACF;AAED,SAAS,oBAAoB,CAAC,WAAwB,EAAA;IACpD,QAAQ,WAAW;AACjB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,aAAa;AACtB,QAAA,KAAK,aAAa;AAChB,YAAA,OAAO,iBAAiB;AAC1B,QAAA;AACE,YAAA,OAAO,MAAM;;AAEnB;SAEgB,sBAAsB,CACpC,WAAA,GAA2B,UAAU,EACrC,MAA+B,EAAA;IAE/B,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC;AAE/C,IAAA,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/C;SAEgB,WAAW,CACzB,WAAA,GAA2B,UAAU,EACrC,MAA+B,EAAA;AAE/B,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAkB;;AAG9C,IAAA,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC;AAEnD,IAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAClB,QAAA,OAAO,SAAS;;SACX;QACL,OAAOC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC;;AAErD;AAEM,SAAU,cAAc,CAAC,MAAc,EAAA;IAC3C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;IACtD,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;IAClE,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;IAClE,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;IAElE,OAAO;AACL,QAAA,GAAG,MAAM;AACT,QAAA,OAAO,EAAE;YACP,GAAG,MAAM,CAAC,OAAO;AACjB,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,aAAa,EAAE,sBAAsB;AACrC,YAAA,aAAa,EAAE,sBAAsB;AACrC,YAAA,aAAa,EAAE,sBAAsB;AACtC,SAAA;KACF;AACH;AAEM,SAAU,cAAc,CAAC,MAAc,EAAA;IAC3C,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC;IACxD,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC;IAC5D,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;IAC9D,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;AAE9D,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,iBAAiB,CACxB,aAA4B,EAC5B,KAA0B,EAC1B,cAAsB,EAAA;IAEtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AACpD,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,EAAK,aAAa,CAAC,KAAK,CAAC,CAAA,yCAAA,EAA4C,cAAc,CAAA,QAAA,CAAU,CAC9G;;AAEL;;;;"}
1
+ {"version":3,"file":"config-lglER3mU.js","sources":["src/lib/types/animation.ts","src/lib/types/flags.ts","src/lib/types/interactions.ts","src/lib/config.ts"],"sourcesContent":["const DEFAULT_ANIMATION_DURATION = 500;\n\nexport interface Animation {\n milliseconds: number;\n}\n\nexport function create(data: Partial<Animation> = {}): Animation {\n return {\n milliseconds: data.milliseconds || DEFAULT_ANIMATION_DURATION,\n };\n}\n\nexport interface AnimationConfig {\n durationMs: number;\n}\n\nexport const defaultAnimationConfig: AnimationConfig = {\n durationMs: DEFAULT_ANIMATION_DURATION,\n};\n","import { Objects } from '@vertexvis/utils';\n\ntype Flag =\n /**\n * Enables or disables a throttling of image delivery based on detected\n * network conditions.\n */\n | 'throttleFrameDelivery'\n\n /**\n * Enables or disables automatic quality adjustments of rendered frames to\n * improve the performance of delivering frames to the client.\n */\n | 'adaptiveRendering'\n\n /**\n * Enables or disables logging of WS message payloads.\n */\n | 'logWsMessages'\n\n /**\n * Toggles the logging of frame rates.\n */\n | 'logFrameRate'\n\n /**\n * Enables or disables the letterboxing of frames when the host dimensions\n * are larger than the supported maximum image size (1080p). By default\n * this option is disabled, and images will be scaled up to match the host.\n */\n | 'letterboxFrames'\n\n /**\n * Enables or disables the use of the `grpc.WebsocketTransport` for streaming\n * RPCs. By default this transport will be used, and streaming messages will\n * be sent over WebSocket.\n */\n | 'grpcUseStreamingWebSocketTransport';\n\n/**\n * A set of experimental features that can be enabled through the viewer's\n * config.\n */\nexport type Flags = { [K in Flag]: boolean };\n\nexport const defaultFlags: Flags = {\n throttleFrameDelivery: true,\n adaptiveRendering: true,\n logWsMessages: false,\n logFrameRate: false,\n letterboxFrames: false,\n grpcUseStreamingWebSocketTransport: true,\n};\n\nexport function createFlags(\n features: Partial<Flags>,\n fallbacks: Partial<Flags> = defaultFlags,\n): Flags {\n return Objects.defaults(features, fallbacks, defaultFlags);\n}\n","export interface InteractionConfig {\n /**\n * The amount of movement required with a fine (mouse, trackpad, etc) pointer\n * input before an interaction is considered a movement that will update the\n * camera. This threshold is always scaled up based on the device's pixel ratio.\n */\n finePointerThreshold: number;\n\n /**\n * The amount of movement required with a coarse (touch, stylus, etc) pointer\n * input before an interaction is considered a movement that will update the\n * camera. This threshold is always scaled up based on the device's pixel ratio.\n */\n coarsePointerThreshold: number;\n\n /**\n * The amount of time before a movement is considered an interaction and will\n * update the camera.\n */\n interactionDelay: number;\n\n /**\n * Whether the `zoomCameraToPoint` interaction through the `InteractionApiPerspective`\n * will enforce a minimum distance when moving the camera. When set, the camera will be\n * able to move through geometry under the cursor, rather than being restricted by the\n * point under the cursor. Defaults to `true`.\n */\n useMinimumPerspectiveZoomDistance: boolean;\n\n /**\n * The amount of time before a wheel interaction is ended.\n *\n * This delay is used to support successive sets of mouse events, and not cause\n * abrupt and unexpected ending of mouse interactions during natural pauses in mouse\n * wheel usage.\n */\n mouseWheelInteractionEndDebounce: number;\n\n /**\n * Reverses which direction the mouse wheel considers positive or negative\n * for zoom interactions.\n */\n reverseMouseWheelDirection: boolean;\n}\n\nexport const defaultInteractionConfig: InteractionConfig = {\n finePointerThreshold: 1,\n coarsePointerThreshold: 3,\n interactionDelay: 75,\n useMinimumPerspectiveZoomDistance: true,\n mouseWheelInteractionEndDebounce: 400,\n reverseMouseWheelDirection: false,\n};\n","import { FrameDeliverySettings } from '@vertexvis/stream-api';\nimport {\n AdaptiveRenderingSettings,\n QualityOfServiceSettings,\n} from '@vertexvis/stream-api';\nimport { DeepPartial, Objects } from '@vertexvis/utils';\n\nimport { Environment } from './environment';\nimport { Animation, Events, Flags, Interactions } from './types';\n\ninterface NetworkConfig {\n apiHost: string;\n renderingHost: string;\n sceneTreeHost: string;\n sceneViewHost: string;\n}\n\nexport interface Config {\n network: NetworkConfig;\n flags: Flags.Flags;\n events: Events.EventConfig;\n animation: Animation.AnimationConfig;\n interactions: Interactions.InteractionConfig;\n EXPERIMENTAL_frameDelivery: Omit<\n FrameDeliverySettings,\n 'rateLimitingEnabled'\n >;\n EXPERIMENTAL_adaptiveRendering: Omit<AdaptiveRenderingSettings, 'enabled'>;\n EXPERIMENTAL_qualityOfService: QualityOfServiceSettings;\n EXPERIMENTAL_annotationPollingIntervalInMs: number | undefined;\n}\n\nexport type PartialConfig = DeepPartial<Config>;\n\nexport type ConfigProvider = () => Config;\n\nexport type InteractionConfigProvider = () => Interactions.InteractionConfig;\n\nconst config: Config = {\n network: {\n apiHost: 'https://platform.platprod.vertexvis.io',\n renderingHost: 'wss://stream.platprod.vertexvis.io',\n sceneTreeHost: 'https://scene-trees.platprod.vertexvis.io',\n sceneViewHost: 'https://scenes.platprod.vertexvis.io',\n },\n flags: Flags.defaultFlags,\n events: Events.defaultEventConfig,\n animation: Animation.defaultAnimationConfig,\n interactions: Interactions.defaultInteractionConfig,\n EXPERIMENTAL_frameDelivery: {},\n EXPERIMENTAL_adaptiveRendering: {},\n EXPERIMENTAL_qualityOfService: {},\n EXPERIMENTAL_annotationPollingIntervalInMs: undefined,\n};\n\nconst platdevConfig: Config = {\n ...config,\n network: {\n apiHost: 'https://platform.platdev.vertexvis.io',\n renderingHost: 'wss://stream.platdev.vertexvis.io',\n sceneTreeHost: 'https://scene-trees.platdev.vertexvis.io',\n sceneViewHost: 'https://scenes.platdev.vertexvis.io',\n },\n};\n\nconst platstagingConfig: Config = {\n ...config,\n network: {\n apiHost: 'https://platform.platstaging.vertexvis.io',\n renderingHost: 'wss://stream.platstaging.vertexvis.io',\n sceneTreeHost: 'https://scene-trees.platstaging.vertexvis.io',\n sceneViewHost: 'https://scenes.platstaging.vertexvis.io',\n },\n};\n\nfunction getEnvironmentConfig(environment: Environment): Config {\n switch (environment) {\n case 'platdev':\n return platdevConfig;\n case 'platstaging':\n return platstagingConfig;\n default:\n return config;\n }\n}\n\nexport function parseAndValidateConfig(\n environment: Environment = 'platprod',\n config?: string | PartialConfig,\n): Config {\n const parsed = parseConfig(environment, config);\n\n return validateConfig(sanitizeConfig(parsed));\n}\n\nexport function parseConfig(\n environment: Environment = 'platprod',\n config?: string | PartialConfig,\n): Config {\n if (typeof config === 'string') {\n config = JSON.parse(config) as PartialConfig;\n }\n\n const envConfig = getEnvironmentConfig(environment);\n\n if (config == null) {\n return envConfig;\n } else {\n return Objects.defaults({ ...config }, envConfig);\n }\n}\n\nexport function sanitizeConfig(config: Config): Config {\n const sanitizedApiHost = config.network.apiHost.trim();\n const sanitizedRenderingHost = config.network.renderingHost.trim();\n const sanitizedSceneTreeHost = config.network.sceneTreeHost.trim();\n const sanitizedSceneViewHost = config.network.sceneViewHost.trim();\n\n return {\n ...config,\n network: {\n ...config.network,\n apiHost: sanitizedApiHost,\n renderingHost: sanitizedRenderingHost,\n sceneTreeHost: sanitizedSceneTreeHost,\n sceneViewHost: sanitizedSceneViewHost,\n },\n };\n}\n\nexport function validateConfig(config: Config): Config {\n validateUrlScheme(config.network, 'apiHost', 'https://');\n validateUrlScheme(config.network, 'renderingHost', 'wss://');\n validateUrlScheme(config.network, 'sceneTreeHost', 'https://');\n validateUrlScheme(config.network, 'sceneViewHost', 'https://');\n\n return config;\n}\n\nfunction validateUrlScheme(\n networkConfig: NetworkConfig,\n field: keyof NetworkConfig,\n expectedScheme: string,\n): void {\n if (!networkConfig[field].startsWith(expectedScheme)) {\n throw new Error(\n `Invalid ${field} \"${networkConfig[field]}\" specified. The URL must start with the ${expectedScheme} scheme.`,\n );\n }\n}\n"],"names":["Flags.defaultFlags","Events.defaultEventConfig","Animation.defaultAnimationConfig","Interactions.defaultInteractionConfig","Objects"],"mappings":";;;;;;;;AAAA,MAAM,0BAA0B,GAAG,GAAG;AAgB/B,MAAM,sBAAsB,GAAoB;AACrD,IAAA,UAAU,EAAE,0BAA0B;CACvC;;AC2BM,MAAM,YAAY,GAAU;AACjC,IAAA,qBAAqB,EAAE,IAAI;AAC3B,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,kCAAkC,EAAE,IAAI;CACzC;;ACPM,MAAM,wBAAwB,GAAsB;AACzD,IAAA,oBAAoB,EAAE,CAAC;AACvB,IAAA,sBAAsB,EAAE,CAAC;AACzB,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,iCAAiC,EAAE,IAAI;AACvC,IAAA,gCAAgC,EAAE,GAAG;AACrC,IAAA,0BAA0B,EAAE,KAAK;CAClC;;ACdD,MAAM,MAAM,GAAW;AACrB,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,wCAAwC;AACjD,QAAA,aAAa,EAAE,oCAAoC;AACnD,QAAA,aAAa,EAAE,2CAA2C;AAC1D,QAAA,aAAa,EAAE,sCAAsC;AACtD,KAAA;IACD,KAAK,EAAEA,YAAkB;IACzB,MAAM,EAAEC,kBAAyB;IACjC,SAAS,EAAEC,sBAAgC;IAC3C,YAAY,EAAEC,wBAAqC;AACnD,IAAA,0BAA0B,EAAE,EAAE;AAC9B,IAAA,8BAA8B,EAAE,EAAE;AAClC,IAAA,6BAA6B,EAAE,EAAE;AACjC,IAAA,0CAA0C,EAAE,SAAS;CACtD;AAED,MAAM,aAAa,GAAW;AAC5B,IAAA,GAAG,MAAM;AACT,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,uCAAuC;AAChD,QAAA,aAAa,EAAE,mCAAmC;AAClD,QAAA,aAAa,EAAE,0CAA0C;AACzD,QAAA,aAAa,EAAE,qCAAqC;AACrD,KAAA;CACF;AAED,MAAM,iBAAiB,GAAW;AAChC,IAAA,GAAG,MAAM;AACT,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,2CAA2C;AACpD,QAAA,aAAa,EAAE,uCAAuC;AACtD,QAAA,aAAa,EAAE,8CAA8C;AAC7D,QAAA,aAAa,EAAE,yCAAyC;AACzD,KAAA;CACF;AAED,SAAS,oBAAoB,CAAC,WAAwB,EAAA;IACpD,QAAQ,WAAW;AACjB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,aAAa;AACtB,QAAA,KAAK,aAAa;AAChB,YAAA,OAAO,iBAAiB;AAC1B,QAAA;AACE,YAAA,OAAO,MAAM;;AAEnB;SAEgB,sBAAsB,CACpC,WAAA,GAA2B,UAAU,EACrC,MAA+B,EAAA;IAE/B,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC;AAE/C,IAAA,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/C;SAEgB,WAAW,CACzB,WAAA,GAA2B,UAAU,EACrC,MAA+B,EAAA;AAE/B,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAkB;;AAG9C,IAAA,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC;AAEnD,IAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAClB,QAAA,OAAO,SAAS;;SACX;QACL,OAAOC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC;;AAErD;AAEM,SAAU,cAAc,CAAC,MAAc,EAAA;IAC3C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;IACtD,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;IAClE,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;IAClE,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;IAElE,OAAO;AACL,QAAA,GAAG,MAAM;AACT,QAAA,OAAO,EAAE;YACP,GAAG,MAAM,CAAC,OAAO;AACjB,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,aAAa,EAAE,sBAAsB;AACrC,YAAA,aAAa,EAAE,sBAAsB;AACrC,YAAA,aAAa,EAAE,sBAAsB;AACtC,SAAA;KACF;AACH;AAEM,SAAU,cAAc,CAAC,MAAc,EAAA;IAC3C,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC;IACxD,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC;IAC5D,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;IAC9D,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;AAE9D,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,iBAAiB,CACxB,aAA4B,EAC5B,KAA0B,EAC1B,cAAsB,EAAA;IAEtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AACpD,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,EAAK,aAAa,CAAC,KAAK,CAAC,CAAA,yCAAA,EAA4C,cAAc,CAAA,QAAA,CAAU,CAC9G;;AAEL;;;;"}
@@ -1,12 +1,12 @@
1
1
  /*!
2
2
  * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import { m as model_entity_pbExports, a as mapMeasureResponseOrThrow, g as geometry_pbExports } from './geometry_pb-CMlgBITt.js';
4
+ import { m as model_entity_pbExports, a as mapMeasureResponseOrThrow, g as geometry_pbExports } from './geometry_pb-BiZRfctN.js';
5
5
  import { s as scene_view_api_pbExports, w as wrappers_pbExports } from './wrappers_pb-aFAwKqIf.js';
6
6
  import { r as requestUnary, c as createMetadata } from './grpc-CZAYqbTu.js';
7
7
  import { v as vertexvis } from './bundle-BOQPDi0i.js';
8
8
  import { m as mapper } from './bundle-DT9c7nCv.js';
9
- import { n as fromPbVector3f } from './streamAttributes-6asiWDkT.js';
9
+ import { n as fromPbVector3f } from './streamAttributes-Cp8PEH9A.js';
10
10
 
11
11
  /**
12
12
  * The `MeasurementController` is responsible for performing measurements of
@@ -173,6 +173,6 @@ class MeasurementEntity {
173
173
  }
174
174
 
175
175
  export { MeasurementController as M, MeasurementEntity as a };
176
- //# sourceMappingURL=entities-uAlr5vlE.js.map
176
+ //# sourceMappingURL=entities-zRken6VS.js.map
177
177
 
178
- //# sourceMappingURL=entities-uAlr5vlE.js.map
178
+ //# sourceMappingURL=entities-zRken6VS.js.map