@vincentt-xr/sdk 2.0.0-alpha.7 → 2.0.0-alpha.8

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 (275) hide show
  1. package/GROUNDING.md +1109 -13
  2. package/dist/{DebuggerUI-BjOMr8q_.js → DebuggerUI-C-ldiozL.js} +1 -1
  3. package/dist/{DebuggerUI-B6bP6P9r.cjs → DebuggerUI-CWX5EtQv.cjs} +1 -1
  4. package/dist/FaceMeshRenderer-BEEXZwS6.cjs +158 -0
  5. package/dist/FaceMeshRenderer-UuH5sTXG.js +1322 -0
  6. package/dist/FaceRetouch-C7h7x9kd.js +683 -0
  7. package/dist/FaceRetouch-DqftT26Y.cjs +134 -0
  8. package/dist/GLTFLoader-C5q63sKO.js +1633 -0
  9. package/dist/GLTFLoader-Cb_CRwmG.cjs +1 -0
  10. package/dist/SegmentationOverlay-DQuW3dsc.js +133 -0
  11. package/dist/SegmentationOverlay-aWVod8Kl.cjs +1 -0
  12. package/dist/assets/cache.d.ts +99 -0
  13. package/dist/assets/estimate.d.ts +11 -0
  14. package/dist/assets/index.d.ts +7 -0
  15. package/dist/assets/loaders.d.ts +28 -0
  16. package/dist/assets/react.d.ts +33 -0
  17. package/dist/calibration/calibration.d.ts +70 -0
  18. package/dist/calibration/index.d.ts +6 -0
  19. package/dist/calibration/storage.d.ts +13 -0
  20. package/dist/calibration/types.d.ts +53 -0
  21. package/dist/calibration/useXRCalibration.d.ts +46 -0
  22. package/dist/camera/CameraPermissionGate.d.ts +26 -0
  23. package/dist/camera/devices.d.ts +26 -0
  24. package/dist/camera/index.d.ts +8 -0
  25. package/dist/camera/permission.d.ts +86 -0
  26. package/dist/camera/useCameraPermission.d.ts +35 -0
  27. package/dist/capabilities/detect.d.ts +45 -0
  28. package/dist/capabilities/index.d.ts +5 -0
  29. package/dist/capabilities/types.d.ts +120 -0
  30. package/dist/capabilities/useXRCapabilities.d.ts +18 -0
  31. package/dist/compat/environment.d.ts +5 -0
  32. package/dist/compat/index.d.ts +4 -0
  33. package/dist/compat/run.d.ts +18 -0
  34. package/dist/compat/scenarios.d.ts +10 -0
  35. package/dist/compat/types.d.ts +101 -0
  36. package/dist/components/BodyTracker/index.d.ts +9 -0
  37. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +33 -3
  38. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +12 -0
  39. package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
  40. package/dist/components/FaceMesh/index.d.ts +1 -1
  41. package/dist/components/GestureListener/index.d.ts +11 -0
  42. package/dist/components/HandTracker/index.d.ts +10 -0
  43. package/dist/components/HolisticTracker/index.d.ts +69 -0
  44. package/dist/components/HolisticTracker/settings.d.ts +58 -0
  45. package/dist/components/HolisticTracker/signals.d.ts +49 -0
  46. package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
  47. package/dist/components/IrisEffect/index.d.ts +51 -0
  48. package/dist/components/IrisEffect/settings.d.ts +117 -0
  49. package/dist/components/LipEffect/LipEffect.d.ts +7 -1
  50. package/dist/components/LipEffect/LipEffectMaterial.d.ts +43 -7
  51. package/dist/components/LipEffect/LipEffects.d.ts +9 -0
  52. package/dist/components/LipEffect/defaults.d.ts +27 -4
  53. package/dist/components/LipEffect/index.d.ts +11 -3
  54. package/dist/components/LipEffect/settings.d.ts +271 -0
  55. package/dist/components/LipEffect/types.d.ts +56 -9
  56. package/dist/components/LipEffect/useLipDesignTextures.d.ts +11 -0
  57. package/dist/components/LipEffect/uvGuide.d.ts +59 -0
  58. package/dist/components/PersonCutout/index.d.ts +50 -0
  59. package/dist/components/PersonCutout/personCutout.d.ts +16 -0
  60. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
  61. package/dist/components/ScreenImage/index.d.ts +3 -1
  62. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
  63. package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
  64. package/dist/components/ScreenImage/source.d.ts +6 -0
  65. package/dist/components/ScreenImage/types.d.ts +18 -0
  66. package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
  67. package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
  68. package/dist/components/SegmentationOverlay/index.d.ts +9 -0
  69. package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
  70. package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
  71. package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
  72. package/dist/components/XRProvider/index.d.ts +16 -2
  73. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
  74. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
  75. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
  76. package/dist/components/index.d.ts +3 -0
  77. package/dist/constants/index.d.ts +4 -1
  78. package/dist/contexts-CO0sd4JQ.cjs +1 -0
  79. package/dist/{contexts-ByhzppYl.js → contexts-FzlnnMYD.js} +252 -246
  80. package/dist/coordinates/feed.d.ts +52 -0
  81. package/dist/coordinates/index.d.ts +5 -0
  82. package/dist/coordinates/spaces.d.ts +49 -0
  83. package/dist/coordinates/viewport.d.ts +22 -0
  84. package/dist/coordinates/world.d.ts +15 -0
  85. package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
  86. package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
  87. package/dist/debug-ui/index.d.ts +14 -0
  88. package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
  89. package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
  90. package/dist/debug-ui/media-source.cjs +1 -1
  91. package/dist/debug-ui/media-source.js +1 -1
  92. package/dist/debug-ui/product-hotspots/index.d.ts +24 -0
  93. package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
  94. package/dist/debug-ui/xr-diagnostics/index.d.ts +25 -0
  95. package/dist/debug-ui.cjs +3 -3
  96. package/dist/debug-ui.js +2057 -1687
  97. package/dist/detector-K8aej4MB.js +59 -0
  98. package/dist/detector-ijypGtse.cjs +1 -0
  99. package/dist/entries/core.d.ts +18 -1
  100. package/dist/entries/face-effects.d.ts +11 -3
  101. package/dist/entries/low-level.d.ts +22 -3
  102. package/dist/entries/product.d.ts +11 -0
  103. package/dist/entries/tracking.d.ts +24 -1
  104. package/dist/face-effects.cjs +155 -1
  105. package/dist/face-effects.js +1134 -2197
  106. package/dist/gestures/definitions.d.ts +85 -0
  107. package/dist/gestures/detector.d.ts +87 -0
  108. package/dist/gestures/index.d.ts +8 -0
  109. package/dist/gestures/measures.d.ts +101 -0
  110. package/dist/gestures/settings.d.ts +49 -0
  111. package/dist/{getFaceInfo-C4QpCQIY.js → getFaceInfo-BkZfaQs-.js} +5 -5
  112. package/dist/{getFaceInfo-fA1bFBub.cjs → getFaceInfo-ahPxQFGu.cjs} +1 -1
  113. package/dist/hooks/selectors.d.ts +68 -1
  114. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  115. package/dist/hooks/useFaceInfo.d.ts +13 -1
  116. package/dist/hooks/useFaceInfos.d.ts +1 -1
  117. package/dist/hooks/useGesture.d.ts +32 -0
  118. package/dist/hooks/useIrisTracking.d.ts +45 -0
  119. package/dist/hooks/useXRDiagnostics.d.ts +81 -0
  120. package/dist/hooks/useXRModel.d.ts +7 -0
  121. package/dist/hooks/useXRSession/facade.d.ts +42 -2
  122. package/dist/hooks/useXRSession/index.d.ts +2 -2
  123. package/dist/hooks/useXRSession/reason.d.ts +3 -1
  124. package/dist/hooks/useXRSession/registry.d.ts +14 -0
  125. package/dist/hooks/useXRSession/store.d.ts +52 -3
  126. package/dist/index--RgGzZ6X.cjs +47 -0
  127. package/dist/{index-VJ0SJwmG.js → index-CHVbH0hz.js} +4 -4
  128. package/dist/index-CeVkgsag.cjs +1 -0
  129. package/dist/index-CnGox6Xr.js +3054 -0
  130. package/dist/{index-ByoNj0QP.js → index-CsUdQ-pn.js} +113 -111
  131. package/dist/{index-BjmTe9eM.cjs → index-DKBAh6hV.cjs} +1 -1
  132. package/dist/index-DsZwTfG0.cjs +1 -0
  133. package/dist/index-Dw6tj2Mi.js +144 -0
  134. package/dist/index-OCPjOaeP.cjs +1 -0
  135. package/dist/{index-DXT3WccE.js → index-s9pF4zkG.js} +1065 -1101
  136. package/dist/internal-BYza1h8_.cjs +1 -0
  137. package/dist/{internal-Dmk1cTXq.js → internal-vsfNQycj.js} +15 -16
  138. package/dist/internal.cjs +1 -1
  139. package/dist/internal.js +2 -2
  140. package/dist/iris/compute.d.ts +25 -0
  141. package/dist/iris/index.d.ts +4 -0
  142. package/dist/iris/lead.d.ts +19 -0
  143. package/dist/iris/types.d.ts +87 -0
  144. package/dist/landmarkMask-CbTFzBYG.js +224 -0
  145. package/dist/landmarkMask-u7es2k4X.cjs +1 -0
  146. package/dist/low-level.cjs +1 -1
  147. package/dist/low-level.js +1085 -634
  148. package/dist/main.cjs +1 -1
  149. package/dist/main.js +1519 -465
  150. package/dist/measures-9dQPdw96.js +154 -0
  151. package/dist/measures-KfJzpvod.cjs +1 -0
  152. package/dist/models/Base/index.d.ts +49 -0
  153. package/dist/models/Body/index.d.ts +1 -1
  154. package/dist/models/Face/index.d.ts +1 -1
  155. package/dist/models/Hand/GestureTracking.d.ts +1 -1
  156. package/dist/models/Hand/HandTracking.d.ts +1 -1
  157. package/dist/models/Holistic/index.d.ts +49 -0
  158. package/dist/models/Holistic/result.d.ts +68 -0
  159. package/dist/models/SemanticSegmentation/index.d.ts +31 -0
  160. package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
  161. package/dist/models/index.d.ts +2 -0
  162. package/dist/product/ProductDimensions.d.ts +16 -0
  163. package/dist/product/ProductHotspot.d.ts +16 -0
  164. package/dist/product/ProductViewer.d.ts +9 -0
  165. package/dist/product/details.d.ts +53 -0
  166. package/dist/product/index.d.ts +14 -0
  167. package/dist/product/loadModelViewer.d.ts +4 -0
  168. package/dist/product/types.d.ts +71 -0
  169. package/dist/product/useProductAr.d.ts +37 -0
  170. package/dist/product/useProductDetails.d.ts +60 -0
  171. package/dist/product.cjs +1 -0
  172. package/dist/product.js +414 -0
  173. package/dist/providers-C0Dlhh9Z.js +365 -0
  174. package/dist/providers-YNwkmNeK.cjs +62 -0
  175. package/dist/quality/XRQualityController.d.ts +25 -0
  176. package/dist/quality/controller.d.ts +33 -0
  177. package/dist/quality/index.d.ts +6 -0
  178. package/dist/quality/types.d.ts +100 -0
  179. package/dist/quality/useXRQuality.d.ts +28 -0
  180. package/dist/{renderGroups-KZk6eRiY.js → renderGroups-CN1cGFUo.js} +1 -1
  181. package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-O4KmaMl9.cjs} +1 -1
  182. package/dist/renderPasses-Cg-zqmEz.cjs +21 -0
  183. package/dist/renderPasses-NnKZVfBy.js +1460 -0
  184. package/dist/scene-object.cjs +1 -1
  185. package/dist/scene-object.js +2 -2
  186. package/dist/screenTransform-BenfCtZt.js +44 -0
  187. package/dist/screenTransform-BiXdpVf0.cjs +1 -0
  188. package/dist/segmentation-9PhSvc-R.cjs +1 -0
  189. package/dist/segmentation-CeOTKemr.js +5 -0
  190. package/dist/segmentation2d/faceMemory.d.ts +28 -0
  191. package/dist/segmentation2d/faceRegions.d.ts +24 -0
  192. package/dist/segmentation2d/index.d.ts +9 -0
  193. package/dist/segmentation2d/maskUv.d.ts +23 -0
  194. package/dist/segmentation2d/rasterize.d.ts +14 -0
  195. package/dist/segmentation2d/types.d.ts +46 -0
  196. package/dist/selectors-C5G1PMYL.js +195 -0
  197. package/dist/selectors-Du_PsVnW.cjs +1 -0
  198. package/dist/{session-CpkiK5YA.cjs → session-BBr0yN8h.cjs} +7 -7
  199. package/dist/{session-DLFN_VII.js → session-Cy0m7l7-.js} +76 -76
  200. package/dist/settings-DRR7-snV.cjs +1 -0
  201. package/dist/settings-aQk845NJ.js +73 -0
  202. package/dist/subjects/index.d.ts +2 -0
  203. package/dist/subjects/select.d.ts +62 -0
  204. package/dist/subjects/types.d.ts +55 -0
  205. package/dist/tracking-config/apply.d.ts +57 -0
  206. package/dist/tracking-config/index.d.ts +7 -0
  207. package/dist/tracking-config/resolve.d.ts +25 -0
  208. package/dist/tracking-config/storage.d.ts +8 -0
  209. package/dist/tracking-config/types.d.ts +106 -0
  210. package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
  211. package/dist/tracking.cjs +1 -1
  212. package/dist/tracking.js +1056 -383
  213. package/dist/types/compositor.d.ts +21 -0
  214. package/dist/types/holistic.d.ts +121 -0
  215. package/dist/types/index.d.ts +1 -0
  216. package/dist/types/model.d.ts +22 -2
  217. package/dist/types/nodes.d.ts +27 -2
  218. package/dist/types/segmentation.d.ts +19 -0
  219. package/dist/types/session.d.ts +41 -3
  220. package/dist/useFaceInfo-Blf7FCu3.js +303 -0
  221. package/dist/useFaceInfo-C5mO8NQY.cjs +1 -0
  222. package/dist/useXRCapabilities-B1R2ghy-.cjs +1 -0
  223. package/dist/useXRCapabilities-C68v__wB.js +30 -0
  224. package/dist/utils/fns.d.ts +6 -3
  225. package/dist/utils/integrity.d.ts +4 -1
  226. package/dist/utils/updateThrottle.d.ts +2 -0
  227. package/dist/utils/useStableUniforms.d.ts +18 -0
  228. package/docs/api/adaptive-quality.mdx +104 -0
  229. package/docs/api/asset-lifecycle.mdx +78 -0
  230. package/docs/api/camera-permission.mdx +142 -0
  231. package/docs/api/coordinate-spaces.mdx +165 -0
  232. package/docs/api/cross-camera.mdx +88 -0
  233. package/docs/api/diagnostics-calibration.mdx +97 -0
  234. package/docs/api/face-effects.mdx +6 -0
  235. package/docs/api/face-mesh.mdx +4 -2
  236. package/docs/api/gestures.mdx +173 -0
  237. package/docs/api/holistic-tracker.mdx +159 -0
  238. package/docs/api/iris-tracking.mdx +242 -0
  239. package/docs/api/multi-subject.mdx +95 -0
  240. package/docs/api/person-cutout.mdx +136 -0
  241. package/docs/api/product-ar.mdx +111 -0
  242. package/docs/api/product-details.mdx +78 -0
  243. package/docs/api/screen-space-coordinates.mdx +4 -1
  244. package/docs/api/segmentation-overlay.mdx +301 -0
  245. package/docs/api/session-lifecycle.mdx +136 -0
  246. package/docs/api/trackers.mdx +5 -0
  247. package/docs/api/tracking-config.mdx +108 -0
  248. package/docs/docs.json +23 -1
  249. package/docs/examples/lip-shaders.mdx +224 -0
  250. package/docs/guides/lip-effect-textures.mdx +292 -0
  251. package/docs/guides/lip-uv-template.png +0 -0
  252. package/docs/guides/lip-uv-template.svg +1 -0
  253. package/package.json +13 -1
  254. package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
  255. package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
  256. package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
  257. package/dist/FaceRetouch-DwbKQJAN.js +0 -551
  258. package/dist/contexts-Dr62It_K.cjs +0 -1
  259. package/dist/index-9dlAQAhy.js +0 -1462
  260. package/dist/index-BpEf2BBb.cjs +0 -1
  261. package/dist/index-CyUUurQT.cjs +0 -1
  262. package/dist/index-DCiMbxC3.cjs +0 -1
  263. package/dist/index-DpI-qo5X.cjs +0 -17
  264. package/dist/index-DyVF4vEW.js +0 -111
  265. package/dist/internal-Cq-TEQ5Y.cjs +0 -1
  266. package/dist/renderLayers-lDtL0_43.cjs +0 -1
  267. package/dist/renderLayers-zrK2pv5O.js +0 -13
  268. package/dist/renderPasses-BOoBSr8z.cjs +0 -21
  269. package/dist/renderPasses-BcquyVtu.js +0 -1500
  270. package/dist/selectors-B8H97CKA.js +0 -59
  271. package/dist/selectors-CZLKT2Iv.cjs +0 -1
  272. package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
  273. package/dist/useFaceInfo-Dk426LTu.js +0 -62
  274. package/dist/useFaceResults-CtetsO9M.js +0 -19
  275. package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
@@ -0,0 +1 @@
1
+ "use strict";var Ss=Object.defineProperty;var Ms=(t,s,e)=>s in t?Ss(t,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[s]=e;var d=(t,s,e)=>Ms(t,typeof s!="symbol"?s+"":s,e);const Fe=require("react/jsx-runtime"),I=require("react"),B=require("@mediapipe/tasks-vision"),X=require("three");function Cs(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const n=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(s,e,n.get?n:{enumerable:!0,get:()=>t[e]})}}return s.default=t,Object.freeze(s)}const W=Cs(X),ks=(t,s)=>s,N={apiBaseUrl:ks(void 0,"https://api.vincentt.studio"),assetStorageEndpoint:"https://cdn.vincentt.studio",sdkAssetsBaseUrl:"https://cdn.vincentt.studio/assets/sdk/face/v1",loggerPrefix:"[vincentt-xr]:",sessionCheckInterval:3e4};var F=(t=>(t.WEBCAM="webcam",t.STREAM="stream",t.CANVAS="canvas",t))(F||{}),E=(t=>(t.HAND_TRACKER="vincentt.xr.hand-tracker",t.GESTURE_TRACKER="vincentt.xr.gesture-tracker",t.FACE_TRACKER="vincentt.xr.face-tracker",t.BODY_TRACKER="vincentt.xr.body-tracker",t.HOLISTIC_TRACKER="vincentt.xr.holistic-tracker",t.BACKGROUND_SEGMENTATION="vincentt.xr.background-segmentation",t.SEMANTIC_SEGMENTATION="vincentt.xr.semantic-segmentation",t))(E||{});const Ie=t=>Array.from({length:t},()=>({x:0,y:0,z:0}));class yt{constructor(s){d(this,"slots",[]);this.options=s}setOptions(s){this.options=s}update(s,e){const{holdMs:n,predictMs:r,maxVelocityGapMs:a=250}=this.options,o=[],c=Math.max(s.length,this.slots.length);for(let l=0;l<c;l+=1){const h=s[l],f=this.slots[l]??null;if(h&&h.length>0){const S=f&&f.points.length===h.length?f:null,C=S??{points:Ie(h.length),velocity:Ie(h.length),lastSeen:e,output:Ie(h.length)},x=(e-C.lastSeen)/1e3,b=S!==null&&x>0&&x*1e3<=a;for(let P=0;P<h.length;P+=1){const g=h[P],v=C.points[P],y=C.velocity[P],k=g.z??0;b?(y.x=.5*y.x+.5*((g.x-v.x)/x),y.y=.5*y.y+.5*((g.y-v.y)/x),y.z=.5*y.z+.5*((k-v.z)/x)):(y.x=0,y.y=0,y.z=0),v.x=g.x,v.y=g.y,v.z=k}C.lastSeen=e,this.slots[l]=C,o.push(h);continue}if(!f)continue;const u=e-f.lastSeen;if(u>n){this.slots[l]=null;continue}const w=Math.max(0,Math.min(u,r))/1e3;for(let S=0;S<f.points.length;S+=1)f.output[S].x=f.points[S].x+f.velocity[S].x*w,f.output[S].y=f.points[S].y+f.velocity[S].y*w,f.output[S].z=f.points[S].z+f.velocity[S].z*w;o.push(f.output)}for(;this.slots.length>0&&this.slots[this.slots.length-1]===null;)this.slots.pop();return o}reset(){this.slots=[]}}const ce=(t,s={x:0,y:0,z:0})=>(s.x=t.x*2-1,s.y=1-t.y*2,s.z=-t.z,s),xs=(t,s={x:0,y:0,z:0})=>(s.x=(t.x+1)/2,s.y=(1-t.y)/2,s.z=-t.z,s),Ue="https://storage.googleapis.com/mediapipe-models/holistic_landmarker/holistic_landmarker/float16/latest/holistic_landmarker.task",wt=250,vt=0,St=768,pe=t=>({hands:(t==null?void 0:t.hands)??"both",analysisMaxDimension:(t==null?void 0:t.analysisMaxDimension)??St,holdMs:(t==null?void 0:t.holdMs)??wt,predictMs:(t==null?void 0:t.predictMs)??vt}),Ts=()=>({version:0,timestampMs:0,face:null,leftHand:null,rightHand:null,pose:null}),lt=[0,4,5,6,1,2,3,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23,26,25,28,27,30,29,32,31],dt=(t,s)=>{if(t.length!==lt.length)return t;s.length=t.length;for(let e=0;e<t.length;e+=1)s[e]=t[lt[e]];return s};class fe{constructor(s,e){d(this,"memory");d(this,"holdMs");d(this,"lastLiveMs",-1/0);d(this,"lastConfidence",0);this.holdMs=s,this.memory=new yt({holdMs:s,predictMs:e})}setOptions(s,e){this.holdMs=s,this.memory.setOptions({holdMs:s,predictMs:e})}reset(){this.memory.reset(),this.lastLiveMs=-1/0,this.lastConfidence=0}bridge(s,e,n){const r=s!==void 0&&s.length>0,a=this.memory.update(r?[s]:[],n)[0];if(!a)return;if(r)return this.lastLiveMs=n,this.lastConfidence=e,{points:a,held:!1,confidence:e};const o=n-this.lastLiveMs,c=this.holdMs>0?Math.max(0,1-o/this.holdMs):0;return{points:a,held:!0,confidence:this.lastConfidence*c}}}const oe=(t,s,e)=>{for(t.length>s&&(t.length=s);t.length<s;)t.push(e());return t},_e=(t,s)=>{t.x=s.x,t.y=s.y,t.z=s.z},bs=t=>{if(t.length===0)return 0;let s=0;for(let e=0;e<t.length;e+=1)s+=t[e].visibility??0;return s/t.length};class Es{constructor(s){d(this,"options",pe());d(this,"faceMemory",new fe(this.options.holdMs,this.options.predictMs));d(this,"leftHandMemory",new fe(this.options.holdMs,this.options.predictMs));d(this,"rightHandMemory",new fe(this.options.holdMs,this.options.predictMs));d(this,"poseMemory",new fe(this.options.holdMs,this.options.predictMs));d(this,"face",{landmarks:[],blendshapes:{},confidence:0,held:!1});d(this,"leftHand",{handedness:"left",landmarks:[],worldLandmarks:[],confidence:0,held:!1});d(this,"rightHand",{handedness:"right",landmarks:[],worldLandmarks:[],confidence:0,held:!1});d(this,"poseScratch",[]);d(this,"poseWorldScratch",[]);d(this,"pose",{landmarks:[],worldLandmarks:[],visibility:[],confidence:0,held:!1});this.setOptions(s)}getOptions(){return this.options}setOptions(s){this.options=pe({...this.options,...s});const{holdMs:e,predictMs:n}=this.options;for(const r of this.memories())r.setOptions(e,n)}reset(){for(const s of this.memories())s.reset()}memories(){return[this.faceMemory,this.leftHandMemory,this.rightHandMemory,this.poseMemory]}update(s,e,n,r=!1){var h,f,u,w;n.face=this.updateFace(s,e);const a={landmarks:(h=s==null?void 0:s.leftHandLandmarks)==null?void 0:h[0],world:(f=s==null?void 0:s.leftHandWorldLandmarks)==null?void 0:f[0]},o={landmarks:(u=s==null?void 0:s.rightHandLandmarks)==null?void 0:u[0],world:(w=s==null?void 0:s.rightHandWorldLandmarks)==null?void 0:w[0]},c=r?o:a,l=r?a:o;return n.leftHand=this.updateHand("left",c.landmarks,c.world,e),n.rightHand=this.updateHand("right",l.landmarks,l.world,e),n.pose=this.updatePose(s,e,r),n.timestampMs=e,n.version+=1,n}updateFace(s,e){var c,l,h,f;const n=(c=s==null?void 0:s.faceLandmarks)==null?void 0:c[0],r=this.faceMemory.bridge(n,1,e);if(!r)return null;const{face:a}=this,o=!r.held&&n;oe(a.landmarks,r.points.length,()=>({x:0,y:0,z:0,visibility:0}));for(let u=0;u<r.points.length;u+=1){const w=a.landmarks[u];_e(w,r.points[u]),w.visibility=o?((l=n[u])==null?void 0:l.visibility)??0:0}if(o){const u=(f=(h=s==null?void 0:s.faceBlendshapes)==null?void 0:h[0])==null?void 0:f.categories;if(u)for(const w of u)a.blendshapes[w.categoryName]=w.score}return a.confidence=r.confidence,a.held=r.held,a}updateHand(s,e,n,r){const a=s==="left"?this.leftHandMemory:this.rightHandMemory,{hands:o}=this.options;if(o==="none"||o!=="both"&&o!==s)return a.reset(),null;const c=a.bridge(e,1,r);if(!c)return null;const l=s==="left"?this.leftHand:this.rightHand;oe(l.landmarks,c.points.length,()=>({x:0,y:0,z:0}));for(let h=0;h<c.points.length;h+=1)ce(c.points[h],l.landmarks[h]);if(!c.held&&n){oe(l.worldLandmarks,n.length,()=>({x:0,y:0,z:0}));for(let h=0;h<n.length;h+=1)_e(l.worldLandmarks[h],n[h])}return l.confidence=c.confidence,l.held=c.held,l}updatePose(s,e,n){var u,w,S;const r=(u=s==null?void 0:s.poseLandmarks)==null?void 0:u[0],a=r&&n?dt(r,this.poseScratch):r,o=this.poseMemory.bridge(a,a?bs(a):0,e);if(!o)return null;const{pose:c}=this,l=!o.held&&a;oe(c.landmarks,o.points.length,()=>({x:0,y:0,z:0})),oe(c.visibility,o.points.length,()=>0);for(let C=0;C<o.points.length;C+=1)ce(o.points[C],c.landmarks[C]),l&&(c.visibility[C]=((w=a[C])==null?void 0:w.visibility)??0);const h=(S=s==null?void 0:s.poseWorldLandmarks)==null?void 0:S[0],f=h&&n?dt(h,this.poseWorldScratch):h;if(l&&f){oe(c.worldLandmarks,f.length,()=>({x:0,y:0,z:0}));for(let C=0;C<f.length;C+=1)_e(c.worldLandmarks[C],f[C])}return c.confidence=o.confidence,c.held=o.held,c}}const He={"camera-permission-denied":"Camera access was blocked. Allow camera permissions in your browser, then refresh.","camera-in-use":"Camera is already in use by another app or browser tab. Close it and refresh.","no-camera":"No camera was found on this device.","camera-insecure-context":"Camera access needs HTTPS (or localhost). Open the page over HTTPS.","camera-unsupported":"This browser cannot open the camera.","camera-lost":"The camera stopped sending frames (disconnected, revoked, or taken by another app).","webgl-unavailable":"WebGL is unavailable, so nothing can render or track.","offscreen-canvas-unavailable":"OffscreenCanvas is unavailable; the tracker feed cannot be built.","wasm-unavailable":"WebAssembly is unavailable; the tracking engine cannot load.","model-unreachable":"The tracker model could not be downloaded.","model-integrity":"The tracker model failed its integrity check.","model-init-failed":"The tracker failed to initialize on this device.","placement-unsupported":"This device cannot place 3D objects in the room (no WebXR, Scene Viewer or Quick Look).",unknown:"Tracking is unavailable for an unknown reason."},Rs={"camera-permission-denied":!0,"camera-in-use":!0,"no-camera":!1,"camera-insecure-context":!1,"camera-unsupported":!1,"camera-lost":!0,"webgl-unavailable":!1,"offscreen-canvas-unavailable":!1,"wasm-unavailable":!1,"model-unreachable":!0,"model-integrity":!1,"model-init-failed":!1,"placement-unsupported":!1,unknown:!0},_=(t,s=He[t])=>({code:t,message:s,recoverable:Rs[t]}),Mt={[E.FACE_TRACKER]:"/assets/xr/models/face_tracking.task",[E.HAND_TRACKER]:"/assets/xr/models/hand_tracking.task",[E.GESTURE_TRACKER]:"/assets/xr/models/gesture_tracking.task",[E.BODY_TRACKER]:"/assets/xr/models/body_tracking.task",[E.BACKGROUND_SEGMENTATION]:"/assets/xr/models/segmentation.tflite",[E.SEMANTIC_SEGMENTATION]:"/assets/xr/models/selfie_multiclass_256x256.tflite",[E.HOLISTIC_TRACKER]:Ue},Ne=t=>{const s=Mt[t];return s?/^https?:/.test(s)?s:new URL(s,N.assetStorageEndpoint).toString():null},As=Object.values(E),Fs=()=>{var e,n,r;const t=typeof window<"u",s=typeof document<"u";return{navigator:typeof navigator<"u"?navigator:void 0,isSecureContext:t?window.isSecureContext:void 0,createCanvas:s?()=>document.createElement("canvas"):void 0,offscreenCanvas:typeof OffscreenCanvas<"u",wasm:typeof WebAssembly<"u",fetch:typeof fetch<"u"?fetch.bind(globalThis):void 0,now:()=>typeof performance<"u"?performance.now():Date.now(),xrSessionSupported:typeof navigator<"u"&&((e=navigator.xr)!=null&&e.isSessionSupported)?a=>navigator.xr.isSessionSupported(a).catch(()=>!1):void 0,relSupportsAr:s?((r=(n=document.createElement("a").relList)==null?void 0:n.supports)==null?void 0:r.call(n,"ar"))===!0:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0}},Is=t=>!!t&&/Android/.test(t)&&/(Chrome|SamsungBrowser)\//.test(t)&&!/Firefox|OPR\//.test(t),_s=async t=>{let s=!1;if(t.xrSessionSupported)try{s=await t.xrSessionSupported("immersive-ar")}catch{s=!1}const e=Is(t.userAgent),n=t.relSupportsAr===!0,r=s||e||n;return{webxr:s,sceneViewer:e,quickLook:n,any:r,reason:r?null:_("placement-unsupported")}},Ct=t=>{switch(t){case"granted":return"supported";case"denied":return"permission-denied";case"prompt":return"permission-prompt";default:return"unknown"}},Ps=async(t,s)=>{var c,l,h;const e=t.isSecureContext??!0,n=(c=t.navigator)==null?void 0:c.mediaDevices;if(!e)return{status:"unsupported",reason:_("camera-insecure-context"),deviceCount:null,secureContext:e};if(!n||typeof n.getUserMedia!="function")return{status:"unsupported",reason:_("camera-unsupported"),deviceCount:null,secureContext:e};let r="unknown";if(s&&((h=(l=t.navigator)==null?void 0:l.permissions)!=null&&h.query))try{const f=await t.navigator.permissions.query({name:"camera"});r=Ct(f.state)}catch{r="unknown"}let a=null,o=!1;if(typeof n.enumerateDevices=="function")try{const f=await n.enumerateDevices();a=f.filter(u=>u.kind==="videoinput").length,o=f.some(u=>!!u.label)}catch{a=null}return r==="permission-denied"?{status:r,reason:_("camera-permission-denied"),deviceCount:a,secureContext:e}:a===0&&(r==="supported"||o)?{status:"unsupported",reason:_("no-camera"),deviceCount:a,secureContext:e}:{status:r,reason:null,deviceCount:a,secureContext:e}},Ls=t=>{var e;const s=(e=t.createCanvas)==null?void 0:e.call(t);if(!s)return 0;try{if(s.getContext("webgl2"))return 2;if(s.getContext("webgl")||s.getContext("experimental-webgl"))return 1}catch{return 0}return 0},Ds=t=>{var o;const s=Ls(t),e=t.offscreenCanvas??!1,n=t.wasm??!1,r=!!((o=t.navigator)!=null&&o.gpu);let a=null;return s===0?a=_("webgl-unavailable"):e?n||(a=_("wasm-unavailable")):a=_("offscreen-canvas-unavailable"),{status:a?"unsupported":"supported",reason:a,webglVersion:s,webgpu:r,offscreenCanvas:e,wasm:n}},Os=async(t,s,e)=>{var o,c;const n=Ne(t);if(!n||!s.fetch)return{model:t,status:"unknown",reason:null,url:n,bytes:null};const r=typeof AbortController<"u"?new AbortController:void 0,a=setTimeout(()=>r==null?void 0:r.abort(),e);try{const l=await s.fetch(n,{method:"HEAD",signal:r==null?void 0:r.signal});if(!l.ok)return{model:t,status:"unsupported",reason:_("model-unreachable",`${He["model-unreachable"]} (${l.status})`),url:n,bytes:null};const h=Number(((c=(o=l.headers)==null?void 0:o.get)==null?void 0:c.call(o,"content-length"))??NaN);return{model:t,status:"supported",reason:null,url:n,bytes:Number.isFinite(h)&&h>0?h:null}}catch{return{model:t,status:"unsupported",reason:_("model-unreachable"),url:n,bytes:null}}finally{clearTimeout(a)}},Us=async(t={},s=Fs())=>{const e=t.timeoutMs??4e3,n=new Set(t.models??[]),[r,a,o]=await Promise.all([Ps(s,t.queryPermission??!0),Promise.all(As.map(async h=>n.has(h)?Os(h,s,e):{model:h,status:"unknown",reason:null,url:Ne(h),bytes:null})),_s(s)]),c=Ds(s),l=Object.fromEntries(a.map(h=>[h.model,h]));return{camera:r,rendering:c,placement:o,models:l,canRunTracking:c.status==="supported"&&r.status!=="unsupported",checkedAt:s.now?s.now():Date.now()}},Be=t=>{switch(t){case"permission-denied":return _("camera-permission-denied");case"camera-in-use":return _("camera-in-use");case"no-camera":return _("no-camera");case"camera-lost":return _("camera-lost");case"unsupported":return _("camera-unsupported");default:return _("unknown")}},Hs=(t,s)=>{const{camera:e,rendering:n}=t,r=t.models[s],a=e.status==="permission-prompt"||e.status==="unknown";return n.reason?{supported:!1,reason:n.reason,needsPermission:a}:e.reason?{supported:!1,reason:e.reason,needsPermission:a}:r!=null&&r.reason?{supported:!1,reason:r.reason,needsPermission:a}:{supported:!0,reason:null,needsPermission:a}},Ns=t=>{const s=t instanceof Error?t.message:String(t??""),e=s.toLowerCase();return e.includes("integrity")||e.includes("sha-384")||e.includes("sha384")?_("model-integrity",s):e.includes("failed to fetch")||e.includes("networkerror")||e.includes("load failed")||/\b(404|403|5\d\d)\b/.test(e)||e.includes("fetch")?_("model-unreachable",s):e.includes("webgl")||e.includes("gpu")?_("webgl-unavailable",s):s?_("model-init-failed",s):_("unknown")},ze=t=>{switch(t instanceof DOMException?t.name:""){case"NotAllowedError":case"PermissionDeniedError":return"permission-denied";case"NotReadableError":case"TrackStartError":return"camera-in-use";case"NotFoundError":case"DevicesNotFoundError":return"no-camera";case"NotSupportedError":case"SecurityError":case"OverconstrainedError":return"unsupported";default:return t instanceof TypeError?"unsupported":"unknown"}},ut={"permission-denied":"Camera access was blocked. Allow camera permissions in your browser, then refresh.","camera-in-use":"Camera is already in use by another app or browser tab. Close it and refresh.","no-camera":"No camera was found on this device.","camera-lost":"The camera stopped sending frames. Reconnect it or re-allow access, then start again.",unsupported:"Unable to access camera. Allow camera permissions in your browser, then refresh.",unknown:"Unable to access camera. Allow camera permissions in your browser, then refresh."},ve=()=>({mediaDevices:typeof navigator<"u"?navigator.mediaDevices:void 0,permissions:typeof navigator<"u"?navigator.permissions:void 0,isSecureContext:typeof window<"u"?window.isSecureContext:void 0}),We=async(t=ve())=>{var s;if(!((s=t.permissions)!=null&&s.query))return{state:"unknown",prompt:!1};try{const e=await t.permissions.query({name:"camera"});return e.state==="granted"?{state:"granted",prompt:!1}:e.state==="denied"?{state:"blocked",prompt:!1}:{state:"unknown",prompt:e.state==="prompt"}}catch{return{state:"unknown",prompt:!1}}},qe=(t,s)=>t==="permission-denied"?{state:s==="blocked"?"blocked":"denied",reason:_("camera-permission-denied")}:{state:"unavailable",reason:Be(t)},Bs=async(t={},s=ve())=>{var n;if(s.isSecureContext===!1)return{state:"unavailable",reason:_("camera-insecure-context"),stream:null};const e=(n=s.mediaDevices)==null?void 0:n.getUserMedia;if(typeof e!="function")return{state:"unavailable",reason:_("camera-unsupported"),stream:null};try{const r=await e.call(s.mediaDevices,t.constraints??{video:{facingMode:"user"}});return t.keepStream?{state:"granted",reason:null,stream:r}:(r.getTracks().forEach(a=>a.stop()),{state:"granted",reason:null,stream:null})}catch(r){const a=ze(r),o=await We(s);return{...qe(a,o.state),stream:null}}},zs=async(t,s=ve())=>{var e,n;if(!((e=s.permissions)!=null&&e.query))return()=>{};try{const r=await s.permissions.query({name:"camera"}),a=()=>{r.state==="granted"?t({state:"granted",prompt:!1}):r.state==="denied"?t({state:"blocked",prompt:!1}):t({state:"unknown",prompt:r.state==="prompt"})};return(n=r.addEventListener)==null||n.call(r,"change",a),()=>{var o;return(o=r.removeEventListener)==null?void 0:o.call(r,"change",a)}}catch{return()=>{}}},Ws=t=>t==="unknown"||t==="denied"||t==="granted",qs={unknown:"This experience uses your camera. Nothing is recorded or uploaded.",requesting:"Waiting for you to allow the camera…",granted:"Camera access granted.",denied:"Camera access was not allowed. You can try again.",blocked:"Camera access is blocked for this site. Allow it in your browser's site settings, then reload.",unavailable:"The camera is unavailable on this device right now."},kt=(t,s,e="cover",n=1)=>{if(t.width<=0||t.height<=0||s.width<=0||s.height<=0)return null;const r=Number.isFinite(n)&&n>0?n:1,a=s.width/t.width,o=s.height/t.height,c=e==="contain"?o<=a:o>=a,l=(c?o:a)*r,h=c?t.width*o*r:s.width*r,f=c?s.height*r:t.height*a*r;return{scale:l,drawWidth:h,drawHeight:f,offsetX:(s.width-h)/2,offsetY:(s.height-f)/2}},Se=t=>t==="webcam"||t===void 0,xt=({source:t,feed:s,zoom:e=1,mirrored:n=!1})=>{const r=kt(t,s,"cover",e);return r?{...r,source:t,feed:s,zoom:Number.isFinite(e)&&e>0?e:1,mirrored:n}:null},Vs=(t,s,e={x:0,y:0})=>{const n=s.mirrored?s.source.width-t.x:t.x;return e.x=(s.offsetX+n*s.scale)/s.feed.width,e.y=(s.offsetY+t.y*s.scale)/s.feed.height,e},Tt=(t,s,e={x:0,y:0})=>{const n=(t.x*s.feed.width-s.offsetX)/s.scale;return e.x=s.mirrored?s.source.width-n:n,e.y=(t.y*s.feed.height-s.offsetY)/s.scale,e},Ks=(t,s)=>{const e=Tt(t,s);return e.x>=0&&e.x<=s.source.width&&e.y>=0&&e.y<=s.source.height},Xs=(t,s={x:0,y:0})=>(s.x=1-t.x,s.y=t.y,t.z!==void 0&&(s.z=t.z),s),Gs=(t,s,e,n={x:0,y:0})=>{switch(e){case 90:return n.x=s.height-t.y,n.y=t.x,n;case 180:return n.x=s.width-t.x,n.y=s.height-t.y,n;case 270:return n.x=t.y,n.y=s.width-t.x,n;default:return n.x=t.x,n.y=t.y,n}},Qs=(t,s)=>s===90||s===270?{width:t.height,height:t.width}:{width:t.width,height:t.height};class U extends Error{constructor(s){super(s),this.name="VincenttXRError"}}class Ys{constructor(s){d(this,"options");const e={verbose:!1,prefix:N.loggerPrefix};this.options={...e,...s}}log(...s){const{verbose:e,prefix:n}=this.options;e&&console.info(n,...s)}error(...s){const{verbose:e,prefix:n}=this.options;e&&console.error(n,...s)}}const ht=new W.Vector3,Pe=new W.Vector3,bt=(t,s,e,n,r)=>{ht.set(t,s,0).unproject(e),Pe.copy(ht).sub(e.position).normalize();const a=(n-e.position.z)/Pe.z;return r.copy(e.position).addScaledVector(Pe,a)},Et=(t,s,e=new W.Vector3,n=0)=>bt((t.x-.5)*2,(.5-t.y)*2,s,n,e),js=(t,s,e=new W.Vector3,n=0)=>bt(t.x,t.y,s,n,e),Z=new W.Vector3,Zs=(t,s,e={x:0,y:0,z:0})=>(Z.set(t.x,t.y,t.z).project(s),e.x=Z.x/2+.5,e.y=.5-Z.y/2,e.z=Z.z,e),$s=(t,s,e={x:0,y:0,z:0})=>(Z.set(t.x,t.y,t.z).project(s),e.x=Z.x,e.y=Z.y,e.z=Z.z,e),ge=(t,s,e)=>Et(t,s,e,0),Js=(t,s,e=.2)=>e*s+(1-e)*t;class de{constructor(s){d(this,"canvas");d(this,"scale",1);this.maxDimension=s}setScale(s){this.scale=Math.min(1,Math.max(.25,Number.isFinite(s)&&s>0?s:1))}draw(s){const e=s.width,n=s.height,r=Math.min(1,this.maxDimension*this.scale/Math.max(e,n));if(r>=1)return s;const a=Math.max(1,Math.round(e*r)),o=Math.max(1,Math.round(n*r));(!this.canvas||this.canvas.width!==a||this.canvas.height!==o)&&(this.canvas=new OffscreenCanvas(a,o));const c=this.canvas.getContext("2d");return c?(c.setTransform(1,0,0,1,0,0),c.clearRect(0,0,a,o),c.drawImage(s,0,0,a,o),this.canvas):s}dispose(){this.canvas=void 0}}const en={"/assets/xr/models/face_tracking.task":"sha384-tYQh+yJE8llY+zO4RviZmWaSKs5W9tsB0ix5rjQVpF5/CLTqmwtP7bYtkUi2w65P","/assets/xr/models/hand_tracking.task":"sha384-uWvruVKd887ov8k43S+DBHCsi7UXXS+CKvvdM1PX00rjPzx/B0QrAPfJ1U9yKcze","/assets/xr/models/gesture_tracking.task":"sha384-2zuseP9JKKWAYlWQGKA2N+ooabB8V/yIxu23Mv8mtY7SowcySB+xKiOmqBhVvlUC","/assets/xr/models/body_tracking.task":"sha384-3Wk9dvRYo36b3Nc9xVjKamb4wCKt9FwiPjcHKfrvyJL/jXoGs+uRLnii6yjWLKul","/assets/xr/models/segmentation.tflite":"sha384-A2bQ8+iZyQM3KIGVBUf0FyetqxuynyKpjsjCE8uzoJEnj1ghCu6ge2daiRffAiS5","/assets/xr/3d-models/head-occluder-v2.glb":"sha384-+0G60Q6EBVE6hpITxGzQgofAeKexPltpsfPq5T5et9GGBjRhFP5HOdsKAhe73OaI","/assets/xr/models/hair_segmenter.tflite":"sha384-1Eu/EdJcYV/7talPYVVbxPZBLg7UIxqsKisUNh/pEsyvAuUcE49HuqijSXWSHXHK","/mediapipe-models/image_segmenter/hair_segmenter/float32/latest/hair_segmenter.tflite":"sha384-1Eu/EdJcYV/7talPYVVbxPZBLg7UIxqsKisUNh/pEsyvAuUcE49HuqijSXWSHXHK","/assets/xr/models/selfie_multiclass_256x256.tflite":"sha384-LPLPyzBZ6TTE8146rnDx8CZ5LykB8memkmeO8FNVbGlNthvlUltn3W3KeJmtq9bL","/mediapipe-models/image_segmenter/selfie_multiclass_256x256/float32/latest/selfie_multiclass_256x256.tflite":"sha384-LPLPyzBZ6TTE8146rnDx8CZ5LykB8memkmeO8FNVbGlNthvlUltn3W3KeJmtq9bL","/assets/xr/models/holistic_landmarker.task":"sha384-6Y2fQ5yP5QtlvJIasfv0fHEyoMqRYYpLtEpsyeXjYDOuFCEXfKIZPZSXq8TLXmsg","/mediapipe-models/holistic_landmarker/holistic_landmarker/float16/latest/holistic_landmarker.task":"sha384-6Y2fQ5yP5QtlvJIasfv0fHEyoMqRYYpLtEpsyeXjYDOuFCEXfKIZPZSXq8TLXmsg","/assets/sdk/face/v1/canonical_face_model.obj":"sha384-xP8YM/72TXKvbMptXB9a8JUlUf3MZQ8uLurExrsZc05v6/P5RrsaNGMUYS/BZx8A","/opencv/facial_expression_recognition/resolve/main/facial_expression_recognition_mobilefacenet_2022july_int8.onnx":"sha384-g8mtFubiIc/yhqi591RsxD76AJLw2CfYgKhKbVkIiFlwBmIyG7ZAIVyGPXafrDGB"};async function Rt(t,s){const e=await fetch(t,s!=null&&s.signal?{signal:s.signal}:void 0);if(!e.ok)throw new Error(`fetchAndVerify: ${e.status} ${t}`);const n=await e.arrayBuffer(),r=tn(t);if(!r){if(At(t))throw new Error(`[xr-sdk integrity] no SRI hash for SDK asset ${t}`);return console.warn(`[xr-sdk integrity] no SRI hash for ${t} — passing through`),n}const a=await sn(n);if(a!==r)throw new Error(`[xr-sdk integrity] SRI mismatch for ${t}: expected ${r}, got ${a}`);return n}function At(t){try{return new URL(t).origin===new URL(N.assetStorageEndpoint).origin}catch{return!1}}async function J(t){const s=await Rt(t);return new Uint8Array(s)}function tn(t){try{const s=new URL(t);return en[s.pathname]}catch{return}}async function sn(t){const s=await crypto.subtle.digest("SHA-384",t),e=new Uint8Array(s);let n="";for(let r=0;r<e.byteLength;r++)n+=String.fromCharCode(e[r]);return`sha384-${btoa(n)}`}const Le=new Map;function ee(t){const s=t.wasmBinaryPath;let e=Le.get(s);return e||(e=nn(s).catch(()=>{Le.delete(s)}),Le.set(s,e)),e}async function nn(t){const s=await fetch(t,{credentials:"same-origin"});if(!s.ok||!s.body)throw new Error(`warmVisionWasm: ${s.status} ${t}`);const e=s.body.getReader();for(;;){const{done:n}=await e.read();if(n)return}}class te{constructor(){d(this,"disposed",!1);d(this,"paused",!1);d(this,"rafId",null);d(this,"statInferenceMs",null);d(this,"statInferences",0);d(this,"statWindowStart",0);d(this,"statWindowCount",0);d(this,"statFps",0);d(this,"statSkipped",0);d(this,"statDetections",null);d(this,"statConfidence",null);d(this,"statStatus","ready");d(this,"statError",null);d(this,"targetFrameIntervalMs",0);d(this,"lastInferenceMs",0);d(this,"analysisScale",1)}recordInference(s,e=performance.now()){const n=e-s;this.statInferenceMs=n,this.statInferences+=1,this.statWindowCount+=1,this.statWindowStart===0&&(this.statWindowStart=e);const r=e-this.statWindowStart;return r>=1e3&&(this.statFps=this.statWindowCount*1e3/r,this.statWindowStart=e,this.statWindowCount=0),n}recordDetections(s,e=null){this.statDetections=s,this.statConfidence=e}recordInferenceError(s){this.statStatus=s?"error":"ready",this.statError=s}getDiagnostics(){const s=this.statWindowStart>0&&performance.now()-this.statWindowStart>1500;return{inferenceMs:this.statInferenceMs,inferenceFps:s?0:this.statFps,inferences:this.statInferences,skippedFrames:this.statSkipped,detections:this.statDetections,confidence:this.statConfidence,status:this.statStatus,error:this.statError,paused:this.paused,disposed:this.disposed}}setAnalysisScale(s){this.analysisScale=s!==void 0&&Number.isFinite(s)&&s>0?Math.min(1,Math.max(.25,s)):1}setTargetFps(s){this.targetFrameIntervalMs=s&&s>0?1e3/s:0}shouldRunInference(){if(this.targetFrameIntervalMs<=0)return!0;const s=performance.now();return s-this.lastInferenceMs<this.targetFrameIntervalMs?(this.statSkipped+=1,!1):(this.lastInferenceMs=s,!0)}async initialize(s){}async run(s){}getModelNode(){return{}}async getPerformanceData(){return{name:this.constructor.name,processingTime:null}}pause(){this.paused=!0,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}resume(){this.paused=!1}dispose(){this.disposed=!0,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}}const rn=768;class an extends te{constructor(){super();d(this,"landmarker",null);d(this,"processingTime",null);d(this,"coordinates");d(this,"sourceCanvas");d(this,"downscaler",new de(rn))}async getBodyData(){if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),n=performance.now(),r=this.landmarker.detectForVideo(e,n),a=performance.now();this.processingTime=a-n,this.recordInference(n,a);const o=r.landmarks,c=o==null?void 0:o[0];this.recordDetections((o==null?void 0:o.length)??0,c&&c.length?c.reduce((h,f)=>h+(f.visibility??0),0)/c.length:null);const l=[];if(o)return o.forEach((h,f)=>{l[f]||(l[f]=[]),h.forEach(u=>{l[f].push(ce(u))})}),{coordinatesList:l}}async processBodyTracking(){if(!(this.disposed||this.paused||!this.landmarker)){if(this.shouldRunInference()){const e=await this.getBodyData();e&&(this.coordinates=e.coordinatesList)}this.disposed||this.paused||(this.rafId=requestAnimationFrame(this.processBodyTracking.bind(this)))}}resume(){this.paused&&(super.resume(),this.processBodyTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.downscaler.dispose(),this.coordinates=void 0}getLandmarks2D(e=0){if(this.coordinates)return this.coordinates[e]}async initialize(e){const n=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),[r]=await Promise.all([J(new URL("/assets/xr/models/body_tracking.task",N.assetStorageEndpoint).toString()),ee(n)]);this.landmarker=await B.PoseLandmarker.createFromOptions(n,{baseOptions:{modelAssetBuffer:r,delegate:"GPU"},runningMode:"VIDEO",numPoses:(e==null?void 0:e.numPoses)||1})}async run({sourceCanvas:e,targetFps:n,analysisScale:r}){this.setAnalysisScale(r),this.downscaler.setScale(this.analysisScale),this.sourceCanvas=e,this.setTargetFps(n),this.rafId===null&&await this.processBodyTracking()}getModelNode(){return{getLandmarks2D:this.getLandmarks2D.bind(this)}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const on=.11,cn=.004,ln=(t,s)=>s.set(t.x,-t.y,t.z);class dn extends te{constructor(){super();d(this,"landmarker",null);d(this,"processingTime",null);d(this,"sourceCanvas");d(this,"analysisCanvas");d(this,"getSource");d(this,"detectionResults");d(this,"numFaces",1);d(this,"cameras",[]);d(this,"faces",[]);d(this,"leftCheekScratch",[]);d(this,"rightCheekScratch",[]);d(this,"landmarkScratch",{x:0,y:0,z:0,visibility:0});d(this,"rotMatrixScratch",new W.Matrix4);d(this,"rotQuatScratch",new W.Quaternion);d(this,"rotEulerScratch",new W.Euler)}landmarkForSource(e,n){return n?(this.landmarkScratch.x=1-e.x,this.landmarkScratch.y=e.y,this.landmarkScratch.z=e.z,this.landmarkScratch.visibility=e.visibility,this.landmarkScratch):e}extractAndUpdateFaceData(e){var r;if(!e.faceLandmarks.length){this.faces=[];return}const n=e.faceLandmarks.length;for(this.faces.length>n&&(this.faces.length=n,this.leftCheekScratch.length=n,this.rightCheekScratch.length=n);this.faces.length<n;)this.faces.push({transform:{position:new W.Vector3,rotation:new W.Vector3,scale:new W.Vector3},gestures:{}}),this.leftCheekScratch.push(new W.Vector3),this.rightCheekScratch.push(new W.Vector3);for(let a=0;a<n;a+=1){if(!this.cameras[a])continue;const o=this.faces[a],c=!Se((r=this.getSource)==null?void 0:r.call(this)),l=e.faceLandmarks[a],h=e.facialTransformationMatrixes[a];this.rotMatrixScratch.fromArray(h.data),this.rotQuatScratch.setFromRotationMatrix(this.rotMatrixScratch),this.rotQuatScratch.set(-this.rotQuatScratch.x,this.rotQuatScratch.y,this.rotQuatScratch.z,this.rotQuatScratch.w),this.rotEulerScratch.setFromQuaternion(this.rotQuatScratch,"XYZ"),ln(this.rotEulerScratch,o.transform.rotation),ge(this.landmarkForSource(l[4],c),this.cameras[a],o.transform.position),ge(this.landmarkForSource(l[50],c),this.cameras[a],this.leftCheekScratch[a]),ge(this.landmarkForSource(l[280],c),this.cameras[a],this.rightCheekScratch[a]);const u=this.leftCheekScratch[a].distanceTo(this.rightCheekScratch[a])*on,w=Math.abs(W.MathUtils.radToDeg(this.rotEulerScratch.y)),S=u+w*cn,C=o.transform.scale.x,x=Js(isNaN(C)?0:C,S);o.transform.scale.set(x,x,x);const b=o.gestures,P=e.faceBlendshapes[a].categories;for(const g of P)b[g.categoryName]=g.score}}async processFaceTracking(){if(this.disposed||this.paused||!this.landmarker||!this.sourceCanvas)return null;if(!this.shouldRunInference()){this.rafId=requestAnimationFrame(this.processFaceTracking.bind(this));return}const e=un(this.numFaces)*this.analysisScale,n=this.sourceCanvas.width,r=this.sourceCanvas.height,a=Math.min(1,e/Math.max(n,r)),o=Math.max(1,Math.round(n*a)),c=Math.max(1,Math.round(r*a));(!this.analysisCanvas||this.analysisCanvas.width!==o||this.analysisCanvas.height!==c)&&(this.analysisCanvas=new OffscreenCanvas(o,c));const l=this.analysisCanvas.getContext("2d");if(!l){this.rafId=requestAnimationFrame(this.processFaceTracking.bind(this));return}l.setTransform(1,0,0,1,0,0),l.clearRect(0,0,o,c),l.drawImage(this.sourceCanvas,0,0,o,c);const h=performance.now(),f=this.landmarker.detectForVideo(this.analysisCanvas,h),u=performance.now();this.processingTime=u-h,this.recordInference(h,u),this.recordDetections(f.faceLandmarks.length,null),this.detectionResults=f,this.extractAndUpdateFaceData(f),!(this.disposed||this.paused)&&(this.rafId=requestAnimationFrame(this.processFaceTracking.bind(this)))}resume(){this.paused&&(super.resume(),this.processFaceTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.analysisCanvas=void 0,this.getSource=void 0,this.detectionResults=void 0,this.processingTime=null,this.cameras=[],this.faces=[],this.leftCheekScratch=[],this.rightCheekScratch=[]}getFace(e=0){return this.faces[e]}getDetectionResults(){return this.detectionResults}getRawFaceTrackingData(e=0){var n,r,a,o;if(this.detectionResults)return{landmarks:(n=this.detectionResults.faceLandmarks)==null?void 0:n[e],blendshapes:(a=(r=this.detectionResults.faceBlendshapes)==null?void 0:r[e])==null?void 0:a.categories,transformationMatrix:(o=this.detectionResults.facialTransformationMatrixes)==null?void 0:o[e]}}async initialize(e){this.numFaces=(e==null?void 0:e.numFaces)||1;const n=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),[r]=await Promise.all([J(new URL("/assets/xr/models/face_tracking.task",N.assetStorageEndpoint).toString()),ee(n)]),a=await B.FaceLandmarker.createFromOptions(n,{baseOptions:{modelAssetBuffer:r,delegate:"GPU"},minFaceDetectionConfidence:.3,minFacePresenceConfidence:.3,minTrackingConfidence:.3,outputFaceBlendshapes:!0,outputFacialTransformationMatrixes:!0,runningMode:"VIDEO",numFaces:this.numFaces});if(this.disposed){a.close();return}this.landmarker=a}async run({sourceCanvas:e,getSource:n,targetFps:r,analysisScale:a}){this.sourceCanvas=e,this.getSource=n,this.setTargetFps(r),this.setAnalysisScale(a),this.analysisCanvas=void 0,this.rafId===null&&this.processFaceTracking()}getModelNode(){const e=this;return{get detectionResults(){return e.detectionResults},getDetectionResults:this.getDetectionResults.bind(this),getFace:this.getFace.bind(this),getRawFaceTrackingData:this.getRawFaceTrackingData.bind(this),setCamera:(r,a=0)=>{this.cameras[a]=r}}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const un=t=>t>1?1024:512;var Y=(t=>(t.ClosedFist="closed_fist",t.OpenPalm="open_palm",t.PointingUp="pointing_up",t.ThumbDown="thumb_down",t.ThumbUp="thumb_up",t.Victory="victory",t.ILoveYou="i_love_you",t.None="none",t))(Y||{});const hn=512,mn={Closed_Fist:Y.ClosedFist,Open_Palm:Y.OpenPalm,Pointing_Up:Y.PointingUp,Thumb_Down:Y.ThumbDown,Thumb_Up:Y.ThumbUp,Victory:Y.Victory,ILoveYou:Y.ILoveYou,None:Y.None},fn=15;class gn extends te{constructor(){super();d(this,"landmarker",null);d(this,"processingTime",null);d(this,"coordinates");d(this,"gesture");d(this,"sourceCanvas");d(this,"downscaler",new de(hn))}async getGestureData(){var l,h;if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),n=performance.now(),r=this.landmarker.recognizeForVideo(e,n),a=performance.now();this.processingTime=a-n,this.recordInference(n,a),this.recordDetections(r.landmarks.length,((h=(l=r.gestures[0])==null?void 0:l[0])==null?void 0:h.score)??null);const o=r.landmarks[0],c=[];if(o){const f=r.gestures[0][0].categoryName;return o.forEach(u=>{c.push(ce(u))}),{coordinates:c,gesture:mn[f]}}return{coordinates:void 0,gesture:void 0}}async processGestureTracking(){if(!this.disposed){if(this.shouldRunInference()){const e=await this.getGestureData();e&&(this.coordinates=e.coordinates,this.gesture=e.gesture)}this.disposed||this.paused||(this.rafId=requestAnimationFrame(this.processGestureTracking.bind(this)))}}resume(){this.paused&&(super.resume(),this.processGestureTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.downscaler.dispose(),this.coordinates=void 0,this.gesture=void 0}async initialize(){const e=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),[n]=await Promise.all([J(new URL("/assets/xr/models/gesture_tracking.task",N.assetStorageEndpoint).toString()),ee(e)]),r=await B.GestureRecognizer.createFromOptions(e,{baseOptions:{modelAssetBuffer:n,delegate:"GPU"},runningMode:"VIDEO",numHands:1});this.landmarker=r}async run({sourceCanvas:e,targetFps:n,analysisScale:r}){this.setAnalysisScale(r),this.downscaler.setScale(this.analysisScale),this.sourceCanvas=e,this.setTargetFps(n??fn),this.rafId===null&&await this.processGestureTracking()}getModelNode(){const e=this;return{get coordinates(){return e.coordinates},get gesture(){return e.gesture}}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}class pn extends te{constructor(){super();d(this,"landmarker",null);d(this,"status","loading");d(this,"error",null);d(this,"processingTime",null);d(this,"sourceCanvas");d(this,"getSource");d(this,"downscaler",new de(pe().analysisMaxDimension));d(this,"raw");d(this,"delegatePolicy","auto");d(this,"delegate","GPU");d(this,"vision",null);d(this,"modelBuffer",null);d(this,"graphOptions",{});d(this,"rebuilding",!1);d(this,"fallbackAttempted",!1);d(this,"result",Ts());d(this,"builder",new Es);d(this,"node");this.node={getResult:()=>this.result,getRawResult:()=>this.raw,getStatus:()=>this.status,getError:()=>this.error,getDelegate:()=>this.delegate,setOptions:e=>this.setRuntimeOptions(e)}}setRuntimeOptions(e){const n=this.builder.getOptions().analysisMaxDimension;this.builder.setOptions(e);const r=this.builder.getOptions().analysisMaxDimension;r!==n&&(this.downscaler.dispose(),this.downscaler=new de(r),this.downscaler.setScale(this.analysisScale))}async initialize(e){this.status="loading",this.error=null,this.setRuntimeOptions(e??{});try{const n=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),[r]=await Promise.all([J((e==null?void 0:e.modelUrl)??Ue),ee(n)]);this.vision=n,this.modelBuffer=r,this.graphOptions={runningMode:"VIDEO",outputFaceBlendshapes:(e==null?void 0:e.outputFaceBlendshapes)??!0,minFaceDetectionConfidence:e==null?void 0:e.minFaceDetectionConfidence,minFacePresenceConfidence:e==null?void 0:e.minFacePresenceConfidence,minPoseDetectionConfidence:e==null?void 0:e.minPoseDetectionConfidence,minPosePresenceConfidence:e==null?void 0:e.minPosePresenceConfidence,minHandLandmarksConfidence:e==null?void 0:e.minHandLandmarksConfidence},this.delegatePolicy=(e==null?void 0:e.delegate)??"auto",this.delegate=this.delegatePolicy==="CPU"?"CPU":"GPU";const a=await this.createLandmarker(this.delegate);if(this.disposed){a.close();return}this.landmarker=a,this.status="ready"}catch(n){throw this.status="error",this.error=n instanceof Error?n:new Error(String(n)),this.error}}createLandmarker(e){if(!this.vision||!this.modelBuffer)throw new Error("HolisticTrackingModel: initialize() has not loaded the model");return B.HolisticLandmarker.createFromOptions(this.vision,{baseOptions:{modelAssetBuffer:this.modelBuffer,delegate:e},...this.graphOptions})}async fallbackToCpu(e){this.fallbackAttempted=!0,this.rebuilding=!0,this.status="loading",console.warn("[xr-sdk holistic] GPU inference failed; rebuilding the graph on the CPU delegate.",e.message);const n=this.landmarker;try{const r=await this.createLandmarker("CPU");if(this.disposed){r.close();return}this.landmarker=r,this.delegate="CPU",this.status="ready",this.error=null;try{n==null||n.close()}catch{}this.rebuilding=!1,this.detectOnce()}catch(r){this.rebuilding=!1,this.status="error",this.error=r instanceof Error?r:new Error(String(r))}}detectOnce(){this.disposed||!this.landmarker||!this.sourceCanvas||(this.detect(),this.builder.update(this.raw,performance.now(),this.result,this.isMirrored()))}detect(){var r,a,o,c,l;if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),n=performance.now();try{this.raw=this.landmarker.detectForVideo(e,n),this.status==="error"&&(this.status="ready",this.error=null),this.recordInferenceError(null);const h=this.raw,f=((r=h.faceLandmarks)!=null&&r.length?1:0)+((a=h.leftHandLandmarks)!=null&&a.length?1:0)+((o=h.rightHandLandmarks)!=null&&o.length?1:0)+((c=h.poseLandmarks)!=null&&c.length?1:0),u=(l=h.poseLandmarks)==null?void 0:l[0];this.recordDetections(f,u&&u.length?u.reduce((w,S)=>w+(S.visibility??0),0)/u.length:null)}catch(h){const f=h instanceof Error?h:new Error(String(h));this.delegatePolicy==="auto"&&this.delegate==="GPU"&&!this.fallbackAttempted?this.fallbackToCpu(f):(this.status="error",this.error=f,this.recordInferenceError(f))}this.processingTime=performance.now()-n,this.recordInference(n)}isMirrored(){var e;return Se((e=this.getSource)==null?void 0:e.call(this))}async run({sourceCanvas:e,getSource:n,targetFps:r,analysisScale:a}){this.sourceCanvas=e,this.getSource=n,this.setTargetFps(r),this.setAnalysisScale(a),this.downscaler.setScale(this.analysisScale),this.rafId===null&&await this.process()}async process(){this.disposed||this.paused||!this.landmarker||(!this.rebuilding&&this.shouldRunInference()&&this.detect(),this.builder.update(this.raw,performance.now(),this.result,this.isMirrored()),!(this.disposed||this.paused)&&(this.rafId=requestAnimationFrame(this.process.bind(this))))}resume(){this.paused&&(super.resume(),this.process())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.getSource=void 0,this.downscaler.dispose(),this.vision=null,this.modelBuffer=null,this.raw=void 0,this.builder.reset(),this.result.face=null,this.result.leftHand=null,this.result.rightHand=null,this.result.pose=null}getModelNode(){return this.node}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const yn=512;class wn extends te{constructor(){super();d(this,"landmarker",null);d(this,"processingTime",null);d(this,"hands");d(this,"coordinates");d(this,"gesture");d(this,"handedness");d(this,"sourceCanvas");d(this,"downscaler",new de(yn))}async getHandData(){var h,f;if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),n=performance.now(),r=this.landmarker.detectForVideo(e,n),a=performance.now();this.processingTime=a-n,this.recordInference(n,a);const o=[],c=r.handedness??r.handednesses??[];if(this.recordDetections(r.landmarks.length,((f=(h=c[0])==null?void 0:h[0])==null?void 0:f.score)??null),r.landmarks.forEach((u,w)=>{var P,g,v;if(!u||u.length===0)return;const S=u.map(y=>ce(y)),C=(v=(g=(P=c[w])==null?void 0:P[0])==null?void 0:g.categoryName)==null?void 0:v.toLowerCase(),x=C==="left"||C==="right"?C:void 0,b=u[0].z<0?"closed_fist":"open_palm";o.push({coordinates:S,gesture:b,handedness:x})}),!o.length)return{hands:void 0,coordinates:void 0,gesture:void 0,handedness:void 0};const l=o[0];return{hands:o,coordinates:l.coordinates,gesture:l.gesture,handedness:l.handedness}}async processHandTracking(){if(!this.disposed){if(this.shouldRunInference()){const e=await this.getHandData();e&&(this.hands=e.hands,this.coordinates=e.coordinates,this.gesture=e.gesture,this.handedness=e.handedness)}this.disposed||this.paused||(this.rafId=requestAnimationFrame(this.processHandTracking.bind(this)))}}resume(){this.paused&&(super.resume(),this.processHandTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.hands=void 0,this.downscaler.dispose(),this.coordinates=void 0,this.gesture=void 0,this.handedness=void 0}async initialize(){const e=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),[n]=await Promise.all([J(new URL("/assets/xr/models/hand_tracking.task",N.assetStorageEndpoint).toString()),ee(e)]),r=await B.HandLandmarker.createFromOptions(e,{baseOptions:{modelAssetBuffer:n,delegate:"GPU"},runningMode:"VIDEO",numHands:2});this.landmarker=r}async run({sourceCanvas:e,targetFps:n,analysisScale:r}){this.setAnalysisScale(r),this.downscaler.setScale(this.analysisScale),this.sourceCanvas=e,this.setTargetFps(n),this.rafId===null&&await this.processHandTracking()}getModelNode(){const e=this;return{get hands(){return e.hands},get coordinates(){return e.coordinates},get gesture(){return e.gesture},get handedness(){return e.handedness}}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const vn=24,Sn=720,Mn=[[255,255,255,255],[0,0,0,0]];class Cn extends te{constructor(){super();d(this,"segmenter",null);d(this,"processingTime",null);d(this,"sourceCanvas");d(this,"processCanvas");d(this,"filterCanvas");d(this,"inputSource");d(this,"inputSourceSize");d(this,"glCanvas");d(this,"drawingUtils");d(this,"useGpuMaskPath",!1);d(this,"maskImageData");d(this,"maskCanvas",null);d(this,"segmentationMaskTexture");d(this,"isMaskSetup",!1);d(this,"isProcessing",!1);d(this,"latestMask",null);d(this,"rawCache",null);d(this,"quality","medium");d(this,"stagingCanvas")}getQualityScaleFactor(){switch(this.quality){case"low":return .5;case"medium":return .75;case"high":return 1;default:return .5}}setInputSource(e){this.inputSource=e,this.inputSourceSize=e?this.readIntrinsicSize(e):void 0}readIntrinsicSize(e){if(e instanceof HTMLVideoElement)return e.videoWidth>0?{width:e.videoWidth,height:e.videoHeight}:void 0;if(e instanceof HTMLImageElement)return e.naturalWidth>0?{width:e.naturalWidth,height:e.naturalHeight}:void 0;const n=e.width,r=e.height;return typeof n=="number"&&n>0&&typeof r=="number"&&r>0?{width:n,height:r}:void 0}ensureProcessCanvasForInput(){if(!this.processCanvas||!this.inputSource)return;const e=this.readIntrinsicSize(this.inputSource);if(!e)return;this.inputSourceSize=e;const n=Math.min(1,Sn/Math.max(e.width,e.height)),r=Math.max(1,Math.round(e.width*n)),a=Math.max(1,Math.round(e.height*n));this.processCanvas.width===r&&this.processCanvas.height===a||(this.processCanvas.width=r,this.processCanvas.height=a,this.glCanvas&&(this.glCanvas.width=r,this.glCanvas.height=a),this.maskImageData=void 0)}async processSegmentation(){if(this.disposed||!this.isProcessing||!this.maskCanvas||!this.processCanvas)return;if(!this.shouldRunInference()){if(this.disposed||this.paused)return;this.rafId=requestAnimationFrame(this.processSegmentation.bind(this));return}const e=this.inputSource??this.sourceCanvas;if(!this.segmenter||!e){if(this.disposed||this.paused)return;this.rafId=requestAnimationFrame(this.processSegmentation.bind(this));return}const n=performance.now();this.ensureProcessCanvasForInput();const r=this.processCanvas.getContext("2d");if(r){const c=this.processCanvas.width,l=this.processCanvas.height;if(r.clearRect(0,0,c,l),this.inputSource&&this.inputSourceSize){const{width:h,height:f}=this.inputSourceSize,u=Math.min(c/h,l/f),w=h*u,S=f*u;r.drawImage(this.inputSource,(c-w)/2,(l-S)/2,w,S)}else r.drawImage(e,0,0,c,l)}const o=this.segmenter.segmentForVideo(this.processCanvas,performance.now()).categoryMask;if(!o){if(this.disposed||this.paused)return;this.rafId=requestAnimationFrame(this.processSegmentation.bind(this));return}if(this.rawCache=null,this.latestMask&&(this.latestMask.close(),this.latestMask=null),this.useGpuMaskPath&&this.drawingUtils&&this.glCanvas)this.drawingUtils.drawCategoryMask(o,Mn),this.latestMask=o.clone(),o.close(),this.blitGlToMask();else{this.latestMask=o.clone();const c=this.readMaskToImageData(o);o.close(),c&&this.blitImageDataToMask(c)}this.segmentationMaskTexture&&(this.isMaskSetup||(this.segmentationMaskTexture.format=X.RGBAFormat,this.segmentationMaskTexture.minFilter=X.LinearFilter,this.segmentationMaskTexture.magFilter=X.LinearFilter,this.segmentationMaskTexture.generateMipmaps=!1,this.isMaskSetup=!0),this.segmentationMaskTexture.needsUpdate=!0),this.processingTime=performance.now()-n,this.recordInference(n),this.recordDetections(1,null),!(this.disposed||this.paused)&&(this.rafId=requestAnimationFrame(this.processSegmentation.bind(this)))}blitGlToMask(){if(!this.maskCanvas||!this.filterCanvas||!this.glCanvas)return;const e=this.maskCanvas.getContext("2d"),n=this.filterCanvas.getContext("2d");!e||!n||(n.filter="blur(0.5px)",n.clearRect(0,0,this.filterCanvas.width,this.filterCanvas.height),n.drawImage(this.glCanvas,0,0,this.filterCanvas.width,this.filterCanvas.height),e.clearRect(0,0,this.maskCanvas.width,this.maskCanvas.height),e.drawImage(this.filterCanvas,0,0,this.maskCanvas.width,this.maskCanvas.height))}readMaskToImageData(e){const n=e.getAsUint8Array(),{width:r,height:a}=e;if(!n||r<=0||a<=0)return null;(!this.maskImageData||this.maskImageData.width!==r||this.maskImageData.height!==a)&&(this.maskImageData=new ImageData(r,a));const o=this.maskImageData.data;for(let c=0;c<n.length;c+=1){const l=n[c]===255?0:255;o[c*4]=255,o[c*4+1]=l,o[c*4+2]=255,o[c*4+3]=l}return this.maskImageData}blitImageDataToMask(e){if(!this.maskCanvas||!this.filterCanvas)return;const n=this.maskCanvas.getContext("2d"),r=this.filterCanvas.getContext("2d");if(!n||!r)return;const a=this.getStagingCanvas(e.width,e.height),o=a.getContext("2d");o&&(o.putImageData(e,0,0),r.filter="blur(0.5px)",r.clearRect(0,0,this.filterCanvas.width,this.filterCanvas.height),r.drawImage(a,0,0,this.filterCanvas.width,this.filterCanvas.height),n.clearRect(0,0,this.maskCanvas.width,this.maskCanvas.height),n.drawImage(this.filterCanvas,0,0,this.maskCanvas.width,this.maskCanvas.height))}getStagingCanvas(e,n){return this.stagingCanvas||(this.stagingCanvas=document.createElement("canvas")),this.stagingCanvas.width!==e&&(this.stagingCanvas.width=e),this.stagingCanvas.height!==n&&(this.stagingCanvas.height=n),this.stagingCanvas}resume(){this.paused&&(super.resume(),this.processSegmentation())}dispose(){if(super.dispose(),this.isProcessing=!1,this.latestMask){try{this.latestMask.close()}catch{}this.latestMask=null}if(this.rawCache=null,this.segmenter){try{this.segmenter.close()}catch{}this.segmenter=null}this.drawingUtils=void 0,this.glCanvas=void 0,this.maskImageData=void 0,this.segmentationMaskTexture&&(this.segmentationMaskTexture.dispose(),this.segmentationMaskTexture=void 0),this.sourceCanvas=void 0,this.inputSource=void 0,this.inputSourceSize=void 0,this.processCanvas=void 0,this.filterCanvas=void 0,this.stagingCanvas=void 0,this.maskCanvas=null}async initialize(e){this.quality=(e==null?void 0:e.quality)??"low";const n=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),[r]=await Promise.all([J(new URL("/assets/xr/models/segmentation.tflite",N.assetStorageEndpoint).toString()),ee(n)]);this.glCanvas=new OffscreenCanvas(1,1);const a=this.glCanvas.getContext("webgl2",{preserveDrawingBuffer:!0});this.segmenter=await B.ImageSegmenter.createFromOptions(n,{baseOptions:{modelAssetBuffer:r,delegate:"GPU"},...a?{canvas:this.glCanvas}:{},outputCategoryMask:!0,outputConfidenceMasks:!1,runningMode:"VIDEO"}),a?(this.drawingUtils=new B.DrawingUtils(a),this.useGpuMaskPath=!0):this.useGpuMaskPath=!1}async run({sourceCanvas:e,renderWidth:n,renderHeight:r,targetFps:a}){var c;if(!e)return;this.setTargetFps(a??vn),this.isProcessing=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null);const o=this.getQualityScaleFactor();this.sourceCanvas=e,this.processCanvas=document.createElement("canvas"),this.processCanvas.width=e.width*o,this.processCanvas.height=e.height*o,this.glCanvas&&(this.glCanvas.width=this.processCanvas.width,this.glCanvas.height=this.processCanvas.height),this.maskImageData=void 0,this.maskCanvas=document.createElement("canvas"),this.maskCanvas.width=n,this.maskCanvas.height=r,this.filterCanvas=document.createElement("canvas"),this.filterCanvas.width=n,this.filterCanvas.height=r,(c=this.segmentationMaskTexture)==null||c.dispose(),this.segmentationMaskTexture=new X.CanvasTexture(this.maskCanvas),this.isMaskSetup=!1,this.rawCache=null,this.isProcessing=!0,this.lastInferenceMs=0,this.rafId=requestAnimationFrame(this.processSegmentation.bind(this))}getRawSegmentationData(){if(this.rawCache)return this.rawCache;if(!this.latestMask)return null;const e=this.latestMask.getAsUint8Array();return this.rawCache={maskData:e,width:this.latestMask.width,height:this.latestMask.height},this.rawCache}getModelNode(){const e=this;return{get backgroundSegmentationMask(){return e.segmentationMaskTexture},getMaskCanvas:()=>e.maskCanvas,getRawSegmentationData:()=>e.getRawSegmentationData(),setInputSource:n=>e.setInputSource(n??void 0)}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const Ft=(t,s,e,n="feed")=>({width:Math.max(1,Math.round(t)),height:Math.max(1,Math.round(s)),indices:new Uint8Array(Math.max(1,Math.round(t))*Math.max(1,Math.round(s))),labels:e,space:n,version:0}),kn=t=>{t.indices.fill(0)},xn=(t,s)=>t.labels.indexOf(s),It=(t,s,e)=>{const{width:n,height:r,indices:a}=t,o=s.length;if(o<3)return;let c=1/0,l=-1/0;for(let w=0;w<o;w+=1){const S=s[w].y*r;S<c&&(c=S),S>l&&(l=S)}const h=Math.max(0,Math.floor(c)),f=Math.min(r-1,Math.ceil(l)),u=[];for(let w=h;w<=f;w+=1){const S=w+.5;u.length=0;for(let x=0;x<o;x+=1){const b=s[x],P=s[(x+1)%o],g=b.y*r,v=P.y*r;if(S<g==S<v)continue;const y=(S-g)/(v-g);u.push((b.x+y*(P.x-b.x))*n)}u.sort((x,b)=>x-b);const C=w*n;for(let x=0;x+1<u.length;x+=2){const b=Math.max(0,Math.round(u[x])),P=Math.min(n,Math.round(u[x+1]));for(let g=b;g<P;g+=1)a[C+g]=e}}},Tn=(t,s,e,n,r=[])=>{r.length=0;for(let a=0;a<e.length;a+=1){const o=s[e[a]];if(!o)return;r.push(o)}It(t,r,n)},mt=t=>t,Oe={hair:{labels:["bg","hair"],assetPath:"/assets/xr/models/hair_segmenter.tflite",defaultUrl:"https://storage.googleapis.com/mediapipe-models/image_segmenter/hair_segmenter/float32/latest/hair_segmenter.tflite",decode:mt},multiclass:{labels:["bg","hair","body_skin","face_skin","clothes","others"],assetPath:"/assets/xr/models/selfie_multiclass_256x256.tflite",defaultUrl:"https://storage.googleapis.com/mediapipe-models/image_segmenter/selfie_multiclass_256x256/float32/latest/selfie_multiclass_256x256.tflite",decode:mt}},bn=(t,s,e)=>{const n=e.length===t.length?e:new Uint8Array(t.length);for(let r=0;r<t.length;r+=1)n[r]=s(t[r]);return n},En=15,Rn={low:.5,medium:.75,high:1};class An extends te{constructor(){super();d(this,"segmenter",null);d(this,"preset","hair");d(this,"quality","medium");d(this,"status","loading");d(this,"error",null);d(this,"processingTime",null);d(this,"sourceCanvas");d(this,"processCanvas");d(this,"isProcessing",!1);d(this,"mask",Ft(1,1,["bg"]));d(this,"node");this.node={getMask:()=>this.mask,getStatus:()=>this.status,getError:()=>this.error}}async initialize(e){this.preset=(e==null?void 0:e.preset)??"hair",this.quality=(e==null?void 0:e.quality)??"medium";const n=Oe[this.preset];this.mask.labels=n.labels,this.status="loading",this.error=null;try{const r=await B.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",N.assetStorageEndpoint).toString()),a=(e==null?void 0:e.modelUrl)??n.defaultUrl,[o]=await Promise.all([J(a),ee(r)]);this.segmenter=await B.ImageSegmenter.createFromOptions(r,{baseOptions:{modelAssetBuffer:o,delegate:"GPU"},outputCategoryMask:!0,outputConfidenceMasks:!1,runningMode:"VIDEO"}),this.status="ready"}catch(r){throw this.status="error",this.error=r instanceof Error?r:new Error(String(r)),this.error}}async run({sourceCanvas:e,targetFps:n}){e&&(this.setTargetFps(n??En),this.isProcessing=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.sourceCanvas=e,this.processCanvas=document.createElement("canvas"),this.isProcessing=!0,this.lastInferenceMs=0,this.rafId=requestAnimationFrame(this.process.bind(this)))}process(){if(this.disposed||this.paused||!this.isProcessing)return;const{segmenter:e,sourceCanvas:n,processCanvas:r}=this;if(!e||!n||!r||!this.shouldRunInference()){this.rafId=requestAnimationFrame(this.process.bind(this));return}const a=performance.now(),o=Rn[this.quality],c=Math.max(1,Math.round(n.width*o)),l=Math.max(1,Math.round(n.height*o));(r.width!==c||r.height!==l)&&(r.width=c,r.height=l);const h=r.getContext("2d");h&&h.drawImage(n,0,0,c,l);try{const u=e.segmentForVideo(r,performance.now()).categoryMask;if(u){const w=u.getAsUint8Array();(this.mask.width!==u.width||this.mask.height!==u.height)&&(this.mask.width=u.width,this.mask.height=u.height),this.mask.indices=bn(w,Oe[this.preset].decode,this.mask.indices),this.mask.version+=1,u.close()}this.status==="error"&&(this.status="ready",this.error=null),this.recordInferenceError(null),this.recordDetections(u?1:0,null)}catch(f){this.status="error",this.error=f instanceof Error?f:new Error(String(f)),this.recordInferenceError(this.error)}this.processingTime=performance.now()-a,this.recordInference(a),!(this.disposed||this.paused)&&(this.rafId=requestAnimationFrame(this.process.bind(this)))}resume(){this.paused&&(super.resume(),this.isProcessing&&(this.rafId=requestAnimationFrame(this.process.bind(this))))}getModelNode(){return this.node}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}dispose(){var e;super.dispose(),this.isProcessing=!1;try{(e=this.segmenter)==null||e.close()}catch{}this.segmenter=null,this.sourceCanvas=void 0,this.processCanvas=void 0}}const ft={[E.BACKGROUND_SEGMENTATION]:Cn,[E.SEMANTIC_SEGMENTATION]:An,[E.HAND_TRACKER]:wn,[E.GESTURE_TRACKER]:gn,[E.FACE_TRACKER]:dn,[E.BODY_TRACKER]:an,[E.HOLISTIC_TRACKER]:pn},Fn=async t=>{const s=document.createElement("video");s.srcObject=t,s.muted=!0,s.playsInline=!0,s.autoplay=!0,await new Promise(n=>{s.onloadedmetadata=()=>{s.play(),n()}});const e=s;return await new Promise(n=>{const r=setTimeout(n,150),a=()=>{clearTimeout(r),n()};typeof e.requestVideoFrameCallback=="function"?e.requestVideoFrameCallback(a):requestAnimationFrame(()=>requestAnimationFrame(()=>a()))}),s},In=t=>{const s=new X.CanvasTexture(t);return s.colorSpace=X.SRGBColorSpace,s.format=X.RGBAFormat,s.minFilter=X.LinearFilter,s.magFilter=X.LinearFilter,s.generateMipmaps=!1,s.needsUpdate=!0,s},_n=(t,s)=>{const e=t.videoWidth,n=t.videoHeight;e>0&&n>0&&(s.width!==e&&(s.width=e),s.height!==n&&(s.height=n));const r=s.getContext("2d",{colorSpace:"srgb"});r.save(),r.scale(-1,1),r.drawImage(t,-s.width,0,s.width,s.height),r.restore()},Pn=(t,s,e=1)=>{const n=s.getContext("2d",{colorSpace:"srgb"}),r=xt({source:{width:t.width,height:t.height},feed:{width:s.width,height:s.height},zoom:e});r&&(n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,s.width,s.height),n.drawImage(t,0,0,t.width,t.height,r.offsetX,r.offsetY,r.drawWidth,r.drawHeight))},Ln=(t,s,e)=>{const n=new Map,r=new WeakSet;let a=!1;const o=(g,v)=>{const y=t.getSnapshot().modelErrors;if(v===null&&!y.has(g))return;const k=new Map(y);v===null?k.delete(g):k.set(g,{model:g,error:v,at:performance.now()}),t.set({modelErrors:k})},c=(g,v)=>{var y;try{(y=v.dispose)==null||y.call(v)}catch(k){console.warn(`[xr-sdk registry] dispose threw for ${g}`,k)}};return{acquire:async(g,v,y)=>{let k=n.get(g);if(k)return k.refs.add(v),k.activeRefs.add(v),k.initPromise;const z=s[g];if(!z)throw new Error(`Invalid model: ${g}`);const R=new z,K=new Set([v]),G=new Set([v]);o(g,null);const D=(async()=>{await R.initialize(y);const A=n.get(g);if(!A||A.model!==R||A.refs.size===0)return c(g,R),R;e&&await e(g,R);const V=n.get(g);return V&&V.refs.size>0&&(r.add(R),t.setPipeline(Q=>Q.set(g,R))),R})();return k={model:R,refs:K,activeRefs:G,initPromise:D,options:y},n.set(g,k),D.catch(A=>{n.get(g)===k&&(n.delete(g),t.setPipeline(Q=>Q.delete(g)),o(g,A instanceof Error?A:new Error(String(A)))),c(g,R)}),D},release:(g,v)=>{const y=n.get(g);y&&(y.refs.delete(v),y.activeRefs.delete(v)&&y.refs.size>0&&y.activeRefs.size===0&&y.model.pause(),!(y.refs.size>0)&&(n.delete(g),c(g,y.model),t.setPipeline(k=>k.delete(g))))},setActive:(g,v,y)=>{const k=n.get(g);if(!k||!k.refs.has(v))return;const z=k.activeRefs.size>0;y?k.activeRefs.add(v):k.activeRefs.delete(v);const R=k.activeRefs.size>0;z!==R&&(R&&!a?k.model.resume():k.model.pause())},suspendAll:()=>{a=!0;for(const g of n.values())g.model.pause()},resumeActive:()=>{a=!1;for(const g of n.values())g.activeRefs.size>0&&g.model.resume()},get:g=>{var v;return(v=n.get(g))==null?void 0:v.model},getOptions:g=>{var v;return(v=n.get(g))==null?void 0:v.options},releaseAll:()=>{for(const g of Array.from(n.keys())){const v=n.get(g);v&&(v.refs.clear(),n.delete(g),c(g,v.model))}t.setPipeline(g=>g.clear())},getState:g=>{const v=n.get(g);return v?r.has(v.model)?"ready":"initializing":t.getSnapshot().modelErrors.has(g)?"error":"idle"},getOwners:g=>{const v=n.get(g);return{refs:v?Array.from(v.refs):[],active:v?Array.from(v.activeRefs):[]}}}},Dn={lifecycle:"idle",ready:!1,error:void 0,cameraTexture:void 0,renderWidth:0,renderHeight:0,source:void 0,sourceKind:void 0,cameraFacing:null,cameraDeviceId:null,orientation:{type:"portrait",angle:0},quality:null,qualityConfig:null,sourceWidth:0,sourceHeight:0,cameraZoom:1.2,pipeline:new Map,modelErrors:new Map,cameraPermission:"unknown",cameraPermissionReason:null,feedFrames:0},On=()=>{let t={...Dn,pipeline:new Map,modelErrors:new Map};const s=new Set,e=()=>{s.forEach(n=>n())};return{getSnapshot:()=>t,set:n=>{let r=!1;for(const a of Object.keys(n))if(n[a]!==t[a]){r=!0;break}r&&(t={...t,...n},e())},setPipeline:n=>{const r=new Map(t.pipeline);return n(r),t={...t,pipeline:r},e(),r},subscribe:n=>(s.add(n),()=>{s.delete(n)})}},gt=(t,s)=>s??t==="user",Un=({renderHeight:t,renderWidth:s,videoHeight:e,videoWidth:n})=>({height:t||e,width:s||n}),Hn=(t,s)=>{const e=new Ys({verbose:!0}),n=On();n.set({cameraZoom:(t==null?void 0:t.cameraZoom)??1.2});let r=s,a=t;const o=i=>{var p;const m=(p=q.getOptions(i))==null?void 0:p.targetFps;return typeof m=="number"?m:a==null?void 0:a.targetFps};let c,l,h,f,u,w,S,C,x,b,P,g,v=!1,y=!1,k=!1,z=0,R,K,G,D=!1,A=0,V=new WeakSet;const Q=new Set,he=i=>{const m=n.getSnapshot().cameraTexture;m&&m.dispose();const p=In(i);return n.set({cameraTexture:p}),p},Me=async(i,m)=>{if(V.has(m)||n.getSnapshot().lifecycle!=="running"||!u)return;V.add(m);const p=A;try{await m.run({sourceCanvas:u,renderWidth:n.getSnapshot().renderWidth,renderHeight:n.getSnapshot().renderHeight,getSource:()=>n.getSnapshot().sourceKind,targetFps:o(i),analysisScale:a==null?void 0:a.analysisScale}),D&&(await new Promise(M=>requestAnimationFrame(()=>M())),await new Promise(M=>requestAnimationFrame(()=>M())),D&&A===p&&q.suspendAll())}catch(M){throw V.delete(m),M}},q=Ln(n,ft,(i,m)=>Me(i,m));n.subscribe(()=>{if(n.getSnapshot().lifecycle!=="running")return;const i=n.getSnapshot().pipeline;for(const[m,p]of i.entries())V.has(p)||Me(m,p)});const Qe=()=>{g!==void 0&&(cancelAnimationFrame(g),g=void 0)},se=()=>{if(Qe(),R==null||R(),R=void 0,l){try{l.pause()}catch{}try{l.srcObject=null}catch{}l=void 0}if(h){try{h.getTracks().forEach(i=>i.stop())}catch{}h=void 0}},Ce=()=>{if(v||!l||!f||!u)return;const i=typeof window<"u"?window.__xr_debugger_metrics:void 0;if(i!=null&&i.trackCameraFrame&&i.trackCameraFrame(),Se(n.getSnapshot().sourceKind))_n(l,f);else{const T=f.getContext("2d");if(!T)return;const L=l.videoWidth,O=l.videoHeight;f.width!==L&&(f.width=L),f.height!==O&&(f.height=O),T.setTransform(1,0,0,1,0,0),T.clearRect(0,0,L,O),T.drawImage(l,0,0,L,O)}Pn(f,u,(a==null?void 0:a.cameraZoom)??1.2);const p=n.getSnapshot();(p.sourceWidth!==l.videoWidth||p.sourceHeight!==l.videoHeight)&&n.set({sourceWidth:l.videoWidth,sourceHeight:l.videoHeight}),z+=1,z%10===0&&n.set({feedFrames:z});const M=n.getSnapshot().cameraTexture;M&&(M.needsUpdate=!0)},ke=()=>{if(!l||!f||!u)return;if(D){Ce();return}const i=()=>{g=requestAnimationFrame(i),Ce()};g=requestAnimationFrame(i)},Xt=async(i,m)=>{if(i.source===F.WEBCAM)try{const p=a!=null&&a.camRes&&a.camRes>0?a.camRes:960;n.set({cameraPermission:"requesting",cameraPermissionReason:null});const M=i.deviceId?{deviceId:{exact:i.deviceId}}:{facingMode:{ideal:i.facingMode??"user"}},T={frameRate:{min:24,ideal:30,max:60},width:{ideal:p},...M};let L;try{L=await navigator.mediaDevices.getUserMedia({video:T})}catch(O){if(!(O instanceof DOMException&&O.name==="OverconstrainedError"))throw O;L=await navigator.mediaDevices.getUserMedia({video:{frameRate:{ideal:30},width:{ideal:p},...M}})}return m===A&&n.set({cameraPermission:"granted",cameraPermissionReason:null}),L}catch(p){const M=ze(p),T=ut[M],L=await We(),O=qe(M,L.state);throw m===A&&n.set({error:{error:"PermissionError",message:T,reason:M},cameraPermission:O.state,cameraPermissionReason:O.reason}),new U(p instanceof Error?p.message:"getUserMedia failed")}return i.stream},Ye=i=>{const{lifecycle:m}=n.getSnapshot();m==="idle"||m==="stopped"||v||(se(),q.suspendAll(),A+=1,c=void 0,n.set({lifecycle:"stopped",ready:!1,error:{error:"PermissionError",message:ut[i],reason:i},cameraPermission:i==="permission-denied"?"blocked":"unavailable",cameraPermissionReason:Be(i)}),e.log("XR session stopped: camera lost.",i))},Gt=i=>{var M;R==null||R();const m=((M=i.getVideoTracks)==null?void 0:M.call(i))??[],p=()=>{h===i&&Ye("camera-lost")};m.forEach(T=>{var L;return(L=T.addEventListener)==null?void 0:L.call(T,"ended",p)}),R=()=>{m.forEach(T=>{var L;return(L=T.removeEventListener)==null?void 0:L.call(T,"ended",p)})}},Qt=async()=>{if(K||typeof navigator>"u")return;const i=navigator.permissions;if(i!=null&&i.query)try{const m=await i.query({name:"camera"});if(y)return;K=m,G=()=>{m.state==="denied"&&(c==null?void 0:c.source)===F.WEBCAM&&Ye("permission-denied")},m.addEventListener("change",G)}catch{}},Yt=()=>{var i;K&&G&&((i=K.removeEventListener)==null||i.call(K,"change",G)),K=void 0,G=void 0},xe=async i=>{var it,me,ot;const m=A,p=await Xt(i,m);if(m!==A)throw p.getTracks().forEach(ie=>ie.stop()),new U("Media source superseded by a newer bind");h=p,Gt(p);const M=await Fn(p);if(m!==A||y)throw p.getTracks().forEach(ie=>ie.stop()),new U("Media source superseded by a newer bind");l=M,f=new OffscreenCanvas(M.videoWidth,M.videoHeight);const{renderWidth:T,renderHeight:L}=n.getSnapshot(),O=Un({renderWidth:T,renderHeight:L,videoWidth:M.videoWidth,videoHeight:M.videoHeight});u?(u.width!==O.width||u.height!==O.height)&&(u.width=O.width,u.height=O.height,he(u)):(u=new OffscreenCanvas(O.width,O.height),he(u));const at=i.source===F.STREAM?i.static===!0:!1;D=at;const ae=(ot=(me=(it=p.getVideoTracks)==null?void 0:it.call(p)[0])==null?void 0:me.getSettings)==null?void 0:ot.call(me),Ae=ae==null?void 0:ae.facingMode,vs=Ae==="user"||Ae==="environment"?Ae:null;if(i.source===F.WEBCAM){const ie=vs??i.facingMode??"user",ct=gt(ie,i.mirrored);c={source:F.WEBCAM,sourceKind:ct?"webcam":"rear-camera",facingMode:ie,deviceId:i.deviceId,mirrored:ct}}else c={source:F.STREAM,stream:i.stream,static:at,sourceKind:i.sourceKind??"webcam"};n.set({source:i.source,sourceKind:c.sourceKind,cameraFacing:c.source===F.WEBCAM?c.facingMode:null,cameraDeviceId:c.source===F.WEBCAM?(ae==null?void 0:ae.deviceId)??c.deviceId??null:null,sourceWidth:M.videoWidth,sourceHeight:M.videoHeight,error:void 0}),i.source===F.WEBCAM&&Qt()},Te=async i=>{const m=i.sourceKind??"webcam";u=i.canvas;const p=he(u);n.set({cameraTexture:p,source:F.CANVAS,sourceKind:m,cameraFacing:null,cameraDeviceId:null,renderWidth:u.width,renderHeight:u.height,error:void 0}),c={source:F.CANVAS,canvas:i.canvas,sourceKind:m}},jt=(i,m)=>{if(!m||i.source!==m.source)return!1;if(i.source===F.STREAM&&m.source===F.STREAM)return i.stream===m.stream&&(i.sourceKind??"webcam")===m.sourceKind;if(i.source===F.WEBCAM&&m.source===F.WEBCAM){const p=i.facingMode??"user";return p===m.facingMode&&i.deviceId===m.deviceId&&gt(p,i.mirrored)===m.mirrored}return!1},je=async()=>{if(!u)return;const i=A,m=n.getSnapshot().pipeline;for(const[,p]of m.entries())p.resume();await new Promise(p=>requestAnimationFrame(()=>p())),await new Promise(p=>requestAnimationFrame(()=>p())),D&&A===i&&q.suspendAll()},Zt=(i,m)=>!m||m.source!==F.CANVAS?!1:i.canvas===m.canvas&&(i.sourceKind??"webcam")===m.sourceKind,be=async i=>{const m=i.source;if(m!==F.WEBCAM&&m!==F.STREAM)throw new U(`Invalid media source: ${String(m)}`);if(y)throw new U("session.setMediaSource() called after the provider unmounted");if(jt(i,c)){e.log("Media source unchanged, skipping rebind.");return}A+=1;const{lifecycle:p}=n.getSnapshot();if(p==="idle"||p==="stopped"){await xe(i),n.set({lifecycle:"media-bound"}),e.log("Media source set to:",i.source);return}if(p==="media-bound"){se(),await xe(i),e.log("Media source rebound to:",i.source);return}const M=p==="paused";v=!0,await new Promise(T=>requestAnimationFrame(()=>T())),se();try{await xe(i)}finally{v=!1}if(M){l==null||l.pause(),e.log("Media source swapped (paused) to:",i.source);return}ke(),D?await je():q.resumeActive(),e.log("Media source swapped to:",i.source)},$t=async i=>{if(y)throw new U("session.setFrameSource() called after the provider unmounted");if(Zt(i,c)){e.log("Frame source unchanged, skipping rebind.");return}A+=1;const{lifecycle:m}=n.getSnapshot();if(m==="idle"||m==="stopped"){await Te(i),n.set({lifecycle:"media-bound"}),e.log("Frame source set to canvas.");return}if(m==="media-bound"){se(),await Te(i),e.log("Frame source rebound to canvas.");return}v=!0,await new Promise(p=>requestAnimationFrame(()=>p())),se();try{await Te(i)}finally{v=!1}e.log("Frame source swapped to canvas.")},Ze=async()=>{if(y)throw new U("session.start() called after the provider unmounted");const{lifecycle:i}=n.getSnapshot();if(i==="running")return;if(i==="paused"){await Ee();return}if(i==="idle")throw new U("session.start() called before setMediaSource — call setMediaSource first");if(!u)throw new U("session.start(): media source not bound");const m=(c==null?void 0:c.source)===F.CANVAS;if(!m&&(!l||!f))throw i==="stopped"?new U("session.start() called from stopped state without a media source — call setMediaSource first"):new U("session.start(): media source not bound");m||ke(),q.resumeActive(),n.set({lifecycle:"running"}),await new Promise(M=>requestAnimationFrame(()=>M()));const p=n.getSnapshot().pipeline;for(const[M,T]of p.entries())await Me(M,T);n.set({ready:!0}),e.log("XR session started.")},$e=()=>{if(n.getSnapshot().lifecycle==="running"){Qe(),q.suspendAll();try{l==null||l.pause()}catch{}n.set({lifecycle:"paused"}),e.log("XR session paused.")}},Ee=async()=>{if(y)throw new U("session.resume() called after the provider unmounted");n.getSnapshot().lifecycle==="paused"&&(k=!1,l&&l.play().catch(()=>{}),(c==null?void 0:c.source)!==F.CANVAS&&ke(),n.set({lifecycle:"running"}),D?await je():q.resumeActive(),e.log("XR session resumed."))},Jt=async(i={})=>{await be({source:F.WEBCAM,...i});const{lifecycle:m}=n.getSnapshot();return(m==="media-bound"||m==="stopped")&&await Ze(),n.getSnapshot().cameraFacing??i.facingMode??"user"},Je=async()=>{const{lifecycle:i}=n.getSnapshot();i==="stopped"||i==="idle"||(k=!1,se(),q.suspendAll(),c=void 0,n.set({lifecycle:"stopped",ready:!1}),e.log("XR session stopped."))},et=async()=>{await Je(),q.releaseAll(),Q.clear();const i=n.getSnapshot().cameraTexture;i&&i.dispose(),V=new WeakSet,c=void 0,A+=1,u=void 0,f=void 0,S=void 0,D=!1,Yt(),n.set({lifecycle:"idle",cameraTexture:void 0,source:void 0,sourceKind:void 0,cameraFacing:null,cameraDeviceId:null,error:void 0,modelErrors:new Map,cameraPermission:"unknown",cameraPermissionReason:null}),e.log("XR session reset.")},es=async()=>{y||(y=!0,re==null||re(),re=void 0,ne==null||ne(),ne=void 0,await et(),e.log("XR session disposed."))},ts=()=>{y&&(y=!1,rt(),nt(),e.log("XR session re-armed."))},ss=()=>y,ns=async i=>{const m="legacy:registerXRPipeline",p=[];await Promise.all(i.map(async M=>{const{model:T}=M;if(!ft[T])throw new U(`Invalid model: ${T}`);Q.has(T)||p.push(T);const L="options"in M?M.options:void 0;await q.acquire(T,m,L)})),p.length>0&&(p.forEach(M=>Q.add(M)),e.log("XR pipeline registered."))},rs=i=>{const m=q.get(i);if(!m)throw new U(`Model ${i} is not registered in the pipeline`);return m.getModelNode()},tt=async(i,m)=>{i<=0||m<=0||(n.set({renderWidth:i,renderHeight:m}),u&&(u.width!==i||u.height!==m)&&(u.width=i,u.height=m,he(u),D&&Ce()),e.log(`Source canvas set. Render size: ${i}x${m}`))},as=async i=>{var T;w=i;const m=(T=i.getBoundingClientRect)==null?void 0:T.call(i),p=m&&m.width>0?Math.round(m.width):i.clientWidth,M=m&&m.height>0?Math.round(m.height):i.clientHeight;await tt(p,M)},is=i=>{S=i},Re=()=>w&&C&&x&&b?w:S,os=i=>{C=i.renderer,x=i.scene,b=i.camera,P=i.renderFrame},st=()=>{if(!C||!x||!b)throw new U("XR frame render requested before the R3F state was bound — make sure <XRScene> is mounted");P?P():C.render(x,b)},cs=()=>{const i=w;if(i&&Re()===i)return st(),i.toDataURL("image/png");const m=Re();if(m)return m.toDataURL("image/png");throw new U("session.captureFrame() called before an XRScene or XRMediaSurface capture target was bound")},ls=(i=30)=>{const m=Re();if(!(m!=null&&m.captureStream))throw new U("session.captureStream() called before an XRScene or XRMediaSurface capture target was bound");return m.captureStream(i)},ds=()=>l,us=()=>u??null,hs=i=>{if(a=i,n.set({cameraZoom:(i==null?void 0:i.cameraZoom)??1.2}),n.getSnapshot().lifecycle!=="running"||!u)return;const m=n.getSnapshot().pipeline;for(const[p,M]of m.entries())M.run({sourceCanvas:u,renderWidth:n.getSnapshot().renderWidth,renderHeight:n.getSnapshot().renderHeight,getSource:()=>n.getSnapshot().sourceKind,targetFps:o(p),analysisScale:a==null?void 0:a.analysisScale})},ms=()=>a,fs=async()=>{if(!c||c.source!==F.WEBCAM)return;const{facingMode:i,deviceId:m,mirrored:p}=c;c=void 0,await be({source:F.WEBCAM,facingMode:i,deviceId:m,mirrored:p})},gs=i=>{n.set({quality:i})},ps=i=>{n.set({qualityConfig:i})},ys=i=>{r=i},ws=()=>{var T;if(typeof window>"u")return{type:"portrait",angle:0};const i=(T=window.screen)==null?void 0:T.orientation,m=(i==null?void 0:i.angle)??0,p=m===90||m===180||m===270?m:0;return{type:i!=null&&i.type?i.type.startsWith("landscape")?"landscape":"portrait":window.innerWidth>window.innerHeight?"landscape":"portrait",angle:p}},le=()=>{const i=ws(),m=n.getSnapshot().orientation,p=m.type!==i.type||m.angle!==i.angle?{orientation:i}:{};l&&l.videoWidth>0&&(p.sourceWidth=l.videoWidth,p.sourceHeight=l.videoHeight),Object.keys(p).length&&n.set(p)};let ne;const nt=()=>{var m,p,M;if(ne||typeof window>"u")return;const i=(m=window.screen)==null?void 0:m.orientation;(p=i==null?void 0:i.addEventListener)==null||p.call(i,"change",le),(M=window.addEventListener)==null||M.call(window,"resize",le),ne=()=>{var T,L;(T=i==null?void 0:i.removeEventListener)==null||T.call(i,"change",le),(L=window.removeEventListener)==null||L.call(window,"resize",le)},le()};let re;const rt=()=>{if(re||typeof document>"u"||typeof document.addEventListener!="function")return;const i=()=>{if(!y){if(document.hidden){r!=null&&r.pauseWhenHidden&&n.getSnapshot().lifecycle==="running"&&($e(),k=!0);return}if(k&&n.getSnapshot().lifecycle==="paused"){Ee();return}n.getSnapshot().lifecycle==="running"&&(l!=null&&l.paused)&&l.play().catch(()=>{})}};document.addEventListener("visibilitychange",i),re=()=>document.removeEventListener("visibilitychange",i)};return rt(),nt(),{store:n,registry:q,setMediaSource:be,start:Ze,stop:Je,reset:et,pause:$e,resume:Ee,switchCamera:Jt,dispose:es,rearm:ts,isDisposed:ss,setFrameSource:$t,registerXRPipeline:ns,getModelNode:rs,captureFrame:cs,captureStream:ls,getInputFrame:us,_setRenderTarget:as,_setCaptureTarget:is,_setRenderSize:tt,_setR3FState:os,_renderFrame:st,_getVideoElement:ds,_setPerf:hs,_setLifecycle:ys,_rebindMedia:fs,_setQuality:gs,_setQualityConfig:ps,_getPerf:ms}},Nn=(t,s)=>{const e=I.useRef(t),n=I.useRef(s),r=I.useMemo(()=>Hn(e.current,n.current),[]),a=JSON.stringify(s??{});I.useEffect(()=>{r._setLifecycle(s)},[r,a]),I.useEffect(()=>(r.rearm(),()=>void r.dispose()),[r]);const o=JSON.stringify(t??{});return I.useEffect(()=>{r._setPerf(t)},[r,o]),r},De=new Map,Bn=()=>({register:(t,s)=>{s?De.set(t,s):De.delete(t)},resolve:t=>t?De.get(t)??null:null}),_t=Bn(),Pt=I.createContext(null),zn=({children:t})=>{const s=I.useRef(new Map),e=I.useCallback((a,o)=>{o?s.current.set(a,o):s.current.delete(a)},[]),n=I.useCallback(a=>a?s.current.get(a)??null:null,[]),r=I.useMemo(()=>({register:e,resolve:n}),[e,n]);return I.createElement(Pt.Provider,{value:r},t)},Lt=()=>I.useContext(Pt)??_t,Wn=()=>Lt().register,qn=()=>Lt().resolve;_t.register;const Dt={[E.FACE_TRACKER]:"face",[E.HAND_TRACKER]:"hand",[E.GESTURE_TRACKER]:"gesture",[E.BODY_TRACKER]:"body",[E.HOLISTIC_TRACKER]:"holistic",[E.BACKGROUND_SEGMENTATION]:"segmentation",[E.SEMANTIC_SEGMENTATION]:"semantic-seg"},pt=Object.values(E),Vn=(t,s)=>{var n;const e=(n=t.registry.getOptions(s))==null?void 0:n.targetFps;return typeof e=="number"?e:null},ye=(t,s,e,n=performance.now())=>{const r=t.store.getSnapshot(),a=e?n-e.sampledAt:0,o=e&&a>0?Math.max(0,(r.feedFrames-e.feedFrames)*1e3/a):0,c=r.lifecycle==="running",l=s.map(f=>{var b;const u=t.registry.getState(f),w=t.store.getSnapshot().pipeline.get(f),S=((b=r.modelErrors.get(f))==null?void 0:b.error)??null,C=(w==null?void 0:w.getDiagnostics())??{inferenceMs:null,inferenceFps:0,inferences:0,skippedFrames:0,detections:null,confidence:null,status:S?"error":"ready",error:S,paused:!1,disposed:!1};let x;return u==="error"||C.status==="error"?x="error":u==="idle"?x="unavailable":u==="initializing"?x="loading":C.paused||!c?x="paused":x="ready",{...C,error:C.error??S,model:f,label:Dt[f]??f,state:x,targetFps:Vn(t,f),owners:t.registry.getOwners(f)}}),h=r.quality;return{quality:h?{tier:h.decision.tier.name,index:h.index,locked:h.locked,reason:h.decision.reason}:null,session:{lifecycle:r.lifecycle,ready:r.ready,error:r.error,source:r.source,sourceKind:r.sourceKind,sourceWidth:r.sourceWidth,sourceHeight:r.sourceHeight,renderWidth:r.renderWidth,renderHeight:r.renderHeight,feedFps:o,feedFrames:r.feedFrames},models:l,inferenceMsTotal:l.reduce((f,u)=>f+(u.state==="ready"?u.inferenceMs??0:0),0),sampledAt:n}},Kn=(t={})=>{const{intervalMs:s=250,enabled:e=!0}=t,{session:n}=Ge(),r=(t.models??pt).join("|"),a=I.useMemo(()=>t.models&&t.models.length?t.models:pt,[r]),o=I.useRef(null),[c,l]=I.useState(()=>ye(n,a,null));return I.useEffect(()=>{if(!e)return;const h=()=>{const u=ye(n,a,o.current);o.current={feedFrames:u.session.feedFrames,sampledAt:u.sampledAt},l(u)};h();const f=window.setInterval(h,Math.max(50,s));return()=>window.clearInterval(f)},[n,a,s,e]),c},Ot=[{name:"high",targetFps:30,renderScale:1,analysisScale:1,camRes:960},{name:"medium",targetFps:24,renderScale:.8,analysisScale:.85,camRes:720},{name:"low",targetFps:15,renderScale:.6,analysisScale:.7,camRes:640}],j={maxFrameMs:1e3/24,maxInferenceMs:24,maxMemoryMb:null,sampleMs:1e3,downgradeAfter:2,upgradeAfter:6,upgradeHeadroom:.75,cooldownMs:4e3},Ve={frameMs:null,fps:null,inferenceMs:null,feedFps:null,memoryMb:null,deviceMemoryGb:null,hardwareConcurrency:null,thermal:"unknown"},ue=(t,s,e)=>Math.min(e,Math.max(s,t)),H=(t,s)=>typeof t=="number"&&Number.isFinite(t)?t:s,Ut=(t,s)=>({name:typeof t.name=="string"&&t.name?t.name:`tier-${s}`,...H(t.targetFps,NaN)>0?{targetFps:H(t.targetFps,0)}:{},...H(t.renderScale,NaN)>0?{renderScale:ue(H(t.renderScale,1),.25,1)}:{},...H(t.analysisScale,NaN)>0?{analysisScale:ue(H(t.analysisScale,1),.25,1)}:{},...H(t.camRes,NaN)>0?{camRes:Math.round(H(t.camRes,0))}:{},...t.rebindCamera?{rebindCamera:!0}:{}}),Ht=(t={})=>({maxFrameMs:Math.max(1,H(t.maxFrameMs,j.maxFrameMs)),maxInferenceMs:Math.max(0,H(t.maxInferenceMs,j.maxInferenceMs)),maxMemoryMb:t.maxMemoryMb===null||t.maxMemoryMb===void 0?null:Math.max(1,H(t.maxMemoryMb,0))||null,sampleMs:Math.max(100,H(t.sampleMs,j.sampleMs)),downgradeAfter:Math.max(1,Math.round(H(t.downgradeAfter,j.downgradeAfter))),upgradeAfter:Math.max(1,Math.round(H(t.upgradeAfter,j.upgradeAfter))),upgradeHeadroom:ue(H(t.upgradeHeadroom,j.upgradeHeadroom),.1,1),cooldownMs:Math.max(0,H(t.cooldownMs,j.cooldownMs))}),$=(t,s,e)=>{if(typeof s=="number"&&Number.isInteger(s)&&s>=0&&s<t.length)return s;if(typeof s=="string"){const n=t.findIndex(r=>r.name===s);if(n>=0)return n}return e},Nt=(t={})=>{const s=t.tiers&&t.tiers.length?t.tiers.map((r,a)=>Ut(r,a)):Ot,e=$(s,t.maxTier,0),n=Math.max(e,$(s,t.minTier,s.length-1));return{tiers:s,budget:Ht(t.budget),...t.initialTier!==void 0?{initialTier:t.initialTier}:{},minTier:n,maxTier:e,adaptive:t.adaptive!==!1,historySize:Math.max(1,Math.round(H(t.historySize,20)))}},Bt=(t,s)=>{const e=$(t.tiers,t.maxTier,0),n=$(t.tiers,t.minTier,t.tiers.length-1);if(t.initialTier!==void 0)return ue($(t.tiers,t.initialTier,e),e,n);const r=s.deviceMemoryGb!==null&&s.deviceMemoryGb<=4||s.hardwareConcurrency!==null&&s.hardwareConcurrency<=4;return ue(r?e+1:e,e,n)},Ke=(t,s=Ve,e=0)=>{const n=Bt(t,s),r={index:n,tier:t.tiers[n],reason:"init",at:e};return{index:n,locked:!1,badStreak:0,goodStreak:0,lastChangeAt:e,decision:r,history:[r],signals:s}},we=(t,s,e,n,r,a=t.signals)=>{const o={index:e,tier:s.tiers[e],reason:n,at:r};return{...t,index:e,badStreak:0,goodStreak:0,lastChangeAt:r,decision:o,history:[o,...t.history].slice(0,s.historySize),signals:a}},zt=(t,s)=>t.thermal==="critical"?"thermal":s.maxMemoryMb!==null&&t.memoryMb!==null&&t.memoryMb>s.maxMemoryMb?"memory":t.inferenceMs!==null&&t.inferenceMs>s.maxInferenceMs?"inference":t.frameMs!==null&&t.frameMs>s.maxFrameMs?"frame-time":null,Wt=(t,s,e,n)=>{const{budget:r}=e,a=$(e.tiers,e.maxTier,0),o=$(e.tiers,e.minTier,e.tiers.length-1);if(t.locked||!e.adaptive)return{...t,signals:s};const c=zt(s,r),l=c===null&&s.frameMs!==null&&s.frameMs<=r.maxFrameMs*r.upgradeHeadroom&&(s.inferenceMs===null||s.inferenceMs<=r.maxInferenceMs*r.upgradeHeadroom),h=c?t.badStreak+1:0,f=l?t.goodStreak+1:0,u=n-t.lastChangeAt>=r.cooldownMs;if(c&&h>=r.downgradeAfter&&u){if(t.index<o)return we(t,e,t.index+1,c,n,s);const w=c==="frame-time"?"suspected":s.thermal;return{...t,badStreak:h,goodStreak:f,signals:{...s,thermal:w}}}return l&&f>=r.upgradeAfter&&u&&t.index>a?we(t,e,t.index-1,"recovered",n,s):{...t,badStreak:h,goodStreak:f,signals:s}},Xn=(t,s,e,n)=>{const r=$(s.tiers,e,t.index);return r===t.index?t:we(t,s,r,"manual",n)},Gn=(t,s,e,n)=>e===t.locked?t:{...we(t,s,t.index,e?"locked":"manual",n),locked:e},qt=(t,s)=>t.decision.tier===s?null:t.decision.tier,Qn=(t,s,e)=>{const n=Ke(t,s,e);return{...n,decision:{...n.decision,reason:"reset"},history:[{...n.decision,reason:"reset"}]}},Yn=Object.values(E),Vt=()=>{if(typeof navigator>"u")return{deviceMemoryGb:null,hardwareConcurrency:null};const t=navigator;return{deviceMemoryGb:typeof t.deviceMemory=="number"?t.deviceMemory:null,hardwareConcurrency:typeof t.hardwareConcurrency=="number"?t.hardwareConcurrency:null}},jn=()=>{const t=performance.memory;return t?t.usedJSHeapSize/1048576:null},Kt=({config:t,thermal:s,onDecision:e})=>{const{session:n}=Ge(),r=JSON.stringify(t??{}),a=I.useMemo(()=>Nt(t),[r]),o=I.useRef(s??"unknown");o.current=s??"unknown";const c=I.useRef(e);return c.current=e,I.useEffect(()=>{const l=Vt();let h=Ke(a,{...Ve,...l},performance.now());const f=n.store.getSnapshot().quality;f&&f.index<a.tiers.length&&(h={...f,decision:{...f.decision,tier:a.tiers[f.index]}}),n._setQualityConfig(a),n._setQuality(h);let u=n._getPerf(),w=null;const S=async(y,k)=>{const z={...u,...y.targetFps!==void 0?{targetFps:y.targetFps}:{},...y.analysisScale!==void 0?{analysisScale:y.analysisScale}:{},...y.camRes!==void 0&&y.rebindCamera?{camRes:y.camRes}:{}};n._setPerf(z),y.rebindCamera&&y.camRes!==void 0&&y.camRes!==(k==null?void 0:k.camRes)&&await n._rebindMedia().catch(()=>{})};w=h.decision.tier,S(h.decision.tier,null);let C=0,x=performance.now(),b=0;const P=()=>{C+=1,b=requestAnimationFrame(P)};b=requestAnimationFrame(P);let g=null;const v=window.setInterval(()=>{var V;if(typeof document<"u"&&document.hidden){C=0,x=performance.now();return}const y=performance.now(),k=y-x,z=ye(n,Yn,g,y);g={feedFrames:z.session.feedFrames,sampledAt:y};const R=n.store.getSnapshot().lifecycle==="running",K={frameMs:C>0&&k>0&&R?k/C:null,fps:C>0&&k>0?C*1e3/k:null,inferenceMs:R?z.inferenceMsTotal:null,feedFps:z.session.feedFps,memoryMb:jn(),...l,thermal:o.current};C=0,x=y;const G=n.store.getSnapshot().quality??h,D=Wt(G,K,a,y);h=D,n._setQuality(D);const A=qt(D,w);if(A){const Q=w;w=A,S(A,Q),(V=c.current)==null||V.call(c,D)}},a.budget.sampleMs);return()=>{cancelAnimationFrame(b),window.clearInterval(v);const y=(w==null?void 0:w.rebindCamera)&&w.camRes!==void 0;n._setPerf(u),y&&(u==null?void 0:u.camRes)!==(w==null?void 0:w.camRes)&&n._rebindMedia().catch(()=>{}),u=void 0,n._setQualityConfig(null)}},[n,a]),null},Xe=I.createContext(void 0),Ge=()=>{const t=I.useContext(Xe);if(!t)throw new U("XR context can only be used inside XRProvider, did you forget to wrap your app in <XRProvider>?");return t},Zn=()=>I.useContext(Xe)??null,$n=({children:t,perf:s,lifecycle:e,quality:n})=>{const r=Nn(s,e),a=I.useMemo(()=>({session:r}),[r]);return Fe.jsxs(Xe.Provider,{value:a,children:[n!==!1&&Fe.jsx(Kt,{config:n||void 0}),Fe.jsx(zn,{children:t})]})};exports.CAMERA_PERMISSION_MESSAGES=qs;exports.DEFAULT_HOLISTIC_ANALYSIS_MAX_DIMENSION=St;exports.DEFAULT_HOLISTIC_HOLD_MS=wt;exports.DEFAULT_HOLISTIC_MODEL_URL=Ue;exports.DEFAULT_HOLISTIC_PREDICT_MS=vt;exports.DEFAULT_PERFORMANCE_BUDGET=j;exports.DEFAULT_QUALITY_TIERS=Ot;exports.EMPTY_QUALITY_SIGNALS=Ve;exports.FaceTrackMemory=yt;exports.SEMANTIC_SEGMENTATION_PRESET_SPECS=Oe;exports.XRMediaSource=F;exports.XRModel=E;exports.XRProvider=$n;exports.XRQualityController=Kt;exports.XR_FALLBACK_MESSAGES=He;exports.XR_MODEL_ASSET_URLS=Mt;exports.XR_MODEL_LABELS=Dt;exports.canPromptForCamera=Ws;exports.classifyCameraFailure=qe;exports.clearSemanticMask=kn;exports.computeFeedCrop=xt;exports.computeFitLayout=kt;exports.createFallbackReason=_;exports.createQualityState=Ke;exports.createSemanticMask=Ft;exports.defaultCameraEnvironment=ve;exports.detectXRCapabilities=Us;exports.feedToSource=Tt;exports.feedToWorld=Et;exports.fetchAndVerify=Rt;exports.fillLandmarkPolygon=Tn;exports.fillPolygon=It;exports.isFeedPointInSource=Ks;exports.isMirroredSourceKind=Se;exports.isSdkOwnedUrl=At;exports.judgeSample=zt;exports.libConfig=N;exports.lockQuality=Gn;exports.mapDomExceptionToReason=ze;exports.mapModelErrorToReason=Ns;exports.mirrorFeedX=Xs;exports.normalizedTrackerPointToTrackerPoint=ce;exports.orientSourcePoint=Gs;exports.orientedSize=Qs;exports.permissionStateToStatus=Ct;exports.queryCameraPermission=We;exports.readDeviceSignals=Vt;exports.requestCameraAccess=Bs;exports.resetQuality=Qn;exports.resolveHolisticRuntimeOptions=pe;exports.resolveInitialTierIndex=Bt;exports.resolveModelAssetUrl=Ne;exports.resolvePerformanceBudget=Ht;exports.resolveQualityConfig=Nt;exports.resolveQualityTier=Ut;exports.resolveTrackerSupport=Hs;exports.sampleXRDiagnostics=ye;exports.semanticMaskLabelIndex=xn;exports.sessionReasonToFallback=Be;exports.setQualityTier=Xn;exports.sourceToFeed=Vs;exports.stepQualityController=Wt;exports.subscribeCameraPermission=zs;exports.tierToApply=qt;exports.trackerPointToNormalizedTrackerPoint=xs;exports.trackerToWorld=js;exports.unprojectToZZeroInto=ge;exports.useOptionalXRContext=Zn;exports.useRegisterRuntimeObject=Wn;exports.useResolveRuntimeObject=qn;exports.useXRContext=Ge;exports.useXRDiagnostics=Kn;exports.worldToFeed=Zs;exports.worldToTracker=$s;