From 7d77137a083756cb348ab98df806eddc0eb26906 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 16 Sep 2021 10:49:42 -0400 Subject: [PATCH] major release --- CHANGELOG.md | 7 +- dist/human.esm-nobundle.js | 2 +- dist/human.esm.js | 2 +- dist/human.js | 2 +- dist/human.node-gpu.js | 2 +- dist/human.node-wasm.js | 2 +- dist/human.node.js | 2 +- test/build.log | 24 + test/test.log | 582 +++++++++--------- typedoc/classes/Human.html | 8 +- typedoc/index.html | 8 +- typedoc/interfaces/BodyConfig.html | 8 +- typedoc/interfaces/BodyResult.html | 8 +- typedoc/interfaces/Config.html | 8 +- typedoc/interfaces/DrawOptions.html | 8 +- typedoc/interfaces/FaceConfig.html | 8 +- typedoc/interfaces/FaceDescriptionConfig.html | 8 +- typedoc/interfaces/FaceDetectorConfig.html | 8 +- typedoc/interfaces/FaceEmotionConfig.html | 8 +- typedoc/interfaces/FaceIrisConfig.html | 8 +- typedoc/interfaces/FaceMeshConfig.html | 8 +- typedoc/interfaces/FaceResult.html | 8 +- typedoc/interfaces/FilterConfig.html | 8 +- typedoc/interfaces/GestureConfig.html | 8 +- typedoc/interfaces/HandConfig.html | 8 +- typedoc/interfaces/HandResult.html | 8 +- typedoc/interfaces/ObjectConfig.html | 8 +- typedoc/interfaces/ObjectResult.html | 8 +- typedoc/interfaces/PersonResult.html | 8 +- typedoc/interfaces/Result.html | 8 +- typedoc/interfaces/SegmentationConfig.html | 8 +- 31 files changed, 415 insertions(+), 386 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c97f64ee..ecb40fee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,13 @@ ## Changelog -### **HEAD -> main** 2021/09/15 mandic00@live.com +### **2.2.1** 2021/09/16 mandic00@live.com + +### **origin/main** 2021/09/16 mandic00@live.com + +- all tests passing +- redefine draw helpers interface - add simple webcam and webrtc demo - added visual results browser to demo - reorganize tfjs bundle diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index 885d3069..36bc028d 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -11259,7 +11259,7 @@ async function check(instance) { } // package.json -var version10 = "2.2.0"; +var version10 = "2.2.1"; // src/sample.ts var face3 = ` diff --git a/dist/human.esm.js b/dist/human.esm.js index 3e1dc973..88cfdf18 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -71316,7 +71316,7 @@ async function check(instance) { } // package.json -var version6 = "2.2.0"; +var version6 = "2.2.1"; // src/sample.ts var face3 = ` diff --git a/dist/human.js b/dist/human.js index ac857da9..ff6b2f9d 100644 --- a/dist/human.js +++ b/dist/human.js @@ -4617,7 +4617,7 @@ return a / b;`,Wee=` `),d.brightness=function(v){let k=(v||0)+1;d.colorMatrix([k,0,0,0,0,0,k,0,0,0,0,0,k,0,0,0,0,0,1,0])},d.saturation=function(v){let k=(v||0)*2/3+1,S=(k-1)*-.5;d.colorMatrix([k,S,S,0,0,S,k,S,0,0,S,S,k,0,0,0,0,0,1,0])},d.desaturate=function(){d.saturation(-1)},d.contrast=function(v){let k=(v||0)+1,S=-128*(k-1);d.colorMatrix([k,0,0,0,S,0,k,0,0,S,0,0,k,0,S,0,0,0,1,0])},d.negative=function(){d.contrast(-2)},d.hue=function(v){v=(v||0)/180*Math.PI;let k=Math.cos(v),S=Math.sin(v),C=.213,D=.715,O=.072;d.colorMatrix([C+k*(1-C)+S*-C,D+k*-D+S*-D,O+k*-O+S*(1-O),0,0,C+k*-C+S*.143,D+k*(1-D)+S*.14,O+k*-O+S*-.283,0,0,C+k*-C+S*-(1-C),D+k*-D+S*D,O+k*(1-O)+S*O,0,0,0,0,0,1,0])},d.desaturateLuminance=function(){d.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},d.sepia=function(){d.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},d.brownie=function(){d.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},d.vintagePinhole=function(){d.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},d.kodachrome=function(){d.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},d.technicolor=function(){d.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},d.polaroid=function(){d.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},d.shiftToBGR=function(){d.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},d.convolution=function(v){let k=new Float32Array(v),S=1/i,C=1/l,D=b(d.convolution.SHADER);m.uniform1fv(D.uniform.m,k),m.uniform2f(D.uniform.px,S,C),x()},d.convolution.SHADER=["precision highp float;","varying vec2 vUv;","uniform sampler2D texture;","uniform vec2 px;","uniform float m[9];","void main(void) {","vec4 c11 = texture2D(texture, vUv - px);","vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));","vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));","vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );","vec4 c22 = texture2D(texture, vUv);","vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );","vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );","vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );","vec4 c33 = texture2D(texture, vUv + px );","gl_FragColor = ","c11 * m[0] + c12 * m[1] + c22 * m[2] +","c21 * m[3] + c22 * m[4] + c23 * m[5] +","c31 * m[6] + c32 * m[7] + c33 * m[8];","gl_FragColor.a = c22.a;","}"].join(` `),d.detectEdges=function(){d.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},d.sobelX=function(){d.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},d.sobelY=function(){d.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},d.sharpen=function(v){let k=v||1;d.convolution.call(this,[0,-1*k,0,-1*k,1+4*k,-1*k,0,-1*k,0])},d.emboss=function(v){let k=v||1;d.convolution.call(this,[-2*k,-1*k,0,-1*k,1,1*k,0,1*k,2*k])},d.blur=function(v){let k=v/7/i,S=v/7/l,C=b(d.blur.SHADER);m.uniform2f(C.uniform.px,0,S),x(f.INTERMEDIATE),m.uniform2f(C.uniform.px,k,0),x()},d.blur.SHADER=["precision highp float;","varying vec2 vUv;","uniform sampler2D texture;","uniform vec2 px;","void main(void) {","gl_FragColor = vec4(0.0);","gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;","gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;","gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;","gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;","gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;","gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;","gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;","gl_FragColor += texture2D(texture, vUv )*0.159576912161;","gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;","gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;","gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;","gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;","gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;","gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;","gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;","}"].join(` `),d.pixelate=function(v){let k=v/i,S=v/l,C=b(d.pixelate.SHADER);m.uniform2f(C.uniform.size,k,S),x()},d.pixelate.SHADER=["precision highp float;","varying vec2 vUv;","uniform vec2 size;","uniform sampler2D texture;","vec2 pixelate(vec2 coord, vec2 size) {","return floor( coord / size ) * size;","}","void main(void) {","gl_FragColor = vec4(0.0);","vec2 coord = pixelate(vUv, size);","gl_FragColor += texture2D(texture, coord);","}"].join(` -`)}var c0=2048,Oe,Nt,Gt;function mr(e,t){let n;return xe.browser?typeof OffscreenCanvas!="undefined"?n=new OffscreenCanvas(e,t):(n=document.createElement("canvas"),n.width=e,n.height=t):n=typeof xe.Canvas!="undefined"?new xe.Canvas(e,t):null,n}function fi(e,t){let n;if(!e)throw new Error("Human: Input is missing");if(!(e instanceof Ge)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof xe.Canvas!="undefined"&&e instanceof xe.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("Human: Input type is not recognized");if(e instanceof Ge)if(e.shape&&e.shape.length===4&&e.shape[0]===1&&e.shape[3]===3)n=Ps(e);else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${e.shape}`);else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return ce("input stream is not ready"),{tensor:null,canvas:Oe};let s=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!s||!r)return ce("cannot determine input dimensions"),{tensor:null,canvas:Oe};let a=s,o=r;if(a>c0&&(a=c0,o=a*r/s),o>c0&&(o=c0,a=o*s/r),(t.filter.width||0)>0?a=t.filter.width:(t.filter.height||0)>0&&(a=s*((t.filter.height||0)/r)),(t.filter.height||0)>0?o=t.filter.height:(t.filter.width||0)>0&&(o=r*((t.filter.width||0)/s)),!a||!o)throw new Error("Human: Input cannot determine dimension");(!Oe||(Oe==null?void 0:Oe.width)!==a||(Oe==null?void 0:Oe.height)!==o)&&(Oe=mr(a,o));let i=Oe.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(s,0),i.scale(-1,1),i.drawImage(e,0,0,s,r,0,0,Oe==null?void 0:Oe.width,Oe==null?void 0:Oe.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,s,r,0,0,Oe==null?void 0:Oe.width,Oe==null?void 0:Oe.height),t.filter.enabled&&xe.webgl.supported){if((!Gt||!Nt||Oe.width!==Nt.width||(Oe==null?void 0:Oe.height)!==(Nt==null?void 0:Nt.height))&&(Nt=mr(Oe==null?void 0:Oe.width,Oe==null?void 0:Oe.height),(Nt==null?void 0:Nt.width)!==(Oe==null?void 0:Oe.width)&&(Nt.width=Oe==null?void 0:Oe.width),(Nt==null?void 0:Nt.height)!==(Oe==null?void 0:Oe.height)&&(Nt.height=Oe==null?void 0:Oe.height),Gt=xe.browser?new f8({canvas:Nt}):null),!Gt)return{tensor:null,canvas:Oe};Gt.reset(),Gt.addFilter("brightness",t.filter.brightness),t.filter.contrast!==0&&Gt.addFilter("contrast",t.filter.contrast),t.filter.sharpness!==0&&Gt.addFilter("sharpen",t.filter.sharpness),t.filter.blur!==0&&Gt.addFilter("blur",t.filter.blur),t.filter.saturation!==0&&Gt.addFilter("saturation",t.filter.saturation),t.filter.hue!==0&&Gt.addFilter("hue",t.filter.hue),t.filter.negative&&Gt.addFilter("negative"),t.filter.sepia&&Gt.addFilter("sepia"),t.filter.vintage&&Gt.addFilter("brownie"),t.filter.sepia&&Gt.addFilter("sepia"),t.filter.kodachrome&&Gt.addFilter("kodachrome"),t.filter.technicolor&&Gt.addFilter("technicolor"),t.filter.polaroid&&Gt.addFilter("polaroid"),t.filter.pixelate!==0&&Gt.addFilter("pixelate",t.filter.pixelate),Gt.apply(Oe)}else Nt=Oe,Gt&&(Gt=null);if(!n){let l;if(Nt.data){let u=[Nt.height,Nt.width,3];l=sh(Nt.data,u,"int32")}else if(typeof ImageData!="undefined"&&Nt instanceof ImageData)l=fs?fs.fromPixels(Nt):null;else if(t.backend==="webgl"||t.backend==="humangl"){let u=mr(a,o);u.width=a,u.height=o;let c=u.getContext("2d");c==null||c.drawImage(Nt,0,0),l=fs&&xe.browser?fs.fromPixels(u):null}else{let u=mr(a,o);u.width=a,u.height=o;let c=u.getContext("2d");c.drawImage(Nt,0,0);let d=c.getImageData(0,0,a,o);fs&&xe.browser?l=fs.fromPixels(d):l=H(()=>{let p=nn(Array.from(d.data),[a,o,4]),h=Wt(p,4,2),f=pn([h[0],h[1],h[2]],2);return V(f,[p.shape[0],p.shape[1],3])})}if(l){let u=de(l,"float32");n=zt(u,0),Z(l),Z(u)}else throw n=Ot([1,a,o,3]),new Error("Human: Cannot create tensor from input")}}return{tensor:n,canvas:t.filter.return?Nt:null}}var Ry=0,m8=1;async function g8(e,t){if(e.cacheSensitivity===0)return!1;let n=32;if(!t.shape[1]||!t.shape[2])return!1;let s=Fe.resizeBilinear(t,[Math.trunc(t.shape[1]/n),Math.trunc(t.shape[2]/n)]),r=await s.data();Z(s);let a=0;for(let l=0;l10*e.cacheSensitivity?0:o,i}var xe={browser:void 0,node:void 0,worker:void 0,platform:void 0,agent:void 0,backends:[],tfjs:{version:void 0},wasm:{supported:void 0,backend:void 0,simd:void 0,multithread:void 0},webgl:{supported:void 0,backend:void 0,version:void 0,renderer:void 0},webgpu:{supported:void 0,backend:void 0,adapter:void 0},kernels:[],Canvas:void 0,Image:void 0};async function tle(){var n;xe.backends=Object.keys(Ns().registryFactory),xe.wasm.supported=typeof WebAssembly!="undefined",xe.wasm.backend=xe.backends.includes("wasm"),xe.wasm.supported&&xe.wasm.backend&&(xe.wasm.simd=await Y().getAsync("WASM_HAS_SIMD_SUPPORT"),xe.wasm.multithread=await Y().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let e=mr(100,100),t=e?e.getContext("webgl2"):void 0;if(xe.webgl.supported=typeof t!="undefined",xe.webgl.backend=xe.backends.includes("webgl"),xe.webgl.supported&&xe.webgl.backend){let s=zo().gpgpu!=="undefined"&&zo().getGPGPUContext?await zo().getGPGPUContext().gl:null;s&&(xe.webgl.version=s.getParameter(s.VERSION),xe.webgl.renderer=s.getParameter(s.RENDERER))}xe.webgpu.supported=xe.browser&&typeof navigator.gpu!="undefined",xe.webgpu.backend=xe.backends.includes("webgpu"),xe.webgpu.supported&&(xe.webgpu.adapter=(n=await navigator.gpu.requestAdapter())==null?void 0:n.name),xe.kernels=Yr(Bl()).map(s=>s.kernelName.toLowerCase())}async function d0(){if(xe.browser=typeof navigator!="undefined",xe.node=typeof process!="undefined",xe.worker=xe.browser?typeof WorkerGlobalScope!="undefined":void 0,xe.tfjs.version=ah,typeof navigator!="undefined"){let e=navigator.userAgent.match(/\(([^()]+)\)/g);if(e&&e[0]){let t=e[0].match(/\(([^()]+)\)/g);xe.platform=t&&t[0]?t[0].replace(/\(|\)/g,""):"",xe.agent=navigator.userAgent.replace(e[0],""),xe.platform[1]&&(xe.agent=xe.agent.replace(e[1],"")),xe.agent=xe.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(xe.platform=`${process.platform} ${process.arch}`,xe.agent=`NodeJS ${process.version}`);await tle()}var Dy=fr.leftEyeLower0,_y=fr.rightEyeLower0,Cu={leftBounds:[Dy[0],Dy[Dy.length-1]],rightBounds:[_y[0],_y[_y.length-1]]},A8={count:468,mouth:13,symmetryLine:[13,fr.midwayBetweenEyes[0]]},nle={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},Tu={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};function p0(e,t,n,s){for(let r=0;r[a[0]/this.meshSize*(d[0]-this.meshSize/2),a[1]/this.meshSize*(d[1]-this.meshSize/2),d[2]]),i=s!==0?Ny(s,[0,0]):u0,l=s!==0?o.map(d=>[...u8(d,i),d[2]]):o,u=s!==0?l8(r):u0,c=[...Td({startPoint:n.startPoint,endPoint:n.endPoint}),1];return l.map(d=>[Math.round(d[0]+ba(c,u[0])),Math.round(d[1]+ba(c,u[1])),Math.round(d[2])])}getLeftToRightEyeDepthDifference(t){let n=t[Cu.leftBounds[0]][2],s=t[Cu.rightBounds[0]][2];return n-s}getEyeBox(t,n,s,r,a=!1){let o=l0(i0(Ty([t[s],t[r]]),this.irisEnlarge)),i=Cd(o),l=Fe.cropAndResize(n,[[o.startPoint[1]/this.meshSize,o.startPoint[0]/this.meshSize,o.endPoint[1]/this.meshSize,o.endPoint[0]/this.meshSize]],[0],[this.irisSize,this.irisSize]);if(a&&xe.kernels.includes("flipleftright")){let u=Fe.flipLeftRight(l);Z(l),l=u}return{box:o,boxSize:i,crop:l}}getEyeCoords(t,n,s,r=!1){let a=[];for(let o=0;o{let u=o;return l===2?u=r:l===4&&(u=a),[i[0],i[1],u]})}correctFaceRotation(t,n,s){let[r,a]=n.landmarks.length>=A8.count?A8.symmetryLine:nle.symmetryLine,o=a8(n.landmarks[r],n.landmarks[a]),i=Td({startPoint:n.startPoint,endPoint:n.endPoint}),l=[i[0]/s.shape[2],i[1]/s.shape[1]],u=Fe.rotateWithOffset(s,o,0,l),c=Ny(-o,i),d=t.face.mesh.enabled?Nd({startPoint:n.startPoint,endPoint:n.endPoint},u,[this.meshSize,this.meshSize]):Nd({startPoint:n.startPoint,endPoint:n.endPoint},u,[this.boxSize,this.boxSize]),p=pe(d,255);return Z(d),Z(u),[o,c,p]}async augmentIris(t,n){let{box:s,boxSize:r,crop:a}=this.getEyeBox(t,n,Cu.leftBounds[0],Cu.leftBounds[1],!0),{box:o,boxSize:i,crop:l}=this.getEyeBox(t,n,Cu.rightBounds[0],Cu.rightBounds[1]),u=ft([a,l]);Z(a),Z(l);let c=this.irisModel.predict(u);Z(u);let d=await c.data();Z(c);let p=d.slice(0,Tu.numCoordinates*3),{rawCoords:h,iris:f}=this.getEyeCoords(p,s,r,!0),m=d.slice(Tu.numCoordinates*3),{rawCoords:g,iris:A}=this.getEyeCoords(m,o,i),y=this.getLeftToRightEyeDepthDifference(t);Math.abs(y)<30?(p0(t,h,"left",null),p0(t,g,"right",null)):y<1?p0(t,h,"left",["EyeUpper0","EyeLower0"]):p0(t,g,"right",["EyeUpper0","EyeLower0"]);let x=this.getAdjustedIrisCoords(t,f,"left"),b=this.getAdjustedIrisCoords(t,A,"right");return t.concat(x).concat(b)}async predict(t,n){let s=!1,r;if((this.skipped===0||this.skipped>n.face.detector.skipFrames||!n.face.mesh.enabled||!n.skipFrame)&&(r=await this.boundingBoxDetector.getBoundingBoxes(t,n),this.skipped=0),n.skipFrame&&this.skipped++,!n.skipFrame||r&&r.boxes&&(!n.face.mesh.enabled||r.boxes.length!==this.detectedFaces&&this.detectedFaces!==n.face.detector.maxDetected)){this.storedBoxes=[],this.detectedFaces=0;for(let i of r.boxes){let l=await i.box.startPoint.data(),u=await i.box.endPoint.data(),c=await i.landmarks.array();this.storedBoxes.push({startPoint:l,endPoint:u,landmarks:c,confidence:i.confidence})}this.storedBoxes.length>0&&(s=!0)}if(s){if(!r||!r.boxes||r.boxes.length===0)return this.storedBoxes=[],this.detectedFaces=0,null;for(let i=0;i{Z(i.box.startPoint),Z(i.box.endPoint),Z(i.landmarks)});let a=[],o=[];for(let i of this.storedBoxes){let l,u=0,c;if(n.face.detector.rotation&&n.face.mesh.enabled&&xe.kernels.includes("rotatewithoffset"))[u,c,l]=this.correctFaceRotation(n,i,t);else{c=u0;let d=t.clone(),p=n.face.mesh.enabled?Nd({startPoint:i.startPoint,endPoint:i.endPoint},d,[this.meshSize,this.meshSize]):Nd({startPoint:i.startPoint,endPoint:i.endPoint},d,[this.boxSize,this.boxSize]);l=pe(p,255),Z(p),Z(d)}if(!n.face.mesh.enabled)a.push({mesh:[],box:i,faceConfidence:null,boxConfidence:i.confidence,confidence:i.confidence,image:l});else{let[d,p,h]=this.meshDetector.execute(l);Z(d);let f=(await p.data())[0];Z(p);let m=V(h,[-1,3]),g=await m.array();if(Z(h),Z(m),fi.confidence>n.face.detector.minConfidence)),this.detectedFaces=a.length,a}};var Pt=[null,null,null],$y;async function y8(e,t){let n=await $y.predict(e,t),s=[],r=0;for(let a of n||[]){if(!a||a.isDisposedInternal)continue;let o=a.mesh.map(c=>[c[0]/(e.shape[2]||0),c[1]/(e.shape[1]||0),c[2]/$y.meshSize]),i={};if(a.mesh&&a.mesh.length>0)for(let c of Object.keys(fr))i[c]=fr[c].map(d=>a.mesh[d]);let l=a.box?[Math.trunc(Math.max(0,a.box.startPoint[0])),Math.trunc(Math.max(0,a.box.startPoint[1])),Math.trunc(Math.min(e.shape[2]||0,a.box.endPoint[0])-Math.max(0,a.box.startPoint[0])),Math.trunc(Math.min(e.shape[1]||0,a.box.endPoint[1])-Math.max(0,a.box.startPoint[1]))]:[0,0,0,0],u=a.box?[a.box.startPoint[0]/(e.shape[2]||0),a.box.startPoint[1]/(e.shape[1]||0),(a.box.endPoint[0]-a.box.startPoint[0])/(e.shape[2]||0),(a.box.endPoint[1]-a.box.startPoint[1])/(e.shape[1]||0)]:[0,0,0,0];s.push({id:r++,score:Math.round(100*a.faceConfidence||100*a.boxConfidence||0)/100,boxScore:Math.round(100*a.boxConfidence)/100,faceScore:Math.round(100*a.faceConfidence)/100,box:l,boxRaw:u,mesh:a.mesh,meshRaw:o,annotations:i,tensor:a.image})}return s}async function Oy(e){return!Pt[0]&&e.face.enabled||!Pt[1]&&e.face.mesh.enabled||!Pt[2]&&e.face.iris.enabled?(Pt=await Promise.all([!Pt[0]&&e.face.enabled?h8(e):null,!Pt[1]&&e.face.mesh.enabled?yt(xt(e.modelBasePath,e.face.mesh.modelPath),{fromTFHub:e.face.mesh.modelPath.includes("tfhub.dev")}):null,!Pt[2]&&e.face.iris.enabled?yt(xt(e.modelBasePath,e.face.iris.modelPath),{fromTFHub:e.face.iris.modelPath.includes("tfhub.dev")}):null]),e.face.mesh.enabled&&(!Pt[1]||!Pt[1].modelUrl?ce("load model failed:",e.face.mesh.modelPath):e.debug&&ce("load model:",Pt[1].modelUrl)),e.face.iris.enabled&&(!Pt[2]||!Pt[2].modelUrl?ce("load model failed:",e.face.iris.modelPath):e.debug&&ce("load model:",Pt[2].modelUrl))):e.debug&&(Pt[0]&&ce("cached model:",Pt[0].model.modelUrl),Pt[1]&&ce("cached model:",Pt[1].modelUrl),Pt[2]&&ce("cached model:",Pt[2].modelUrl)),$y=new Fy(Pt[0],Pt[1],Pt[2]),Pt}var x8=hi,b8=Ed;var Ks,h0=[],v8=0,Py=Number.MAX_SAFE_INTEGER;async function My(e){var n,s;let t=xt(e.modelBasePath,((n=e.face.description)==null?void 0:n.modelPath)||"");return Ks?e.debug&&ce("cached model:",t):(Ks=await yt(t),Ks?e.debug&&ce("load model:",t):ce("load model failed:",((s=e.face.description)==null?void 0:s.modelPath)||"")),Ks}function zy(e,t,n=2){if(!e||!t||(e==null?void 0:e.length)===0||(t==null?void 0:t.length)===0||(e==null?void 0:e.length)!==(t==null?void 0:t.length))return 0;let s=5*e.map((a,o)=>Math.abs(e[o]-t[o])**n).reduce((a,o)=>a+o,0)**(1/n);return Math.max(0,100-s)/100}function w8(e,t,n=0){let s={similarity:0,name:"",source:"",embedding:[]};if(!e||!t||!Array.isArray(e)||!Array.isArray(t))return s;for(let r of t)if(r.embedding&&r.name){let a=zy(e,r.embedding);a>n&&a>s.similarity&&(s={...r,similarity:a})}return s}function Ly(e){return H(()=>{let n=e.image||e.tensor||e;if(!(n instanceof Ge))return null;let s=[[.05,.15,.85,.85]];if(!Ks.inputs[0].shape)return null;let r=n.shape.length===3?Fe.cropAndResize(zt(n,0),s,[0],[Ks.inputs[0].shape[2],Ks.inputs[0].shape[1]]):Fe.cropAndResize(n,s,[0],[Ks.inputs[0].shape[2],Ks.inputs[0].shape[1]]);return z(r,255)})}async function By(e,t,n,s){var r,a,o;return Ks?Py<(((r=t.face.description)==null?void 0:r.skipFrames)||0)&&t.skipFrame&&v8===s&&((a=h0[n])==null?void 0:a.age)&&((o=h0[n])==null?void 0:o.age)>0?(Py++,h0[n]):(Py=0,new Promise(async i=>{var d,p;let l=Ly(e),u,c={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(((d=t.face.description)==null?void 0:d.enabled)&&(u=await Ks.predict(l)),Z(l),u){let h=await u.find(b=>b.shape[1]===1).data(),f=Math.trunc(200*Math.abs(h[0]-.5))/100;f>(((p=t.face.description)==null?void 0:p.minConfidence)||0)&&(c.gender=h[0]<=.5?"female":"male",c.genderScore=Math.min(.99,f));let m=Ms(u.find(b=>b.shape[1]===100),1),g=(await m.data())[0];Z(m);let A=await u.find(b=>b.shape[1]===100).data();c.age=Math.round(A[g-1]>A[g+1]?10*g-100*A[g-1]:10*g+100*A[g+1])/10;let x=await u.find(b=>b.shape[1]===1024).data();c.descriptor=[...x],u.forEach(b=>Z(b))}h0[n]=c,v8=s,i(c)})):null}var sle=["angry","disgust","fear","happy","sad","surprise","neutral"],Zs,f0=[],k8=0,Wy=Number.MAX_SAFE_INTEGER,Vy=[.2989,.587,.114];async function Uy(e){var t,n;return Zs?e.debug&&ce("cached model:",Zs.modelUrl):(Zs=await yt(xt(e.modelBasePath,((t=e.face.emotion)==null?void 0:t.modelPath)||"")),!Zs||!Zs.modelUrl?ce("load model failed:",((n=e.face.emotion)==null?void 0:n.modelPath)||""):e.debug&&ce("load model:",Zs.modelUrl)),Zs}async function Hy(e,t,n,s){var r;return Zs?Wy<(((r=t.face.emotion)==null?void 0:r.skipFrames)||0)&&t.skipFrame&&k8===s&&f0[n]&&f0[n].length>0?(Wy++,f0[n]):(Wy=0,new Promise(async a=>{var g,A;let o=Fe.resizeBilinear(e,[Zs.inputs[0].shape[2],Zs.inputs[0].shape[1]],!1),[i,l,u]=Wt(o,3,3);Z(o);let c=z(i,Vy[0]),d=z(l,Vy[1]),p=z(u,Vy[2]);Z(i),Z(l),Z(u);let h=uh([c,d,p]);Z(c),Z(d),Z(p);let f=H(()=>z(Ae(h,.5),2));Z(h);let m=[];if((g=t.face.emotion)==null?void 0:g.enabled){let y=await Zs.predict(f),x=await y.data();Z(y);for(let b=0;b(((A=t.face.emotion)==null?void 0:A.minConfidence)||0)&&m.push({score:Math.min(.99,Math.trunc(100*x[b])/100),emotion:sle[b]});m.sort((b,v)=>v.score-b.score)}Z(f),f0[n]=m,k8=s,a(m)})):null}var Rd=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],I8=Rd.length,Dd=Rd.reduce((e,t,n)=>(e[t]=n,e),{}),rle=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],ale=rle.map(([e,t])=>[Dd[e],Dd[t]]),S8=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function C8(e){let t=e.reduce(({maxX:n,maxY:s,minX:r,minY:a},{position:{x:o,y:i}})=>({maxX:Math.max(n,o),maxY:Math.max(s,i),minX:Math.min(r,o),minY:Math.min(a,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function T8(e,[t,n],[s,r]){let a=t/s,o=n/r,i=(u,c)=>({id:c,score:u.score,boxRaw:[u.box[0]/r,u.box[1]/s,u.box[2]/r,u.box[3]/s],box:[Math.trunc(u.box[0]*o),Math.trunc(u.box[1]*a),Math.trunc(u.box[2]*o),Math.trunc(u.box[3]*a)],keypoints:u.keypoints.map(({score:d,part:p,position:h})=>({score:d,part:p,position:[Math.trunc(h.x*o),Math.trunc(h.y*a)],positionRaw:[h.x/s,h.y/s]}))});return e.map((u,c)=>i(u,c))}var Gy=class{constructor(t,n){Re(this,"priorityQueue");Re(this,"numberOfElements");Re(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function N8(e,t,n,s){let r=n-e,a=s-t;return r*r+a*a}function Ky(e,t){return{x:e.x+t.x,y:e.y+t.y}}var m0=1,Nu=16,ole=50**2;function E8(e,t,n,s,r,a,o=2){let i=A=>({y:a.get(A.y,A.x,e),x:a.get(A.y,A.x,a.shape[2]/2+e)}),l=(A,y,x)=>({y:Xy(Math.round(A.y/Nu),0,y-1),x:Xy(Math.round(A.x/Nu),0,x-1)}),[u,c]=s.shape,d=l(t.position,u,c),p=i(d),f=Ky(t.position,p);for(let A=0;A[Dd[p],Dd[h]]),o=a.map(([,p])=>p),i=a.map(([p])=>p),l=t.shape[2],u=o.length,c=new Array(l),d=qy(e.part,Nu,n);c[e.part.id]={score:e.score,part:Rd[e.part.id],position:d};for(let p=u-1;p>=0;--p){let h=o[p],f=i[p];c[h]&&!c[f]&&(c[f]=E8(p,c[h],f,t,n,r))}for(let p=0;pt){i=!1;break}if(!i)break}return i}function ule(e,t){let[n,s,r]=t.shape,a=new Gy(n*s*r,({score:o})=>o);for(let o=0;o{var o;let a=(o=r[s])==null?void 0:o.position;return a?N8(n,t,a.y,a.x)<=ole:!1})}function cle(e,t){return t.reduce((s,{position:r,score:a},o)=>(R8(e,r,o)||(s+=a),s),0)/t.length}function D8(e,t,n,s,r,a){let o=[],i=ule(a,t);for(;o.lengthh.score>a);let d=cle(o,c),p=C8(c);d>a&&o.push({keypoints:c,box:p,score:Math.round(100*d)/100})}return o}var os,dle=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"];async function Zy(e,t){let n=H(()=>{if(!os.inputs[0].shape)return[];let o=Fe.resizeBilinear(e,[os.inputs[0].shape[2],os.inputs[0].shape[1]]),i=Ae(pe(de(o,"float32"),127.5),1),u=os.execute(i,dle).map(c=>lt(c,[0]));return u[1]=u[1].sigmoid(),u}),s=await Promise.all(n.map(o=>o.buffer()));for(let o of n)Z(o);let r=await D8(s[0],s[1],s[2],s[3],t.body.maxDetected,t.body.minConfidence);return os.inputs[0].shape?T8(r,[e.shape[1],e.shape[2]],[os.inputs[0].shape[2],os.inputs[0].shape[1]]):[]}async function Yy(e){return os?e.debug&&ce("cached model:",os.modelUrl):(os=await yt(xt(e.modelBasePath,e.body.modelPath||"")),!os||!os.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",os.modelUrl)),os}function g0(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function _d(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function _8(e,t,n){let s=t.shape[1],r=t.shape[2],a=[[e.startPoint[1]/s,e.startPoint[0]/r,e.endPoint[1]/s,e.endPoint[0]/r]];return Fe.cropAndResize(t,a,[0],n)}function F8(e,t){let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],s=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],r=e.palmLandmarks.map(a=>[a[0]*t[0],a[1]*t[1]]);return{startPoint:n,endPoint:s,palmLandmarks:r,confidence:e.confidence}}function A0(e,t=1.5){let n=_d(e),s=g0(e),r=[t*s[0]/2,t*s[1]/2],a=[n[0]-r[0],n[1]-r[1]],o=[n[0]+r[0],n[1]+r[1]];return{startPoint:a,endPoint:o,palmLandmarks:e.palmLandmarks}}function y0(e){let t=_d(e),n=g0(e),r=Math.max(...n)/2,a=[t[0]-r,t[1]-r],o=[t[0]+r,t[1]+r];return{startPoint:a,endPoint:o,palmLandmarks:e.palmLandmarks}}var $8=[{x:.015625,y:.015625},{x:.015625,y:.015625},{x:.046875,y:.015625},{x:.046875,y:.015625},{x:.078125,y:.015625},{x:.078125,y:.015625},{x:.109375,y:.015625},{x:.109375,y:.015625},{x:.140625,y:.015625},{x:.140625,y:.015625},{x:.171875,y:.015625},{x:.171875,y:.015625},{x:.203125,y:.015625},{x:.203125,y:.015625},{x:.234375,y:.015625},{x:.234375,y:.015625},{x:.265625,y:.015625},{x:.265625,y:.015625},{x:.296875,y:.015625},{x:.296875,y:.015625},{x:.328125,y:.015625},{x:.328125,y:.015625},{x:.359375,y:.015625},{x:.359375,y:.015625},{x:.390625,y:.015625},{x:.390625,y:.015625},{x:.421875,y:.015625},{x:.421875,y:.015625},{x:.453125,y:.015625},{x:.453125,y:.015625},{x:.484375,y:.015625},{x:.484375,y:.015625},{x:.515625,y:.015625},{x:.515625,y:.015625},{x:.546875,y:.015625},{x:.546875,y:.015625},{x:.578125,y:.015625},{x:.578125,y:.015625},{x:.609375,y:.015625},{x:.609375,y:.015625},{x:.640625,y:.015625},{x:.640625,y:.015625},{x:.671875,y:.015625},{x:.671875,y:.015625},{x:.703125,y:.015625},{x:.703125,y:.015625},{x:.734375,y:.015625},{x:.734375,y:.015625},{x:.765625,y:.015625},{x:.765625,y:.015625},{x:.796875,y:.015625},{x:.796875,y:.015625},{x:.828125,y:.015625},{x:.828125,y:.015625},{x:.859375,y:.015625},{x:.859375,y:.015625},{x:.890625,y:.015625},{x:.890625,y:.015625},{x:.921875,y:.015625},{x:.921875,y:.015625},{x:.953125,y:.015625},{x:.953125,y:.015625},{x:.984375,y:.015625},{x:.984375,y:.015625},{x:.015625,y:.046875},{x:.015625,y:.046875},{x:.046875,y:.046875},{x:.046875,y:.046875},{x:.078125,y:.046875},{x:.078125,y:.046875},{x:.109375,y:.046875},{x:.109375,y:.046875},{x:.140625,y:.046875},{x:.140625,y:.046875},{x:.171875,y:.046875},{x:.171875,y:.046875},{x:.203125,y:.046875},{x:.203125,y:.046875},{x:.234375,y:.046875},{x:.234375,y:.046875},{x:.265625,y:.046875},{x:.265625,y:.046875},{x:.296875,y:.046875},{x:.296875,y:.046875},{x:.328125,y:.046875},{x:.328125,y:.046875},{x:.359375,y:.046875},{x:.359375,y:.046875},{x:.390625,y:.046875},{x:.390625,y:.046875},{x:.421875,y:.046875},{x:.421875,y:.046875},{x:.453125,y:.046875},{x:.453125,y:.046875},{x:.484375,y:.046875},{x:.484375,y:.046875},{x:.515625,y:.046875},{x:.515625,y:.046875},{x:.546875,y:.046875},{x:.546875,y:.046875},{x:.578125,y:.046875},{x:.578125,y:.046875},{x:.609375,y:.046875},{x:.609375,y:.046875},{x:.640625,y:.046875},{x:.640625,y:.046875},{x:.671875,y:.046875},{x:.671875,y:.046875},{x:.703125,y:.046875},{x:.703125,y:.046875},{x:.734375,y:.046875},{x:.734375,y:.046875},{x:.765625,y:.046875},{x:.765625,y:.046875},{x:.796875,y:.046875},{x:.796875,y:.046875},{x:.828125,y:.046875},{x:.828125,y:.046875},{x:.859375,y:.046875},{x:.859375,y:.046875},{x:.890625,y:.046875},{x:.890625,y:.046875},{x:.921875,y:.046875},{x:.921875,y:.046875},{x:.953125,y:.046875},{x:.953125,y:.046875},{x:.984375,y:.046875},{x:.984375,y:.046875},{x:.015625,y:.078125},{x:.015625,y:.078125},{x:.046875,y:.078125},{x:.046875,y:.078125},{x:.078125,y:.078125},{x:.078125,y:.078125},{x:.109375,y:.078125},{x:.109375,y:.078125},{x:.140625,y:.078125},{x:.140625,y:.078125},{x:.171875,y:.078125},{x:.171875,y:.078125},{x:.203125,y:.078125},{x:.203125,y:.078125},{x:.234375,y:.078125},{x:.234375,y:.078125},{x:.265625,y:.078125},{x:.265625,y:.078125},{x:.296875,y:.078125},{x:.296875,y:.078125},{x:.328125,y:.078125},{x:.328125,y:.078125},{x:.359375,y:.078125},{x:.359375,y:.078125},{x:.390625,y:.078125},{x:.390625,y:.078125},{x:.421875,y:.078125},{x:.421875,y:.078125},{x:.453125,y:.078125},{x:.453125,y:.078125},{x:.484375,y:.078125},{x:.484375,y:.078125},{x:.515625,y:.078125},{x:.515625,y:.078125},{x:.546875,y:.078125},{x:.546875,y:.078125},{x:.578125,y:.078125},{x:.578125,y:.078125},{x:.609375,y:.078125},{x:.609375,y:.078125},{x:.640625,y:.078125},{x:.640625,y:.078125},{x:.671875,y:.078125},{x:.671875,y:.078125},{x:.703125,y:.078125},{x:.703125,y:.078125},{x:.734375,y:.078125},{x:.734375,y:.078125},{x:.765625,y:.078125},{x:.765625,y:.078125},{x:.796875,y:.078125},{x:.796875,y:.078125},{x:.828125,y:.078125},{x:.828125,y:.078125},{x:.859375,y:.078125},{x:.859375,y:.078125},{x:.890625,y:.078125},{x:.890625,y:.078125},{x:.921875,y:.078125},{x:.921875,y:.078125},{x:.953125,y:.078125},{x:.953125,y:.078125},{x:.984375,y:.078125},{x:.984375,y:.078125},{x:.015625,y:.109375},{x:.015625,y:.109375},{x:.046875,y:.109375},{x:.046875,y:.109375},{x:.078125,y:.109375},{x:.078125,y:.109375},{x:.109375,y:.109375},{x:.109375,y:.109375},{x:.140625,y:.109375},{x:.140625,y:.109375},{x:.171875,y:.109375},{x:.171875,y:.109375},{x:.203125,y:.109375},{x:.203125,y:.109375},{x:.234375,y:.109375},{x:.234375,y:.109375},{x:.265625,y:.109375},{x:.265625,y:.109375},{x:.296875,y:.109375},{x:.296875,y:.109375},{x:.328125,y:.109375},{x:.328125,y:.109375},{x:.359375,y:.109375},{x:.359375,y:.109375},{x:.390625,y:.109375},{x:.390625,y:.109375},{x:.421875,y:.109375},{x:.421875,y:.109375},{x:.453125,y:.109375},{x:.453125,y:.109375},{x:.484375,y:.109375},{x:.484375,y:.109375},{x:.515625,y:.109375},{x:.515625,y:.109375},{x:.546875,y:.109375},{x:.546875,y:.109375},{x:.578125,y:.109375},{x:.578125,y:.109375},{x:.609375,y:.109375},{x:.609375,y:.109375},{x:.640625,y:.109375},{x:.640625,y:.109375},{x:.671875,y:.109375},{x:.671875,y:.109375},{x:.703125,y:.109375},{x:.703125,y:.109375},{x:.734375,y:.109375},{x:.734375,y:.109375},{x:.765625,y:.109375},{x:.765625,y:.109375},{x:.796875,y:.109375},{x:.796875,y:.109375},{x:.828125,y:.109375},{x:.828125,y:.109375},{x:.859375,y:.109375},{x:.859375,y:.109375},{x:.890625,y:.109375},{x:.890625,y:.109375},{x:.921875,y:.109375},{x:.921875,y:.109375},{x:.953125,y:.109375},{x:.953125,y:.109375},{x:.984375,y:.109375},{x:.984375,y:.109375},{x:.015625,y:.140625},{x:.015625,y:.140625},{x:.046875,y:.140625},{x:.046875,y:.140625},{x:.078125,y:.140625},{x:.078125,y:.140625},{x:.109375,y:.140625},{x:.109375,y:.140625},{x:.140625,y:.140625},{x:.140625,y:.140625},{x:.171875,y:.140625},{x:.171875,y:.140625},{x:.203125,y:.140625},{x:.203125,y:.140625},{x:.234375,y:.140625},{x:.234375,y:.140625},{x:.265625,y:.140625},{x:.265625,y:.140625},{x:.296875,y:.140625},{x:.296875,y:.140625},{x:.328125,y:.140625},{x:.328125,y:.140625},{x:.359375,y:.140625},{x:.359375,y:.140625},{x:.390625,y:.140625},{x:.390625,y:.140625},{x:.421875,y:.140625},{x:.421875,y:.140625},{x:.453125,y:.140625},{x:.453125,y:.140625},{x:.484375,y:.140625},{x:.484375,y:.140625},{x:.515625,y:.140625},{x:.515625,y:.140625},{x:.546875,y:.140625},{x:.546875,y:.140625},{x:.578125,y:.140625},{x:.578125,y:.140625},{x:.609375,y:.140625},{x:.609375,y:.140625},{x:.640625,y:.140625},{x:.640625,y:.140625},{x:.671875,y:.140625},{x:.671875,y:.140625},{x:.703125,y:.140625},{x:.703125,y:.140625},{x:.734375,y:.140625},{x:.734375,y:.140625},{x:.765625,y:.140625},{x:.765625,y:.140625},{x:.796875,y:.140625},{x:.796875,y:.140625},{x:.828125,y:.140625},{x:.828125,y:.140625},{x:.859375,y:.140625},{x:.859375,y:.140625},{x:.890625,y:.140625},{x:.890625,y:.140625},{x:.921875,y:.140625},{x:.921875,y:.140625},{x:.953125,y:.140625},{x:.953125,y:.140625},{x:.984375,y:.140625},{x:.984375,y:.140625},{x:.015625,y:.171875},{x:.015625,y:.171875},{x:.046875,y:.171875},{x:.046875,y:.171875},{x:.078125,y:.171875},{x:.078125,y:.171875},{x:.109375,y:.171875},{x:.109375,y:.171875},{x:.140625,y:.171875},{x:.140625,y:.171875},{x:.171875,y:.171875},{x:.171875,y:.171875},{x:.203125,y:.171875},{x:.203125,y:.171875},{x:.234375,y:.171875},{x:.234375,y:.171875},{x:.265625,y:.171875},{x:.265625,y:.171875},{x:.296875,y:.171875},{x:.296875,y:.171875},{x:.328125,y:.171875},{x:.328125,y:.171875},{x:.359375,y:.171875},{x:.359375,y:.171875},{x:.390625,y:.171875},{x:.390625,y:.171875},{x:.421875,y:.171875},{x:.421875,y:.171875},{x:.453125,y:.171875},{x:.453125,y:.171875},{x:.484375,y:.171875},{x:.484375,y:.171875},{x:.515625,y:.171875},{x:.515625,y:.171875},{x:.546875,y:.171875},{x:.546875,y:.171875},{x:.578125,y:.171875},{x:.578125,y:.171875},{x:.609375,y:.171875},{x:.609375,y:.171875},{x:.640625,y:.171875},{x:.640625,y:.171875},{x:.671875,y:.171875},{x:.671875,y:.171875},{x:.703125,y:.171875},{x:.703125,y:.171875},{x:.734375,y:.171875},{x:.734375,y:.171875},{x:.765625,y:.171875},{x:.765625,y:.171875},{x:.796875,y:.171875},{x:.796875,y:.171875},{x:.828125,y:.171875},{x:.828125,y:.171875},{x:.859375,y:.171875},{x:.859375,y:.171875},{x:.890625,y:.171875},{x:.890625,y:.171875},{x:.921875,y:.171875},{x:.921875,y:.171875},{x:.953125,y:.171875},{x:.953125,y:.171875},{x:.984375,y:.171875},{x:.984375,y:.171875},{x:.015625,y:.203125},{x:.015625,y:.203125},{x:.046875,y:.203125},{x:.046875,y:.203125},{x:.078125,y:.203125},{x:.078125,y:.203125},{x:.109375,y:.203125},{x:.109375,y:.203125},{x:.140625,y:.203125},{x:.140625,y:.203125},{x:.171875,y:.203125},{x:.171875,y:.203125},{x:.203125,y:.203125},{x:.203125,y:.203125},{x:.234375,y:.203125},{x:.234375,y:.203125},{x:.265625,y:.203125},{x:.265625,y:.203125},{x:.296875,y:.203125},{x:.296875,y:.203125},{x:.328125,y:.203125},{x:.328125,y:.203125},{x:.359375,y:.203125},{x:.359375,y:.203125},{x:.390625,y:.203125},{x:.390625,y:.203125},{x:.421875,y:.203125},{x:.421875,y:.203125},{x:.453125,y:.203125},{x:.453125,y:.203125},{x:.484375,y:.203125},{x:.484375,y:.203125},{x:.515625,y:.203125},{x:.515625,y:.203125},{x:.546875,y:.203125},{x:.546875,y:.203125},{x:.578125,y:.203125},{x:.578125,y:.203125},{x:.609375,y:.203125},{x:.609375,y:.203125},{x:.640625,y:.203125},{x:.640625,y:.203125},{x:.671875,y:.203125},{x:.671875,y:.203125},{x:.703125,y:.203125},{x:.703125,y:.203125},{x:.734375,y:.203125},{x:.734375,y:.203125},{x:.765625,y:.203125},{x:.765625,y:.203125},{x:.796875,y:.203125},{x:.796875,y:.203125},{x:.828125,y:.203125},{x:.828125,y:.203125},{x:.859375,y:.203125},{x:.859375,y:.203125},{x:.890625,y:.203125},{x:.890625,y:.203125},{x:.921875,y:.203125},{x:.921875,y:.203125},{x:.953125,y:.203125},{x:.953125,y:.203125},{x:.984375,y:.203125},{x:.984375,y:.203125},{x:.015625,y:.234375},{x:.015625,y:.234375},{x:.046875,y:.234375},{x:.046875,y:.234375},{x:.078125,y:.234375},{x:.078125,y:.234375},{x:.109375,y:.234375},{x:.109375,y:.234375},{x:.140625,y:.234375},{x:.140625,y:.234375},{x:.171875,y:.234375},{x:.171875,y:.234375},{x:.203125,y:.234375},{x:.203125,y:.234375},{x:.234375,y:.234375},{x:.234375,y:.234375},{x:.265625,y:.234375},{x:.265625,y:.234375},{x:.296875,y:.234375},{x:.296875,y:.234375},{x:.328125,y:.234375},{x:.328125,y:.234375},{x:.359375,y:.234375},{x:.359375,y:.234375},{x:.390625,y:.234375},{x:.390625,y:.234375},{x:.421875,y:.234375},{x:.421875,y:.234375},{x:.453125,y:.234375},{x:.453125,y:.234375},{x:.484375,y:.234375},{x:.484375,y:.234375},{x:.515625,y:.234375},{x:.515625,y:.234375},{x:.546875,y:.234375},{x:.546875,y:.234375},{x:.578125,y:.234375},{x:.578125,y:.234375},{x:.609375,y:.234375},{x:.609375,y:.234375},{x:.640625,y:.234375},{x:.640625,y:.234375},{x:.671875,y:.234375},{x:.671875,y:.234375},{x:.703125,y:.234375},{x:.703125,y:.234375},{x:.734375,y:.234375},{x:.734375,y:.234375},{x:.765625,y:.234375},{x:.765625,y:.234375},{x:.796875,y:.234375},{x:.796875,y:.234375},{x:.828125,y:.234375},{x:.828125,y:.234375},{x:.859375,y:.234375},{x:.859375,y:.234375},{x:.890625,y:.234375},{x:.890625,y:.234375},{x:.921875,y:.234375},{x:.921875,y:.234375},{x:.953125,y:.234375},{x:.953125,y:.234375},{x:.984375,y:.234375},{x:.984375,y:.234375},{x:.015625,y:.265625},{x:.015625,y:.265625},{x:.046875,y:.265625},{x:.046875,y:.265625},{x:.078125,y:.265625},{x:.078125,y:.265625},{x:.109375,y:.265625},{x:.109375,y:.265625},{x:.140625,y:.265625},{x:.140625,y:.265625},{x:.171875,y:.265625},{x:.171875,y:.265625},{x:.203125,y:.265625},{x:.203125,y:.265625},{x:.234375,y:.265625},{x:.234375,y:.265625},{x:.265625,y:.265625},{x:.265625,y:.265625},{x:.296875,y:.265625},{x:.296875,y:.265625},{x:.328125,y:.265625},{x:.328125,y:.265625},{x:.359375,y:.265625},{x:.359375,y:.265625},{x:.390625,y:.265625},{x:.390625,y:.265625},{x:.421875,y:.265625},{x:.421875,y:.265625},{x:.453125,y:.265625},{x:.453125,y:.265625},{x:.484375,y:.265625},{x:.484375,y:.265625},{x:.515625,y:.265625},{x:.515625,y:.265625},{x:.546875,y:.265625},{x:.546875,y:.265625},{x:.578125,y:.265625},{x:.578125,y:.265625},{x:.609375,y:.265625},{x:.609375,y:.265625},{x:.640625,y:.265625},{x:.640625,y:.265625},{x:.671875,y:.265625},{x:.671875,y:.265625},{x:.703125,y:.265625},{x:.703125,y:.265625},{x:.734375,y:.265625},{x:.734375,y:.265625},{x:.765625,y:.265625},{x:.765625,y:.265625},{x:.796875,y:.265625},{x:.796875,y:.265625},{x:.828125,y:.265625},{x:.828125,y:.265625},{x:.859375,y:.265625},{x:.859375,y:.265625},{x:.890625,y:.265625},{x:.890625,y:.265625},{x:.921875,y:.265625},{x:.921875,y:.265625},{x:.953125,y:.265625},{x:.953125,y:.265625},{x:.984375,y:.265625},{x:.984375,y:.265625},{x:.015625,y:.296875},{x:.015625,y:.296875},{x:.046875,y:.296875},{x:.046875,y:.296875},{x:.078125,y:.296875},{x:.078125,y:.296875},{x:.109375,y:.296875},{x:.109375,y:.296875},{x:.140625,y:.296875},{x:.140625,y:.296875},{x:.171875,y:.296875},{x:.171875,y:.296875},{x:.203125,y:.296875},{x:.203125,y:.296875},{x:.234375,y:.296875},{x:.234375,y:.296875},{x:.265625,y:.296875},{x:.265625,y:.296875},{x:.296875,y:.296875},{x:.296875,y:.296875},{x:.328125,y:.296875},{x:.328125,y:.296875},{x:.359375,y:.296875},{x:.359375,y:.296875},{x:.390625,y:.296875},{x:.390625,y:.296875},{x:.421875,y:.296875},{x:.421875,y:.296875},{x:.453125,y:.296875},{x:.453125,y:.296875},{x:.484375,y:.296875},{x:.484375,y:.296875},{x:.515625,y:.296875},{x:.515625,y:.296875},{x:.546875,y:.296875},{x:.546875,y:.296875},{x:.578125,y:.296875},{x:.578125,y:.296875},{x:.609375,y:.296875},{x:.609375,y:.296875},{x:.640625,y:.296875},{x:.640625,y:.296875},{x:.671875,y:.296875},{x:.671875,y:.296875},{x:.703125,y:.296875},{x:.703125,y:.296875},{x:.734375,y:.296875},{x:.734375,y:.296875},{x:.765625,y:.296875},{x:.765625,y:.296875},{x:.796875,y:.296875},{x:.796875,y:.296875},{x:.828125,y:.296875},{x:.828125,y:.296875},{x:.859375,y:.296875},{x:.859375,y:.296875},{x:.890625,y:.296875},{x:.890625,y:.296875},{x:.921875,y:.296875},{x:.921875,y:.296875},{x:.953125,y:.296875},{x:.953125,y:.296875},{x:.984375,y:.296875},{x:.984375,y:.296875},{x:.015625,y:.328125},{x:.015625,y:.328125},{x:.046875,y:.328125},{x:.046875,y:.328125},{x:.078125,y:.328125},{x:.078125,y:.328125},{x:.109375,y:.328125},{x:.109375,y:.328125},{x:.140625,y:.328125},{x:.140625,y:.328125},{x:.171875,y:.328125},{x:.171875,y:.328125},{x:.203125,y:.328125},{x:.203125,y:.328125},{x:.234375,y:.328125},{x:.234375,y:.328125},{x:.265625,y:.328125},{x:.265625,y:.328125},{x:.296875,y:.328125},{x:.296875,y:.328125},{x:.328125,y:.328125},{x:.328125,y:.328125},{x:.359375,y:.328125},{x:.359375,y:.328125},{x:.390625,y:.328125},{x:.390625,y:.328125},{x:.421875,y:.328125},{x:.421875,y:.328125},{x:.453125,y:.328125},{x:.453125,y:.328125},{x:.484375,y:.328125},{x:.484375,y:.328125},{x:.515625,y:.328125},{x:.515625,y:.328125},{x:.546875,y:.328125},{x:.546875,y:.328125},{x:.578125,y:.328125},{x:.578125,y:.328125},{x:.609375,y:.328125},{x:.609375,y:.328125},{x:.640625,y:.328125},{x:.640625,y:.328125},{x:.671875,y:.328125},{x:.671875,y:.328125},{x:.703125,y:.328125},{x:.703125,y:.328125},{x:.734375,y:.328125},{x:.734375,y:.328125},{x:.765625,y:.328125},{x:.765625,y:.328125},{x:.796875,y:.328125},{x:.796875,y:.328125},{x:.828125,y:.328125},{x:.828125,y:.328125},{x:.859375,y:.328125},{x:.859375,y:.328125},{x:.890625,y:.328125},{x:.890625,y:.328125},{x:.921875,y:.328125},{x:.921875,y:.328125},{x:.953125,y:.328125},{x:.953125,y:.328125},{x:.984375,y:.328125},{x:.984375,y:.328125},{x:.015625,y:.359375},{x:.015625,y:.359375},{x:.046875,y:.359375},{x:.046875,y:.359375},{x:.078125,y:.359375},{x:.078125,y:.359375},{x:.109375,y:.359375},{x:.109375,y:.359375},{x:.140625,y:.359375},{x:.140625,y:.359375},{x:.171875,y:.359375},{x:.171875,y:.359375},{x:.203125,y:.359375},{x:.203125,y:.359375},{x:.234375,y:.359375},{x:.234375,y:.359375},{x:.265625,y:.359375},{x:.265625,y:.359375},{x:.296875,y:.359375},{x:.296875,y:.359375},{x:.328125,y:.359375},{x:.328125,y:.359375},{x:.359375,y:.359375},{x:.359375,y:.359375},{x:.390625,y:.359375},{x:.390625,y:.359375},{x:.421875,y:.359375},{x:.421875,y:.359375},{x:.453125,y:.359375},{x:.453125,y:.359375},{x:.484375,y:.359375},{x:.484375,y:.359375},{x:.515625,y:.359375},{x:.515625,y:.359375},{x:.546875,y:.359375},{x:.546875,y:.359375},{x:.578125,y:.359375},{x:.578125,y:.359375},{x:.609375,y:.359375},{x:.609375,y:.359375},{x:.640625,y:.359375},{x:.640625,y:.359375},{x:.671875,y:.359375},{x:.671875,y:.359375},{x:.703125,y:.359375},{x:.703125,y:.359375},{x:.734375,y:.359375},{x:.734375,y:.359375},{x:.765625,y:.359375},{x:.765625,y:.359375},{x:.796875,y:.359375},{x:.796875,y:.359375},{x:.828125,y:.359375},{x:.828125,y:.359375},{x:.859375,y:.359375},{x:.859375,y:.359375},{x:.890625,y:.359375},{x:.890625,y:.359375},{x:.921875,y:.359375},{x:.921875,y:.359375},{x:.953125,y:.359375},{x:.953125,y:.359375},{x:.984375,y:.359375},{x:.984375,y:.359375},{x:.015625,y:.390625},{x:.015625,y:.390625},{x:.046875,y:.390625},{x:.046875,y:.390625},{x:.078125,y:.390625},{x:.078125,y:.390625},{x:.109375,y:.390625},{x:.109375,y:.390625},{x:.140625,y:.390625},{x:.140625,y:.390625},{x:.171875,y:.390625},{x:.171875,y:.390625},{x:.203125,y:.390625},{x:.203125,y:.390625},{x:.234375,y:.390625},{x:.234375,y:.390625},{x:.265625,y:.390625},{x:.265625,y:.390625},{x:.296875,y:.390625},{x:.296875,y:.390625},{x:.328125,y:.390625},{x:.328125,y:.390625},{x:.359375,y:.390625},{x:.359375,y:.390625},{x:.390625,y:.390625},{x:.390625,y:.390625},{x:.421875,y:.390625},{x:.421875,y:.390625},{x:.453125,y:.390625},{x:.453125,y:.390625},{x:.484375,y:.390625},{x:.484375,y:.390625},{x:.515625,y:.390625},{x:.515625,y:.390625},{x:.546875,y:.390625},{x:.546875,y:.390625},{x:.578125,y:.390625},{x:.578125,y:.390625},{x:.609375,y:.390625},{x:.609375,y:.390625},{x:.640625,y:.390625},{x:.640625,y:.390625},{x:.671875,y:.390625},{x:.671875,y:.390625},{x:.703125,y:.390625},{x:.703125,y:.390625},{x:.734375,y:.390625},{x:.734375,y:.390625},{x:.765625,y:.390625},{x:.765625,y:.390625},{x:.796875,y:.390625},{x:.796875,y:.390625},{x:.828125,y:.390625},{x:.828125,y:.390625},{x:.859375,y:.390625},{x:.859375,y:.390625},{x:.890625,y:.390625},{x:.890625,y:.390625},{x:.921875,y:.390625},{x:.921875,y:.390625},{x:.953125,y:.390625},{x:.953125,y:.390625},{x:.984375,y:.390625},{x:.984375,y:.390625},{x:.015625,y:.421875},{x:.015625,y:.421875},{x:.046875,y:.421875},{x:.046875,y:.421875},{x:.078125,y:.421875},{x:.078125,y:.421875},{x:.109375,y:.421875},{x:.109375,y:.421875},{x:.140625,y:.421875},{x:.140625,y:.421875},{x:.171875,y:.421875},{x:.171875,y:.421875},{x:.203125,y:.421875},{x:.203125,y:.421875},{x:.234375,y:.421875},{x:.234375,y:.421875},{x:.265625,y:.421875},{x:.265625,y:.421875},{x:.296875,y:.421875},{x:.296875,y:.421875},{x:.328125,y:.421875},{x:.328125,y:.421875},{x:.359375,y:.421875},{x:.359375,y:.421875},{x:.390625,y:.421875},{x:.390625,y:.421875},{x:.421875,y:.421875},{x:.421875,y:.421875},{x:.453125,y:.421875},{x:.453125,y:.421875},{x:.484375,y:.421875},{x:.484375,y:.421875},{x:.515625,y:.421875},{x:.515625,y:.421875},{x:.546875,y:.421875},{x:.546875,y:.421875},{x:.578125,y:.421875},{x:.578125,y:.421875},{x:.609375,y:.421875},{x:.609375,y:.421875},{x:.640625,y:.421875},{x:.640625,y:.421875},{x:.671875,y:.421875},{x:.671875,y:.421875},{x:.703125,y:.421875},{x:.703125,y:.421875},{x:.734375,y:.421875},{x:.734375,y:.421875},{x:.765625,y:.421875},{x:.765625,y:.421875},{x:.796875,y:.421875},{x:.796875,y:.421875},{x:.828125,y:.421875},{x:.828125,y:.421875},{x:.859375,y:.421875},{x:.859375,y:.421875},{x:.890625,y:.421875},{x:.890625,y:.421875},{x:.921875,y:.421875},{x:.921875,y:.421875},{x:.953125,y:.421875},{x:.953125,y:.421875},{x:.984375,y:.421875},{x:.984375,y:.421875},{x:.015625,y:.453125},{x:.015625,y:.453125},{x:.046875,y:.453125},{x:.046875,y:.453125},{x:.078125,y:.453125},{x:.078125,y:.453125},{x:.109375,y:.453125},{x:.109375,y:.453125},{x:.140625,y:.453125},{x:.140625,y:.453125},{x:.171875,y:.453125},{x:.171875,y:.453125},{x:.203125,y:.453125},{x:.203125,y:.453125},{x:.234375,y:.453125},{x:.234375,y:.453125},{x:.265625,y:.453125},{x:.265625,y:.453125},{x:.296875,y:.453125},{x:.296875,y:.453125},{x:.328125,y:.453125},{x:.328125,y:.453125},{x:.359375,y:.453125},{x:.359375,y:.453125},{x:.390625,y:.453125},{x:.390625,y:.453125},{x:.421875,y:.453125},{x:.421875,y:.453125},{x:.453125,y:.453125},{x:.453125,y:.453125},{x:.484375,y:.453125},{x:.484375,y:.453125},{x:.515625,y:.453125},{x:.515625,y:.453125},{x:.546875,y:.453125},{x:.546875,y:.453125},{x:.578125,y:.453125},{x:.578125,y:.453125},{x:.609375,y:.453125},{x:.609375,y:.453125},{x:.640625,y:.453125},{x:.640625,y:.453125},{x:.671875,y:.453125},{x:.671875,y:.453125},{x:.703125,y:.453125},{x:.703125,y:.453125},{x:.734375,y:.453125},{x:.734375,y:.453125},{x:.765625,y:.453125},{x:.765625,y:.453125},{x:.796875,y:.453125},{x:.796875,y:.453125},{x:.828125,y:.453125},{x:.828125,y:.453125},{x:.859375,y:.453125},{x:.859375,y:.453125},{x:.890625,y:.453125},{x:.890625,y:.453125},{x:.921875,y:.453125},{x:.921875,y:.453125},{x:.953125,y:.453125},{x:.953125,y:.453125},{x:.984375,y:.453125},{x:.984375,y:.453125},{x:.015625,y:.484375},{x:.015625,y:.484375},{x:.046875,y:.484375},{x:.046875,y:.484375},{x:.078125,y:.484375},{x:.078125,y:.484375},{x:.109375,y:.484375},{x:.109375,y:.484375},{x:.140625,y:.484375},{x:.140625,y:.484375},{x:.171875,y:.484375},{x:.171875,y:.484375},{x:.203125,y:.484375},{x:.203125,y:.484375},{x:.234375,y:.484375},{x:.234375,y:.484375},{x:.265625,y:.484375},{x:.265625,y:.484375},{x:.296875,y:.484375},{x:.296875,y:.484375},{x:.328125,y:.484375},{x:.328125,y:.484375},{x:.359375,y:.484375},{x:.359375,y:.484375},{x:.390625,y:.484375},{x:.390625,y:.484375},{x:.421875,y:.484375},{x:.421875,y:.484375},{x:.453125,y:.484375},{x:.453125,y:.484375},{x:.484375,y:.484375},{x:.484375,y:.484375},{x:.515625,y:.484375},{x:.515625,y:.484375},{x:.546875,y:.484375},{x:.546875,y:.484375},{x:.578125,y:.484375},{x:.578125,y:.484375},{x:.609375,y:.484375},{x:.609375,y:.484375},{x:.640625,y:.484375},{x:.640625,y:.484375},{x:.671875,y:.484375},{x:.671875,y:.484375},{x:.703125,y:.484375},{x:.703125,y:.484375},{x:.734375,y:.484375},{x:.734375,y:.484375},{x:.765625,y:.484375},{x:.765625,y:.484375},{x:.796875,y:.484375},{x:.796875,y:.484375},{x:.828125,y:.484375},{x:.828125,y:.484375},{x:.859375,y:.484375},{x:.859375,y:.484375},{x:.890625,y:.484375},{x:.890625,y:.484375},{x:.921875,y:.484375},{x:.921875,y:.484375},{x:.953125,y:.484375},{x:.953125,y:.484375},{x:.984375,y:.484375},{x:.984375,y:.484375},{x:.015625,y:.515625},{x:.015625,y:.515625},{x:.046875,y:.515625},{x:.046875,y:.515625},{x:.078125,y:.515625},{x:.078125,y:.515625},{x:.109375,y:.515625},{x:.109375,y:.515625},{x:.140625,y:.515625},{x:.140625,y:.515625},{x:.171875,y:.515625},{x:.171875,y:.515625},{x:.203125,y:.515625},{x:.203125,y:.515625},{x:.234375,y:.515625},{x:.234375,y:.515625},{x:.265625,y:.515625},{x:.265625,y:.515625},{x:.296875,y:.515625},{x:.296875,y:.515625},{x:.328125,y:.515625},{x:.328125,y:.515625},{x:.359375,y:.515625},{x:.359375,y:.515625},{x:.390625,y:.515625},{x:.390625,y:.515625},{x:.421875,y:.515625},{x:.421875,y:.515625},{x:.453125,y:.515625},{x:.453125,y:.515625},{x:.484375,y:.515625},{x:.484375,y:.515625},{x:.515625,y:.515625},{x:.515625,y:.515625},{x:.546875,y:.515625},{x:.546875,y:.515625},{x:.578125,y:.515625},{x:.578125,y:.515625},{x:.609375,y:.515625},{x:.609375,y:.515625},{x:.640625,y:.515625},{x:.640625,y:.515625},{x:.671875,y:.515625},{x:.671875,y:.515625},{x:.703125,y:.515625},{x:.703125,y:.515625},{x:.734375,y:.515625},{x:.734375,y:.515625},{x:.765625,y:.515625},{x:.765625,y:.515625},{x:.796875,y:.515625},{x:.796875,y:.515625},{x:.828125,y:.515625},{x:.828125,y:.515625},{x:.859375,y:.515625},{x:.859375,y:.515625},{x:.890625,y:.515625},{x:.890625,y:.515625},{x:.921875,y:.515625},{x:.921875,y:.515625},{x:.953125,y:.515625},{x:.953125,y:.515625},{x:.984375,y:.515625},{x:.984375,y:.515625},{x:.015625,y:.546875},{x:.015625,y:.546875},{x:.046875,y:.546875},{x:.046875,y:.546875},{x:.078125,y:.546875},{x:.078125,y:.546875},{x:.109375,y:.546875},{x:.109375,y:.546875},{x:.140625,y:.546875},{x:.140625,y:.546875},{x:.171875,y:.546875},{x:.171875,y:.546875},{x:.203125,y:.546875},{x:.203125,y:.546875},{x:.234375,y:.546875},{x:.234375,y:.546875},{x:.265625,y:.546875},{x:.265625,y:.546875},{x:.296875,y:.546875},{x:.296875,y:.546875},{x:.328125,y:.546875},{x:.328125,y:.546875},{x:.359375,y:.546875},{x:.359375,y:.546875},{x:.390625,y:.546875},{x:.390625,y:.546875},{x:.421875,y:.546875},{x:.421875,y:.546875},{x:.453125,y:.546875},{x:.453125,y:.546875},{x:.484375,y:.546875},{x:.484375,y:.546875},{x:.515625,y:.546875},{x:.515625,y:.546875},{x:.546875,y:.546875},{x:.546875,y:.546875},{x:.578125,y:.546875},{x:.578125,y:.546875},{x:.609375,y:.546875},{x:.609375,y:.546875},{x:.640625,y:.546875},{x:.640625,y:.546875},{x:.671875,y:.546875},{x:.671875,y:.546875},{x:.703125,y:.546875},{x:.703125,y:.546875},{x:.734375,y:.546875},{x:.734375,y:.546875},{x:.765625,y:.546875},{x:.765625,y:.546875},{x:.796875,y:.546875},{x:.796875,y:.546875},{x:.828125,y:.546875},{x:.828125,y:.546875},{x:.859375,y:.546875},{x:.859375,y:.546875},{x:.890625,y:.546875},{x:.890625,y:.546875},{x:.921875,y:.546875},{x:.921875,y:.546875},{x:.953125,y:.546875},{x:.953125,y:.546875},{x:.984375,y:.546875},{x:.984375,y:.546875},{x:.015625,y:.578125},{x:.015625,y:.578125},{x:.046875,y:.578125},{x:.046875,y:.578125},{x:.078125,y:.578125},{x:.078125,y:.578125},{x:.109375,y:.578125},{x:.109375,y:.578125},{x:.140625,y:.578125},{x:.140625,y:.578125},{x:.171875,y:.578125},{x:.171875,y:.578125},{x:.203125,y:.578125},{x:.203125,y:.578125},{x:.234375,y:.578125},{x:.234375,y:.578125},{x:.265625,y:.578125},{x:.265625,y:.578125},{x:.296875,y:.578125},{x:.296875,y:.578125},{x:.328125,y:.578125},{x:.328125,y:.578125},{x:.359375,y:.578125},{x:.359375,y:.578125},{x:.390625,y:.578125},{x:.390625,y:.578125},{x:.421875,y:.578125},{x:.421875,y:.578125},{x:.453125,y:.578125},{x:.453125,y:.578125},{x:.484375,y:.578125},{x:.484375,y:.578125},{x:.515625,y:.578125},{x:.515625,y:.578125},{x:.546875,y:.578125},{x:.546875,y:.578125},{x:.578125,y:.578125},{x:.578125,y:.578125},{x:.609375,y:.578125},{x:.609375,y:.578125},{x:.640625,y:.578125},{x:.640625,y:.578125},{x:.671875,y:.578125},{x:.671875,y:.578125},{x:.703125,y:.578125},{x:.703125,y:.578125},{x:.734375,y:.578125},{x:.734375,y:.578125},{x:.765625,y:.578125},{x:.765625,y:.578125},{x:.796875,y:.578125},{x:.796875,y:.578125},{x:.828125,y:.578125},{x:.828125,y:.578125},{x:.859375,y:.578125},{x:.859375,y:.578125},{x:.890625,y:.578125},{x:.890625,y:.578125},{x:.921875,y:.578125},{x:.921875,y:.578125},{x:.953125,y:.578125},{x:.953125,y:.578125},{x:.984375,y:.578125},{x:.984375,y:.578125},{x:.015625,y:.609375},{x:.015625,y:.609375},{x:.046875,y:.609375},{x:.046875,y:.609375},{x:.078125,y:.609375},{x:.078125,y:.609375},{x:.109375,y:.609375},{x:.109375,y:.609375},{x:.140625,y:.609375},{x:.140625,y:.609375},{x:.171875,y:.609375},{x:.171875,y:.609375},{x:.203125,y:.609375},{x:.203125,y:.609375},{x:.234375,y:.609375},{x:.234375,y:.609375},{x:.265625,y:.609375},{x:.265625,y:.609375},{x:.296875,y:.609375},{x:.296875,y:.609375},{x:.328125,y:.609375},{x:.328125,y:.609375},{x:.359375,y:.609375},{x:.359375,y:.609375},{x:.390625,y:.609375},{x:.390625,y:.609375},{x:.421875,y:.609375},{x:.421875,y:.609375},{x:.453125,y:.609375},{x:.453125,y:.609375},{x:.484375,y:.609375},{x:.484375,y:.609375},{x:.515625,y:.609375},{x:.515625,y:.609375},{x:.546875,y:.609375},{x:.546875,y:.609375},{x:.578125,y:.609375},{x:.578125,y:.609375},{x:.609375,y:.609375},{x:.609375,y:.609375},{x:.640625,y:.609375},{x:.640625,y:.609375},{x:.671875,y:.609375},{x:.671875,y:.609375},{x:.703125,y:.609375},{x:.703125,y:.609375},{x:.734375,y:.609375},{x:.734375,y:.609375},{x:.765625,y:.609375},{x:.765625,y:.609375},{x:.796875,y:.609375},{x:.796875,y:.609375},{x:.828125,y:.609375},{x:.828125,y:.609375},{x:.859375,y:.609375},{x:.859375,y:.609375},{x:.890625,y:.609375},{x:.890625,y:.609375},{x:.921875,y:.609375},{x:.921875,y:.609375},{x:.953125,y:.609375},{x:.953125,y:.609375},{x:.984375,y:.609375},{x:.984375,y:.609375},{x:.015625,y:.640625},{x:.015625,y:.640625},{x:.046875,y:.640625},{x:.046875,y:.640625},{x:.078125,y:.640625},{x:.078125,y:.640625},{x:.109375,y:.640625},{x:.109375,y:.640625},{x:.140625,y:.640625},{x:.140625,y:.640625},{x:.171875,y:.640625},{x:.171875,y:.640625},{x:.203125,y:.640625},{x:.203125,y:.640625},{x:.234375,y:.640625},{x:.234375,y:.640625},{x:.265625,y:.640625},{x:.265625,y:.640625},{x:.296875,y:.640625},{x:.296875,y:.640625},{x:.328125,y:.640625},{x:.328125,y:.640625},{x:.359375,y:.640625},{x:.359375,y:.640625},{x:.390625,y:.640625},{x:.390625,y:.640625},{x:.421875,y:.640625},{x:.421875,y:.640625},{x:.453125,y:.640625},{x:.453125,y:.640625},{x:.484375,y:.640625},{x:.484375,y:.640625},{x:.515625,y:.640625},{x:.515625,y:.640625},{x:.546875,y:.640625},{x:.546875,y:.640625},{x:.578125,y:.640625},{x:.578125,y:.640625},{x:.609375,y:.640625},{x:.609375,y:.640625},{x:.640625,y:.640625},{x:.640625,y:.640625},{x:.671875,y:.640625},{x:.671875,y:.640625},{x:.703125,y:.640625},{x:.703125,y:.640625},{x:.734375,y:.640625},{x:.734375,y:.640625},{x:.765625,y:.640625},{x:.765625,y:.640625},{x:.796875,y:.640625},{x:.796875,y:.640625},{x:.828125,y:.640625},{x:.828125,y:.640625},{x:.859375,y:.640625},{x:.859375,y:.640625},{x:.890625,y:.640625},{x:.890625,y:.640625},{x:.921875,y:.640625},{x:.921875,y:.640625},{x:.953125,y:.640625},{x:.953125,y:.640625},{x:.984375,y:.640625},{x:.984375,y:.640625},{x:.015625,y:.671875},{x:.015625,y:.671875},{x:.046875,y:.671875},{x:.046875,y:.671875},{x:.078125,y:.671875},{x:.078125,y:.671875},{x:.109375,y:.671875},{x:.109375,y:.671875},{x:.140625,y:.671875},{x:.140625,y:.671875},{x:.171875,y:.671875},{x:.171875,y:.671875},{x:.203125,y:.671875},{x:.203125,y:.671875},{x:.234375,y:.671875},{x:.234375,y:.671875},{x:.265625,y:.671875},{x:.265625,y:.671875},{x:.296875,y:.671875},{x:.296875,y:.671875},{x:.328125,y:.671875},{x:.328125,y:.671875},{x:.359375,y:.671875},{x:.359375,y:.671875},{x:.390625,y:.671875},{x:.390625,y:.671875},{x:.421875,y:.671875},{x:.421875,y:.671875},{x:.453125,y:.671875},{x:.453125,y:.671875},{x:.484375,y:.671875},{x:.484375,y:.671875},{x:.515625,y:.671875},{x:.515625,y:.671875},{x:.546875,y:.671875},{x:.546875,y:.671875},{x:.578125,y:.671875},{x:.578125,y:.671875},{x:.609375,y:.671875},{x:.609375,y:.671875},{x:.640625,y:.671875},{x:.640625,y:.671875},{x:.671875,y:.671875},{x:.671875,y:.671875},{x:.703125,y:.671875},{x:.703125,y:.671875},{x:.734375,y:.671875},{x:.734375,y:.671875},{x:.765625,y:.671875},{x:.765625,y:.671875},{x:.796875,y:.671875},{x:.796875,y:.671875},{x:.828125,y:.671875},{x:.828125,y:.671875},{x:.859375,y:.671875},{x:.859375,y:.671875},{x:.890625,y:.671875},{x:.890625,y:.671875},{x:.921875,y:.671875},{x:.921875,y:.671875},{x:.953125,y:.671875},{x:.953125,y:.671875},{x:.984375,y:.671875},{x:.984375,y:.671875},{x:.015625,y:.703125},{x:.015625,y:.703125},{x:.046875,y:.703125},{x:.046875,y:.703125},{x:.078125,y:.703125},{x:.078125,y:.703125},{x:.109375,y:.703125},{x:.109375,y:.703125},{x:.140625,y:.703125},{x:.140625,y:.703125},{x:.171875,y:.703125},{x:.171875,y:.703125},{x:.203125,y:.703125},{x:.203125,y:.703125},{x:.234375,y:.703125},{x:.234375,y:.703125},{x:.265625,y:.703125},{x:.265625,y:.703125},{x:.296875,y:.703125},{x:.296875,y:.703125},{x:.328125,y:.703125},{x:.328125,y:.703125},{x:.359375,y:.703125},{x:.359375,y:.703125},{x:.390625,y:.703125},{x:.390625,y:.703125},{x:.421875,y:.703125},{x:.421875,y:.703125},{x:.453125,y:.703125},{x:.453125,y:.703125},{x:.484375,y:.703125},{x:.484375,y:.703125},{x:.515625,y:.703125},{x:.515625,y:.703125},{x:.546875,y:.703125},{x:.546875,y:.703125},{x:.578125,y:.703125},{x:.578125,y:.703125},{x:.609375,y:.703125},{x:.609375,y:.703125},{x:.640625,y:.703125},{x:.640625,y:.703125},{x:.671875,y:.703125},{x:.671875,y:.703125},{x:.703125,y:.703125},{x:.703125,y:.703125},{x:.734375,y:.703125},{x:.734375,y:.703125},{x:.765625,y:.703125},{x:.765625,y:.703125},{x:.796875,y:.703125},{x:.796875,y:.703125},{x:.828125,y:.703125},{x:.828125,y:.703125},{x:.859375,y:.703125},{x:.859375,y:.703125},{x:.890625,y:.703125},{x:.890625,y:.703125},{x:.921875,y:.703125},{x:.921875,y:.703125},{x:.953125,y:.703125},{x:.953125,y:.703125},{x:.984375,y:.703125},{x:.984375,y:.703125},{x:.015625,y:.734375},{x:.015625,y:.734375},{x:.046875,y:.734375},{x:.046875,y:.734375},{x:.078125,y:.734375},{x:.078125,y:.734375},{x:.109375,y:.734375},{x:.109375,y:.734375},{x:.140625,y:.734375},{x:.140625,y:.734375},{x:.171875,y:.734375},{x:.171875,y:.734375},{x:.203125,y:.734375},{x:.203125,y:.734375},{x:.234375,y:.734375},{x:.234375,y:.734375},{x:.265625,y:.734375},{x:.265625,y:.734375},{x:.296875,y:.734375},{x:.296875,y:.734375},{x:.328125,y:.734375},{x:.328125,y:.734375},{x:.359375,y:.734375},{x:.359375,y:.734375},{x:.390625,y:.734375},{x:.390625,y:.734375},{x:.421875,y:.734375},{x:.421875,y:.734375},{x:.453125,y:.734375},{x:.453125,y:.734375},{x:.484375,y:.734375},{x:.484375,y:.734375},{x:.515625,y:.734375},{x:.515625,y:.734375},{x:.546875,y:.734375},{x:.546875,y:.734375},{x:.578125,y:.734375},{x:.578125,y:.734375},{x:.609375,y:.734375},{x:.609375,y:.734375},{x:.640625,y:.734375},{x:.640625,y:.734375},{x:.671875,y:.734375},{x:.671875,y:.734375},{x:.703125,y:.734375},{x:.703125,y:.734375},{x:.734375,y:.734375},{x:.734375,y:.734375},{x:.765625,y:.734375},{x:.765625,y:.734375},{x:.796875,y:.734375},{x:.796875,y:.734375},{x:.828125,y:.734375},{x:.828125,y:.734375},{x:.859375,y:.734375},{x:.859375,y:.734375},{x:.890625,y:.734375},{x:.890625,y:.734375},{x:.921875,y:.734375},{x:.921875,y:.734375},{x:.953125,y:.734375},{x:.953125,y:.734375},{x:.984375,y:.734375},{x:.984375,y:.734375},{x:.015625,y:.765625},{x:.015625,y:.765625},{x:.046875,y:.765625},{x:.046875,y:.765625},{x:.078125,y:.765625},{x:.078125,y:.765625},{x:.109375,y:.765625},{x:.109375,y:.765625},{x:.140625,y:.765625},{x:.140625,y:.765625},{x:.171875,y:.765625},{x:.171875,y:.765625},{x:.203125,y:.765625},{x:.203125,y:.765625},{x:.234375,y:.765625},{x:.234375,y:.765625},{x:.265625,y:.765625},{x:.265625,y:.765625},{x:.296875,y:.765625},{x:.296875,y:.765625},{x:.328125,y:.765625},{x:.328125,y:.765625},{x:.359375,y:.765625},{x:.359375,y:.765625},{x:.390625,y:.765625},{x:.390625,y:.765625},{x:.421875,y:.765625},{x:.421875,y:.765625},{x:.453125,y:.765625},{x:.453125,y:.765625},{x:.484375,y:.765625},{x:.484375,y:.765625},{x:.515625,y:.765625},{x:.515625,y:.765625},{x:.546875,y:.765625},{x:.546875,y:.765625},{x:.578125,y:.765625},{x:.578125,y:.765625},{x:.609375,y:.765625},{x:.609375,y:.765625},{x:.640625,y:.765625},{x:.640625,y:.765625},{x:.671875,y:.765625},{x:.671875,y:.765625},{x:.703125,y:.765625},{x:.703125,y:.765625},{x:.734375,y:.765625},{x:.734375,y:.765625},{x:.765625,y:.765625},{x:.765625,y:.765625},{x:.796875,y:.765625},{x:.796875,y:.765625},{x:.828125,y:.765625},{x:.828125,y:.765625},{x:.859375,y:.765625},{x:.859375,y:.765625},{x:.890625,y:.765625},{x:.890625,y:.765625},{x:.921875,y:.765625},{x:.921875,y:.765625},{x:.953125,y:.765625},{x:.953125,y:.765625},{x:.984375,y:.765625},{x:.984375,y:.765625},{x:.015625,y:.796875},{x:.015625,y:.796875},{x:.046875,y:.796875},{x:.046875,y:.796875},{x:.078125,y:.796875},{x:.078125,y:.796875},{x:.109375,y:.796875},{x:.109375,y:.796875},{x:.140625,y:.796875},{x:.140625,y:.796875},{x:.171875,y:.796875},{x:.171875,y:.796875},{x:.203125,y:.796875},{x:.203125,y:.796875},{x:.234375,y:.796875},{x:.234375,y:.796875},{x:.265625,y:.796875},{x:.265625,y:.796875},{x:.296875,y:.796875},{x:.296875,y:.796875},{x:.328125,y:.796875},{x:.328125,y:.796875},{x:.359375,y:.796875},{x:.359375,y:.796875},{x:.390625,y:.796875},{x:.390625,y:.796875},{x:.421875,y:.796875},{x:.421875,y:.796875},{x:.453125,y:.796875},{x:.453125,y:.796875},{x:.484375,y:.796875},{x:.484375,y:.796875},{x:.515625,y:.796875},{x:.515625,y:.796875},{x:.546875,y:.796875},{x:.546875,y:.796875},{x:.578125,y:.796875},{x:.578125,y:.796875},{x:.609375,y:.796875},{x:.609375,y:.796875},{x:.640625,y:.796875},{x:.640625,y:.796875},{x:.671875,y:.796875},{x:.671875,y:.796875},{x:.703125,y:.796875},{x:.703125,y:.796875},{x:.734375,y:.796875},{x:.734375,y:.796875},{x:.765625,y:.796875},{x:.765625,y:.796875},{x:.796875,y:.796875},{x:.796875,y:.796875},{x:.828125,y:.796875},{x:.828125,y:.796875},{x:.859375,y:.796875},{x:.859375,y:.796875},{x:.890625,y:.796875},{x:.890625,y:.796875},{x:.921875,y:.796875},{x:.921875,y:.796875},{x:.953125,y:.796875},{x:.953125,y:.796875},{x:.984375,y:.796875},{x:.984375,y:.796875},{x:.015625,y:.828125},{x:.015625,y:.828125},{x:.046875,y:.828125},{x:.046875,y:.828125},{x:.078125,y:.828125},{x:.078125,y:.828125},{x:.109375,y:.828125},{x:.109375,y:.828125},{x:.140625,y:.828125},{x:.140625,y:.828125},{x:.171875,y:.828125},{x:.171875,y:.828125},{x:.203125,y:.828125},{x:.203125,y:.828125},{x:.234375,y:.828125},{x:.234375,y:.828125},{x:.265625,y:.828125},{x:.265625,y:.828125},{x:.296875,y:.828125},{x:.296875,y:.828125},{x:.328125,y:.828125},{x:.328125,y:.828125},{x:.359375,y:.828125},{x:.359375,y:.828125},{x:.390625,y:.828125},{x:.390625,y:.828125},{x:.421875,y:.828125},{x:.421875,y:.828125},{x:.453125,y:.828125},{x:.453125,y:.828125},{x:.484375,y:.828125},{x:.484375,y:.828125},{x:.515625,y:.828125},{x:.515625,y:.828125},{x:.546875,y:.828125},{x:.546875,y:.828125},{x:.578125,y:.828125},{x:.578125,y:.828125},{x:.609375,y:.828125},{x:.609375,y:.828125},{x:.640625,y:.828125},{x:.640625,y:.828125},{x:.671875,y:.828125},{x:.671875,y:.828125},{x:.703125,y:.828125},{x:.703125,y:.828125},{x:.734375,y:.828125},{x:.734375,y:.828125},{x:.765625,y:.828125},{x:.765625,y:.828125},{x:.796875,y:.828125},{x:.796875,y:.828125},{x:.828125,y:.828125},{x:.828125,y:.828125},{x:.859375,y:.828125},{x:.859375,y:.828125},{x:.890625,y:.828125},{x:.890625,y:.828125},{x:.921875,y:.828125},{x:.921875,y:.828125},{x:.953125,y:.828125},{x:.953125,y:.828125},{x:.984375,y:.828125},{x:.984375,y:.828125},{x:.015625,y:.859375},{x:.015625,y:.859375},{x:.046875,y:.859375},{x:.046875,y:.859375},{x:.078125,y:.859375},{x:.078125,y:.859375},{x:.109375,y:.859375},{x:.109375,y:.859375},{x:.140625,y:.859375},{x:.140625,y:.859375},{x:.171875,y:.859375},{x:.171875,y:.859375},{x:.203125,y:.859375},{x:.203125,y:.859375},{x:.234375,y:.859375},{x:.234375,y:.859375},{x:.265625,y:.859375},{x:.265625,y:.859375},{x:.296875,y:.859375},{x:.296875,y:.859375},{x:.328125,y:.859375},{x:.328125,y:.859375},{x:.359375,y:.859375},{x:.359375,y:.859375},{x:.390625,y:.859375},{x:.390625,y:.859375},{x:.421875,y:.859375},{x:.421875,y:.859375},{x:.453125,y:.859375},{x:.453125,y:.859375},{x:.484375,y:.859375},{x:.484375,y:.859375},{x:.515625,y:.859375},{x:.515625,y:.859375},{x:.546875,y:.859375},{x:.546875,y:.859375},{x:.578125,y:.859375},{x:.578125,y:.859375},{x:.609375,y:.859375},{x:.609375,y:.859375},{x:.640625,y:.859375},{x:.640625,y:.859375},{x:.671875,y:.859375},{x:.671875,y:.859375},{x:.703125,y:.859375},{x:.703125,y:.859375},{x:.734375,y:.859375},{x:.734375,y:.859375},{x:.765625,y:.859375},{x:.765625,y:.859375},{x:.796875,y:.859375},{x:.796875,y:.859375},{x:.828125,y:.859375},{x:.828125,y:.859375},{x:.859375,y:.859375},{x:.859375,y:.859375},{x:.890625,y:.859375},{x:.890625,y:.859375},{x:.921875,y:.859375},{x:.921875,y:.859375},{x:.953125,y:.859375},{x:.953125,y:.859375},{x:.984375,y:.859375},{x:.984375,y:.859375},{x:.015625,y:.890625},{x:.015625,y:.890625},{x:.046875,y:.890625},{x:.046875,y:.890625},{x:.078125,y:.890625},{x:.078125,y:.890625},{x:.109375,y:.890625},{x:.109375,y:.890625},{x:.140625,y:.890625},{x:.140625,y:.890625},{x:.171875,y:.890625},{x:.171875,y:.890625},{x:.203125,y:.890625},{x:.203125,y:.890625},{x:.234375,y:.890625},{x:.234375,y:.890625},{x:.265625,y:.890625},{x:.265625,y:.890625},{x:.296875,y:.890625},{x:.296875,y:.890625},{x:.328125,y:.890625},{x:.328125,y:.890625},{x:.359375,y:.890625},{x:.359375,y:.890625},{x:.390625,y:.890625},{x:.390625,y:.890625},{x:.421875,y:.890625},{x:.421875,y:.890625},{x:.453125,y:.890625},{x:.453125,y:.890625},{x:.484375,y:.890625},{x:.484375,y:.890625},{x:.515625,y:.890625},{x:.515625,y:.890625},{x:.546875,y:.890625},{x:.546875,y:.890625},{x:.578125,y:.890625},{x:.578125,y:.890625},{x:.609375,y:.890625},{x:.609375,y:.890625},{x:.640625,y:.890625},{x:.640625,y:.890625},{x:.671875,y:.890625},{x:.671875,y:.890625},{x:.703125,y:.890625},{x:.703125,y:.890625},{x:.734375,y:.890625},{x:.734375,y:.890625},{x:.765625,y:.890625},{x:.765625,y:.890625},{x:.796875,y:.890625},{x:.796875,y:.890625},{x:.828125,y:.890625},{x:.828125,y:.890625},{x:.859375,y:.890625},{x:.859375,y:.890625},{x:.890625,y:.890625},{x:.890625,y:.890625},{x:.921875,y:.890625},{x:.921875,y:.890625},{x:.953125,y:.890625},{x:.953125,y:.890625},{x:.984375,y:.890625},{x:.984375,y:.890625},{x:.015625,y:.921875},{x:.015625,y:.921875},{x:.046875,y:.921875},{x:.046875,y:.921875},{x:.078125,y:.921875},{x:.078125,y:.921875},{x:.109375,y:.921875},{x:.109375,y:.921875},{x:.140625,y:.921875},{x:.140625,y:.921875},{x:.171875,y:.921875},{x:.171875,y:.921875},{x:.203125,y:.921875},{x:.203125,y:.921875},{x:.234375,y:.921875},{x:.234375,y:.921875},{x:.265625,y:.921875},{x:.265625,y:.921875},{x:.296875,y:.921875},{x:.296875,y:.921875},{x:.328125,y:.921875},{x:.328125,y:.921875},{x:.359375,y:.921875},{x:.359375,y:.921875},{x:.390625,y:.921875},{x:.390625,y:.921875},{x:.421875,y:.921875},{x:.421875,y:.921875},{x:.453125,y:.921875},{x:.453125,y:.921875},{x:.484375,y:.921875},{x:.484375,y:.921875},{x:.515625,y:.921875},{x:.515625,y:.921875},{x:.546875,y:.921875},{x:.546875,y:.921875},{x:.578125,y:.921875},{x:.578125,y:.921875},{x:.609375,y:.921875},{x:.609375,y:.921875},{x:.640625,y:.921875},{x:.640625,y:.921875},{x:.671875,y:.921875},{x:.671875,y:.921875},{x:.703125,y:.921875},{x:.703125,y:.921875},{x:.734375,y:.921875},{x:.734375,y:.921875},{x:.765625,y:.921875},{x:.765625,y:.921875},{x:.796875,y:.921875},{x:.796875,y:.921875},{x:.828125,y:.921875},{x:.828125,y:.921875},{x:.859375,y:.921875},{x:.859375,y:.921875},{x:.890625,y:.921875},{x:.890625,y:.921875},{x:.921875,y:.921875},{x:.921875,y:.921875},{x:.953125,y:.921875},{x:.953125,y:.921875},{x:.984375,y:.921875},{x:.984375,y:.921875},{x:.015625,y:.953125},{x:.015625,y:.953125},{x:.046875,y:.953125},{x:.046875,y:.953125},{x:.078125,y:.953125},{x:.078125,y:.953125},{x:.109375,y:.953125},{x:.109375,y:.953125},{x:.140625,y:.953125},{x:.140625,y:.953125},{x:.171875,y:.953125},{x:.171875,y:.953125},{x:.203125,y:.953125},{x:.203125,y:.953125},{x:.234375,y:.953125},{x:.234375,y:.953125},{x:.265625,y:.953125},{x:.265625,y:.953125},{x:.296875,y:.953125},{x:.296875,y:.953125},{x:.328125,y:.953125},{x:.328125,y:.953125},{x:.359375,y:.953125},{x:.359375,y:.953125},{x:.390625,y:.953125},{x:.390625,y:.953125},{x:.421875,y:.953125},{x:.421875,y:.953125},{x:.453125,y:.953125},{x:.453125,y:.953125},{x:.484375,y:.953125},{x:.484375,y:.953125},{x:.515625,y:.953125},{x:.515625,y:.953125},{x:.546875,y:.953125},{x:.546875,y:.953125},{x:.578125,y:.953125},{x:.578125,y:.953125},{x:.609375,y:.953125},{x:.609375,y:.953125},{x:.640625,y:.953125},{x:.640625,y:.953125},{x:.671875,y:.953125},{x:.671875,y:.953125},{x:.703125,y:.953125},{x:.703125,y:.953125},{x:.734375,y:.953125},{x:.734375,y:.953125},{x:.765625,y:.953125},{x:.765625,y:.953125},{x:.796875,y:.953125},{x:.796875,y:.953125},{x:.828125,y:.953125},{x:.828125,y:.953125},{x:.859375,y:.953125},{x:.859375,y:.953125},{x:.890625,y:.953125},{x:.890625,y:.953125},{x:.921875,y:.953125},{x:.921875,y:.953125},{x:.953125,y:.953125},{x:.953125,y:.953125},{x:.984375,y:.953125},{x:.984375,y:.953125},{x:.015625,y:.984375},{x:.015625,y:.984375},{x:.046875,y:.984375},{x:.046875,y:.984375},{x:.078125,y:.984375},{x:.078125,y:.984375},{x:.109375,y:.984375},{x:.109375,y:.984375},{x:.140625,y:.984375},{x:.140625,y:.984375},{x:.171875,y:.984375},{x:.171875,y:.984375},{x:.203125,y:.984375},{x:.203125,y:.984375},{x:.234375,y:.984375},{x:.234375,y:.984375},{x:.265625,y:.984375},{x:.265625,y:.984375},{x:.296875,y:.984375},{x:.296875,y:.984375},{x:.328125,y:.984375},{x:.328125,y:.984375},{x:.359375,y:.984375},{x:.359375,y:.984375},{x:.390625,y:.984375},{x:.390625,y:.984375},{x:.421875,y:.984375},{x:.421875,y:.984375},{x:.453125,y:.984375},{x:.453125,y:.984375},{x:.484375,y:.984375},{x:.484375,y:.984375},{x:.515625,y:.984375},{x:.515625,y:.984375},{x:.546875,y:.984375},{x:.546875,y:.984375},{x:.578125,y:.984375},{x:.578125,y:.984375},{x:.609375,y:.984375},{x:.609375,y:.984375},{x:.640625,y:.984375},{x:.640625,y:.984375},{x:.671875,y:.984375},{x:.671875,y:.984375},{x:.703125,y:.984375},{x:.703125,y:.984375},{x:.734375,y:.984375},{x:.734375,y:.984375},{x:.765625,y:.984375},{x:.765625,y:.984375},{x:.796875,y:.984375},{x:.796875,y:.984375},{x:.828125,y:.984375},{x:.828125,y:.984375},{x:.859375,y:.984375},{x:.859375,y:.984375},{x:.890625,y:.984375},{x:.890625,y:.984375},{x:.921875,y:.984375},{x:.921875,y:.984375},{x:.953125,y:.984375},{x:.953125,y:.984375},{x:.984375,y:.984375},{x:.984375,y:.984375},{x:.03125,y:.03125},{x:.03125,y:.03125},{x:.09375,y:.03125},{x:.09375,y:.03125},{x:.15625,y:.03125},{x:.15625,y:.03125},{x:.21875,y:.03125},{x:.21875,y:.03125},{x:.28125,y:.03125},{x:.28125,y:.03125},{x:.34375,y:.03125},{x:.34375,y:.03125},{x:.40625,y:.03125},{x:.40625,y:.03125},{x:.46875,y:.03125},{x:.46875,y:.03125},{x:.53125,y:.03125},{x:.53125,y:.03125},{x:.59375,y:.03125},{x:.59375,y:.03125},{x:.65625,y:.03125},{x:.65625,y:.03125},{x:.71875,y:.03125},{x:.71875,y:.03125},{x:.78125,y:.03125},{x:.78125,y:.03125},{x:.84375,y:.03125},{x:.84375,y:.03125},{x:.90625,y:.03125},{x:.90625,y:.03125},{x:.96875,y:.03125},{x:.96875,y:.03125},{x:.03125,y:.09375},{x:.03125,y:.09375},{x:.09375,y:.09375},{x:.09375,y:.09375},{x:.15625,y:.09375},{x:.15625,y:.09375},{x:.21875,y:.09375},{x:.21875,y:.09375},{x:.28125,y:.09375},{x:.28125,y:.09375},{x:.34375,y:.09375},{x:.34375,y:.09375},{x:.40625,y:.09375},{x:.40625,y:.09375},{x:.46875,y:.09375},{x:.46875,y:.09375},{x:.53125,y:.09375},{x:.53125,y:.09375},{x:.59375,y:.09375},{x:.59375,y:.09375},{x:.65625,y:.09375},{x:.65625,y:.09375},{x:.71875,y:.09375},{x:.71875,y:.09375},{x:.78125,y:.09375},{x:.78125,y:.09375},{x:.84375,y:.09375},{x:.84375,y:.09375},{x:.90625,y:.09375},{x:.90625,y:.09375},{x:.96875,y:.09375},{x:.96875,y:.09375},{x:.03125,y:.15625},{x:.03125,y:.15625},{x:.09375,y:.15625},{x:.09375,y:.15625},{x:.15625,y:.15625},{x:.15625,y:.15625},{x:.21875,y:.15625},{x:.21875,y:.15625},{x:.28125,y:.15625},{x:.28125,y:.15625},{x:.34375,y:.15625},{x:.34375,y:.15625},{x:.40625,y:.15625},{x:.40625,y:.15625},{x:.46875,y:.15625},{x:.46875,y:.15625},{x:.53125,y:.15625},{x:.53125,y:.15625},{x:.59375,y:.15625},{x:.59375,y:.15625},{x:.65625,y:.15625},{x:.65625,y:.15625},{x:.71875,y:.15625},{x:.71875,y:.15625},{x:.78125,y:.15625},{x:.78125,y:.15625},{x:.84375,y:.15625},{x:.84375,y:.15625},{x:.90625,y:.15625},{x:.90625,y:.15625},{x:.96875,y:.15625},{x:.96875,y:.15625},{x:.03125,y:.21875},{x:.03125,y:.21875},{x:.09375,y:.21875},{x:.09375,y:.21875},{x:.15625,y:.21875},{x:.15625,y:.21875},{x:.21875,y:.21875},{x:.21875,y:.21875},{x:.28125,y:.21875},{x:.28125,y:.21875},{x:.34375,y:.21875},{x:.34375,y:.21875},{x:.40625,y:.21875},{x:.40625,y:.21875},{x:.46875,y:.21875},{x:.46875,y:.21875},{x:.53125,y:.21875},{x:.53125,y:.21875},{x:.59375,y:.21875},{x:.59375,y:.21875},{x:.65625,y:.21875},{x:.65625,y:.21875},{x:.71875,y:.21875},{x:.71875,y:.21875},{x:.78125,y:.21875},{x:.78125,y:.21875},{x:.84375,y:.21875},{x:.84375,y:.21875},{x:.90625,y:.21875},{x:.90625,y:.21875},{x:.96875,y:.21875},{x:.96875,y:.21875},{x:.03125,y:.28125},{x:.03125,y:.28125},{x:.09375,y:.28125},{x:.09375,y:.28125},{x:.15625,y:.28125},{x:.15625,y:.28125},{x:.21875,y:.28125},{x:.21875,y:.28125},{x:.28125,y:.28125},{x:.28125,y:.28125},{x:.34375,y:.28125},{x:.34375,y:.28125},{x:.40625,y:.28125},{x:.40625,y:.28125},{x:.46875,y:.28125},{x:.46875,y:.28125},{x:.53125,y:.28125},{x:.53125,y:.28125},{x:.59375,y:.28125},{x:.59375,y:.28125},{x:.65625,y:.28125},{x:.65625,y:.28125},{x:.71875,y:.28125},{x:.71875,y:.28125},{x:.78125,y:.28125},{x:.78125,y:.28125},{x:.84375,y:.28125},{x:.84375,y:.28125},{x:.90625,y:.28125},{x:.90625,y:.28125},{x:.96875,y:.28125},{x:.96875,y:.28125},{x:.03125,y:.34375},{x:.03125,y:.34375},{x:.09375,y:.34375},{x:.09375,y:.34375},{x:.15625,y:.34375},{x:.15625,y:.34375},{x:.21875,y:.34375},{x:.21875,y:.34375},{x:.28125,y:.34375},{x:.28125,y:.34375},{x:.34375,y:.34375},{x:.34375,y:.34375},{x:.40625,y:.34375},{x:.40625,y:.34375},{x:.46875,y:.34375},{x:.46875,y:.34375},{x:.53125,y:.34375},{x:.53125,y:.34375},{x:.59375,y:.34375},{x:.59375,y:.34375},{x:.65625,y:.34375},{x:.65625,y:.34375},{x:.71875,y:.34375},{x:.71875,y:.34375},{x:.78125,y:.34375},{x:.78125,y:.34375},{x:.84375,y:.34375},{x:.84375,y:.34375},{x:.90625,y:.34375},{x:.90625,y:.34375},{x:.96875,y:.34375},{x:.96875,y:.34375},{x:.03125,y:.40625},{x:.03125,y:.40625},{x:.09375,y:.40625},{x:.09375,y:.40625},{x:.15625,y:.40625},{x:.15625,y:.40625},{x:.21875,y:.40625},{x:.21875,y:.40625},{x:.28125,y:.40625},{x:.28125,y:.40625},{x:.34375,y:.40625},{x:.34375,y:.40625},{x:.40625,y:.40625},{x:.40625,y:.40625},{x:.46875,y:.40625},{x:.46875,y:.40625},{x:.53125,y:.40625},{x:.53125,y:.40625},{x:.59375,y:.40625},{x:.59375,y:.40625},{x:.65625,y:.40625},{x:.65625,y:.40625},{x:.71875,y:.40625},{x:.71875,y:.40625},{x:.78125,y:.40625},{x:.78125,y:.40625},{x:.84375,y:.40625},{x:.84375,y:.40625},{x:.90625,y:.40625},{x:.90625,y:.40625},{x:.96875,y:.40625},{x:.96875,y:.40625},{x:.03125,y:.46875},{x:.03125,y:.46875},{x:.09375,y:.46875},{x:.09375,y:.46875},{x:.15625,y:.46875},{x:.15625,y:.46875},{x:.21875,y:.46875},{x:.21875,y:.46875},{x:.28125,y:.46875},{x:.28125,y:.46875},{x:.34375,y:.46875},{x:.34375,y:.46875},{x:.40625,y:.46875},{x:.40625,y:.46875},{x:.46875,y:.46875},{x:.46875,y:.46875},{x:.53125,y:.46875},{x:.53125,y:.46875},{x:.59375,y:.46875},{x:.59375,y:.46875},{x:.65625,y:.46875},{x:.65625,y:.46875},{x:.71875,y:.46875},{x:.71875,y:.46875},{x:.78125,y:.46875},{x:.78125,y:.46875},{x:.84375,y:.46875},{x:.84375,y:.46875},{x:.90625,y:.46875},{x:.90625,y:.46875},{x:.96875,y:.46875},{x:.96875,y:.46875},{x:.03125,y:.53125},{x:.03125,y:.53125},{x:.09375,y:.53125},{x:.09375,y:.53125},{x:.15625,y:.53125},{x:.15625,y:.53125},{x:.21875,y:.53125},{x:.21875,y:.53125},{x:.28125,y:.53125},{x:.28125,y:.53125},{x:.34375,y:.53125},{x:.34375,y:.53125},{x:.40625,y:.53125},{x:.40625,y:.53125},{x:.46875,y:.53125},{x:.46875,y:.53125},{x:.53125,y:.53125},{x:.53125,y:.53125},{x:.59375,y:.53125},{x:.59375,y:.53125},{x:.65625,y:.53125},{x:.65625,y:.53125},{x:.71875,y:.53125},{x:.71875,y:.53125},{x:.78125,y:.53125},{x:.78125,y:.53125},{x:.84375,y:.53125},{x:.84375,y:.53125},{x:.90625,y:.53125},{x:.90625,y:.53125},{x:.96875,y:.53125},{x:.96875,y:.53125},{x:.03125,y:.59375},{x:.03125,y:.59375},{x:.09375,y:.59375},{x:.09375,y:.59375},{x:.15625,y:.59375},{x:.15625,y:.59375},{x:.21875,y:.59375},{x:.21875,y:.59375},{x:.28125,y:.59375},{x:.28125,y:.59375},{x:.34375,y:.59375},{x:.34375,y:.59375},{x:.40625,y:.59375},{x:.40625,y:.59375},{x:.46875,y:.59375},{x:.46875,y:.59375},{x:.53125,y:.59375},{x:.53125,y:.59375},{x:.59375,y:.59375},{x:.59375,y:.59375},{x:.65625,y:.59375},{x:.65625,y:.59375},{x:.71875,y:.59375},{x:.71875,y:.59375},{x:.78125,y:.59375},{x:.78125,y:.59375},{x:.84375,y:.59375},{x:.84375,y:.59375},{x:.90625,y:.59375},{x:.90625,y:.59375},{x:.96875,y:.59375},{x:.96875,y:.59375},{x:.03125,y:.65625},{x:.03125,y:.65625},{x:.09375,y:.65625},{x:.09375,y:.65625},{x:.15625,y:.65625},{x:.15625,y:.65625},{x:.21875,y:.65625},{x:.21875,y:.65625},{x:.28125,y:.65625},{x:.28125,y:.65625},{x:.34375,y:.65625},{x:.34375,y:.65625},{x:.40625,y:.65625},{x:.40625,y:.65625},{x:.46875,y:.65625},{x:.46875,y:.65625},{x:.53125,y:.65625},{x:.53125,y:.65625},{x:.59375,y:.65625},{x:.59375,y:.65625},{x:.65625,y:.65625},{x:.65625,y:.65625},{x:.71875,y:.65625},{x:.71875,y:.65625},{x:.78125,y:.65625},{x:.78125,y:.65625},{x:.84375,y:.65625},{x:.84375,y:.65625},{x:.90625,y:.65625},{x:.90625,y:.65625},{x:.96875,y:.65625},{x:.96875,y:.65625},{x:.03125,y:.71875},{x:.03125,y:.71875},{x:.09375,y:.71875},{x:.09375,y:.71875},{x:.15625,y:.71875},{x:.15625,y:.71875},{x:.21875,y:.71875},{x:.21875,y:.71875},{x:.28125,y:.71875},{x:.28125,y:.71875},{x:.34375,y:.71875},{x:.34375,y:.71875},{x:.40625,y:.71875},{x:.40625,y:.71875},{x:.46875,y:.71875},{x:.46875,y:.71875},{x:.53125,y:.71875},{x:.53125,y:.71875},{x:.59375,y:.71875},{x:.59375,y:.71875},{x:.65625,y:.71875},{x:.65625,y:.71875},{x:.71875,y:.71875},{x:.71875,y:.71875},{x:.78125,y:.71875},{x:.78125,y:.71875},{x:.84375,y:.71875},{x:.84375,y:.71875},{x:.90625,y:.71875},{x:.90625,y:.71875},{x:.96875,y:.71875},{x:.96875,y:.71875},{x:.03125,y:.78125},{x:.03125,y:.78125},{x:.09375,y:.78125},{x:.09375,y:.78125},{x:.15625,y:.78125},{x:.15625,y:.78125},{x:.21875,y:.78125},{x:.21875,y:.78125},{x:.28125,y:.78125},{x:.28125,y:.78125},{x:.34375,y:.78125},{x:.34375,y:.78125},{x:.40625,y:.78125},{x:.40625,y:.78125},{x:.46875,y:.78125},{x:.46875,y:.78125},{x:.53125,y:.78125},{x:.53125,y:.78125},{x:.59375,y:.78125},{x:.59375,y:.78125},{x:.65625,y:.78125},{x:.65625,y:.78125},{x:.71875,y:.78125},{x:.71875,y:.78125},{x:.78125,y:.78125},{x:.78125,y:.78125},{x:.84375,y:.78125},{x:.84375,y:.78125},{x:.90625,y:.78125},{x:.90625,y:.78125},{x:.96875,y:.78125},{x:.96875,y:.78125},{x:.03125,y:.84375},{x:.03125,y:.84375},{x:.09375,y:.84375},{x:.09375,y:.84375},{x:.15625,y:.84375},{x:.15625,y:.84375},{x:.21875,y:.84375},{x:.21875,y:.84375},{x:.28125,y:.84375},{x:.28125,y:.84375},{x:.34375,y:.84375},{x:.34375,y:.84375},{x:.40625,y:.84375},{x:.40625,y:.84375},{x:.46875,y:.84375},{x:.46875,y:.84375},{x:.53125,y:.84375},{x:.53125,y:.84375},{x:.59375,y:.84375},{x:.59375,y:.84375},{x:.65625,y:.84375},{x:.65625,y:.84375},{x:.71875,y:.84375},{x:.71875,y:.84375},{x:.78125,y:.84375},{x:.78125,y:.84375},{x:.84375,y:.84375},{x:.84375,y:.84375},{x:.90625,y:.84375},{x:.90625,y:.84375},{x:.96875,y:.84375},{x:.96875,y:.84375},{x:.03125,y:.90625},{x:.03125,y:.90625},{x:.09375,y:.90625},{x:.09375,y:.90625},{x:.15625,y:.90625},{x:.15625,y:.90625},{x:.21875,y:.90625},{x:.21875,y:.90625},{x:.28125,y:.90625},{x:.28125,y:.90625},{x:.34375,y:.90625},{x:.34375,y:.90625},{x:.40625,y:.90625},{x:.40625,y:.90625},{x:.46875,y:.90625},{x:.46875,y:.90625},{x:.53125,y:.90625},{x:.53125,y:.90625},{x:.59375,y:.90625},{x:.59375,y:.90625},{x:.65625,y:.90625},{x:.65625,y:.90625},{x:.71875,y:.90625},{x:.71875,y:.90625},{x:.78125,y:.90625},{x:.78125,y:.90625},{x:.84375,y:.90625},{x:.84375,y:.90625},{x:.90625,y:.90625},{x:.90625,y:.90625},{x:.96875,y:.90625},{x:.96875,y:.90625},{x:.03125,y:.96875},{x:.03125,y:.96875},{x:.09375,y:.96875},{x:.09375,y:.96875},{x:.15625,y:.96875},{x:.15625,y:.96875},{x:.21875,y:.96875},{x:.21875,y:.96875},{x:.28125,y:.96875},{x:.28125,y:.96875},{x:.34375,y:.96875},{x:.34375,y:.96875},{x:.40625,y:.96875},{x:.40625,y:.96875},{x:.46875,y:.96875},{x:.46875,y:.96875},{x:.53125,y:.96875},{x:.53125,y:.96875},{x:.59375,y:.96875},{x:.59375,y:.96875},{x:.65625,y:.96875},{x:.65625,y:.96875},{x:.71875,y:.96875},{x:.71875,y:.96875},{x:.78125,y:.96875},{x:.78125,y:.96875},{x:.84375,y:.96875},{x:.84375,y:.96875},{x:.90625,y:.96875},{x:.90625,y:.96875},{x:.96875,y:.96875},{x:.96875,y:.96875},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375}];var Jy=class{constructor(t){Re(this,"model");Re(this,"anchors");Re(this,"anchorsTensor");Re(this,"inputSize");Re(this,"inputSizeTensor");Re(this,"doubleInputSizeTensor");this.model=t,this.anchors=$8.map(n=>[n.x,n.y]),this.anchorsTensor=Ls(this.anchors),this.inputSize=this.model&&this.model.inputs&&this.model.inputs[0].shape?this.model.inputs[0].shape[2]:0,this.inputSizeTensor=Vt([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=Vt([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){return H(()=>{let n=_e(t,[0,0],[-1,2]),s=_e(t,[0,2],[-1,2]),r=oe(pe(n,this.inputSizeTensor),this.anchorsTensor),a=pe(s,this.doubleInputSizeTensor),o=z(Ae(r,a),this.inputSizeTensor),i=z(oe(r,a),this.inputSizeTensor);return Hl([o,i],1)})}normalizeLandmarks(t,n){return H(()=>{let s=oe(pe(V(t,[-1,7,2]),this.inputSizeTensor),this.anchors[n]);return z(s,this.inputSizeTensor)})}async getBoxes(t,n){let s={};s.batched=this.model.predict(t),s.predictions=lt(s.batched),s.scores=H(()=>lt(On(_e(s.predictions,[0,0],[-1,1]))));let r=await s.scores.data();s.boxes=_e(s.predictions,[0,1],[-1,4]),s.norm=this.normalizeBoxes(s.boxes),s.nms=await Fe.nonMaxSuppressionAsync(s.norm,s.scores,10*n.hand.maxDetected,n.hand.iouThreshold,n.hand.minConfidence);let a=await s.nms.array(),o=[];for(let i of a){let l=_e(s.norm,[i,0],[1,-1]),u=H(()=>V(this.normalizeLandmarks(_e(s.predictions,[i,5],[1,14]),i),[-1,2]));o.push({box:l,palmLandmarks:u,confidence:r[i]})}for(let i of Object.keys(s))Z(s[i]);return o}async estimateHandBounds(t,n){let s=t.shape[1],r=t.shape[2],a=H(()=>Ae(pe(Fe.resizeBilinear(t,[this.inputSize,this.inputSize]),127.5),1)),o=await this.getBoxes(a,n);Z(a);let i=[];if(!o||o.length===0)return i;for(let l of o){let u=await l.box.data(),c=u.slice(0,2),d=u.slice(2,4),p=await l.palmLandmarks.array();Z(l.box),Z(l.palmLandmarks),i.push(F8({startPoint:c,endPoint:d,palmLandmarks:p,confidence:l.confidence},[r/this.inputSize,s/this.inputSize]))}return i}};function ple(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function O8(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return ple(n)}var P8=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function va(e,t){let n=0;for(let s=0;so[0]),s=t.map(o=>o[1]),r=[Math.min(...n),Math.min(...s)],a=[Math.max(...n),Math.max(...s)];return{startPoint:r,endPoint:a}}getBoxForPalmLandmarks(t,n){let s=t.map(a=>ex([...a,1],n)),r=this.calculateLandmarksBoundingBox(s);return A0(y0(r),fle)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),s=A0(y0(n),L8);s.palmLandmarks=[];for(let r=0;r[o[0]*(h[0]-this.inputSize/2),o[1]*(h[1]-this.inputSize/2),o[2]*h[2]]),l=Qy(s,[0,0]),u=i.map(h=>[...ex(h,l),h[2]]),c=z8(r),d=[..._d(n),1],p=[va(d,c[0]),va(d,c[1])];return u.map(h=>[Math.trunc(h[0]+p[0]),Math.trunc(h[1]+p[1]),Math.trunc(h[2])])}async estimateHands(t,n){let s=!1,r;(this.skipped===0||this.skipped>n.hand.skipFrames||!n.hand.landmarks||!n.skipFrame)&&(r=await this.handDetector.estimateHandBounds(t,n),this.skipped=0),n.skipFrame&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(s=!0));let a=[];for(let o=0;o=n.hand.minConfidence/4){let x=V(A,[-1,3]),b=await x.array();Z(A),Z(x);let v=this.transformRawCoords(b,h,l,p),k=this.getBoxForHandLandmarks(v);this.storedBoxes[o]={...k,confidence:y};let S={landmarks:v,confidence:y,box:{topLeft:k.startPoint,bottomRight:k.endPoint}};a.push(S)}else this.storedBoxes[o]=null;Z(A)}else{let l=A0(y0(i),L8),u={confidence:i.confidence,box:{topLeft:l.startPoint,bottomRight:l.endPoint},landmarks:[]};a.push(u)}}return this.storedBoxes=this.storedBoxes.filter(o=>o!==null),this.detectedHands=a.length,a}};var qe={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>qe.nameMapping[e],getPoints:e=>qe.pointsMapping[e]},Rn={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>Rn.nameMapping[e]},He={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>He.nameMapping[e]};var mi={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function W8(e,t,n,s){let r=(t-s)/(e-n),a=Math.atan(r)*180/Math.PI;return a<=0?a=-a:a>0&&(a=180-a),a}function V8(e,t){let n=W8(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let s=W8(e[1],e[2],t[1],t[2]);return[n,s]}function U8(e,t=1){let n=0,s=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?s=1*t:r=1*t,[n,s,r]}function Ale(e,t,n){let s=e[0]-t[0],r=e[0]-n[0],a=t[0]-n[0],o=e[1]-t[1],i=e[1]-n[1],l=t[1]-n[1],u=e[2]-t[2],c=e[2]-n[2],d=t[2]-n[2],p=Math.sqrt(s*s+o*o+u*u),h=Math.sqrt(r*r+i*i+c*c),f=Math.sqrt(a*a+l*l+d*d),m=(f*f+p*p-h*h)/(2*f*p);m>1?m=1:m<-1&&(m=-1);let g=Math.acos(m);g=57.2958*g%180;let A;return g>mi.NO_CURL_START_LIMIT?A=Rn.none:g>mi.HALF_CURL_START_LIMIT?A=Rn.half:A=Rn.full,A}function H8(e,t,n,s){let r;return s===Math.abs(e)?e>0?r=He.horizontalLeft:r=He.horizontalRight:s===Math.abs(t)?t>0?r=He.horizontalLeft:r=He.horizontalRight:n>0?r=He.horizontalLeft:r=He.horizontalRight,r}function G8(e,t,n,s){let r;return s===Math.abs(e)?e<0?r=He.verticalDown:r=He.verticalUp:s===Math.abs(t)?t<0?r=He.verticalDown:r=He.verticalUp:n<0?r=He.verticalDown:r=He.verticalUp,r}function yle(e,t,n,s,r,a,o,i){let l,u=G8(e,t,n,s),c=H8(r,a,o,i);return u===He.verticalUp?c===He.horizontalLeft?l=He.diagonalUpLeft:l=He.diagonalUpRight:c===He.horizontalLeft?l=He.diagonalDownLeft:l=He.diagonalDownRight,l}function xle(e,t,n,s){let r=e[0]-t[0],a=e[0]-n[0],o=t[0]-n[0],i=e[1]-t[1],l=e[1]-n[1],u=t[1]-n[1],c=Math.max(Math.abs(r),Math.abs(a),Math.abs(o)),d=Math.max(Math.abs(i),Math.abs(l),Math.abs(u)),p=0,h=0,f=0,m=d/(c+1e-5);m>1.5?p+=mi.DISTANCE_VOTE_POWER:m>.66?h+=mi.DISTANCE_VOTE_POWER:f+=mi.DISTANCE_VOTE_POWER;let g=Math.sqrt(r*r+i*i),A=Math.sqrt(a*a+l*l),y=Math.sqrt(o*o+u*u),x=Math.max(g,A,y),b=e[0],v=e[1],k=n[0],S=n[1];x===g?(k=n[0],S=n[1]):x===y&&(b=t[0],v=t[1]);let O=V8([b,v],[k,S]),E=U8(O,mi.TOTAL_ANGLE_VOTE_POWER);p+=E[0],h+=E[1],f+=E[2];for(let T of s){let P=U8(T,mi.SINGLE_ANGLE_VOTE_POWER);p+=P[0],h+=P[1],f+=P[2]}let R;return p===Math.max(p,h,f)?R=G8(l,i,u,d):f===Math.max(h,f)?R=H8(a,r,o,c):R=yle(l,i,u,d,a,r,o,c),R}function nx(e){let t=[],n=[],s=[],r=[];if(!e)return{curls:s,directions:r};for(let a of qe.all){let o=qe.getPoints(a),i=[],l=[];for(let u of o){let c=e[u[0]],d=e[u[1]],p=V8(c,d),h=p[0],f=p[1];i.push(h),l.push(f)}t.push(i),n.push(l)}for(let a of qe.all){let o=a===qe.thumb?1:0,i=qe.getPoints(a),l=e[i[o][0]],u=e[i[o+1][1]],c=e[i[3][1]],d=Ale(l,u,c),p=xle(l,u,c,t[a].slice(o));s[a]=d,r[a]=p}return{curls:s,directions:r}}var Fd=class{constructor(t){Re(this,"name");Re(this,"curls");Re(this,"directions");Re(this,"weights");Re(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}addCurl(t,n,s){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,s])}addDirection(t,n,s){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,s])}setWeight(t,n){this.weights[t]=n;let s=this.weights.reduce((r,a)=>r+a,0);this.weightsRelative=this.weights.map(r=>r*5/s)}matchAgainst(t,n){let s=0;for(let r in t){let a=t[r],o=this.curls[r];if(typeof o=="undefined"){s+=this.weightsRelative[r];continue}for(let[i,l]of o)if(a===i){s+=l*this.weightsRelative[r];break}}for(let r in n){let a=n[r],o=this.directions[r];if(typeof o=="undefined"){s+=this.weightsRelative[r];continue}for(let[i,l]of o)if(a===i){s+=l*this.weightsRelative[r];break}}return s/10}};var wa=new Fd("thumbs up");wa.addCurl(qe.thumb,Rn.none,1);wa.addDirection(qe.thumb,He.verticalUp,1);wa.addDirection(qe.thumb,He.diagonalUpLeft,.25);wa.addDirection(qe.thumb,He.diagonalUpRight,.25);for(let e of[qe.index,qe.middle,qe.ring,qe.pinky])wa.addCurl(e,Rn.full,1),wa.addDirection(e,He.horizontalLeft,1),wa.addDirection(e,He.horizontalRight,1);var jt=new Fd("victory");jt.addCurl(qe.thumb,Rn.half,.5);jt.addCurl(qe.thumb,Rn.none,.5);jt.addDirection(qe.thumb,He.verticalUp,1);jt.addDirection(qe.thumb,He.diagonalUpLeft,1);jt.addCurl(qe.index,Rn.none,1);jt.addDirection(qe.index,He.verticalUp,.75);jt.addDirection(qe.index,He.diagonalUpLeft,1);jt.addCurl(qe.middle,Rn.none,1);jt.addDirection(qe.middle,He.verticalUp,1);jt.addDirection(qe.middle,He.diagonalUpLeft,.75);jt.addCurl(qe.ring,Rn.full,1);jt.addDirection(qe.ring,He.verticalUp,.2);jt.addDirection(qe.ring,He.diagonalUpLeft,1);jt.addDirection(qe.ring,He.horizontalLeft,.2);jt.addCurl(qe.pinky,Rn.full,1);jt.addDirection(qe.pinky,He.verticalUp,.2);jt.addDirection(qe.pinky,He.diagonalUpLeft,1);jt.addDirection(qe.pinky,He.horizontalLeft,.2);jt.setWeight(qe.index,2);jt.setWeight(qe.middle,2);var j8=[wa,jt];var ble=.7;function q8(e){let t=nx(e),n={};for(let s of qe.all)n[qe.getName(s)]={curl:Rn.getName(t.curls[s]),direction:He.getName(t.directions[s])};return n}function X8(e){let t=nx(e),n=[];for(let s of j8){let r=s.matchAgainst(t.curls,t.directions);r>=ble&&n.push({name:s.name,confidence:r})}return n}var K8={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},ka,Ia,Z8;async function sx(e,t){let n=await Z8.estimateHands(e,t);if(!n)return[];let s=[];for(let r=0;rn[r].landmarks[d]);let o=n[r].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(o&&o.length>0){for(let c of o)c[0]i[2]&&(i[2]=c[0]),c[1]>i[3]&&(i[3]=c[1]);i[2]-=i[0],i[3]-=i[1],l=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let u=q8(o);s.push({id:r,score:Math.round(100*n[r].confidence)/100,box:i,boxRaw:l,keypoints:o,annotations:a,landmarks:u})}return s}async function rx(e){var n,s,r,a,o,i;!ka||!Ia?([ka,Ia]=await Promise.all([e.hand.enabled?yt(xt(e.modelBasePath,((n=e.hand.detector)==null?void 0:n.modelPath)||""),{fromTFHub:(((s=e.hand.detector)==null?void 0:s.modelPath)||"").includes("tfhub.dev")}):null,e.hand.landmarks?yt(xt(e.modelBasePath,((r=e.hand.skeleton)==null?void 0:r.modelPath)||""),{fromTFHub:(((a=e.hand.skeleton)==null?void 0:a.modelPath)||"").includes("tfhub.dev")}):null]),e.hand.enabled&&(!ka||!ka.modelUrl?ce("load model failed:",((o=e.hand.detector)==null?void 0:o.modelPath)||""):e.debug&&ce("load model:",ka.modelUrl),!Ia||!Ia.modelUrl?ce("load model failed:",((i=e.hand.skeleton)==null?void 0:i.modelPath)||""):e.debug&&ce("load model:",Ia.modelUrl))):(e.debug&&ce("cached model:",ka.modelUrl),e.debug&&ce("cached model:",Ia.modelUrl));let t=new Jy(ka);return Z8=new tx(t,Ia),[ka,Ia]}var Y8=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPalm","rightPalm","leftIndex","rightIndex","leftPinky","rightPinky","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","midHip","forehead","leftThumb","leftHand","rightThumb","rightHand"],J8=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","left:15","right:16","left:17","right:18","left:19","right:20","left:21","right:22","leftChest","rightChest","neck","forehead","left:27","right:28","left:29","right:30"];var Un;async function x0(e){return Un?e.debug&&ce("cached model:",Un.modelUrl):(Un=await yt(xt(e.modelBasePath,e.body.modelPath||"")),Un.width=parseInt(Un.signature.inputs["input_1:0"].tensorShape.dim[2].size),Un.height=parseInt(Un.signature.inputs["input_1:0"].tensorShape.dim[1].size),!Un||!Un.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",Un.modelUrl)),Un}async function ax(e,t){if(!Un)return[];if(!t.body.enabled)return[];let n={width:e.shape[2]||0,height:e.shape[1]||0},s=Fe.resizeBilinear(e,[Un.width,Un.height],!1),r=pe(s,[255]);Z(s);let a=await Un.predict(r),o=a.find(g=>g.size===195||g.size===155),i=await(o==null?void 0:o.data())||[];a.forEach(g=>Z(g)),Z(r);let l=[],u=(i==null?void 0:i.length)===195?Y8:J8,c=5;for(let g=0;gg.position[0]),p=l.map(g=>g.position[1]),h=[Math.min(...d),Math.min(...p),Math.max(...d)-Math.min(...d),Math.max(...p)-Math.min(...d)],f=[0,0,0,0],m=l.reduce((g,A)=>A.score>g?A.score:g,0);return[{id:0,score:m,box:h,boxRaw:f,keypoints:l}]}var Hn,gr=[],ox=[0,0,0,0],ix=[0,0,0,0],b0=0,lx=Number.MAX_SAFE_INTEGER,vle=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","pelvis","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"];async function Q8(e){return Hn?e.debug&&ce("cached model:",Hn.modelUrl):(Hn=await yt(xt(e.modelBasePath,e.body.modelPath||"")),!Hn||!Hn.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",Hn.modelUrl)),Hn}function wle(e,t){let[n,s]=e.shape;return H(()=>{let r=(i,l)=>Ae(i,z(pe(i,Ce(l,"int32")),Ce(l,"int32"))),a=V(e,[s*n]),o=Yn(a,0).dataSync()[0];if(o>t){let i=Ms(a,0),l=r(i,n).dataSync()[0],u=pe(i,Ce(n,"int32")).dataSync()[0];return[l,u,o]}return[0,0,o]})}async function ux(e,t){var n;return lx<(((n=t.body)==null?void 0:n.skipFrames)||0)&&t.skipFrame&&Object.keys(gr).length>0?(lx++,[{id:0,score:b0,box:ox,boxRaw:ix,keypoints:gr}]):(lx=0,new Promise(async s=>{var c;let r=H(()=>{if(!Hn.inputs[0].shape)return null;let d=Fe.resizeBilinear(e,[Hn.inputs[0].shape[2],Hn.inputs[0].shape[1]],!1);return z(d,2).sub(1)}),a;if(t.body.enabled&&(a=await Hn.predict(r)),Z(r),a){gr.length=0;let d=a.squeeze();Z(a);let p=d.unstack(2);Z(d);for(let h=0;h(((c=t.body)==null?void 0:c.minConfidence)||0)&&gr.push({score:Math.round(100*g)/100,part:vle[h],positionRaw:[f/Hn.inputs[0].shape[2],m/Hn.inputs[0].shape[1]],position:[Math.round(e.shape[2]*f/Hn.inputs[0].shape[2]),Math.round(e.shape[1]*m/Hn.inputs[0].shape[1])]})}p.forEach(h=>Z(h))}b0=gr.reduce((d,p)=>p.score>d?p.score:d,0);let o=gr.map(d=>d.position[0]),i=gr.map(d=>d.position[1]);ox=[Math.min(...o),Math.min(...i),Math.max(...o)-Math.min(...o),Math.max(...i)-Math.min(...i)];let l=gr.map(d=>d.positionRaw[0]),u=gr.map(d=>d.positionRaw[1]);ix=[Math.min(...l),Math.min(...u),Math.max(...l)-Math.min(...l),Math.max(...u)-Math.min(...u)],s([{id:0,score:b0,box:ox,boxRaw:ix,keypoints:gr}])}))}var Ar,vs=[],cx=[0,0,0,0],Pr=[0,0,0,0],Mr=0,dx=Number.MAX_SAFE_INTEGER,eI=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"];async function px(e){return Ar?e.debug&&ce("cached model:",Ar.modelUrl):(Ar=await yt(xt(e.modelBasePath,e.body.modelPath||"")),!Ar||!Ar.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",Ar.modelUrl)),Ar}async function kle(e,t,n){vs.length=0;let s=e[0][0];for(let u=0;ut.body.minConfidence&&vs.push({score:Math.round(100*Mr)/100,part:eI[u],positionRaw:[s[u][1],s[u][0]],position:[Math.round((n.shape[2]||0)*s[u][1]),Math.round((n.shape[1]||0)*s[u][0])]});Mr=vs.reduce((u,c)=>c.score>u?c.score:u,0);let r=vs.map(u=>u.position[0]),a=vs.map(u=>u.position[1]);cx=[Math.min(...r),Math.min(...a),Math.max(...r)-Math.min(...r),Math.max(...a)-Math.min(...a)];let o=vs.map(u=>u.positionRaw[0]),i=vs.map(u=>u.positionRaw[1]);Pr=[Math.min(...o),Math.min(...i),Math.max(...o)-Math.min(...o),Math.max(...i)-Math.min(...i)];let l=[];return l.push({id:0,score:Mr,box:cx,boxRaw:Pr,keypoints:vs}),l}async function Ile(e,t,n){let s=[];for(let r=0;rt.body.minConfidence&&vs.push({part:eI[o],score:i,positionRaw:[a[3*o+1],a[3*o+0]],position:[Math.trunc(a[3*o+1]*(n.shape[2]||0)),Math.trunc(a[3*o+0]*(n.shape[1]||0))]})}Pr=[a[51+1],a[51+0],a[51+3]-a[51+1],a[51+2]-a[51+0]],s.push({id:r,score:Mr,boxRaw:Pr,box:[Math.trunc(Pr[0]*(n.shape[2]||0)),Math.trunc(Pr[1]*(n.shape[1]||0)),Math.trunc(Pr[2]*(n.shape[2]||0)),Math.trunc(Pr[3]*(n.shape[1]||0))],keypoints:vs})}}return s}async function hx(e,t){return dx<(t.body.skipFrames||0)&&t.skipFrame&&Object.keys(vs).length>0?(dx++,[{id:0,score:Mr,box:cx,boxRaw:Pr,keypoints:vs}]):(dx=0,new Promise(async n=>{let s=H(()=>{if(!Ar.inputs[0].shape)return null;let i=Ar.inputs[0].shape[2];i===-1&&(i=256);let l=Fe.resizeBilinear(e,[i,i],!1);return de(l,"int32")}),r;t.body.enabled&&(r=await Ar.predict(s)),Z(s),r||n([]);let a=await r.array(),o;r.shape[2]===17?o=await kle(a,t,e):r.shape[2]===56&&(o=await Ile(a,t,e)),Z(r),n(o)}))}var Eu=[{class:1,label:"person"},{class:2,label:"bicycle"},{class:3,label:"car"},{class:4,label:"motorcycle"},{class:5,label:"airplane"},{class:6,label:"bus"},{class:7,label:"train"},{class:8,label:"truck"},{class:9,label:"boat"},{class:10,label:"traffic light"},{class:11,label:"fire hydrant"},{class:12,label:"stop sign"},{class:13,label:"parking meter"},{class:14,label:"bench"},{class:15,label:"bird"},{class:16,label:"cat"},{class:17,label:"dog"},{class:18,label:"horse"},{class:19,label:"sheep"},{class:20,label:"cow"},{class:21,label:"elephant"},{class:22,label:"bear"},{class:23,label:"zebra"},{class:24,label:"giraffe"},{class:25,label:"backpack"},{class:26,label:"umbrella"},{class:27,label:"handbag"},{class:28,label:"tie"},{class:29,label:"suitcase"},{class:30,label:"frisbee"},{class:31,label:"skis"},{class:32,label:"snowboard"},{class:33,label:"sports ball"},{class:34,label:"kite"},{class:35,label:"baseball bat"},{class:36,label:"baseball glove"},{class:37,label:"skateboard"},{class:38,label:"surfboard"},{class:39,label:"tennis racket"},{class:40,label:"bottle"},{class:41,label:"wine glass"},{class:42,label:"cup"},{class:43,label:"fork"},{class:44,label:"knife"},{class:45,label:"spoon"},{class:46,label:"bowl"},{class:47,label:"banana"},{class:48,label:"apple"},{class:49,label:"sandwich"},{class:50,label:"orange"},{class:51,label:"broccoli"},{class:52,label:"carrot"},{class:53,label:"hot dog"},{class:54,label:"pizza"},{class:55,label:"donut"},{class:56,label:"cake"},{class:57,label:"chair"},{class:58,label:"couch"},{class:59,label:"potted plant"},{class:60,label:"bed"},{class:61,label:"dining table"},{class:62,label:"toilet"},{class:63,label:"tv"},{class:64,label:"laptop"},{class:65,label:"mouse"},{class:66,label:"remote"},{class:67,label:"keyboard"},{class:68,label:"cell phone"},{class:69,label:"microwave"},{class:70,label:"oven"},{class:71,label:"toaster"},{class:72,label:"sink"},{class:73,label:"refrigerator"},{class:74,label:"book"},{class:75,label:"clock"},{class:76,label:"vase"},{class:77,label:"scissors"},{class:78,label:"teddy bear"},{class:79,label:"hair drier"},{class:80,label:"toothbrush"}];var is,v0=[],fx=Number.MAX_SAFE_INTEGER,w0=2.5;async function mx(e){if(is)e.debug&&ce("cached model:",is.modelUrl);else{is=await yt(xt(e.modelBasePath,e.object.modelPath||""));let t=Object.values(is.modelSignature.inputs);if(is.inputSize=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):null,!is.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${e.object.modelPath}`);!is||!is.modelUrl?ce("load model failed:",e.object.modelPath):e.debug&&ce("load model:",is.modelUrl)}return is}async function Sle(e,t,n,s){let r=0,a=[];for(let u of[1,2,4])H(async()=>{var g,A;let c=u*13,d=(g=e.find(y=>y.shape[1]===c**2&&y.shape[2]===Eu.length))==null?void 0:g.squeeze(),p=(A=e.find(y=>y.shape[1]===c**2&&y.shape[2]s.object.minConfidence&&x!==61){let v=(.5+Math.trunc(y%c))/c,k=(.5+Math.trunc(y/c))/c,S=f[y].map(U=>U*(c/u/t)),[C,D]=[v-w0/u*S[0],k-w0/u*S[1]],[O,E]=[v+w0/u*S[2]-C,k+w0/u*S[3]-D],R=[C,D,O,E];R=R.map(U=>Math.max(0,Math.min(U,1)));let T=[R[0]*n[0],R[1]*n[1],R[2]*n[0],R[3]*n[1]],P={id:r++,score:Math.round(100*b)/100,class:x+1,label:Eu[x].label,box:T.map(U=>Math.trunc(U)),boxRaw:R};a.push(P)}}});e.forEach(u=>Z(u));let o=a.map(u=>[u.boxRaw[1],u.boxRaw[0],u.boxRaw[3],u.boxRaw[2]]),i=a.map(u=>u.score),l=[];if(o&&o.length>0){let u=await Fe.nonMaxSuppressionAsync(o,i,s.object.maxDetected,s.object.iouThreshold,s.object.minConfidence);l=await u.data(),Z(u)}return a=a.filter((u,c)=>l.includes(c)).sort((u,c)=>c.score-u.score),a}async function gx(e,t){return fx<(t.object.skipFrames||0)&&t.skipFrame&&v0.length>0?(fx++,v0):(fx=0,!xe.kernels.includes("mod")||!xe.kernels.includes("sparsetodense")?v0:new Promise(async n=>{let s=[e.shape[2],e.shape[1]],r=Fe.resizeBilinear(e,[is.inputSize,is.inputSize],!1),a=pe(r,255),o=a.transpose([0,3,1,2]);Z(a),Z(r);let i;t.object.enabled&&(i=await is.predict(o)),Z(o);let l=await Sle(i,is.inputSize,s,t);v0=l,n(l)}))}var ls,k0=[],Ax=Number.MAX_SAFE_INTEGER;async function yx(e){if(ls)e.debug&&ce("cached model:",ls.modelUrl);else{ls=await yt(xt(e.modelBasePath,e.object.modelPath||""));let t=Object.values(ls.modelSignature.inputs);if(ls.inputSize=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):null,!ls.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${e.object.modelPath}`);!ls||!ls.modelUrl?ce("load model failed:",e.object.modelPath):e.debug&&ce("load model:",ls.modelUrl)}return ls}async function Cle(e,t,n,s){if(!e)return[];let r=[],a=await e.array(),o=lt(e);Z(e);let i=Wt(o,6,1);Z(o);let l=pn([i[1],i[0],i[3],i[2]],1),u=lt(l);Z(l);let c=lt(i[4]),d=lt(i[5]);i.forEach(m=>Z(m));let p=await Fe.nonMaxSuppressionAsync(u,c,s.object.maxDetected,s.object.iouThreshold,s.object.minConfidence);Z(u),Z(c),Z(d);let h=await p.data();Z(p);let f=0;for(let m of h){let g=Math.trunc(100*a[0][m][4])/100,A=a[0][m][5],y=Eu[A].label,[x,b]=[a[0][m][0]/t,a[0][m][1]/t],v=[x,b,a[0][m][2]/t-x,a[0][m][3]/t-b],k=[Math.trunc(v[0]*n[0]),Math.trunc(v[1]*n[1]),Math.trunc(v[2]*n[0]),Math.trunc(v[3]*n[1])];r.push({id:f++,score:g,class:A,label:y,box:k,boxRaw:v})}return r}async function xx(e,t){return Ax<(t.object.skipFrames||0)&&t.skipFrame&&k0.length>0?(Ax++,k0):(Ax=0,!xe.kernels.includes("mod")||!xe.kernels.includes("sparsetodense")?k0:new Promise(async n=>{let s=[e.shape[2],e.shape[1]],r=Fe.resizeBilinear(e,[ls.inputSize,ls.inputSize]),a=t.object.enabled?ls.execute(r,["tower_0/detections"]):null;Z(r);let o=await Cle(a,ls.inputSize,s,t);k0=o,n(o)}))}var ws,bx=!1;async function I0(e){return ws?e.debug&&ce("cached model:",ws.modelUrl):(ws=await yt(xt(e.modelBasePath,e.segmentation.modelPath||"")),!ws||!ws.modelUrl?ce("load model failed:",e.segmentation.modelPath):e.debug&&ce("load model:",ws.modelUrl)),ws}async function vx(e){var f,m;let t=((f=e.tensor)==null?void 0:f.shape[1])||0,n=((m=e.tensor)==null?void 0:m.shape[2])||0;if(!e.tensor||!ws||!ws.inputs[0].shape)return null;let s=Fe.resizeBilinear(e.tensor,[ws.inputs[0].shape[1],ws.inputs[0].shape[2]],!1),r=pe(s,255),a=ws.predict(r);Z(s),Z(r);let o=lt(a,0);Z(a);let i;if(o.shape[2]===2){let g=o.softmax(),[A,y]=ts(g,2),x=zt(y,2),b=zt(x,0);Z(g),Z(A),Z(y);let v=Fe.cropAndResize(b,[[0,0,.5,.5]],[0],[t,n]);i=lt(v,0),Z(v),Z(x),Z(b)}else i=Fe.resizeBilinear(o,[t,n]);if(Z(o),xe.node){let g=await i.data();return Z(i),g}let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(t,n):document.createElement("canvas");l.width=t,l.height=n,fs&&await fs.toPixels(i,l),Z(i);let u=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(t,n):document.createElement("canvas");u.width=t,u.height=n;let c=u.getContext("2d");c.filter="blur(8px",await c.drawImage(l,0,0);let d=c.getImageData(0,0,t,n).data,p=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(t,n):document.createElement("canvas");p.width=t,p.height=n;let h=p.getContext("2d");return e.canvas&&await h.drawImage(e.canvas,0,0),h.globalCompositeOperation="darken",h.filter="blur(8px)",await h.drawImage(l,0,0),h.globalCompositeOperation="source-over",h.filter="none",e.canvas=p,d}async function tI(e,t,n){var a;if(bx)return null;bx=!0,ws||await I0(n);let s=fi(e,n),r=await vx(s);if(Z(s.tensor),t&&r){let o=fi(t,n),i=o.canvas;Z(o.tensor);let l=s.canvas,u=(a=l.getContext("2d"))==null?void 0:a.getImageData(0,0,l.width,l.height).data,c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(l.width,l.height):document.createElement("canvas");c.width=l.width,c.height=l.height;let d=c.getContext("2d");d.globalCompositeOperation="copy",d.drawImage(i,0,0,c.width,c.height);let p=d.getImageData(0,0,c.width,c.height);for(let h=0;hr.executor?r:r.model):s=[e.models[n]];for(let r of s){let a=[],o=r==null?void 0:r.executor;if(o)for(let l of Object.values(o.graph.nodes)){let u=l.op.toLowerCase();a.includes(u)||a.push(u)}let i=[];for(let l of a)!t.includes(l)&&!e.env.kernels.includes(l)&&!e.env.kernels.includes(l.replace("_",""))&&!e.env.kernels.includes(l.replace("native",""))&&!e.env.kernels.includes(l.replace("v2",""))&&i.push(l);!o&&e.config.debug&&ce("model executor not found:",n),i.length>0&&e.config.debug&&ce("model validation:",n,i)}}}var Tle=e=>{let t=(d,p)=>Math.atan2(d[1]-p[1],d[0]-p[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],s=1,r=e.mesh[33][2]>e.mesh[263][2],a=r?e.mesh[473]:e.mesh[468],o=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(o[0]-a[0])/i[0]-n[0],s*(a[1]-o[1])/i[1]-n[1]],u=Math.sqrt(l[0]**2+l[1]**2);return u=Math.min(u,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:u}},Nle=(e,t)=>{let n=g=>{let A=Math.sqrt(g[0]*g[0]+g[1]*g[1]+g[2]*g[2]);return g[0]/=A,g[1]/=A,g[2]/=A,g},s=(g,A)=>{let y=g[0]-A[0],x=g[1]-A[1],b=g[2]-A[2];return[y,x,b]},r=(g,A)=>{let y=g[1]*A[2]-g[2]*A[1],x=g[2]*A[0]-g[0]*A[2],b=g[0]*A[1]-g[1]*A[0];return[y,x,b]},a=g=>{let[A,y,x,b,v,k,S,C,D]=g,O,E,R;return b<1?b>-1?(R=Math.asin(b),E=Math.atan2(-S,A),O=Math.atan2(-k,v)):(R=-Math.PI/2,E=-Math.atan2(C,D),O=0):(R=Math.PI/2,E=Math.atan2(C,D),O=0),isNaN(O)&&(O=0),isNaN(E)&&(E=0),isNaN(R)&&(R=0),{pitch:2*-O,yaw:2*-E,roll:2*-R}},o=g=>{let A=(x,b,v,k)=>Math.atan2(k-b,v-x);return{pitch:A(g[10][1],g[10][2],g[152][1],g[152][2]),yaw:A(g[33][0],g[33][2],g[263][0],g[263][2]),roll:A(g[33][0],g[33][1],g[263][0],g[263][1])}},i=e.meshRaw;if(!i||i.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let l=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,u=[i[10],i[152],i[234],i[454]].map(g=>[g[0]*t[0]/l,g[1]*t[1]/l,g[2]]),c=n(s(u[1],u[0])),d=n(s(u[3],u[2])),p=n(r(d,c));d=r(c,p);let h=[d[0],d[1],d[2],c[0],c[1],c[2],p[0],p[1],p[2]],f=a(h),m=i.length===478?Tle(e):{bearing:0,strength:0};return{angle:f,matrix:h,gaze:m}},wx=async(e,t)=>{var d,p,h,f,m,g;let n,s,r,a,o,i,l,u=[];e.state="run:face",n=Ze();let c=await y8(t,e.config);if(e.performance.face=Math.trunc(Ze()-n),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let A=0;A{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),a=e[n].keypoints.find(l=>l.part==="nose");a&&s&&r&&s.position.yl.part==="leftShoulder"),i=e[n].keypoints.find(l=>l.part==="rightShoulder");o&&i&&t.push({body:n,gesture:`leaning ${o.position.y>i.position.y?"left":"right"}`})}return t},aI=e=>{if(!e)return[];let t=[];for(let n=0;n0){let s=e[n].mesh[33][2]-e[n].mesh[263][2];Math.abs(s)<10?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${s<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let o=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));o>10&&t.push({face:n,gesture:`mouth ${Math.trunc(o)}% open`});let i=e[n].mesh[152][2];Math.abs(i)>10&&t.push({face:n,gesture:`head ${i<0?"up":"down"}`})}return t},oI=e=>{if(!e)return[];let t=[];for(let n=0;n.06||d>.06)&&(u=!1),p>.06&&t.push({iris:n,gesture:"looking right"}),d>.06&&t.push({iris:n,gesture:"looking left"});let h=Math.abs(e[n].mesh[145][1]-e[n].annotations.rightEyeIris[0][1])/e[n].box[3],f=Math.abs(e[n].mesh[374][1]-e[n].annotations.leftEyeIris[0][1])/e[n].box[3];(f<.01||h<.01||f>.022||h>.022)&&(u=!1),(f<.01||h<.01)&&t.push({iris:n,gesture:"looking down"}),(f>.022||h>.022)&&t.push({iris:n,gesture:"looking up"}),u&&t.push({iris:n,gesture:"looking center"})}return t},iI=e=>{if(!e)return[];let t=[];for(let n=0;n0){let a=s.reduce((i,l)=>i.position[2]i.position[1]{if(e&&e.getContext)return e.getContext("2d");throw new Error("Human: Invalid Canvas")},S0=e=>Math.round(e*180/Math.PI);function kx(e,t,n,s=0,r){e.fillStyle=r.useDepth&&s?`rgba(${127.5+2*s}, ${127.5-2*s}, 255, 0.3)`:r.color,e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function $d(e,t,n,s,r,a){if(e.beginPath(),a.useCurves){let o=(t+t+s)/2,i=(n+n+r)/2;e.ellipse(o,i,s/2,r/2,0,0,2*Math.PI)}else e.lineWidth=a.lineWidth,e.moveTo(t+a.roundRect,n),e.lineTo(t+s-a.roundRect,n),e.quadraticCurveTo(t+s,n,t+s,n+a.roundRect),e.lineTo(t+s,n+r-a.roundRect),e.quadraticCurveTo(t+s,n+r,t+s-a.roundRect,n+r),e.lineTo(t+a.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-a.roundRect),e.lineTo(t,n+a.roundRect),e.quadraticCurveTo(t,n,t+a.roundRect,n),e.closePath();e.stroke()}function Ix(e,t=[],n){if(!(t===void 0||t.length===0)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let s of t){let r=s[2]||0;e.strokeStyle=n.useDepth&&r?`rgba(${127.5+2*r}, ${127.5-2*r}, 255, 0.3)`:n.color,e.fillStyle=n.useDepth&&r?`rgba(${127.5+2*r}, ${127.5-2*r}, 255, 0.3)`:n.color,e.lineTo(s[0],Math.round(s[1]))}e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function Od(e,t=[],n){if(!(t===void 0||t.length===0)){if(!n.useCurves||t.length<=2){Ix(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let s=0;s1&&l[1].length>0){let u=i[1]>0?`#${i[1]}`:"",c=`${i[0]} ${u}: ${l[1]}`;s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText(c,8,2+a*s.lineHeight)),r.fillStyle=s.labelColor,r.fillText(c,6,0+a*s.lineHeight),a+=1}}}async function Cx(e,t,n){var a,o,i,l;let s=gn(zr,n);if(!t||!e)return;let r=gi(e);for(let u of t){r.font=s.font,r.strokeStyle=s.color,r.fillStyle=s.color,s.drawBoxes&&$d(r,u.box[0],u.box[1],u.box[2],u.box[3],s);let c=[];if(c.push(`face: ${Math.trunc(100*u.score)}%`),u.genderScore&&c.push(`${u.gender||""} ${Math.trunc(100*u.genderScore)}%`),u.age&&c.push(`age: ${u.age||""}`),u.iris&&c.push(`distance: ${u.iris}`),u.emotion&&u.emotion.length>0){let d=u.emotion.map(p=>`${Math.trunc(100*p.score)}% ${p.emotion}`);d.length>3&&(d.length=3),c.push(d.join(" "))}u.rotation&&u.rotation.angle&&u.rotation.gaze&&(u.rotation.angle.roll&&c.push(`roll: ${S0(u.rotation.angle.roll)}\xB0 yaw:${S0(u.rotation.angle.yaw)}\xB0 pitch:${S0(u.rotation.angle.pitch)}\xB0`),u.rotation.gaze.bearing&&c.push(`gaze: ${S0(u.rotation.gaze.bearing)}\xB0`)),c.length===0&&c.push("face"),r.fillStyle=s.color;for(let d=c.length-1;d>=0;d--){let p=Math.max(u.box[0],0),h=d*s.lineHeight+u.box[1];s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText(c[d],p+5,h+16)),r.fillStyle=s.labelColor,r.fillText(c[d],p+4,h+15)}if(r.lineWidth=1,u.mesh&&u.mesh.length>0){if(s.drawPoints)for(let d of u.mesh)kx(r,d[0],d[1],d[2],s);if(s.drawPolygons){r.lineWidth=1;for(let d=0;du.mesh[h]);Ix(r,p,s)}if(u.annotations&&u.annotations.leftEyeIris){r.strokeStyle=s.useDepth?"rgba(255, 200, 255, 0.3)":s.color,r.beginPath();let d=Math.abs(u.annotations.leftEyeIris[3][0]-u.annotations.leftEyeIris[1][0])/2,p=Math.abs(u.annotations.leftEyeIris[4][1]-u.annotations.leftEyeIris[2][1])/2;r.ellipse(u.annotations.leftEyeIris[0][0],u.annotations.leftEyeIris[0][1],d,p,0,0,2*Math.PI),r.stroke(),s.fillPolygons&&(r.fillStyle=s.useDepth?"rgba(255, 255, 200, 0.3)":s.color,r.fill())}if(u.annotations&&u.annotations.rightEyeIris){r.strokeStyle=s.useDepth?"rgba(255, 200, 255, 0.3)":s.color,r.beginPath();let d=Math.abs(u.annotations.rightEyeIris[3][0]-u.annotations.rightEyeIris[1][0])/2,p=Math.abs(u.annotations.rightEyeIris[4][1]-u.annotations.rightEyeIris[2][1])/2;r.ellipse(u.annotations.rightEyeIris[0][0],u.annotations.rightEyeIris[0][1],d,p,0,0,2*Math.PI),r.stroke(),s.fillPolygons&&(r.fillStyle=s.useDepth?"rgba(255, 255, 200, 0.3)":s.color,r.fill())}if(s.drawGaze&&((o=(a=u.rotation)==null?void 0:a.gaze)==null?void 0:o.strength)&&((l=(i=u.rotation)==null?void 0:i.gaze)==null?void 0:l.bearing)&&u.annotations.leftEyeIris&&u.annotations.rightEyeIris&&u.annotations.leftEyeIris[0]&&u.annotations.rightEyeIris[0]){r.strokeStyle="pink",r.beginPath();let d=[u.annotations.leftEyeIris[0][0]+Math.sin(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[3],u.annotations.leftEyeIris[0][1]+Math.cos(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[2]];r.moveTo(u.annotations.leftEyeIris[0][0],u.annotations.leftEyeIris[0][1]),r.lineTo(d[0],d[1]);let p=[u.annotations.rightEyeIris[0][0]+Math.sin(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[3],u.annotations.rightEyeIris[0][1]+Math.cos(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[2]];r.moveTo(u.annotations.rightEyeIris[0][0],u.annotations.rightEyeIris[0][1]),r.lineTo(p[0],p[1]),r.stroke()}}}}}async function Tx(e,t,n){var a;let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round";for(let o=0;ou.part==="leftShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightShoulder"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="rightShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftShoulder"),i&&l.push([i.position[0],i.position[1]]),l.length===4&&Ix(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="leftHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftKnee"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftAnkle"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftHeel"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftFoot"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="rightHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightKnee"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightAnkle"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightHeel"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightFoot"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="leftShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftElbow"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftWrist"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftPalm"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="rightShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightElbow"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightWrist"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightPalm"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s)}}}async function Nx(e,t,n){let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round",r.font=s.font;for(let a of t){if(s.drawBoxes&&(r.strokeStyle=s.color,r.fillStyle=s.color,$d(r,a.box[0],a.box[1],a.box[2],a.box[3],s),s.drawLabels&&(s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText("hand",a.box[0]+3,1+a.box[1]+s.lineHeight,a.box[2])),r.fillStyle=s.labelColor,r.fillText("hand",a.box[0]+2,0+a.box[1]+s.lineHeight,a.box[2])),r.stroke()),s.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let o of a.keypoints)r.fillStyle=s.useDepth?`rgba(${127.5+2*o[2]}, ${127.5-2*o[2]}, 255, 0.5)`:s.color,kx(r,o[0],o[1],0,s);if(s.drawLabels){let o=(i,l)=>{!i||(r.fillStyle=s.useDepth?`rgba(${127.5+2*i[i.length-1][2]}, ${127.5-2*i[i.length-1][2]}, 255, 0.5)`:s.color,r.fillText(l,i[i.length-1][0]+4,i[i.length-1][1]+4))};r.font=s.font,o(a.annotations.index,"index"),o(a.annotations.middle,"middle"),o(a.annotations.ring,"ring"),o(a.annotations.pinky,"pinky"),o(a.annotations.thumb,"thumb"),o(a.annotations.palm,"palm")}if(s.drawPolygons){let o=i=>{if(!!i)for(let l=0;l0?l-1:0][0],i[l>0?l-1:0][1]),r.lineTo(i[l][0],i[l][1]),r.stroke()};r.lineWidth=s.lineWidth,o(a.annotations.index),o(a.annotations.middle),o(a.annotations.ring),o(a.annotations.pinky),o(a.annotations.thumb)}}}async function Ex(e,t,n){let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round",r.font=s.font;for(let a of t)if(s.drawBoxes){if(r.strokeStyle=s.color,r.fillStyle=s.color,$d(r,a.box[0],a.box[1],a.box[2],a.box[3],s),s.drawLabels){let o=`${a.label} ${Math.round(100*a.score)}%`;s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText(o,a.box[0]+3,1+a.box[1]+s.lineHeight,a.box[2])),r.fillStyle=s.labelColor,r.fillText(o,a.box[0]+2,0+a.box[1]+s.lineHeight,a.box[2])}r.stroke()}}async function lI(e,t,n){let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round",r.font=s.font;for(let a=0;aP.box[0]&&S.box[0]P.box[1]&&S.box[1]+S.box[3]C.body.box[0]&&P.box[0]+P.box[2]C.body.box[1]&&P.box[1]+P.box[3]C.body.box[0]&&P.box[1]+P.box[3]>C.body.box[1]&&P.box[1]+P.box[3]{P&&P.length===4&&(D.push(P[0],P[0]+P[2]),O.push(P[1],P[1]+P[3]))};E((A=C.face)==null?void 0:A.box),E((y=C.body)==null?void 0:y.box),E((b=(x=C.hands)==null?void 0:x.left)==null?void 0:b.box),E((k=(v=C.hands)==null?void 0:v.right)==null?void 0:k.box);let R=Math.min(...D),T=Math.min(...O);C.box=[R,T,Math.max(...D)-R,Math.max(...O)-T],r&&r[1]&&r[2]&&(C.boxRaw=[C.box[0]/r[2],C.box[1]/r[1],C.box[2]/r[2],C.box[3]/r[1]]),o.push(C)}return o}var Pe={face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};function pI(e){var s,r,a,o,i,l,u,c,d,p,h,f,m,g,A,y,x,b,v,k,S;if(!e)return{face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};let t=Date.now()-e.timestamp,n=t<1e3?8-Math.log(t+1):1;if(Pe.canvas=e.canvas,!Pe.body||e.body.length!==Pe.body.length)Pe.body=JSON.parse(JSON.stringify(e.body));else for(let C=0;C((n-1)*Pe.body[C].box[T]+R)/n),O=e.body[C].boxRaw.map((R,T)=>((n-1)*Pe.body[C].boxRaw[T]+R)/n),E=e.body[C].keypoints.map((R,T)=>({score:R.score,part:R.part,position:[Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].position[0]+R.position[0])/n:R.position[0],Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].position[1]+R.position[1])/n:R.position[1]],positionRaw:[Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].positionRaw[0]+R.positionRaw[0])/n:R.position[0],Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].positionRaw[1]+R.positionRaw[1])/n:R.position[1]]}));Pe.body[C]={...e.body[C],box:D,boxRaw:O,keypoints:E}}if(!Pe.hand||e.hand.length!==Pe.hand.length)Pe.hand=JSON.parse(JSON.stringify(e.hand));else for(let C=0;C((n-1)*Pe.hand[C].box[U]+P)/n),O=e.hand[C].boxRaw.map((P,U)=>((n-1)*Pe.hand[C].boxRaw[U]+P)/n),E=e.hand[C].keypoints?e.hand[C].keypoints.map((P,U)=>P.map((j,q)=>((n-1)*Pe.hand[C].keypoints[U][q]+j)/n)):[],R=Object.keys(e.hand[C].annotations),T={};for(let P of R)T[P]=e.hand[C].annotations[P].map((U,j)=>U.map((q,X)=>((n-1)*Pe.hand[C].annotations[P][j][X]+q)/n));Pe.hand[C]={...e.hand[C],box:D,boxRaw:O,keypoints:E,annotations:T}}if(!Pe.face||e.face.length!==Pe.face.length)Pe.face=JSON.parse(JSON.stringify(e.face));else for(let C=0;C((n-1)*Pe.face[C].box[T]+R)/n),O=e.face[C].boxRaw.map((R,T)=>((n-1)*Pe.face[C].boxRaw[T]+R)/n),E={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};E.matrix=(s=e.face[C].rotation)==null?void 0:s.matrix,E.angle={roll:((n-1)*(((a=(r=Pe.face[C].rotation)==null?void 0:r.angle)==null?void 0:a.roll)||0)+(((i=(o=e.face[C].rotation)==null?void 0:o.angle)==null?void 0:i.roll)||0))/n,yaw:((n-1)*(((u=(l=Pe.face[C].rotation)==null?void 0:l.angle)==null?void 0:u.yaw)||0)+(((d=(c=e.face[C].rotation)==null?void 0:c.angle)==null?void 0:d.yaw)||0))/n,pitch:((n-1)*(((h=(p=Pe.face[C].rotation)==null?void 0:p.angle)==null?void 0:h.pitch)||0)+(((m=(f=e.face[C].rotation)==null?void 0:f.angle)==null?void 0:m.pitch)||0))/n},E.gaze={bearing:((n-1)*(((A=(g=Pe.face[C].rotation)==null?void 0:g.gaze)==null?void 0:A.bearing)||0)+(((x=(y=e.face[C].rotation)==null?void 0:y.gaze)==null?void 0:x.bearing)||0))/n,strength:((n-1)*(((v=(b=Pe.face[C].rotation)==null?void 0:b.gaze)==null?void 0:v.strength)||0)+(((S=(k=e.face[C].rotation)==null?void 0:k.gaze)==null?void 0:S.strength)||0))/n},Pe.face[C]={...e.face[C],rotation:E,box:D,boxRaw:O}}if(!Pe.object||e.object.length!==Pe.object.length)Pe.object=JSON.parse(JSON.stringify(e.object));else for(let C=0;C((n-1)*Pe.object[C].box[R]+E)/n),O=e.object[C].boxRaw.map((E,R)=>((n-1)*Pe.object[C].boxRaw[R]+E)/n);Pe.object[C]={...e.object[C],box:D,boxRaw:O}}if(e.persons){let C=e.persons;if(!Pe.persons||C.length!==Pe.persons.length)Pe.persons=JSON.parse(JSON.stringify(C));else for(let D=0;D((n-1)*Pe.persons[D].box[E]+O)/n)}return e.gesture&&(Pe.gesture=e.gesture),e.performance&&(Pe.performance=e.performance),Pe}var ks={name:"humangl",priority:99,canvas:null,gl:null,width:1024,height:1024,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function Ele(){let e=ks.gl;!e||(ks.extensions=e.getSupportedExtensions())}function hI(){var e;if(!Vg(ks.name)){try{ks.canvas=mr(100,100)}catch(t){ce("error: cannot create canvas:",t);return}try{ks.gl=(e=ks.canvas)==null?void 0:e.getContext("webgl2",ks.webGLattr)}catch(t){ce("error: cannot get WebGL2 context:",t);return}try{Mf(2,ks.gl)}catch(t){ce("error: cannot set WebGL2 context:",t);return}try{let t=new jf(ks.gl);Wl(ks.name,()=>new bu(t),ks.priority)}catch(t){ce("error: cannot register WebGL backend:",t);return}try{Yr("webgl").forEach(n=>{let s={...n,backendName:ks.name};Do(s)})}catch(t){ce("error: cannot update WebGL backend registration:",t);return}try{er.set("WEBGL_VERSION",2)}catch(t){ce("error: cannot set WebGL backend flags:",t);return}Ele(),ce("backend registered:",ks.name)}}async function Rx(e){if(e.initial||e.config.backend&&e.config.backend.length>0&&Bl()!==e.config.backend){let t=Ze();if(e.state="backend",e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&ce("running inside web worker"),xe.browser&&e.config.backend==="tensorflow"&&(ce("override: backend set to tensorflow while running in browser"),e.config.backend="humangl"),xe.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(ce(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),xe.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")ce("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let s=await navigator.gpu.requestAdapter();e.config.debug&&ce("enumerated webgpu adapter:",s)}e.config.backend==="humangl"&&hI();let n=Object.keys(Ns().registryFactory);if(e.config.debug&&ce("available backends:",n),n.includes(e.config.backend)||(ce(`error: backend ${e.config.backend} not found in registry`),e.config.backend=xe.node?"tensorflow":"humangl",ce(`override: setting backend ${e.config.backend}`)),e.config.debug&&ce("setting backend:",e.config.backend),e.config.backend==="wasm"){if(e.config.debug&&ce("wasm path:",e.config.wasmPath),typeof(pi==null?void 0:pi.setWasmPaths)!="undefined")await n8(e.config.wasmPath);else throw new Error("Human: WASM backend is not loaded");let s=await Y().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await Y().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&ce(`wasm execution: ${s?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),e.config.debug&&!s&&ce("warning: wasm simd support is not enabled")}await Wg(e.config.backend);try{await Wg(e.config.backend),await ih()}catch(s){ce("error: cannot set backend:",e.config.backend,s)}}if(Bl()==="humangl"){er.set("CHECK_COMPUTATION_FOR_ERRORS",!1),er.set("WEBGL_CPU_FORWARD",!0),er.set("WEBGL_PACK_DEPTHWISECONV",!1),er.set("WEBGL_USE_SHAPES_UNIFORMS",!0),typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(ce("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),er.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0));let n=await zo().getGPGPUContext().gl;e.config.debug&&ce(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}ub(),await ih(),e.performance.backend=Math.trunc(Ze()-t),e.config.backend=Bl(),d0(),e.env=xe}}var Dx="2.2.0";var C0=` +`)}var c0=2048,Oe,Nt,Gt;function mr(e,t){let n;return xe.browser?typeof OffscreenCanvas!="undefined"?n=new OffscreenCanvas(e,t):(n=document.createElement("canvas"),n.width=e,n.height=t):n=typeof xe.Canvas!="undefined"?new xe.Canvas(e,t):null,n}function fi(e,t){let n;if(!e)throw new Error("Human: Input is missing");if(!(e instanceof Ge)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof xe.Canvas!="undefined"&&e instanceof xe.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("Human: Input type is not recognized");if(e instanceof Ge)if(e.shape&&e.shape.length===4&&e.shape[0]===1&&e.shape[3]===3)n=Ps(e);else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${e.shape}`);else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return ce("input stream is not ready"),{tensor:null,canvas:Oe};let s=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!s||!r)return ce("cannot determine input dimensions"),{tensor:null,canvas:Oe};let a=s,o=r;if(a>c0&&(a=c0,o=a*r/s),o>c0&&(o=c0,a=o*s/r),(t.filter.width||0)>0?a=t.filter.width:(t.filter.height||0)>0&&(a=s*((t.filter.height||0)/r)),(t.filter.height||0)>0?o=t.filter.height:(t.filter.width||0)>0&&(o=r*((t.filter.width||0)/s)),!a||!o)throw new Error("Human: Input cannot determine dimension");(!Oe||(Oe==null?void 0:Oe.width)!==a||(Oe==null?void 0:Oe.height)!==o)&&(Oe=mr(a,o));let i=Oe.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(s,0),i.scale(-1,1),i.drawImage(e,0,0,s,r,0,0,Oe==null?void 0:Oe.width,Oe==null?void 0:Oe.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,s,r,0,0,Oe==null?void 0:Oe.width,Oe==null?void 0:Oe.height),t.filter.enabled&&xe.webgl.supported){if((!Gt||!Nt||Oe.width!==Nt.width||(Oe==null?void 0:Oe.height)!==(Nt==null?void 0:Nt.height))&&(Nt=mr(Oe==null?void 0:Oe.width,Oe==null?void 0:Oe.height),(Nt==null?void 0:Nt.width)!==(Oe==null?void 0:Oe.width)&&(Nt.width=Oe==null?void 0:Oe.width),(Nt==null?void 0:Nt.height)!==(Oe==null?void 0:Oe.height)&&(Nt.height=Oe==null?void 0:Oe.height),Gt=xe.browser?new f8({canvas:Nt}):null),!Gt)return{tensor:null,canvas:Oe};Gt.reset(),Gt.addFilter("brightness",t.filter.brightness),t.filter.contrast!==0&&Gt.addFilter("contrast",t.filter.contrast),t.filter.sharpness!==0&&Gt.addFilter("sharpen",t.filter.sharpness),t.filter.blur!==0&&Gt.addFilter("blur",t.filter.blur),t.filter.saturation!==0&&Gt.addFilter("saturation",t.filter.saturation),t.filter.hue!==0&&Gt.addFilter("hue",t.filter.hue),t.filter.negative&&Gt.addFilter("negative"),t.filter.sepia&&Gt.addFilter("sepia"),t.filter.vintage&&Gt.addFilter("brownie"),t.filter.sepia&&Gt.addFilter("sepia"),t.filter.kodachrome&&Gt.addFilter("kodachrome"),t.filter.technicolor&&Gt.addFilter("technicolor"),t.filter.polaroid&&Gt.addFilter("polaroid"),t.filter.pixelate!==0&&Gt.addFilter("pixelate",t.filter.pixelate),Gt.apply(Oe)}else Nt=Oe,Gt&&(Gt=null);if(!n){let l;if(Nt.data){let u=[Nt.height,Nt.width,3];l=sh(Nt.data,u,"int32")}else if(typeof ImageData!="undefined"&&Nt instanceof ImageData)l=fs?fs.fromPixels(Nt):null;else if(t.backend==="webgl"||t.backend==="humangl"){let u=mr(a,o);u.width=a,u.height=o;let c=u.getContext("2d");c==null||c.drawImage(Nt,0,0),l=fs&&xe.browser?fs.fromPixels(u):null}else{let u=mr(a,o);u.width=a,u.height=o;let c=u.getContext("2d");c.drawImage(Nt,0,0);let d=c.getImageData(0,0,a,o);fs&&xe.browser?l=fs.fromPixels(d):l=H(()=>{let p=nn(Array.from(d.data),[a,o,4]),h=Wt(p,4,2),f=pn([h[0],h[1],h[2]],2);return V(f,[p.shape[0],p.shape[1],3])})}if(l){let u=de(l,"float32");n=zt(u,0),Z(l),Z(u)}else throw n=Ot([1,a,o,3]),new Error("Human: Cannot create tensor from input")}}return{tensor:n,canvas:t.filter.return?Nt:null}}var Ry=0,m8=1;async function g8(e,t){if(e.cacheSensitivity===0)return!1;let n=32;if(!t.shape[1]||!t.shape[2])return!1;let s=Fe.resizeBilinear(t,[Math.trunc(t.shape[1]/n),Math.trunc(t.shape[2]/n)]),r=await s.data();Z(s);let a=0;for(let l=0;l10*e.cacheSensitivity?0:o,i}var xe={browser:void 0,node:void 0,worker:void 0,platform:void 0,agent:void 0,backends:[],tfjs:{version:void 0},wasm:{supported:void 0,backend:void 0,simd:void 0,multithread:void 0},webgl:{supported:void 0,backend:void 0,version:void 0,renderer:void 0},webgpu:{supported:void 0,backend:void 0,adapter:void 0},kernels:[],Canvas:void 0,Image:void 0};async function tle(){var n;xe.backends=Object.keys(Ns().registryFactory),xe.wasm.supported=typeof WebAssembly!="undefined",xe.wasm.backend=xe.backends.includes("wasm"),xe.wasm.supported&&xe.wasm.backend&&(xe.wasm.simd=await Y().getAsync("WASM_HAS_SIMD_SUPPORT"),xe.wasm.multithread=await Y().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let e=mr(100,100),t=e?e.getContext("webgl2"):void 0;if(xe.webgl.supported=typeof t!="undefined",xe.webgl.backend=xe.backends.includes("webgl"),xe.webgl.supported&&xe.webgl.backend){let s=zo().gpgpu!=="undefined"&&zo().getGPGPUContext?await zo().getGPGPUContext().gl:null;s&&(xe.webgl.version=s.getParameter(s.VERSION),xe.webgl.renderer=s.getParameter(s.RENDERER))}xe.webgpu.supported=xe.browser&&typeof navigator.gpu!="undefined",xe.webgpu.backend=xe.backends.includes("webgpu"),xe.webgpu.supported&&(xe.webgpu.adapter=(n=await navigator.gpu.requestAdapter())==null?void 0:n.name),xe.kernels=Yr(Bl()).map(s=>s.kernelName.toLowerCase())}async function d0(){if(xe.browser=typeof navigator!="undefined",xe.node=typeof process!="undefined",xe.worker=xe.browser?typeof WorkerGlobalScope!="undefined":void 0,xe.tfjs.version=ah,typeof navigator!="undefined"){let e=navigator.userAgent.match(/\(([^()]+)\)/g);if(e&&e[0]){let t=e[0].match(/\(([^()]+)\)/g);xe.platform=t&&t[0]?t[0].replace(/\(|\)/g,""):"",xe.agent=navigator.userAgent.replace(e[0],""),xe.platform[1]&&(xe.agent=xe.agent.replace(e[1],"")),xe.agent=xe.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(xe.platform=`${process.platform} ${process.arch}`,xe.agent=`NodeJS ${process.version}`);await tle()}var Dy=fr.leftEyeLower0,_y=fr.rightEyeLower0,Cu={leftBounds:[Dy[0],Dy[Dy.length-1]],rightBounds:[_y[0],_y[_y.length-1]]},A8={count:468,mouth:13,symmetryLine:[13,fr.midwayBetweenEyes[0]]},nle={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},Tu={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};function p0(e,t,n,s){for(let r=0;r[a[0]/this.meshSize*(d[0]-this.meshSize/2),a[1]/this.meshSize*(d[1]-this.meshSize/2),d[2]]),i=s!==0?Ny(s,[0,0]):u0,l=s!==0?o.map(d=>[...u8(d,i),d[2]]):o,u=s!==0?l8(r):u0,c=[...Td({startPoint:n.startPoint,endPoint:n.endPoint}),1];return l.map(d=>[Math.round(d[0]+ba(c,u[0])),Math.round(d[1]+ba(c,u[1])),Math.round(d[2])])}getLeftToRightEyeDepthDifference(t){let n=t[Cu.leftBounds[0]][2],s=t[Cu.rightBounds[0]][2];return n-s}getEyeBox(t,n,s,r,a=!1){let o=l0(i0(Ty([t[s],t[r]]),this.irisEnlarge)),i=Cd(o),l=Fe.cropAndResize(n,[[o.startPoint[1]/this.meshSize,o.startPoint[0]/this.meshSize,o.endPoint[1]/this.meshSize,o.endPoint[0]/this.meshSize]],[0],[this.irisSize,this.irisSize]);if(a&&xe.kernels.includes("flipleftright")){let u=Fe.flipLeftRight(l);Z(l),l=u}return{box:o,boxSize:i,crop:l}}getEyeCoords(t,n,s,r=!1){let a=[];for(let o=0;o{let u=o;return l===2?u=r:l===4&&(u=a),[i[0],i[1],u]})}correctFaceRotation(t,n,s){let[r,a]=n.landmarks.length>=A8.count?A8.symmetryLine:nle.symmetryLine,o=a8(n.landmarks[r],n.landmarks[a]),i=Td({startPoint:n.startPoint,endPoint:n.endPoint}),l=[i[0]/s.shape[2],i[1]/s.shape[1]],u=Fe.rotateWithOffset(s,o,0,l),c=Ny(-o,i),d=t.face.mesh.enabled?Nd({startPoint:n.startPoint,endPoint:n.endPoint},u,[this.meshSize,this.meshSize]):Nd({startPoint:n.startPoint,endPoint:n.endPoint},u,[this.boxSize,this.boxSize]),p=pe(d,255);return Z(d),Z(u),[o,c,p]}async augmentIris(t,n){let{box:s,boxSize:r,crop:a}=this.getEyeBox(t,n,Cu.leftBounds[0],Cu.leftBounds[1],!0),{box:o,boxSize:i,crop:l}=this.getEyeBox(t,n,Cu.rightBounds[0],Cu.rightBounds[1]),u=ft([a,l]);Z(a),Z(l);let c=this.irisModel.predict(u);Z(u);let d=await c.data();Z(c);let p=d.slice(0,Tu.numCoordinates*3),{rawCoords:h,iris:f}=this.getEyeCoords(p,s,r,!0),m=d.slice(Tu.numCoordinates*3),{rawCoords:g,iris:A}=this.getEyeCoords(m,o,i),y=this.getLeftToRightEyeDepthDifference(t);Math.abs(y)<30?(p0(t,h,"left",null),p0(t,g,"right",null)):y<1?p0(t,h,"left",["EyeUpper0","EyeLower0"]):p0(t,g,"right",["EyeUpper0","EyeLower0"]);let x=this.getAdjustedIrisCoords(t,f,"left"),b=this.getAdjustedIrisCoords(t,A,"right");return t.concat(x).concat(b)}async predict(t,n){let s=!1,r;if((this.skipped===0||this.skipped>n.face.detector.skipFrames||!n.face.mesh.enabled||!n.skipFrame)&&(r=await this.boundingBoxDetector.getBoundingBoxes(t,n),this.skipped=0),n.skipFrame&&this.skipped++,!n.skipFrame||r&&r.boxes&&(!n.face.mesh.enabled||r.boxes.length!==this.detectedFaces&&this.detectedFaces!==n.face.detector.maxDetected)){this.storedBoxes=[],this.detectedFaces=0;for(let i of r.boxes){let l=await i.box.startPoint.data(),u=await i.box.endPoint.data(),c=await i.landmarks.array();this.storedBoxes.push({startPoint:l,endPoint:u,landmarks:c,confidence:i.confidence})}this.storedBoxes.length>0&&(s=!0)}if(s){if(!r||!r.boxes||r.boxes.length===0)return this.storedBoxes=[],this.detectedFaces=0,null;for(let i=0;i{Z(i.box.startPoint),Z(i.box.endPoint),Z(i.landmarks)});let a=[],o=[];for(let i of this.storedBoxes){let l,u=0,c;if(n.face.detector.rotation&&n.face.mesh.enabled&&xe.kernels.includes("rotatewithoffset"))[u,c,l]=this.correctFaceRotation(n,i,t);else{c=u0;let d=t.clone(),p=n.face.mesh.enabled?Nd({startPoint:i.startPoint,endPoint:i.endPoint},d,[this.meshSize,this.meshSize]):Nd({startPoint:i.startPoint,endPoint:i.endPoint},d,[this.boxSize,this.boxSize]);l=pe(p,255),Z(p),Z(d)}if(!n.face.mesh.enabled)a.push({mesh:[],box:i,faceConfidence:null,boxConfidence:i.confidence,confidence:i.confidence,image:l});else{let[d,p,h]=this.meshDetector.execute(l);Z(d);let f=(await p.data())[0];Z(p);let m=V(h,[-1,3]),g=await m.array();if(Z(h),Z(m),fi.confidence>n.face.detector.minConfidence)),this.detectedFaces=a.length,a}};var Pt=[null,null,null],$y;async function y8(e,t){let n=await $y.predict(e,t),s=[],r=0;for(let a of n||[]){if(!a||a.isDisposedInternal)continue;let o=a.mesh.map(c=>[c[0]/(e.shape[2]||0),c[1]/(e.shape[1]||0),c[2]/$y.meshSize]),i={};if(a.mesh&&a.mesh.length>0)for(let c of Object.keys(fr))i[c]=fr[c].map(d=>a.mesh[d]);let l=a.box?[Math.trunc(Math.max(0,a.box.startPoint[0])),Math.trunc(Math.max(0,a.box.startPoint[1])),Math.trunc(Math.min(e.shape[2]||0,a.box.endPoint[0])-Math.max(0,a.box.startPoint[0])),Math.trunc(Math.min(e.shape[1]||0,a.box.endPoint[1])-Math.max(0,a.box.startPoint[1]))]:[0,0,0,0],u=a.box?[a.box.startPoint[0]/(e.shape[2]||0),a.box.startPoint[1]/(e.shape[1]||0),(a.box.endPoint[0]-a.box.startPoint[0])/(e.shape[2]||0),(a.box.endPoint[1]-a.box.startPoint[1])/(e.shape[1]||0)]:[0,0,0,0];s.push({id:r++,score:Math.round(100*a.faceConfidence||100*a.boxConfidence||0)/100,boxScore:Math.round(100*a.boxConfidence)/100,faceScore:Math.round(100*a.faceConfidence)/100,box:l,boxRaw:u,mesh:a.mesh,meshRaw:o,annotations:i,tensor:a.image})}return s}async function Oy(e){return!Pt[0]&&e.face.enabled||!Pt[1]&&e.face.mesh.enabled||!Pt[2]&&e.face.iris.enabled?(Pt=await Promise.all([!Pt[0]&&e.face.enabled?h8(e):null,!Pt[1]&&e.face.mesh.enabled?yt(xt(e.modelBasePath,e.face.mesh.modelPath),{fromTFHub:e.face.mesh.modelPath.includes("tfhub.dev")}):null,!Pt[2]&&e.face.iris.enabled?yt(xt(e.modelBasePath,e.face.iris.modelPath),{fromTFHub:e.face.iris.modelPath.includes("tfhub.dev")}):null]),e.face.mesh.enabled&&(!Pt[1]||!Pt[1].modelUrl?ce("load model failed:",e.face.mesh.modelPath):e.debug&&ce("load model:",Pt[1].modelUrl)),e.face.iris.enabled&&(!Pt[2]||!Pt[2].modelUrl?ce("load model failed:",e.face.iris.modelPath):e.debug&&ce("load model:",Pt[2].modelUrl))):e.debug&&(Pt[0]&&ce("cached model:",Pt[0].model.modelUrl),Pt[1]&&ce("cached model:",Pt[1].modelUrl),Pt[2]&&ce("cached model:",Pt[2].modelUrl)),$y=new Fy(Pt[0],Pt[1],Pt[2]),Pt}var x8=hi,b8=Ed;var Ks,h0=[],v8=0,Py=Number.MAX_SAFE_INTEGER;async function My(e){var n,s;let t=xt(e.modelBasePath,((n=e.face.description)==null?void 0:n.modelPath)||"");return Ks?e.debug&&ce("cached model:",t):(Ks=await yt(t),Ks?e.debug&&ce("load model:",t):ce("load model failed:",((s=e.face.description)==null?void 0:s.modelPath)||"")),Ks}function zy(e,t,n=2){if(!e||!t||(e==null?void 0:e.length)===0||(t==null?void 0:t.length)===0||(e==null?void 0:e.length)!==(t==null?void 0:t.length))return 0;let s=5*e.map((a,o)=>Math.abs(e[o]-t[o])**n).reduce((a,o)=>a+o,0)**(1/n);return Math.max(0,100-s)/100}function w8(e,t,n=0){let s={similarity:0,name:"",source:"",embedding:[]};if(!e||!t||!Array.isArray(e)||!Array.isArray(t))return s;for(let r of t)if(r.embedding&&r.name){let a=zy(e,r.embedding);a>n&&a>s.similarity&&(s={...r,similarity:a})}return s}function Ly(e){return H(()=>{let n=e.image||e.tensor||e;if(!(n instanceof Ge))return null;let s=[[.05,.15,.85,.85]];if(!Ks.inputs[0].shape)return null;let r=n.shape.length===3?Fe.cropAndResize(zt(n,0),s,[0],[Ks.inputs[0].shape[2],Ks.inputs[0].shape[1]]):Fe.cropAndResize(n,s,[0],[Ks.inputs[0].shape[2],Ks.inputs[0].shape[1]]);return z(r,255)})}async function By(e,t,n,s){var r,a,o;return Ks?Py<(((r=t.face.description)==null?void 0:r.skipFrames)||0)&&t.skipFrame&&v8===s&&((a=h0[n])==null?void 0:a.age)&&((o=h0[n])==null?void 0:o.age)>0?(Py++,h0[n]):(Py=0,new Promise(async i=>{var d,p;let l=Ly(e),u,c={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(((d=t.face.description)==null?void 0:d.enabled)&&(u=await Ks.predict(l)),Z(l),u){let h=await u.find(b=>b.shape[1]===1).data(),f=Math.trunc(200*Math.abs(h[0]-.5))/100;f>(((p=t.face.description)==null?void 0:p.minConfidence)||0)&&(c.gender=h[0]<=.5?"female":"male",c.genderScore=Math.min(.99,f));let m=Ms(u.find(b=>b.shape[1]===100),1),g=(await m.data())[0];Z(m);let A=await u.find(b=>b.shape[1]===100).data();c.age=Math.round(A[g-1]>A[g+1]?10*g-100*A[g-1]:10*g+100*A[g+1])/10;let x=await u.find(b=>b.shape[1]===1024).data();c.descriptor=[...x],u.forEach(b=>Z(b))}h0[n]=c,v8=s,i(c)})):null}var sle=["angry","disgust","fear","happy","sad","surprise","neutral"],Zs,f0=[],k8=0,Wy=Number.MAX_SAFE_INTEGER,Vy=[.2989,.587,.114];async function Uy(e){var t,n;return Zs?e.debug&&ce("cached model:",Zs.modelUrl):(Zs=await yt(xt(e.modelBasePath,((t=e.face.emotion)==null?void 0:t.modelPath)||"")),!Zs||!Zs.modelUrl?ce("load model failed:",((n=e.face.emotion)==null?void 0:n.modelPath)||""):e.debug&&ce("load model:",Zs.modelUrl)),Zs}async function Hy(e,t,n,s){var r;return Zs?Wy<(((r=t.face.emotion)==null?void 0:r.skipFrames)||0)&&t.skipFrame&&k8===s&&f0[n]&&f0[n].length>0?(Wy++,f0[n]):(Wy=0,new Promise(async a=>{var g,A;let o=Fe.resizeBilinear(e,[Zs.inputs[0].shape[2],Zs.inputs[0].shape[1]],!1),[i,l,u]=Wt(o,3,3);Z(o);let c=z(i,Vy[0]),d=z(l,Vy[1]),p=z(u,Vy[2]);Z(i),Z(l),Z(u);let h=uh([c,d,p]);Z(c),Z(d),Z(p);let f=H(()=>z(Ae(h,.5),2));Z(h);let m=[];if((g=t.face.emotion)==null?void 0:g.enabled){let y=await Zs.predict(f),x=await y.data();Z(y);for(let b=0;b(((A=t.face.emotion)==null?void 0:A.minConfidence)||0)&&m.push({score:Math.min(.99,Math.trunc(100*x[b])/100),emotion:sle[b]});m.sort((b,v)=>v.score-b.score)}Z(f),f0[n]=m,k8=s,a(m)})):null}var Rd=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],I8=Rd.length,Dd=Rd.reduce((e,t,n)=>(e[t]=n,e),{}),rle=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],ale=rle.map(([e,t])=>[Dd[e],Dd[t]]),S8=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function C8(e){let t=e.reduce(({maxX:n,maxY:s,minX:r,minY:a},{position:{x:o,y:i}})=>({maxX:Math.max(n,o),maxY:Math.max(s,i),minX:Math.min(r,o),minY:Math.min(a,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function T8(e,[t,n],[s,r]){let a=t/s,o=n/r,i=(u,c)=>({id:c,score:u.score,boxRaw:[u.box[0]/r,u.box[1]/s,u.box[2]/r,u.box[3]/s],box:[Math.trunc(u.box[0]*o),Math.trunc(u.box[1]*a),Math.trunc(u.box[2]*o),Math.trunc(u.box[3]*a)],keypoints:u.keypoints.map(({score:d,part:p,position:h})=>({score:d,part:p,position:[Math.trunc(h.x*o),Math.trunc(h.y*a)],positionRaw:[h.x/s,h.y/s]}))});return e.map((u,c)=>i(u,c))}var Gy=class{constructor(t,n){Re(this,"priorityQueue");Re(this,"numberOfElements");Re(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function N8(e,t,n,s){let r=n-e,a=s-t;return r*r+a*a}function Ky(e,t){return{x:e.x+t.x,y:e.y+t.y}}var m0=1,Nu=16,ole=50**2;function E8(e,t,n,s,r,a,o=2){let i=A=>({y:a.get(A.y,A.x,e),x:a.get(A.y,A.x,a.shape[2]/2+e)}),l=(A,y,x)=>({y:Xy(Math.round(A.y/Nu),0,y-1),x:Xy(Math.round(A.x/Nu),0,x-1)}),[u,c]=s.shape,d=l(t.position,u,c),p=i(d),f=Ky(t.position,p);for(let A=0;A[Dd[p],Dd[h]]),o=a.map(([,p])=>p),i=a.map(([p])=>p),l=t.shape[2],u=o.length,c=new Array(l),d=qy(e.part,Nu,n);c[e.part.id]={score:e.score,part:Rd[e.part.id],position:d};for(let p=u-1;p>=0;--p){let h=o[p],f=i[p];c[h]&&!c[f]&&(c[f]=E8(p,c[h],f,t,n,r))}for(let p=0;pt){i=!1;break}if(!i)break}return i}function ule(e,t){let[n,s,r]=t.shape,a=new Gy(n*s*r,({score:o})=>o);for(let o=0;o{var o;let a=(o=r[s])==null?void 0:o.position;return a?N8(n,t,a.y,a.x)<=ole:!1})}function cle(e,t){return t.reduce((s,{position:r,score:a},o)=>(R8(e,r,o)||(s+=a),s),0)/t.length}function D8(e,t,n,s,r,a){let o=[],i=ule(a,t);for(;o.lengthh.score>a);let d=cle(o,c),p=C8(c);d>a&&o.push({keypoints:c,box:p,score:Math.round(100*d)/100})}return o}var os,dle=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"];async function Zy(e,t){let n=H(()=>{if(!os.inputs[0].shape)return[];let o=Fe.resizeBilinear(e,[os.inputs[0].shape[2],os.inputs[0].shape[1]]),i=Ae(pe(de(o,"float32"),127.5),1),u=os.execute(i,dle).map(c=>lt(c,[0]));return u[1]=u[1].sigmoid(),u}),s=await Promise.all(n.map(o=>o.buffer()));for(let o of n)Z(o);let r=await D8(s[0],s[1],s[2],s[3],t.body.maxDetected,t.body.minConfidence);return os.inputs[0].shape?T8(r,[e.shape[1],e.shape[2]],[os.inputs[0].shape[2],os.inputs[0].shape[1]]):[]}async function Yy(e){return os?e.debug&&ce("cached model:",os.modelUrl):(os=await yt(xt(e.modelBasePath,e.body.modelPath||"")),!os||!os.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",os.modelUrl)),os}function g0(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function _d(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function _8(e,t,n){let s=t.shape[1],r=t.shape[2],a=[[e.startPoint[1]/s,e.startPoint[0]/r,e.endPoint[1]/s,e.endPoint[0]/r]];return Fe.cropAndResize(t,a,[0],n)}function F8(e,t){let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],s=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],r=e.palmLandmarks.map(a=>[a[0]*t[0],a[1]*t[1]]);return{startPoint:n,endPoint:s,palmLandmarks:r,confidence:e.confidence}}function A0(e,t=1.5){let n=_d(e),s=g0(e),r=[t*s[0]/2,t*s[1]/2],a=[n[0]-r[0],n[1]-r[1]],o=[n[0]+r[0],n[1]+r[1]];return{startPoint:a,endPoint:o,palmLandmarks:e.palmLandmarks}}function y0(e){let t=_d(e),n=g0(e),r=Math.max(...n)/2,a=[t[0]-r,t[1]-r],o=[t[0]+r,t[1]+r];return{startPoint:a,endPoint:o,palmLandmarks:e.palmLandmarks}}var $8=[{x:.015625,y:.015625},{x:.015625,y:.015625},{x:.046875,y:.015625},{x:.046875,y:.015625},{x:.078125,y:.015625},{x:.078125,y:.015625},{x:.109375,y:.015625},{x:.109375,y:.015625},{x:.140625,y:.015625},{x:.140625,y:.015625},{x:.171875,y:.015625},{x:.171875,y:.015625},{x:.203125,y:.015625},{x:.203125,y:.015625},{x:.234375,y:.015625},{x:.234375,y:.015625},{x:.265625,y:.015625},{x:.265625,y:.015625},{x:.296875,y:.015625},{x:.296875,y:.015625},{x:.328125,y:.015625},{x:.328125,y:.015625},{x:.359375,y:.015625},{x:.359375,y:.015625},{x:.390625,y:.015625},{x:.390625,y:.015625},{x:.421875,y:.015625},{x:.421875,y:.015625},{x:.453125,y:.015625},{x:.453125,y:.015625},{x:.484375,y:.015625},{x:.484375,y:.015625},{x:.515625,y:.015625},{x:.515625,y:.015625},{x:.546875,y:.015625},{x:.546875,y:.015625},{x:.578125,y:.015625},{x:.578125,y:.015625},{x:.609375,y:.015625},{x:.609375,y:.015625},{x:.640625,y:.015625},{x:.640625,y:.015625},{x:.671875,y:.015625},{x:.671875,y:.015625},{x:.703125,y:.015625},{x:.703125,y:.015625},{x:.734375,y:.015625},{x:.734375,y:.015625},{x:.765625,y:.015625},{x:.765625,y:.015625},{x:.796875,y:.015625},{x:.796875,y:.015625},{x:.828125,y:.015625},{x:.828125,y:.015625},{x:.859375,y:.015625},{x:.859375,y:.015625},{x:.890625,y:.015625},{x:.890625,y:.015625},{x:.921875,y:.015625},{x:.921875,y:.015625},{x:.953125,y:.015625},{x:.953125,y:.015625},{x:.984375,y:.015625},{x:.984375,y:.015625},{x:.015625,y:.046875},{x:.015625,y:.046875},{x:.046875,y:.046875},{x:.046875,y:.046875},{x:.078125,y:.046875},{x:.078125,y:.046875},{x:.109375,y:.046875},{x:.109375,y:.046875},{x:.140625,y:.046875},{x:.140625,y:.046875},{x:.171875,y:.046875},{x:.171875,y:.046875},{x:.203125,y:.046875},{x:.203125,y:.046875},{x:.234375,y:.046875},{x:.234375,y:.046875},{x:.265625,y:.046875},{x:.265625,y:.046875},{x:.296875,y:.046875},{x:.296875,y:.046875},{x:.328125,y:.046875},{x:.328125,y:.046875},{x:.359375,y:.046875},{x:.359375,y:.046875},{x:.390625,y:.046875},{x:.390625,y:.046875},{x:.421875,y:.046875},{x:.421875,y:.046875},{x:.453125,y:.046875},{x:.453125,y:.046875},{x:.484375,y:.046875},{x:.484375,y:.046875},{x:.515625,y:.046875},{x:.515625,y:.046875},{x:.546875,y:.046875},{x:.546875,y:.046875},{x:.578125,y:.046875},{x:.578125,y:.046875},{x:.609375,y:.046875},{x:.609375,y:.046875},{x:.640625,y:.046875},{x:.640625,y:.046875},{x:.671875,y:.046875},{x:.671875,y:.046875},{x:.703125,y:.046875},{x:.703125,y:.046875},{x:.734375,y:.046875},{x:.734375,y:.046875},{x:.765625,y:.046875},{x:.765625,y:.046875},{x:.796875,y:.046875},{x:.796875,y:.046875},{x:.828125,y:.046875},{x:.828125,y:.046875},{x:.859375,y:.046875},{x:.859375,y:.046875},{x:.890625,y:.046875},{x:.890625,y:.046875},{x:.921875,y:.046875},{x:.921875,y:.046875},{x:.953125,y:.046875},{x:.953125,y:.046875},{x:.984375,y:.046875},{x:.984375,y:.046875},{x:.015625,y:.078125},{x:.015625,y:.078125},{x:.046875,y:.078125},{x:.046875,y:.078125},{x:.078125,y:.078125},{x:.078125,y:.078125},{x:.109375,y:.078125},{x:.109375,y:.078125},{x:.140625,y:.078125},{x:.140625,y:.078125},{x:.171875,y:.078125},{x:.171875,y:.078125},{x:.203125,y:.078125},{x:.203125,y:.078125},{x:.234375,y:.078125},{x:.234375,y:.078125},{x:.265625,y:.078125},{x:.265625,y:.078125},{x:.296875,y:.078125},{x:.296875,y:.078125},{x:.328125,y:.078125},{x:.328125,y:.078125},{x:.359375,y:.078125},{x:.359375,y:.078125},{x:.390625,y:.078125},{x:.390625,y:.078125},{x:.421875,y:.078125},{x:.421875,y:.078125},{x:.453125,y:.078125},{x:.453125,y:.078125},{x:.484375,y:.078125},{x:.484375,y:.078125},{x:.515625,y:.078125},{x:.515625,y:.078125},{x:.546875,y:.078125},{x:.546875,y:.078125},{x:.578125,y:.078125},{x:.578125,y:.078125},{x:.609375,y:.078125},{x:.609375,y:.078125},{x:.640625,y:.078125},{x:.640625,y:.078125},{x:.671875,y:.078125},{x:.671875,y:.078125},{x:.703125,y:.078125},{x:.703125,y:.078125},{x:.734375,y:.078125},{x:.734375,y:.078125},{x:.765625,y:.078125},{x:.765625,y:.078125},{x:.796875,y:.078125},{x:.796875,y:.078125},{x:.828125,y:.078125},{x:.828125,y:.078125},{x:.859375,y:.078125},{x:.859375,y:.078125},{x:.890625,y:.078125},{x:.890625,y:.078125},{x:.921875,y:.078125},{x:.921875,y:.078125},{x:.953125,y:.078125},{x:.953125,y:.078125},{x:.984375,y:.078125},{x:.984375,y:.078125},{x:.015625,y:.109375},{x:.015625,y:.109375},{x:.046875,y:.109375},{x:.046875,y:.109375},{x:.078125,y:.109375},{x:.078125,y:.109375},{x:.109375,y:.109375},{x:.109375,y:.109375},{x:.140625,y:.109375},{x:.140625,y:.109375},{x:.171875,y:.109375},{x:.171875,y:.109375},{x:.203125,y:.109375},{x:.203125,y:.109375},{x:.234375,y:.109375},{x:.234375,y:.109375},{x:.265625,y:.109375},{x:.265625,y:.109375},{x:.296875,y:.109375},{x:.296875,y:.109375},{x:.328125,y:.109375},{x:.328125,y:.109375},{x:.359375,y:.109375},{x:.359375,y:.109375},{x:.390625,y:.109375},{x:.390625,y:.109375},{x:.421875,y:.109375},{x:.421875,y:.109375},{x:.453125,y:.109375},{x:.453125,y:.109375},{x:.484375,y:.109375},{x:.484375,y:.109375},{x:.515625,y:.109375},{x:.515625,y:.109375},{x:.546875,y:.109375},{x:.546875,y:.109375},{x:.578125,y:.109375},{x:.578125,y:.109375},{x:.609375,y:.109375},{x:.609375,y:.109375},{x:.640625,y:.109375},{x:.640625,y:.109375},{x:.671875,y:.109375},{x:.671875,y:.109375},{x:.703125,y:.109375},{x:.703125,y:.109375},{x:.734375,y:.109375},{x:.734375,y:.109375},{x:.765625,y:.109375},{x:.765625,y:.109375},{x:.796875,y:.109375},{x:.796875,y:.109375},{x:.828125,y:.109375},{x:.828125,y:.109375},{x:.859375,y:.109375},{x:.859375,y:.109375},{x:.890625,y:.109375},{x:.890625,y:.109375},{x:.921875,y:.109375},{x:.921875,y:.109375},{x:.953125,y:.109375},{x:.953125,y:.109375},{x:.984375,y:.109375},{x:.984375,y:.109375},{x:.015625,y:.140625},{x:.015625,y:.140625},{x:.046875,y:.140625},{x:.046875,y:.140625},{x:.078125,y:.140625},{x:.078125,y:.140625},{x:.109375,y:.140625},{x:.109375,y:.140625},{x:.140625,y:.140625},{x:.140625,y:.140625},{x:.171875,y:.140625},{x:.171875,y:.140625},{x:.203125,y:.140625},{x:.203125,y:.140625},{x:.234375,y:.140625},{x:.234375,y:.140625},{x:.265625,y:.140625},{x:.265625,y:.140625},{x:.296875,y:.140625},{x:.296875,y:.140625},{x:.328125,y:.140625},{x:.328125,y:.140625},{x:.359375,y:.140625},{x:.359375,y:.140625},{x:.390625,y:.140625},{x:.390625,y:.140625},{x:.421875,y:.140625},{x:.421875,y:.140625},{x:.453125,y:.140625},{x:.453125,y:.140625},{x:.484375,y:.140625},{x:.484375,y:.140625},{x:.515625,y:.140625},{x:.515625,y:.140625},{x:.546875,y:.140625},{x:.546875,y:.140625},{x:.578125,y:.140625},{x:.578125,y:.140625},{x:.609375,y:.140625},{x:.609375,y:.140625},{x:.640625,y:.140625},{x:.640625,y:.140625},{x:.671875,y:.140625},{x:.671875,y:.140625},{x:.703125,y:.140625},{x:.703125,y:.140625},{x:.734375,y:.140625},{x:.734375,y:.140625},{x:.765625,y:.140625},{x:.765625,y:.140625},{x:.796875,y:.140625},{x:.796875,y:.140625},{x:.828125,y:.140625},{x:.828125,y:.140625},{x:.859375,y:.140625},{x:.859375,y:.140625},{x:.890625,y:.140625},{x:.890625,y:.140625},{x:.921875,y:.140625},{x:.921875,y:.140625},{x:.953125,y:.140625},{x:.953125,y:.140625},{x:.984375,y:.140625},{x:.984375,y:.140625},{x:.015625,y:.171875},{x:.015625,y:.171875},{x:.046875,y:.171875},{x:.046875,y:.171875},{x:.078125,y:.171875},{x:.078125,y:.171875},{x:.109375,y:.171875},{x:.109375,y:.171875},{x:.140625,y:.171875},{x:.140625,y:.171875},{x:.171875,y:.171875},{x:.171875,y:.171875},{x:.203125,y:.171875},{x:.203125,y:.171875},{x:.234375,y:.171875},{x:.234375,y:.171875},{x:.265625,y:.171875},{x:.265625,y:.171875},{x:.296875,y:.171875},{x:.296875,y:.171875},{x:.328125,y:.171875},{x:.328125,y:.171875},{x:.359375,y:.171875},{x:.359375,y:.171875},{x:.390625,y:.171875},{x:.390625,y:.171875},{x:.421875,y:.171875},{x:.421875,y:.171875},{x:.453125,y:.171875},{x:.453125,y:.171875},{x:.484375,y:.171875},{x:.484375,y:.171875},{x:.515625,y:.171875},{x:.515625,y:.171875},{x:.546875,y:.171875},{x:.546875,y:.171875},{x:.578125,y:.171875},{x:.578125,y:.171875},{x:.609375,y:.171875},{x:.609375,y:.171875},{x:.640625,y:.171875},{x:.640625,y:.171875},{x:.671875,y:.171875},{x:.671875,y:.171875},{x:.703125,y:.171875},{x:.703125,y:.171875},{x:.734375,y:.171875},{x:.734375,y:.171875},{x:.765625,y:.171875},{x:.765625,y:.171875},{x:.796875,y:.171875},{x:.796875,y:.171875},{x:.828125,y:.171875},{x:.828125,y:.171875},{x:.859375,y:.171875},{x:.859375,y:.171875},{x:.890625,y:.171875},{x:.890625,y:.171875},{x:.921875,y:.171875},{x:.921875,y:.171875},{x:.953125,y:.171875},{x:.953125,y:.171875},{x:.984375,y:.171875},{x:.984375,y:.171875},{x:.015625,y:.203125},{x:.015625,y:.203125},{x:.046875,y:.203125},{x:.046875,y:.203125},{x:.078125,y:.203125},{x:.078125,y:.203125},{x:.109375,y:.203125},{x:.109375,y:.203125},{x:.140625,y:.203125},{x:.140625,y:.203125},{x:.171875,y:.203125},{x:.171875,y:.203125},{x:.203125,y:.203125},{x:.203125,y:.203125},{x:.234375,y:.203125},{x:.234375,y:.203125},{x:.265625,y:.203125},{x:.265625,y:.203125},{x:.296875,y:.203125},{x:.296875,y:.203125},{x:.328125,y:.203125},{x:.328125,y:.203125},{x:.359375,y:.203125},{x:.359375,y:.203125},{x:.390625,y:.203125},{x:.390625,y:.203125},{x:.421875,y:.203125},{x:.421875,y:.203125},{x:.453125,y:.203125},{x:.453125,y:.203125},{x:.484375,y:.203125},{x:.484375,y:.203125},{x:.515625,y:.203125},{x:.515625,y:.203125},{x:.546875,y:.203125},{x:.546875,y:.203125},{x:.578125,y:.203125},{x:.578125,y:.203125},{x:.609375,y:.203125},{x:.609375,y:.203125},{x:.640625,y:.203125},{x:.640625,y:.203125},{x:.671875,y:.203125},{x:.671875,y:.203125},{x:.703125,y:.203125},{x:.703125,y:.203125},{x:.734375,y:.203125},{x:.734375,y:.203125},{x:.765625,y:.203125},{x:.765625,y:.203125},{x:.796875,y:.203125},{x:.796875,y:.203125},{x:.828125,y:.203125},{x:.828125,y:.203125},{x:.859375,y:.203125},{x:.859375,y:.203125},{x:.890625,y:.203125},{x:.890625,y:.203125},{x:.921875,y:.203125},{x:.921875,y:.203125},{x:.953125,y:.203125},{x:.953125,y:.203125},{x:.984375,y:.203125},{x:.984375,y:.203125},{x:.015625,y:.234375},{x:.015625,y:.234375},{x:.046875,y:.234375},{x:.046875,y:.234375},{x:.078125,y:.234375},{x:.078125,y:.234375},{x:.109375,y:.234375},{x:.109375,y:.234375},{x:.140625,y:.234375},{x:.140625,y:.234375},{x:.171875,y:.234375},{x:.171875,y:.234375},{x:.203125,y:.234375},{x:.203125,y:.234375},{x:.234375,y:.234375},{x:.234375,y:.234375},{x:.265625,y:.234375},{x:.265625,y:.234375},{x:.296875,y:.234375},{x:.296875,y:.234375},{x:.328125,y:.234375},{x:.328125,y:.234375},{x:.359375,y:.234375},{x:.359375,y:.234375},{x:.390625,y:.234375},{x:.390625,y:.234375},{x:.421875,y:.234375},{x:.421875,y:.234375},{x:.453125,y:.234375},{x:.453125,y:.234375},{x:.484375,y:.234375},{x:.484375,y:.234375},{x:.515625,y:.234375},{x:.515625,y:.234375},{x:.546875,y:.234375},{x:.546875,y:.234375},{x:.578125,y:.234375},{x:.578125,y:.234375},{x:.609375,y:.234375},{x:.609375,y:.234375},{x:.640625,y:.234375},{x:.640625,y:.234375},{x:.671875,y:.234375},{x:.671875,y:.234375},{x:.703125,y:.234375},{x:.703125,y:.234375},{x:.734375,y:.234375},{x:.734375,y:.234375},{x:.765625,y:.234375},{x:.765625,y:.234375},{x:.796875,y:.234375},{x:.796875,y:.234375},{x:.828125,y:.234375},{x:.828125,y:.234375},{x:.859375,y:.234375},{x:.859375,y:.234375},{x:.890625,y:.234375},{x:.890625,y:.234375},{x:.921875,y:.234375},{x:.921875,y:.234375},{x:.953125,y:.234375},{x:.953125,y:.234375},{x:.984375,y:.234375},{x:.984375,y:.234375},{x:.015625,y:.265625},{x:.015625,y:.265625},{x:.046875,y:.265625},{x:.046875,y:.265625},{x:.078125,y:.265625},{x:.078125,y:.265625},{x:.109375,y:.265625},{x:.109375,y:.265625},{x:.140625,y:.265625},{x:.140625,y:.265625},{x:.171875,y:.265625},{x:.171875,y:.265625},{x:.203125,y:.265625},{x:.203125,y:.265625},{x:.234375,y:.265625},{x:.234375,y:.265625},{x:.265625,y:.265625},{x:.265625,y:.265625},{x:.296875,y:.265625},{x:.296875,y:.265625},{x:.328125,y:.265625},{x:.328125,y:.265625},{x:.359375,y:.265625},{x:.359375,y:.265625},{x:.390625,y:.265625},{x:.390625,y:.265625},{x:.421875,y:.265625},{x:.421875,y:.265625},{x:.453125,y:.265625},{x:.453125,y:.265625},{x:.484375,y:.265625},{x:.484375,y:.265625},{x:.515625,y:.265625},{x:.515625,y:.265625},{x:.546875,y:.265625},{x:.546875,y:.265625},{x:.578125,y:.265625},{x:.578125,y:.265625},{x:.609375,y:.265625},{x:.609375,y:.265625},{x:.640625,y:.265625},{x:.640625,y:.265625},{x:.671875,y:.265625},{x:.671875,y:.265625},{x:.703125,y:.265625},{x:.703125,y:.265625},{x:.734375,y:.265625},{x:.734375,y:.265625},{x:.765625,y:.265625},{x:.765625,y:.265625},{x:.796875,y:.265625},{x:.796875,y:.265625},{x:.828125,y:.265625},{x:.828125,y:.265625},{x:.859375,y:.265625},{x:.859375,y:.265625},{x:.890625,y:.265625},{x:.890625,y:.265625},{x:.921875,y:.265625},{x:.921875,y:.265625},{x:.953125,y:.265625},{x:.953125,y:.265625},{x:.984375,y:.265625},{x:.984375,y:.265625},{x:.015625,y:.296875},{x:.015625,y:.296875},{x:.046875,y:.296875},{x:.046875,y:.296875},{x:.078125,y:.296875},{x:.078125,y:.296875},{x:.109375,y:.296875},{x:.109375,y:.296875},{x:.140625,y:.296875},{x:.140625,y:.296875},{x:.171875,y:.296875},{x:.171875,y:.296875},{x:.203125,y:.296875},{x:.203125,y:.296875},{x:.234375,y:.296875},{x:.234375,y:.296875},{x:.265625,y:.296875},{x:.265625,y:.296875},{x:.296875,y:.296875},{x:.296875,y:.296875},{x:.328125,y:.296875},{x:.328125,y:.296875},{x:.359375,y:.296875},{x:.359375,y:.296875},{x:.390625,y:.296875},{x:.390625,y:.296875},{x:.421875,y:.296875},{x:.421875,y:.296875},{x:.453125,y:.296875},{x:.453125,y:.296875},{x:.484375,y:.296875},{x:.484375,y:.296875},{x:.515625,y:.296875},{x:.515625,y:.296875},{x:.546875,y:.296875},{x:.546875,y:.296875},{x:.578125,y:.296875},{x:.578125,y:.296875},{x:.609375,y:.296875},{x:.609375,y:.296875},{x:.640625,y:.296875},{x:.640625,y:.296875},{x:.671875,y:.296875},{x:.671875,y:.296875},{x:.703125,y:.296875},{x:.703125,y:.296875},{x:.734375,y:.296875},{x:.734375,y:.296875},{x:.765625,y:.296875},{x:.765625,y:.296875},{x:.796875,y:.296875},{x:.796875,y:.296875},{x:.828125,y:.296875},{x:.828125,y:.296875},{x:.859375,y:.296875},{x:.859375,y:.296875},{x:.890625,y:.296875},{x:.890625,y:.296875},{x:.921875,y:.296875},{x:.921875,y:.296875},{x:.953125,y:.296875},{x:.953125,y:.296875},{x:.984375,y:.296875},{x:.984375,y:.296875},{x:.015625,y:.328125},{x:.015625,y:.328125},{x:.046875,y:.328125},{x:.046875,y:.328125},{x:.078125,y:.328125},{x:.078125,y:.328125},{x:.109375,y:.328125},{x:.109375,y:.328125},{x:.140625,y:.328125},{x:.140625,y:.328125},{x:.171875,y:.328125},{x:.171875,y:.328125},{x:.203125,y:.328125},{x:.203125,y:.328125},{x:.234375,y:.328125},{x:.234375,y:.328125},{x:.265625,y:.328125},{x:.265625,y:.328125},{x:.296875,y:.328125},{x:.296875,y:.328125},{x:.328125,y:.328125},{x:.328125,y:.328125},{x:.359375,y:.328125},{x:.359375,y:.328125},{x:.390625,y:.328125},{x:.390625,y:.328125},{x:.421875,y:.328125},{x:.421875,y:.328125},{x:.453125,y:.328125},{x:.453125,y:.328125},{x:.484375,y:.328125},{x:.484375,y:.328125},{x:.515625,y:.328125},{x:.515625,y:.328125},{x:.546875,y:.328125},{x:.546875,y:.328125},{x:.578125,y:.328125},{x:.578125,y:.328125},{x:.609375,y:.328125},{x:.609375,y:.328125},{x:.640625,y:.328125},{x:.640625,y:.328125},{x:.671875,y:.328125},{x:.671875,y:.328125},{x:.703125,y:.328125},{x:.703125,y:.328125},{x:.734375,y:.328125},{x:.734375,y:.328125},{x:.765625,y:.328125},{x:.765625,y:.328125},{x:.796875,y:.328125},{x:.796875,y:.328125},{x:.828125,y:.328125},{x:.828125,y:.328125},{x:.859375,y:.328125},{x:.859375,y:.328125},{x:.890625,y:.328125},{x:.890625,y:.328125},{x:.921875,y:.328125},{x:.921875,y:.328125},{x:.953125,y:.328125},{x:.953125,y:.328125},{x:.984375,y:.328125},{x:.984375,y:.328125},{x:.015625,y:.359375},{x:.015625,y:.359375},{x:.046875,y:.359375},{x:.046875,y:.359375},{x:.078125,y:.359375},{x:.078125,y:.359375},{x:.109375,y:.359375},{x:.109375,y:.359375},{x:.140625,y:.359375},{x:.140625,y:.359375},{x:.171875,y:.359375},{x:.171875,y:.359375},{x:.203125,y:.359375},{x:.203125,y:.359375},{x:.234375,y:.359375},{x:.234375,y:.359375},{x:.265625,y:.359375},{x:.265625,y:.359375},{x:.296875,y:.359375},{x:.296875,y:.359375},{x:.328125,y:.359375},{x:.328125,y:.359375},{x:.359375,y:.359375},{x:.359375,y:.359375},{x:.390625,y:.359375},{x:.390625,y:.359375},{x:.421875,y:.359375},{x:.421875,y:.359375},{x:.453125,y:.359375},{x:.453125,y:.359375},{x:.484375,y:.359375},{x:.484375,y:.359375},{x:.515625,y:.359375},{x:.515625,y:.359375},{x:.546875,y:.359375},{x:.546875,y:.359375},{x:.578125,y:.359375},{x:.578125,y:.359375},{x:.609375,y:.359375},{x:.609375,y:.359375},{x:.640625,y:.359375},{x:.640625,y:.359375},{x:.671875,y:.359375},{x:.671875,y:.359375},{x:.703125,y:.359375},{x:.703125,y:.359375},{x:.734375,y:.359375},{x:.734375,y:.359375},{x:.765625,y:.359375},{x:.765625,y:.359375},{x:.796875,y:.359375},{x:.796875,y:.359375},{x:.828125,y:.359375},{x:.828125,y:.359375},{x:.859375,y:.359375},{x:.859375,y:.359375},{x:.890625,y:.359375},{x:.890625,y:.359375},{x:.921875,y:.359375},{x:.921875,y:.359375},{x:.953125,y:.359375},{x:.953125,y:.359375},{x:.984375,y:.359375},{x:.984375,y:.359375},{x:.015625,y:.390625},{x:.015625,y:.390625},{x:.046875,y:.390625},{x:.046875,y:.390625},{x:.078125,y:.390625},{x:.078125,y:.390625},{x:.109375,y:.390625},{x:.109375,y:.390625},{x:.140625,y:.390625},{x:.140625,y:.390625},{x:.171875,y:.390625},{x:.171875,y:.390625},{x:.203125,y:.390625},{x:.203125,y:.390625},{x:.234375,y:.390625},{x:.234375,y:.390625},{x:.265625,y:.390625},{x:.265625,y:.390625},{x:.296875,y:.390625},{x:.296875,y:.390625},{x:.328125,y:.390625},{x:.328125,y:.390625},{x:.359375,y:.390625},{x:.359375,y:.390625},{x:.390625,y:.390625},{x:.390625,y:.390625},{x:.421875,y:.390625},{x:.421875,y:.390625},{x:.453125,y:.390625},{x:.453125,y:.390625},{x:.484375,y:.390625},{x:.484375,y:.390625},{x:.515625,y:.390625},{x:.515625,y:.390625},{x:.546875,y:.390625},{x:.546875,y:.390625},{x:.578125,y:.390625},{x:.578125,y:.390625},{x:.609375,y:.390625},{x:.609375,y:.390625},{x:.640625,y:.390625},{x:.640625,y:.390625},{x:.671875,y:.390625},{x:.671875,y:.390625},{x:.703125,y:.390625},{x:.703125,y:.390625},{x:.734375,y:.390625},{x:.734375,y:.390625},{x:.765625,y:.390625},{x:.765625,y:.390625},{x:.796875,y:.390625},{x:.796875,y:.390625},{x:.828125,y:.390625},{x:.828125,y:.390625},{x:.859375,y:.390625},{x:.859375,y:.390625},{x:.890625,y:.390625},{x:.890625,y:.390625},{x:.921875,y:.390625},{x:.921875,y:.390625},{x:.953125,y:.390625},{x:.953125,y:.390625},{x:.984375,y:.390625},{x:.984375,y:.390625},{x:.015625,y:.421875},{x:.015625,y:.421875},{x:.046875,y:.421875},{x:.046875,y:.421875},{x:.078125,y:.421875},{x:.078125,y:.421875},{x:.109375,y:.421875},{x:.109375,y:.421875},{x:.140625,y:.421875},{x:.140625,y:.421875},{x:.171875,y:.421875},{x:.171875,y:.421875},{x:.203125,y:.421875},{x:.203125,y:.421875},{x:.234375,y:.421875},{x:.234375,y:.421875},{x:.265625,y:.421875},{x:.265625,y:.421875},{x:.296875,y:.421875},{x:.296875,y:.421875},{x:.328125,y:.421875},{x:.328125,y:.421875},{x:.359375,y:.421875},{x:.359375,y:.421875},{x:.390625,y:.421875},{x:.390625,y:.421875},{x:.421875,y:.421875},{x:.421875,y:.421875},{x:.453125,y:.421875},{x:.453125,y:.421875},{x:.484375,y:.421875},{x:.484375,y:.421875},{x:.515625,y:.421875},{x:.515625,y:.421875},{x:.546875,y:.421875},{x:.546875,y:.421875},{x:.578125,y:.421875},{x:.578125,y:.421875},{x:.609375,y:.421875},{x:.609375,y:.421875},{x:.640625,y:.421875},{x:.640625,y:.421875},{x:.671875,y:.421875},{x:.671875,y:.421875},{x:.703125,y:.421875},{x:.703125,y:.421875},{x:.734375,y:.421875},{x:.734375,y:.421875},{x:.765625,y:.421875},{x:.765625,y:.421875},{x:.796875,y:.421875},{x:.796875,y:.421875},{x:.828125,y:.421875},{x:.828125,y:.421875},{x:.859375,y:.421875},{x:.859375,y:.421875},{x:.890625,y:.421875},{x:.890625,y:.421875},{x:.921875,y:.421875},{x:.921875,y:.421875},{x:.953125,y:.421875},{x:.953125,y:.421875},{x:.984375,y:.421875},{x:.984375,y:.421875},{x:.015625,y:.453125},{x:.015625,y:.453125},{x:.046875,y:.453125},{x:.046875,y:.453125},{x:.078125,y:.453125},{x:.078125,y:.453125},{x:.109375,y:.453125},{x:.109375,y:.453125},{x:.140625,y:.453125},{x:.140625,y:.453125},{x:.171875,y:.453125},{x:.171875,y:.453125},{x:.203125,y:.453125},{x:.203125,y:.453125},{x:.234375,y:.453125},{x:.234375,y:.453125},{x:.265625,y:.453125},{x:.265625,y:.453125},{x:.296875,y:.453125},{x:.296875,y:.453125},{x:.328125,y:.453125},{x:.328125,y:.453125},{x:.359375,y:.453125},{x:.359375,y:.453125},{x:.390625,y:.453125},{x:.390625,y:.453125},{x:.421875,y:.453125},{x:.421875,y:.453125},{x:.453125,y:.453125},{x:.453125,y:.453125},{x:.484375,y:.453125},{x:.484375,y:.453125},{x:.515625,y:.453125},{x:.515625,y:.453125},{x:.546875,y:.453125},{x:.546875,y:.453125},{x:.578125,y:.453125},{x:.578125,y:.453125},{x:.609375,y:.453125},{x:.609375,y:.453125},{x:.640625,y:.453125},{x:.640625,y:.453125},{x:.671875,y:.453125},{x:.671875,y:.453125},{x:.703125,y:.453125},{x:.703125,y:.453125},{x:.734375,y:.453125},{x:.734375,y:.453125},{x:.765625,y:.453125},{x:.765625,y:.453125},{x:.796875,y:.453125},{x:.796875,y:.453125},{x:.828125,y:.453125},{x:.828125,y:.453125},{x:.859375,y:.453125},{x:.859375,y:.453125},{x:.890625,y:.453125},{x:.890625,y:.453125},{x:.921875,y:.453125},{x:.921875,y:.453125},{x:.953125,y:.453125},{x:.953125,y:.453125},{x:.984375,y:.453125},{x:.984375,y:.453125},{x:.015625,y:.484375},{x:.015625,y:.484375},{x:.046875,y:.484375},{x:.046875,y:.484375},{x:.078125,y:.484375},{x:.078125,y:.484375},{x:.109375,y:.484375},{x:.109375,y:.484375},{x:.140625,y:.484375},{x:.140625,y:.484375},{x:.171875,y:.484375},{x:.171875,y:.484375},{x:.203125,y:.484375},{x:.203125,y:.484375},{x:.234375,y:.484375},{x:.234375,y:.484375},{x:.265625,y:.484375},{x:.265625,y:.484375},{x:.296875,y:.484375},{x:.296875,y:.484375},{x:.328125,y:.484375},{x:.328125,y:.484375},{x:.359375,y:.484375},{x:.359375,y:.484375},{x:.390625,y:.484375},{x:.390625,y:.484375},{x:.421875,y:.484375},{x:.421875,y:.484375},{x:.453125,y:.484375},{x:.453125,y:.484375},{x:.484375,y:.484375},{x:.484375,y:.484375},{x:.515625,y:.484375},{x:.515625,y:.484375},{x:.546875,y:.484375},{x:.546875,y:.484375},{x:.578125,y:.484375},{x:.578125,y:.484375},{x:.609375,y:.484375},{x:.609375,y:.484375},{x:.640625,y:.484375},{x:.640625,y:.484375},{x:.671875,y:.484375},{x:.671875,y:.484375},{x:.703125,y:.484375},{x:.703125,y:.484375},{x:.734375,y:.484375},{x:.734375,y:.484375},{x:.765625,y:.484375},{x:.765625,y:.484375},{x:.796875,y:.484375},{x:.796875,y:.484375},{x:.828125,y:.484375},{x:.828125,y:.484375},{x:.859375,y:.484375},{x:.859375,y:.484375},{x:.890625,y:.484375},{x:.890625,y:.484375},{x:.921875,y:.484375},{x:.921875,y:.484375},{x:.953125,y:.484375},{x:.953125,y:.484375},{x:.984375,y:.484375},{x:.984375,y:.484375},{x:.015625,y:.515625},{x:.015625,y:.515625},{x:.046875,y:.515625},{x:.046875,y:.515625},{x:.078125,y:.515625},{x:.078125,y:.515625},{x:.109375,y:.515625},{x:.109375,y:.515625},{x:.140625,y:.515625},{x:.140625,y:.515625},{x:.171875,y:.515625},{x:.171875,y:.515625},{x:.203125,y:.515625},{x:.203125,y:.515625},{x:.234375,y:.515625},{x:.234375,y:.515625},{x:.265625,y:.515625},{x:.265625,y:.515625},{x:.296875,y:.515625},{x:.296875,y:.515625},{x:.328125,y:.515625},{x:.328125,y:.515625},{x:.359375,y:.515625},{x:.359375,y:.515625},{x:.390625,y:.515625},{x:.390625,y:.515625},{x:.421875,y:.515625},{x:.421875,y:.515625},{x:.453125,y:.515625},{x:.453125,y:.515625},{x:.484375,y:.515625},{x:.484375,y:.515625},{x:.515625,y:.515625},{x:.515625,y:.515625},{x:.546875,y:.515625},{x:.546875,y:.515625},{x:.578125,y:.515625},{x:.578125,y:.515625},{x:.609375,y:.515625},{x:.609375,y:.515625},{x:.640625,y:.515625},{x:.640625,y:.515625},{x:.671875,y:.515625},{x:.671875,y:.515625},{x:.703125,y:.515625},{x:.703125,y:.515625},{x:.734375,y:.515625},{x:.734375,y:.515625},{x:.765625,y:.515625},{x:.765625,y:.515625},{x:.796875,y:.515625},{x:.796875,y:.515625},{x:.828125,y:.515625},{x:.828125,y:.515625},{x:.859375,y:.515625},{x:.859375,y:.515625},{x:.890625,y:.515625},{x:.890625,y:.515625},{x:.921875,y:.515625},{x:.921875,y:.515625},{x:.953125,y:.515625},{x:.953125,y:.515625},{x:.984375,y:.515625},{x:.984375,y:.515625},{x:.015625,y:.546875},{x:.015625,y:.546875},{x:.046875,y:.546875},{x:.046875,y:.546875},{x:.078125,y:.546875},{x:.078125,y:.546875},{x:.109375,y:.546875},{x:.109375,y:.546875},{x:.140625,y:.546875},{x:.140625,y:.546875},{x:.171875,y:.546875},{x:.171875,y:.546875},{x:.203125,y:.546875},{x:.203125,y:.546875},{x:.234375,y:.546875},{x:.234375,y:.546875},{x:.265625,y:.546875},{x:.265625,y:.546875},{x:.296875,y:.546875},{x:.296875,y:.546875},{x:.328125,y:.546875},{x:.328125,y:.546875},{x:.359375,y:.546875},{x:.359375,y:.546875},{x:.390625,y:.546875},{x:.390625,y:.546875},{x:.421875,y:.546875},{x:.421875,y:.546875},{x:.453125,y:.546875},{x:.453125,y:.546875},{x:.484375,y:.546875},{x:.484375,y:.546875},{x:.515625,y:.546875},{x:.515625,y:.546875},{x:.546875,y:.546875},{x:.546875,y:.546875},{x:.578125,y:.546875},{x:.578125,y:.546875},{x:.609375,y:.546875},{x:.609375,y:.546875},{x:.640625,y:.546875},{x:.640625,y:.546875},{x:.671875,y:.546875},{x:.671875,y:.546875},{x:.703125,y:.546875},{x:.703125,y:.546875},{x:.734375,y:.546875},{x:.734375,y:.546875},{x:.765625,y:.546875},{x:.765625,y:.546875},{x:.796875,y:.546875},{x:.796875,y:.546875},{x:.828125,y:.546875},{x:.828125,y:.546875},{x:.859375,y:.546875},{x:.859375,y:.546875},{x:.890625,y:.546875},{x:.890625,y:.546875},{x:.921875,y:.546875},{x:.921875,y:.546875},{x:.953125,y:.546875},{x:.953125,y:.546875},{x:.984375,y:.546875},{x:.984375,y:.546875},{x:.015625,y:.578125},{x:.015625,y:.578125},{x:.046875,y:.578125},{x:.046875,y:.578125},{x:.078125,y:.578125},{x:.078125,y:.578125},{x:.109375,y:.578125},{x:.109375,y:.578125},{x:.140625,y:.578125},{x:.140625,y:.578125},{x:.171875,y:.578125},{x:.171875,y:.578125},{x:.203125,y:.578125},{x:.203125,y:.578125},{x:.234375,y:.578125},{x:.234375,y:.578125},{x:.265625,y:.578125},{x:.265625,y:.578125},{x:.296875,y:.578125},{x:.296875,y:.578125},{x:.328125,y:.578125},{x:.328125,y:.578125},{x:.359375,y:.578125},{x:.359375,y:.578125},{x:.390625,y:.578125},{x:.390625,y:.578125},{x:.421875,y:.578125},{x:.421875,y:.578125},{x:.453125,y:.578125},{x:.453125,y:.578125},{x:.484375,y:.578125},{x:.484375,y:.578125},{x:.515625,y:.578125},{x:.515625,y:.578125},{x:.546875,y:.578125},{x:.546875,y:.578125},{x:.578125,y:.578125},{x:.578125,y:.578125},{x:.609375,y:.578125},{x:.609375,y:.578125},{x:.640625,y:.578125},{x:.640625,y:.578125},{x:.671875,y:.578125},{x:.671875,y:.578125},{x:.703125,y:.578125},{x:.703125,y:.578125},{x:.734375,y:.578125},{x:.734375,y:.578125},{x:.765625,y:.578125},{x:.765625,y:.578125},{x:.796875,y:.578125},{x:.796875,y:.578125},{x:.828125,y:.578125},{x:.828125,y:.578125},{x:.859375,y:.578125},{x:.859375,y:.578125},{x:.890625,y:.578125},{x:.890625,y:.578125},{x:.921875,y:.578125},{x:.921875,y:.578125},{x:.953125,y:.578125},{x:.953125,y:.578125},{x:.984375,y:.578125},{x:.984375,y:.578125},{x:.015625,y:.609375},{x:.015625,y:.609375},{x:.046875,y:.609375},{x:.046875,y:.609375},{x:.078125,y:.609375},{x:.078125,y:.609375},{x:.109375,y:.609375},{x:.109375,y:.609375},{x:.140625,y:.609375},{x:.140625,y:.609375},{x:.171875,y:.609375},{x:.171875,y:.609375},{x:.203125,y:.609375},{x:.203125,y:.609375},{x:.234375,y:.609375},{x:.234375,y:.609375},{x:.265625,y:.609375},{x:.265625,y:.609375},{x:.296875,y:.609375},{x:.296875,y:.609375},{x:.328125,y:.609375},{x:.328125,y:.609375},{x:.359375,y:.609375},{x:.359375,y:.609375},{x:.390625,y:.609375},{x:.390625,y:.609375},{x:.421875,y:.609375},{x:.421875,y:.609375},{x:.453125,y:.609375},{x:.453125,y:.609375},{x:.484375,y:.609375},{x:.484375,y:.609375},{x:.515625,y:.609375},{x:.515625,y:.609375},{x:.546875,y:.609375},{x:.546875,y:.609375},{x:.578125,y:.609375},{x:.578125,y:.609375},{x:.609375,y:.609375},{x:.609375,y:.609375},{x:.640625,y:.609375},{x:.640625,y:.609375},{x:.671875,y:.609375},{x:.671875,y:.609375},{x:.703125,y:.609375},{x:.703125,y:.609375},{x:.734375,y:.609375},{x:.734375,y:.609375},{x:.765625,y:.609375},{x:.765625,y:.609375},{x:.796875,y:.609375},{x:.796875,y:.609375},{x:.828125,y:.609375},{x:.828125,y:.609375},{x:.859375,y:.609375},{x:.859375,y:.609375},{x:.890625,y:.609375},{x:.890625,y:.609375},{x:.921875,y:.609375},{x:.921875,y:.609375},{x:.953125,y:.609375},{x:.953125,y:.609375},{x:.984375,y:.609375},{x:.984375,y:.609375},{x:.015625,y:.640625},{x:.015625,y:.640625},{x:.046875,y:.640625},{x:.046875,y:.640625},{x:.078125,y:.640625},{x:.078125,y:.640625},{x:.109375,y:.640625},{x:.109375,y:.640625},{x:.140625,y:.640625},{x:.140625,y:.640625},{x:.171875,y:.640625},{x:.171875,y:.640625},{x:.203125,y:.640625},{x:.203125,y:.640625},{x:.234375,y:.640625},{x:.234375,y:.640625},{x:.265625,y:.640625},{x:.265625,y:.640625},{x:.296875,y:.640625},{x:.296875,y:.640625},{x:.328125,y:.640625},{x:.328125,y:.640625},{x:.359375,y:.640625},{x:.359375,y:.640625},{x:.390625,y:.640625},{x:.390625,y:.640625},{x:.421875,y:.640625},{x:.421875,y:.640625},{x:.453125,y:.640625},{x:.453125,y:.640625},{x:.484375,y:.640625},{x:.484375,y:.640625},{x:.515625,y:.640625},{x:.515625,y:.640625},{x:.546875,y:.640625},{x:.546875,y:.640625},{x:.578125,y:.640625},{x:.578125,y:.640625},{x:.609375,y:.640625},{x:.609375,y:.640625},{x:.640625,y:.640625},{x:.640625,y:.640625},{x:.671875,y:.640625},{x:.671875,y:.640625},{x:.703125,y:.640625},{x:.703125,y:.640625},{x:.734375,y:.640625},{x:.734375,y:.640625},{x:.765625,y:.640625},{x:.765625,y:.640625},{x:.796875,y:.640625},{x:.796875,y:.640625},{x:.828125,y:.640625},{x:.828125,y:.640625},{x:.859375,y:.640625},{x:.859375,y:.640625},{x:.890625,y:.640625},{x:.890625,y:.640625},{x:.921875,y:.640625},{x:.921875,y:.640625},{x:.953125,y:.640625},{x:.953125,y:.640625},{x:.984375,y:.640625},{x:.984375,y:.640625},{x:.015625,y:.671875},{x:.015625,y:.671875},{x:.046875,y:.671875},{x:.046875,y:.671875},{x:.078125,y:.671875},{x:.078125,y:.671875},{x:.109375,y:.671875},{x:.109375,y:.671875},{x:.140625,y:.671875},{x:.140625,y:.671875},{x:.171875,y:.671875},{x:.171875,y:.671875},{x:.203125,y:.671875},{x:.203125,y:.671875},{x:.234375,y:.671875},{x:.234375,y:.671875},{x:.265625,y:.671875},{x:.265625,y:.671875},{x:.296875,y:.671875},{x:.296875,y:.671875},{x:.328125,y:.671875},{x:.328125,y:.671875},{x:.359375,y:.671875},{x:.359375,y:.671875},{x:.390625,y:.671875},{x:.390625,y:.671875},{x:.421875,y:.671875},{x:.421875,y:.671875},{x:.453125,y:.671875},{x:.453125,y:.671875},{x:.484375,y:.671875},{x:.484375,y:.671875},{x:.515625,y:.671875},{x:.515625,y:.671875},{x:.546875,y:.671875},{x:.546875,y:.671875},{x:.578125,y:.671875},{x:.578125,y:.671875},{x:.609375,y:.671875},{x:.609375,y:.671875},{x:.640625,y:.671875},{x:.640625,y:.671875},{x:.671875,y:.671875},{x:.671875,y:.671875},{x:.703125,y:.671875},{x:.703125,y:.671875},{x:.734375,y:.671875},{x:.734375,y:.671875},{x:.765625,y:.671875},{x:.765625,y:.671875},{x:.796875,y:.671875},{x:.796875,y:.671875},{x:.828125,y:.671875},{x:.828125,y:.671875},{x:.859375,y:.671875},{x:.859375,y:.671875},{x:.890625,y:.671875},{x:.890625,y:.671875},{x:.921875,y:.671875},{x:.921875,y:.671875},{x:.953125,y:.671875},{x:.953125,y:.671875},{x:.984375,y:.671875},{x:.984375,y:.671875},{x:.015625,y:.703125},{x:.015625,y:.703125},{x:.046875,y:.703125},{x:.046875,y:.703125},{x:.078125,y:.703125},{x:.078125,y:.703125},{x:.109375,y:.703125},{x:.109375,y:.703125},{x:.140625,y:.703125},{x:.140625,y:.703125},{x:.171875,y:.703125},{x:.171875,y:.703125},{x:.203125,y:.703125},{x:.203125,y:.703125},{x:.234375,y:.703125},{x:.234375,y:.703125},{x:.265625,y:.703125},{x:.265625,y:.703125},{x:.296875,y:.703125},{x:.296875,y:.703125},{x:.328125,y:.703125},{x:.328125,y:.703125},{x:.359375,y:.703125},{x:.359375,y:.703125},{x:.390625,y:.703125},{x:.390625,y:.703125},{x:.421875,y:.703125},{x:.421875,y:.703125},{x:.453125,y:.703125},{x:.453125,y:.703125},{x:.484375,y:.703125},{x:.484375,y:.703125},{x:.515625,y:.703125},{x:.515625,y:.703125},{x:.546875,y:.703125},{x:.546875,y:.703125},{x:.578125,y:.703125},{x:.578125,y:.703125},{x:.609375,y:.703125},{x:.609375,y:.703125},{x:.640625,y:.703125},{x:.640625,y:.703125},{x:.671875,y:.703125},{x:.671875,y:.703125},{x:.703125,y:.703125},{x:.703125,y:.703125},{x:.734375,y:.703125},{x:.734375,y:.703125},{x:.765625,y:.703125},{x:.765625,y:.703125},{x:.796875,y:.703125},{x:.796875,y:.703125},{x:.828125,y:.703125},{x:.828125,y:.703125},{x:.859375,y:.703125},{x:.859375,y:.703125},{x:.890625,y:.703125},{x:.890625,y:.703125},{x:.921875,y:.703125},{x:.921875,y:.703125},{x:.953125,y:.703125},{x:.953125,y:.703125},{x:.984375,y:.703125},{x:.984375,y:.703125},{x:.015625,y:.734375},{x:.015625,y:.734375},{x:.046875,y:.734375},{x:.046875,y:.734375},{x:.078125,y:.734375},{x:.078125,y:.734375},{x:.109375,y:.734375},{x:.109375,y:.734375},{x:.140625,y:.734375},{x:.140625,y:.734375},{x:.171875,y:.734375},{x:.171875,y:.734375},{x:.203125,y:.734375},{x:.203125,y:.734375},{x:.234375,y:.734375},{x:.234375,y:.734375},{x:.265625,y:.734375},{x:.265625,y:.734375},{x:.296875,y:.734375},{x:.296875,y:.734375},{x:.328125,y:.734375},{x:.328125,y:.734375},{x:.359375,y:.734375},{x:.359375,y:.734375},{x:.390625,y:.734375},{x:.390625,y:.734375},{x:.421875,y:.734375},{x:.421875,y:.734375},{x:.453125,y:.734375},{x:.453125,y:.734375},{x:.484375,y:.734375},{x:.484375,y:.734375},{x:.515625,y:.734375},{x:.515625,y:.734375},{x:.546875,y:.734375},{x:.546875,y:.734375},{x:.578125,y:.734375},{x:.578125,y:.734375},{x:.609375,y:.734375},{x:.609375,y:.734375},{x:.640625,y:.734375},{x:.640625,y:.734375},{x:.671875,y:.734375},{x:.671875,y:.734375},{x:.703125,y:.734375},{x:.703125,y:.734375},{x:.734375,y:.734375},{x:.734375,y:.734375},{x:.765625,y:.734375},{x:.765625,y:.734375},{x:.796875,y:.734375},{x:.796875,y:.734375},{x:.828125,y:.734375},{x:.828125,y:.734375},{x:.859375,y:.734375},{x:.859375,y:.734375},{x:.890625,y:.734375},{x:.890625,y:.734375},{x:.921875,y:.734375},{x:.921875,y:.734375},{x:.953125,y:.734375},{x:.953125,y:.734375},{x:.984375,y:.734375},{x:.984375,y:.734375},{x:.015625,y:.765625},{x:.015625,y:.765625},{x:.046875,y:.765625},{x:.046875,y:.765625},{x:.078125,y:.765625},{x:.078125,y:.765625},{x:.109375,y:.765625},{x:.109375,y:.765625},{x:.140625,y:.765625},{x:.140625,y:.765625},{x:.171875,y:.765625},{x:.171875,y:.765625},{x:.203125,y:.765625},{x:.203125,y:.765625},{x:.234375,y:.765625},{x:.234375,y:.765625},{x:.265625,y:.765625},{x:.265625,y:.765625},{x:.296875,y:.765625},{x:.296875,y:.765625},{x:.328125,y:.765625},{x:.328125,y:.765625},{x:.359375,y:.765625},{x:.359375,y:.765625},{x:.390625,y:.765625},{x:.390625,y:.765625},{x:.421875,y:.765625},{x:.421875,y:.765625},{x:.453125,y:.765625},{x:.453125,y:.765625},{x:.484375,y:.765625},{x:.484375,y:.765625},{x:.515625,y:.765625},{x:.515625,y:.765625},{x:.546875,y:.765625},{x:.546875,y:.765625},{x:.578125,y:.765625},{x:.578125,y:.765625},{x:.609375,y:.765625},{x:.609375,y:.765625},{x:.640625,y:.765625},{x:.640625,y:.765625},{x:.671875,y:.765625},{x:.671875,y:.765625},{x:.703125,y:.765625},{x:.703125,y:.765625},{x:.734375,y:.765625},{x:.734375,y:.765625},{x:.765625,y:.765625},{x:.765625,y:.765625},{x:.796875,y:.765625},{x:.796875,y:.765625},{x:.828125,y:.765625},{x:.828125,y:.765625},{x:.859375,y:.765625},{x:.859375,y:.765625},{x:.890625,y:.765625},{x:.890625,y:.765625},{x:.921875,y:.765625},{x:.921875,y:.765625},{x:.953125,y:.765625},{x:.953125,y:.765625},{x:.984375,y:.765625},{x:.984375,y:.765625},{x:.015625,y:.796875},{x:.015625,y:.796875},{x:.046875,y:.796875},{x:.046875,y:.796875},{x:.078125,y:.796875},{x:.078125,y:.796875},{x:.109375,y:.796875},{x:.109375,y:.796875},{x:.140625,y:.796875},{x:.140625,y:.796875},{x:.171875,y:.796875},{x:.171875,y:.796875},{x:.203125,y:.796875},{x:.203125,y:.796875},{x:.234375,y:.796875},{x:.234375,y:.796875},{x:.265625,y:.796875},{x:.265625,y:.796875},{x:.296875,y:.796875},{x:.296875,y:.796875},{x:.328125,y:.796875},{x:.328125,y:.796875},{x:.359375,y:.796875},{x:.359375,y:.796875},{x:.390625,y:.796875},{x:.390625,y:.796875},{x:.421875,y:.796875},{x:.421875,y:.796875},{x:.453125,y:.796875},{x:.453125,y:.796875},{x:.484375,y:.796875},{x:.484375,y:.796875},{x:.515625,y:.796875},{x:.515625,y:.796875},{x:.546875,y:.796875},{x:.546875,y:.796875},{x:.578125,y:.796875},{x:.578125,y:.796875},{x:.609375,y:.796875},{x:.609375,y:.796875},{x:.640625,y:.796875},{x:.640625,y:.796875},{x:.671875,y:.796875},{x:.671875,y:.796875},{x:.703125,y:.796875},{x:.703125,y:.796875},{x:.734375,y:.796875},{x:.734375,y:.796875},{x:.765625,y:.796875},{x:.765625,y:.796875},{x:.796875,y:.796875},{x:.796875,y:.796875},{x:.828125,y:.796875},{x:.828125,y:.796875},{x:.859375,y:.796875},{x:.859375,y:.796875},{x:.890625,y:.796875},{x:.890625,y:.796875},{x:.921875,y:.796875},{x:.921875,y:.796875},{x:.953125,y:.796875},{x:.953125,y:.796875},{x:.984375,y:.796875},{x:.984375,y:.796875},{x:.015625,y:.828125},{x:.015625,y:.828125},{x:.046875,y:.828125},{x:.046875,y:.828125},{x:.078125,y:.828125},{x:.078125,y:.828125},{x:.109375,y:.828125},{x:.109375,y:.828125},{x:.140625,y:.828125},{x:.140625,y:.828125},{x:.171875,y:.828125},{x:.171875,y:.828125},{x:.203125,y:.828125},{x:.203125,y:.828125},{x:.234375,y:.828125},{x:.234375,y:.828125},{x:.265625,y:.828125},{x:.265625,y:.828125},{x:.296875,y:.828125},{x:.296875,y:.828125},{x:.328125,y:.828125},{x:.328125,y:.828125},{x:.359375,y:.828125},{x:.359375,y:.828125},{x:.390625,y:.828125},{x:.390625,y:.828125},{x:.421875,y:.828125},{x:.421875,y:.828125},{x:.453125,y:.828125},{x:.453125,y:.828125},{x:.484375,y:.828125},{x:.484375,y:.828125},{x:.515625,y:.828125},{x:.515625,y:.828125},{x:.546875,y:.828125},{x:.546875,y:.828125},{x:.578125,y:.828125},{x:.578125,y:.828125},{x:.609375,y:.828125},{x:.609375,y:.828125},{x:.640625,y:.828125},{x:.640625,y:.828125},{x:.671875,y:.828125},{x:.671875,y:.828125},{x:.703125,y:.828125},{x:.703125,y:.828125},{x:.734375,y:.828125},{x:.734375,y:.828125},{x:.765625,y:.828125},{x:.765625,y:.828125},{x:.796875,y:.828125},{x:.796875,y:.828125},{x:.828125,y:.828125},{x:.828125,y:.828125},{x:.859375,y:.828125},{x:.859375,y:.828125},{x:.890625,y:.828125},{x:.890625,y:.828125},{x:.921875,y:.828125},{x:.921875,y:.828125},{x:.953125,y:.828125},{x:.953125,y:.828125},{x:.984375,y:.828125},{x:.984375,y:.828125},{x:.015625,y:.859375},{x:.015625,y:.859375},{x:.046875,y:.859375},{x:.046875,y:.859375},{x:.078125,y:.859375},{x:.078125,y:.859375},{x:.109375,y:.859375},{x:.109375,y:.859375},{x:.140625,y:.859375},{x:.140625,y:.859375},{x:.171875,y:.859375},{x:.171875,y:.859375},{x:.203125,y:.859375},{x:.203125,y:.859375},{x:.234375,y:.859375},{x:.234375,y:.859375},{x:.265625,y:.859375},{x:.265625,y:.859375},{x:.296875,y:.859375},{x:.296875,y:.859375},{x:.328125,y:.859375},{x:.328125,y:.859375},{x:.359375,y:.859375},{x:.359375,y:.859375},{x:.390625,y:.859375},{x:.390625,y:.859375},{x:.421875,y:.859375},{x:.421875,y:.859375},{x:.453125,y:.859375},{x:.453125,y:.859375},{x:.484375,y:.859375},{x:.484375,y:.859375},{x:.515625,y:.859375},{x:.515625,y:.859375},{x:.546875,y:.859375},{x:.546875,y:.859375},{x:.578125,y:.859375},{x:.578125,y:.859375},{x:.609375,y:.859375},{x:.609375,y:.859375},{x:.640625,y:.859375},{x:.640625,y:.859375},{x:.671875,y:.859375},{x:.671875,y:.859375},{x:.703125,y:.859375},{x:.703125,y:.859375},{x:.734375,y:.859375},{x:.734375,y:.859375},{x:.765625,y:.859375},{x:.765625,y:.859375},{x:.796875,y:.859375},{x:.796875,y:.859375},{x:.828125,y:.859375},{x:.828125,y:.859375},{x:.859375,y:.859375},{x:.859375,y:.859375},{x:.890625,y:.859375},{x:.890625,y:.859375},{x:.921875,y:.859375},{x:.921875,y:.859375},{x:.953125,y:.859375},{x:.953125,y:.859375},{x:.984375,y:.859375},{x:.984375,y:.859375},{x:.015625,y:.890625},{x:.015625,y:.890625},{x:.046875,y:.890625},{x:.046875,y:.890625},{x:.078125,y:.890625},{x:.078125,y:.890625},{x:.109375,y:.890625},{x:.109375,y:.890625},{x:.140625,y:.890625},{x:.140625,y:.890625},{x:.171875,y:.890625},{x:.171875,y:.890625},{x:.203125,y:.890625},{x:.203125,y:.890625},{x:.234375,y:.890625},{x:.234375,y:.890625},{x:.265625,y:.890625},{x:.265625,y:.890625},{x:.296875,y:.890625},{x:.296875,y:.890625},{x:.328125,y:.890625},{x:.328125,y:.890625},{x:.359375,y:.890625},{x:.359375,y:.890625},{x:.390625,y:.890625},{x:.390625,y:.890625},{x:.421875,y:.890625},{x:.421875,y:.890625},{x:.453125,y:.890625},{x:.453125,y:.890625},{x:.484375,y:.890625},{x:.484375,y:.890625},{x:.515625,y:.890625},{x:.515625,y:.890625},{x:.546875,y:.890625},{x:.546875,y:.890625},{x:.578125,y:.890625},{x:.578125,y:.890625},{x:.609375,y:.890625},{x:.609375,y:.890625},{x:.640625,y:.890625},{x:.640625,y:.890625},{x:.671875,y:.890625},{x:.671875,y:.890625},{x:.703125,y:.890625},{x:.703125,y:.890625},{x:.734375,y:.890625},{x:.734375,y:.890625},{x:.765625,y:.890625},{x:.765625,y:.890625},{x:.796875,y:.890625},{x:.796875,y:.890625},{x:.828125,y:.890625},{x:.828125,y:.890625},{x:.859375,y:.890625},{x:.859375,y:.890625},{x:.890625,y:.890625},{x:.890625,y:.890625},{x:.921875,y:.890625},{x:.921875,y:.890625},{x:.953125,y:.890625},{x:.953125,y:.890625},{x:.984375,y:.890625},{x:.984375,y:.890625},{x:.015625,y:.921875},{x:.015625,y:.921875},{x:.046875,y:.921875},{x:.046875,y:.921875},{x:.078125,y:.921875},{x:.078125,y:.921875},{x:.109375,y:.921875},{x:.109375,y:.921875},{x:.140625,y:.921875},{x:.140625,y:.921875},{x:.171875,y:.921875},{x:.171875,y:.921875},{x:.203125,y:.921875},{x:.203125,y:.921875},{x:.234375,y:.921875},{x:.234375,y:.921875},{x:.265625,y:.921875},{x:.265625,y:.921875},{x:.296875,y:.921875},{x:.296875,y:.921875},{x:.328125,y:.921875},{x:.328125,y:.921875},{x:.359375,y:.921875},{x:.359375,y:.921875},{x:.390625,y:.921875},{x:.390625,y:.921875},{x:.421875,y:.921875},{x:.421875,y:.921875},{x:.453125,y:.921875},{x:.453125,y:.921875},{x:.484375,y:.921875},{x:.484375,y:.921875},{x:.515625,y:.921875},{x:.515625,y:.921875},{x:.546875,y:.921875},{x:.546875,y:.921875},{x:.578125,y:.921875},{x:.578125,y:.921875},{x:.609375,y:.921875},{x:.609375,y:.921875},{x:.640625,y:.921875},{x:.640625,y:.921875},{x:.671875,y:.921875},{x:.671875,y:.921875},{x:.703125,y:.921875},{x:.703125,y:.921875},{x:.734375,y:.921875},{x:.734375,y:.921875},{x:.765625,y:.921875},{x:.765625,y:.921875},{x:.796875,y:.921875},{x:.796875,y:.921875},{x:.828125,y:.921875},{x:.828125,y:.921875},{x:.859375,y:.921875},{x:.859375,y:.921875},{x:.890625,y:.921875},{x:.890625,y:.921875},{x:.921875,y:.921875},{x:.921875,y:.921875},{x:.953125,y:.921875},{x:.953125,y:.921875},{x:.984375,y:.921875},{x:.984375,y:.921875},{x:.015625,y:.953125},{x:.015625,y:.953125},{x:.046875,y:.953125},{x:.046875,y:.953125},{x:.078125,y:.953125},{x:.078125,y:.953125},{x:.109375,y:.953125},{x:.109375,y:.953125},{x:.140625,y:.953125},{x:.140625,y:.953125},{x:.171875,y:.953125},{x:.171875,y:.953125},{x:.203125,y:.953125},{x:.203125,y:.953125},{x:.234375,y:.953125},{x:.234375,y:.953125},{x:.265625,y:.953125},{x:.265625,y:.953125},{x:.296875,y:.953125},{x:.296875,y:.953125},{x:.328125,y:.953125},{x:.328125,y:.953125},{x:.359375,y:.953125},{x:.359375,y:.953125},{x:.390625,y:.953125},{x:.390625,y:.953125},{x:.421875,y:.953125},{x:.421875,y:.953125},{x:.453125,y:.953125},{x:.453125,y:.953125},{x:.484375,y:.953125},{x:.484375,y:.953125},{x:.515625,y:.953125},{x:.515625,y:.953125},{x:.546875,y:.953125},{x:.546875,y:.953125},{x:.578125,y:.953125},{x:.578125,y:.953125},{x:.609375,y:.953125},{x:.609375,y:.953125},{x:.640625,y:.953125},{x:.640625,y:.953125},{x:.671875,y:.953125},{x:.671875,y:.953125},{x:.703125,y:.953125},{x:.703125,y:.953125},{x:.734375,y:.953125},{x:.734375,y:.953125},{x:.765625,y:.953125},{x:.765625,y:.953125},{x:.796875,y:.953125},{x:.796875,y:.953125},{x:.828125,y:.953125},{x:.828125,y:.953125},{x:.859375,y:.953125},{x:.859375,y:.953125},{x:.890625,y:.953125},{x:.890625,y:.953125},{x:.921875,y:.953125},{x:.921875,y:.953125},{x:.953125,y:.953125},{x:.953125,y:.953125},{x:.984375,y:.953125},{x:.984375,y:.953125},{x:.015625,y:.984375},{x:.015625,y:.984375},{x:.046875,y:.984375},{x:.046875,y:.984375},{x:.078125,y:.984375},{x:.078125,y:.984375},{x:.109375,y:.984375},{x:.109375,y:.984375},{x:.140625,y:.984375},{x:.140625,y:.984375},{x:.171875,y:.984375},{x:.171875,y:.984375},{x:.203125,y:.984375},{x:.203125,y:.984375},{x:.234375,y:.984375},{x:.234375,y:.984375},{x:.265625,y:.984375},{x:.265625,y:.984375},{x:.296875,y:.984375},{x:.296875,y:.984375},{x:.328125,y:.984375},{x:.328125,y:.984375},{x:.359375,y:.984375},{x:.359375,y:.984375},{x:.390625,y:.984375},{x:.390625,y:.984375},{x:.421875,y:.984375},{x:.421875,y:.984375},{x:.453125,y:.984375},{x:.453125,y:.984375},{x:.484375,y:.984375},{x:.484375,y:.984375},{x:.515625,y:.984375},{x:.515625,y:.984375},{x:.546875,y:.984375},{x:.546875,y:.984375},{x:.578125,y:.984375},{x:.578125,y:.984375},{x:.609375,y:.984375},{x:.609375,y:.984375},{x:.640625,y:.984375},{x:.640625,y:.984375},{x:.671875,y:.984375},{x:.671875,y:.984375},{x:.703125,y:.984375},{x:.703125,y:.984375},{x:.734375,y:.984375},{x:.734375,y:.984375},{x:.765625,y:.984375},{x:.765625,y:.984375},{x:.796875,y:.984375},{x:.796875,y:.984375},{x:.828125,y:.984375},{x:.828125,y:.984375},{x:.859375,y:.984375},{x:.859375,y:.984375},{x:.890625,y:.984375},{x:.890625,y:.984375},{x:.921875,y:.984375},{x:.921875,y:.984375},{x:.953125,y:.984375},{x:.953125,y:.984375},{x:.984375,y:.984375},{x:.984375,y:.984375},{x:.03125,y:.03125},{x:.03125,y:.03125},{x:.09375,y:.03125},{x:.09375,y:.03125},{x:.15625,y:.03125},{x:.15625,y:.03125},{x:.21875,y:.03125},{x:.21875,y:.03125},{x:.28125,y:.03125},{x:.28125,y:.03125},{x:.34375,y:.03125},{x:.34375,y:.03125},{x:.40625,y:.03125},{x:.40625,y:.03125},{x:.46875,y:.03125},{x:.46875,y:.03125},{x:.53125,y:.03125},{x:.53125,y:.03125},{x:.59375,y:.03125},{x:.59375,y:.03125},{x:.65625,y:.03125},{x:.65625,y:.03125},{x:.71875,y:.03125},{x:.71875,y:.03125},{x:.78125,y:.03125},{x:.78125,y:.03125},{x:.84375,y:.03125},{x:.84375,y:.03125},{x:.90625,y:.03125},{x:.90625,y:.03125},{x:.96875,y:.03125},{x:.96875,y:.03125},{x:.03125,y:.09375},{x:.03125,y:.09375},{x:.09375,y:.09375},{x:.09375,y:.09375},{x:.15625,y:.09375},{x:.15625,y:.09375},{x:.21875,y:.09375},{x:.21875,y:.09375},{x:.28125,y:.09375},{x:.28125,y:.09375},{x:.34375,y:.09375},{x:.34375,y:.09375},{x:.40625,y:.09375},{x:.40625,y:.09375},{x:.46875,y:.09375},{x:.46875,y:.09375},{x:.53125,y:.09375},{x:.53125,y:.09375},{x:.59375,y:.09375},{x:.59375,y:.09375},{x:.65625,y:.09375},{x:.65625,y:.09375},{x:.71875,y:.09375},{x:.71875,y:.09375},{x:.78125,y:.09375},{x:.78125,y:.09375},{x:.84375,y:.09375},{x:.84375,y:.09375},{x:.90625,y:.09375},{x:.90625,y:.09375},{x:.96875,y:.09375},{x:.96875,y:.09375},{x:.03125,y:.15625},{x:.03125,y:.15625},{x:.09375,y:.15625},{x:.09375,y:.15625},{x:.15625,y:.15625},{x:.15625,y:.15625},{x:.21875,y:.15625},{x:.21875,y:.15625},{x:.28125,y:.15625},{x:.28125,y:.15625},{x:.34375,y:.15625},{x:.34375,y:.15625},{x:.40625,y:.15625},{x:.40625,y:.15625},{x:.46875,y:.15625},{x:.46875,y:.15625},{x:.53125,y:.15625},{x:.53125,y:.15625},{x:.59375,y:.15625},{x:.59375,y:.15625},{x:.65625,y:.15625},{x:.65625,y:.15625},{x:.71875,y:.15625},{x:.71875,y:.15625},{x:.78125,y:.15625},{x:.78125,y:.15625},{x:.84375,y:.15625},{x:.84375,y:.15625},{x:.90625,y:.15625},{x:.90625,y:.15625},{x:.96875,y:.15625},{x:.96875,y:.15625},{x:.03125,y:.21875},{x:.03125,y:.21875},{x:.09375,y:.21875},{x:.09375,y:.21875},{x:.15625,y:.21875},{x:.15625,y:.21875},{x:.21875,y:.21875},{x:.21875,y:.21875},{x:.28125,y:.21875},{x:.28125,y:.21875},{x:.34375,y:.21875},{x:.34375,y:.21875},{x:.40625,y:.21875},{x:.40625,y:.21875},{x:.46875,y:.21875},{x:.46875,y:.21875},{x:.53125,y:.21875},{x:.53125,y:.21875},{x:.59375,y:.21875},{x:.59375,y:.21875},{x:.65625,y:.21875},{x:.65625,y:.21875},{x:.71875,y:.21875},{x:.71875,y:.21875},{x:.78125,y:.21875},{x:.78125,y:.21875},{x:.84375,y:.21875},{x:.84375,y:.21875},{x:.90625,y:.21875},{x:.90625,y:.21875},{x:.96875,y:.21875},{x:.96875,y:.21875},{x:.03125,y:.28125},{x:.03125,y:.28125},{x:.09375,y:.28125},{x:.09375,y:.28125},{x:.15625,y:.28125},{x:.15625,y:.28125},{x:.21875,y:.28125},{x:.21875,y:.28125},{x:.28125,y:.28125},{x:.28125,y:.28125},{x:.34375,y:.28125},{x:.34375,y:.28125},{x:.40625,y:.28125},{x:.40625,y:.28125},{x:.46875,y:.28125},{x:.46875,y:.28125},{x:.53125,y:.28125},{x:.53125,y:.28125},{x:.59375,y:.28125},{x:.59375,y:.28125},{x:.65625,y:.28125},{x:.65625,y:.28125},{x:.71875,y:.28125},{x:.71875,y:.28125},{x:.78125,y:.28125},{x:.78125,y:.28125},{x:.84375,y:.28125},{x:.84375,y:.28125},{x:.90625,y:.28125},{x:.90625,y:.28125},{x:.96875,y:.28125},{x:.96875,y:.28125},{x:.03125,y:.34375},{x:.03125,y:.34375},{x:.09375,y:.34375},{x:.09375,y:.34375},{x:.15625,y:.34375},{x:.15625,y:.34375},{x:.21875,y:.34375},{x:.21875,y:.34375},{x:.28125,y:.34375},{x:.28125,y:.34375},{x:.34375,y:.34375},{x:.34375,y:.34375},{x:.40625,y:.34375},{x:.40625,y:.34375},{x:.46875,y:.34375},{x:.46875,y:.34375},{x:.53125,y:.34375},{x:.53125,y:.34375},{x:.59375,y:.34375},{x:.59375,y:.34375},{x:.65625,y:.34375},{x:.65625,y:.34375},{x:.71875,y:.34375},{x:.71875,y:.34375},{x:.78125,y:.34375},{x:.78125,y:.34375},{x:.84375,y:.34375},{x:.84375,y:.34375},{x:.90625,y:.34375},{x:.90625,y:.34375},{x:.96875,y:.34375},{x:.96875,y:.34375},{x:.03125,y:.40625},{x:.03125,y:.40625},{x:.09375,y:.40625},{x:.09375,y:.40625},{x:.15625,y:.40625},{x:.15625,y:.40625},{x:.21875,y:.40625},{x:.21875,y:.40625},{x:.28125,y:.40625},{x:.28125,y:.40625},{x:.34375,y:.40625},{x:.34375,y:.40625},{x:.40625,y:.40625},{x:.40625,y:.40625},{x:.46875,y:.40625},{x:.46875,y:.40625},{x:.53125,y:.40625},{x:.53125,y:.40625},{x:.59375,y:.40625},{x:.59375,y:.40625},{x:.65625,y:.40625},{x:.65625,y:.40625},{x:.71875,y:.40625},{x:.71875,y:.40625},{x:.78125,y:.40625},{x:.78125,y:.40625},{x:.84375,y:.40625},{x:.84375,y:.40625},{x:.90625,y:.40625},{x:.90625,y:.40625},{x:.96875,y:.40625},{x:.96875,y:.40625},{x:.03125,y:.46875},{x:.03125,y:.46875},{x:.09375,y:.46875},{x:.09375,y:.46875},{x:.15625,y:.46875},{x:.15625,y:.46875},{x:.21875,y:.46875},{x:.21875,y:.46875},{x:.28125,y:.46875},{x:.28125,y:.46875},{x:.34375,y:.46875},{x:.34375,y:.46875},{x:.40625,y:.46875},{x:.40625,y:.46875},{x:.46875,y:.46875},{x:.46875,y:.46875},{x:.53125,y:.46875},{x:.53125,y:.46875},{x:.59375,y:.46875},{x:.59375,y:.46875},{x:.65625,y:.46875},{x:.65625,y:.46875},{x:.71875,y:.46875},{x:.71875,y:.46875},{x:.78125,y:.46875},{x:.78125,y:.46875},{x:.84375,y:.46875},{x:.84375,y:.46875},{x:.90625,y:.46875},{x:.90625,y:.46875},{x:.96875,y:.46875},{x:.96875,y:.46875},{x:.03125,y:.53125},{x:.03125,y:.53125},{x:.09375,y:.53125},{x:.09375,y:.53125},{x:.15625,y:.53125},{x:.15625,y:.53125},{x:.21875,y:.53125},{x:.21875,y:.53125},{x:.28125,y:.53125},{x:.28125,y:.53125},{x:.34375,y:.53125},{x:.34375,y:.53125},{x:.40625,y:.53125},{x:.40625,y:.53125},{x:.46875,y:.53125},{x:.46875,y:.53125},{x:.53125,y:.53125},{x:.53125,y:.53125},{x:.59375,y:.53125},{x:.59375,y:.53125},{x:.65625,y:.53125},{x:.65625,y:.53125},{x:.71875,y:.53125},{x:.71875,y:.53125},{x:.78125,y:.53125},{x:.78125,y:.53125},{x:.84375,y:.53125},{x:.84375,y:.53125},{x:.90625,y:.53125},{x:.90625,y:.53125},{x:.96875,y:.53125},{x:.96875,y:.53125},{x:.03125,y:.59375},{x:.03125,y:.59375},{x:.09375,y:.59375},{x:.09375,y:.59375},{x:.15625,y:.59375},{x:.15625,y:.59375},{x:.21875,y:.59375},{x:.21875,y:.59375},{x:.28125,y:.59375},{x:.28125,y:.59375},{x:.34375,y:.59375},{x:.34375,y:.59375},{x:.40625,y:.59375},{x:.40625,y:.59375},{x:.46875,y:.59375},{x:.46875,y:.59375},{x:.53125,y:.59375},{x:.53125,y:.59375},{x:.59375,y:.59375},{x:.59375,y:.59375},{x:.65625,y:.59375},{x:.65625,y:.59375},{x:.71875,y:.59375},{x:.71875,y:.59375},{x:.78125,y:.59375},{x:.78125,y:.59375},{x:.84375,y:.59375},{x:.84375,y:.59375},{x:.90625,y:.59375},{x:.90625,y:.59375},{x:.96875,y:.59375},{x:.96875,y:.59375},{x:.03125,y:.65625},{x:.03125,y:.65625},{x:.09375,y:.65625},{x:.09375,y:.65625},{x:.15625,y:.65625},{x:.15625,y:.65625},{x:.21875,y:.65625},{x:.21875,y:.65625},{x:.28125,y:.65625},{x:.28125,y:.65625},{x:.34375,y:.65625},{x:.34375,y:.65625},{x:.40625,y:.65625},{x:.40625,y:.65625},{x:.46875,y:.65625},{x:.46875,y:.65625},{x:.53125,y:.65625},{x:.53125,y:.65625},{x:.59375,y:.65625},{x:.59375,y:.65625},{x:.65625,y:.65625},{x:.65625,y:.65625},{x:.71875,y:.65625},{x:.71875,y:.65625},{x:.78125,y:.65625},{x:.78125,y:.65625},{x:.84375,y:.65625},{x:.84375,y:.65625},{x:.90625,y:.65625},{x:.90625,y:.65625},{x:.96875,y:.65625},{x:.96875,y:.65625},{x:.03125,y:.71875},{x:.03125,y:.71875},{x:.09375,y:.71875},{x:.09375,y:.71875},{x:.15625,y:.71875},{x:.15625,y:.71875},{x:.21875,y:.71875},{x:.21875,y:.71875},{x:.28125,y:.71875},{x:.28125,y:.71875},{x:.34375,y:.71875},{x:.34375,y:.71875},{x:.40625,y:.71875},{x:.40625,y:.71875},{x:.46875,y:.71875},{x:.46875,y:.71875},{x:.53125,y:.71875},{x:.53125,y:.71875},{x:.59375,y:.71875},{x:.59375,y:.71875},{x:.65625,y:.71875},{x:.65625,y:.71875},{x:.71875,y:.71875},{x:.71875,y:.71875},{x:.78125,y:.71875},{x:.78125,y:.71875},{x:.84375,y:.71875},{x:.84375,y:.71875},{x:.90625,y:.71875},{x:.90625,y:.71875},{x:.96875,y:.71875},{x:.96875,y:.71875},{x:.03125,y:.78125},{x:.03125,y:.78125},{x:.09375,y:.78125},{x:.09375,y:.78125},{x:.15625,y:.78125},{x:.15625,y:.78125},{x:.21875,y:.78125},{x:.21875,y:.78125},{x:.28125,y:.78125},{x:.28125,y:.78125},{x:.34375,y:.78125},{x:.34375,y:.78125},{x:.40625,y:.78125},{x:.40625,y:.78125},{x:.46875,y:.78125},{x:.46875,y:.78125},{x:.53125,y:.78125},{x:.53125,y:.78125},{x:.59375,y:.78125},{x:.59375,y:.78125},{x:.65625,y:.78125},{x:.65625,y:.78125},{x:.71875,y:.78125},{x:.71875,y:.78125},{x:.78125,y:.78125},{x:.78125,y:.78125},{x:.84375,y:.78125},{x:.84375,y:.78125},{x:.90625,y:.78125},{x:.90625,y:.78125},{x:.96875,y:.78125},{x:.96875,y:.78125},{x:.03125,y:.84375},{x:.03125,y:.84375},{x:.09375,y:.84375},{x:.09375,y:.84375},{x:.15625,y:.84375},{x:.15625,y:.84375},{x:.21875,y:.84375},{x:.21875,y:.84375},{x:.28125,y:.84375},{x:.28125,y:.84375},{x:.34375,y:.84375},{x:.34375,y:.84375},{x:.40625,y:.84375},{x:.40625,y:.84375},{x:.46875,y:.84375},{x:.46875,y:.84375},{x:.53125,y:.84375},{x:.53125,y:.84375},{x:.59375,y:.84375},{x:.59375,y:.84375},{x:.65625,y:.84375},{x:.65625,y:.84375},{x:.71875,y:.84375},{x:.71875,y:.84375},{x:.78125,y:.84375},{x:.78125,y:.84375},{x:.84375,y:.84375},{x:.84375,y:.84375},{x:.90625,y:.84375},{x:.90625,y:.84375},{x:.96875,y:.84375},{x:.96875,y:.84375},{x:.03125,y:.90625},{x:.03125,y:.90625},{x:.09375,y:.90625},{x:.09375,y:.90625},{x:.15625,y:.90625},{x:.15625,y:.90625},{x:.21875,y:.90625},{x:.21875,y:.90625},{x:.28125,y:.90625},{x:.28125,y:.90625},{x:.34375,y:.90625},{x:.34375,y:.90625},{x:.40625,y:.90625},{x:.40625,y:.90625},{x:.46875,y:.90625},{x:.46875,y:.90625},{x:.53125,y:.90625},{x:.53125,y:.90625},{x:.59375,y:.90625},{x:.59375,y:.90625},{x:.65625,y:.90625},{x:.65625,y:.90625},{x:.71875,y:.90625},{x:.71875,y:.90625},{x:.78125,y:.90625},{x:.78125,y:.90625},{x:.84375,y:.90625},{x:.84375,y:.90625},{x:.90625,y:.90625},{x:.90625,y:.90625},{x:.96875,y:.90625},{x:.96875,y:.90625},{x:.03125,y:.96875},{x:.03125,y:.96875},{x:.09375,y:.96875},{x:.09375,y:.96875},{x:.15625,y:.96875},{x:.15625,y:.96875},{x:.21875,y:.96875},{x:.21875,y:.96875},{x:.28125,y:.96875},{x:.28125,y:.96875},{x:.34375,y:.96875},{x:.34375,y:.96875},{x:.40625,y:.96875},{x:.40625,y:.96875},{x:.46875,y:.96875},{x:.46875,y:.96875},{x:.53125,y:.96875},{x:.53125,y:.96875},{x:.59375,y:.96875},{x:.59375,y:.96875},{x:.65625,y:.96875},{x:.65625,y:.96875},{x:.71875,y:.96875},{x:.71875,y:.96875},{x:.78125,y:.96875},{x:.78125,y:.96875},{x:.84375,y:.96875},{x:.84375,y:.96875},{x:.90625,y:.96875},{x:.90625,y:.96875},{x:.96875,y:.96875},{x:.96875,y:.96875},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375}];var Jy=class{constructor(t){Re(this,"model");Re(this,"anchors");Re(this,"anchorsTensor");Re(this,"inputSize");Re(this,"inputSizeTensor");Re(this,"doubleInputSizeTensor");this.model=t,this.anchors=$8.map(n=>[n.x,n.y]),this.anchorsTensor=Ls(this.anchors),this.inputSize=this.model&&this.model.inputs&&this.model.inputs[0].shape?this.model.inputs[0].shape[2]:0,this.inputSizeTensor=Vt([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=Vt([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){return H(()=>{let n=_e(t,[0,0],[-1,2]),s=_e(t,[0,2],[-1,2]),r=oe(pe(n,this.inputSizeTensor),this.anchorsTensor),a=pe(s,this.doubleInputSizeTensor),o=z(Ae(r,a),this.inputSizeTensor),i=z(oe(r,a),this.inputSizeTensor);return Hl([o,i],1)})}normalizeLandmarks(t,n){return H(()=>{let s=oe(pe(V(t,[-1,7,2]),this.inputSizeTensor),this.anchors[n]);return z(s,this.inputSizeTensor)})}async getBoxes(t,n){let s={};s.batched=this.model.predict(t),s.predictions=lt(s.batched),s.scores=H(()=>lt(On(_e(s.predictions,[0,0],[-1,1]))));let r=await s.scores.data();s.boxes=_e(s.predictions,[0,1],[-1,4]),s.norm=this.normalizeBoxes(s.boxes),s.nms=await Fe.nonMaxSuppressionAsync(s.norm,s.scores,10*n.hand.maxDetected,n.hand.iouThreshold,n.hand.minConfidence);let a=await s.nms.array(),o=[];for(let i of a){let l=_e(s.norm,[i,0],[1,-1]),u=H(()=>V(this.normalizeLandmarks(_e(s.predictions,[i,5],[1,14]),i),[-1,2]));o.push({box:l,palmLandmarks:u,confidence:r[i]})}for(let i of Object.keys(s))Z(s[i]);return o}async estimateHandBounds(t,n){let s=t.shape[1],r=t.shape[2],a=H(()=>Ae(pe(Fe.resizeBilinear(t,[this.inputSize,this.inputSize]),127.5),1)),o=await this.getBoxes(a,n);Z(a);let i=[];if(!o||o.length===0)return i;for(let l of o){let u=await l.box.data(),c=u.slice(0,2),d=u.slice(2,4),p=await l.palmLandmarks.array();Z(l.box),Z(l.palmLandmarks),i.push(F8({startPoint:c,endPoint:d,palmLandmarks:p,confidence:l.confidence},[r/this.inputSize,s/this.inputSize]))}return i}};function ple(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function O8(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return ple(n)}var P8=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function va(e,t){let n=0;for(let s=0;so[0]),s=t.map(o=>o[1]),r=[Math.min(...n),Math.min(...s)],a=[Math.max(...n),Math.max(...s)];return{startPoint:r,endPoint:a}}getBoxForPalmLandmarks(t,n){let s=t.map(a=>ex([...a,1],n)),r=this.calculateLandmarksBoundingBox(s);return A0(y0(r),fle)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),s=A0(y0(n),L8);s.palmLandmarks=[];for(let r=0;r[o[0]*(h[0]-this.inputSize/2),o[1]*(h[1]-this.inputSize/2),o[2]*h[2]]),l=Qy(s,[0,0]),u=i.map(h=>[...ex(h,l),h[2]]),c=z8(r),d=[..._d(n),1],p=[va(d,c[0]),va(d,c[1])];return u.map(h=>[Math.trunc(h[0]+p[0]),Math.trunc(h[1]+p[1]),Math.trunc(h[2])])}async estimateHands(t,n){let s=!1,r;(this.skipped===0||this.skipped>n.hand.skipFrames||!n.hand.landmarks||!n.skipFrame)&&(r=await this.handDetector.estimateHandBounds(t,n),this.skipped=0),n.skipFrame&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(s=!0));let a=[];for(let o=0;o=n.hand.minConfidence/4){let x=V(A,[-1,3]),b=await x.array();Z(A),Z(x);let v=this.transformRawCoords(b,h,l,p),k=this.getBoxForHandLandmarks(v);this.storedBoxes[o]={...k,confidence:y};let S={landmarks:v,confidence:y,box:{topLeft:k.startPoint,bottomRight:k.endPoint}};a.push(S)}else this.storedBoxes[o]=null;Z(A)}else{let l=A0(y0(i),L8),u={confidence:i.confidence,box:{topLeft:l.startPoint,bottomRight:l.endPoint},landmarks:[]};a.push(u)}}return this.storedBoxes=this.storedBoxes.filter(o=>o!==null),this.detectedHands=a.length,a}};var qe={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>qe.nameMapping[e],getPoints:e=>qe.pointsMapping[e]},Rn={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>Rn.nameMapping[e]},He={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>He.nameMapping[e]};var mi={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function W8(e,t,n,s){let r=(t-s)/(e-n),a=Math.atan(r)*180/Math.PI;return a<=0?a=-a:a>0&&(a=180-a),a}function V8(e,t){let n=W8(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let s=W8(e[1],e[2],t[1],t[2]);return[n,s]}function U8(e,t=1){let n=0,s=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?s=1*t:r=1*t,[n,s,r]}function Ale(e,t,n){let s=e[0]-t[0],r=e[0]-n[0],a=t[0]-n[0],o=e[1]-t[1],i=e[1]-n[1],l=t[1]-n[1],u=e[2]-t[2],c=e[2]-n[2],d=t[2]-n[2],p=Math.sqrt(s*s+o*o+u*u),h=Math.sqrt(r*r+i*i+c*c),f=Math.sqrt(a*a+l*l+d*d),m=(f*f+p*p-h*h)/(2*f*p);m>1?m=1:m<-1&&(m=-1);let g=Math.acos(m);g=57.2958*g%180;let A;return g>mi.NO_CURL_START_LIMIT?A=Rn.none:g>mi.HALF_CURL_START_LIMIT?A=Rn.half:A=Rn.full,A}function H8(e,t,n,s){let r;return s===Math.abs(e)?e>0?r=He.horizontalLeft:r=He.horizontalRight:s===Math.abs(t)?t>0?r=He.horizontalLeft:r=He.horizontalRight:n>0?r=He.horizontalLeft:r=He.horizontalRight,r}function G8(e,t,n,s){let r;return s===Math.abs(e)?e<0?r=He.verticalDown:r=He.verticalUp:s===Math.abs(t)?t<0?r=He.verticalDown:r=He.verticalUp:n<0?r=He.verticalDown:r=He.verticalUp,r}function yle(e,t,n,s,r,a,o,i){let l,u=G8(e,t,n,s),c=H8(r,a,o,i);return u===He.verticalUp?c===He.horizontalLeft?l=He.diagonalUpLeft:l=He.diagonalUpRight:c===He.horizontalLeft?l=He.diagonalDownLeft:l=He.diagonalDownRight,l}function xle(e,t,n,s){let r=e[0]-t[0],a=e[0]-n[0],o=t[0]-n[0],i=e[1]-t[1],l=e[1]-n[1],u=t[1]-n[1],c=Math.max(Math.abs(r),Math.abs(a),Math.abs(o)),d=Math.max(Math.abs(i),Math.abs(l),Math.abs(u)),p=0,h=0,f=0,m=d/(c+1e-5);m>1.5?p+=mi.DISTANCE_VOTE_POWER:m>.66?h+=mi.DISTANCE_VOTE_POWER:f+=mi.DISTANCE_VOTE_POWER;let g=Math.sqrt(r*r+i*i),A=Math.sqrt(a*a+l*l),y=Math.sqrt(o*o+u*u),x=Math.max(g,A,y),b=e[0],v=e[1],k=n[0],S=n[1];x===g?(k=n[0],S=n[1]):x===y&&(b=t[0],v=t[1]);let O=V8([b,v],[k,S]),E=U8(O,mi.TOTAL_ANGLE_VOTE_POWER);p+=E[0],h+=E[1],f+=E[2];for(let T of s){let P=U8(T,mi.SINGLE_ANGLE_VOTE_POWER);p+=P[0],h+=P[1],f+=P[2]}let R;return p===Math.max(p,h,f)?R=G8(l,i,u,d):f===Math.max(h,f)?R=H8(a,r,o,c):R=yle(l,i,u,d,a,r,o,c),R}function nx(e){let t=[],n=[],s=[],r=[];if(!e)return{curls:s,directions:r};for(let a of qe.all){let o=qe.getPoints(a),i=[],l=[];for(let u of o){let c=e[u[0]],d=e[u[1]],p=V8(c,d),h=p[0],f=p[1];i.push(h),l.push(f)}t.push(i),n.push(l)}for(let a of qe.all){let o=a===qe.thumb?1:0,i=qe.getPoints(a),l=e[i[o][0]],u=e[i[o+1][1]],c=e[i[3][1]],d=Ale(l,u,c),p=xle(l,u,c,t[a].slice(o));s[a]=d,r[a]=p}return{curls:s,directions:r}}var Fd=class{constructor(t){Re(this,"name");Re(this,"curls");Re(this,"directions");Re(this,"weights");Re(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}addCurl(t,n,s){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,s])}addDirection(t,n,s){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,s])}setWeight(t,n){this.weights[t]=n;let s=this.weights.reduce((r,a)=>r+a,0);this.weightsRelative=this.weights.map(r=>r*5/s)}matchAgainst(t,n){let s=0;for(let r in t){let a=t[r],o=this.curls[r];if(typeof o=="undefined"){s+=this.weightsRelative[r];continue}for(let[i,l]of o)if(a===i){s+=l*this.weightsRelative[r];break}}for(let r in n){let a=n[r],o=this.directions[r];if(typeof o=="undefined"){s+=this.weightsRelative[r];continue}for(let[i,l]of o)if(a===i){s+=l*this.weightsRelative[r];break}}return s/10}};var wa=new Fd("thumbs up");wa.addCurl(qe.thumb,Rn.none,1);wa.addDirection(qe.thumb,He.verticalUp,1);wa.addDirection(qe.thumb,He.diagonalUpLeft,.25);wa.addDirection(qe.thumb,He.diagonalUpRight,.25);for(let e of[qe.index,qe.middle,qe.ring,qe.pinky])wa.addCurl(e,Rn.full,1),wa.addDirection(e,He.horizontalLeft,1),wa.addDirection(e,He.horizontalRight,1);var jt=new Fd("victory");jt.addCurl(qe.thumb,Rn.half,.5);jt.addCurl(qe.thumb,Rn.none,.5);jt.addDirection(qe.thumb,He.verticalUp,1);jt.addDirection(qe.thumb,He.diagonalUpLeft,1);jt.addCurl(qe.index,Rn.none,1);jt.addDirection(qe.index,He.verticalUp,.75);jt.addDirection(qe.index,He.diagonalUpLeft,1);jt.addCurl(qe.middle,Rn.none,1);jt.addDirection(qe.middle,He.verticalUp,1);jt.addDirection(qe.middle,He.diagonalUpLeft,.75);jt.addCurl(qe.ring,Rn.full,1);jt.addDirection(qe.ring,He.verticalUp,.2);jt.addDirection(qe.ring,He.diagonalUpLeft,1);jt.addDirection(qe.ring,He.horizontalLeft,.2);jt.addCurl(qe.pinky,Rn.full,1);jt.addDirection(qe.pinky,He.verticalUp,.2);jt.addDirection(qe.pinky,He.diagonalUpLeft,1);jt.addDirection(qe.pinky,He.horizontalLeft,.2);jt.setWeight(qe.index,2);jt.setWeight(qe.middle,2);var j8=[wa,jt];var ble=.7;function q8(e){let t=nx(e),n={};for(let s of qe.all)n[qe.getName(s)]={curl:Rn.getName(t.curls[s]),direction:He.getName(t.directions[s])};return n}function X8(e){let t=nx(e),n=[];for(let s of j8){let r=s.matchAgainst(t.curls,t.directions);r>=ble&&n.push({name:s.name,confidence:r})}return n}var K8={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},ka,Ia,Z8;async function sx(e,t){let n=await Z8.estimateHands(e,t);if(!n)return[];let s=[];for(let r=0;rn[r].landmarks[d]);let o=n[r].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(o&&o.length>0){for(let c of o)c[0]i[2]&&(i[2]=c[0]),c[1]>i[3]&&(i[3]=c[1]);i[2]-=i[0],i[3]-=i[1],l=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let u=q8(o);s.push({id:r,score:Math.round(100*n[r].confidence)/100,box:i,boxRaw:l,keypoints:o,annotations:a,landmarks:u})}return s}async function rx(e){var n,s,r,a,o,i;!ka||!Ia?([ka,Ia]=await Promise.all([e.hand.enabled?yt(xt(e.modelBasePath,((n=e.hand.detector)==null?void 0:n.modelPath)||""),{fromTFHub:(((s=e.hand.detector)==null?void 0:s.modelPath)||"").includes("tfhub.dev")}):null,e.hand.landmarks?yt(xt(e.modelBasePath,((r=e.hand.skeleton)==null?void 0:r.modelPath)||""),{fromTFHub:(((a=e.hand.skeleton)==null?void 0:a.modelPath)||"").includes("tfhub.dev")}):null]),e.hand.enabled&&(!ka||!ka.modelUrl?ce("load model failed:",((o=e.hand.detector)==null?void 0:o.modelPath)||""):e.debug&&ce("load model:",ka.modelUrl),!Ia||!Ia.modelUrl?ce("load model failed:",((i=e.hand.skeleton)==null?void 0:i.modelPath)||""):e.debug&&ce("load model:",Ia.modelUrl))):(e.debug&&ce("cached model:",ka.modelUrl),e.debug&&ce("cached model:",Ia.modelUrl));let t=new Jy(ka);return Z8=new tx(t,Ia),[ka,Ia]}var Y8=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPalm","rightPalm","leftIndex","rightIndex","leftPinky","rightPinky","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","midHip","forehead","leftThumb","leftHand","rightThumb","rightHand"],J8=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","left:15","right:16","left:17","right:18","left:19","right:20","left:21","right:22","leftChest","rightChest","neck","forehead","left:27","right:28","left:29","right:30"];var Un;async function x0(e){return Un?e.debug&&ce("cached model:",Un.modelUrl):(Un=await yt(xt(e.modelBasePath,e.body.modelPath||"")),Un.width=parseInt(Un.signature.inputs["input_1:0"].tensorShape.dim[2].size),Un.height=parseInt(Un.signature.inputs["input_1:0"].tensorShape.dim[1].size),!Un||!Un.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",Un.modelUrl)),Un}async function ax(e,t){if(!Un)return[];if(!t.body.enabled)return[];let n={width:e.shape[2]||0,height:e.shape[1]||0},s=Fe.resizeBilinear(e,[Un.width,Un.height],!1),r=pe(s,[255]);Z(s);let a=await Un.predict(r),o=a.find(g=>g.size===195||g.size===155),i=await(o==null?void 0:o.data())||[];a.forEach(g=>Z(g)),Z(r);let l=[],u=(i==null?void 0:i.length)===195?Y8:J8,c=5;for(let g=0;gg.position[0]),p=l.map(g=>g.position[1]),h=[Math.min(...d),Math.min(...p),Math.max(...d)-Math.min(...d),Math.max(...p)-Math.min(...d)],f=[0,0,0,0],m=l.reduce((g,A)=>A.score>g?A.score:g,0);return[{id:0,score:m,box:h,boxRaw:f,keypoints:l}]}var Hn,gr=[],ox=[0,0,0,0],ix=[0,0,0,0],b0=0,lx=Number.MAX_SAFE_INTEGER,vle=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","pelvis","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"];async function Q8(e){return Hn?e.debug&&ce("cached model:",Hn.modelUrl):(Hn=await yt(xt(e.modelBasePath,e.body.modelPath||"")),!Hn||!Hn.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",Hn.modelUrl)),Hn}function wle(e,t){let[n,s]=e.shape;return H(()=>{let r=(i,l)=>Ae(i,z(pe(i,Ce(l,"int32")),Ce(l,"int32"))),a=V(e,[s*n]),o=Yn(a,0).dataSync()[0];if(o>t){let i=Ms(a,0),l=r(i,n).dataSync()[0],u=pe(i,Ce(n,"int32")).dataSync()[0];return[l,u,o]}return[0,0,o]})}async function ux(e,t){var n;return lx<(((n=t.body)==null?void 0:n.skipFrames)||0)&&t.skipFrame&&Object.keys(gr).length>0?(lx++,[{id:0,score:b0,box:ox,boxRaw:ix,keypoints:gr}]):(lx=0,new Promise(async s=>{var c;let r=H(()=>{if(!Hn.inputs[0].shape)return null;let d=Fe.resizeBilinear(e,[Hn.inputs[0].shape[2],Hn.inputs[0].shape[1]],!1);return z(d,2).sub(1)}),a;if(t.body.enabled&&(a=await Hn.predict(r)),Z(r),a){gr.length=0;let d=a.squeeze();Z(a);let p=d.unstack(2);Z(d);for(let h=0;h(((c=t.body)==null?void 0:c.minConfidence)||0)&&gr.push({score:Math.round(100*g)/100,part:vle[h],positionRaw:[f/Hn.inputs[0].shape[2],m/Hn.inputs[0].shape[1]],position:[Math.round(e.shape[2]*f/Hn.inputs[0].shape[2]),Math.round(e.shape[1]*m/Hn.inputs[0].shape[1])]})}p.forEach(h=>Z(h))}b0=gr.reduce((d,p)=>p.score>d?p.score:d,0);let o=gr.map(d=>d.position[0]),i=gr.map(d=>d.position[1]);ox=[Math.min(...o),Math.min(...i),Math.max(...o)-Math.min(...o),Math.max(...i)-Math.min(...i)];let l=gr.map(d=>d.positionRaw[0]),u=gr.map(d=>d.positionRaw[1]);ix=[Math.min(...l),Math.min(...u),Math.max(...l)-Math.min(...l),Math.max(...u)-Math.min(...u)],s([{id:0,score:b0,box:ox,boxRaw:ix,keypoints:gr}])}))}var Ar,vs=[],cx=[0,0,0,0],Pr=[0,0,0,0],Mr=0,dx=Number.MAX_SAFE_INTEGER,eI=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"];async function px(e){return Ar?e.debug&&ce("cached model:",Ar.modelUrl):(Ar=await yt(xt(e.modelBasePath,e.body.modelPath||"")),!Ar||!Ar.modelUrl?ce("load model failed:",e.body.modelPath):e.debug&&ce("load model:",Ar.modelUrl)),Ar}async function kle(e,t,n){vs.length=0;let s=e[0][0];for(let u=0;ut.body.minConfidence&&vs.push({score:Math.round(100*Mr)/100,part:eI[u],positionRaw:[s[u][1],s[u][0]],position:[Math.round((n.shape[2]||0)*s[u][1]),Math.round((n.shape[1]||0)*s[u][0])]});Mr=vs.reduce((u,c)=>c.score>u?c.score:u,0);let r=vs.map(u=>u.position[0]),a=vs.map(u=>u.position[1]);cx=[Math.min(...r),Math.min(...a),Math.max(...r)-Math.min(...r),Math.max(...a)-Math.min(...a)];let o=vs.map(u=>u.positionRaw[0]),i=vs.map(u=>u.positionRaw[1]);Pr=[Math.min(...o),Math.min(...i),Math.max(...o)-Math.min(...o),Math.max(...i)-Math.min(...i)];let l=[];return l.push({id:0,score:Mr,box:cx,boxRaw:Pr,keypoints:vs}),l}async function Ile(e,t,n){let s=[];for(let r=0;rt.body.minConfidence&&vs.push({part:eI[o],score:i,positionRaw:[a[3*o+1],a[3*o+0]],position:[Math.trunc(a[3*o+1]*(n.shape[2]||0)),Math.trunc(a[3*o+0]*(n.shape[1]||0))]})}Pr=[a[51+1],a[51+0],a[51+3]-a[51+1],a[51+2]-a[51+0]],s.push({id:r,score:Mr,boxRaw:Pr,box:[Math.trunc(Pr[0]*(n.shape[2]||0)),Math.trunc(Pr[1]*(n.shape[1]||0)),Math.trunc(Pr[2]*(n.shape[2]||0)),Math.trunc(Pr[3]*(n.shape[1]||0))],keypoints:vs})}}return s}async function hx(e,t){return dx<(t.body.skipFrames||0)&&t.skipFrame&&Object.keys(vs).length>0?(dx++,[{id:0,score:Mr,box:cx,boxRaw:Pr,keypoints:vs}]):(dx=0,new Promise(async n=>{let s=H(()=>{if(!Ar.inputs[0].shape)return null;let i=Ar.inputs[0].shape[2];i===-1&&(i=256);let l=Fe.resizeBilinear(e,[i,i],!1);return de(l,"int32")}),r;t.body.enabled&&(r=await Ar.predict(s)),Z(s),r||n([]);let a=await r.array(),o;r.shape[2]===17?o=await kle(a,t,e):r.shape[2]===56&&(o=await Ile(a,t,e)),Z(r),n(o)}))}var Eu=[{class:1,label:"person"},{class:2,label:"bicycle"},{class:3,label:"car"},{class:4,label:"motorcycle"},{class:5,label:"airplane"},{class:6,label:"bus"},{class:7,label:"train"},{class:8,label:"truck"},{class:9,label:"boat"},{class:10,label:"traffic light"},{class:11,label:"fire hydrant"},{class:12,label:"stop sign"},{class:13,label:"parking meter"},{class:14,label:"bench"},{class:15,label:"bird"},{class:16,label:"cat"},{class:17,label:"dog"},{class:18,label:"horse"},{class:19,label:"sheep"},{class:20,label:"cow"},{class:21,label:"elephant"},{class:22,label:"bear"},{class:23,label:"zebra"},{class:24,label:"giraffe"},{class:25,label:"backpack"},{class:26,label:"umbrella"},{class:27,label:"handbag"},{class:28,label:"tie"},{class:29,label:"suitcase"},{class:30,label:"frisbee"},{class:31,label:"skis"},{class:32,label:"snowboard"},{class:33,label:"sports ball"},{class:34,label:"kite"},{class:35,label:"baseball bat"},{class:36,label:"baseball glove"},{class:37,label:"skateboard"},{class:38,label:"surfboard"},{class:39,label:"tennis racket"},{class:40,label:"bottle"},{class:41,label:"wine glass"},{class:42,label:"cup"},{class:43,label:"fork"},{class:44,label:"knife"},{class:45,label:"spoon"},{class:46,label:"bowl"},{class:47,label:"banana"},{class:48,label:"apple"},{class:49,label:"sandwich"},{class:50,label:"orange"},{class:51,label:"broccoli"},{class:52,label:"carrot"},{class:53,label:"hot dog"},{class:54,label:"pizza"},{class:55,label:"donut"},{class:56,label:"cake"},{class:57,label:"chair"},{class:58,label:"couch"},{class:59,label:"potted plant"},{class:60,label:"bed"},{class:61,label:"dining table"},{class:62,label:"toilet"},{class:63,label:"tv"},{class:64,label:"laptop"},{class:65,label:"mouse"},{class:66,label:"remote"},{class:67,label:"keyboard"},{class:68,label:"cell phone"},{class:69,label:"microwave"},{class:70,label:"oven"},{class:71,label:"toaster"},{class:72,label:"sink"},{class:73,label:"refrigerator"},{class:74,label:"book"},{class:75,label:"clock"},{class:76,label:"vase"},{class:77,label:"scissors"},{class:78,label:"teddy bear"},{class:79,label:"hair drier"},{class:80,label:"toothbrush"}];var is,v0=[],fx=Number.MAX_SAFE_INTEGER,w0=2.5;async function mx(e){if(is)e.debug&&ce("cached model:",is.modelUrl);else{is=await yt(xt(e.modelBasePath,e.object.modelPath||""));let t=Object.values(is.modelSignature.inputs);if(is.inputSize=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):null,!is.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${e.object.modelPath}`);!is||!is.modelUrl?ce("load model failed:",e.object.modelPath):e.debug&&ce("load model:",is.modelUrl)}return is}async function Sle(e,t,n,s){let r=0,a=[];for(let u of[1,2,4])H(async()=>{var g,A;let c=u*13,d=(g=e.find(y=>y.shape[1]===c**2&&y.shape[2]===Eu.length))==null?void 0:g.squeeze(),p=(A=e.find(y=>y.shape[1]===c**2&&y.shape[2]s.object.minConfidence&&x!==61){let v=(.5+Math.trunc(y%c))/c,k=(.5+Math.trunc(y/c))/c,S=f[y].map(U=>U*(c/u/t)),[C,D]=[v-w0/u*S[0],k-w0/u*S[1]],[O,E]=[v+w0/u*S[2]-C,k+w0/u*S[3]-D],R=[C,D,O,E];R=R.map(U=>Math.max(0,Math.min(U,1)));let T=[R[0]*n[0],R[1]*n[1],R[2]*n[0],R[3]*n[1]],P={id:r++,score:Math.round(100*b)/100,class:x+1,label:Eu[x].label,box:T.map(U=>Math.trunc(U)),boxRaw:R};a.push(P)}}});e.forEach(u=>Z(u));let o=a.map(u=>[u.boxRaw[1],u.boxRaw[0],u.boxRaw[3],u.boxRaw[2]]),i=a.map(u=>u.score),l=[];if(o&&o.length>0){let u=await Fe.nonMaxSuppressionAsync(o,i,s.object.maxDetected,s.object.iouThreshold,s.object.minConfidence);l=await u.data(),Z(u)}return a=a.filter((u,c)=>l.includes(c)).sort((u,c)=>c.score-u.score),a}async function gx(e,t){return fx<(t.object.skipFrames||0)&&t.skipFrame&&v0.length>0?(fx++,v0):(fx=0,!xe.kernels.includes("mod")||!xe.kernels.includes("sparsetodense")?v0:new Promise(async n=>{let s=[e.shape[2],e.shape[1]],r=Fe.resizeBilinear(e,[is.inputSize,is.inputSize],!1),a=pe(r,255),o=a.transpose([0,3,1,2]);Z(a),Z(r);let i;t.object.enabled&&(i=await is.predict(o)),Z(o);let l=await Sle(i,is.inputSize,s,t);v0=l,n(l)}))}var ls,k0=[],Ax=Number.MAX_SAFE_INTEGER;async function yx(e){if(ls)e.debug&&ce("cached model:",ls.modelUrl);else{ls=await yt(xt(e.modelBasePath,e.object.modelPath||""));let t=Object.values(ls.modelSignature.inputs);if(ls.inputSize=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):null,!ls.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${e.object.modelPath}`);!ls||!ls.modelUrl?ce("load model failed:",e.object.modelPath):e.debug&&ce("load model:",ls.modelUrl)}return ls}async function Cle(e,t,n,s){if(!e)return[];let r=[],a=await e.array(),o=lt(e);Z(e);let i=Wt(o,6,1);Z(o);let l=pn([i[1],i[0],i[3],i[2]],1),u=lt(l);Z(l);let c=lt(i[4]),d=lt(i[5]);i.forEach(m=>Z(m));let p=await Fe.nonMaxSuppressionAsync(u,c,s.object.maxDetected,s.object.iouThreshold,s.object.minConfidence);Z(u),Z(c),Z(d);let h=await p.data();Z(p);let f=0;for(let m of h){let g=Math.trunc(100*a[0][m][4])/100,A=a[0][m][5],y=Eu[A].label,[x,b]=[a[0][m][0]/t,a[0][m][1]/t],v=[x,b,a[0][m][2]/t-x,a[0][m][3]/t-b],k=[Math.trunc(v[0]*n[0]),Math.trunc(v[1]*n[1]),Math.trunc(v[2]*n[0]),Math.trunc(v[3]*n[1])];r.push({id:f++,score:g,class:A,label:y,box:k,boxRaw:v})}return r}async function xx(e,t){return Ax<(t.object.skipFrames||0)&&t.skipFrame&&k0.length>0?(Ax++,k0):(Ax=0,!xe.kernels.includes("mod")||!xe.kernels.includes("sparsetodense")?k0:new Promise(async n=>{let s=[e.shape[2],e.shape[1]],r=Fe.resizeBilinear(e,[ls.inputSize,ls.inputSize]),a=t.object.enabled?ls.execute(r,["tower_0/detections"]):null;Z(r);let o=await Cle(a,ls.inputSize,s,t);k0=o,n(o)}))}var ws,bx=!1;async function I0(e){return ws?e.debug&&ce("cached model:",ws.modelUrl):(ws=await yt(xt(e.modelBasePath,e.segmentation.modelPath||"")),!ws||!ws.modelUrl?ce("load model failed:",e.segmentation.modelPath):e.debug&&ce("load model:",ws.modelUrl)),ws}async function vx(e){var f,m;let t=((f=e.tensor)==null?void 0:f.shape[1])||0,n=((m=e.tensor)==null?void 0:m.shape[2])||0;if(!e.tensor||!ws||!ws.inputs[0].shape)return null;let s=Fe.resizeBilinear(e.tensor,[ws.inputs[0].shape[1],ws.inputs[0].shape[2]],!1),r=pe(s,255),a=ws.predict(r);Z(s),Z(r);let o=lt(a,0);Z(a);let i;if(o.shape[2]===2){let g=o.softmax(),[A,y]=ts(g,2),x=zt(y,2),b=zt(x,0);Z(g),Z(A),Z(y);let v=Fe.cropAndResize(b,[[0,0,.5,.5]],[0],[t,n]);i=lt(v,0),Z(v),Z(x),Z(b)}else i=Fe.resizeBilinear(o,[t,n]);if(Z(o),xe.node){let g=await i.data();return Z(i),g}let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(t,n):document.createElement("canvas");l.width=t,l.height=n,fs&&await fs.toPixels(i,l),Z(i);let u=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(t,n):document.createElement("canvas");u.width=t,u.height=n;let c=u.getContext("2d");c.filter="blur(8px",await c.drawImage(l,0,0);let d=c.getImageData(0,0,t,n).data,p=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(t,n):document.createElement("canvas");p.width=t,p.height=n;let h=p.getContext("2d");return e.canvas&&await h.drawImage(e.canvas,0,0),h.globalCompositeOperation="darken",h.filter="blur(8px)",await h.drawImage(l,0,0),h.globalCompositeOperation="source-over",h.filter="none",e.canvas=p,d}async function tI(e,t,n){var a;if(bx)return null;bx=!0,ws||await I0(n);let s=fi(e,n),r=await vx(s);if(Z(s.tensor),t&&r){let o=fi(t,n),i=o.canvas;Z(o.tensor);let l=s.canvas,u=(a=l.getContext("2d"))==null?void 0:a.getImageData(0,0,l.width,l.height).data,c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(l.width,l.height):document.createElement("canvas");c.width=l.width,c.height=l.height;let d=c.getContext("2d");d.globalCompositeOperation="copy",d.drawImage(i,0,0,c.width,c.height);let p=d.getImageData(0,0,c.width,c.height);for(let h=0;hr.executor?r:r.model):s=[e.models[n]];for(let r of s){let a=[],o=r==null?void 0:r.executor;if(o)for(let l of Object.values(o.graph.nodes)){let u=l.op.toLowerCase();a.includes(u)||a.push(u)}let i=[];for(let l of a)!t.includes(l)&&!e.env.kernels.includes(l)&&!e.env.kernels.includes(l.replace("_",""))&&!e.env.kernels.includes(l.replace("native",""))&&!e.env.kernels.includes(l.replace("v2",""))&&i.push(l);!o&&e.config.debug&&ce("model executor not found:",n),i.length>0&&e.config.debug&&ce("model validation:",n,i)}}}var Tle=e=>{let t=(d,p)=>Math.atan2(d[1]-p[1],d[0]-p[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],s=1,r=e.mesh[33][2]>e.mesh[263][2],a=r?e.mesh[473]:e.mesh[468],o=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(o[0]-a[0])/i[0]-n[0],s*(a[1]-o[1])/i[1]-n[1]],u=Math.sqrt(l[0]**2+l[1]**2);return u=Math.min(u,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:u}},Nle=(e,t)=>{let n=g=>{let A=Math.sqrt(g[0]*g[0]+g[1]*g[1]+g[2]*g[2]);return g[0]/=A,g[1]/=A,g[2]/=A,g},s=(g,A)=>{let y=g[0]-A[0],x=g[1]-A[1],b=g[2]-A[2];return[y,x,b]},r=(g,A)=>{let y=g[1]*A[2]-g[2]*A[1],x=g[2]*A[0]-g[0]*A[2],b=g[0]*A[1]-g[1]*A[0];return[y,x,b]},a=g=>{let[A,y,x,b,v,k,S,C,D]=g,O,E,R;return b<1?b>-1?(R=Math.asin(b),E=Math.atan2(-S,A),O=Math.atan2(-k,v)):(R=-Math.PI/2,E=-Math.atan2(C,D),O=0):(R=Math.PI/2,E=Math.atan2(C,D),O=0),isNaN(O)&&(O=0),isNaN(E)&&(E=0),isNaN(R)&&(R=0),{pitch:2*-O,yaw:2*-E,roll:2*-R}},o=g=>{let A=(x,b,v,k)=>Math.atan2(k-b,v-x);return{pitch:A(g[10][1],g[10][2],g[152][1],g[152][2]),yaw:A(g[33][0],g[33][2],g[263][0],g[263][2]),roll:A(g[33][0],g[33][1],g[263][0],g[263][1])}},i=e.meshRaw;if(!i||i.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let l=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,u=[i[10],i[152],i[234],i[454]].map(g=>[g[0]*t[0]/l,g[1]*t[1]/l,g[2]]),c=n(s(u[1],u[0])),d=n(s(u[3],u[2])),p=n(r(d,c));d=r(c,p);let h=[d[0],d[1],d[2],c[0],c[1],c[2],p[0],p[1],p[2]],f=a(h),m=i.length===478?Tle(e):{bearing:0,strength:0};return{angle:f,matrix:h,gaze:m}},wx=async(e,t)=>{var d,p,h,f,m,g;let n,s,r,a,o,i,l,u=[];e.state="run:face",n=Ze();let c=await y8(t,e.config);if(e.performance.face=Math.trunc(Ze()-n),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let A=0;A{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),a=e[n].keypoints.find(l=>l.part==="nose");a&&s&&r&&s.position.yl.part==="leftShoulder"),i=e[n].keypoints.find(l=>l.part==="rightShoulder");o&&i&&t.push({body:n,gesture:`leaning ${o.position.y>i.position.y?"left":"right"}`})}return t},aI=e=>{if(!e)return[];let t=[];for(let n=0;n0){let s=e[n].mesh[33][2]-e[n].mesh[263][2];Math.abs(s)<10?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${s<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let o=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));o>10&&t.push({face:n,gesture:`mouth ${Math.trunc(o)}% open`});let i=e[n].mesh[152][2];Math.abs(i)>10&&t.push({face:n,gesture:`head ${i<0?"up":"down"}`})}return t},oI=e=>{if(!e)return[];let t=[];for(let n=0;n.06||d>.06)&&(u=!1),p>.06&&t.push({iris:n,gesture:"looking right"}),d>.06&&t.push({iris:n,gesture:"looking left"});let h=Math.abs(e[n].mesh[145][1]-e[n].annotations.rightEyeIris[0][1])/e[n].box[3],f=Math.abs(e[n].mesh[374][1]-e[n].annotations.leftEyeIris[0][1])/e[n].box[3];(f<.01||h<.01||f>.022||h>.022)&&(u=!1),(f<.01||h<.01)&&t.push({iris:n,gesture:"looking down"}),(f>.022||h>.022)&&t.push({iris:n,gesture:"looking up"}),u&&t.push({iris:n,gesture:"looking center"})}return t},iI=e=>{if(!e)return[];let t=[];for(let n=0;n0){let a=s.reduce((i,l)=>i.position[2]i.position[1]{if(e&&e.getContext)return e.getContext("2d");throw new Error("Human: Invalid Canvas")},S0=e=>Math.round(e*180/Math.PI);function kx(e,t,n,s=0,r){e.fillStyle=r.useDepth&&s?`rgba(${127.5+2*s}, ${127.5-2*s}, 255, 0.3)`:r.color,e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function $d(e,t,n,s,r,a){if(e.beginPath(),a.useCurves){let o=(t+t+s)/2,i=(n+n+r)/2;e.ellipse(o,i,s/2,r/2,0,0,2*Math.PI)}else e.lineWidth=a.lineWidth,e.moveTo(t+a.roundRect,n),e.lineTo(t+s-a.roundRect,n),e.quadraticCurveTo(t+s,n,t+s,n+a.roundRect),e.lineTo(t+s,n+r-a.roundRect),e.quadraticCurveTo(t+s,n+r,t+s-a.roundRect,n+r),e.lineTo(t+a.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-a.roundRect),e.lineTo(t,n+a.roundRect),e.quadraticCurveTo(t,n,t+a.roundRect,n),e.closePath();e.stroke()}function Ix(e,t=[],n){if(!(t===void 0||t.length===0)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let s of t){let r=s[2]||0;e.strokeStyle=n.useDepth&&r?`rgba(${127.5+2*r}, ${127.5-2*r}, 255, 0.3)`:n.color,e.fillStyle=n.useDepth&&r?`rgba(${127.5+2*r}, ${127.5-2*r}, 255, 0.3)`:n.color,e.lineTo(s[0],Math.round(s[1]))}e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function Od(e,t=[],n){if(!(t===void 0||t.length===0)){if(!n.useCurves||t.length<=2){Ix(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let s=0;s1&&l[1].length>0){let u=i[1]>0?`#${i[1]}`:"",c=`${i[0]} ${u}: ${l[1]}`;s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText(c,8,2+a*s.lineHeight)),r.fillStyle=s.labelColor,r.fillText(c,6,0+a*s.lineHeight),a+=1}}}async function Cx(e,t,n){var a,o,i,l;let s=gn(zr,n);if(!t||!e)return;let r=gi(e);for(let u of t){r.font=s.font,r.strokeStyle=s.color,r.fillStyle=s.color,s.drawBoxes&&$d(r,u.box[0],u.box[1],u.box[2],u.box[3],s);let c=[];if(c.push(`face: ${Math.trunc(100*u.score)}%`),u.genderScore&&c.push(`${u.gender||""} ${Math.trunc(100*u.genderScore)}%`),u.age&&c.push(`age: ${u.age||""}`),u.iris&&c.push(`distance: ${u.iris}`),u.emotion&&u.emotion.length>0){let d=u.emotion.map(p=>`${Math.trunc(100*p.score)}% ${p.emotion}`);d.length>3&&(d.length=3),c.push(d.join(" "))}u.rotation&&u.rotation.angle&&u.rotation.gaze&&(u.rotation.angle.roll&&c.push(`roll: ${S0(u.rotation.angle.roll)}\xB0 yaw:${S0(u.rotation.angle.yaw)}\xB0 pitch:${S0(u.rotation.angle.pitch)}\xB0`),u.rotation.gaze.bearing&&c.push(`gaze: ${S0(u.rotation.gaze.bearing)}\xB0`)),c.length===0&&c.push("face"),r.fillStyle=s.color;for(let d=c.length-1;d>=0;d--){let p=Math.max(u.box[0],0),h=d*s.lineHeight+u.box[1];s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText(c[d],p+5,h+16)),r.fillStyle=s.labelColor,r.fillText(c[d],p+4,h+15)}if(r.lineWidth=1,u.mesh&&u.mesh.length>0){if(s.drawPoints)for(let d of u.mesh)kx(r,d[0],d[1],d[2],s);if(s.drawPolygons){r.lineWidth=1;for(let d=0;du.mesh[h]);Ix(r,p,s)}if(u.annotations&&u.annotations.leftEyeIris){r.strokeStyle=s.useDepth?"rgba(255, 200, 255, 0.3)":s.color,r.beginPath();let d=Math.abs(u.annotations.leftEyeIris[3][0]-u.annotations.leftEyeIris[1][0])/2,p=Math.abs(u.annotations.leftEyeIris[4][1]-u.annotations.leftEyeIris[2][1])/2;r.ellipse(u.annotations.leftEyeIris[0][0],u.annotations.leftEyeIris[0][1],d,p,0,0,2*Math.PI),r.stroke(),s.fillPolygons&&(r.fillStyle=s.useDepth?"rgba(255, 255, 200, 0.3)":s.color,r.fill())}if(u.annotations&&u.annotations.rightEyeIris){r.strokeStyle=s.useDepth?"rgba(255, 200, 255, 0.3)":s.color,r.beginPath();let d=Math.abs(u.annotations.rightEyeIris[3][0]-u.annotations.rightEyeIris[1][0])/2,p=Math.abs(u.annotations.rightEyeIris[4][1]-u.annotations.rightEyeIris[2][1])/2;r.ellipse(u.annotations.rightEyeIris[0][0],u.annotations.rightEyeIris[0][1],d,p,0,0,2*Math.PI),r.stroke(),s.fillPolygons&&(r.fillStyle=s.useDepth?"rgba(255, 255, 200, 0.3)":s.color,r.fill())}if(s.drawGaze&&((o=(a=u.rotation)==null?void 0:a.gaze)==null?void 0:o.strength)&&((l=(i=u.rotation)==null?void 0:i.gaze)==null?void 0:l.bearing)&&u.annotations.leftEyeIris&&u.annotations.rightEyeIris&&u.annotations.leftEyeIris[0]&&u.annotations.rightEyeIris[0]){r.strokeStyle="pink",r.beginPath();let d=[u.annotations.leftEyeIris[0][0]+Math.sin(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[3],u.annotations.leftEyeIris[0][1]+Math.cos(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[2]];r.moveTo(u.annotations.leftEyeIris[0][0],u.annotations.leftEyeIris[0][1]),r.lineTo(d[0],d[1]);let p=[u.annotations.rightEyeIris[0][0]+Math.sin(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[3],u.annotations.rightEyeIris[0][1]+Math.cos(u.rotation.gaze.bearing)*u.rotation.gaze.strength*u.box[2]];r.moveTo(u.annotations.rightEyeIris[0][0],u.annotations.rightEyeIris[0][1]),r.lineTo(p[0],p[1]),r.stroke()}}}}}async function Tx(e,t,n){var a;let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round";for(let o=0;ou.part==="leftShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightShoulder"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="rightShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftShoulder"),i&&l.push([i.position[0],i.position[1]]),l.length===4&&Ix(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="leftHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftKnee"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftAnkle"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftHeel"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftFoot"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="rightHip"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightKnee"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightAnkle"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightHeel"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightFoot"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="leftShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftElbow"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftWrist"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="leftPalm"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s),l.length=0,i=t[o].keypoints.find(u=>u.part==="rightShoulder"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightElbow"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightWrist"),i&&l.push([i.position[0],i.position[1]]),i=t[o].keypoints.find(u=>u.part==="rightPalm"),i&&l.push([i.position[0],i.position[1]]),Od(r,l,s)}}}async function Nx(e,t,n){let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round",r.font=s.font;for(let a of t){if(s.drawBoxes&&(r.strokeStyle=s.color,r.fillStyle=s.color,$d(r,a.box[0],a.box[1],a.box[2],a.box[3],s),s.drawLabels&&(s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText("hand",a.box[0]+3,1+a.box[1]+s.lineHeight,a.box[2])),r.fillStyle=s.labelColor,r.fillText("hand",a.box[0]+2,0+a.box[1]+s.lineHeight,a.box[2])),r.stroke()),s.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let o of a.keypoints)r.fillStyle=s.useDepth?`rgba(${127.5+2*o[2]}, ${127.5-2*o[2]}, 255, 0.5)`:s.color,kx(r,o[0],o[1],0,s);if(s.drawLabels){let o=(i,l)=>{!i||(r.fillStyle=s.useDepth?`rgba(${127.5+2*i[i.length-1][2]}, ${127.5-2*i[i.length-1][2]}, 255, 0.5)`:s.color,r.fillText(l,i[i.length-1][0]+4,i[i.length-1][1]+4))};r.font=s.font,o(a.annotations.index,"index"),o(a.annotations.middle,"middle"),o(a.annotations.ring,"ring"),o(a.annotations.pinky,"pinky"),o(a.annotations.thumb,"thumb"),o(a.annotations.palm,"palm")}if(s.drawPolygons){let o=i=>{if(!!i)for(let l=0;l0?l-1:0][0],i[l>0?l-1:0][1]),r.lineTo(i[l][0],i[l][1]),r.stroke()};r.lineWidth=s.lineWidth,o(a.annotations.index),o(a.annotations.middle),o(a.annotations.ring),o(a.annotations.pinky),o(a.annotations.thumb)}}}async function Ex(e,t,n){let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round",r.font=s.font;for(let a of t)if(s.drawBoxes){if(r.strokeStyle=s.color,r.fillStyle=s.color,$d(r,a.box[0],a.box[1],a.box[2],a.box[3],s),s.drawLabels){let o=`${a.label} ${Math.round(100*a.score)}%`;s.shadowColor&&s.shadowColor!==""&&(r.fillStyle=s.shadowColor,r.fillText(o,a.box[0]+3,1+a.box[1]+s.lineHeight,a.box[2])),r.fillStyle=s.labelColor,r.fillText(o,a.box[0]+2,0+a.box[1]+s.lineHeight,a.box[2])}r.stroke()}}async function lI(e,t,n){let s=gn(zr,n);if(!t||!e)return;let r=gi(e);r.lineJoin="round",r.font=s.font;for(let a=0;aP.box[0]&&S.box[0]P.box[1]&&S.box[1]+S.box[3]C.body.box[0]&&P.box[0]+P.box[2]C.body.box[1]&&P.box[1]+P.box[3]C.body.box[0]&&P.box[1]+P.box[3]>C.body.box[1]&&P.box[1]+P.box[3]{P&&P.length===4&&(D.push(P[0],P[0]+P[2]),O.push(P[1],P[1]+P[3]))};E((A=C.face)==null?void 0:A.box),E((y=C.body)==null?void 0:y.box),E((b=(x=C.hands)==null?void 0:x.left)==null?void 0:b.box),E((k=(v=C.hands)==null?void 0:v.right)==null?void 0:k.box);let R=Math.min(...D),T=Math.min(...O);C.box=[R,T,Math.max(...D)-R,Math.max(...O)-T],r&&r[1]&&r[2]&&(C.boxRaw=[C.box[0]/r[2],C.box[1]/r[1],C.box[2]/r[2],C.box[3]/r[1]]),o.push(C)}return o}var Pe={face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};function pI(e){var s,r,a,o,i,l,u,c,d,p,h,f,m,g,A,y,x,b,v,k,S;if(!e)return{face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};let t=Date.now()-e.timestamp,n=t<1e3?8-Math.log(t+1):1;if(Pe.canvas=e.canvas,!Pe.body||e.body.length!==Pe.body.length)Pe.body=JSON.parse(JSON.stringify(e.body));else for(let C=0;C((n-1)*Pe.body[C].box[T]+R)/n),O=e.body[C].boxRaw.map((R,T)=>((n-1)*Pe.body[C].boxRaw[T]+R)/n),E=e.body[C].keypoints.map((R,T)=>({score:R.score,part:R.part,position:[Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].position[0]+R.position[0])/n:R.position[0],Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].position[1]+R.position[1])/n:R.position[1]],positionRaw:[Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].positionRaw[0]+R.positionRaw[0])/n:R.position[0],Pe.body[C].keypoints[T]?((n-1)*Pe.body[C].keypoints[T].positionRaw[1]+R.positionRaw[1])/n:R.position[1]]}));Pe.body[C]={...e.body[C],box:D,boxRaw:O,keypoints:E}}if(!Pe.hand||e.hand.length!==Pe.hand.length)Pe.hand=JSON.parse(JSON.stringify(e.hand));else for(let C=0;C((n-1)*Pe.hand[C].box[U]+P)/n),O=e.hand[C].boxRaw.map((P,U)=>((n-1)*Pe.hand[C].boxRaw[U]+P)/n),E=e.hand[C].keypoints?e.hand[C].keypoints.map((P,U)=>P.map((j,q)=>((n-1)*Pe.hand[C].keypoints[U][q]+j)/n)):[],R=Object.keys(e.hand[C].annotations),T={};for(let P of R)T[P]=e.hand[C].annotations[P].map((U,j)=>U.map((q,X)=>((n-1)*Pe.hand[C].annotations[P][j][X]+q)/n));Pe.hand[C]={...e.hand[C],box:D,boxRaw:O,keypoints:E,annotations:T}}if(!Pe.face||e.face.length!==Pe.face.length)Pe.face=JSON.parse(JSON.stringify(e.face));else for(let C=0;C((n-1)*Pe.face[C].box[T]+R)/n),O=e.face[C].boxRaw.map((R,T)=>((n-1)*Pe.face[C].boxRaw[T]+R)/n),E={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};E.matrix=(s=e.face[C].rotation)==null?void 0:s.matrix,E.angle={roll:((n-1)*(((a=(r=Pe.face[C].rotation)==null?void 0:r.angle)==null?void 0:a.roll)||0)+(((i=(o=e.face[C].rotation)==null?void 0:o.angle)==null?void 0:i.roll)||0))/n,yaw:((n-1)*(((u=(l=Pe.face[C].rotation)==null?void 0:l.angle)==null?void 0:u.yaw)||0)+(((d=(c=e.face[C].rotation)==null?void 0:c.angle)==null?void 0:d.yaw)||0))/n,pitch:((n-1)*(((h=(p=Pe.face[C].rotation)==null?void 0:p.angle)==null?void 0:h.pitch)||0)+(((m=(f=e.face[C].rotation)==null?void 0:f.angle)==null?void 0:m.pitch)||0))/n},E.gaze={bearing:((n-1)*(((A=(g=Pe.face[C].rotation)==null?void 0:g.gaze)==null?void 0:A.bearing)||0)+(((x=(y=e.face[C].rotation)==null?void 0:y.gaze)==null?void 0:x.bearing)||0))/n,strength:((n-1)*(((v=(b=Pe.face[C].rotation)==null?void 0:b.gaze)==null?void 0:v.strength)||0)+(((S=(k=e.face[C].rotation)==null?void 0:k.gaze)==null?void 0:S.strength)||0))/n},Pe.face[C]={...e.face[C],rotation:E,box:D,boxRaw:O}}if(!Pe.object||e.object.length!==Pe.object.length)Pe.object=JSON.parse(JSON.stringify(e.object));else for(let C=0;C((n-1)*Pe.object[C].box[R]+E)/n),O=e.object[C].boxRaw.map((E,R)=>((n-1)*Pe.object[C].boxRaw[R]+E)/n);Pe.object[C]={...e.object[C],box:D,boxRaw:O}}if(e.persons){let C=e.persons;if(!Pe.persons||C.length!==Pe.persons.length)Pe.persons=JSON.parse(JSON.stringify(C));else for(let D=0;D((n-1)*Pe.persons[D].box[E]+O)/n)}return e.gesture&&(Pe.gesture=e.gesture),e.performance&&(Pe.performance=e.performance),Pe}var ks={name:"humangl",priority:99,canvas:null,gl:null,width:1024,height:1024,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function Ele(){let e=ks.gl;!e||(ks.extensions=e.getSupportedExtensions())}function hI(){var e;if(!Vg(ks.name)){try{ks.canvas=mr(100,100)}catch(t){ce("error: cannot create canvas:",t);return}try{ks.gl=(e=ks.canvas)==null?void 0:e.getContext("webgl2",ks.webGLattr)}catch(t){ce("error: cannot get WebGL2 context:",t);return}try{Mf(2,ks.gl)}catch(t){ce("error: cannot set WebGL2 context:",t);return}try{let t=new jf(ks.gl);Wl(ks.name,()=>new bu(t),ks.priority)}catch(t){ce("error: cannot register WebGL backend:",t);return}try{Yr("webgl").forEach(n=>{let s={...n,backendName:ks.name};Do(s)})}catch(t){ce("error: cannot update WebGL backend registration:",t);return}try{er.set("WEBGL_VERSION",2)}catch(t){ce("error: cannot set WebGL backend flags:",t);return}Ele(),ce("backend registered:",ks.name)}}async function Rx(e){if(e.initial||e.config.backend&&e.config.backend.length>0&&Bl()!==e.config.backend){let t=Ze();if(e.state="backend",e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&ce("running inside web worker"),xe.browser&&e.config.backend==="tensorflow"&&(ce("override: backend set to tensorflow while running in browser"),e.config.backend="humangl"),xe.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(ce(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),xe.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")ce("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let s=await navigator.gpu.requestAdapter();e.config.debug&&ce("enumerated webgpu adapter:",s)}e.config.backend==="humangl"&&hI();let n=Object.keys(Ns().registryFactory);if(e.config.debug&&ce("available backends:",n),n.includes(e.config.backend)||(ce(`error: backend ${e.config.backend} not found in registry`),e.config.backend=xe.node?"tensorflow":"humangl",ce(`override: setting backend ${e.config.backend}`)),e.config.debug&&ce("setting backend:",e.config.backend),e.config.backend==="wasm"){if(e.config.debug&&ce("wasm path:",e.config.wasmPath),typeof(pi==null?void 0:pi.setWasmPaths)!="undefined")await n8(e.config.wasmPath);else throw new Error("Human: WASM backend is not loaded");let s=await Y().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await Y().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&ce(`wasm execution: ${s?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),e.config.debug&&!s&&ce("warning: wasm simd support is not enabled")}await Wg(e.config.backend);try{await Wg(e.config.backend),await ih()}catch(s){ce("error: cannot set backend:",e.config.backend,s)}}if(Bl()==="humangl"){er.set("CHECK_COMPUTATION_FOR_ERRORS",!1),er.set("WEBGL_CPU_FORWARD",!0),er.set("WEBGL_PACK_DEPTHWISECONV",!1),er.set("WEBGL_USE_SHAPES_UNIFORMS",!0),typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(ce("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),er.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0));let n=await zo().getGPGPUContext().gl;e.config.debug&&ce(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}ub(),await ih(),e.performance.backend=Math.trunc(Ze()-t),e.config.backend=Bl(),d0(),e.env=xe}}var Dx="2.2.1";var C0=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob diff --git a/dist/human.node-gpu.js b/dist/human.node-gpu.js index 170b4bbe..80d8d12f 100644 --- a/dist/human.node-gpu.js +++ b/dist/human.node-gpu.js @@ -11321,7 +11321,7 @@ async function check(instance) { } // package.json -var version = "2.2.0"; +var version = "2.2.1"; // src/sample.ts var face3 = ` diff --git a/dist/human.node-wasm.js b/dist/human.node-wasm.js index ae076bbc..dc18929b 100644 --- a/dist/human.node-wasm.js +++ b/dist/human.node-wasm.js @@ -11322,7 +11322,7 @@ async function check(instance) { } // package.json -var version = "2.2.0"; +var version = "2.2.1"; // src/sample.ts var face3 = ` diff --git a/dist/human.node.js b/dist/human.node.js index 7df6f01a..90784459 100644 --- a/dist/human.node.js +++ b/dist/human.node.js @@ -11321,7 +11321,7 @@ async function check(instance) { } // package.json -var version = "2.2.0"; +var version = "2.2.1"; // src/sample.ts var face3 = ` diff --git a/test/build.log b/test/build.log index d836b8b0..b1966daa 100644 --- a/test/build.log +++ b/test/build.log @@ -17501,3 +17501,27 @@ 2021-09-15 19:00:32 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":83,"errors":0,"warnings":0} 2021-09-15 19:00:32 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} 2021-09-15 19:00:32 INFO:  Done... +2021-09-16 10:46:28 INFO:  @vladmandic/human version 2.2.1 +2021-09-16 10:46:28 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0 +2021-09-16 10:46:28 INFO:  Application: {"name":"@vladmandic/human","version":"2.2.1"} +2021-09-16 10:46:28 INFO:  Environment: {"profile":"production","config":"build.json","tsconfig":true,"eslintrc":true,"git":true} +2021-09-16 10:46:28 INFO:  Toolchain: {"build":"0.4.1","esbuild":"0.12.28","typescript":"4.4.3","typedoc":"0.21.9","eslint":"7.32.0"} +2021-09-16 10:46:28 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2021-09-16 10:46:28 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} +2021-09-16 10:46:28 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1416} +2021-09-16 10:46:28 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":50,"inputBytes":476228,"outputBytes":404632} +2021-09-16 10:46:28 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1424} +2021-09-16 10:46:28 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":50,"inputBytes":476236,"outputBytes":404636} +2021-09-16 10:46:28 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1491} +2021-09-16 10:46:28 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":50,"inputBytes":476303,"outputBytes":404708} +2021-09-16 10:46:28 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":1631} +2021-09-16 10:46:28 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":3088,"outputBytes":793} +2021-09-16 10:46:28 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":50,"inputBytes":475605,"outputBytes":405887} +2021-09-16 10:46:29 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":8,"inputBytes":3088,"outputBytes":2376809} +2021-09-16 10:46:29 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":50,"inputBytes":2851621,"outputBytes":1407073} +2021-09-16 10:46:30 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":50,"inputBytes":2851621,"outputBytes":2609826} +2021-09-16 10:46:45 STATE: Typings: {"input":"src/human.ts","output":"types","files":94} +2021-09-16 10:46:50 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":29,"index":true} +2021-09-16 10:47:16 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":83,"errors":0,"warnings":0} +2021-09-16 10:47:16 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2021-09-16 10:47:16 INFO:  Done... diff --git a/test/test.log b/test/test.log index d11ed3a6..7f7d8954 100644 --- a/test/test.log +++ b/test/test.log @@ -1,291 +1,291 @@ -2021-09-15 18:57:26 INFO:  @vladmandic/human version 2.2.0 -2021-09-15 18:57:26 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0 -2021-09-15 18:57:26 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] -2021-09-15 18:57:26 INFO:  -2021-09-15 18:57:26 INFO:  test-node.js start -2021-09-15 18:57:27 STATE: test-node.js passed: create human -2021-09-15 18:57:27 INFO:  test-node.js human version: 2.2.0 -2021-09-15 18:57:27 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.5.0 -2021-09-15 18:57:27 INFO:  test-node.js tfjs version: 3.9.0 -2021-09-15 18:57:27 STATE: test-node.js passed: set backend: tensorflow -2021-09-15 18:57:27 STATE: test-node.js tensors 573 -2021-09-15 18:57:27 STATE: test-node.js passed: load models -2021-09-15 18:57:27 STATE: test-node.js result: defined models: 14 loaded models: 3 -2021-09-15 18:57:27 STATE: test-node.js passed: warmup: none default -2021-09-15 18:57:28 STATE: test-node.js event: image -2021-09-15 18:57:28 STATE: test-node.js event: detect -2021-09-15 18:57:28 STATE: test-node.js event: warmup -2021-09-15 18:57:28 STATE: test-node.js passed: warmup: face default -2021-09-15 18:57:28 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {} -2021-09-15 18:57:28 DATA:  test-node.js result: performance: load: 129 total: 530 -2021-09-15 18:57:28 STATE: test-node.js event: image -2021-09-15 18:57:28 STATE: test-node.js event: detect -2021-09-15 18:57:28 STATE: test-node.js event: warmup -2021-09-15 18:57:28 STATE: test-node.js passed: warmup: body default -2021-09-15 18:57:28 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} -2021-09-15 18:57:28 DATA:  test-node.js result: performance: load: 129 total: 327 -2021-09-15 18:57:28 INFO:  test-node.js test default -2021-09-15 18:57:29 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:29 STATE: test-node.js event: image -2021-09-15 18:57:29 STATE: test-node.js event: detect -2021-09-15 18:57:29 STATE: test-node.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:57:30 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} -2021-09-15 18:57:30 DATA:  test-node.js result: performance: load: 129 total: 264 -2021-09-15 18:57:30 INFO:  test-node.js test body variants -2021-09-15 18:57:30 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:30 STATE: test-node.js event: image -2021-09-15 18:57:30 STATE: test-node.js event: detect -2021-09-15 18:57:30 STATE: test-node.js passed: detect: samples/ai-body.jpg posenet -2021-09-15 18:57:30 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} -2021-09-15 18:57:30 DATA:  test-node.js result: performance: load: 129 total: 174 -2021-09-15 18:57:31 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:31 STATE: test-node.js event: image -2021-09-15 18:57:31 STATE: test-node.js event: detect -2021-09-15 18:57:31 STATE: test-node.js passed: detect: samples/ai-body.jpg movenet -2021-09-15 18:57:31 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} -2021-09-15 18:57:31 DATA:  test-node.js result: performance: load: 129 total: 140 -2021-09-15 18:57:32 STATE: test-node.js event: image -2021-09-15 18:57:32 STATE: test-node.js event: detect -2021-09-15 18:57:32 STATE: test-node.js passed: detect: random default -2021-09-15 18:57:32 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2021-09-15 18:57:32 DATA:  test-node.js result: performance: load: 129 total: 79 -2021-09-15 18:57:32 INFO:  test-node.js test: first instance -2021-09-15 18:57:32 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:32 STATE: test-node.js event: image -2021-09-15 18:57:32 STATE: test-node.js event: detect -2021-09-15 18:57:32 STATE: test-node.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:32 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} -2021-09-15 18:57:32 DATA:  test-node.js result: performance: load: 129 total: 343 -2021-09-15 18:57:32 INFO:  test-node.js test: second instance -2021-09-15 18:57:33 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:33 STATE: test-node.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:33 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {"score":0.69,"keypoints":10} -2021-09-15 18:57:33 DATA:  test-node.js result: performance: load: 62 total: 297 -2021-09-15 18:57:33 INFO:  test-node.js test: concurrent -2021-09-15 18:57:33 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] -2021-09-15 18:57:33 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] -2021-09-15 18:57:34 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:35 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:35 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:35 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:35 STATE: test-node.js event: image -2021-09-15 18:57:35 STATE: test-node.js event: image -2021-09-15 18:57:35 STATE: test-node.js event: image -2021-09-15 18:57:36 STATE: test-node.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:57:36 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 0 person: 0 {} {} {"score":0.69,"keypoints":10} -2021-09-15 18:57:36 DATA:  test-node.js result: performance: load: 62 total: 528 -2021-09-15 18:57:36 STATE: test-node.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:36 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {"score":0.69,"keypoints":10} -2021-09-15 18:57:36 DATA:  test-node.js result: performance: load: 62 total: 609 -2021-09-15 18:57:36 STATE: test-node.js passed: detect: samples/ai-face.jpg default -2021-09-15 18:57:36 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 5 object: 0 person: 1 {"score":0.42,"age":29.5,"gender":"female"} {} {"score":0.47,"keypoints":4} -2021-09-15 18:57:36 DATA:  test-node.js result: performance: load: 62 total: 720 -2021-09-15 18:57:36 STATE: test-node.js event: detect -2021-09-15 18:57:36 STATE: test-node.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:57:36 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2021-09-15 18:57:36 DATA:  test-node.js result: performance: load: 129 total: 1067 -2021-09-15 18:57:36 STATE: test-node.js event: detect -2021-09-15 18:57:36 STATE: test-node.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:36 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} -2021-09-15 18:57:36 DATA:  test-node.js result: performance: load: 129 total: 1292 -2021-09-15 18:57:37 STATE: test-node.js event: detect -2021-09-15 18:57:37 STATE: test-node.js passed: detect: samples/ai-face.jpg default -2021-09-15 18:57:37 DATA:  test-node.js result: face: 2 body: 0 hand: 0 gesture: 9 object: 0 person: 2 {"score":1,"age":23.6,"gender":"female"} {} {} -2021-09-15 18:57:37 DATA:  test-node.js result: performance: load: 129 total: 1371 -2021-09-15 18:57:37 STATE: test-node.js passeed: no memory leak -2021-09-15 18:57:37 INFO:  test-node.js events: {"image":10,"detect":10,"warmup":2} -2021-09-15 18:57:37 INFO:  test-node.js test complete: 9143 ms -2021-09-15 18:57:37 INFO:  -2021-09-15 18:57:37 INFO:  test-node-gpu.js start -2021-09-15 18:57:37 WARN:  test-node-gpu.js stderr: 2021-09-15 18:57:37.843949: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory -2021-09-15 18:57:37 WARN:  test-node-gpu.js stderr: 2021-09-15 18:57:37.996363: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory -2021-09-15 18:57:37 WARN:  test-node-gpu.js stderr: 2021-09-15 18:57:37.996421: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (wyse): /proc/driver/nvidia/version does not exist -2021-09-15 18:57:38 STATE: test-node-gpu.js passed: create human -2021-09-15 18:57:38 INFO:  test-node-gpu.js human version: 2.2.0 -2021-09-15 18:57:38 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.5.0 -2021-09-15 18:57:38 INFO:  test-node-gpu.js tfjs version: 3.9.0 -2021-09-15 18:57:38 STATE: test-node-gpu.js passed: set backend: tensorflow -2021-09-15 18:57:38 STATE: test-node-gpu.js tensors 1456 -2021-09-15 18:57:38 STATE: test-node-gpu.js passed: load models -2021-09-15 18:57:38 STATE: test-node-gpu.js result: defined models: 14 loaded models: 7 -2021-09-15 18:57:38 STATE: test-node-gpu.js passed: warmup: none default -2021-09-15 18:57:38 STATE: test-node-gpu.js event: image -2021-09-15 18:57:39 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:39 STATE: test-node-gpu.js event: warmup -2021-09-15 18:57:39 STATE: test-node-gpu.js passed: warmup: face default -2021-09-15 18:57:39 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} -2021-09-15 18:57:39 DATA:  test-node-gpu.js result: performance: load: 304 total: 1116 -2021-09-15 18:57:39 STATE: test-node-gpu.js event: image -2021-09-15 18:57:40 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:40 STATE: test-node-gpu.js event: warmup -2021-09-15 18:57:40 STATE: test-node-gpu.js passed: warmup: body default -2021-09-15 18:57:40 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2021-09-15 18:57:40 DATA:  test-node-gpu.js result: performance: load: 304 total: 1032 -2021-09-15 18:57:40 INFO:  test-node-gpu.js test default -2021-09-15 18:57:41 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:41 STATE: test-node-gpu.js event: image -2021-09-15 18:57:42 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:42 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:57:42 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2021-09-15 18:57:42 DATA:  test-node-gpu.js result: performance: load: 304 total: 601 -2021-09-15 18:57:42 INFO:  test-node-gpu.js test body variants -2021-09-15 18:57:42 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:42 STATE: test-node-gpu.js event: image -2021-09-15 18:57:43 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:43 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg posenet -2021-09-15 18:57:43 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.96,"keypoints":16} -2021-09-15 18:57:43 DATA:  test-node-gpu.js result: performance: load: 304 total: 295 -2021-09-15 18:57:44 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:44 STATE: test-node-gpu.js event: image -2021-09-15 18:57:44 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:44 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg movenet -2021-09-15 18:57:44 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2021-09-15 18:57:44 DATA:  test-node-gpu.js result: performance: load: 304 total: 191 -2021-09-15 18:57:44 STATE: test-node-gpu.js event: image -2021-09-15 18:57:44 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:44 STATE: test-node-gpu.js passed: detect: random default -2021-09-15 18:57:44 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 1 person: 0 {} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2021-09-15 18:57:44 DATA:  test-node-gpu.js result: performance: load: 304 total: 39 -2021-09-15 18:57:44 INFO:  test-node-gpu.js test: first instance -2021-09-15 18:57:44 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:44 STATE: test-node-gpu.js event: image -2021-09-15 18:57:44 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:44 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:44 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 1 person: 0 {} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} -2021-09-15 18:57:44 DATA:  test-node-gpu.js result: performance: load: 304 total: 71 -2021-09-15 18:57:44 INFO:  test-node-gpu.js test: second instance -2021-09-15 18:57:45 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:45 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:45 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} -2021-09-15 18:57:45 DATA:  test-node-gpu.js result: performance: load: 4 total: 293 -2021-09-15 18:57:45 INFO:  test-node-gpu.js test: concurrent -2021-09-15 18:57:45 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] -2021-09-15 18:57:45 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] -2021-09-15 18:57:46 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:47 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:57:47 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:47 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:57:47 STATE: test-node-gpu.js event: image -2021-09-15 18:57:47 STATE: test-node-gpu.js event: image -2021-09-15 18:57:47 STATE: test-node-gpu.js event: image -2021-09-15 18:57:49 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:57:49 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 1 person: 0 {} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} -2021-09-15 18:57:49 DATA:  test-node-gpu.js result: performance: load: 4 total: 1874 -2021-09-15 18:57:49 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default -2021-09-15 18:57:49 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 6 object: 1 person: 1 {"score":0.42,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} -2021-09-15 18:57:49 DATA:  test-node-gpu.js result: performance: load: 4 total: 1881 -2021-09-15 18:57:49 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:49 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} -2021-09-15 18:57:49 DATA:  test-node-gpu.js result: performance: load: 4 total: 1881 -2021-09-15 18:57:50 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:50 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:57:50 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 1 person: 0 {} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10} -2021-09-15 18:57:50 DATA:  test-node-gpu.js result: performance: load: 304 total: 2581 -2021-09-15 18:57:50 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:50 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:57:50 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} -2021-09-15 18:57:50 DATA:  test-node-gpu.js result: performance: load: 304 total: 2739 -2021-09-15 18:57:50 STATE: test-node-gpu.js event: detect -2021-09-15 18:57:50 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default -2021-09-15 18:57:50 DATA:  test-node-gpu.js result: face: 2 body: 1 hand: 0 gesture: 10 object: 1 person: 2 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10} -2021-09-15 18:57:50 DATA:  test-node-gpu.js result: performance: load: 304 total: 2831 -2021-09-15 18:57:50 STATE: test-node-gpu.js passeed: no memory leak -2021-09-15 18:57:50 INFO:  test-node-gpu.js events: {"image":10,"detect":10,"warmup":2} -2021-09-15 18:57:50 INFO:  test-node-gpu.js test complete: 12656 ms -2021-09-15 18:57:50 INFO:  -2021-09-15 18:57:50 INFO:  test-node-wasm.js start -2021-09-15 18:57:51 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/ -2021-09-15 18:57:51 STATE: test-node-wasm.js passed: create human -2021-09-15 18:57:51 INFO:  test-node-wasm.js human version: 2.2.0 -2021-09-15 18:57:51 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.5.0 -2021-09-15 18:57:51 INFO:  test-node-wasm.js tfjs version: 3.9.0 -2021-09-15 18:57:54 STATE: test-node-wasm.js passed: set backend: wasm -2021-09-15 18:57:54 STATE: test-node-wasm.js tensors 1189 -2021-09-15 18:57:54 STATE: test-node-wasm.js passed: load models -2021-09-15 18:57:54 STATE: test-node-wasm.js result: defined models: 14 loaded models: 6 -2021-09-15 18:57:54 STATE: test-node-wasm.js passed: warmup: none default -2021-09-15 18:57:55 STATE: test-node-wasm.js event: image -2021-09-15 18:57:55 STATE: test-node-wasm.js event: detect -2021-09-15 18:57:55 STATE: test-node-wasm.js event: warmup -2021-09-15 18:57:55 STATE: test-node-wasm.js passed: warmup: face default -2021-09-15 18:57:55 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {"score":0.47,"keypoints":4} -2021-09-15 18:57:55 DATA:  test-node-wasm.js result: performance: load: 2980 total: 1045 -2021-09-15 18:57:59 STATE: test-node-wasm.js event: image -2021-09-15 18:58:00 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:00 STATE: test-node-wasm.js event: warmup -2021-09-15 18:58:00 STATE: test-node-wasm.js passed: warmup: body default -2021-09-15 18:58:00 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:00 DATA:  test-node-wasm.js result: performance: load: 2980 total: 2636 -2021-09-15 18:58:00 INFO:  test-node-wasm.js test default -2021-09-15 18:58:01 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:58:03 STATE: test-node-wasm.js event: image -2021-09-15 18:58:04 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:04 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:58:04 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:04 DATA:  test-node-wasm.js result: performance: load: 2980 total: 2261 -2021-09-15 18:58:04 INFO:  test-node-wasm.js test body variants -2021-09-15 18:58:06 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:58:08 STATE: test-node-wasm.js event: image -2021-09-15 18:58:08 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:08 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg posenet -2021-09-15 18:58:08 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.96,"keypoints":16} -2021-09-15 18:58:08 DATA:  test-node-wasm.js result: performance: load: 2980 total: 1917 -2021-09-15 18:58:09 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:58:11 STATE: test-node-wasm.js event: image -2021-09-15 18:58:11 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:11 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg movenet -2021-09-15 18:58:11 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:11 DATA:  test-node-wasm.js result: performance: load: 2980 total: 1921 -2021-09-15 18:58:13 STATE: test-node-wasm.js event: image -2021-09-15 18:58:13 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:13 STATE: test-node-wasm.js passed: detect: random default -2021-09-15 18:58:13 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:13 DATA:  test-node-wasm.js result: performance: load: 2980 total: 1755 -2021-09-15 18:58:13 INFO:  test-node-wasm.js test: first instance -2021-09-15 18:58:14 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:58:15 STATE: test-node-wasm.js event: image -2021-09-15 18:58:16 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:16 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:58:16 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:16 DATA:  test-node-wasm.js result: performance: load: 2980 total: 1781 -2021-09-15 18:58:16 INFO:  test-node-wasm.js test: second instance -2021-09-15 18:58:16 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:58:18 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:58:18 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:18 DATA:  test-node-wasm.js result: performance: load: 8 total: 2331 -2021-09-15 18:58:18 INFO:  test-node-wasm.js test: concurrent -2021-09-15 18:58:19 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] -2021-09-15 18:58:19 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] -2021-09-15 18:58:20 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:58:22 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] -2021-09-15 18:58:22 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:58:23 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] -2021-09-15 18:58:25 STATE: test-node-wasm.js event: image -2021-09-15 18:58:28 STATE: test-node-wasm.js event: image -2021-09-15 18:58:31 STATE: test-node-wasm.js event: image -2021-09-15 18:58:33 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: performance: load: 8 total: 10469 -2021-09-15 18:58:33 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: performance: load: 8 total: 10469 -2021-09-15 18:58:33 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:33 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:33 STATE: test-node-wasm.js event: detect -2021-09-15 18:58:33 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: performance: load: 2980 total: 10471 -2021-09-15 18:58:33 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: performance: load: 2980 total: 10471 -2021-09-15 18:58:33 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: performance: load: 2980 total: 10471 -2021-09-15 18:58:33 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} -2021-09-15 18:58:33 DATA:  test-node-wasm.js result: performance: load: 8 total: 10471 -2021-09-15 18:58:33 STATE: test-node-wasm.js passeed: no memory leak -2021-09-15 18:58:33 INFO:  test-node-wasm.js events: {"image":10,"detect":10,"warmup":2} -2021-09-15 18:58:33 INFO:  test-node-wasm.js test complete: 42154 ms -2021-09-15 18:58:33 INFO:  -2021-09-15 18:58:33 INFO:  status: {"passed":88,"failed":0} +2021-09-16 10:47:21 INFO:  @vladmandic/human version 2.2.1 +2021-09-16 10:47:21 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0 +2021-09-16 10:47:21 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] +2021-09-16 10:47:21 INFO:  +2021-09-16 10:47:21 INFO:  test-node.js start +2021-09-16 10:47:22 STATE: test-node.js passed: create human +2021-09-16 10:47:22 INFO:  test-node.js human version: 2.2.1 +2021-09-16 10:47:22 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.5.0 +2021-09-16 10:47:22 INFO:  test-node.js tfjs version: 3.9.0 +2021-09-16 10:47:22 STATE: test-node.js passed: set backend: tensorflow +2021-09-16 10:47:22 STATE: test-node.js tensors 573 +2021-09-16 10:47:22 STATE: test-node.js passed: load models +2021-09-16 10:47:22 STATE: test-node.js result: defined models: 14 loaded models: 3 +2021-09-16 10:47:22 STATE: test-node.js passed: warmup: none default +2021-09-16 10:47:22 STATE: test-node.js event: image +2021-09-16 10:47:23 STATE: test-node.js event: detect +2021-09-16 10:47:23 STATE: test-node.js event: warmup +2021-09-16 10:47:23 STATE: test-node.js passed: warmup: face default +2021-09-16 10:47:23 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {} +2021-09-16 10:47:23 DATA:  test-node.js result: performance: load: 164 total: 515 +2021-09-16 10:47:23 STATE: test-node.js event: image +2021-09-16 10:47:23 STATE: test-node.js event: detect +2021-09-16 10:47:23 STATE: test-node.js event: warmup +2021-09-16 10:47:23 STATE: test-node.js passed: warmup: body default +2021-09-16 10:47:23 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} +2021-09-16 10:47:23 DATA:  test-node.js result: performance: load: 164 total: 323 +2021-09-16 10:47:23 INFO:  test-node.js test default +2021-09-16 10:47:24 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:24 STATE: test-node.js event: image +2021-09-16 10:47:24 STATE: test-node.js event: detect +2021-09-16 10:47:24 STATE: test-node.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:47:24 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} +2021-09-16 10:47:24 DATA:  test-node.js result: performance: load: 164 total: 266 +2021-09-16 10:47:24 INFO:  test-node.js test body variants +2021-09-16 10:47:25 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:25 STATE: test-node.js event: image +2021-09-16 10:47:25 STATE: test-node.js event: detect +2021-09-16 10:47:25 STATE: test-node.js passed: detect: samples/ai-body.jpg posenet +2021-09-16 10:47:25 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} +2021-09-16 10:47:25 DATA:  test-node.js result: performance: load: 164 total: 150 +2021-09-16 10:47:26 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:26 STATE: test-node.js event: image +2021-09-16 10:47:26 STATE: test-node.js event: detect +2021-09-16 10:47:26 STATE: test-node.js passed: detect: samples/ai-body.jpg movenet +2021-09-16 10:47:26 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} +2021-09-16 10:47:26 DATA:  test-node.js result: performance: load: 164 total: 160 +2021-09-16 10:47:26 STATE: test-node.js event: image +2021-09-16 10:47:26 STATE: test-node.js event: detect +2021-09-16 10:47:26 STATE: test-node.js passed: detect: random default +2021-09-16 10:47:26 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2021-09-16 10:47:26 DATA:  test-node.js result: performance: load: 164 total: 61 +2021-09-16 10:47:26 INFO:  test-node.js test: first instance +2021-09-16 10:47:26 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:26 STATE: test-node.js event: image +2021-09-16 10:47:27 STATE: test-node.js event: detect +2021-09-16 10:47:27 STATE: test-node.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:27 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2021-09-16 10:47:27 DATA:  test-node.js result: performance: load: 164 total: 0 +2021-09-16 10:47:27 INFO:  test-node.js test: second instance +2021-09-16 10:47:27 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:27 STATE: test-node.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:27 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {"score":0.69,"keypoints":10} +2021-09-16 10:47:27 DATA:  test-node.js result: performance: load: 95 total: 316 +2021-09-16 10:47:27 INFO:  test-node.js test: concurrent +2021-09-16 10:47:27 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] +2021-09-16 10:47:27 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] +2021-09-16 10:47:28 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:29 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:29 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:29 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:29 STATE: test-node.js event: image +2021-09-16 10:47:29 STATE: test-node.js event: image +2021-09-16 10:47:29 STATE: test-node.js event: image +2021-09-16 10:47:30 STATE: test-node.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:47:30 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 0 person: 0 {} {} {"score":0.69,"keypoints":10} +2021-09-16 10:47:30 DATA:  test-node.js result: performance: load: 95 total: 553 +2021-09-16 10:47:30 STATE: test-node.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:30 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {"score":0.69,"keypoints":10} +2021-09-16 10:47:30 DATA:  test-node.js result: performance: load: 95 total: 639 +2021-09-16 10:47:30 STATE: test-node.js passed: detect: samples/ai-face.jpg default +2021-09-16 10:47:30 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 5 object: 0 person: 1 {"score":0.42,"age":29.5,"gender":"female"} {} {"score":0.47,"keypoints":4} +2021-09-16 10:47:30 DATA:  test-node.js result: performance: load: 95 total: 779 +2021-09-16 10:47:31 STATE: test-node.js event: detect +2021-09-16 10:47:31 STATE: test-node.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:47:31 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2021-09-16 10:47:31 DATA:  test-node.js result: performance: load: 164 total: 1130 +2021-09-16 10:47:31 STATE: test-node.js event: detect +2021-09-16 10:47:31 STATE: test-node.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:31 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} +2021-09-16 10:47:31 DATA:  test-node.js result: performance: load: 164 total: 1355 +2021-09-16 10:47:31 STATE: test-node.js event: detect +2021-09-16 10:47:31 STATE: test-node.js passed: detect: samples/ai-face.jpg default +2021-09-16 10:47:31 DATA:  test-node.js result: face: 2 body: 0 hand: 0 gesture: 9 object: 0 person: 2 {"score":1,"age":23.6,"gender":"female"} {} {} +2021-09-16 10:47:31 DATA:  test-node.js result: performance: load: 164 total: 1441 +2021-09-16 10:47:31 STATE: test-node.js passeed: no memory leak +2021-09-16 10:47:31 INFO:  test-node.js events: {"image":10,"detect":10,"warmup":2} +2021-09-16 10:47:31 INFO:  test-node.js test complete: 9300 ms +2021-09-16 10:47:31 INFO:  +2021-09-16 10:47:31 INFO:  test-node-gpu.js start +2021-09-16 10:47:32 WARN:  test-node-gpu.js stderr: 2021-09-16 10:47:32.032467: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory +2021-09-16 10:47:32 WARN:  test-node-gpu.js stderr: 2021-09-16 10:47:32.154267: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory +2021-09-16 10:47:32 WARN:  test-node-gpu.js stderr: 2021-09-16 10:47:32.154311: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (wyse): /proc/driver/nvidia/version does not exist +2021-09-16 10:47:32 STATE: test-node-gpu.js passed: create human +2021-09-16 10:47:32 INFO:  test-node-gpu.js human version: 2.2.1 +2021-09-16 10:47:32 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.5.0 +2021-09-16 10:47:32 INFO:  test-node-gpu.js tfjs version: 3.9.0 +2021-09-16 10:47:32 STATE: test-node-gpu.js passed: set backend: tensorflow +2021-09-16 10:47:32 STATE: test-node-gpu.js tensors 1456 +2021-09-16 10:47:32 STATE: test-node-gpu.js passed: load models +2021-09-16 10:47:32 STATE: test-node-gpu.js result: defined models: 14 loaded models: 7 +2021-09-16 10:47:32 STATE: test-node-gpu.js passed: warmup: none default +2021-09-16 10:47:32 STATE: test-node-gpu.js event: image +2021-09-16 10:47:33 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:33 STATE: test-node-gpu.js event: warmup +2021-09-16 10:47:33 STATE: test-node-gpu.js passed: warmup: face default +2021-09-16 10:47:33 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2021-09-16 10:47:33 DATA:  test-node-gpu.js result: performance: load: 298 total: 1079 +2021-09-16 10:47:33 STATE: test-node-gpu.js event: image +2021-09-16 10:47:34 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:34 STATE: test-node-gpu.js event: warmup +2021-09-16 10:47:34 STATE: test-node-gpu.js passed: warmup: body default +2021-09-16 10:47:34 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2021-09-16 10:47:34 DATA:  test-node-gpu.js result: performance: load: 298 total: 1053 +2021-09-16 10:47:34 INFO:  test-node-gpu.js test default +2021-09-16 10:47:35 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:35 STATE: test-node-gpu.js event: image +2021-09-16 10:47:36 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:36 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:47:36 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2021-09-16 10:47:36 DATA:  test-node-gpu.js result: performance: load: 298 total: 575 +2021-09-16 10:47:36 INFO:  test-node-gpu.js test body variants +2021-09-16 10:47:37 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:37 STATE: test-node-gpu.js event: image +2021-09-16 10:47:37 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:37 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg posenet +2021-09-16 10:47:37 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.96,"keypoints":16} +2021-09-16 10:47:37 DATA:  test-node-gpu.js result: performance: load: 298 total: 272 +2021-09-16 10:47:38 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:38 STATE: test-node-gpu.js event: image +2021-09-16 10:47:38 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:38 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg movenet +2021-09-16 10:47:38 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2021-09-16 10:47:38 DATA:  test-node-gpu.js result: performance: load: 298 total: 201 +2021-09-16 10:47:38 STATE: test-node-gpu.js event: image +2021-09-16 10:47:39 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:39 STATE: test-node-gpu.js passed: detect: random default +2021-09-16 10:47:39 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0} +2021-09-16 10:47:39 DATA:  test-node-gpu.js result: performance: load: 298 total: 562 +2021-09-16 10:47:39 INFO:  test-node-gpu.js test: first instance +2021-09-16 10:47:39 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:39 STATE: test-node-gpu.js event: image +2021-09-16 10:47:40 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:40 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:40 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} +2021-09-16 10:47:40 DATA:  test-node-gpu.js result: performance: load: 298 total: 811 +2021-09-16 10:47:40 INFO:  test-node-gpu.js test: second instance +2021-09-16 10:47:40 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:40 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:40 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} +2021-09-16 10:47:40 DATA:  test-node-gpu.js result: performance: load: 4 total: 368 +2021-09-16 10:47:40 INFO:  test-node-gpu.js test: concurrent +2021-09-16 10:47:40 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] +2021-09-16 10:47:40 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] +2021-09-16 10:47:41 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:42 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:47:43 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:43 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:47:43 STATE: test-node-gpu.js event: image +2021-09-16 10:47:43 STATE: test-node-gpu.js event: image +2021-09-16 10:47:43 STATE: test-node-gpu.js event: image +2021-09-16 10:47:45 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:47:45 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 1 person: 0 {} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} +2021-09-16 10:47:45 DATA:  test-node-gpu.js result: performance: load: 4 total: 1930 +2021-09-16 10:47:45 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default +2021-09-16 10:47:45 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 6 object: 1 person: 1 {"score":0.42,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} +2021-09-16 10:47:45 DATA:  test-node-gpu.js result: performance: load: 4 total: 1931 +2021-09-16 10:47:45 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:45 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} +2021-09-16 10:47:45 DATA:  test-node-gpu.js result: performance: load: 4 total: 1931 +2021-09-16 10:47:46 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:46 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:47:46 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 1 object: 1 person: 0 {} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10} +2021-09-16 10:47:46 DATA:  test-node-gpu.js result: performance: load: 298 total: 2664 +2021-09-16 10:47:46 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:46 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:47:46 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} +2021-09-16 10:47:46 DATA:  test-node-gpu.js result: performance: load: 298 total: 2818 +2021-09-16 10:47:46 STATE: test-node-gpu.js event: detect +2021-09-16 10:47:46 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default +2021-09-16 10:47:46 DATA:  test-node-gpu.js result: face: 2 body: 1 hand: 0 gesture: 10 object: 1 person: 2 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10} +2021-09-16 10:47:46 DATA:  test-node-gpu.js result: performance: load: 298 total: 2899 +2021-09-16 10:47:46 STATE: test-node-gpu.js passeed: no memory leak +2021-09-16 10:47:46 INFO:  test-node-gpu.js events: {"image":10,"detect":10,"warmup":2} +2021-09-16 10:47:46 INFO:  test-node-gpu.js test complete: 13989 ms +2021-09-16 10:47:46 INFO:  +2021-09-16 10:47:46 INFO:  test-node-wasm.js start +2021-09-16 10:47:48 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/ +2021-09-16 10:47:48 STATE: test-node-wasm.js passed: create human +2021-09-16 10:47:48 INFO:  test-node-wasm.js human version: 2.2.1 +2021-09-16 10:47:48 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.5.0 +2021-09-16 10:47:48 INFO:  test-node-wasm.js tfjs version: 3.9.0 +2021-09-16 10:47:51 STATE: test-node-wasm.js passed: set backend: wasm +2021-09-16 10:47:51 STATE: test-node-wasm.js tensors 1189 +2021-09-16 10:47:51 STATE: test-node-wasm.js passed: load models +2021-09-16 10:47:51 STATE: test-node-wasm.js result: defined models: 14 loaded models: 6 +2021-09-16 10:47:51 STATE: test-node-wasm.js passed: warmup: none default +2021-09-16 10:47:52 STATE: test-node-wasm.js event: image +2021-09-16 10:47:52 STATE: test-node-wasm.js event: detect +2021-09-16 10:47:52 STATE: test-node-wasm.js event: warmup +2021-09-16 10:47:52 STATE: test-node-wasm.js passed: warmup: face default +2021-09-16 10:47:52 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {"score":0.47,"keypoints":4} +2021-09-16 10:47:52 DATA:  test-node-wasm.js result: performance: load: 3568 total: 1057 +2021-09-16 10:47:56 STATE: test-node-wasm.js event: image +2021-09-16 10:47:57 STATE: test-node-wasm.js event: detect +2021-09-16 10:47:57 STATE: test-node-wasm.js event: warmup +2021-09-16 10:47:57 STATE: test-node-wasm.js passed: warmup: body default +2021-09-16 10:47:57 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:47:57 DATA:  test-node-wasm.js result: performance: load: 3568 total: 2712 +2021-09-16 10:47:57 INFO:  test-node-wasm.js test default +2021-09-16 10:47:59 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:48:00 STATE: test-node-wasm.js event: image +2021-09-16 10:48:01 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:01 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:48:01 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:01 DATA:  test-node-wasm.js result: performance: load: 3568 total: 2354 +2021-09-16 10:48:01 INFO:  test-node-wasm.js test body variants +2021-09-16 10:48:03 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:48:05 STATE: test-node-wasm.js event: image +2021-09-16 10:48:05 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:05 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg posenet +2021-09-16 10:48:05 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.96,"keypoints":16} +2021-09-16 10:48:05 DATA:  test-node-wasm.js result: performance: load: 3568 total: 1932 +2021-09-16 10:48:07 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:48:08 STATE: test-node-wasm.js event: image +2021-09-16 10:48:09 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:09 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg movenet +2021-09-16 10:48:09 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:09 DATA:  test-node-wasm.js result: performance: load: 3568 total: 1887 +2021-09-16 10:48:10 STATE: test-node-wasm.js event: image +2021-09-16 10:48:10 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:10 STATE: test-node-wasm.js passed: detect: random default +2021-09-16 10:48:10 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:10 DATA:  test-node-wasm.js result: performance: load: 3568 total: 1724 +2021-09-16 10:48:10 INFO:  test-node-wasm.js test: first instance +2021-09-16 10:48:11 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:48:13 STATE: test-node-wasm.js event: image +2021-09-16 10:48:13 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:13 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:48:13 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:13 DATA:  test-node-wasm.js result: performance: load: 3568 total: 1787 +2021-09-16 10:48:13 INFO:  test-node-wasm.js test: second instance +2021-09-16 10:48:13 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:48:16 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:48:16 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:16 DATA:  test-node-wasm.js result: performance: load: 6 total: 2381 +2021-09-16 10:48:16 INFO:  test-node-wasm.js test: concurrent +2021-09-16 10:48:16 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] +2021-09-16 10:48:16 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] +2021-09-16 10:48:17 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:48:19 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] +2021-09-16 10:48:20 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:48:20 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] +2021-09-16 10:48:22 STATE: test-node-wasm.js event: image +2021-09-16 10:48:25 STATE: test-node-wasm.js event: image +2021-09-16 10:48:28 STATE: test-node-wasm.js event: image +2021-09-16 10:48:31 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: performance: load: 6 total: 10592 +2021-09-16 10:48:31 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: performance: load: 6 total: 10592 +2021-09-16 10:48:31 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:31 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:31 STATE: test-node-wasm.js event: detect +2021-09-16 10:48:31 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: performance: load: 3568 total: 10595 +2021-09-16 10:48:31 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: performance: load: 3568 total: 10595 +2021-09-16 10:48:31 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: performance: load: 3568 total: 10595 +2021-09-16 10:48:31 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} +2021-09-16 10:48:31 DATA:  test-node-wasm.js result: performance: load: 6 total: 10596 +2021-09-16 10:48:31 STATE: test-node-wasm.js passeed: no memory leak +2021-09-16 10:48:31 INFO:  test-node-wasm.js events: {"image":10,"detect":10,"warmup":2} +2021-09-16 10:48:31 INFO:  test-node-wasm.js test complete: 43047 ms +2021-09-16 10:48:31 INFO:  +2021-09-16 10:48:31 INFO:  status: {"passed":88,"failed":0} diff --git a/typedoc/classes/Human.html b/typedoc/classes/Human.html index 0caeb038..9ffc0936 100644 --- a/typedoc/classes/Human.html +++ b/typedoc/classes/Human.html @@ -3,8 +3,8 @@ - Human | @vladmandic/human - v2.2.0 - + Human | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
  • Preparing search index...
  • The search index is not available
  • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • Human diff --git a/typedoc/index.html b/typedoc/index.html index be9275da..26da9e7c 100644 --- a/typedoc/index.html +++ b/typedoc/index.html @@ -3,8 +3,8 @@ - @vladmandic/human - v2.2.0 - + @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -48,7 +48,7 @@
    -

    @vladmandic/human - v2.2.0

    +

    @vladmandic/human - v2.2.1

    diff --git a/typedoc/interfaces/BodyConfig.html b/typedoc/interfaces/BodyConfig.html index bb6ca120..83c6628f 100644 --- a/typedoc/interfaces/BodyConfig.html +++ b/typedoc/interfaces/BodyConfig.html @@ -3,8 +3,8 @@ - BodyConfig | @vladmandic/human - v2.2.0 - + BodyConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
  • Preparing search index...
  • The search index is not available
  • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • BodyConfig diff --git a/typedoc/interfaces/BodyResult.html b/typedoc/interfaces/BodyResult.html index 75ab2f22..4a2fdc7a 100644 --- a/typedoc/interfaces/BodyResult.html +++ b/typedoc/interfaces/BodyResult.html @@ -3,8 +3,8 @@ - BodyResult | @vladmandic/human - v2.2.0 - + BodyResult | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • BodyResult diff --git a/typedoc/interfaces/Config.html b/typedoc/interfaces/Config.html index cb0abf60..80bc5842 100644 --- a/typedoc/interfaces/Config.html +++ b/typedoc/interfaces/Config.html @@ -3,8 +3,8 @@ - Config | @vladmandic/human - v2.2.0 - + Config | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • Config diff --git a/typedoc/interfaces/DrawOptions.html b/typedoc/interfaces/DrawOptions.html index af4d2898..107116fd 100644 --- a/typedoc/interfaces/DrawOptions.html +++ b/typedoc/interfaces/DrawOptions.html @@ -3,8 +3,8 @@ - DrawOptions | @vladmandic/human - v2.2.0 - + DrawOptions | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • DrawOptions diff --git a/typedoc/interfaces/FaceConfig.html b/typedoc/interfaces/FaceConfig.html index 3b40069d..ab9da17d 100644 --- a/typedoc/interfaces/FaceConfig.html +++ b/typedoc/interfaces/FaceConfig.html @@ -3,8 +3,8 @@ - FaceConfig | @vladmandic/human - v2.2.0 - + FaceConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceConfig diff --git a/typedoc/interfaces/FaceDescriptionConfig.html b/typedoc/interfaces/FaceDescriptionConfig.html index ee206003..7fc29887 100644 --- a/typedoc/interfaces/FaceDescriptionConfig.html +++ b/typedoc/interfaces/FaceDescriptionConfig.html @@ -3,8 +3,8 @@ - FaceDescriptionConfig | @vladmandic/human - v2.2.0 - + FaceDescriptionConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceDescriptionConfig diff --git a/typedoc/interfaces/FaceDetectorConfig.html b/typedoc/interfaces/FaceDetectorConfig.html index 8100eebf..c73f2b55 100644 --- a/typedoc/interfaces/FaceDetectorConfig.html +++ b/typedoc/interfaces/FaceDetectorConfig.html @@ -3,8 +3,8 @@ - FaceDetectorConfig | @vladmandic/human - v2.2.0 - + FaceDetectorConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceDetectorConfig diff --git a/typedoc/interfaces/FaceEmotionConfig.html b/typedoc/interfaces/FaceEmotionConfig.html index 6b2c23e1..9b44c025 100644 --- a/typedoc/interfaces/FaceEmotionConfig.html +++ b/typedoc/interfaces/FaceEmotionConfig.html @@ -3,8 +3,8 @@ - FaceEmotionConfig | @vladmandic/human - v2.2.0 - + FaceEmotionConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceEmotionConfig diff --git a/typedoc/interfaces/FaceIrisConfig.html b/typedoc/interfaces/FaceIrisConfig.html index 6584605c..649ecf57 100644 --- a/typedoc/interfaces/FaceIrisConfig.html +++ b/typedoc/interfaces/FaceIrisConfig.html @@ -3,8 +3,8 @@ - FaceIrisConfig | @vladmandic/human - v2.2.0 - + FaceIrisConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceIrisConfig diff --git a/typedoc/interfaces/FaceMeshConfig.html b/typedoc/interfaces/FaceMeshConfig.html index f57452a5..f1c26efe 100644 --- a/typedoc/interfaces/FaceMeshConfig.html +++ b/typedoc/interfaces/FaceMeshConfig.html @@ -3,8 +3,8 @@ - FaceMeshConfig | @vladmandic/human - v2.2.0 - + FaceMeshConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceMeshConfig diff --git a/typedoc/interfaces/FaceResult.html b/typedoc/interfaces/FaceResult.html index 5efe35c4..161bc3fd 100644 --- a/typedoc/interfaces/FaceResult.html +++ b/typedoc/interfaces/FaceResult.html @@ -3,8 +3,8 @@ - FaceResult | @vladmandic/human - v2.2.0 - + FaceResult | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FaceResult diff --git a/typedoc/interfaces/FilterConfig.html b/typedoc/interfaces/FilterConfig.html index a9c6dde4..6e0798c4 100644 --- a/typedoc/interfaces/FilterConfig.html +++ b/typedoc/interfaces/FilterConfig.html @@ -3,8 +3,8 @@ - FilterConfig | @vladmandic/human - v2.2.0 - + FilterConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • FilterConfig diff --git a/typedoc/interfaces/GestureConfig.html b/typedoc/interfaces/GestureConfig.html index 5483c7b0..0169b9c4 100644 --- a/typedoc/interfaces/GestureConfig.html +++ b/typedoc/interfaces/GestureConfig.html @@ -3,8 +3,8 @@ - GestureConfig | @vladmandic/human - v2.2.0 - + GestureConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • GestureConfig diff --git a/typedoc/interfaces/HandConfig.html b/typedoc/interfaces/HandConfig.html index c7e48b09..0bd6ddb8 100644 --- a/typedoc/interfaces/HandConfig.html +++ b/typedoc/interfaces/HandConfig.html @@ -3,8 +3,8 @@ - HandConfig | @vladmandic/human - v2.2.0 - + HandConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • HandConfig diff --git a/typedoc/interfaces/HandResult.html b/typedoc/interfaces/HandResult.html index f3dd5875..3de071dc 100644 --- a/typedoc/interfaces/HandResult.html +++ b/typedoc/interfaces/HandResult.html @@ -3,8 +3,8 @@ - HandResult | @vladmandic/human - v2.2.0 - + HandResult | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • HandResult diff --git a/typedoc/interfaces/ObjectConfig.html b/typedoc/interfaces/ObjectConfig.html index 041d5090..3da73d1e 100644 --- a/typedoc/interfaces/ObjectConfig.html +++ b/typedoc/interfaces/ObjectConfig.html @@ -3,8 +3,8 @@ - ObjectConfig | @vladmandic/human - v2.2.0 - + ObjectConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • ObjectConfig diff --git a/typedoc/interfaces/ObjectResult.html b/typedoc/interfaces/ObjectResult.html index f5567121..756dc679 100644 --- a/typedoc/interfaces/ObjectResult.html +++ b/typedoc/interfaces/ObjectResult.html @@ -3,8 +3,8 @@ - ObjectResult | @vladmandic/human - v2.2.0 - + ObjectResult | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • ObjectResult diff --git a/typedoc/interfaces/PersonResult.html b/typedoc/interfaces/PersonResult.html index 846646dd..fd37f39b 100644 --- a/typedoc/interfaces/PersonResult.html +++ b/typedoc/interfaces/PersonResult.html @@ -3,8 +3,8 @@ - PersonResult | @vladmandic/human - v2.2.0 - + PersonResult | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • PersonResult diff --git a/typedoc/interfaces/Result.html b/typedoc/interfaces/Result.html index 4b8d0aa8..32027116 100644 --- a/typedoc/interfaces/Result.html +++ b/typedoc/interfaces/Result.html @@ -3,8 +3,8 @@ - Result | @vladmandic/human - v2.2.0 - + Result | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    @@ -50,7 +50,7 @@
    • - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1
    • Result diff --git a/typedoc/interfaces/SegmentationConfig.html b/typedoc/interfaces/SegmentationConfig.html index 9d9942c5..e0b2c8b0 100644 --- a/typedoc/interfaces/SegmentationConfig.html +++ b/typedoc/interfaces/SegmentationConfig.html @@ -3,8 +3,8 @@ - SegmentationConfig | @vladmandic/human - v2.2.0 - + SegmentationConfig | @vladmandic/human - v2.2.1 + @@ -23,7 +23,7 @@
    • Preparing search index...
    • The search index is not available
    - @vladmandic/human - v2.2.0 + @vladmandic/human - v2.2.1